home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume10 / calctool24 / part03 < prev    next >
Text File  |  1990-01-15  |  46KB  |  1,275 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v10i008: Calctool V2.4 - a simple calculator (Part 3 of 6).
  3. from: richb@Aus.Sun.COM (Rich Burridge)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 10, Issue 8
  7. Submitted-by: richb@Aus.Sun.COM (Rich Burridge)
  8. Archive-name: calctool24/part03
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 3 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file functions.c continued
  15. #
  16. CurArch=3
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file functions.c"
  27. sed 's/^X//' << 'SHAR_EOF' >> functions.c
  28. X                              break ;
  29. X            case CCTRL('t') : disp_val = atan(disp_val) ;     /* atan */
  30. X          }
  31. X      else
  32. X        switch (current)
  33. X          {
  34. X            case CCTRL('c') : disp_val = acosh(disp_val) ;    /* acosh */
  35. X                              break ;
  36. X            case CCTRL('s') : disp_val = asinh(disp_val) ;    /* asinh */
  37. X                              break ;
  38. X            case CCTRL('t') : disp_val = atanh(disp_val) ;    /* atanh */
  39. X          }
  40. X
  41. X      tresults[(int) DEG]  = disp_val * 180.0 / M_PI ;
  42. X      tresults[(int) GRAD] = disp_val * 200.0 / M_PI ;
  43. X      tresults[(int) RAD]  = disp_val ;
  44. X    }
  45. X
  46. X  cur_op = current ;
  47. X  show_display(tresults[(int) ttype]) ;
  48. X  disp_val = tresults[(int) ttype] ;
  49. X}
  50. X
  51. X
  52. Xdo_trigtype()          /* Change the current trigonometric type. */
  53. X{
  54. X  switch (current)
  55. X    {
  56. X      case CCTRL('d') : ttype = DEG ;
  57. X                        break ;
  58. X      case CCTRL('g') : ttype = GRAD ;
  59. X                        break ;
  60. X      case CCTRL('r') : ttype = RAD ;
  61. X    }
  62. X  if (cur_op == CCTRL('c') || cur_op == CCTRL('s') || cur_op == CCTRL('t'))
  63. X    {
  64. X      disp_val = tresults[(int) ttype] ;
  65. X      show_display(tresults[(int) ttype]) ;
  66. X    }
  67. X  set_item(TTYPEITEM, ttype_str[(int) ttype]) ;
  68. X}
  69. X
  70. X
  71. XBOOLEAN
  72. Xibool(x)
  73. Xdouble x ;
  74. X{
  75. X  BOOLEAN p ;
  76. X  if (x > 68719476736.00) return(0) ;
  77. X  else if (x < -68719476736.00) return(0) ;
  78. X       else
  79. X         {
  80. X           while(x < 0.0) x += 4294967296.00 ;
  81. X           while(x > 4294967296.00) x -= 4294967296.00 ;
  82. X           p = x ;
  83. X           return (p) ;
  84. X         }
  85. X}
  86. X
  87. X
  88. Xdouble
  89. Xsetbool(p)
  90. XBOOLEAN p ;
  91. X{
  92. X  BOOLEAN q ;
  93. X  double val ;
  94. X
  95. X  q = p & 0x80000000 ;
  96. X  p &= 0x7fffffff ;
  97. X  val = p ;
  98. X  if (q) val += 2147483648.0 ;
  99. X  return(val) ;
  100. X}
  101. SHAR_EOF
  102. echo "File functions.c is complete"
  103. chmod 0444 functions.c || echo "restore of functions.c fails"
  104. set `wc -c functions.c`;Sum=$1
  105. if test "$Sum" != "18212"
  106. then echo original size 18212, current size $Sum;fi
  107. echo "x - extracting get.c (Text)"
  108. sed 's/^X//' << 'SHAR_EOF' > get.c &&
  109. X
  110. X/*  @(#)get.c 1.8 89/12/13
  111. X *
  112. X *  Command line and help file routines.
  113. X *
  114. X *  Copyright (c) Rich Burridge.
  115. X *                Sun Microsystems, Australia - All rights reserved.
  116. X *
  117. X *  Permission is given to distribute these sources, as long as the
  118. X *  copyright messages are not removed, and no monies are exchanged.
  119. X *
  120. X *  No responsibility is taken for any errors or inaccuracies inherent
  121. X *  either to the comments or the code of this program, but if
  122. X *  reported to me then an attempt will be made to fix them.
  123. X */
  124. X
  125. X#include "patchlevel.h"
  126. X#include "calctool.h"
  127. X#include "color.h"
  128. X#include "extern.h"
  129. X
  130. X
  131. Xchar *
  132. Xconvert(line)              /* Convert .calctoolrc line to ascii values. */
  133. Xchar *line ;               /* Input line to be converted. */
  134. X{
  135. X  char output[MAXLINE] ;   /* Converted output record. */
  136. X  int ctrl = 0       ;     /* Set if we are processing a control character. */
  137. X  int i ;                  /* Position within input line. */
  138. X  int n = 0 ;              /* Position within output line. */
  139. X
  140. X  for (i = 0; i < strlen(line)-1; i++)
  141. X    {
  142. X           if (line[i] == ' ') continue ;
  143. X      else if (line[i] == '\\') ctrl = 1 ;
  144. X      else if (ctrl)
  145. X        {
  146. X          output[n++] = CCTRL(line[i]) ;
  147. X          ctrl = 0 ;
  148. X        }
  149. X      else output[n++] = line[i] ;
  150. X    }
  151. X  output[n] = '\0' ;
  152. X  return(output) ;
  153. X}
  154. X
  155. X
  156. Xget_options(argc, argv)           /* Extract command line options. */
  157. Xint argc ;
  158. Xchar *argv[] ;
  159. X{
  160. X  char next[MAXLINE] ;    /* The next command line parameter. */
  161. X
  162. X  STRCPY(helpname, HELPNAME) ;    /* Default help filename. */
  163. X  STRCPY(x11_display, "") ;       /* Initially no X11 display value. */
  164. X  STRCPY(geometry, "") ;          /* Initialy no X11 geometry value. */
  165. X  accuracy = 2 ;                  /* Initial accuracy. */
  166. X  inv_video = 0 ;                 /* Default is normal video. */
  167. X  INC ;
  168. X  while (argc > 0)
  169. X    {
  170. X      if (argv[0][0] == '-')
  171. X        switch (argv[0][1])
  172. X          {
  173. X            case 'a' : INC ;
  174. X                       getparam(next, argv, "-a needs accuracy value") ;
  175. X                       accuracy = atoi(next) ;
  176. X                       if (accuracy < 0 || accuracy > 9)
  177. X                         {
  178. X                           FPRINTF(stderr,
  179. X                                   "%s: accuracy should be in the range 0-9\n",
  180. X                                   progname) ;
  181. X                           accuracy = 2 ;
  182. X                         }
  183. X                       break ;
  184. X            case 'd' : INC ;                 /* X11 display information. */
  185. X                       getparam(x11_display, argv, "-d needs display information") ;                       break ;
  186. X            case 'g' : INC ;                 /* X11 geometry information. */
  187. X                       getparam(geometry, argv, "-g needs geometry information") ;
  188. X                       break ;
  189. X            case 'h' : INC ;
  190. X                       getparam(helpname, argv, "-h needs helpfile name") ;
  191. X                       break ;
  192. X            case 'i' : inv_video = 1 ;
  193. X                       break ;
  194. X            case 'v' : FPRINTF(stderr, "%s version 2.4.%1d\n", progname, PATCHLEVEL) ;
  195. X                       break ;
  196. X/*  SunView windowing arguments. -Wp, -WP and -Wi are used in the NeWS
  197. X *  implementation to initially position the window and icon.
  198. X */
  199. X
  200. X            case 'W' : switch (argv[0][2])
  201. X                         {
  202. X                           case 'H' : break ;   /* -WH, no sub-args follow */
  203. X                           case 'i' : iconic = 1 ;
  204. X                                      break ;   /* -Wi, start as an icon. */
  205. X                           case 'g' :           /* -Wg, set default color. */
  206. X                           case 'n' : break ;   /* -Wn, no label at all */
  207. X                           case 'h' :           /* -Wh, height */
  208. X                           case 'I' :           /* -WI "icon filename" */
  209. X                           case 'l' :           /* -Wl "some window label" */
  210. X                           case 'L' :           /* -Wl "some icon label" */
  211. X                           case 't' :           /* Font filename */
  212. X                           case 'T' :           /* Icon font filename */
  213. X                           case 'w' : INC ;     /* Width, in columns. */
  214. X                                      break ;
  215. X                           case 'p' : INC ;     /* -Wp xnum ynum */
  216. X                                      getparam(next, argv,
  217. X                                               "-Wp needs x coordinate") ;
  218. X                                      wx = atoi(next) ;
  219. X                                      INC ;
  220. X                                      getparam(next, argv,
  221. X                                               "-Wp needs y coordinate") ;
  222. X                                      wy = atoi(next) ;
  223. X                                      posspec = 1 ;
  224. X                                      break ;
  225. X                           case 'P' : INC ;      /* -WP xnum ynum */
  226. X                                      getparam(next, argv,
  227. X                                               "-WP needs x coordinate") ;
  228. X                                      ix = atoi(next) ;
  229. X                                      INC ;
  230. X                                      getparam(next, argv,
  231. X                                               "-WP needs y coordinate") ;
  232. X                                      iy = atoi(next) ;
  233. X                                      break ;
  234. X                           case 's' : INC ; INC ;  /* -Ws xnum ynum */
  235. X                                      break ;
  236. X                           case 'b' :              /* -Wb r g b (bg color spec)
  237. X*/
  238. X                           case 'f' : INC ; INC ; INC ;  /* Same, fg color */
  239. X                                      break ;
  240. X                           default :  FPRINTF(stderr,"%s: -W%c unknown argument\n",
  241. X                                                      progname, argv[0][2]) ;
  242. X                                      break ;
  243. X                         }
  244. X                       break ;
  245. X            default  : usage() ;
  246. X          }
  247. X      INC ;
  248. X    }
  249. X}
  250. X
  251. X
  252. Xgetparam(s, argv, errmes)
  253. Xchar *s, *argv[], *errmes ;
  254. X{
  255. X  if (*argv != NULL && argv[0][0] != '-') STRCPY(s, *argv) ;
  256. X  else
  257. X    { 
  258. X      FPRINTF(stderr,"%s: %s as next argument.\n", progname, errmes) ;
  259. X      exit(1) ;                        
  260. X    }                                  
  261. X}
  262. X
  263. X
  264. Xget_helpfile(helpname)     /* Open helpfile if present. */
  265. Xchar *helpname ;
  266. X{
  267. X  char *getenv(), name[MAXLINE], *paths, *ptr ;
  268. X  int i ;
  269. X
  270. X  i = 0 ;
  271. X  ishelp = 1 ;
  272. X  if ((hfd = fopen(helpname,"r")) == NULL)
  273. X    {
  274. X      paths = getenv("PATH") ;
  275. X      if ((ptr = paths) && helpname[0] != '/')
  276. X        for (;;)
  277. X          if (*ptr == ':' || *ptr == 0)
  278. X            {
  279. X              if (*ptr == 0) break ;
  280. X              name[i++] = '/' ;
  281. X              name[i] = 0 ;
  282. X              STRCAT(name, helpname) ;
  283. X              if ((hfd = fopen(name, "r")) != NULL) return ;
  284. X              *ptr++ ;
  285. X              i = 0 ;
  286. X            }
  287. X          else name[i++] = *ptr++ ;
  288. X      FPRINTF(stderr, "%s: Help file: %s not found\r\n", progname, helpname) ;
  289. X      ishelp = 0 ;
  290. X    }
  291. X}
  292. X
  293. X
  294. Xget_rcfile(name)          /* Read .calctoolrc file. */
  295. Xchar *name ;
  296. X{
  297. X  char line[MAXLINE] ;    /* Current line from the .calctoolrc file. */
  298. X  char tmp[MAXLINE] ;     /* Used to extract function definitions. */
  299. X  double const ;          /* Current constant value being conveted. */
  300. X  int i ;                 /* Index to constant or function array. */
  301. X  int isval ;             /* Set to 'c' or 'f' for convertable line. */
  302. X  int n ;
  303. X  FILE *rcfd ;            /* File descriptor for calctool rc file. */
  304. X
  305. X  if ((rcfd = fopen(name, "r")) == NULL) return ;
  306. X
  307. X/*  Process the .calctoolrc file. There are currently four types of
  308. X *  records to look for:
  309. X *
  310. X *  1) Those starting with a hash in the first column are comments.
  311. X *
  312. X *  2) Lines starting with 'c' or 'C' in the first column are
  313. X *     definitions for constants. The cC is followed by a digit in
  314. X *     the range 0-9, then a space. This is followed by a number
  315. X *     in fixed or scientific notation. Following this is an optional
  316. X *     comment, which if found, will be used in the popup menu for
  317. X *     the constants. If the comment is present, there must be at
  318. X *     least one space between this and the preceding number.
  319. X *
  320. X *  3) Those starting with a 'f' or a 'F' in the first column are
  321. X *     definitions for functions. The fF is followed by a digit in
  322. X *     the range 0-9, then a space. This is followed by a function
  323. X *     definition. Following this is an optional comment, which if
  324. X *     found, will be used in the popup menu for the functions.
  325. X *     If the comment is present, there must be at least one space
  326. X *     between this and the preceding function definition.
  327. X *
  328. X *  4) Lines starting with a 'r' or a 'R' in the first column are
  329. X *     definitions for the initial contents of the calculators
  330. X *     memory registers. The rR is followed by a digit in the
  331. X *     range 0-9, then a space. This is followed by a number in
  332. X *     fixed or scientific notation. The rest of the line is ignored.
  333. X *
  334. X *  All other lines are ignored.
  335. X *
  336. X *  Two other things to note. There should be no embedded spaces in
  337. X *  the function definitions, and whenever a backslash is found, that
  338. X *  and the following character signify a control character, for
  339. X *  example \g would be ascii 7.
  340. X */
  341. X
  342. X  while (fgets(line, MAXLINE, rcfd) != NULL)
  343. X    {
  344. X      isval = 0 ;
  345. X           if (line[0] == 'c' || line[0] == 'C') isval = 'c' ;
  346. X      else if (line[0] == 'f' || line[0] == 'F') isval = 'f' ;
  347. X      else if (line[0] == 'r' || line[0] == 'R') isval = 'r' ;
  348. X      if (isval)
  349. X        if (line[1] >= '0' && line[1] <= '9' && line[2] == ' ')
  350. X          {
  351. X            i = char_val(line[1]) ;
  352. X            if (isval == 'c')
  353. X              {
  354. X                n = sscanf(&line[3], "%lf", &const) ;
  355. X                if (n == 1) con_vals[i] = const ;
  356. X              }
  357. X            else if (isval == 'f')
  358. X              {
  359. X                SSCANF(&line[3], "%s", tmp) ;      
  360. X                STRCPY(fun_vals[i], convert(tmp)) ;
  361. X              }
  362. X            else if (isval == 'r')
  363. X              {
  364. X                n = sscanf(&line[3], "%lf", &const) ;
  365. X                if (n == 1) mem_vals[i] = const ;
  366. X                continue ;
  367. X              }
  368. X            for (n = 3; n < strlen(line); n++)
  369. X              if (line[n] == ' ')
  370. X                {
  371. X                  while (line[n] == ' ') n++ ;
  372. X                  line[strlen(line)-1] = '\0' ;
  373. X                  if (isval == 'c')
  374. X                    SPRINTF(con_names[i], "%1d: %g [%s]",
  375. X                            i, con_vals[i], &line[n]) ;
  376. X                  else
  377. X                    SPRINTF(fun_names[i], "%1d: %s [%s]",
  378. X                            i, fun_vals[i], &line[n]) ;
  379. X                  break ;
  380. X                }
  381. X          }
  382. X    }
  383. X  FCLOSE(rcfd) ;
  384. X}
  385. X
  386. X
  387. Xread_rcfiles()   /* Read .calctoolrc's from home and current directories. */
  388. X{
  389. X  char *home ;            /* Pathname for users home directory. */
  390. X  char name[MAXLINE] ;    /* Full name of users .calctoolrc file. */
  391. X  int n ;
  392. X  struct passwd *entry ;
  393. X
  394. X  for (n = 0; n < MAXREGS; n++)
  395. X    {
  396. X      SPRINTF(name, "%1d: %g [%s]", n, con_vals[n], con_names[n]) ;
  397. X      STRCPY(con_names[n], name) ;
  398. X      STRCPY(fun_vals[n], "") ;       /* Initially empty function strings. */
  399. X    }
  400. X
  401. X  if ((home = getenv("HOME")) == NULL)
  402. X    {
  403. X      if ((entry = getpwuid(getuid())) == NULL) return ;
  404. X      home = entry->pw_dir ;
  405. X    }
  406. X  SPRINTF(name, "%s/%s", home, RCNAME) ;
  407. X  get_rcfile(name) ;      /* Read .calctoolrc from users home directory. */
  408. X
  409. X  SPRINTF(name, "%s/%s", getcwd((char *) NULL, MAXLINE), RCNAME) ;
  410. X  get_rcfile(name) ;      /* Read .calctoolrc file from current directory. */
  411. X}
  412. X
  413. X
  414. Xusage()
  415. X{
  416. X  FPRINTF(stderr, "Usage: %s: [-d display] [-g geometry] ", progname) ;
  417. X  FPRINTF(stderr, "[-h helpfile] [-i] [-v] [-Wi] [-Wp x y] [-WP x y]\n") ;
  418. X  exit(0) ;
  419. X}
  420. SHAR_EOF
  421. chmod 0444 get.c || echo "restore of get.c fails"
  422. set `wc -c get.c`;Sum=$1
  423. if test "$Sum" != "11877"
  424. then echo original size 11877, current size $Sum;fi
  425. echo "x - extracting calctool.c (Text)"
  426. sed 's/^X//' << 'SHAR_EOF' > calctool.c &&
  427. X
  428. X/*  @(#)calctool.c 1.12 89/12/07
  429. X *
  430. X *  A simple calculator program.
  431. X *
  432. X *  Copyright (c) Rich Burridge.
  433. X *                Sun Microsystems, Australia - All rights reserved.
  434. X *
  435. X *  Basic algorithms, copyright (c) Ed Falk.
  436. X *                Sun Microsystems, Mountain View.
  437. X *
  438. X *  Permission is given to distribute these sources, as long as the
  439. X *  copyright messages are not removed, and no monies are exchanged.
  440. X *
  441. X *  No responsibility is taken for any errors or inaccuracies inherent
  442. X *  either to the comments or the code of this program, but if
  443. X *  reported to me then an attempt will be made to fix them.
  444. X */
  445. X
  446. X#include "patchlevel.h"
  447. X#include "color.h"
  448. X#include "calctool.h"
  449. X
  450. Xdouble powers[11][4] = {
  451. X         {    1.0,          1.0,           1.0,             1.0 },
  452. X         {    2.0,          8.0,          10.0,            16.0 },
  453. X         {    4.0,         64.0,         100.0,           256.0 },
  454. X         {    8.0,        512.0,        1000.0,          4096.0 },
  455. X         {   16.0,       4096.0,       10000.0,         65536.0 },
  456. X         {   32.0,      32768.0,      100000.0,       1048576.0 },
  457. X         {   64.0,     262144.0,     1000000.0,      16777216.0 },
  458. X         {  128.0,    2097152.0,    10000000.0,     268435456.0 },
  459. X         {  256.0,   16777216.0,   100000000.0,    4294967296.0 },
  460. X         {  512.0,  134217728.0,  1000000000.0,   68719476736.0 },
  461. X         { 1024.0, 1073741824.0, 10000000000.0, 1099511627776.0 }
  462. X} ;
  463. X
  464. Xdouble exp_p1[10][4] = {
  465. X        { 1.0,          1.0,             1.0,    1.0             },
  466. X        { 1.0,          1.0,             1.0,    1.0             },
  467. X        { 0.5,          0.125,           0.1,    0.0625          },
  468. X        { 0.25,         0.015625,        0.01,   3.90625e-03     },
  469. X        { 0.125,        1.953125e-03,    0.001,  2.44140625e-04  },
  470. X        { 0.0625,       2.44140625e-04,  1.0e-4, 1.525878906e-05 },
  471. X        { 0.03125,      3.051757813e-05, 1.0e-5, 9.536743164e-07 },
  472. X        { 0.015625,     3.814697266e-06, 1.0e-6, 5.960464478e-08 },
  473. X        { 0.0078125,    4.768371582e-07, 1.0e-7, 3.725290298e-09 },
  474. X        { 3.90625e-03,  5.960464478e-08, 1.0e-8, 2.328306437e-10 }
  475. X} ;
  476. X
  477. Xdouble max_fix[4] = {
  478. X          6.871947674e+10, 3.245185537e+32,
  479. X          1.000000000e+36, 2.230074520e+43
  480. X} ;
  481. X
  482. X/* Selectable constants - these are the default selections. */
  483. X
  484. Xdouble con_vals[MAXREGS] = {
  485. X         0.621,                   /* kilometres per hour <=> miles per hour. */
  486. X         1.41421356237309504880,  /* square root of 2. */
  487. X         2.7182818284590452354,   /* e */
  488. X         3.14159265358979323846,  /* pi */
  489. X         2.54,                    /* centimetres <=> inch. */
  490. X         57.29577951308232,       /* degrees in a radian. */
  491. X         1048576.0,               /* 2 ^ 20. */
  492. X         0.0353,                  /* grams <=> ounce. */
  493. X         0.948,                   /* kilojoules <=> British thermal units. */
  494. X         0.0610,                  /* cubic cms <=> cubic inches. */
  495. X} ;
  496. X
  497. Xchar con_names[MAXREGS][MAXLINE] = {
  498. X       "kilometres per hour <=> miles per hour.",
  499. X       "square root of 2.",
  500. X       "e.",
  501. X       "pi.",
  502. X       "centimetres <=> inch.",
  503. X       "degrees in a radian.",
  504. X       "2 ^ 20.",
  505. X       "grams <=> ounce.",
  506. X       "kilojoules <=> British thermal units.",
  507. X       "cubic cms <=> cubic inches.",
  508. X} ;
  509. X
  510. Xchar num_names[MAXREGS][2] = {    /* Used by the popup menus. */
  511. X       "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  512. X} ;
  513. X
  514. Xchar base_str[4][4]  = { "BIN", "OCT", "DEC", "HEX" } ;
  515. Xchar dtype_str[2][4] = { "FIX", "SCI" } ;
  516. Xchar ttype_str[3][5] = { "DEG", "GRAD", "RAD" } ;
  517. X
  518. Xchar digits[] = "0123456789abcdef" ;
  519. Xint basevals[4] = {2, 8, 10, 16} ;
  520. X
  521. X/* Length of display in characters for each base. */
  522. Xint disp_length[4] = {32, 15, 12, 12} ;
  523. X
  524. X/* X offset in pixels for various length button strings. */
  525. Xint chxoff[5] = { 5, 9, 14, 16, 5 } ;
  526. X
  527. X/* Valid keys when an error condition has occured. */
  528. X/*                            MEM  KEYS HELP   clr   QUIT OFF  REDRAW */
  529. Xchar validkeys[MAXVKEYS]  = { 'M', 'K', '?', '\177', 'q', 'o', '\f' } ;
  530. X
  531. X/* Valid keys for which the right mouse button will get a popup menu. */
  532. Xchar validmenu[MAXMENUS]  = {
  533. X/*   ACC  CON    EXCH        FUN        <    >   RCL  STO  */
  534. X     'A', '#', CCTRL('e'), CCTRL('f'), '<', '>', 'r', 's'
  535. X} ;
  536. X
  537. Xdouble disp_val ;             /* Value of the current display. */
  538. Xdouble last_input ;           /* Previous number input by user. */
  539. Xdouble mem_vals[MAXREGS] ;    /* Memory register values. */
  540. Xdouble result ;               /* Current calculator total value. */
  541. Xdouble tresults[3] ;          /* Current trigonometric results. */
  542. X
  543. Xenum base_type base ;         /* Current base: BIN, OCT, DEC or HEX. */
  544. Xenum gr_type gtype ;          /* What graphics system is being used. */
  545. Xenum num_type dtype ;         /* Number display mode. */
  546. Xenum trig_type ttype ;        /* Trigonometric type (deg, grad or rad). */
  547. X
  548. XFILE *hfd ;         /* File descriptor for help information. */
  549. X
  550. Xint accuracy ;      /* Number of digits precision (Max 9). */
  551. Xint color ;         /* Color being used for current raster operation. */
  552. Xint column ;        /* Column number of current key/mouse press. */
  553. Xint cur_ch ;        /* Current character if keyboard event. */
  554. Xint curx ;          /* Current mouse X position. */
  555. Xint cury ;          /* Current mouse Y position. */
  556. Xint down ;          /* Indicates is a mouse button is down. */
  557. Xint error ;         /* Indicates some kind of display error. */
  558. Xint hyperbolic ;    /* If set, trig functions will be hyperbolic. */
  559. Xint iconic ;        /* Set if window is currently iconic. */
  560. Xint inv_video ;     /* Set if user wants inverse video mode. */
  561. Xint inverse ;       /* If set, trig and log functions will be inversed. */
  562. Xint iscolor ;       /* Set if this is a color screen. */
  563. Xint ishelp ;        /* Set if there is a help file. */
  564. Xint issel ;         /* Set if valid [Get] selection. */
  565. Xint ix ;            /* Initial X position of the icon. */
  566. Xint iy ;            /* Initial Y position of the icon. */
  567. Xint key_exp ;       /* Set if entering exponent number. */
  568. Xint new_input ;     /* New number input since last op. */
  569. Xint nextc ;         /* Current event identifier. */
  570. Xint nfont_width ;   /* Width of the normal font characters. */
  571. Xint pending ;       /* Indicates command depending on multiple presses. */
  572. Xint pending_op ;    /* Arithmetic operation for pending command. */
  573. Xint pointed ;       /* Whether a decimal point has been given. */
  574. Xint portion ;       /* Portion of button on current key/mouse press. */
  575. Xint posspec ;       /* Set if -Wp or -g option is present (for X11) */
  576. Xint row ;           /* Row number of current key/mouse press. */
  577. Xint rstate ;        /* Indicates if memory register frame is displayed. */
  578. Xint spaces ;        /* Number of spaces in current button string. */
  579. Xint toclear ;       /* Indicates if display should be cleared. */
  580. Xint tstate ;        /* Indicates current button set being displayed. */
  581. Xint wx ;            /* Initial X position of the window. */
  582. Xint wy ;            /* Initial Y position of the window. */
  583. Xint x ;             /* X offset for text for button. */
  584. Xint y ;             /* Y offset for text for button. */
  585. X
  586. X/* Routines obeyed by mouse button or character presses. */
  587. Xint close_frame(),    destroy_frame(),  do_base() ;
  588. Xint do_calculation(), do_clear(),       do_constant(),  do_delete() ;
  589. Xint do_expno(),       do_immediate(),   do_keys(),      do_number() ;
  590. Xint do_pending(),     do_point(),       do_portion(),   do_repaint() ;
  591. Xint do_set_mode(),    do_trig(),        do_trigtype(),  toggle_reg_canvas() ;
  592. X
  593. Xchar cur_op ;                     /* Current arithmetic operation. */
  594. Xchar current ;                    /* Current button or character pressed. */
  595. Xchar *exp_posn ;                  /* Position of the exponent sign. */
  596. Xchar fnum[MAX_DIGITS+1] ;         /* Scratch area for fixed point numbers. */
  597. Xchar fun_names[MAXREGS][MAXLINE] ;  /* Function defs from .calctoolrc. */
  598. Xchar fun_vals[MAXREGS][MAXLINE] ;   /* Function names from .calctoolrc. */
  599. Xchar geometry[MAXLINE] ;          /* X11 geometry information. */
  600. Xchar old_cal_value ;              /* Previous calculation operator. */
  601. Xchar pstr[5] ;                    /* Current button text string. */
  602. Xchar *selection ;                 /* Current [Get] selection. */
  603. Xchar *shelf ;                     /* PUT selection shelf contents. */
  604. Xchar snum[MAX_DIGITS+1] ;         /* Scratch are for scientific numbers. */
  605. Xchar x11_display[MAXLINE] ;       /* X11 display information. */
  606. X
  607. Xstruct iteminfo items[MAXITEMS] = {                    /* Panel items. */
  608. X  { SFONT, BBORDER,                 DISPLAY-3,  "" },  /* BASEITEM. */
  609. X  { NFONT, 0,                       DISPLAY-15, "" },  /* DISPLAYITEM. */
  610. X  { SFONT, BBORDER+1*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* TTYPEITEM. */
  611. X  { SFONT, BBORDER+2*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* NUMITEM. */
  612. X  { SFONT, BBORDER+3*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* HYPITEM. */
  613. X  { SFONT, BBORDER+4*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* INVITEM. */
  614. X  { SFONT, BBORDER+5*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* OPITEM. */
  615. X} ;
  616. X
  617. X/* Calculator button values. */
  618. X
  619. Xstruct button buttons[TITEMS] = {
  620. X  { "EXCH", CCTRL('e'), OP_SET,   MAUVE,    do_pending },       /* Row 1. */
  621. X  { "CON ", '#',        OP_SET,   BLUE,     do_pending },
  622. X  { "BIN ", 'B',        OP_CLEAR, YELLOW,   do_base },
  623. X  { "MEM ", 'M',        OP_CLEAR, BLUE,     toggle_reg_canvas },
  624. X  { "OCT ", 'O',        OP_CLEAR, YELLOW,   do_base },
  625. X  { "D   ", 'd',        OP_NOP,   PINK,     do_number },
  626. X  { "DEC ", 'D',        OP_CLEAR, YELLOW,   do_base },
  627. X  { "E   ", 'e',        OP_NOP,   PINK,     do_number }, 
  628. X  { "HEX ", 'H',        OP_CLEAR, YELLOW,   do_base },
  629. X  { "F   ", 'f',        OP_NOP,   PINK,     do_number },  
  630. X  { "SCI ", CCTRL('n'), OP_CLEAR, BLUE,     do_set_mode },
  631. X  { "FUN ", CCTRL('f'), OP_SET,   BLUE,     do_pending },
  632. X
  633. X  { "&32 ", '[',        OP_CLEAR, LGREY,    do_immediate },      /* Row 2. */
  634. X  { "STO ", 's',        OP_SET,   MAUVE,    do_pending },
  635. X  { "&16 ", ']',        OP_CLEAR, LGREY,    do_immediate },
  636. X  { "RCL ", 'r',        OP_SET,   MAUVE,    do_pending }, 
  637. X  { "<   ", '<',        OP_SET,   LGREY,    do_pending },
  638. X  { "A   ", 'a',        OP_NOP,   PINK,     do_number }, 
  639. X  { ">   ", '>',        OP_SET,   LGREY,    do_pending },
  640. X  { "B   ", 'b',        OP_NOP,   PINK,     do_number },
  641. X  { "%   ", '%',        OP_SET,   LPURPLE,  do_calculation },
  642. X  { "C   ", 'c',        OP_NOP,   PINK,     do_number },
  643. X  { "clr ", '\177',     OP_CLEAR, BLUE,     do_clear },
  644. X  { "bsp ", CCTRL('h'), OP_NOP,   BLUE,     do_delete },
  645. X
  646. X  { "OR  ", '|',        OP_SET,   GREEN,    do_calculation },   /* Row 3. */
  647. X  { "AND ", '&',        OP_SET,   GREEN,    do_calculation },
  648. X  { "HYP ", 'h',        OP_CLEAR, BLUE,     do_set_mode },
  649. X  { "SIN ", CCTRL('s'), OP_CLEAR, LGREEN,   do_trig },
  650. X  { "e^x ", '{',        OP_CLEAR, ORANGE,   do_immediate },
  651. X  { "7   ", '7',        OP_NOP,   LBLUE,    do_number },
  652. X  { "10^x", '}',        OP_CLEAR, ORANGE,   do_immediate },
  653. X  { "8   ", '8',        OP_NOP,   LBLUE,    do_number },
  654. X  { "y^x ", 'Y',        OP_SET,   ORANGE,   do_calculation },
  655. X  { "9   ", '9',        OP_NOP,   LBLUE,    do_number }, 
  656. X  { "INT ", 'I',        OP_CLEAR, LGREY,    do_portion },
  657. X  { "X   ", 'x',        OP_SET,   LPURPLE,  do_calculation },
  658. X
  659. X  { "XNOR", 'n',        OP_SET,   GREEN,    do_calculation },   /* Row 4. */
  660. X  { "XOR ", '^',        OP_SET,   GREEN,    do_calculation },
  661. X  { "INV ", 'i',        OP_CLEAR, BLUE,     do_set_mode },
  662. X  { "COS ", CCTRL('c'), OP_CLEAR, LGREEN,   do_trig },
  663. X  { "ln  ", 'N',        OP_CLEAR, ORANGE,   do_immediate },
  664. X  { "4   ", '4',        OP_NOP,   LBLUE,    do_number },
  665. X  { "log ", 'G',        OP_CLEAR, ORANGE,   do_immediate },
  666. X  { "5   ", '5',        OP_NOP,   LBLUE,    do_number },
  667. X  { "SQRT", 'S',        OP_CLEAR, ORANGE,   do_immediate },
  668. X  { "6   ", '6',        OP_NOP,   LBLUE,    do_number },
  669. X  { "FRAC", 'F',        OP_CLEAR, LGREY,    do_portion },
  670. X  { "/   ", '/',        OP_SET,   LPURPLE,  do_calculation },
  671. X
  672. X  { "NOT ", '~',        OP_CLEAR, GREEN,    do_immediate },     /* Row 5. */
  673. X  { "ACC ", 'A',        OP_SET,   BLUE,     do_pending },
  674. X  { "EXP ", 'E',        OP_SET,   BLUE,     do_expno },
  675. X  { "TAN ", CCTRL('t'), OP_CLEAR, LGREEN,   do_trig },
  676. X  { "1/x ", 'R',        OP_CLEAR, ORANGE,   do_immediate },
  677. X  { "1   ", '1',        OP_NOP,   LBLUE,    do_number },
  678. X  { "x!  ", '!',        OP_CLEAR, ORANGE,   do_immediate },
  679. X  { "2   ", '2',        OP_NOP,   LBLUE,    do_number },
  680. X  { "x^2 ", '@',        OP_CLEAR, ORANGE,   do_immediate },
  681. X  { "3   ", '3',        OP_NOP,   LBLUE,    do_number },
  682. X  { "CHS ", 'C',        OP_CLEAR, LGREY,    do_immediate },
  683. X  { "-   ", '-',        OP_SET,   LPURPLE,  do_calculation },
  684. X
  685. X  { "QUIT", 'q',        OP_CLEAR, BLUE,     destroy_frame },    /* Row 6. */
  686. X  { "OFF ", 'o',        OP_CLEAR, BLUE,     close_frame },
  687. X  { "KEYS", 'K',        OP_CLEAR, BLUE,     do_keys },
  688. X  { "?   ", '?',        OP_SET,   BLUE,     do_pending },
  689. X  { "DEG ", CCTRL('d'), OP_CLEAR, RED,      do_trigtype },
  690. X  { "0   ", '0',        OP_NOP,   LBLUE,    do_number },
  691. X  { "RAD ", CCTRL('r'), OP_CLEAR, RED,      do_trigtype },
  692. X  { ".   ", '.',        OP_NOP,   LPURPLE,  do_point },
  693. X  { "GRAD", CCTRL('g'), OP_CLEAR, RED,      do_trigtype },
  694. X  { "=   ", '=',        OP_CLEAR, LPURPLE,  do_calculation },
  695. X  { "ABS ", 'U',        OP_CLEAR, LGREY,    do_portion },
  696. X  { "+   ", '+',        OP_SET,   LPURPLE,  do_calculation },
  697. X
  698. X/* Extra definitions. */
  699. X
  700. X  { "X   ", 'X',        OP_SET,   WHITE,    do_calculation },
  701. X  { "X   ", '*',        OP_SET,   WHITE,    do_calculation },
  702. X  { "    ", CCTRL('m'), OP_CLEAR, WHITE,    do_calculation },
  703. X  { "QUIT", 'Q',        OP_CLEAR, WHITE,    destroy_frame },
  704. X  { "    ", '\f',       OP_NOP,   WHITE,    do_repaint },
  705. X} ;
  706. X
  707. X/*  256-byte table for quickly reversing the bits in an unsigned 8-bit char,
  708. X *  used to convert between MSBFirst and LSBFirst image formats.
  709. X */
  710. X
  711. Xchar revtable[256] = {
  712. X        0, -128,   64,  -64,   32,  -96,   96,  -32,
  713. X       16, -112,   80,  -48,   48,  -80,  112,  -16,
  714. X        8, -120,   72,  -56,   40,  -88,  104,  -24,
  715. X       24, -104,   88,  -40,   56,  -72,  120,   -8,
  716. X        4, -124,   68,  -60,   36,  -92,  100,  -28,
  717. X       20, -108,   84,  -44,   52,  -76,  116,  -12,
  718. X       12, -116,   76,  -52,   44,  -84,  108,  -20,
  719. X       28, -100,   92,  -36,   60,  -68,  124,   -4,
  720. X        2, -126,   66,  -62,   34,  -94,   98,  -30,
  721. X       18, -110,   82,  -46,   50,  -78,  114,  -14,
  722. X       10, -118,   74,  -54,   42,  -86,  106,  -22,
  723. X       26, -102,   90,  -38,   58,  -70,  122,   -6,
  724. X        6, -122,   70,  -58,   38,  -90,  102,  -26,
  725. X       22, -106,   86,  -42,   54,  -74,  118,  -10,
  726. X       14, -114,   78,  -50,   46,  -82,  110,  -18,
  727. X       30,  -98,   94,  -34,   62,  -66,  126,   -2,
  728. X        1, -127,   65,  -63,   33,  -95,   97,  -31,
  729. X       17, -111,   81,  -47,   49,  -79,  113,  -15,
  730. X        9, -119,   73,  -55,   41,  -87,  105,  -23,
  731. X       25, -103,   89,  -39,   57,  -71,  121,   -7,
  732. X        5, -123,   69,  -59,   37,  -91,  101,  -27,
  733. X       21, -107,   85,  -43,   53,  -75,  117,  -11,
  734. X       13, -115,   77,  -51,   45,  -83,  109,  -19,
  735. X       29,  -99,   93,  -35,   61,  -67,  125,   -3,
  736. X        3, -125,   67,  -61,   35,  -93,   99,  -29,
  737. X       19, -109,   83,  -45,   51,  -77,  115,  -13,
  738. X       11, -117,   75,  -53,   43,  -85,  107,  -21,
  739. X       27, -101,   91,  -37,   59,  -69,  123,   -5,
  740. X        7, -121,   71,  -57,   39,  -89,  103,  -25,
  741. X       23, -105,   87,  -41,   55,  -73,  119,   -9,
  742. X       15, -113,   79,  -49,   47,  -81,  111,  -17,
  743. X       31,  -97,   95,  -33,   63,  -65,  127,   -1,
  744. X} ;
  745. X
  746. Xchar display[MAXLINE] ;     /* Current calculator display. */
  747. Xchar helpname[MAXLINE] ;    /* Filename for help file. */
  748. Xchar progname[MAXLINE] ;    /* Name of this program. */
  749. X
  750. X
  751. Xmain(argc,argv)
  752. Xint argc ;
  753. Xchar *argv[] ;
  754. X{
  755. X  STRCPY(progname, argv[0]) ; /* Save this programs name. */
  756. X  get_options(argc, argv) ;   /* Get command line arguments. */
  757. X  get_helpfile(helpname) ;    /* Open helpfile if present. */
  758. X  read_rcfiles() ;            /* Read .calctoolrc's files. */
  759. X  if (init_ws_type())         /* Determine window system type. */
  760. X    {
  761. X      FPRINTF(stderr,"Error initialising window system.\n") ;
  762. X      exit(1) ;
  763. X    }
  764. X  init_fonts() ;              /* Open required fonts. */
  765. X  make_icon() ;               /* Set up the calctool window icon. */
  766. X  make_frames(argc, argv) ;   /* Create calctool window frames. */
  767. X  make_subframes() ;          /* Create panels and canvases. */
  768. X  make_menus() ;              /* Create menus for graphics versions. */
  769. X  if (gtype != X11) load_colors() ;  /* Load the initial calctool colormap. */
  770. X
  771. X  shelf = NULL ;              /* No selection for shelf initially. */
  772. X  pending = 0 ;               /* No initial pending command. */
  773. X  rstate = 0 ;                /* No memory register frame display initially. */
  774. X  tstate = 0 ;                /* Button values displayed first. */
  775. X  hyperbolic = 0 ;            /* Normal trig functions initially. */
  776. X  inverse = 0 ;               /* No inverse functions initially. */
  777. X  base = DEC ;                /* Initial base. */
  778. X  ttype = DEG ;               /* Initial trigonometric type. */
  779. X  dtype = FIX ;               /* Initial number display mode. */
  780. X  down = 0 ;                  /* No mouse presses initially. */
  781. X
  782. X  make_items() ;              /* Create panel items and cursors. */
  783. X  do_clear() ;                /* Initialise and clear display. */
  784. X  set_cursor(MAINCURSOR) ;    /* Initially display the arrow cursor. */
  785. X  start_tool() ;              /* Display the calculator. */
  786. X  exit(0) ;
  787. X}
  788. X
  789. X
  790. Xmatherr(x)      /* Calctools' math library error-handling routine. */
  791. Xstruct exception *x ;
  792. X{
  793. X  SPRINTF(display, "Error in %s", x->name) ;
  794. X  set_item(DISPLAYITEM, display) ;
  795. X  error = 1 ;
  796. X  set_item(OPITEM, "CLR") ;
  797. X  return(1) ;
  798. X}
  799. SHAR_EOF
  800. chmod 0444 calctool.c || echo "restore of calctool.c fails"
  801. set `wc -c calctool.c`;Sum=$1
  802. if test "$Sum" != "17879"
  803. then echo original size 17879, current size $Sum;fi
  804. echo "x - extracting mgr.c (Text)"
  805. sed 's/^X//' << 'SHAR_EOF' > mgr.c &&
  806. X
  807. X/*  @(#)mgr.c 1.11 89/12/21
  808. X *
  809. X *  These are the MGR dependent graphics routines used by calctool.
  810. X *
  811. X *  Copyright (c) Rich Burridge.
  812. X *                Sun Microsystems, Australia - All rights reserved.
  813. X *
  814. X *  Permission is given to distribute these sources, as long as the
  815. X *  copyright messages are not removed, and no monies are exchanged.
  816. X *
  817. X *  No responsibility is taken for any errors or inaccuracies inherent
  818. X *  either to the comments or the code of this program, but if
  819. X *  reported to me then an attempt will be made to fix them.
  820. X */
  821. X
  822. X#include "dump.h"
  823. X#include "term.h"
  824. X#include "calctool.h"
  825. X#include "color.h"
  826. X#include "extern.h"
  827. X
  828. X#define  S_FONT      1     /* Font descriptors. */
  829. X#define  N_FONT      2
  830. X#define  B_FONT      3
  831. X
  832. X#define  ICONIC      0     /* States that the calctool display can be in. */
  833. X#define  JUST_KEYS   1
  834. X#define  SHOW_ALL    2
  835. X
  836. X#define  PR_ICON     1     /* Descriptor for closed icon image. */
  837. X
  838. X#define  SMALLFONT   "sail6x8r"
  839. X#define  NORMALFONT  "cour7x14b"
  840. X#define  BIGFONT     "gal12x20r"
  841. X
  842. X#define  MENU_COUNT  (sizeof(menus) / (sizeof(struct menu_entry) * MAXMENUS))
  843. X
  844. Xstruct menu_entry menus[MAXMENUS][MAXREGS] ;
  845. X
  846. Xchar fontname[MAXLINE] ;      /* Full pathname of the small font. */
  847. X
  848. Xint local_mode ;         /* Used by load_icon for correct line mode. */
  849. Xint mgr_infd ;           /* MGR input connection file descriptor. */
  850. Xint mgr_outfd ;          /* MGR output connection file descriptor. */
  851. X
  852. Xshort icon_image[] = {
  853. X#include "calctool.icon"
  854. X} ;
  855. X
  856. X#ifdef NO_4_3SELECT
  857. Xint fullmask ;               /* Full mask of file descriptors to check on. */ 
  858. Xint readmask ;               /* Readmask used in select call. */ 
  859. X#else 
  860. Xfd_set fullmask ;            /* Full mask of file descriptors to check on. */
  861. Xfd_set readmask ;            /* Readmask used in select call. */
  862. X#endif /*NO_4_3SELECT */
  863. X
  864. XSIGRET
  865. Xclean(code)
  866. Xint code ;
  867. X{
  868. X  m_bitdestroy(1) ;
  869. X  m_pop() ;
  870. X  m_ttyreset() ;
  871. X  m_clear() ;
  872. X  exit(code) ;
  873. X}
  874. X
  875. X
  876. X/*ARGSUSED*/
  877. Xclear_canvas(canvas, color)
  878. Xenum can_type canvas ;
  879. Xint color ;
  880. X{
  881. X  m_func(B_CLEAR) ;
  882. X  if (canvas == KEYCANVAS)
  883. X    m_bitwrite(0, 0, TWIDTH+10, THEIGHT+DISPLAY+10) ;
  884. X  else if (canvas == REGCANVAS)
  885. X    m_bitwrite(TWIDTH+15, 0, TWIDTH+10, THEIGHT+DISPLAY+10) ;
  886. X}
  887. X
  888. X
  889. Xclose_frame()
  890. X{
  891. X  reshape(ICONIC) ;
  892. X  m_clearmode(M_ACTIVATE) ;
  893. X}
  894. X
  895. X
  896. Xcolor_area(x, y, width, height, color)
  897. Xint x, y, width, height, color ;
  898. X{
  899. X  if (color == BLACK)
  900. X    {
  901. X      m_func(B_COPY) ;
  902. X      m_bitwrite(x, y, width, height) ;
  903. X    }
  904. X}
  905. X
  906. X
  907. Xcreate_menu(mtype)     /* Create popup menu for right button press. */
  908. Xenum menu_type mtype ;
  909. X{
  910. X  int i ;
  911. X  char istr[3] ;       /* String representation for action value. */
  912. X
  913. X  for (i = 0; i < MAXREGS; i++)
  914. X    {
  915. X      SPRINTF(istr, "%1d\r", i) ;
  916. X      switch (mtype)
  917. X        {
  918. X          case M_ACC    :                              /* Accuracies. */
  919. X          case M_EXCH   :                              /* Register exchange. */
  920. X          case M_LSHIFT :                              /* Left shift. */
  921. X          case M_RCL    :                              /* Register recall. */
  922. X          case M_RSHIFT :                              /* Right shift. */
  923. X          case M_STO    :                              /* Register store. */
  924. X                          menus[(int) mtype][i].value = num_names[i] ;
  925. X                          break ;
  926. X          case M_CON    :                              /* Constants. */
  927. X                          menus[(int) mtype][i].value = con_names[i] ;
  928. X                          break ;
  929. X          case M_FUN    :                              /* Functions. */
  930. X                          menus[(int) mtype][i].value = fun_names[i] ;
  931. X        }
  932. X      menus[(int) mtype][i].action = num_names[i] ;
  933. X    }
  934. X  menu_load((int) mtype, MENU_COUNT, menus[(int) mtype]) ;
  935. X}
  936. X
  937. X
  938. Xdestroy_frame()
  939. X{
  940. X  clean(0) ;
  941. X}
  942. X
  943. X
  944. Xdo_menu(mtype)      /* Popup appropriate menu and get value. */
  945. Xenum menu_type mtype ;
  946. X{
  947. X  m_selectmenu2((int) mtype) ;
  948. X}
  949. X
  950. X
  951. Xdrawline(x1, y1, x2, y2)
  952. Xint x1, y1, x2, y2 ;
  953. X{
  954. X  m_func(B_COPY) ;
  955. X  m_line(x1, y1, x2, y2) ;
  956. X}
  957. X
  958. X
  959. Xdraw_regs()
  960. X{
  961. X  reshape(SHOW_ALL) ;
  962. X  clear_canvas(REGCANVAS, WHITE) ;
  963. X  drawline(TWIDTH, 0, TWIDTH, THEIGHT+DISPLAY+10) ;
  964. X  make_registers() ;
  965. X}
  966. X
  967. X
  968. X/*ARGSUSED*/
  969. Xdrawtext(x, y, window, fontno, color, str)
  970. Xenum font_type fontno ;
  971. Xenum can_type window ;
  972. Xint x, y, color ;
  973. Xchar *str ;
  974. X{
  975. X  int i ;
  976. X
  977. X       if (fontno == SFONT) m_font(S_FONT) ;
  978. X  else if (fontno == NFONT) m_font(N_FONT) ;
  979. X  else if (fontno == BFONT) m_font(B_FONT) ;
  980. X       if (window == REGCANVAS) x += TWIDTH + 15 ;
  981. X  m_func(B_XOR) ;
  982. X  i = strlen(str)-1 ;
  983. X  while (str[i] == ' ' && i) str[i--] = '\0' ;
  984. X  m_stringto(0, x, y+4, str) ;
  985. X  m_movecursor(2500, 2500) ;
  986. X}
  987. X
  988. X
  989. Xget_display()
  990. X{
  991. X}
  992. X
  993. X
  994. Xget_next_event()
  995. X{
  996. X  int c ;
  997. X  static struct timeval tval = { 0, 0 } ;
  998. X
  999. X  m_flush() ;
  1000. X  for (;;)
  1001. X    {
  1002. X      readmask = fullmask ;
  1003. X#ifdef NO_4_3SELECT
  1004. X      SELECT(32, &readmask, 0, 0, &tval) ;
  1005. X      if (readmask && (1 << mgr_infd))
  1006. X#else
  1007. X      SELECT(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0, &tval) ;
  1008. X      if (FD_ISSET(mgr_infd, &readmask))
  1009. X#endif /*NO_4_3SELECT*/
  1010. X        {
  1011. X          if ((c = m_getchar()) == EOF)
  1012. X            {
  1013. X              clearerr(m_termin) ;
  1014. X              continue ;
  1015. X            }
  1016. X          get_mouse(&curx, &cury) ;
  1017. X          switch (c)
  1018. X            {
  1019. X              case '\030' : return(MIDDLE_DOWN) ;
  1020. X              case '\031' : return(MIDDLE_UP) ;
  1021. X              case '\032' : return(LEFT_DOWN) ;
  1022. X              case '\033' : return(LEFT_UP) ;
  1023. X              case '\034' : return(DIED) ;           /* Window destroyed. */
  1024. X              case '\035' : if (iconic) iconic = 0 ;
  1025. X              case '\036' : if (rstate) reshape(SHOW_ALL) ;
  1026. X                            else reshape(JUST_KEYS) ;
  1027. X              case '\037' : return(CFRAME_REPAINT) ; /* Window redrawn. */
  1028. X              default     : cur_ch = c ;
  1029. X                            return(KEYBOARD) ;
  1030. X            }
  1031. X        }
  1032. X    }    
  1033. X}
  1034. X
  1035. X
  1036. Xhandle_selection()
  1037. X{
  1038. X}
  1039. X
  1040. X
  1041. Xinit_fonts()
  1042. X{
  1043. X  char path[MAXLINE] ;     /* Directory path for font files. */
  1044. X
  1045. X#ifdef MGRHOME
  1046. X  STRCPY(path, MGRHOME) ;
  1047. X#else
  1048. X  STRCPY(path, "/usr/mgr") ;
  1049. X#endif /*MGRHOME*/
  1050. X
  1051. X  SPRINTF(fontname, "%s/font/%s", path, SMALLFONT) ;
  1052. X  m_loadfont(SFONT, fontname) ;
  1053. X
  1054. X  SPRINTF(fontname, "%s/font/%s", path, NORMALFONT) ; 
  1055. X  m_loadfont(NFONT, fontname) ;
  1056. X  nfont_width = 9 ;
  1057. X
  1058. X  SPRINTF(fontname, "%s/font/%s", path, BIGFONT) ; 
  1059. X  m_loadfont(BFONT, fontname) ;
  1060. X
  1061. X}
  1062. X
  1063. X
  1064. Xinit_ws_type()
  1065. X{
  1066. X  m_setup(M_FLUSH) ;     /* Setup I/O; turn on flushing. */
  1067. X  m_push(P_BITMAP | P_MENU | P_EVENT | P_FONT | P_FLAGS | P_POSITION) ;
  1068. X  mgr_infd = fileno(m_termin) ;
  1069. X  mgr_outfd = fileno(m_termout) ;
  1070. X
  1071. X  SIGNAL(SIGHUP, clean) ;
  1072. X  SIGNAL(SIGINT, clean) ;
  1073. X  SIGNAL(SIGTERM, clean) ;
  1074. X  m_ttyset() ;
  1075. X  m_setraw() ;
  1076. X  m_setmode(M_NOWRAP) ;
  1077. X  m_setmode(M_ABS) ;
  1078. X  m_setmode(ACTIVATE) ;
  1079. X  m_clearmode(M_NOINPUT) ;
  1080. X  m_func(B_COPY) ;
  1081. X
  1082. X  gtype = MGR ;
  1083. X  return 0 ;
  1084. X}
  1085. X
  1086. X
  1087. Xload_colors()      /* Hardwired to a monochrome version. */
  1088. X{
  1089. X  iscolor = 0 ;
  1090. X}
  1091. X
  1092. X
  1093. Xload_icon(pixrect, ibuf)
  1094. Xint pixrect ;
  1095. Xshort ibuf[256] ;
  1096. X{
  1097. X  int size ;
  1098. X
  1099. X  IOCTL(mgr_outfd, TIOCLGET, &local_mode) ;
  1100. X  local_mode |= LLITOUT ;
  1101. X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
  1102. X
  1103. X  size = ICONHEIGHT * (((64 + 15) &~ 15) >> 3) ;
  1104. X  m_bitldto(ICONWIDTH, ICONHEIGHT, 0, 0, pixrect, size) ;
  1105. X  m_flush() ;
  1106. X  WRITE(mgr_outfd, (char *) ibuf, size) ;
  1107. X
  1108. X  local_mode &= ~LLITOUT ;
  1109. X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
  1110. X}
  1111. X
  1112. X
  1113. X/*ARGSUSED*/
  1114. Xmake_frames(argc, argv)
  1115. Xint argc ;
  1116. Xchar *argv[] ;
  1117. X{
  1118. X#ifdef NO_4_3SELECT
  1119. X  fullmask = 1 << mgr_infd ;
  1120. X#else
  1121. X  FD_ZERO(&fullmask) ;
  1122. X  FD_SET(mgr_infd, &fullmask) ;
  1123. X#endif /*NO_4_3SELECT*/
  1124. X
  1125. X  m_setevent(BUTTON_1, "\030") ;    /* Right mouse button depressed. */
  1126. X  m_setevent(BUTTON_1U, "\031") ;   /* Right mouse button released. */
  1127. X
  1128. X  m_setevent(BUTTON_2, "\032") ;    /* Middle mouse button depressed. */
  1129. X  m_setevent(BUTTON_2U, "\033") ;   /* Middle mouse button released. */
  1130. X
  1131. X  m_setevent(ACTIVATE, "\034") ;    /* Window has been activated. */
  1132. X  m_setevent(DESTROY, "\035") ;     /* Check for window being destroyed. */
  1133. X  m_setevent(RESHAPE, "\036") ;     /* Check for window being reshaped. */
  1134. X  m_setevent(REDRAW, "\037") ;      /* Check for window being redrawn. */
  1135. X}
  1136. X
  1137. X
  1138. Xmake_icon()
  1139. X{
  1140. X  load_icon(PR_ICON, icon_image) ;
  1141. X}
  1142. X
  1143. X
  1144. Xmake_items()
  1145. X{
  1146. X  do_repaint() ;               /* Redraw the calctool canvas[es]. */
  1147. X  m_movecursor(2500, 2500) ;   /* Move character cursor offscreen. */
  1148. X}
  1149. X
  1150. X
  1151. Xmake_subframes()
  1152. X{
  1153. X  m_font(N_FONT) ;          /* Use the default font. */
  1154. X  reshape(JUST_KEYS) ;
  1155. X  m_clear() ;               /* Clear calctool window. */
  1156. X}
  1157. X
  1158. X
  1159. Xreshape(type)
  1160. Xint type ;
  1161. X{
  1162. X  int x, y, w, h ;      /* Position and size of calctool window. */
  1163. X
  1164. X  get_size(&x, &y, &w, &h) ;
  1165. X  switch (type)
  1166. X    {
  1167. X      case ICONIC    : m_shapewindow(x, y, ICONWIDTH+10, ICONHEIGHT+10) ;
  1168. X                       m_clear() ;
  1169. X                       m_bitcopyto(0, 0, ICONWIDTH, ICONHEIGHT,
  1170. X                                   0, 0, 0, PR_ICON) ;
  1171. X                       break ;
  1172. X      case JUST_KEYS : m_shapewindow(x, y, TWIDTH+10, THEIGHT+DISPLAY+10) ;
  1173. X                       break ;
  1174. X      case SHOW_ALL  : m_shapewindow(x, y, 2*TWIDTH+25, THEIGHT+DISPLAY+10) ;
  1175. X    }
  1176. X  m_movecursor(2500, 2500) ;
  1177. X}
  1178. X
  1179. X
  1180. X/*ARGSUSED*/
  1181. Xset_cursor(type)   /* Doesn't appear to be any way to set the cursor. */
  1182. Xint type ;
  1183. X{
  1184. X}
  1185. X
  1186. X
  1187. Xstart_tool()
  1188. X{
  1189. X  while (1)
  1190. X    process_event(get_next_event()) ;
  1191. X}
  1192. X
  1193. X
  1194. Xtoggle_reg_canvas()      /* Show or clear memory register area. */
  1195. X{
  1196. X  rstate = !rstate ;
  1197. X  if (rstate) draw_regs() ;
  1198. X  else reshape (JUST_KEYS) ;
  1199. X}
  1200. SHAR_EOF
  1201. chmod 0444 mgr.c || echo "restore of mgr.c fails"
  1202. set `wc -c mgr.c`;Sum=$1
  1203. if test "$Sum" != "9469"
  1204. then echo original size 9469, current size $Sum;fi
  1205. echo "x - extracting news.c (Text)"
  1206. sed 's/^X//' << 'SHAR_EOF' > news.c &&
  1207. X
  1208. X/*  @(#)news.c 1.9 89/12/21
  1209. X *
  1210. X *  These are the NeWS dependent graphics routines used by calctool.
  1211. X *
  1212. X *  Copyright (c) Rich Burridge.
  1213. X *                Sun Microsystems, Australia - All rights reserved.
  1214. X *
  1215. X *  Permission is given to distribute these sources, as long as the
  1216. X *  copyright messages are not removed, and no monies are exchanged.
  1217. X *
  1218. X *  No responsibility is taken for any errors or inaccuracies inherent
  1219. X *  either to the comments or the code of this program, but if
  1220. X *  reported to me then an attempt will be made to fix them.
  1221. X */
  1222. X
  1223. X#include "calctool.h"
  1224. X#include "color.h"
  1225. X#include "extern.h"
  1226. X#include <sys/types.h>
  1227. X
  1228. Xextern FILE *PostScript ;
  1229. Xextern FILE *PostScriptInput ;
  1230. X
  1231. X
  1232. Xclear_canvas(canvas, color)
  1233. Xenum can_type canvas ;
  1234. Xint color ;
  1235. X{
  1236. X  char cantype ;
  1237. X
  1238. X       if (canvas == KEYCANVAS) cantype = 'K' ;
  1239. X  else if (canvas == REGCANVAS) cantype = 'R' ;
  1240. X  FPRINTF(PostScript,"%d %cC PSClearCanvas\n", color, cantype) ;
  1241. X  FFLUSH(PostScript) ;
  1242. X}
  1243. X
  1244. X
  1245. Xclose_frame()
  1246. X{
  1247. X  FPRINTF(PostScript, "PSCloseFrame\n") ;
  1248. X  FFLUSH(PostScript) ;
  1249. X}
  1250. X
  1251. X
  1252. Xcolor_area(x, y, width, height, color)
  1253. Xint x, y, width, height, color ;
  1254. X{
  1255. X  FPRINTF(PostScript, "%d %d %d %d %d PSColorArea\n",
  1256. X          color, x, width, height, y) ;
  1257. X  FFLUSH(PostScript) ;
  1258. X}
  1259. X
  1260. X
  1261. Xcreate_menu(mtype)     /* Create popup menu for right button press. */
  1262. Xenum menu_type mtype ;
  1263. X{
  1264. X  int i ;
  1265. X
  1266. X  FPRINTF(PostScript, "/Menu%1d [\n", (int) mtype) ;
  1267. SHAR_EOF
  1268. echo "End of part 3"
  1269. echo "File news.c is continued in part 4"
  1270. echo "4" > s2_seq_.tmp
  1271. exit 0
  1272.  
  1273.