home *** CD-ROM | disk | FTP | other *** search
/ pc.louisiana.edu/pub/unix/ / Louisiana_UNIX.tar / Louisiana_UNIX / pch619-621.part2 < prev    next >
Internet Message Format  |  1992-06-01  |  45KB

  1. From nstar!sawmill!prslnk!buhrt@iuvax.cs.indiana.edu Fri May  8 16:02:43 1992
  2. Received: from usl.edu (rouge-gw.usl.edu) by armagnac.ucs.usl.edu with SMTP id AA15641
  3.   (5.65c/IDA-1.4.4 for <jpd@ucs>); Fri, 8 May 1992 16:02:34 -0500
  4. Received: from rex.cs.tulane.edu by usl.edu (4.1/BSS-3.4)
  5.     id AA20795; Fri, 8 May 92 16:02:17 CDT
  6. Received:  by rex.cs.tulane.edu; Fri, 8 May 92 16:01:55 -0500
  7. Received:  from iuvax.cs.indiana.edu by rex.cs.tulane.edu; Fri, 8 May 92 16:01:40 -0500
  8. Received: by iuvax.cs.indiana.edu 
  9. Received: by gator.rn.com (/\==/\ Smail3.1.25.1 #25.5)
  10.     id <m0ljbja-0000C7C@gator.rn.com>; Fri, 8 May 92 15:40 EST
  11. Received: by sawmill.uucp (/\==/\ Smail3.1.21.1 #21.8)
  12.     id <m0ljazS-000BGhC@sawmill.uucp>; Fri, 8 May 92 14:52 EST
  13. Received: by prslnk.uucp (/\==/\ Smail3.1.21.1 #21.3)
  14.     id <m0ljais-0001UXC@prslnk.uucp>; Fri, 8 May 92 14:35 EST
  15. Message-Id: <m0ljais-0001UXC@prslnk.uucp>
  16. Date: Fri, 8 May 92 14:35 EST
  17. From: prslnk!buhrt@iuvax.cs.indiana.edu (Jeff Buhrt)
  18. To: rutgers!retix!uunet!sawmill!nstar!decwrl!vixie@iuvax.cs.indiana.edu,
  19.         marc@dumbcat.sf.ca.us, jpd@usl.edu, sources-misc@uunet.uu.net
  20. Subject: sc - The SC Spreadsheet: patch5b (2of2)
  21. Status: RO
  22.  
  23.  
  24. Submitted-By: nstar!sawmill!prslnk!buhrt (Jeff Buhrt)
  25. Archive-name: sc/patch04b
  26. Patch-To: sc - The SC Spreadsheet, release 6.16: Volume 20, Issue 035-041
  27. Environment: Curses, good yacc/bison1.18 (anything but bison1.16), sed
  28. Windowing Support: Curses
  29.  
  30. *** ../619/interp.c    Mon Mar 16 10:09:40 1992
  31. --- interp.c    Fri May  8 12:31:27 1992
  32. ***************
  33. *** 7,13 ****
  34.    *
  35.    *              More mods Robert Bond, 12/86
  36.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  37. !  *        $Revision: 6.19 $
  38.    */
  39.   
  40.   #define DEBUGDTS 1        /* REMOVE ME */
  41. --- 7,13 ----
  42.    *
  43.    *              More mods Robert Bond, 12/86
  44.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  45. !  *        $Revision: 6.21 $
  46.    */
  47.   
  48.   #define DEBUGDTS 1        /* REMOVE ME */
  49. ***************
  50. *** 53,66 ****
  51.   #endif
  52.   
  53.   #ifdef SIGVOID
  54. !     void quit();
  55.   #else
  56. !     int quit();
  57.   #endif
  58.   
  59. - /* Suffixes for engineering notation THA 9/19/88 */
  60. - extern char engmult[];
  61.   /* Use this structure to save the the last 'g' command */
  62.   struct go_save {
  63.       int g_type;
  64. --- 53,63 ----
  65.   #endif
  66.   
  67.   #ifdef SIGVOID
  68. !     void doquit();
  69.   #else
  70. !     int doquit();
  71.   #endif
  72.   
  73.   /* Use this structure to save the the last 'g' command */
  74.   struct go_save {
  75.       int g_type;
  76. ***************
  77. *** 113,119 ****
  78. --- 110,118 ----
  79.   double    rint();
  80.   int    cellerror = CELLOK;    /* is there an error in this cell */
  81.   
  82. + #ifndef PI
  83.   #define PI (double)3.14159265358979323846
  84. + #endif
  85.   #define dtr(x) ((x)*(PI/(double)180.0))
  86.   #define rtd(x) ((x)*(180.0/(double)PI))
  87.   
  88. ***************
  89. *** 189,195 ****
  90.       }
  91.   
  92.       if (p && p->label) {
  93. !     pr = xmalloc((unsigned)(strlen(p->label)+1));
  94.       (void) strcpy(pr, p->label);
  95.       if (p->cellerror)
  96.           cellerror = CELLINVALID;
  97. --- 188,194 ----
  98.       }
  99.   
  100.       if (p && p->label) {
  101. !     pr = scxmalloc((unsigned)(strlen(p->label)+1));
  102.       (void) strcpy(pr, p->label);
  103.       if (p->cellerror)
  104.           cellerror = CELLINVALID;
  105. ***************
  106. *** 293,299 ****
  107.       }
  108.       if ( p && p->flags&is_valid)
  109.           ret = p->v;
  110. !     xfree(s);
  111.       }
  112.       return ret;
  113.   }
  114. --- 292,298 ----
  115.       }
  116.       if ( p && p->flags&is_valid)
  117.           ret = p->v;
  118. !     scxfree(s);
  119.       }
  120.       return ret;
  121.   }
  122. ***************
  123. *** 598,604 ****
  124.       return((double)0);
  125.   
  126.       (void)strtof(s, &v);
  127. !     xfree(s);
  128.       return(v);
  129.   }
  130.   
  131. --- 597,603 ----
  132.       return((double)0);
  133.   
  134.       (void)strtof(s, &v);
  135. !     scxfree(s);
  136.       return(v);
  137.   }
  138.   
  139. ***************
  140. *** 619,628 ****
  141.       v = 0.0;
  142.   
  143.       if (s1)
  144. !         xfree(s1);
  145.   
  146.       if (s2)
  147. !         xfree(s2);
  148.   
  149.       return(v);
  150.   }
  151. --- 618,627 ----
  152.       v = 0.0;
  153.   
  154.       if (s1)
  155. !         scxfree(s1);
  156.   
  157.       if (s2)
  158. !         scxfree(s2);
  159.   
  160.       return(v);
  161.   }
  162. ***************
  163. *** 630,637 ****
  164.   
  165.   /*
  166.    * Given a string representing a column name and a value which is a column
  167. !  * number, return a pointer to the selected cell's entry, if any, else 0.  Use
  168. !  * only the integer part of the column number.  Always free the string.
  169.    */
  170.   
  171.   struct ent *
  172. --- 629,636 ----
  173.   
  174.   /*
  175.    * Given a string representing a column name and a value which is a column
  176. !  * number, return a pointer to the selected cell's entry, if any, else NULL.
  177. !  * Use only the integer part of the column number.  Always free the string.
  178.    */
  179.   
  180.   struct ent *
  181. ***************
  182. *** 655,664 ****
  183.        && (col < maxcols))            /* in range */
  184.       {
  185.       p = *ATBL(tbl, row, col);
  186. !     if (p->cellerror)
  187.           cellerror = CELLINVALID;
  188.       }
  189. !     xfree (colstr);
  190.       return (p);
  191.   }
  192.   
  193. --- 654,663 ----
  194.        && (col < maxcols))            /* in range */
  195.       {
  196.       p = *ATBL(tbl, row, col);
  197. !     if ((p != NULL) && p->cellerror)
  198.           cellerror = CELLINVALID;
  199.       }
  200. !     scxfree (colstr);
  201.       return (p);
  202.   }
  203.   
  204. ***************
  205. *** 897,902 ****
  206. --- 896,902 ----
  207.       case NVAL:      return (donval(seval(e->e.o.left),eval(e->e.o.right)));
  208.       case MYROW:    return ((double) gmyrow);
  209.       case MYCOL:    return ((double) gmycol);
  210. +     case NUMITER:    return ((double) repct);
  211.       default:    error ("Illegal numeric expression");
  212.               exprerr = 1;
  213.       }
  214. ***************
  215. *** 955,961 ****
  216.   
  217.   /* 
  218.    * Rules for string functions:
  219. !  * Take string arguments which they xfree.
  220.    * All returned strings are assumed to be xalloced.
  221.    */
  222.   
  223. --- 955,961 ----
  224.   
  225.   /* 
  226.    * Rules for string functions:
  227. !  * Take string arguments which they scxfree.
  228.    * All returned strings are assumed to be xalloced.
  229.    */
  230.   
  231. ***************
  232. *** 970,982 ****
  233.       return((char *)0);
  234.       arg1 = s1 ? s1 : "";
  235.       arg2 = s2 ? s2 : "";
  236. !     p = xmalloc((unsigned)(strlen(arg1)+strlen(arg2)+1));
  237.       (void) strcpy(p, arg1);
  238.       (void) strcat(p, arg2);
  239.       if (s1)
  240. !         xfree(s1);
  241.       if (s2)
  242. !         xfree(s2);
  243.       return(p);
  244.   }
  245.   
  246. --- 970,982 ----
  247.       return((char *)0);
  248.       arg1 = s1 ? s1 : "";
  249.       arg2 = s2 ? s2 : "";
  250. !     p = scxmalloc((unsigned)(strlen(arg1)+strlen(arg2)+1));
  251.       (void) strcpy(p, arg1);
  252.       (void) strcat(p, arg2);
  253.       if (s1)
  254. !         scxfree(s1);
  255.       if (s2)
  256. !         scxfree(s2);
  257.       return(p);
  258.   }
  259.   
  260. ***************
  261. *** 989,995 ****
  262.   
  263.       tp = ctime(&tloc);
  264.       tp[24] = '\0';
  265. !     p = xmalloc((unsigned)25);
  266.       (void) strcpy(p, tp);
  267.       return(p);
  268.   }
  269. --- 989,995 ----
  270.   
  271.       tp = ctime(&tloc);
  272.       tp[24] = '\0';
  273. !     p = scxmalloc((unsigned)25);
  274.       (void) strcpy(p, tp);
  275.       return(p);
  276.   }
  277. ***************
  278. *** 1006,1014 ****
  279.       if (!fmtstr)
  280.       return((char *)0);
  281.       (void) sprintf(buff, fmtstr, v);
  282. !     p = xmalloc((unsigned)(strlen(buff)+1));
  283.       (void) strcpy(p, buff);
  284. !     xfree(fmtstr);
  285.       return(p);
  286.   }
  287.   
  288. --- 1006,1014 ----
  289.       if (!fmtstr)
  290.       return((char *)0);
  291.       (void) sprintf(buff, fmtstr, v);
  292. !     p = scxmalloc((unsigned)(strlen(buff)+1));
  293.       (void) strcpy(p, buff);
  294. !     scxfree(fmtstr);
  295.       return(p);
  296.   }
  297.   
  298. ***************
  299. *** 1032,1039 ****
  300.       error("Warning: External functions unavailable on VMS");
  301.       cellerror = CELLERROR;    /* not sure if this should be a cellerror */
  302.       if (command)
  303. !     xfree(command);
  304. !     return (strcpy (xmalloc((unsigned) 1), "\0"));
  305.   }
  306.   
  307.   #else /* VMS */
  308. --- 1032,1039 ----
  309.       error("Warning: External functions unavailable on VMS");
  310.       cellerror = CELLERROR;    /* not sure if this should be a cellerror */
  311.       if (command)
  312. !     scxfree(command);
  313. !     return (strcpy (scxmalloc((unsigned) 1), "\0"));
  314.   }
  315.   
  316.   #else /* VMS */
  317. ***************
  318. *** 1053,1069 ****
  319.           ((prevstr == NULL) || (*prevstr == '\0')) ?
  320.               "null" : "previous");
  321.   
  322. !     if (command) xfree (command);
  323.       } else {
  324.       if ((! command) || (! *command)) {
  325.           error ("Warning: external function given null command name");
  326.           cellerror = CELLERROR;
  327. !         if (command) xfree (command);
  328.       } else {
  329.           FILE *pp;
  330.   
  331.           (void) sprintf (buff, "%s %g", command, value); /* build cmd line */
  332. !         xfree (command);
  333.   
  334.           error ("Running external function...");
  335.           (void) refresh();
  336. --- 1053,1069 ----
  337.           ((prevstr == NULL) || (*prevstr == '\0')) ?
  338.               "null" : "previous");
  339.   
  340. !     if (command) scxfree (command);
  341.       } else {
  342.       if ((! command) || (! *command)) {
  343.           error ("Warning: external function given null command name");
  344.           cellerror = CELLERROR;
  345. !         if (command) scxfree (command);
  346.       } else {
  347.           FILE *pp;
  348.   
  349.           (void) sprintf (buff, "%s %g", command, value); /* build cmd line */
  350. !         scxfree (command);
  351.   
  352.           error ("Running external function...");
  353.           (void) refresh();
  354. ***************
  355. *** 1086,1092 ****
  356.   
  357.               if (strlen(buff) + 1 > prevlen)
  358.               {    prevlen = strlen(buff) + 40;
  359. !             prevstr = xrealloc(prevstr, prevlen);
  360.               }
  361.               (void) strcpy (prevstr, buff);
  362.                /* save alloc'd copy */
  363. --- 1086,1092 ----
  364.   
  365.               if (strlen(buff) + 1 > prevlen)
  366.               {    prevlen = strlen(buff) + 40;
  367. !             prevstr = scxrealloc(prevstr, prevlen);
  368.               }
  369.               (void) strcpy (prevstr, buff);
  370.                /* save alloc'd copy */
  371. ***************
  372. *** 1097,1105 ****
  373.       } /* else */
  374.       } /* else */
  375.       if (prevstr)
  376. !     return (strcpy (xmalloc ((unsigned) (strlen (prevstr) + 1)), prevstr));
  377.       else
  378. !     return (strcpy(xmalloc((unsigned)1), ""));
  379.   }
  380.   
  381.   #endif /* VMS */
  382. --- 1097,1105 ----
  383.       } /* else */
  384.       } /* else */
  385.       if (prevstr)
  386. !     return (strcpy (scxmalloc ((unsigned) (strlen (prevstr) + 1)), prevstr));
  387.       else
  388. !     return (strcpy(scxmalloc((unsigned)1), ""));
  389.   }
  390.   
  391.   #endif /* VMS */
  392. ***************
  393. *** 1121,1127 ****
  394.       char *llabel;
  395.   
  396.       llabel = (ep = getent (colstr, rowdoub)) ? (ep -> label) : "";
  397. !     return (strcpy (xmalloc ((unsigned) (strlen (llabel) + 1)), llabel));
  398.   }
  399.   
  400.   
  401. --- 1121,1127 ----
  402.       char *llabel;
  403.   
  404.       llabel = (ep = getent (colstr, rowdoub)) ? (ep -> label) : "";
  405. !     return (strcpy (scxmalloc ((unsigned) (strlen (llabel) + 1)), llabel));
  406.   }
  407.   
  408.   
  409. ***************
  410. *** 1145,1161 ****
  411.       v2 =  strlen (s) - 1;        /* to end   */
  412.   
  413.       if (v1 < 0 || v1 > v2) {        /* out of range, return null string */
  414. !     xfree(s);
  415. !     p = xmalloc((unsigned)1);
  416.       p[0] = '\0';
  417.       return(p);
  418.       }
  419. !     s2 = p = xmalloc((unsigned)(v2-v1+2));
  420.       s1 = &s[v1];
  421.       for(; v1 <= v2; s1++, s2++, v1++)
  422.       *s2 = *s1;
  423.       *s2 = '\0';
  424. !     xfree(s);
  425.       return(p);
  426.   }
  427.   
  428. --- 1145,1161 ----
  429.       v2 =  strlen (s) - 1;        /* to end   */
  430.   
  431.       if (v1 < 0 || v1 > v2) {        /* out of range, return null string */
  432. !     scxfree(s);
  433. !     p = scxmalloc((unsigned)1);
  434.       p[0] = '\0';
  435.       return(p);
  436.       }
  437. !     s2 = p = scxmalloc((unsigned)(v2-v1+2));
  438.       s1 = &s[v1];
  439.       for(; v1 <= v2; s1++, s2++, v1++)
  440.       *s2 = *s1;
  441.       *s2 = '\0';
  442. !     scxfree(s);
  443.       return(p);
  444.   }
  445.   
  446. ***************
  447. *** 1233,1239 ****
  448.   
  449.       if (se == (struct enode *)0) return (char *)0;
  450.       switch (se->op) {
  451. !     case O_SCONST: p = xmalloc((unsigned)(strlen(se->e.s)+1));
  452.                (void) strcpy(p, se->e.s);
  453.                return(p);
  454.       case O_VAR:    {
  455. --- 1233,1239 ----
  456.   
  457.       if (se == (struct enode *)0) return (char *)0;
  458.       switch (se->op) {
  459. !     case O_SCONST: p = scxmalloc((unsigned)(strlen(se->e.s)+1));
  460.                (void) strcpy(p, se->e.s);
  461.                return(p);
  462.       case O_VAR:    {
  463. ***************
  464. *** 1242,1248 ****
  465.   
  466.               if (!ep->label)
  467.                   return((char *)0);
  468. !             p = xmalloc((unsigned)(strlen(ep->label)+1));
  469.               (void) strcpy(p, ep->label);
  470.               return(p);
  471.                }
  472. --- 1242,1248 ----
  473.   
  474.               if (!ep->label)
  475.                   return((char *)0);
  476. !             p = scxmalloc((unsigned)(strlen(ep->label)+1));
  477.               (void) strcpy(p, ep->label);
  478.               return(p);
  479.                }
  480. ***************
  481. *** 1273,1280 ****
  482.       case SUBSTR: return(dosubstr(seval(se->e.o.left),
  483.                   (int)eval(se->e.o.right->e.o.left) - 1,
  484.                   (int)eval(se->e.o.right->e.o.right) - 1));
  485. !     case COLTOA: return(strcpy(xmalloc((unsigned)10),
  486. !                    coltoa(eval(se->e.o.right)+1)));
  487.       default:
  488.                error ("Illegal string expression");
  489.                exprerr = 1;
  490. --- 1273,1280 ----
  491.       case SUBSTR: return(dosubstr(seval(se->e.o.left),
  492.                   (int)eval(se->e.o.right->e.o.left) - 1,
  493.                   (int)eval(se->e.o.right->e.o.right) - 1));
  494. !     case COLTOA: return(strcpy(scxmalloc((unsigned)10),
  495. !                    coltoa((int)eval(se->e.o.right)+1)));
  496.       default:
  497.                error ("Illegal string expression");
  498.                exprerr = 1;
  499. ***************
  500. *** 1293,1298 ****
  501. --- 1293,1300 ----
  502.    */
  503.   
  504.   int propagation = 10;    /* max number of times to try calculation */
  505. + int repct = 1;        /* Make repct a global variable so that the 
  506. +                 function @numiter can access it */
  507.   
  508.   void
  509.   setiterations(i)
  510. ***************
  511. *** 1307,1314 ****
  512.   
  513.   void
  514.   EvalAll () {
  515. !      int lastcnt, repct = 1;
  516.     
  517.        (void) signal(SIGFPE, eval_fpe);
  518.   
  519.        while ((lastcnt = RealEvalAll()) && (++repct <= propagation));
  520. --- 1309,1317 ----
  521.   
  522.   void
  523.   EvalAll () {
  524. !      int lastcnt;
  525.     
  526. +      repct = 1;
  527.        (void) signal(SIGFPE, eval_fpe);
  528.   
  529.        while ((lastcnt = RealEvalAll()) && (++repct <= propagation));
  530. ***************
  531. *** 1315,1321 ****
  532.        if((propagation>1)&& (lastcnt >0 ))
  533.            error("Still changing after %d iterations",propagation-1);
  534.   
  535. !     (void) signal(SIGFPE, quit);
  536.   }
  537.   
  538.   /*
  539. --- 1318,1324 ----
  540.        if((propagation>1)&& (lastcnt >0 ))
  541.            error("Still changing after %d iterations",propagation-1);
  542.   
  543. !     (void) signal(SIGFPE, doquit);
  544.   }
  545.   
  546.   /*
  547. ***************
  548. *** 1369,1375 ****
  549.           changed++;
  550.           }
  551.           if(p->label)
  552. !         xfree(p->label);
  553.           p->label = v;
  554.       } else {
  555.           double v;
  556. --- 1372,1378 ----
  557.           changed++;
  558.           }
  559.           if(p->label)
  560. !         scxfree(p->label);
  561.           p->label = v;
  562.       } else {
  563.           double v;
  564. ***************
  565. *** 1403,1409 ****
  566.       freeenodes = p->e.o.left;
  567.       }
  568.       else
  569. !     p = (struct enode *) xmalloc ((unsigned)sizeof (struct enode));
  570.       p->op = op;
  571.       p->e.o.left = a1;
  572.       p->e.o.right = a2;
  573. --- 1406,1412 ----
  574.       freeenodes = p->e.o.left;
  575.       }
  576.       else
  577. !     p = (struct enode *) scxmalloc ((unsigned)sizeof (struct enode));
  578.       p->op = op;
  579.       p->e.o.left = a1;
  580.       p->e.o.right = a2;
  581. ***************
  582. *** 1421,1427 ****
  583.       freeenodes = p->e.o.left;
  584.       }
  585.       else
  586. !     p = (struct enode *) xmalloc ((unsigned)sizeof (struct enode));
  587.       p->op = op;
  588.       p->e.v = a1;
  589.       return p;
  590. --- 1424,1430 ----
  591.       freeenodes = p->e.o.left;
  592.       }
  593.       else
  594. !     p = (struct enode *) scxmalloc ((unsigned)sizeof (struct enode));
  595.       p->op = op;
  596.       p->e.v = a1;
  597.       return p;
  598. ***************
  599. *** 1438,1444 ****
  600.       freeenodes = p->e.o.left;
  601.       }
  602.       else
  603. !     p = (struct enode *) xmalloc ((unsigned)sizeof (struct enode));
  604.       p->op = op;
  605.       p->e.r = a1;
  606.       return p;
  607. --- 1441,1447 ----
  608.       freeenodes = p->e.o.left;
  609.       }
  610.       else
  611. !     p = (struct enode *) scxmalloc ((unsigned)sizeof (struct enode));
  612.       p->op = op;
  613.       p->e.r = a1;
  614.       return p;
  615. ***************
  616. *** 1455,1461 ****
  617.       freeenodes = p->e.o.left;
  618.       }
  619.       else
  620. !     p = (struct enode *) xmalloc ((unsigned)sizeof (struct enode));
  621.       p->op = op;
  622.       p->e.k = a1;
  623.       return p;
  624. --- 1458,1464 ----
  625.       freeenodes = p->e.o.left;
  626.       }
  627.       else
  628. !     p = (struct enode *) scxmalloc ((unsigned)sizeof (struct enode));
  629.       p->op = op;
  630.       p->e.k = a1;
  631.       return p;
  632. ***************
  633. *** 1472,1478 ****
  634.       freeenodes = p->e.o.left;
  635.       }
  636.       else
  637. !     p = (struct enode *) xmalloc ((unsigned)sizeof(struct enode));
  638.       p->op = O_SCONST;
  639.       p->e.s = s;
  640.       return(p);
  641. --- 1475,1481 ----
  642.       freeenodes = p->e.o.left;
  643.       }
  644.       else
  645. !     p = (struct enode *) scxmalloc ((unsigned)sizeof(struct enode));
  646.       p->op = O_SCONST;
  647.       p->e.s = s;
  648.       return(p);
  649. ***************
  650. *** 1564,1570 ****
  651.   g_free()
  652.   {
  653.       switch (gs.g_type) {
  654. !     case G_STR: xfree(gs.g_s); break;
  655.       default: break;
  656.       }
  657.       gs.g_type = G_NONE;
  658. --- 1567,1573 ----
  659.   g_free()
  660.   {
  661.       switch (gs.g_type) {
  662. !     case G_STR: scxfree(gs.g_s); break;
  663.       default: break;
  664.       }
  665.       gs.g_type = G_NONE;
  666. ***************
  667. *** 1675,1681 ****
  668.   
  669.   #if defined(RE_COMP)
  670.       if ((tmp = re_comp(s)) != (char *)0) {
  671. !     xfree(s);
  672.       error(tmp);
  673.       return;
  674.       }
  675. --- 1678,1684 ----
  676.   
  677.   #if defined(RE_COMP)
  678.       if ((tmp = re_comp(s)) != (char *)0) {
  679. !     scxfree(s);
  680.       error(tmp);
  681.       return;
  682.       }
  683. ***************
  684. *** 1682,1688 ****
  685.   #endif
  686.   #if defined(REGCMP)
  687.       if ((tmp = regcmp(s, (char *)0)) == (char *)0) {
  688. !     xfree(s);
  689.       cellerror = CELLERROR;
  690.       error("Invalid search string");
  691.       return;
  692. --- 1685,1691 ----
  693.   #endif
  694.   #if defined(REGCMP)
  695.       if ((tmp = regcmp(s, (char *)0)) == (char *)0) {
  696. !     scxfree(s);
  697.       cellerror = CELLERROR;
  698.       error("Invalid search string");
  699.       return;
  700. ***************
  701. *** 1870,1876 ****
  702.           FullUpdate++;
  703.           v->cellerror = cellerror;
  704.       }
  705. !     (void) signal(SIGFPE, quit);
  706.       if (exprerr) {
  707.           efree(e);
  708.           return;
  709. --- 1873,1879 ----
  710.           FullUpdate++;
  711.           v->cellerror = cellerror;
  712.       }
  713. !     (void) signal(SIGFPE, doquit);
  714.       if (exprerr) {
  715.           efree(e);
  716.           return;
  717. ***************
  718. *** 1931,1937 ****
  719.       FullUpdate++;
  720.       v->cellerror = cellerror;
  721.       }
  722. !     (void) signal(SIGFPE, quit);
  723.       if (exprerr) {
  724.       efree(se);
  725.       return;
  726. --- 1934,1940 ----
  727.       FullUpdate++;
  728.       v->cellerror = cellerror;
  729.       }
  730. !     (void) signal(SIGFPE, doquit);
  731.       if (exprerr) {
  732.       efree(se);
  733.       return;
  734. ***************
  735. *** 1939,1945 ****
  736.       if (constant(se)) {
  737.       label(v, p, flushdir);
  738.       if (p)
  739. !         xfree(p);
  740.       efree(se);
  741.       if (v->flags & is_strexpr) {
  742.               efree(v->expr);
  743. --- 1942,1948 ----
  744.       if (constant(se)) {
  745.       label(v, p, flushdir);
  746.       if (p)
  747. !         scxfree(p);
  748.       efree(se);
  749.       if (v->flags & is_strexpr) {
  750.               efree(v->expr);
  751. ***************
  752. *** 1992,2001 ****
  753.           continue;
  754.           }
  755.           if (n->format)
  756. !         xfree(n->format);
  757.           n->format = 0;
  758.           if (s && *s != '\0')
  759. !         n->format = strcpy(xmalloc((unsigned)(strlen(s)+1)), s);
  760.           n->flags |= is_changed;
  761.          }
  762.   }
  763. --- 1995,2004 ----
  764.           continue;
  765.           }
  766.           if (n->format)
  767. !         scxfree(n->format);
  768.           n->format = 0;
  769.           if (s && *s != '\0')
  770. !         n->format = strcpy(scxmalloc((unsigned)(strlen(s)+1)), s);
  771.           n->flags |= is_changed;
  772.          }
  773.   }
  774. ***************
  775. *** 2034,2040 ****
  776.       }
  777.       }
  778.       FullUpdate++;
  779. !     col_hidden[arg] = 1;
  780.   }
  781.   
  782.   void
  783. --- 2037,2043 ----
  784.       }
  785.       }
  786.       FullUpdate++;
  787. !     col_hidden[arg] = TRUE;
  788.   }
  789.   
  790.   void
  791. ***************
  792. *** 2049,2055 ****
  793.       efree(v->expr);
  794.       v->expr = (struct enode *)0;
  795.       if (v->format)
  796. !     xfree(v->format);
  797.       v->format = (char *)0;
  798.       v->flags |= (is_changed);
  799.       v->flags &=  (is_valid);
  800. --- 2052,2058 ----
  801.       efree(v->expr);
  802.       v->expr = (struct enode *)0;
  803.       if (v->format)
  804. !     scxfree(v->format);
  805.       v->format = (char *)0;
  806.       v->flags |= (is_changed);
  807.       v->flags &=  (is_valid);
  808. ***************
  809. *** 2079,2084 ****
  810. --- 2082,2088 ----
  811.            && e -> op != NOW
  812.            && e -> op != MYROW
  813.            && e -> op != MYCOL
  814. +          && e -> op != NUMITER
  815.       )
  816.       );
  817.   }
  818. ***************
  819. *** 2094,2100 ****
  820.           efree(e->e.o.right);
  821.       }
  822.       if (e->op == O_SCONST && e->e.s)
  823. !         xfree(e->e.s);
  824.       e->e.o.left = freeenodes;
  825.       freeenodes = e;
  826.       }
  827. --- 2098,2104 ----
  828.           efree(e->e.o.right);
  829.       }
  830.       if (e->op == O_SCONST && e->e.s)
  831. !         scxfree(e->e.s);
  832.       e->e.o.left = freeenodes;
  833.       freeenodes = e;
  834.       }
  835. ***************
  836. *** 2115,2123 ****
  837.           v = tv, flushdir = -1;
  838.           else flushdir = -1;
  839.       }
  840. !     if (v->label) xfree((char *)(v->label));
  841.       if (s && s[0]) {
  842. !         v->label = xmalloc ((unsigned)(strlen(s)+1));
  843.           (void) strcpy (v->label, s);
  844.       } else
  845.           v->label = (char *)0;
  846. --- 2119,2127 ----
  847.           v = tv, flushdir = -1;
  848.           else flushdir = -1;
  849.       }
  850. !     if (v->label) scxfree((char *)(v->label));
  851.       if (s && s[0]) {
  852. !         v->label = scxmalloc ((unsigned)(strlen(s)+1));
  853.           (void) strcpy (v->label, s);
  854.       } else
  855.           v->label = (char *)0;
  856. ***************
  857. *** 2288,2293 ****
  858. --- 2292,2300 ----
  859.               linelim--;
  860.               break;
  861.       case COLTOA:    one_arg( "@coltoa(", e); break;
  862. +     case NUMITER:    for ( s = "@numiter"; line[linelim++] = *s++;);
  863. +                         linelim--;
  864. +                         break;
  865.       default:    decompile (e->e.o.left, mypriority);
  866.               line[linelim++] = e->op;
  867.               decompile (e->e.o.right, mypriority+1);
  868. *** ../619/lex.c    Mon Mar 16 10:09:42 1992
  869. --- lex.c    Fri May  8 12:31:28 1992
  870. ***************
  871. *** 7,13 ****
  872.    *
  873.    *              More mods Robert Bond, 12/86
  874.    *        More mods by Alan Silverstein, 3/88, see list of changes.
  875. !  *        $Revision: 6.19 $
  876.    *
  877.    */
  878.   
  879. --- 7,13 ----
  880.    *
  881.    *              More mods Robert Bond, 12/86
  882.    *        More mods by Alan Silverstein, 3/88, see list of changes.
  883. !  *        $Revision: 6.21 $
  884.    *
  885.    */
  886.   
  887. ***************
  888. *** 216,222 ****
  889.           ptr = p+1;    /* "string" or "string\"quoted\"" */
  890.           while(*ptr && ((*ptr != '"') || (*(ptr-1) == '\\')))
  891.           ptr++;
  892. !         ptr = xmalloc((unsigned)(ptr-p));
  893.       yylval.sval = ptr;
  894.       p += 1;
  895.       while (*p && ((*p != '"') || (*(p-1) == '\\')))
  896. --- 216,222 ----
  897.           ptr = p+1;    /* "string" or "string\"quoted\"" */
  898.           while(*ptr && ((*ptr != '"') || (*(ptr-1) == '\\')))
  899.           ptr++;
  900. !         ptr = scxmalloc((unsigned)(ptr-p));
  901.       yylval.sval = ptr;
  902.       p += 1;
  903.       while (*p && ((*p != '"') || (*(p-1) == '\\')))
  904. ***************
  905. *** 411,416 ****
  906. --- 411,417 ----
  907.       km[1].k_str = tgetstr("kr", &p); km[1].k_val = ctl('f');
  908.       km[2].k_str = tgetstr("ku", &p); km[2].k_val = ctl('p');
  909.       km[3].k_str = tgetstr("kd", &p); km[3].k_val = ctl('n');
  910.       ktmp = tgetstr("ks",&p);
  911.       if (ktmp)  {
  912.       (void) strcpy(ks_buf, ktmp);
  913. ***************
  914. *** 597,602 ****
  915. --- 598,615 ----
  916.   #ifdef KEY_HOME
  917.       case KEY_HOME:    break;
  918.   #endif
  919. + #ifdef KEY_DC
  920. +     case KEY_DC:    c = 'x'; break;
  921. + #endif
  922. + #ifdef KEY_FIND
  923. +     case KEY_FIND:  c = 'g'; break;
  924. + #endif
  925. + #ifdef KEY_HELP
  926. +     case KEY_HELP:  c = '?'; break;
  927. + #endif
  928. + #ifdef KEY_SELECT
  929. +     case KEY_SELECT:c = 'm'; break;
  930. + #endif
  931.   #ifdef KEY_C1
  932.   /* This stuff works for a wyse wy75 in ANSI mode under 5.3.  Good luck. */
  933.   /* It is supposed to map the curses keypad back to the numeric equiv. */
  934. ***************
  935. *** 613,619 ****
  936.       case KEY_C3:    c = '.'; break;
  937.       case KEY_ENTER: c = ctl('m'); break;
  938.   #endif
  939. !     default:   c = toascii(c); 
  940.       break;
  941.       }
  942.       return (c);
  943. --- 626,632 ----
  944.       case KEY_C3:    c = '.'; break;
  945.       case KEY_ENTER: c = ctl('m'); break;
  946.   #endif
  947. !     default:        c = toascii(c); 
  948.       break;
  949.       }
  950.       return (c);
  951. *** ../619/psc.c    Mon Mar 16 10:09:42 1992
  952. --- psc.c    Fri May  8 12:31:29 1992
  953. ***************
  954. *** 17,23 ****
  955.    *  Author: Robert Bond
  956.    *  Adjustments: Jeff Buhrt and Eric Putz
  957.    */
  958. ! char *rev = "$Revision: 6.19 $";
  959.   
  960.   #include <ctype.h>
  961.   #include <stdio.h>
  962. --- 17,23 ----
  963.    *  Author: Robert Bond
  964.    *  Adjustments: Jeff Buhrt and Eric Putz
  965.    */
  966. ! char *rev = "$Revision: 6.21 $";
  967.   
  968.   #include <ctype.h>
  969.   #include <stdio.h>
  970. *** ../619/range.c    Mon Mar 16 10:09:43 1992
  971. --- range.c    Fri May  8 12:31:29 1992
  972. ***************
  973. *** 4,10 ****
  974.    *
  975.    *              Robert Bond, 4/87
  976.    *
  977. !  *        $Revision: 6.19 $
  978.    */
  979.   
  980.   #include <sys/types.h>
  981. --- 4,10 ----
  982.    *
  983.    *              Robert Bond, 4/87
  984.    *
  985. !  *        $Revision: 6.21 $
  986.    */
  987.   
  988.   #include <sys/types.h>
  989. ***************
  990. *** 59,71 ****
  991.   
  992.       if (find_range(name, strlen(name), (struct ent *)0, (struct ent *)0)) {
  993.       error("Error: range name already defined");
  994. !     xfree(name);
  995.       return;
  996.       }
  997.   
  998.       if (strlen(name) <= 2) {
  999.       error("Invalid range name - too short");
  1000. !     xfree(name);
  1001.       return;
  1002.       }
  1003.   
  1004. --- 59,71 ----
  1005.   
  1006.       if (find_range(name, strlen(name), (struct ent *)0, (struct ent *)0)) {
  1007.       error("Error: range name already defined");
  1008. !     scxfree(name);
  1009.       return;
  1010.       }
  1011.   
  1012.       if (strlen(name) <= 2) {
  1013.       error("Invalid range name - too short");
  1014. !     scxfree(name);
  1015.       return;
  1016.       }
  1017.   
  1018. ***************
  1019. *** 73,79 ****
  1020.       if (!((isalpha(*p) && (len<=2)) ||
  1021.           ((isdigit(*p) || isalpha(*p) || (*p == '_')) && (len>2)))) {
  1022.           error("Invalid range name - illegal combination");
  1023. !         xfree(name);
  1024.           return;
  1025.       }
  1026.    
  1027. --- 73,79 ----
  1028.       if (!((isalpha(*p) && (len<=2)) ||
  1029.           ((isdigit(*p) || isalpha(*p) || (*p == '_')) && (len>2)))) {
  1030.           error("Invalid range name - illegal combination");
  1031. !         scxfree(name);
  1032.           return;
  1033.       }
  1034.    
  1035. ***************
  1036. *** 83,89 ****
  1037.           label(rcp, name, 0);
  1038.       }
  1039.   
  1040. !     r = (struct range *)xmalloc((unsigned)sizeof(struct range));
  1041.       r->r_name = name;
  1042.       r->r_left = left;
  1043.       r->r_right = right;
  1044. --- 83,89 ----
  1045.           label(rcp, name, 0);
  1046.       }
  1047.   
  1048. !     r = (struct range *)scxmalloc((unsigned)sizeof(struct range));
  1049.       r->r_name = name;
  1050.       r->r_left = left;
  1051.       r->r_right = right;
  1052. ***************
  1053. *** 119,126 ****
  1054.           r->r_prev->r_next = r->r_next;
  1055.       else
  1056.       rng_base = r->r_next;
  1057. !     xfree((char *)(r->r_name));
  1058. !     xfree((char *)r);
  1059.   }
  1060.   
  1061.   void
  1062. --- 119,126 ----
  1063.           r->r_prev->r_next = r->r_next;
  1064.       else
  1065.       rng_base = r->r_next;
  1066. !     scxfree((char *)(r->r_name));
  1067. !     scxfree((char *)r);
  1068.   }
  1069.   
  1070.   void
  1071. ***************
  1072. *** 134,141 ****
  1073.   
  1074.       while (r) {
  1075.       nextr = r->r_next;
  1076. !     xfree((char *)(r->r_name));
  1077. !     xfree((char *)r);
  1078.       r = nextr;
  1079.       }
  1080.   }
  1081. --- 134,141 ----
  1082.   
  1083.       while (r) {
  1084.       nextr = r->r_next;
  1085. !     scxfree((char *)(r->r_name));
  1086. !     scxfree((char *)r);
  1087.       r = nextr;
  1088.       }
  1089.   }
  1090. *** ../619/sc.c    Mon Mar 16 10:09:44 1992
  1091. --- sc.c    Fri May  8 12:31:31 1992
  1092. ***************
  1093. *** 8,14 ****
  1094.    *              More mods Robert Bond, 12/86
  1095.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1096.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1097. !  *        $Revision: 6.19 $
  1098.    *
  1099.    */
  1100.   
  1101. --- 8,14 ----
  1102.    *              More mods Robert Bond, 12/86
  1103.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1104.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1105. !  *        $Revision: 6.21 $
  1106.    *
  1107.    */
  1108.   
  1109. ***************
  1110. *** 126,132 ****
  1111.           freeents = freeents->next;
  1112.       }
  1113.       else
  1114. !         *pp = (struct ent *) xmalloc((unsigned)sizeof(struct ent));
  1115.       if (row>maxrow) maxrow = row;
  1116.       if (col>maxcol) maxcol = col;
  1117.       (*pp)->label = (char *)0;
  1118. --- 126,132 ----
  1119.           freeents = freeents->next;
  1120.       }
  1121.       else
  1122. !         *pp = (struct ent *) scxmalloc((unsigned)sizeof(struct ent));
  1123.       if (row>maxrow) maxrow = row;
  1124.       if (col>maxcol) maxcol = col;
  1125.       (*pp)->label = (char *)0;
  1126. ***************
  1127. *** 224,231 ****
  1128.       argc--;
  1129.           switch (argv[0][1]) {
  1130.           case 'x':
  1131. ! #if defined(VMS) || defined(MSDOS)
  1132. !             (void) fprintf(stderr, "Crypt not available for VMS or MS-DOS\n");
  1133.               exit(1);
  1134.   #else 
  1135.               Crypt = 1;
  1136. --- 224,231 ----
  1137.       argc--;
  1138.           switch (argv[0][1]) {
  1139.           case 'x':
  1140. ! #if defined(VMS) || defined(MSDOS) || !defined(CRYPT_PATH)
  1141. !             (void) fprintf(stderr, "Crypt not available\n");
  1142.               exit(1);
  1143.   #else 
  1144.               Crypt = 1;
  1145. ***************
  1146. *** 343,349 ****
  1147.   #if    pyr
  1148.          if ( iscntrl(c) || (c >= 011 && c <= 015) )    /* iscntrl broken in OSx4.1 */
  1149.   #else
  1150. !        if ( iscntrl(c) || (c == 020 ) )    /* iscntrl broken in OSx4.1 */
  1151.   #endif
  1152.           switch (c) {
  1153.   #ifdef SIGTSTP
  1154. --- 343,349 ----
  1155.   #if    pyr
  1156.          if ( iscntrl(c) || (c >= 011 && c <= 015) )    /* iscntrl broken in OSx4.1 */
  1157.   #else
  1158. !        if (isascii(c) && (iscntrl(c) || (c == 020)) )    /* iscntrl broken in OSx4.1 */
  1159.   #endif
  1160.           switch (c) {
  1161.   #ifdef SIGTSTP
  1162. ***************
  1163. *** 509,516 ****
  1164. --- 509,521 ----
  1165.               break;    /* ignore flow control */
  1166.   
  1167.           case ctl('t'):
  1168. + #if !defined(VMS) && !defined(MSDOS) && defined(CRYPT_PATH)
  1169.               error(
  1170.   "Toggle: a:auto,c:cell,e:ext funcs,n:numeric,t:top,x:encrypt,$:pre-scale,<MORE>");
  1171. + #else                 /* no encryption available */
  1172. +             error(
  1173. + "Toggle: a:auto,c:cell,e:ext funcs,n:numeric,t:top,$:pre-scale,<MORE>");
  1174. + #endif
  1175.               (void) refresh();
  1176.   
  1177.               switch (nmgetch()) {
  1178. ***************
  1179. *** 536,543 ****
  1180. --- 541,552 ----
  1181.                       showcell ? "en" : "dis");
  1182.                   break;
  1183.               case 'x': case 'X':
  1184. + #if defined(VMS) || defined(MSDOS) || !defined(CRYPT_PATH)
  1185. +                 error ("Encryption not available.");
  1186. + #else 
  1187.                   Crypt = (! Crypt);
  1188.                   error ("Encryption %sabled.", Crypt? "en" : "dis");
  1189. + #endif
  1190.                   break;
  1191.               case 'l': case 'L':
  1192.                   autolabel = (! autolabel);
  1193. ***************
  1194. *** 609,620 ****
  1195.               static    unsigned    templen = 0;
  1196.               int templim;
  1197.   
  1198. !             /* xrealloc will xmalloc if needed */
  1199.               if (strlen(line)+1 > templen)
  1200.               {    templen = strlen(line)+40;
  1201.   
  1202. !                 temp = xrealloc(temp, templen);
  1203. !                 temp1= xrealloc(temp1, templen);
  1204.               }
  1205.               strcpy(temp, line);
  1206.               templim = linelim;
  1207. --- 618,629 ----
  1208.               static    unsigned    templen = 0;
  1209.               int templim;
  1210.   
  1211. !             /* scxrealloc will scxmalloc if needed */
  1212.               if (strlen(line)+1 > templen)
  1213.               {    templen = strlen(line)+40;
  1214.   
  1215. !                 temp = scxrealloc(temp, templen);
  1216. !                 temp1= scxrealloc(temp1, templen);
  1217.               }
  1218.               strcpy(temp, line);
  1219.               templim = linelim;
  1220. ***************
  1221. *** 641,647 ****
  1222.               break;
  1223.   
  1224.           } /* End of the control char switch stmt */
  1225. !     else if (isdigit(c) && ((numeric && edistate >= 0) ||
  1226.               (!numeric && (linelim < 0 || edistate >= 0)))) {
  1227.           /* we got a leading number */
  1228.           if (edistate != 0) {
  1229. --- 650,656 ----
  1230.               break;
  1231.   
  1232.           } /* End of the control char switch stmt */
  1233. !     else if (isascii(c) && isdigit(c) && ((numeric && edistate >= 0) ||
  1234.               (!numeric && (linelim < 0 || edistate >= 0)))) {
  1235.           /* we got a leading number */
  1236.           if (edistate != 0) {
  1237. ***************
  1238. *** 1121,1137 ****
  1239.               break;
  1240.           case 'W':
  1241.               (void) sprintf (line, "write [\"dest\" range] \"");
  1242.               linelim = strlen (line);
  1243.               insert_mode();
  1244.               break;
  1245.           case 'S':    /* set options */
  1246.               (void) sprintf (line, "set ");
  1247. !             error("Options:byrows,bycols,iterations=n,tblstyle=(0|tbl|latex|slatex|tex),<MORE>");
  1248.               linelim = strlen (line);
  1249.               insert_mode();
  1250.               break;
  1251.           case 'T':    /* tbl output */
  1252.               (void) sprintf (line, "tbl [\"dest\" range] \"");
  1253.               linelim = strlen (line);
  1254.               insert_mode();
  1255.               break;
  1256. --- 1130,1158 ----
  1257.               break;
  1258.           case 'W':
  1259.               (void) sprintf (line, "write [\"dest\" range] \"");
  1260. +             if (*curfile)
  1261. +                        error ("Default file is \"%s.asc\"",curfile);
  1262.               linelim = strlen (line);
  1263.               insert_mode();
  1264.               break;
  1265.           case 'S':    /* set options */
  1266.               (void) sprintf (line, "set ");
  1267. !             error("Options:byrows,bycols,iterations=n,tblstyle=(0|tbl|latex|slatex|tex|frame),<MORE>");
  1268.               linelim = strlen (line);
  1269.               insert_mode();
  1270.               break;
  1271.           case 'T':    /* tbl output */
  1272.               (void) sprintf (line, "tbl [\"dest\" range] \"");
  1273. +             if (*curfile && tbl_style == 0)
  1274. +                        error ("Default file is \"%s.cln\"",curfile);
  1275. +                     else if (*curfile && tbl_style == TBL)
  1276. +                        error ("Default file is \"%s.tbl\"",curfile);
  1277. +                     else if (*curfile && tbl_style == LATEX)
  1278. +                        error ("Default file is \"%s.lat\"",curfile);
  1279. +                     else if (*curfile && tbl_style == SLATEX)
  1280. +                        error ("Default file is \"%s.stx\"",curfile);
  1281. +                     else if (*curfile && tbl_style == TEX)
  1282. +                        error ("Default file is \"%s.tex\"",curfile);
  1283.               linelim = strlen (line);
  1284.               insert_mode();
  1285.               break;
  1286. ***************
  1287. *** 1293,1299 ****
  1288.   signals()
  1289.   {
  1290.   #ifdef SIGVOID
  1291. !     void quit();
  1292.       void time_out();
  1293.       void dump_me();
  1294.   #ifdef    SIGWINCH
  1295. --- 1314,1320 ----
  1296.   signals()
  1297.   {
  1298.   #ifdef SIGVOID
  1299. !     void doquit();
  1300.       void time_out();
  1301.       void dump_me();
  1302.   #ifdef    SIGWINCH
  1303. ***************
  1304. *** 1300,1306 ****
  1305.       void winchg();
  1306.   #endif
  1307.   #else
  1308. !     int quit();
  1309.       int time_out();
  1310.       int dump_me();
  1311.   #ifdef    SIGWINCH
  1312. --- 1321,1327 ----
  1313.       void winchg();
  1314.   #endif
  1315.   #else
  1316. !     int doquit();
  1317.       int time_out();
  1318.       int dump_me();
  1319.   #ifdef    SIGWINCH
  1320. ***************
  1321. *** 1311,1322 ****
  1322.       (void) signal(SIGINT, SIG_IGN);
  1323.   #if !defined(MSDOS)
  1324.       (void) signal(SIGQUIT, dump_me);
  1325. !     (void) signal(SIGPIPE, quit);
  1326.       (void) signal(SIGALRM, time_out);
  1327. !     (void) signal(SIGBUS, quit);
  1328.   #endif
  1329. !     (void) signal(SIGTERM, quit);
  1330. !     (void) signal(SIGFPE, quit);
  1331.   #ifdef    SIGWINCH
  1332.       (void) signal(SIGWINCH, winchg);
  1333.   #endif
  1334. --- 1332,1343 ----
  1335.       (void) signal(SIGINT, SIG_IGN);
  1336.   #if !defined(MSDOS)
  1337.       (void) signal(SIGQUIT, dump_me);
  1338. !     (void) signal(SIGPIPE, doquit);
  1339.       (void) signal(SIGALRM, time_out);
  1340. !     (void) signal(SIGBUS, doquit);
  1341.   #endif
  1342. !     (void) signal(SIGTERM, doquit);
  1343. !     (void) signal(SIGFPE, doquit);
  1344.   #ifdef    SIGWINCH
  1345.       (void) signal(SIGWINCH, winchg);
  1346.   #endif
  1347. ***************
  1348. *** 1339,1345 ****
  1349.   #else
  1350.   int
  1351.   #endif
  1352. ! quit()
  1353.   {
  1354.       diesave();
  1355.       stopdisp();
  1356. --- 1360,1366 ----
  1357.   #else
  1358.   int
  1359.   #endif
  1360. ! doquit()
  1361.   {
  1362.       diesave();
  1363.       stopdisp();
  1364. *** ../619/sc.h    Mon Mar 16 10:09:44 1992
  1365. --- sc.h    Fri May  8 12:31:32 1992
  1366. ***************
  1367. *** 6,12 ****
  1368.    *            University of Maryland
  1369.    *        R. Bond  12/86
  1370.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1371. !  *        $Revision: 6.19 $
  1372.    *
  1373.    */
  1374.   
  1375. --- 6,12 ----
  1376.    *            University of Maryland
  1377.    *        R. Bond  12/86
  1378.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1379. !  *        $Revision: 6.21 $
  1380.    *
  1381.    */
  1382.   
  1383. ***************
  1384. *** 129,134 ****
  1385. --- 129,135 ----
  1386.   struct enode {
  1387.       int op;
  1388.       union {
  1389. +     int gram_match;         /* some compilers (hp9000ipc) need this */
  1390.       double k;        /* constant # */
  1391.       struct ent_ptr v;    /* ref. another cell */
  1392.       struct range_s r;    /* op is on a range */
  1393. ***************
  1394. *** 205,210 ****
  1395. --- 206,212 ----
  1396.   #define UPPER OP_BASE + 55
  1397.   #define LOWER OP_BASE + 56
  1398.   #define CAPITAL OP_BASE + 57
  1399. + #define NUMITER    OP_BASE + 58
  1400.   
  1401.   /* flag values */
  1402.   #define is_valid     0001
  1403. ***************
  1404. *** 233,238 ****
  1405. --- 235,241 ----
  1406.   #define    LATEX    2        /* 'LaTeX' */
  1407.   #define    TEX    3        /* 'TeX' */
  1408.   #define    SLATEX    4        /* 'SLaTeX' (Scandinavian LaTeX) */
  1409. + #define    FRAME    5        /* tblprint style output for FrameMaker */
  1410.   
  1411.   /* Types for etype() */
  1412.   #define NUM    1
  1413. ***************
  1414. *** 269,278 ****
  1415.   extern    char *coltoa();
  1416.   extern    char *findhome();
  1417.   extern    char *r_name();
  1418.   extern    char *strrchr();
  1419.   extern    char *v_name();
  1420. - extern    char *xmalloc();
  1421. - extern    char *xrealloc();
  1422.   extern    int any_locked_cells();
  1423.   extern    int are_ranges();
  1424.   extern    int atocol();
  1425. --- 272,281 ----
  1426.   extern    char *coltoa();
  1427.   extern    char *findhome();
  1428.   extern    char *r_name();
  1429. + extern    char *scxmalloc();
  1430. + extern    char *scxrealloc();
  1431.   extern    char *strrchr();
  1432.   extern    char *v_name();
  1433.   extern    int any_locked_cells();
  1434.   extern    int are_ranges();
  1435.   extern    int atocol();
  1436. ***************
  1437. *** 357,362 ****
  1438. --- 360,366 ----
  1439.   extern    void readfile();
  1440.   extern    void resetkbd();
  1441.   extern    void rowshow_op();
  1442. + extern    void scxfree();
  1443.   extern    void setauto();
  1444.   extern    void setiterations();
  1445.   extern    void setorder();
  1446. ***************
  1447. *** 376,382 ****
  1448.   extern    void write_fd();
  1449.   extern    void write_line();
  1450.   extern    void write_range();
  1451. - extern    void xfree();
  1452.   extern    void yyerror();
  1453.   #ifdef DOBACKUPS
  1454.   extern    int backup_file();
  1455. --- 380,385 ----
  1456. ***************
  1457. *** 383,393 ****
  1458. --- 386,399 ----
  1459.   #endif
  1460.   
  1461.   extern    int modflg;
  1462. + #if !defined(VMS) && !defined(MSDOS) && defined(CRYPT_PATH)
  1463.   extern    int Crypt;
  1464. + #endif
  1465.   extern    char *mdir;
  1466.   extern    double prescale;
  1467.   extern    int extfunc;
  1468.   extern    int propagation;
  1469. + extern    int repct;
  1470.   extern    int calc_order;
  1471.   extern    int autocalc;
  1472.   extern    int autolabel;
  1473. ***************
  1474. *** 415,418 ****
  1475. --- 421,426 ----
  1476.   #if defined(BSD42) || defined(BSD43) && !defined(ultrix)
  1477.   #define    memcpy(dest, source, len)    bcopy(source, dest, (unsigned int)len);
  1478.   #define    memset(dest, zero, len)        bzero((dest), (unsigned int)(len));
  1479. + #else
  1480. + #include <memory.h>
  1481.   #endif
  1482. *** ../619/screen.c    Mon Mar 16 10:09:45 1992
  1483. --- screen.c    Fri May  8 12:31:33 1992
  1484. ***************
  1485. *** 8,14 ****
  1486.    *              More mods Robert Bond, 12/86
  1487.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1488.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1489. !  *        $Revision: 6.19 $
  1490.    *
  1491.    */
  1492.   
  1493. --- 8,14 ----
  1494.    *              More mods Robert Bond, 12/86
  1495.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1496.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1497. !  *        $Revision: 6.21 $
  1498.    *
  1499.    */
  1500.   
  1501. ***************
  1502. *** 543,550 ****
  1503.       initkbd();
  1504.       scrollok(stdscr, 1);
  1505.   
  1506. ! #ifndef IDLOKBAD
  1507. ! # ifdef SYSV3
  1508.       /*
  1509.        * turn hardware insert/delete on, if possible.
  1510.        * turn on scrolling for systems with SYSVr3.{1,2} (SYSVr3.0 has this set
  1511. --- 543,550 ----
  1512.       initkbd();
  1513.       scrollok(stdscr, 1);
  1514.   
  1515. ! #if defined(SYSV3) && !defined(NOIDLOK)
  1516. ! # ifndef IDLOKBAD
  1517.       /*
  1518.        * turn hardware insert/delete on, if possible.
  1519.        * turn on scrolling for systems with SYSVr3.{1,2} (SYSVr3.0 has this set
  1520. ***************
  1521. *** 551,558 ****
  1522.        * as the default)
  1523.        */
  1524.        idlok(stdscr,TRUE);
  1525. ! # endif
  1526. ! #else    /*
  1527.        * This seems to fix (with an empty spreadsheet):
  1528.        *    a) Redrawing the bottom half of the screen when you
  1529.        *        move between row 9 <-> 10
  1530. --- 551,557 ----
  1531.        * as the default)
  1532.        */
  1533.        idlok(stdscr,TRUE);
  1534. ! # else    /*
  1535.        * This seems to fix (with an empty spreadsheet):
  1536.        *    a) Redrawing the bottom half of the screen when you
  1537.        *        move between row 9 <-> 10
  1538. ***************
  1539. *** 566,571 ****
  1540. --- 565,571 ----
  1541.        *     noticing the rows become 2, 3, 40, 41, 42... (etc).
  1542.        */
  1543.        idlok(stdscr,FALSE);
  1544. + # endif
  1545.   #endif
  1546.   
  1547.       FullUpdate++;
  1548. *** ../619/version.c    Mon Mar 16 10:09:45 1992
  1549. --- version.c    Fri May  8 12:31:33 1992
  1550. ***************
  1551. *** 4,7 ****
  1552.    * The part after the first colon, except the last char, appears on the screen.
  1553.    */
  1554.   
  1555. ! char *rev = "$Revision: 6.19 $";
  1556. --- 4,7 ----
  1557.    * The part after the first colon, except the last char, appears on the screen.
  1558.    */
  1559.   
  1560. ! char *rev = "$Revision: 6.21 $";
  1561. *** ../619/vi.c    Mon Mar 16 10:09:46 1992
  1562. --- vi.c    Fri May  8 12:31:34 1992
  1563. ***************
  1564. *** 1,7 ****
  1565.   /*    SC    A Spreadsheet Calculator
  1566.    *
  1567.    *    One line vi emulation
  1568. !  *    $Revision: 6.19 $
  1569.    */
  1570.   
  1571.   #include <sys/types.h>
  1572. --- 1,7 ----
  1573.   /*    SC    A Spreadsheet Calculator
  1574.    *
  1575.    *    One line vi emulation
  1576. !  *    $Revision: 6.21 $
  1577.    */
  1578.   
  1579.   #include <sys/types.h>
  1580. ***************
  1581. *** 104,109 ****
  1582. --- 104,110 ----
  1583.       case 'R':    replace_mode();            break;
  1584.       case 'X':    u_save(c); back_space();    break;
  1585.       case 'a':    u_save(c); append_line();    break;
  1586. +     case 'A':    u_save(c);last_col();append_line();    break;
  1587.       case 'b':    linelim = back_word();        break;
  1588.       case 'c':    u_save(c); change_cmd();    break;
  1589.       case 'd':    u_save(c); delete_cmd();    break;
  1590. ***************
  1591. *** 251,257 ****
  1592.       if (strlen(line)+1 > undolen)
  1593.       {    undolen = strlen(line)+40;
  1594.   
  1595. !     undo_line = xrealloc(undo_line, undolen);
  1596.       }
  1597.       (void) strcpy(undo_line, line);
  1598.   
  1599. --- 252,258 ----
  1600.       if (strlen(line)+1 > undolen)
  1601.       {    undolen = strlen(line)+40;
  1602.   
  1603. !     undo_line = scxrealloc(undo_line, undolen);
  1604.       }
  1605.       (void) strcpy(undo_line, line);
  1606.   
  1607. ***************
  1608. *** 278,284 ****
  1609.   
  1610.       if (strlen(line)+1 > templen)
  1611.       {    templen = strlen(line)+40;
  1612. !     tempc = xrealloc(tempc, templen);
  1613.       }
  1614.   
  1615.       strcpy(tempc, line);
  1616. --- 279,285 ----
  1617.   
  1618.       if (strlen(line)+1 > templen)
  1619.       {    templen = strlen(line)+40;
  1620. !     tempc = scxrealloc(tempc, templen);
  1621.       }
  1622.   
  1623.       strcpy(tempc, line);
  1624. ***************
  1625. *** 595,601 ****
  1626.   
  1627.       if (history[lasthist].len < strlen(line)+1)
  1628.       {    history[lasthist].len = strlen(line)+40;
  1629. !     history[lasthist].histline = xrealloc(history[lasthist].histline,
  1630.                             history[lasthist].len);
  1631.       }
  1632.       (void) strcpy(history[lasthist].histline, line);
  1633. --- 596,602 ----
  1634.   
  1635.       if (history[lasthist].len < strlen(line)+1)
  1636.       {    history[lasthist].len = strlen(line)+40;
  1637. !     history[lasthist].histline = scxrealloc(history[lasthist].histline,
  1638.                             history[lasthist].len);
  1639.       }
  1640.       (void) strcpy(history[lasthist].histline, line);
  1641. ***************
  1642. *** 636,642 ****
  1643.   
  1644.       if (strlen(line)+1 > lastsrchlen)
  1645.       {    lastsrchlen = strlen(line)+40;
  1646. !     last_search = xrealloc(last_search, lastsrchlen);
  1647.       }
  1648.       (void)strcpy(last_search, line+1);
  1649.       search_again();
  1650. --- 637,643 ----
  1651.   
  1652.       if (strlen(line)+1 > lastsrchlen)
  1653.       {    lastsrchlen = strlen(line)+40;
  1654. !     last_search = scxrealloc(last_search, lastsrchlen);
  1655.       }
  1656.       (void)strcpy(last_search, line+1);
  1657.       search_again();
  1658. *** ../619/vmtbl.c    Mon Mar 16 10:09:47 1992
  1659. --- vmtbl.c    Fri May  8 12:31:35 1992
  1660. ***************
  1661. *** 8,14 ****
  1662.    *              More mods Robert Bond, 12/86
  1663.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1664.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1665. !  *        $Revision: 6.19 $
  1666.    *
  1667.    */
  1668.   #ifdef PSC
  1669. --- 8,14 ----
  1670.    *              More mods Robert Bond, 12/86
  1671.    *        More mods by Alan Silverstein, 3-4/88, see list of changes.
  1672.    *        Currently supported by sequent!sawmill!buhrt (Jeff Buhrt)
  1673. !  *        $Revision: 6.21 $
  1674.    *
  1675.    */
  1676.   #ifdef PSC
  1677. ***************
  1678. *** 54,62 ****
  1679.   }
  1680.   #endif /* !PSC */
  1681.       
  1682. ! /* xrealloc will just xmalloc if oldptr is == NULL */
  1683.   #define GROWALLOC(newptr, oldptr, nelem, type, msg) \
  1684. !     newptr = (type *)xrealloc((char *)oldptr, \
  1685.                        (unsigned)(nelem*sizeof(type))); \
  1686.       if (newptr == (type *)NULL) \
  1687.       {   error(msg); \
  1688. --- 54,62 ----
  1689.   }
  1690.   #endif /* !PSC */
  1691.       
  1692. ! /* scxrealloc will just scxmalloc if oldptr is == NULL */
  1693.   #define GROWALLOC(newptr, oldptr, nelem, type, msg) \
  1694. !     newptr = (type *)scxrealloc((char *)oldptr, \
  1695.                        (unsigned)(nelem*sizeof(type))); \
  1696.       if (newptr == (type *)NULL) \
  1697.       {   error(msg); \
  1698. ***************
  1699. *** 177,183 ****
  1700.           /* [re]alloc the space for each row */
  1701.           for (i = 0; i < maxrows; i++)
  1702.           {
  1703. !             if ((tbl[i] = (struct ent **)xrealloc((char *)tbl[i],
  1704.               (unsigned)(newcols * sizeof(struct ent **)))) == (struct ent **)0)
  1705.               {    error(nowider);
  1706.                   return(FALSE);
  1707. --- 177,183 ----
  1708.           /* [re]alloc the space for each row */
  1709.           for (i = 0; i < maxrows; i++)
  1710.           {
  1711. !             if ((tbl[i] = (struct ent **)scxrealloc((char *)tbl[i],
  1712.               (unsigned)(newcols * sizeof(struct ent **)))) == (struct ent **)0)
  1713.               {    error(nowider);
  1714.                   return(FALSE);
  1715. ***************
  1716. *** 195,201 ****
  1717.   
  1718.       /* fill in the bottom of the table */
  1719.       for (; i < newrows; i++)
  1720. !     {    if ((tbl[i] = (struct ent **)xmalloc((unsigned)(newcols *
  1721.                   sizeof(struct ent **)))) == (struct ent **)0)
  1722.           {    error(nowider);
  1723.               return(FALSE);
  1724. --- 195,201 ----
  1725.   
  1726.       /* fill in the bottom of the table */
  1727.       for (; i < newrows; i++)
  1728. !     {    if ((tbl[i] = (struct ent **)scxmalloc((unsigned)(newcols *
  1729.                   sizeof(struct ent **)))) == (struct ent **)0)
  1730.           {    error(nowider);
  1731.               return(FALSE);
  1732. *** ../619/xmalloc.c    Mon Mar 16 10:09:47 1992
  1733. --- xmalloc.c    Fri May  8 12:31:35 1992
  1734. ***************
  1735. *** 1,6 ****
  1736.   /*
  1737.    * A safer saner malloc, for careless programmers
  1738. !  * $Revision: 6.19 $
  1739.    */
  1740.   
  1741.   #include <stdio.h>
  1742. --- 1,6 ----
  1743.   /*
  1744.    * A safer saner malloc, for careless programmers
  1745. !  * $Revision: 6.21 $
  1746.    */
  1747.   
  1748.   #include <stdio.h>
  1749. ***************
  1750. *** 17,32 ****
  1751.   extern void exit();
  1752.   #endif
  1753.   
  1754. ! #define    MAGIC    (double)1234567890.1234456789
  1755.   
  1756.   char *
  1757. ! xmalloc(n)
  1758.   unsigned n;
  1759.   {
  1760.       register char *ptr;
  1761.   
  1762.       if ((ptr = malloc(n + sizeof(double))) == NULL)
  1763. !         fatal("xmalloc: no memory");
  1764.       *((double *) ptr) = MAGIC;        /* magic number */
  1765.       return(ptr + sizeof(double));
  1766.   }
  1767. --- 17,32 ----
  1768.   extern void exit();
  1769.   #endif
  1770.   
  1771. ! #define    MAGIC    (double)1234567890.12344
  1772.   
  1773.   char *
  1774. ! scxmalloc(n)
  1775.   unsigned n;
  1776.   {
  1777.       register char *ptr;
  1778.   
  1779.       if ((ptr = malloc(n + sizeof(double))) == NULL)
  1780. !         fatal("scxmalloc: no memory");
  1781.       *((double *) ptr) = MAGIC;        /* magic number */
  1782.       return(ptr + sizeof(double));
  1783.   }
  1784. ***************
  1785. *** 33,64 ****
  1786.   
  1787.   /* we make sure realloc will do a malloc if needed */
  1788.   char *
  1789. ! xrealloc(ptr, n)
  1790.   char    *ptr;
  1791.   unsigned n;
  1792.   {
  1793.       if (ptr == NULL)
  1794. !         return(xmalloc(n));
  1795.   
  1796.       ptr -= sizeof(double);
  1797.       if (*((double *) ptr) != MAGIC)
  1798. !         fatal("xrealloc: storage not xmalloc'ed");
  1799.   
  1800.       if ((ptr = realloc(ptr, n + sizeof(double))) == NULL)
  1801. !         fatal("xmalloc: no memory");
  1802.       *((double *) ptr) = MAGIC;        /* magic number */
  1803.       return(ptr + sizeof(double));
  1804.   }
  1805.   
  1806.   void
  1807. ! xfree(p)
  1808.   char *p;
  1809.   {
  1810.       if (p == NULL)
  1811. !         fatal("xfree: NULL");
  1812.       p -= sizeof(double);
  1813.       if (*((double *) p) != MAGIC)
  1814. !         fatal("xfree: storage not malloc'ed");
  1815.       free(p);
  1816.   }
  1817.   
  1818. --- 33,64 ----
  1819.   
  1820.   /* we make sure realloc will do a malloc if needed */
  1821.   char *
  1822. ! scxrealloc(ptr, n)
  1823.   char    *ptr;
  1824.   unsigned n;
  1825.   {
  1826.       if (ptr == NULL)
  1827. !         return(scxmalloc(n));
  1828.   
  1829.       ptr -= sizeof(double);
  1830.       if (*((double *) ptr) != MAGIC)
  1831. !         fatal("scxrealloc: storage not scxmalloc'ed");
  1832.   
  1833.       if ((ptr = realloc(ptr, n + sizeof(double))) == NULL)
  1834. !         fatal("scxmalloc: no memory");
  1835.       *((double *) ptr) = MAGIC;        /* magic number */
  1836.       return(ptr + sizeof(double));
  1837.   }
  1838.   
  1839.   void
  1840. ! scxfree(p)
  1841.   char *p;
  1842.   {
  1843.       if (p == NULL)
  1844. !         fatal("scxfree: NULL");
  1845.       p -= sizeof(double);
  1846.       if (*((double *) p) != MAGIC)
  1847. !         fatal("scxfree: storage not malloc'ed");
  1848.       free(p);
  1849.   }
  1850.   
  1851.  
  1852.