--- ray/src/cal/calc.c 2003/12/09 15:55:46 1.6 +++ ray/src/cal/calc.c 2023/09/26 18:09:08 1.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: calc.c,v 1.6 2003/12/09 15:55:46 greg Exp $"; +static const char RCSid[] = "$Id: calc.c,v 1.10 2023/09/26 18:09:08 greg Exp $"; #endif /* * calc.c - simple algebraic desk calculator program. @@ -8,11 +8,10 @@ static const char RCSid[] = "$Id: calc.c,v 1.6 2003/12 */ #include -#include -#include #include #include +#include "rtio.h" #include "rterror.h" #include "calcomp.h" @@ -26,15 +25,13 @@ int recover = 0; int -main(argc, argv) -int argc; -char *argv[]; +main(int argc, char *argv[]) { char expr[2048]; char *epos; FILE *fp; int i; - register char *cp; + char *cp; esupport |= E_VARIABLE|E_INCHAN|E_FUNCTION; esupport &= ~(E_REDEFW|E_RCONST|E_OUTCHAN); @@ -43,9 +40,17 @@ char *argv[]; #endif varset("PI", ':', 3.14159265358979323846); - for (i = 1; i < argc; i++) - fcompile(argv[i]); - + for (i = 1; i < argc; i++) { + cp = getpath(argv[i], getrlibpath(), 0); + if (cp == NULL) { + eputs(argv[0]); + eputs(": cannot find file '"); + eputs(argv[i]); + eputs("'\n"); + quit(1); + } + fcompile(cp); + } setjmp(env); recover = 1; eclock++; @@ -58,6 +63,8 @@ char *argv[]; epos[-1] = ' '; continue; /* escaped newline */ } + while (epos > expr && isspace(epos[-1])) + epos--; /* eliminate end spaces */ *epos = '\0'; epos = expr; switch (expr[0]) { @@ -66,6 +73,8 @@ char *argv[]; case '?': for (cp = expr+1; isspace(*cp); cp++) ; + if (*calcontext(NULL)) + printf("context is: %s\n", calcontext(NULL)); if (*cp) dprint(cp, stdout); else @@ -93,9 +102,30 @@ char *argv[]; eputs("file name required\n"); continue; } + cp = getpath(cp, getrlibpath(), 0); + if (cp == NULL) { + eputs("cannot find file\n"); + continue; + } fcompile(cp); eclock++; continue; + case '[': + for (cp = expr+1; isspace(*cp); cp++) + ; + if (!isalpha(*cp)) { + eputs("context name required\n"); + continue; + } + printf("context now: %s\n", pushcontext(cp)); + continue; + case ']': + cp = popcontext(); + if (*cp) + printf("context now: %s\n", cp); + else + printf("at global context\n"); + continue; } if ((cp = strchr(expr, '=')) != NULL || (cp = strchr(expr, ':')) != NULL) { @@ -143,24 +173,21 @@ int n; void -eputs(msg) -char *msg; +eputs(const char *msg) { fputs(msg, stderr); } void -wputs(msg) -char *msg; +wputs(const char *msg) { eputs(msg); } void -quit(code) -int code; +quit(int code) { if (recover) /* a cavalier approach */ longjmp(env, 1);