vc hacks
Christer Bernerus
bernerus at chalmers.UUCP
Sat Mar 9 06:05:52 AEST 1985
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 <stdio.h>
- #include <math.h>
#define DEFCOLDELIM ':'
double pi(),dtr(),rtd();
--- 8,13 -----
#include "sc.h"
#include <stdio.h>
#define DEFCOLDELIM ':'
char *malloc();
***************
*** 11,17
#include <math.h>
#define DEFCOLDELIM ':'
- double pi(),dtr(),rtd();
char *malloc();
double eval(e)
--- 10,15 -----
#include <stdio.h>
#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 left<right?left:right;
- }
- case 'X': return pi();
- case '^': return (pow(eval(e->e.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 (mypriority<priority) line[linelim++] = '(';
switch (e->op) {
case '~': line[linelim++] = '~';
decompile (e->e.o.right, 30);
break;
--- 204,218 -----
}
if (mypriority<priority) line[linelim++] = '(';
switch (e->op) {
+ 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 <expr>.
-
- .TP 15
- LOG(expr)
- Returns the natural logarithm of <expr>.
-
- .TP 15
- LOGD(expr)
- Returns the base 10 logarithm of <expr>.
-
- .TP 15
- POW(expr1,expr2)
- Returns <expr1> raised to the power of <expr2>.
-
- .TP 15
- FLOOR(expr)
- Returns returns the largest integer not greater than <expr>.
-
- .TP 15
- CEIL(expr)
- Returns the smallest integer not less than <expr>.
-
- .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 <expr> 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 <expr> in degrees to radians.
-
- .TP 15
- RTD(expr)
- Converts <expr> 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
More information about the Comp.sources.unix
mailing list