Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83 (MC840302); site chalmers.UUCP Path: utzoo!linus!philabs!cmcl2!seismo!mcvax!enea!chalmers!bernerus From: bernerus@chalmers.UUCP (Christer Bernerus) Newsgroups: net.sources Subject: vc hacks Message-ID: <263@chalmers.UUCP> Date: Fri, 8-Mar-85 15:05:52 EST Article-I.D.: chalmers.263 Posted: Fri Mar 8 15:05:52 1985 Date-Received: Tue, 12-Mar-85 07:53:58 EST Reply-To: bernerus@chalmers.UUCP (Christer Bernerus) Organization: Dept. of CS, Chalmers, Sweden Lines: 1175 The number of requests for the vc hacks was amazing! Here they are, the bug reports published on the net was installed befor I started my hacking, so you might have to fix those bugs first. I also corrected a bug that caused all constants to be set to zero when a line was copied with ^J. Chris. ----------------------------------------------------------------------- *** /tmp/,RCSt1009610 Fri Mar 8 14:54:45 1985 --- gram.y Fri Mar 8 14:48:33 1985 *************** *** 44,73 %token S_PROGLET %token K_EXEC %token K_FIXED - %token K_EXP - %token K_LOG - %token K_LOGD - %token K_POW - %token K_SQRT - %token K_FIXED - %token K_FLOOR - %token K_CEIL - %token K_HYPOT - %token K_FABS - %token K_SIN - %token K_COS - %token K_ASIN - %token K_ACOS - %token K_ATAN - %token K_ATANII - %token K_DTR - %token K_RTD - %token K_SINH - %token K_COSH - %token K_TANH - %token K_PI - %token K_MAX - %token K_MIN %token K_R %token K_C --- 44,49 ----- %token S_PROGLET %token K_EXEC %token K_FIXED %token K_R %token K_C *************** *** 76,83 %left '&' %nonassoc '<' '=' '>' %left '+' '-' ! %left '*' '/' '%' ! %left '^' %% command: S_LET var '=' e { let ($2, $4); } --- 52,58 ----- %left '&' %nonassoc '<' '=' '>' %left '+' '-' ! %left '*' '/' %% command: S_LET var '=' e { let ($2, $4); } *************** *** 118,124 | '-' term { $$ = new ('m', 0, $2); } | NUMBER { $$ = new ('k', (double) $1); } | FNUMBER { $$ = new ('k', $1); } - | K_PI { $$ = new ('X',0,0); } | '~' term { $$ = new ('~', 0, $2); } | '!' term { $$ = new ('~', 0, $2); } ; --- 93,98 ----- | '-' term { $$ = new ('m', 0, $2); } | NUMBER { $$ = new ('k', (double) $1); } | FNUMBER { $$ = new ('k', $1); } | '~' term { $$ = new ('~', 0, $2); } | '!' term { $$ = new ('~', 0, $2); } ; *************** *** 127,134 | e '-' e { $$ = new ('-', $1, $3); } | e '*' e { $$ = new ('*', $1, $3); } | e '/' e { $$ = new ('/', $1, $3); } - | e '%' e { $$ = new ('%', $1, $3); } - | e '^' e { $$ = new ('^', $1, $3); } | term | e '?' e ':' e { $$ = new ('?', $1, new(':', $3, $5)); } | e '<' e { $$ = new ('<', $1, $3); } --- 101,106 ----- | e '-' e { $$ = new ('-', $1, $3); } | e '*' e { $$ = new ('*', $1, $3); } | e '/' e { $$ = new ('/', $1, $3); } | term | e '?' e ':' e { $$ = new ('?', $1, new(':', $3, $5)); } | e '<' e { $$ = new ('<', $1, $3); } *************** *** 139,172 | e '<' '=' e { $$ = new ('~', 0, new ('>', $1, $4)); } | e '!' '=' e { $$ = new ('~', 0, new ('=', $1, $4)); } | e '>' '=' e { $$ = new ('~', 0, new ('<', $1, $4)); } - | K_EXP '(' e ')' { $$ = new ('E', 0, $3);} - | K_LOG '(' e ')' { $$ = new ('N', 0, $3);} - | K_LOGD '(' e ')'{ $$ = new ('L', 0, $3);} - | K_POW '(' e ',' e ')' - { $$ = new ('P', $5, $3);} - | K_SQRT '(' e ')'{ $$ = new ('Q', 0, $3);} - | K_FLOOR '(' e ')' - { $$ = new ('F', 0, $3);} - | K_CEIL '(' e ')'{ $$ = new ('C', 0, $3);} - | K_FABS '(' e ')'{ $$ = new ('A', 0, $3);} - | K_HYPOT '(' e ',' e ')' - { $$ = new ('H', $5, $3);} - | K_SIN '(' e ')' { $$ = new ('S', 0, $3);} - | K_COS '(' e ')' { $$ = new ('T', 0, $3);} - | K_ASIN '(' e ')'{ $$ = new ('B', 0, $3);} - | K_ACOS '(' e ')'{ $$ = new ('U', 0, $3);} - | K_ATAN '(' e ')'{ $$ = new ('I', 0, $3);} - | K_ATANII '(' e ',' e ')' - { $$ = new ('J', $5, $3);} - | K_DTR '(' e ')' { $$ = new ('R', 0, $3);} - | K_RTD '(' e ')' { $$ = new ('D', 0, $3);} - | K_SINH '(' e ')'{ $$ = new ('K', 0, $3);} - | K_COSH '(' e ')'{ $$ = new ('M', 0, $3);} - | K_TANH '(' e ')'{ $$ = new ('O', 0, $3);} - | K_MAX '(' e ',' e ')' - { $$ = new ('V', $5, $3);} - | K_MIN '(' e ',' e ')' - { $$ = new ('W', $5, $3);} ; row: K_R NUMBER { $$ = $2; }; --- 111,116 ----- | e '<' '=' e { $$ = new ('~', 0, new ('>', $1, $4)); } | e '!' '=' e { $$ = new ('~', 0, new ('=', $1, $4)); } | e '>' '=' e { $$ = new ('~', 0, new ('<', $1, $4)); } ; row: K_R NUMBER { $$ = $2; }; *** /tmp/,RCSt1009610 Fri Mar 8 14:54:52 1985 --- interp.c Fri Mar 8 14:52:10 1985 *************** *** 8,14 #include "sc.h" #include - #include #define DEFCOLDELIM ':' double pi(),dtr(),rtd(); --- 8,13 ----- #include "sc.h" #include #define DEFCOLDELIM ':' char *malloc(); *************** *** 11,17 #include #define DEFCOLDELIM ':' - double pi(),dtr(),rtd(); char *malloc(); double eval(e) --- 10,15 ----- #include #define DEFCOLDELIM ':' char *malloc(); double eval(e) *************** *** 35,74 case '~': return (!eval(e->e.o.right)); case 'k': return (e->e.k); case 'v': return (e->e.v->v); - case 'E': return (exp(eval(e->e.o.right))); - case 'N': return (log(eval(e->e.o.right))); - case 'L': return (log10(eval(e->e.o.right))); - case 'P': return (pow(eval(e->e.o.right),eval(e->e.o.left))); - case 'Q': return (sqrt(eval(e->e.o.right))); - case 'F': return (floor(eval(e->e.o.right))); - case 'C': return (ceil(eval(e->e.o.right))); - case 'A': return (fabs(eval(e->e.o.right))); - case 'H': return (hypot(eval(e->e.o.right),eval(e->e.o.left))); - case 'S': return (sin(eval(e->e.o.right))); - case 'T': return (cos(eval(e->e.o.right))); - case 'B': return (asin(eval(e->e.o.right))); - case 'U': return (acos(eval(e->e.o.right))); - case 'I': return (atan(eval(e->e.o.right))); - case 'J': return (atan2(eval(e->e.o.right),eval(e->e.o.left))); - case 'R': return (dtr(eval(e->e.o.right))); - case 'D': return (rtd(eval(e->e.o.right))); - case 'K': return (sinh(eval(e->e.o.right))); - case 'M': return (cosh(eval(e->e.o.right))); - case 'O': return (tanh(eval(e->e.o.right))); - case 'V': { - register double left,right; - left = eval(e->e.o.left); - right= eval(e->e.o.right); - return left>right?left:right; - } - case 'W': { - register double left,right; - left = eval(e->e.o.left); - right= eval(e->e.o.right); - return lefte.o.left), eval(e->e.o.right))); case 'p': return (executeprogram(e)); case O_REDUCE('+'): case O_REDUCE('*'): --- 33,38 ----- case '~': return (!eval(e->e.o.right)); case 'k': return (e->e.k); case 'v': return (e->e.v->v); case 'p': return (executeprogram(e)); case O_REDUCE('+'): case O_REDUCE('*'): *************** *** 103,122 #define MAXPROP 7 - double pi() - { - return 3.14159265358979323846264338327950288419716939937511; - } - double dtr(x) double x; - { - return (pi() * x / 180.0); - } - double rtd(x) double x; - { - return (180.0 * x / pi()); - } - - EvalAll () { int lastct,repct = 0; --- 67,72 ----- #define MAXPROP 7 EvalAll () { int lastct,repct = 0; *************** *** 254,259 } if (mypriorityop) { case '~': line[linelim++] = '~'; decompile (e->e.o.right, 30); break; --- 204,218 ----- } if (mypriorityop) { + case 'f': { register char *s; + for (s="fixed "; line[linelim++] = *s++;); + linelim--; + decompile (e->e.o.right, 30); + break; + } + case 'm': line[linelim++] = '-'; + decompile (e->e.o.right, 30); + break; case '~': line[linelim++] = '~'; decompile (e->e.o.right, 30); break; *************** *** 257,262 case '~': line[linelim++] = '~'; decompile (e->e.o.right, 30); break; case O_REDUCE('+'): case O_REDUCE('*'): line[linelim++] = e->op&0177; --- 216,226 ----- case '~': line[linelim++] = '~'; decompile (e->e.o.right, 30); break; + case 'v': decodev (e->e.v); + break; + case 'k': sprintf (line+linelim,"%g",e->e.k); + linelim += strlen (line+linelim); + break; case O_REDUCE('+'): case O_REDUCE('*'): line[linelim++] = e->op&0177; *************** *** 291,456 line[linelim++] = ')'; break; } - #define emit(x) for(s=x;line[linelim++] = *s++;);linelim-- - case 'f': { register char *s; - emit("fixed "); - decompile (e->e.o.right, 30); - break; - } - case 'E': { register char *s; - emit("EXP("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'N': { register char *s; - emit("LOG("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'L': { register char *s; - emit("LOGD("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'P': { register char *s; - emit("POW("); - decompile(e->e.o.right, 30); - emit(","); - decompile(e->e.o.left,30); - emit(")"); - break; - } - case 'Q': { register char *s; - emit("SQRT("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'F': { register char *s; - emit("FLOOR("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'C': { register char *s; - emit("CEIL("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'A': { register char *s; - emit("FABS("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'H': { register char *s; - emit("HYPOT("); - decompile(e->e.o.right, 30); - emit(","); - decompile(e->e.o.left,30); - emit(")"); - break; - } - case 'S': { register char *s; - emit("SIN("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'T': { register char *s; - emit("COS("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'B': { register char *s; - emit("ASIN("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'U': { register char *s; - emit("ACOS("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'I': { register char *s; - emit("ATAN("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'J': { register char *s; - emit("ATANII("); - decompile (e->e.o.right, 30); - emit(","); - decompile (e->e.o.left, 30); - emit(")"); - break; - } - case 'R': { register char *s; - emit("DTR("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'D': { register char *s; - emit("RTD("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'K': { register char *s; - emit("SINH("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'M': { register char *s; - emit("COSH("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'O': { register char *s; - emit("TANH("); - decompile (e->e.o.right, 30); - emit(")"); - break; - } - case 'V': { register char *s; - emit("MAX("); - decompile(e->e.o.right, 30); - emit(","); - decompile(e->e.o.left,30); - emit(")"); - break; - } - case 'W': { register char *s; - emit("MIN("); - decompile(e->e.o.right, 30); - emit(","); - decompile(e->e.o.left,30); - emit(")"); - break; - } - case 'X': { register char *s; - emit("PI"); - break; - } - case 'm': line[linelim++] = '-'; - decompile (e->e.o.right, 30); - break; - case 'v': decodev (e->e.v); - break; - case 'k': sprintf (line+linelim,"%g",e->e.k); - linelim += strlen (line+linelim); - break; default: decompile (e->e.o.left, mypriority); line[linelim++] = e->op; decompile (e->e.o.right, mypriority+1); --- 255,260 ----- line[linelim++] = ')'; break; } default: decompile (e->e.o.left, mypriority); line[linelim++] = e->op; decompile (e->e.o.right, mypriority+1); *************** *** 574,580 ret->e.v = lookat (e->e.v->row+Rdelta, e->e.v->col+Cdelta); break; case 'k': - ret->e.k = e->e.k; break; case 'f': ret->e.o.right = copye (e->e.o.right,0,0); --- 378,383 ----- ret->e.v = lookat (e->e.v->row+Rdelta, e->e.v->col+Cdelta); break; case 'k': break; case 'f': ret->e.o.right = copye (e->e.o.right,0,0); *** /tmp/,RCSt1009610 Fri Mar 8 14:55:01 1985 --- lex.c Fri Mar 8 14:52:11 1985 *************** *** 94,105 if (*p) p++; linelim = p-line; return yylex(); ! } else if(*p == '*' && *(p+1) == '*') ! { ! ret = '^'; ! p+=2; ! } ! else ret = *p++; linelim = p-line; return ret; } --- 94,100 ----- if (*p) p++; linelim = p-line; return yylex(); ! } else ret = *p++; linelim = p-line; return ret; } *************** *** 108,114 int dbline; debug (fmt, a, b, c) { ! mvprintw (1+(dbline++%23),14,fmt,a,b,c); clrtoeol(); } --- 103,109 ----- int dbline; debug (fmt, a, b, c) { ! mvprintw (2+(dbline++%22),40,fmt,a,b,c); clrtoeol(); } *************** *** 112,119 clrtoeol(); } ! help () ! { dbline = 0; debug (" ***** Functions ****** *********** Commands ********************"); debug (" EXP(e) exponential j,^N next row k,^P previous row"); --- 107,113 ----- clrtoeol(); } ! help () { dbline = 0; /* "====================!===================" */ debug ("|^N next row ^P previous row"); *************** *** 115,141 help () { dbline = 0; ! debug (" ***** Functions ****** *********** Commands ********************"); ! debug (" EXP(e) exponential j,^N next row k,^P previous row"); ! debug (" LOG(e) natural log ^A type var value ^E type var expr"); ! debug (" LOGD(e) Base 10 log l,^F next column h,^B previous column"); ! debug (" POW(e,e) power function ^R redraw screen ? help (this msg)"); ! debug (" SQRT(e) square root ^C exit ^G erase command"); ! debug (" FLOOR(e) last integer DEL,^H erase char ^L fix screen"); ! debug (" CEIL(e) next integer ^J open new row ^V type var name"); ! debug (" FABS(e) absolute value = enter new value ? help (this msg)"); ! debug (" HYPOT(e,e) trig. dist. \" label e edit value"); ! debug (" PI value of pi. < left flush str > right flush str"); ! debug (" SIN(e) sine function g get database p put database"); ! debug (" COS(e) cosine function w write listing f set format"); ! debug (" ATAN(e) arc tangent O,r open row here c open col here"); ! debug (" ATANII(e,e) arc tangent C clear entry T write tbl fmt"); ! debug (" DTR(e) degrees to rad. d delete this row D delete this col"); ! debug (" RTD(e) rad. to degrees E edit string M merge in database"); ! debug (" SINH(e) sine hyp fnc ***************operators*****************"); ! debug (" COSH(e) cosine hyp fnc +,-,*,/ add,subtract,multiply,divide"); ! debug (" TANH(e) tangent hyp e%%e modulo op e**e power op."); ! debug (" MAX(e,e) maximum fnc +/v:v sum region e^e power op."); ! debug (" MIN(e,e) minimum fnc */v:v multiply region e?e:e conditional"); ! debug (" <,=,>,<=,>= relations &,| booleans"); } --- 109,135 ----- help () { dbline = 0; ! /* "====================!===================" */ ! debug ("|^N next row ^P previous row"); ! debug ("|^F next column ^B previous column"); ! debug ("|^C exit ^G erase command"); ! debug ("|DEL,^H erase char ^L fix screen"); ! debug ("|^J open new row ^V type var name"); ! debug ("|^A type var value ^E type var expr"); ! debug ("|^R redraw screen ? help (this msg)"); ! debug ("|"); ! debug ("|= enter new value C clear entry"); ! debug ("|\" label f set format"); ! debug ("|< left flush str > right flush str"); ! debug ("|g get database p put database"); ! debug ("|w write listing T write tbl fmt"); ! debug ("|r open row here c open col here"); ! debug ("|d delete this row D delete this col"); ! debug ("|E edit string e edit value"); ! debug ("|M merge in database"); ! debug ("|"); ! debug ("| ***operators***"); ! debug ("|+,-,*,/ add,subtract,multiply,divide"); ! debug ("|+/v:v sum region e?e:e conditional"); ! debug ("|<,=,>,<=,>= relations &,| booleans"); } No differences encountered *** /tmp/,RCSt1009610 Fri Mar 8 14:55:10 1985 --- sc.c Fri Mar 8 14:52:15 1985 *************** *** 35,42 int seenerr; yyerror (err) ! char *err; ! { if (seenerr) return; seenerr++; move (1,0); --- 35,41 ----- int seenerr; yyerror (err) ! char *err; { if (seenerr) return; seenerr++; move (1,0); *************** *** 44,51 printw ("%s: %.*s<=%s",err,linelim,line,line+linelim); } ! struct ent *lookat(row,col) ! { register struct ent **p = &tbl[row][col]; if (*p==0) { *p = (struct ent *) malloc (sizeof (struct ent)); --- 43,49 ----- printw ("%s: %.*s<=%s",err,linelim,line,line+linelim); } ! struct ent *lookat(row,col){ register struct ent **p = &tbl[row][col]; if (*p==0) { *p = (struct ent *) malloc (sizeof (struct ent)); *************** *** 60,67 return *p; } ! update () ! { register row, col; register struct ent **p; --- 58,64 ----- return *p; } ! update () { register row, col; register struct ent **p; *************** *** 105,111 if ((*p) -> flags & is_valid) printw ("%*.*f", fwidth[col], precision[col], (*p) -> v); if (s = (*p) -> label) { ! /* char field[1024]; strncpy(field,s,fwidth[col]); field[fwidth[col]] = 0; */ --- 102,108 ----- if ((*p) -> flags & is_valid) printw ("%*.*f", fwidth[col], precision[col], (*p) -> v); if (s = (*p) -> label) { ! char field[1024]; strncpy(field,s,fwidth[col]); field[fwidth[col]] = 0; *************** *** 108,114 /* char field[1024]; strncpy(field,s,fwidth[col]); ! field[fwidth[col]] = 0; */ mvaddstr (r, (*p) -> flags & is_leftflush ? c : c - strlen (/* field*/ s) + fwidth[col], --- 105,111 ----- char field[1024]; strncpy(field,s,fwidth[col]); ! field[fwidth[col]] = 0; mvaddstr (r, (*p) -> flags & is_leftflush ? c : c - strlen (field) + fwidth[col], *************** *** 111,118 field[fwidth[col]] = 0; */ mvaddstr (r, (*p) -> flags & is_leftflush ! ? c : c - strlen (/* field*/ s) + fwidth[col], ! /*field*/ s); } } c += fwidth[col]; --- 108,115 ----- field[fwidth[col]] = 0; mvaddstr (r, (*p) -> flags & is_leftflush ! ? c : c - strlen (field) + fwidth[col], ! field); } } c += fwidth[col]; *************** *** 423,429 editv (currow, curcol); break; case 'E': - instring = 1; edits (currow, curcol); break; case 'f': --- 420,425 ----- editv (currow, curcol); break; case 'E': edits (currow, curcol); break; case 'f': *************** *** 534,543 endwin (); } ! modcheck(endstr) char *endstr; ! { ! char ch, lin[100]; ! if (modflg && curfile[0]) { move(0, 0); --- 530,536 ----- endwin (); } ! modcheck(endstr) char *endstr; { if (modflg && curfile[0]) { char ch, lin[100]; *************** *** 539,544 char ch, lin[100]; if (modflg && curfile[0]) { move(0, 0); clrtoeol(); --- 532,538 ----- modcheck(endstr) char *endstr; { if (modflg && curfile[0]) { + char ch, lin[100]; move (0, 0); clrtoeol (); *************** *** 540,549 if (modflg && curfile[0]) { ! move(0, 0); ! clrtoeol(); ! sprintf(lin,"File '%s' is modified, save%s? ",curfile,endstr); ! addstr(lin); refresh(); ch = nmgetch(); if (ch == 'y' || ch == 'Y') writefile(curfile); --- 534,543 ----- if (modflg && curfile[0]) { char ch, lin[100]; ! move (0, 0); ! clrtoeol (); ! sprintf (lin,"File '%s' is modified, save%s? ",curfile,endstr); ! addstr (lin); refresh(); ch = nmgetch(); if (ch == 'y' || ch == 'Y') writefile(curfile); *************** *** 549,565 if (ch == 'y' || ch == 'Y') writefile(curfile); else if (ch == ctl (g)) return(1); } - if (modflg && (curfile[0] == '\0')) - { - move(0,0); - clrtoeol(); - sprintf(lin,"You have changed the spreadsheet, sure you don't want to save%s",endstr); - addstr(lin); - refresh(); - ch = nmgetch(); - if (ch == 'y' || ch == 'Y') return 0; - else if (ch == ctl (g)) return(1); - } return(0); } --- 543,548 ----- if (ch == 'y' || ch == 'Y') writefile(curfile); else if (ch == ctl (g)) return(1); } return(0); } *** /tmp/,RCSt1009758 Fri Mar 8 15:02:09 1985 --- vc.1 Fri Mar 8 15:00:53 1985 *************** *** 26,32 The following single control character commands are recognized no matter where the character cursor is. ! .IP "^N or j" Move the entry cursor to the next row. .IP "^P or k" --- 26,32 ----- The following single control character commands are recognized no matter where the character cursor is. ! .IP ^N Move the entry cursor to the next row. .IP ^P *************** *** 29,35 .IP "^N or j" Move the entry cursor to the next row. ! .IP "^P or k" Move the entry cursor to the previous row. .IP "^F or l" --- 29,35 ----- .IP ^N Move the entry cursor to the next row. ! .IP ^P Move the entry cursor to the previous row. .IP ^F *************** *** 32,38 .IP "^P or k" Move the entry cursor to the previous row. ! .IP "^F or l" Move the entry cursor forward one column. .IP "^B or h" --- 32,38 ----- .IP ^P Move the entry cursor to the previous row. ! .IP ^F Move the entry cursor forward one column. .IP ^B *************** *** 35,41 .IP "^F or l" Move the entry cursor forward one column. ! .IP "^B or h" Move the entry cursor backward one column. .IP ^C --- 35,41 ----- .IP ^F Move the entry cursor forward one column. ! .IP ^B Move the entry cursor backward one column. .IP ^C *************** *** 93,98 are the same. That is, when no long command is being entered. Most of them introduce a new long command. .IP Q Alternate exit command. --- 93,101 ----- are the same. That is, when no long command is being entered. Most of them introduce a new long command. + .IP "h, j, k, l" + Alternate cursor controls (left, down, up, right). + .IP Q Alternate exit command. *************** *** 105,111 Clears the current entry as if there were none. .IP ? ! Types a helpful message. .IP """ Enter a label for the current entry. --- 108,114 ----- Clears the current entry as if there were none. .IP ? ! Types a brief helpful message. .IP """ Enter a label for the current entry. *************** *** 182,190 conventional syntax. Terms may be variable names (from the ^V command), parenthesised expressions, negated terms, and constants. The +/ term sums values in rectangular regions of the table (the notation +/ is reminiscent ! of apl's additive reduction.) The */ multiplies values in a region. ! Terms may be combined using many binary ! operators. Their precedences (from highest to lowest) are: **,^; *,/,%; +,-; <,=,>,<=,>=; &; |; ?. .TP 15 --- 185,192 ----- conventional syntax. Terms may be variable names (from the ^V command), parenthesised expressions, negated terms, and constants. The +/ term sums values in rectangular regions of the table (the notation +/ is reminiscent ! of apl's additive reduction.) Terms may be combined using many binary ! operators. Their precedences (from highest to lowest) are: *,/; +,-; <,=,>,<=,>=; &; |; ?. .TP 15 *************** *** 211,224 Division. .TP 15 - e%e - Remainder (as in C); - - .TP 15 - e**e or e^e - Power function. - - .TP 15 +/v:v Sum all valid (nonblank) entries in the region whose two corners are defined by the two variable (entry) names given. --- 213,218 ----- Division. .TP 15 +/v:v Sum all valid (nonblank) entries in the region whose two corners are defined by the two variable (entry) names given. *************** *** 224,234 by the two variable (entry) names given. .TP 15 - */v:v - Multiply all valid (nonblank) entries in the region whose two corners are defined - by the two variable (entry) names given. - - .TP 15 e?e:e Conditional: If the first expression is true then the value of the second is returned, otherwise the value of the third is. --- 218,223 ----- by the two variable (entry) names given. .TP 15 e?e:e Conditional: If the first expression is true then the value of the second is returned, otherwise the value of the third is. *************** *** 242,248 Boolean connectives. .TP 15 - fixed To make a variable not change automatically when a row is duplicated with ^J, put the word \*(lqfixed\*(rq in front of it. I.e. r2c1*fixed r3c1 --- 231,236 ----- Boolean connectives. .TP 15 To make a variable not change automatically when a row is duplicated with ^J, put the word \*(lqfixed\*(rq in front of it. I.e. r2c1*fixed r3c1 *************** *** 247,335 ^J, put the word \*(lqfixed\*(rq in front of it. I.e. r2c1*fixed r3c1 - .SH "MATHEMATICAL FUNCTIONS" - A number of mathematical functions have been built into the calculator. - All of them operates on float numbers (double), the trig functions operate - with angles in radians. - .TP 15 - EXP(expr) - Returns exponential function of . - - .TP 15 - LOG(expr) - Returns the natural logarithm of . - - .TP 15 - LOGD(expr) - Returns the base 10 logarithm of . - - .TP 15 - POW(expr1,expr2) - Returns raised to the power of . - - .TP 15 - FLOOR(expr) - Returns returns the largest integer not greater than . - - .TP 15 - CEIL(expr) - Returns the smallest integer not less than . - - .TP 15 - HYPOT(x,y) - Returns SQRT(x*x+y*y), taking precautions against unwarranted overflows. - - .TP 15 - FABS(expr) - Returns the absolute value |expr|. - - .TP 15 - SIN(expr) and COS(expr) - Return trigonometric functions of radian arguments. The magnitude of the - arguments are not checked to assure meaningful results. - - .TP 15 - ASIN(expr) - Returns the arc sin in the range -\(*p/2 to \(*p/2 - - .TP 15 - ACOS(expr) - Returns the arc cosine in the range 0 to \(*p. - - .TP 15 - ATAN(expr) - Returns the arc tangent of in the range -\(*p/2 to \(*p/2. - - .TP 15 - ATANII(x,y) - Returns the arc tangent of x/y in the range -\(*p to \(*p. - - .TP 15 - DTR(expr) - Converts in degrees to radians. - - .TP 15 - RTD(expr) - Converts in radians to degrees. - - .TP 15 - SINH(expr), COSH(expr), TANH(expr) - These functions return their designated hyperbolic functions. - - .TP 15 - PI - A constant quite close to \(*p. - - .TP 15 - MAX(expr1,expr2) - Returns the largest value of the two expressions; - - .TP 15 - MIN(expr1,expr2) - Returns the smallest value of the two expressions; - - - .SH FILES expense.sc \- a sample expense report. --- 235,240 ----- ^J, put the word \*(lqfixed\*(rq in front of it. I.e. r2c1*fixed r3c1 .SH FILES expense.sc \- a sample expense report. *************** *** 334,341 expense.sc \- a sample expense report. .SH SEE ALSO ! bc(1), dc(1), the VisiCalc or T/Maker manuals, exp(3m), floor(3m), ! hypot(3m), sin(3m), sinh(3m). .SH BUGS --- 239,245 ----- expense.sc \- a sample expense report. .SH SEE ALSO ! bc(1), dc(1), the VisiCalc or T/Maker manuals. .SH BUGS There should be a */ operator. *************** *** 338,343 hypot(3m), sin(3m), sinh(3m). .SH BUGS Expression reevaluation is done in the same top-to-bottom, left-to-right manner as is done in other spreadsheet calculators. This is silly. A --- 242,248 ----- bc(1), dc(1), the VisiCalc or T/Maker manuals. .SH BUGS + There should be a */ operator. Expression reevaluation is done in the same top-to-bottom, left-to-right manner as is done in other spreadsheet calculators. This is silly. A