[comp.sources.misc] v10i008: Calctool V2.4 - a simple calculator

richb@Aus.Sun.COM (Rich Burridge) (01/16/90)

Posting-number: Volume 10, Issue 8
Submitted-by: richb@Aus.Sun.COM (Rich Burridge)
Archive-name: calctool24/part03

---- Cut Here and unpack ----
#!/bin/sh
# this is part 3 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file functions.c continued
#
CurArch=3
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file functions.c"
sed 's/^X//' << 'SHAR_EOF' >> functions.c
X                              break ;
X            case CCTRL('t') : disp_val = atan(disp_val) ;     /* atan */
X          }
X      else
X        switch (current)
X          {
X            case CCTRL('c') : disp_val = acosh(disp_val) ;    /* acosh */
X                              break ;
X            case CCTRL('s') : disp_val = asinh(disp_val) ;    /* asinh */
X                              break ;
X            case CCTRL('t') : disp_val = atanh(disp_val) ;    /* atanh */
X          }
X
X      tresults[(int) DEG]  = disp_val * 180.0 / M_PI ;
X      tresults[(int) GRAD] = disp_val * 200.0 / M_PI ;
X      tresults[(int) RAD]  = disp_val ;
X    }
X
X  cur_op = current ;
X  show_display(tresults[(int) ttype]) ;
X  disp_val = tresults[(int) ttype] ;
X}
X
X
Xdo_trigtype()          /* Change the current trigonometric type. */
X{
X  switch (current)
X    {
X      case CCTRL('d') : ttype = DEG ;
X                        break ;
X      case CCTRL('g') : ttype = GRAD ;
X                        break ;
X      case CCTRL('r') : ttype = RAD ;
X    }
X  if (cur_op == CCTRL('c') || cur_op == CCTRL('s') || cur_op == CCTRL('t'))
X    {
X      disp_val = tresults[(int) ttype] ;
X      show_display(tresults[(int) ttype]) ;
X    }
X  set_item(TTYPEITEM, ttype_str[(int) ttype]) ;
X}
X
X
XBOOLEAN
Xibool(x)
Xdouble x ;
X{
X  BOOLEAN p ;
X 
X  if (x > 68719476736.00) return(0) ;
X  else if (x < -68719476736.00) return(0) ;
X       else
X         {
X           while(x < 0.0) x += 4294967296.00 ;
X           while(x > 4294967296.00) x -= 4294967296.00 ;
X           p = x ;
X           return (p) ;
X         }
X}
X
X
Xdouble
Xsetbool(p)
XBOOLEAN p ;
X{
X  BOOLEAN q ;
X  double val ;
X
X  q = p & 0x80000000 ;
X  p &= 0x7fffffff ;
X  val = p ;
X  if (q) val += 2147483648.0 ;
X  return(val) ;
X}
SHAR_EOF
echo "File functions.c is complete"
chmod 0444 functions.c || echo "restore of functions.c fails"
set `wc -c functions.c`;Sum=$1
if test "$Sum" != "18212"
then echo original size 18212, current size $Sum;fi
echo "x - extracting get.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > get.c &&
X
X/*  @(#)get.c 1.8 89/12/13
X *
X *  Command line and help file routines.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "patchlevel.h"
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X
X
Xchar *
Xconvert(line)              /* Convert .calctoolrc line to ascii values. */
Xchar *line ;               /* Input line to be converted. */
X{
X  char output[MAXLINE] ;   /* Converted output record. */
X  int ctrl = 0       ;     /* Set if we are processing a control character. */
X  int i ;                  /* Position within input line. */
X  int n = 0 ;              /* Position within output line. */
X
X  for (i = 0; i < strlen(line)-1; i++)
X    {
X           if (line[i] == ' ') continue ;
X      else if (line[i] == '\\') ctrl = 1 ;
X      else if (ctrl)
X        {
X          output[n++] = CCTRL(line[i]) ;
X          ctrl = 0 ;
X        }
X      else output[n++] = line[i] ;
X    }
X  output[n] = '\0' ;
X  return(output) ;
X}
X
X
Xget_options(argc, argv)           /* Extract command line options. */
Xint argc ;
Xchar *argv[] ;
X{
X  char next[MAXLINE] ;    /* The next command line parameter. */
X
X  STRCPY(helpname, HELPNAME) ;    /* Default help filename. */
X  STRCPY(x11_display, "") ;       /* Initially no X11 display value. */
X  STRCPY(geometry, "") ;          /* Initialy no X11 geometry value. */
X  accuracy = 2 ;                  /* Initial accuracy. */
X  inv_video = 0 ;                 /* Default is normal video. */
X  INC ;
X  while (argc > 0)
X    {
X      if (argv[0][0] == '-')
X        switch (argv[0][1])
X          {
X            case 'a' : INC ;
X                       getparam(next, argv, "-a needs accuracy value") ;
X                       accuracy = atoi(next) ;
X                       if (accuracy < 0 || accuracy > 9)
X                         {
X                           FPRINTF(stderr,
X                                   "%s: accuracy should be in the range 0-9\n",
X                                   progname) ;
X                           accuracy = 2 ;
X                         }
X                       break ;
X            case 'd' : INC ;                 /* X11 display information. */
X                       getparam(x11_display, argv, "-d needs display information") ;                       break ;
X            case 'g' : INC ;                 /* X11 geometry information. */
X                       getparam(geometry, argv, "-g needs geometry information") ;
X                       break ;
X            case 'h' : INC ;
X                       getparam(helpname, argv, "-h needs helpfile name") ;
X                       break ;
X            case 'i' : inv_video = 1 ;
X                       break ;
X            case 'v' : FPRINTF(stderr, "%s version 2.4.%1d\n", progname, PATCHLEVEL) ;
X                       break ;
X/*  SunView windowing arguments. -Wp, -WP and -Wi are used in the NeWS
X *  implementation to initially position the window and icon.
X */
X
X            case 'W' : switch (argv[0][2])
X                         {
X                           case 'H' : break ;   /* -WH, no sub-args follow */
X                           case 'i' : iconic = 1 ;
X                                      break ;   /* -Wi, start as an icon. */
X                           case 'g' :           /* -Wg, set default color. */
X                           case 'n' : break ;   /* -Wn, no label at all */
X                           case 'h' :           /* -Wh, height */
X                           case 'I' :           /* -WI "icon filename" */
X                           case 'l' :           /* -Wl "some window label" */
X                           case 'L' :           /* -Wl "some icon label" */
X                           case 't' :           /* Font filename */
X                           case 'T' :           /* Icon font filename */
X                           case 'w' : INC ;     /* Width, in columns. */
X                                      break ;
X                           case 'p' : INC ;     /* -Wp xnum ynum */
X                                      getparam(next, argv,
X                                               "-Wp needs x coordinate") ;
X                                      wx = atoi(next) ;
X                                      INC ;
X                                      getparam(next, argv,
X                                               "-Wp needs y coordinate") ;
X                                      wy = atoi(next) ;
X                                      posspec = 1 ;
X                                      break ;
X                           case 'P' : INC ;      /* -WP xnum ynum */
X                                      getparam(next, argv,
X                                               "-WP needs x coordinate") ;
X                                      ix = atoi(next) ;
X                                      INC ;
X                                      getparam(next, argv,
X                                               "-WP needs y coordinate") ;
X                                      iy = atoi(next) ;
X                                      break ;
X                           case 's' : INC ; INC ;  /* -Ws xnum ynum */
X                                      break ;
X                           case 'b' :              /* -Wb r g b (bg color spec)
X*/
X                           case 'f' : INC ; INC ; INC ;  /* Same, fg color */
X                                      break ;
X                           default :  FPRINTF(stderr,"%s: -W%c unknown argument\n",
X                                                      progname, argv[0][2]) ;
X                                      break ;
X                         }
X                       break ;
X            default  : usage() ;
X          }
X      INC ;
X    }
X}
X
X
Xgetparam(s, argv, errmes)
Xchar *s, *argv[], *errmes ;
X{
X  if (*argv != NULL && argv[0][0] != '-') STRCPY(s, *argv) ;
X  else
X    { 
X      FPRINTF(stderr,"%s: %s as next argument.\n", progname, errmes) ;
X      exit(1) ;                        
X    }                                  
X}
X
X
Xget_helpfile(helpname)     /* Open helpfile if present. */
Xchar *helpname ;
X{
X  char *getenv(), name[MAXLINE], *paths, *ptr ;
X  int i ;
X
X  i = 0 ;
X  ishelp = 1 ;
X  if ((hfd = fopen(helpname,"r")) == NULL)
X    {
X      paths = getenv("PATH") ;
X      if ((ptr = paths) && helpname[0] != '/')
X        for (;;)
X          if (*ptr == ':' || *ptr == 0)
X            {
X              if (*ptr == 0) break ;
X              name[i++] = '/' ;
X              name[i] = 0 ;
X              STRCAT(name, helpname) ;
X              if ((hfd = fopen(name, "r")) != NULL) return ;
X              *ptr++ ;
X              i = 0 ;
X            }
X          else name[i++] = *ptr++ ;
X      FPRINTF(stderr, "%s: Help file: %s not found\r\n", progname, helpname) ;
X      ishelp = 0 ;
X    }
X}
X
X
Xget_rcfile(name)          /* Read .calctoolrc file. */
Xchar *name ;
X{
X  char line[MAXLINE] ;    /* Current line from the .calctoolrc file. */
X  char tmp[MAXLINE] ;     /* Used to extract function definitions. */
X  double const ;          /* Current constant value being conveted. */
X  int i ;                 /* Index to constant or function array. */
X  int isval ;             /* Set to 'c' or 'f' for convertable line. */
X  int n ;
X  FILE *rcfd ;            /* File descriptor for calctool rc file. */
X
X  if ((rcfd = fopen(name, "r")) == NULL) return ;
X
X/*  Process the .calctoolrc file. There are currently four types of
X *  records to look for:
X *
X *  1) Those starting with a hash in the first column are comments.
X *
X *  2) Lines starting with 'c' or 'C' in the first column are
X *     definitions for constants. The cC is followed by a digit in
X *     the range 0-9, then a space. This is followed by a number
X *     in fixed or scientific notation. Following this is an optional
X *     comment, which if found, will be used in the popup menu for
X *     the constants. If the comment is present, there must be at
X *     least one space between this and the preceding number.
X *
X *  3) Those starting with a 'f' or a 'F' in the first column are
X *     definitions for functions. The fF is followed by a digit in
X *     the range 0-9, then a space. This is followed by a function
X *     definition. Following this is an optional comment, which if
X *     found, will be used in the popup menu for the functions.
X *     If the comment is present, there must be at least one space
X *     between this and the preceding function definition.
X *
X *  4) Lines starting with a 'r' or a 'R' in the first column are
X *     definitions for the initial contents of the calculators
X *     memory registers. The rR is followed by a digit in the
X *     range 0-9, then a space. This is followed by a number in
X *     fixed or scientific notation. The rest of the line is ignored.
X *
X *  All other lines are ignored.
X *
X *  Two other things to note. There should be no embedded spaces in
X *  the function definitions, and whenever a backslash is found, that
X *  and the following character signify a control character, for
X *  example \g would be ascii 7.
X */
X
X  while (fgets(line, MAXLINE, rcfd) != NULL)
X    {
X      isval = 0 ;
X           if (line[0] == 'c' || line[0] == 'C') isval = 'c' ;
X      else if (line[0] == 'f' || line[0] == 'F') isval = 'f' ;
X      else if (line[0] == 'r' || line[0] == 'R') isval = 'r' ;
X      if (isval)
X        if (line[1] >= '0' && line[1] <= '9' && line[2] == ' ')
X          {
X            i = char_val(line[1]) ;
X            if (isval == 'c')
X              {
X                n = sscanf(&line[3], "%lf", &const) ;
X                if (n == 1) con_vals[i] = const ;
X              }
X            else if (isval == 'f')
X              {
X                SSCANF(&line[3], "%s", tmp) ;      
X                STRCPY(fun_vals[i], convert(tmp)) ;
X              }
X            else if (isval == 'r')
X              {
X                n = sscanf(&line[3], "%lf", &const) ;
X                if (n == 1) mem_vals[i] = const ;
X                continue ;
X              }
X            for (n = 3; n < strlen(line); n++)
X              if (line[n] == ' ')
X                {
X                  while (line[n] == ' ') n++ ;
X                  line[strlen(line)-1] = '\0' ;
X                  if (isval == 'c')
X                    SPRINTF(con_names[i], "%1d: %g [%s]",
X                            i, con_vals[i], &line[n]) ;
X                  else
X                    SPRINTF(fun_names[i], "%1d: %s [%s]",
X                            i, fun_vals[i], &line[n]) ;
X                  break ;
X                }
X          }
X    }
X  FCLOSE(rcfd) ;
X}
X
X
Xread_rcfiles()   /* Read .calctoolrc's from home and current directories. */
X{
X  char *home ;            /* Pathname for users home directory. */
X  char name[MAXLINE] ;    /* Full name of users .calctoolrc file. */
X  int n ;
X  struct passwd *entry ;
X
X  for (n = 0; n < MAXREGS; n++)
X    {
X      SPRINTF(name, "%1d: %g [%s]", n, con_vals[n], con_names[n]) ;
X      STRCPY(con_names[n], name) ;
X      STRCPY(fun_vals[n], "") ;       /* Initially empty function strings. */
X    }
X
X  if ((home = getenv("HOME")) == NULL)
X    {
X      if ((entry = getpwuid(getuid())) == NULL) return ;
X      home = entry->pw_dir ;
X    }
X  SPRINTF(name, "%s/%s", home, RCNAME) ;
X  get_rcfile(name) ;      /* Read .calctoolrc from users home directory. */
X
X  SPRINTF(name, "%s/%s", getcwd((char *) NULL, MAXLINE), RCNAME) ;
X  get_rcfile(name) ;      /* Read .calctoolrc file from current directory. */
X}
X
X
Xusage()
X{
X  FPRINTF(stderr, "Usage: %s: [-d display] [-g geometry] ", progname) ;
X  FPRINTF(stderr, "[-h helpfile] [-i] [-v] [-Wi] [-Wp x y] [-WP x y]\n") ;
X  exit(0) ;
X}
SHAR_EOF
chmod 0444 get.c || echo "restore of get.c fails"
set `wc -c get.c`;Sum=$1
if test "$Sum" != "11877"
then echo original size 11877, current size $Sum;fi
echo "x - extracting calctool.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > calctool.c &&
X
X/*  @(#)calctool.c 1.12 89/12/07
X *
X *  A simple calculator program.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Basic algorithms, copyright (c) Ed Falk.
X *                Sun Microsystems, Mountain View.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "patchlevel.h"
X#include "color.h"
X#include "calctool.h"
X
Xdouble powers[11][4] = {
X         {    1.0,          1.0,           1.0,             1.0 },
X         {    2.0,          8.0,          10.0,            16.0 },
X         {    4.0,         64.0,         100.0,           256.0 },
X         {    8.0,        512.0,        1000.0,          4096.0 },
X         {   16.0,       4096.0,       10000.0,         65536.0 },
X         {   32.0,      32768.0,      100000.0,       1048576.0 },
X         {   64.0,     262144.0,     1000000.0,      16777216.0 },
X         {  128.0,    2097152.0,    10000000.0,     268435456.0 },
X         {  256.0,   16777216.0,   100000000.0,    4294967296.0 },
X         {  512.0,  134217728.0,  1000000000.0,   68719476736.0 },
X         { 1024.0, 1073741824.0, 10000000000.0, 1099511627776.0 }
X} ;
X
Xdouble exp_p1[10][4] = {
X        { 1.0,          1.0,             1.0,    1.0             },
X        { 1.0,          1.0,             1.0,    1.0             },
X        { 0.5,          0.125,           0.1,    0.0625          },
X        { 0.25,         0.015625,        0.01,   3.90625e-03     },
X        { 0.125,        1.953125e-03,    0.001,  2.44140625e-04  },
X        { 0.0625,       2.44140625e-04,  1.0e-4, 1.525878906e-05 },
X        { 0.03125,      3.051757813e-05, 1.0e-5, 9.536743164e-07 },
X        { 0.015625,     3.814697266e-06, 1.0e-6, 5.960464478e-08 },
X        { 0.0078125,    4.768371582e-07, 1.0e-7, 3.725290298e-09 },
X        { 3.90625e-03,  5.960464478e-08, 1.0e-8, 2.328306437e-10 }
X} ;
X
Xdouble max_fix[4] = {
X          6.871947674e+10, 3.245185537e+32,
X          1.000000000e+36, 2.230074520e+43
X} ;
X
X/* Selectable constants - these are the default selections. */
X
Xdouble con_vals[MAXREGS] = {
X         0.621,                   /* kilometres per hour <=> miles per hour. */
X         1.41421356237309504880,  /* square root of 2. */
X         2.7182818284590452354,   /* e */
X         3.14159265358979323846,  /* pi */
X         2.54,                    /* centimetres <=> inch. */
X         57.29577951308232,       /* degrees in a radian. */
X         1048576.0,               /* 2 ^ 20. */
X         0.0353,                  /* grams <=> ounce. */
X         0.948,                   /* kilojoules <=> British thermal units. */
X         0.0610,                  /* cubic cms <=> cubic inches. */
X} ;
X
Xchar con_names[MAXREGS][MAXLINE] = {
X       "kilometres per hour <=> miles per hour.",
X       "square root of 2.",
X       "e.",
X       "pi.",
X       "centimetres <=> inch.",
X       "degrees in a radian.",
X       "2 ^ 20.",
X       "grams <=> ounce.",
X       "kilojoules <=> British thermal units.",
X       "cubic cms <=> cubic inches.",
X} ;
X
Xchar num_names[MAXREGS][2] = {    /* Used by the popup menus. */
X       "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
X} ;
X
Xchar base_str[4][4]  = { "BIN", "OCT", "DEC", "HEX" } ;
Xchar dtype_str[2][4] = { "FIX", "SCI" } ;
Xchar ttype_str[3][5] = { "DEG", "GRAD", "RAD" } ;
X
Xchar digits[] = "0123456789abcdef" ;
Xint basevals[4] = {2, 8, 10, 16} ;
X
X/* Length of display in characters for each base. */
Xint disp_length[4] = {32, 15, 12, 12} ;
X
X/* X offset in pixels for various length button strings. */
Xint chxoff[5] = { 5, 9, 14, 16, 5 } ;
X
X/* Valid keys when an error condition has occured. */
X/*                            MEM  KEYS HELP   clr   QUIT OFF  REDRAW */
Xchar validkeys[MAXVKEYS]  = { 'M', 'K', '?', '\177', 'q', 'o', '\f' } ;
X
X/* Valid keys for which the right mouse button will get a popup menu. */
Xchar validmenu[MAXMENUS]  = {
X/*   ACC  CON    EXCH        FUN        <    >   RCL  STO  */
X     'A', '#', CCTRL('e'), CCTRL('f'), '<', '>', 'r', 's'
X} ;
X
Xdouble disp_val ;             /* Value of the current display. */
Xdouble last_input ;           /* Previous number input by user. */
Xdouble mem_vals[MAXREGS] ;    /* Memory register values. */
Xdouble result ;               /* Current calculator total value. */
Xdouble tresults[3] ;          /* Current trigonometric results. */
X
Xenum base_type base ;         /* Current base: BIN, OCT, DEC or HEX. */
Xenum gr_type gtype ;          /* What graphics system is being used. */
Xenum num_type dtype ;         /* Number display mode. */
Xenum trig_type ttype ;        /* Trigonometric type (deg, grad or rad). */
X
XFILE *hfd ;         /* File descriptor for help information. */
X
Xint accuracy ;      /* Number of digits precision (Max 9). */
Xint color ;         /* Color being used for current raster operation. */
Xint column ;        /* Column number of current key/mouse press. */
Xint cur_ch ;        /* Current character if keyboard event. */
Xint curx ;          /* Current mouse X position. */
Xint cury ;          /* Current mouse Y position. */
Xint down ;          /* Indicates is a mouse button is down. */
Xint error ;         /* Indicates some kind of display error. */
Xint hyperbolic ;    /* If set, trig functions will be hyperbolic. */
Xint iconic ;        /* Set if window is currently iconic. */
Xint inv_video ;     /* Set if user wants inverse video mode. */
Xint inverse ;       /* If set, trig and log functions will be inversed. */
Xint iscolor ;       /* Set if this is a color screen. */
Xint ishelp ;        /* Set if there is a help file. */
Xint issel ;         /* Set if valid [Get] selection. */
Xint ix ;            /* Initial X position of the icon. */
Xint iy ;            /* Initial Y position of the icon. */
Xint key_exp ;       /* Set if entering exponent number. */
Xint new_input ;     /* New number input since last op. */
Xint nextc ;         /* Current event identifier. */
Xint nfont_width ;   /* Width of the normal font characters. */
Xint pending ;       /* Indicates command depending on multiple presses. */
Xint pending_op ;    /* Arithmetic operation for pending command. */
Xint pointed ;       /* Whether a decimal point has been given. */
Xint portion ;       /* Portion of button on current key/mouse press. */
Xint posspec ;       /* Set if -Wp or -g option is present (for X11) */
Xint row ;           /* Row number of current key/mouse press. */
Xint rstate ;        /* Indicates if memory register frame is displayed. */
Xint spaces ;        /* Number of spaces in current button string. */
Xint toclear ;       /* Indicates if display should be cleared. */
Xint tstate ;        /* Indicates current button set being displayed. */
Xint wx ;            /* Initial X position of the window. */
Xint wy ;            /* Initial Y position of the window. */
Xint x ;             /* X offset for text for button. */
Xint y ;             /* Y offset for text for button. */
X
X/* Routines obeyed by mouse button or character presses. */
Xint close_frame(),    destroy_frame(),  do_base() ;
Xint do_calculation(), do_clear(),       do_constant(),  do_delete() ;
Xint do_expno(),       do_immediate(),   do_keys(),      do_number() ;
Xint do_pending(),     do_point(),       do_portion(),   do_repaint() ;
Xint do_set_mode(),    do_trig(),        do_trigtype(),  toggle_reg_canvas() ;
X
Xchar cur_op ;                     /* Current arithmetic operation. */
Xchar current ;                    /* Current button or character pressed. */
Xchar *exp_posn ;                  /* Position of the exponent sign. */
Xchar fnum[MAX_DIGITS+1] ;         /* Scratch area for fixed point numbers. */
Xchar fun_names[MAXREGS][MAXLINE] ;  /* Function defs from .calctoolrc. */
Xchar fun_vals[MAXREGS][MAXLINE] ;   /* Function names from .calctoolrc. */
Xchar geometry[MAXLINE] ;          /* X11 geometry information. */
Xchar old_cal_value ;              /* Previous calculation operator. */
Xchar pstr[5] ;                    /* Current button text string. */
Xchar *selection ;                 /* Current [Get] selection. */
Xchar *shelf ;                     /* PUT selection shelf contents. */
Xchar snum[MAX_DIGITS+1] ;         /* Scratch are for scientific numbers. */
Xchar x11_display[MAXLINE] ;       /* X11 display information. */
X
Xstruct iteminfo items[MAXITEMS] = {                    /* Panel items. */
X  { SFONT, BBORDER,                 DISPLAY-3,  "" },  /* BASEITEM. */
X  { NFONT, 0,                       DISPLAY-15, "" },  /* DISPLAYITEM. */
X  { SFONT, BBORDER+1*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* TTYPEITEM. */
X  { SFONT, BBORDER+2*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* NUMITEM. */
X  { SFONT, BBORDER+3*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* HYPITEM. */
X  { SFONT, BBORDER+4*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* INVITEM. */
X  { SFONT, BBORDER+5*(BWIDTH+BGAP), DISPLAY-3,  "" },  /* OPITEM. */
X} ;
X
X/* Calculator button values. */
X
Xstruct button buttons[TITEMS] = {
X  { "EXCH", CCTRL('e'), OP_SET,   MAUVE,    do_pending },       /* Row 1. */
X  { "CON ", '#',        OP_SET,   BLUE,     do_pending },
X  { "BIN ", 'B',        OP_CLEAR, YELLOW,   do_base },
X  { "MEM ", 'M',        OP_CLEAR, BLUE,     toggle_reg_canvas },
X  { "OCT ", 'O',        OP_CLEAR, YELLOW,   do_base },
X  { "D   ", 'd',        OP_NOP,   PINK,     do_number },
X  { "DEC ", 'D',        OP_CLEAR, YELLOW,   do_base },
X  { "E   ", 'e',        OP_NOP,   PINK,     do_number }, 
X  { "HEX ", 'H',        OP_CLEAR, YELLOW,   do_base },
X  { "F   ", 'f',        OP_NOP,   PINK,     do_number },  
X  { "SCI ", CCTRL('n'), OP_CLEAR, BLUE,     do_set_mode },
X  { "FUN ", CCTRL('f'), OP_SET,   BLUE,     do_pending },
X
X  { "&32 ", '[',        OP_CLEAR, LGREY,    do_immediate },      /* Row 2. */
X  { "STO ", 's',        OP_SET,   MAUVE,    do_pending },
X  { "&16 ", ']',        OP_CLEAR, LGREY,    do_immediate },
X  { "RCL ", 'r',        OP_SET,   MAUVE,    do_pending }, 
X  { "<   ", '<',        OP_SET,   LGREY,    do_pending },
X  { "A   ", 'a',        OP_NOP,   PINK,     do_number }, 
X  { ">   ", '>',        OP_SET,   LGREY,    do_pending },
X  { "B   ", 'b',        OP_NOP,   PINK,     do_number },
X  { "%   ", '%',        OP_SET,   LPURPLE,  do_calculation },
X  { "C   ", 'c',        OP_NOP,   PINK,     do_number },
X  { "clr ", '\177',     OP_CLEAR, BLUE,     do_clear },
X  { "bsp ", CCTRL('h'), OP_NOP,   BLUE,     do_delete },
X
X  { "OR  ", '|',        OP_SET,   GREEN,    do_calculation },   /* Row 3. */
X  { "AND ", '&',        OP_SET,   GREEN,    do_calculation },
X  { "HYP ", 'h',        OP_CLEAR, BLUE,     do_set_mode },
X  { "SIN ", CCTRL('s'), OP_CLEAR, LGREEN,   do_trig },
X  { "e^x ", '{',        OP_CLEAR, ORANGE,   do_immediate },
X  { "7   ", '7',        OP_NOP,   LBLUE,    do_number },
X  { "10^x", '}',        OP_CLEAR, ORANGE,   do_immediate },
X  { "8   ", '8',        OP_NOP,   LBLUE,    do_number },
X  { "y^x ", 'Y',        OP_SET,   ORANGE,   do_calculation },
X  { "9   ", '9',        OP_NOP,   LBLUE,    do_number }, 
X  { "INT ", 'I',        OP_CLEAR, LGREY,    do_portion },
X  { "X   ", 'x',        OP_SET,   LPURPLE,  do_calculation },
X
X  { "XNOR", 'n',        OP_SET,   GREEN,    do_calculation },   /* Row 4. */
X  { "XOR ", '^',        OP_SET,   GREEN,    do_calculation },
X  { "INV ", 'i',        OP_CLEAR, BLUE,     do_set_mode },
X  { "COS ", CCTRL('c'), OP_CLEAR, LGREEN,   do_trig },
X  { "ln  ", 'N',        OP_CLEAR, ORANGE,   do_immediate },
X  { "4   ", '4',        OP_NOP,   LBLUE,    do_number },
X  { "log ", 'G',        OP_CLEAR, ORANGE,   do_immediate },
X  { "5   ", '5',        OP_NOP,   LBLUE,    do_number },
X  { "SQRT", 'S',        OP_CLEAR, ORANGE,   do_immediate },
X  { "6   ", '6',        OP_NOP,   LBLUE,    do_number },
X  { "FRAC", 'F',        OP_CLEAR, LGREY,    do_portion },
X  { "/   ", '/',        OP_SET,   LPURPLE,  do_calculation },
X
X  { "NOT ", '~',        OP_CLEAR, GREEN,    do_immediate },     /* Row 5. */
X  { "ACC ", 'A',        OP_SET,   BLUE,     do_pending },
X  { "EXP ", 'E',        OP_SET,   BLUE,     do_expno },
X  { "TAN ", CCTRL('t'), OP_CLEAR, LGREEN,   do_trig },
X  { "1/x ", 'R',        OP_CLEAR, ORANGE,   do_immediate },
X  { "1   ", '1',        OP_NOP,   LBLUE,    do_number },
X  { "x!  ", '!',        OP_CLEAR, ORANGE,   do_immediate },
X  { "2   ", '2',        OP_NOP,   LBLUE,    do_number },
X  { "x^2 ", '@',        OP_CLEAR, ORANGE,   do_immediate },
X  { "3   ", '3',        OP_NOP,   LBLUE,    do_number },
X  { "CHS ", 'C',        OP_CLEAR, LGREY,    do_immediate },
X  { "-   ", '-',        OP_SET,   LPURPLE,  do_calculation },
X
X  { "QUIT", 'q',        OP_CLEAR, BLUE,     destroy_frame },    /* Row 6. */
X  { "OFF ", 'o',        OP_CLEAR, BLUE,     close_frame },
X  { "KEYS", 'K',        OP_CLEAR, BLUE,     do_keys },
X  { "?   ", '?',        OP_SET,   BLUE,     do_pending },
X  { "DEG ", CCTRL('d'), OP_CLEAR, RED,      do_trigtype },
X  { "0   ", '0',        OP_NOP,   LBLUE,    do_number },
X  { "RAD ", CCTRL('r'), OP_CLEAR, RED,      do_trigtype },
X  { ".   ", '.',        OP_NOP,   LPURPLE,  do_point },
X  { "GRAD", CCTRL('g'), OP_CLEAR, RED,      do_trigtype },
X  { "=   ", '=',        OP_CLEAR, LPURPLE,  do_calculation },
X  { "ABS ", 'U',        OP_CLEAR, LGREY,    do_portion },
X  { "+   ", '+',        OP_SET,   LPURPLE,  do_calculation },
X
X/* Extra definitions. */
X
X  { "X   ", 'X',        OP_SET,   WHITE,    do_calculation },
X  { "X   ", '*',        OP_SET,   WHITE,    do_calculation },
X  { "    ", CCTRL('m'), OP_CLEAR, WHITE,    do_calculation },
X  { "QUIT", 'Q',        OP_CLEAR, WHITE,    destroy_frame },
X  { "    ", '\f',       OP_NOP,   WHITE,    do_repaint },
X} ;
X
X/*  256-byte table for quickly reversing the bits in an unsigned 8-bit char,
X *  used to convert between MSBFirst and LSBFirst image formats.
X */
X
Xchar revtable[256] = {
X        0, -128,   64,  -64,   32,  -96,   96,  -32,
X       16, -112,   80,  -48,   48,  -80,  112,  -16,
X        8, -120,   72,  -56,   40,  -88,  104,  -24,
X       24, -104,   88,  -40,   56,  -72,  120,   -8,
X        4, -124,   68,  -60,   36,  -92,  100,  -28,
X       20, -108,   84,  -44,   52,  -76,  116,  -12,
X       12, -116,   76,  -52,   44,  -84,  108,  -20,
X       28, -100,   92,  -36,   60,  -68,  124,   -4,
X        2, -126,   66,  -62,   34,  -94,   98,  -30,
X       18, -110,   82,  -46,   50,  -78,  114,  -14,
X       10, -118,   74,  -54,   42,  -86,  106,  -22,
X       26, -102,   90,  -38,   58,  -70,  122,   -6,
X        6, -122,   70,  -58,   38,  -90,  102,  -26,
X       22, -106,   86,  -42,   54,  -74,  118,  -10,
X       14, -114,   78,  -50,   46,  -82,  110,  -18,
X       30,  -98,   94,  -34,   62,  -66,  126,   -2,
X        1, -127,   65,  -63,   33,  -95,   97,  -31,
X       17, -111,   81,  -47,   49,  -79,  113,  -15,
X        9, -119,   73,  -55,   41,  -87,  105,  -23,
X       25, -103,   89,  -39,   57,  -71,  121,   -7,
X        5, -123,   69,  -59,   37,  -91,  101,  -27,
X       21, -107,   85,  -43,   53,  -75,  117,  -11,
X       13, -115,   77,  -51,   45,  -83,  109,  -19,
X       29,  -99,   93,  -35,   61,  -67,  125,   -3,
X        3, -125,   67,  -61,   35,  -93,   99,  -29,
X       19, -109,   83,  -45,   51,  -77,  115,  -13,
X       11, -117,   75,  -53,   43,  -85,  107,  -21,
X       27, -101,   91,  -37,   59,  -69,  123,   -5,
X        7, -121,   71,  -57,   39,  -89,  103,  -25,
X       23, -105,   87,  -41,   55,  -73,  119,   -9,
X       15, -113,   79,  -49,   47,  -81,  111,  -17,
X       31,  -97,   95,  -33,   63,  -65,  127,   -1,
X} ;
X
Xchar display[MAXLINE] ;     /* Current calculator display. */
Xchar helpname[MAXLINE] ;    /* Filename for help file. */
Xchar progname[MAXLINE] ;    /* Name of this program. */
X
X
Xmain(argc,argv)
Xint argc ;
Xchar *argv[] ;
X{
X  STRCPY(progname, argv[0]) ; /* Save this programs name. */
X  get_options(argc, argv) ;   /* Get command line arguments. */
X  get_helpfile(helpname) ;    /* Open helpfile if present. */
X  read_rcfiles() ;            /* Read .calctoolrc's files. */
X  if (init_ws_type())         /* Determine window system type. */
X    {
X      FPRINTF(stderr,"Error initialising window system.\n") ;
X      exit(1) ;
X    }
X  init_fonts() ;              /* Open required fonts. */
X  make_icon() ;               /* Set up the calctool window icon. */
X  make_frames(argc, argv) ;   /* Create calctool window frames. */
X  make_subframes() ;          /* Create panels and canvases. */
X  make_menus() ;              /* Create menus for graphics versions. */
X  if (gtype != X11) load_colors() ;  /* Load the initial calctool colormap. */
X
X  shelf = NULL ;              /* No selection for shelf initially. */
X  pending = 0 ;               /* No initial pending command. */
X  rstate = 0 ;                /* No memory register frame display initially. */
X  tstate = 0 ;                /* Button values displayed first. */
X  hyperbolic = 0 ;            /* Normal trig functions initially. */
X  inverse = 0 ;               /* No inverse functions initially. */
X  base = DEC ;                /* Initial base. */
X  ttype = DEG ;               /* Initial trigonometric type. */
X  dtype = FIX ;               /* Initial number display mode. */
X  down = 0 ;                  /* No mouse presses initially. */
X
X  make_items() ;              /* Create panel items and cursors. */
X  do_clear() ;                /* Initialise and clear display. */
X  set_cursor(MAINCURSOR) ;    /* Initially display the arrow cursor. */
X  start_tool() ;              /* Display the calculator. */
X  exit(0) ;
X}
X
X
Xmatherr(x)      /* Calctools' math library error-handling routine. */
Xstruct exception *x ;
X{
X  SPRINTF(display, "Error in %s", x->name) ;
X  set_item(DISPLAYITEM, display) ;
X  error = 1 ;
X  set_item(OPITEM, "CLR") ;
X  return(1) ;
X}
SHAR_EOF
chmod 0444 calctool.c || echo "restore of calctool.c fails"
set `wc -c calctool.c`;Sum=$1
if test "$Sum" != "17879"
then echo original size 17879, current size $Sum;fi
echo "x - extracting mgr.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > mgr.c &&
X
X/*  @(#)mgr.c 1.11 89/12/21
X *
X *  These are the MGR dependent graphics routines used by calctool.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "dump.h"
X#include "term.h"
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X
X#define  S_FONT      1     /* Font descriptors. */
X#define  N_FONT      2
X#define  B_FONT      3
X
X#define  ICONIC      0     /* States that the calctool display can be in. */
X#define  JUST_KEYS   1
X#define  SHOW_ALL    2
X
X#define  PR_ICON     1     /* Descriptor for closed icon image. */
X
X#define  SMALLFONT   "sail6x8r"
X#define  NORMALFONT  "cour7x14b"
X#define  BIGFONT     "gal12x20r"
X
X#define  MENU_COUNT  (sizeof(menus) / (sizeof(struct menu_entry) * MAXMENUS))
X
Xstruct menu_entry menus[MAXMENUS][MAXREGS] ;
X
Xchar fontname[MAXLINE] ;      /* Full pathname of the small font. */
X
Xint local_mode ;         /* Used by load_icon for correct line mode. */
Xint mgr_infd ;           /* MGR input connection file descriptor. */
Xint mgr_outfd ;          /* MGR output connection file descriptor. */
X
Xshort icon_image[] = {
X#include "calctool.icon"
X} ;
X
X#ifdef NO_4_3SELECT
Xint fullmask ;               /* Full mask of file descriptors to check on. */ 
Xint readmask ;               /* Readmask used in select call. */ 
X#else 
Xfd_set fullmask ;            /* Full mask of file descriptors to check on. */
Xfd_set readmask ;            /* Readmask used in select call. */
X#endif /*NO_4_3SELECT */
X 
X
XSIGRET
Xclean(code)
Xint code ;
X{
X  m_bitdestroy(1) ;
X  m_pop() ;
X  m_ttyreset() ;
X  m_clear() ;
X  exit(code) ;
X}
X
X
X/*ARGSUSED*/
Xclear_canvas(canvas, color)
Xenum can_type canvas ;
Xint color ;
X{
X  m_func(B_CLEAR) ;
X  if (canvas == KEYCANVAS)
X    m_bitwrite(0, 0, TWIDTH+10, THEIGHT+DISPLAY+10) ;
X  else if (canvas == REGCANVAS)
X    m_bitwrite(TWIDTH+15, 0, TWIDTH+10, THEIGHT+DISPLAY+10) ;
X}
X
X
Xclose_frame()
X{
X  reshape(ICONIC) ;
X  m_clearmode(M_ACTIVATE) ;
X}
X
X
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  if (color == BLACK)
X    {
X      m_func(B_COPY) ;
X      m_bitwrite(x, y, width, height) ;
X    }
X}
X
X
Xcreate_menu(mtype)     /* Create popup menu for right button press. */
Xenum menu_type mtype ;
X{
X  int i ;
X  char istr[3] ;       /* String representation for action value. */
X
X  for (i = 0; i < MAXREGS; i++)
X    {
X      SPRINTF(istr, "%1d\r", i) ;
X      switch (mtype)
X        {
X          case M_ACC    :                              /* Accuracies. */
X          case M_EXCH   :                              /* Register exchange. */
X          case M_LSHIFT :                              /* Left shift. */
X          case M_RCL    :                              /* Register recall. */
X          case M_RSHIFT :                              /* Right shift. */
X          case M_STO    :                              /* Register store. */
X                          menus[(int) mtype][i].value = num_names[i] ;
X                          break ;
X          case M_CON    :                              /* Constants. */
X                          menus[(int) mtype][i].value = con_names[i] ;
X                          break ;
X          case M_FUN    :                              /* Functions. */
X                          menus[(int) mtype][i].value = fun_names[i] ;
X        }
X      menus[(int) mtype][i].action = num_names[i] ;
X    }
X  menu_load((int) mtype, MENU_COUNT, menus[(int) mtype]) ;
X}
X
X
Xdestroy_frame()
X{
X  clean(0) ;
X}
X
X
Xdo_menu(mtype)      /* Popup appropriate menu and get value. */
Xenum menu_type mtype ;
X{
X  m_selectmenu2((int) mtype) ;
X}
X
X
Xdrawline(x1, y1, x2, y2)
Xint x1, y1, x2, y2 ;
X{
X  m_func(B_COPY) ;
X  m_line(x1, y1, x2, y2) ;
X}
X
X
Xdraw_regs()
X{
X  reshape(SHOW_ALL) ;
X  clear_canvas(REGCANVAS, WHITE) ;
X  drawline(TWIDTH, 0, TWIDTH, THEIGHT+DISPLAY+10) ;
X  make_registers() ;
X}
X
X
X/*ARGSUSED*/
Xdrawtext(x, y, window, fontno, color, str)
Xenum font_type fontno ;
Xenum can_type window ;
Xint x, y, color ;
Xchar *str ;
X{
X  int i ;
X
X       if (fontno == SFONT) m_font(S_FONT) ;
X  else if (fontno == NFONT) m_font(N_FONT) ;
X  else if (fontno == BFONT) m_font(B_FONT) ;
X       if (window == REGCANVAS) x += TWIDTH + 15 ;
X  m_func(B_XOR) ;
X  i = strlen(str)-1 ;
X  while (str[i] == ' ' && i) str[i--] = '\0' ;
X  m_stringto(0, x, y+4, str) ;
X  m_movecursor(2500, 2500) ;
X}
X
X
Xget_display()
X{
X}
X
X
Xget_next_event()
X{
X  int c ;
X  static struct timeval tval = { 0, 0 } ;
X
X  m_flush() ;
X  for (;;)
X    {
X      readmask = fullmask ;
X#ifdef NO_4_3SELECT
X      SELECT(32, &readmask, 0, 0, &tval) ;
X      if (readmask && (1 << mgr_infd))
X#else
X      SELECT(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0, &tval) ;
X      if (FD_ISSET(mgr_infd, &readmask))
X#endif /*NO_4_3SELECT*/
X        {
X          if ((c = m_getchar()) == EOF)
X            {
X              clearerr(m_termin) ;
X              continue ;
X            }
X          get_mouse(&curx, &cury) ;
X          switch (c)
X            {
X              case '\030' : return(MIDDLE_DOWN) ;
X              case '\031' : return(MIDDLE_UP) ;
X              case '\032' : return(LEFT_DOWN) ;
X              case '\033' : return(LEFT_UP) ;
X              case '\034' : return(DIED) ;           /* Window destroyed. */
X              case '\035' : if (iconic) iconic = 0 ;
X              case '\036' : if (rstate) reshape(SHOW_ALL) ;
X                            else reshape(JUST_KEYS) ;
X              case '\037' : return(CFRAME_REPAINT) ; /* Window redrawn. */
X              default     : cur_ch = c ;
X                            return(KEYBOARD) ;
X            }
X        }
X    }    
X}
X
X
Xhandle_selection()
X{
X}
X
X
Xinit_fonts()
X{
X  char path[MAXLINE] ;     /* Directory path for font files. */
X
X#ifdef MGRHOME
X  STRCPY(path, MGRHOME) ;
X#else
X  STRCPY(path, "/usr/mgr") ;
X#endif /*MGRHOME*/
X
X  SPRINTF(fontname, "%s/font/%s", path, SMALLFONT) ;
X  m_loadfont(SFONT, fontname) ;
X
X  SPRINTF(fontname, "%s/font/%s", path, NORMALFONT) ; 
X  m_loadfont(NFONT, fontname) ;
X  nfont_width = 9 ;
X
X  SPRINTF(fontname, "%s/font/%s", path, BIGFONT) ; 
X  m_loadfont(BFONT, fontname) ;
X
X}
X
X
Xinit_ws_type()
X{
X  m_setup(M_FLUSH) ;     /* Setup I/O; turn on flushing. */
X  m_push(P_BITMAP | P_MENU | P_EVENT | P_FONT | P_FLAGS | P_POSITION) ;
X  mgr_infd = fileno(m_termin) ;
X  mgr_outfd = fileno(m_termout) ;
X
X  SIGNAL(SIGHUP, clean) ;
X  SIGNAL(SIGINT, clean) ;
X  SIGNAL(SIGTERM, clean) ;
X  m_ttyset() ;
X  m_setraw() ;
X  m_setmode(M_NOWRAP) ;
X  m_setmode(M_ABS) ;
X  m_setmode(ACTIVATE) ;
X  m_clearmode(M_NOINPUT) ;
X  m_func(B_COPY) ;
X
X  gtype = MGR ;
X  return 0 ;
X}
X
X
Xload_colors()      /* Hardwired to a monochrome version. */
X{
X  iscolor = 0 ;
X}
X
X
Xload_icon(pixrect, ibuf)
Xint pixrect ;
Xshort ibuf[256] ;
X{
X  int size ;
X
X  IOCTL(mgr_outfd, TIOCLGET, &local_mode) ;
X  local_mode |= LLITOUT ;
X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
X
X  size = ICONHEIGHT * (((64 + 15) &~ 15) >> 3) ;
X  m_bitldto(ICONWIDTH, ICONHEIGHT, 0, 0, pixrect, size) ;
X  m_flush() ;
X  WRITE(mgr_outfd, (char *) ibuf, size) ;
X
X  local_mode &= ~LLITOUT ;
X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
X}
X
X
X/*ARGSUSED*/
Xmake_frames(argc, argv)
Xint argc ;
Xchar *argv[] ;
X{
X#ifdef NO_4_3SELECT
X  fullmask = 1 << mgr_infd ;
X#else
X  FD_ZERO(&fullmask) ;
X  FD_SET(mgr_infd, &fullmask) ;
X#endif /*NO_4_3SELECT*/
X
X  m_setevent(BUTTON_1, "\030") ;    /* Right mouse button depressed. */
X  m_setevent(BUTTON_1U, "\031") ;   /* Right mouse button released. */
X
X  m_setevent(BUTTON_2, "\032") ;    /* Middle mouse button depressed. */
X  m_setevent(BUTTON_2U, "\033") ;   /* Middle mouse button released. */
X
X  m_setevent(ACTIVATE, "\034") ;    /* Window has been activated. */
X  m_setevent(DESTROY, "\035") ;     /* Check for window being destroyed. */
X  m_setevent(RESHAPE, "\036") ;     /* Check for window being reshaped. */
X  m_setevent(REDRAW, "\037") ;      /* Check for window being redrawn. */
X}
X
X
Xmake_icon()
X{
X  load_icon(PR_ICON, icon_image) ;
X}
X
X
Xmake_items()
X{
X  do_repaint() ;               /* Redraw the calctool canvas[es]. */
X  m_movecursor(2500, 2500) ;   /* Move character cursor offscreen. */
X}
X
X
Xmake_subframes()
X{
X  m_font(N_FONT) ;          /* Use the default font. */
X  reshape(JUST_KEYS) ;
X  m_clear() ;               /* Clear calctool window. */
X}
X
X
Xreshape(type)
Xint type ;
X{
X  int x, y, w, h ;      /* Position and size of calctool window. */
X
X  get_size(&x, &y, &w, &h) ;
X  switch (type)
X    {
X      case ICONIC    : m_shapewindow(x, y, ICONWIDTH+10, ICONHEIGHT+10) ;
X                       m_clear() ;
X                       m_bitcopyto(0, 0, ICONWIDTH, ICONHEIGHT,
X                                   0, 0, 0, PR_ICON) ;
X                       break ;
X      case JUST_KEYS : m_shapewindow(x, y, TWIDTH+10, THEIGHT+DISPLAY+10) ;
X                       break ;
X      case SHOW_ALL  : m_shapewindow(x, y, 2*TWIDTH+25, THEIGHT+DISPLAY+10) ;
X    }
X  m_movecursor(2500, 2500) ;
X}
X
X
X/*ARGSUSED*/
Xset_cursor(type)   /* Doesn't appear to be any way to set the cursor. */
Xint type ;
X{
X}
X
X
Xstart_tool()
X{
X  while (1)
X    process_event(get_next_event()) ;
X}
X
X
Xtoggle_reg_canvas()      /* Show or clear memory register area. */
X{
X  rstate = !rstate ;
X  if (rstate) draw_regs() ;
X  else reshape (JUST_KEYS) ;
X}
SHAR_EOF
chmod 0444 mgr.c || echo "restore of mgr.c fails"
set `wc -c mgr.c`;Sum=$1
if test "$Sum" != "9469"
then echo original size 9469, current size $Sum;fi
echo "x - extracting news.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > news.c &&
X
X/*  @(#)news.c 1.9 89/12/21
X *
X *  These are the NeWS dependent graphics routines used by calctool.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X#include <sys/types.h>
X
Xextern FILE *PostScript ;
Xextern FILE *PostScriptInput ;
X
X
Xclear_canvas(canvas, color)
Xenum can_type canvas ;
Xint color ;
X{
X  char cantype ;
X
X       if (canvas == KEYCANVAS) cantype = 'K' ;
X  else if (canvas == REGCANVAS) cantype = 'R' ;
X  FPRINTF(PostScript,"%d %cC PSClearCanvas\n", color, cantype) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xclose_frame()
X{
X  FPRINTF(PostScript, "PSCloseFrame\n") ;
X  FFLUSH(PostScript) ;
X}
X
X
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  FPRINTF(PostScript, "%d %d %d %d %d PSColorArea\n",
X          color, x, width, height, y) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xcreate_menu(mtype)     /* Create popup menu for right button press. */
Xenum menu_type mtype ;
X{
X  int i ;
X
X  FPRINTF(PostScript, "/Menu%1d [\n", (int) mtype) ;
SHAR_EOF
echo "End of part 3"
echo "File news.c is continued in part 4"
echo "4" > s2_seq_.tmp
exit 0