home *** CD-ROM | disk | FTP | other *** search
- /* SC A Spreadsheet Calculator
- * Lexical analyser
- *
- * original by James Gosling, September 1982
- * modifications by Mark Weiser and Bruce Israel,
- * University of Maryland
- *
- * More mods Robert Bond, 12/86
- * Major mods to run on VMS and AMIGA, 1/17/87
- *
- */
-
-
-
- #include "sc.h"
- #include <ctype.h>
- #ifdef VMS
- #include "y_tab.h"
- #else
- #ifdef TOS
- #include "y_tab.h"
- #else
- #include "y.tab.h"
- #endif
- #endif
-
- extern char *malloc();
- char *strtof();
-
- struct key {
- char *key;
- int val;
- };
-
- struct key experres[] = {
- #include "experres.h"
- 0, 0};
-
- struct key statres[] = {
- #include "statres.h"
- 0, 0};
-
- #define ctl(x) ('x'&037)
-
- yylex () {
- register char *p = line+linelim;
- int ret = -1;
- while (isspace(*p)) p++;
- if (*p==0) ret = -1;
- else if (isalpha(*p)) {
- char *tokenst = p;
- register tokenl;
- register struct key *tbl;
- while (isalpha(*p)) p++;
- if (p-tokenst <= 2) { /* a COL is 1 or 2 char alpha */
- register col;
- ret = COL;
- col = ((tokenst[0] & 0137) - 'A');
- if (p == tokenst+2)
- col = (col + 1)*26 + ((tokenst[1] & 0137) - 'A');
- yylval.ival = col;
- } else {
- ret = WORD;
- tokenl = p-tokenst;
- for (tbl = linelim ? experres : statres; tbl->key; tbl++)
- if (((tbl->key[0]^tokenst[0])&0137)==0
- && tbl->key[tokenl]==0) {
- register i = 1;
- while (i<tokenl && ((tokenst[i]^tbl->key[i])&0137)==0)
- i++;
- if (i>=tokenl) {
- ret = tbl->val;
- break;
- }
- }
- if (ret==WORD) {
- linelim = p-line;
- yyerror ("Unintelligible word");
- }
- }
- } else if ((*p == '.') || isdigit(*p)) {
- register long v = 0;
- char *nstart = p;
- if (*p != '.') {
- do v = v*10 + (*p-'0');
- while (isdigit(*++p));
- }
- if (*p=='.' || *p == 'e' || *p == 'E') {
- ret = FNUMBER;
- p = strtof(nstart, &yylval.fval);
- } else {
- if((int)v != v)
- {
- ret = FNUMBER;
- yylval.fval = v;
- }
- else
- {
-
- ret = NUMBER;
- yylval.ival = v;
- }
- }
- } else if (*p=='"') {
- /* This storage is never freed. Oh well. -MDW */
- char *ptr;
- ptr = p+1;
- while(*ptr && *ptr++ != '"');
- ptr = (char *)malloc((unsigned)(ptr-p));
- yylval.sval = ptr;
- p += 1;
- while (*p && *p!='"') *ptr++ = *p++;
- *ptr = 0;
- if (*p) p += 1;
- ret = STRING;
- } else if (*p=='[') {
- while (*p && *p!=']') p++;
- if (*p) p++;
- linelim = p-line;
- return yylex();
- } else ret = *p++;
- linelim = p-line;
- return ret;
- }
-
- #define N_KEY 26
-
- struct key_map {
- char *k_str;
- char k_val;
- char k_index;
- };
-
- struct key_map km[N_KEY];
-
- initkbd()
- {
- int i;
-
- /* cursor set mode */
- km[0].k_str = "\033OD"; km[0].k_val = ctl(b);
- km[1].k_str = "\033OC"; km[1].k_val = ctl(f);
- km[2].k_str = "\033OA"; km[2].k_val = ctl(p);
- km[3].k_str = "\033OB"; km[3].k_val = ctl(n);
- /* cursor reset mode */
- km[4].k_str = "\033[D"; km[4].k_val = ctl(b);
- km[5].k_str = "\033[C"; km[5].k_val = ctl(f);
- km[6].k_str = "\033[A"; km[6].k_val = ctl(p);
- km[7].k_str = "\033[B"; km[7].k_val = ctl(n);
- /* CSI arrows */
- km[8].k_str = "\233D"; km[8].k_val = ctl(b);
- km[9].k_str = "\233C"; km[9].k_val = ctl(f);
- km[10].k_str = "\233A"; km[10].k_val = ctl(p);
- km[11].k_str = "\233B"; km[11].k_val = ctl(n);
- /* application keypad mode */
- km[12].k_str = "\033Op"; km[12].k_val = '0';
- km[13].k_str = "\033Oq"; km[13].k_val = '1';
- km[14].k_str = "\033Or"; km[14].k_val = '2';
- km[15].k_str = "\033Os"; km[15].k_val = '3';
- km[16].k_str = "\033Ot"; km[16].k_val = '4';
- km[17].k_str = "\033Ou"; km[17].k_val = '5';
- km[18].k_str = "\033Ov"; km[18].k_val = '6';
- km[19].k_str = "\033Ow"; km[19].k_val = '7';
- km[20].k_str = "\033Ox"; km[20].k_val = '8';
- km[21].k_str = "\033Oy"; km[21].k_val = '9';
- km[22].k_str = "\033Om"; km[22].k_val = '-';
- km[23].k_str = "\033Ol"; km[23].k_val = ',';
- km[24].k_str = "\033On"; km[24].k_val = '.';
- km[25].k_str = "\033OM"; km[25].k_val = ctl(m);
- }
-
- nmgetch()
- {
- register int c;
- register struct key_map *kp;
- register struct key_map *biggest;
- register int i;
- int almost;
- int maybe;
-
- static char dumpbuf[10];
- static char *dumpindex;
-
- void timeout();
-
- if (dumpindex && *dumpindex)
- return (*dumpindex++);
-
- c = ttgetc();
- biggest = 0;
- almost = 0;
-
- for (kp = &km[0]; kp < &km[N_KEY]; kp++) {
- if (!kp->k_str)
- continue;
- if (c == (kp->k_str[kp->k_index] & 0xFF)) {
- almost = 1;
- kp->k_index++;
- if (kp->k_str[kp->k_index] == 0) {
- c = kp->k_val;
- for (kp = &km[0]; kp < &km[N_KEY]; kp++)
- kp->k_index = 0;
- return(c);
- }
- }
- if (!biggest && kp->k_index)
- biggest = kp;
- else if (kp->k_index && biggest->k_index < kp->k_index)
- biggest = kp;
- }
-
- if (almost) return(nmgetch());
-
- if (biggest) {
- for (i = 0; i<biggest->k_index; i++)
- dumpbuf[i] = biggest->k_str[i];
- dumpbuf[i++] = c;
- dumpbuf[i] = 0;
- dumpindex = &dumpbuf[1];
- for (kp = &km[0]; kp < &km[N_KEY]; kp++)
- kp->k_index = 0;
- return (dumpbuf[0]);
- }
-
- return(c);
- }
-
-
- int dbline;
-
- debug (fmt, a, b, c) {
- move(2+(dbline++%22),80-60);
- printw(fmt,a,b,c);
- clrtoeol();
- }
-
- /*
- * This converts a floating point number of the form
- * [s]ddd[.d*][esd*] where s can be a + or - and e is E or e.
- * to floating point.
- * p is advanced.
- */
-
- char *
- strtof(p, res)
- register char *p;
- double *res;
- {
- double acc;
- int sign;
- double fpos;
- int exp;
- int exps;
-
- acc = 0.0;
- sign = 1;
- exp = 0;
- exps = 1;
- if (*p == '+')
- p++;
- else if (*p == '-') {
- p++;
- sign = -1;
- }
- while (isdigit(*p)) {
- acc = acc * 10.0 + (double)(*p - '0');
- p++;
- }
- if (*p == 'e' || *p == 'E') {
- p++;
- if (*p == '+')
- p++;
- else if (*p == '-') {
- p++;
- exps = -1;
- }
- while(isdigit(*p)) {
- exp = exp * 10 + (*p - '0');
- p++;
- }
- }
- if (*p == '.') {
- fpos = 1.0/10.0;
- p++;
- while(isdigit(*p)) {
- acc += (*p - '0') * fpos;
- fpos *= 1.0/10.0;
- p++;
- }
- }
- if (*p == 'e' || *p == 'E') {
- exp = 0;
- exps = 1;
- p++;
- if (*p == '+')
- p++;
- else if (*p == '-') {
- p++;
- exps = -1;
- }
- while(isdigit(*p)) {
- exp = exp * 10 + (*p - '0');
- p++;
- }
- }
- if (exp) {
- if (exps > 0)
- while (exp--)
- acc *= 10.0;
- else
- while (exp--)
- acc *= 1.0/10.0;
- }
- if (sign > 0)
- *res = acc;
- else
- *res = -acc;
-
- return(p);
- }
-
- help () {
- move(2,0);
- clrtobot();
- dbline = 0;
- debug (" Cursor cmds:");
- debug (" ^n j next row ^p k prev. row ^g erase cmd");
- debug (" ^f l fwd col ^b h back col ^r redraw screen");
- debug (" 0 $ first, end col");
- debug (" Cell cmds:");
- debug (" \" < > enter label = enter value x clear cell");
- debug (" c copy cell m mark cell ^t line 1 on/off");
- debug (" ^a type value ^e type expr. ^v type vbl name");
- debug (" Row, Column cmds:");
- debug (" ar ac dup ir ic insert sr sc show");
- debug (" dr dc delete zr zc hide pr pc pull");
- debug (" vr vc value only f format");
- debug (" File cmds:");
- debug (" G get database M merge database T write tbl fmt");
- debug (" P put database W write listing");
- debug (" Misc. cmds:");
- debug (" ^c, q quit / copy region pm pull (merge)");
- debug (" Expression Operators");
- debug (" +-*/ arithmetic ?e:e conditional & | booleans");
- debug (" < = > relations <= >= relations != relations");
- debug (" @sum(v1:v2) @avg(v1:v2) @prod(v1:v2)");
- }
-