--- ray/src/cal/rcalc.c 2003/04/27 06:08:03 1.3 +++ ray/src/cal/rcalc.c 2004/03/28 20:33:12 1.12 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rcalc.c,v 1.3 2003/04/27 06:08:03 greg Exp $"; +static const char RCSid[] = "$Id: rcalc.c,v 1.12 2004/03/28 20:33:12 schorsch Exp $"; #endif /* * rcalc.c - record calculator program. @@ -7,20 +7,19 @@ static const char RCSid[] = "$Id: rcalc.c,v 1.3 2003/0 * 9/11/87 */ -#include - #include - +#include +#include +#include #include - #include +#include "platform.h" +#include "rterror.h" +#include "rtmisc.h" +#include "rtio.h" #include "calcomp.h" -#ifdef CPM -#define getc agetc /* text files only, right? */ -#endif - #define isnum(c) (isdigit(c) || (c)=='-' || (c)=='.' \ || (c)=='+' || (c)=='e' || (c)=='E') @@ -58,8 +57,20 @@ struct field { /* record format struc #define savqstr(s) strcpy(emalloc(strlen(s)+1),s) #define freqstr(s) efree(s) -extern char *strcpy(), *emalloc(), *savestr(); -struct strvar *getsvar(); +static int getinputrec(FILE *fp); +static void scaninp(void), advinp(void), resetinp(void); +static void putrec(void), putout(void), nbsynch(void); +static int getrec(void); +static void execute(char *file); +static void initinp(FILE *fp); +static void svpreset(char *eqn); +static void readfmt(char *spec, int output); +static int readfield(char **pp); +static int getfield(struct field *f); +static void chanset(int n, double v); +static void bchanset(int n, double v); +static struct strvar* getsvar(char *svname); +static double l_in(char *); struct field *inpfmt = NULL; /* input record format */ struct field *outfmt = NULL; /* output record structure */ @@ -88,9 +99,11 @@ struct { } ipb; /* circular lookahead buffer */ -main(argc, argv) -int argc; -char *argv[]; +int +main( +int argc, +char *argv[] +) { int i; @@ -101,6 +114,7 @@ char *argv[]; biggerlib(); #endif varset("PI", ':', 3.14159265358979323846); + funset("in", 1, '=', &l_in); for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { @@ -139,12 +153,22 @@ char *argv[]; nbicols = atoi(argv[i]+3); else nbicols = 1; + if (nbicols*sizeof(double) > INBSIZ) { + eputs(argv[0]); + eputs(": too many input columns\n"); + quit(1); + } break; case 'f': if (isdigit(argv[i][3])) nbicols = -atoi(argv[i]+3); else nbicols = -1; + if (-nbicols*sizeof(float) > INBSIZ) { + eputs(argv[0]); + eputs(": too many input columns\n"); + quit(1); + } break; default: goto userr; @@ -197,10 +221,12 @@ eputs(" [-b][-l][-n][-w][-u][-tS][-s svar=sval][-e exp execute(argv[i]); quit(0); + return 0; /* pro forma return */ } -nbsynch() /* non-blank starting synch character */ +static void +nbsynch(void) /* non-blank starting synch character */ { if (inpfmt == NULL || (inpfmt->type & F_TYP) != T_LIT) return; @@ -211,9 +237,10 @@ nbsynch() /* non-blank starting synch ch } -int -getinputrec(fp) /* get next input record */ -FILE *fp; +static int +getinputrec( /* get next input record */ +FILE *fp +) { if (inpfmt != NULL) return(getrec()); @@ -227,8 +254,10 @@ FILE *fp; } -execute(file) /* process a file */ -char *file; +static void +execute( /* process a file */ +char *file +) { int conditional = vardefined("cond"); long nrecs = 0; @@ -258,9 +287,9 @@ char *file; } -putout() /* produce an output record */ +static void +putout(void) /* produce an output record */ { - extern void chanset(), bchanset(); colpos = 0; if (outfmt != NULL) @@ -269,16 +298,49 @@ putout() /* produce an output record */ chanout(bchanset); else chanout(chanset); - if (colpos && !bchanset) + if (colpos && !bocols) putchar('\n'); if (unbuff) fflush(stdout); } +static double +l_in(char *funame) /* function call for $channel */ +{ + int n; + register char *cp; + /* get argument as integer */ + n = (int)(argument(1) + .5); + if (n != 0) /* return channel value */ + return(chanvalue(n)); + /* determine number of channels */ + if (noinput || inpfmt != NULL) + return(0); + if (nbicols > 0) + return(nbicols); + if (nbicols < 0) + return(-nbicols); + cp = inpbuf; /* need to count */ + for (n = 0; *cp; ) + if (blnkeq && isspace(sepchar)) { + while (isspace(*cp)) + cp++; + n += *cp != '\0'; + while (*cp && !isspace(*cp)) + cp++; + } else { + n += *cp != '\n'; + while (*cp && *cp++ != sepchar) + ; + } + return(n); +} + double -chanvalue(n) /* return value for column n */ -int n; +chanvalue( /* return value for column n */ +int n +) { int i; register char *cp; @@ -329,9 +391,10 @@ int n; void -chanset(n, v) /* output column n */ -int n; -double v; +chanset( /* output column n */ +int n, +double v +) { if (colpos == 0) /* no leading separator */ colpos = 1; @@ -344,9 +407,10 @@ double v; void -bchanset(n, v) /* output binary channel n */ -int n; -double v; +bchanset( /* output binary channel n */ +int n, +double v +) { static char zerobuf[sizeof(double)]; @@ -363,9 +427,11 @@ double v; } -readfmt(spec, output) /* read record format */ -char *spec; -int output; +static void +readfmt( /* read record format */ +char *spec, +int output +) { int fd; char *inptr; @@ -429,9 +495,10 @@ int output; } -int -readfield(pp) /* get next field in format */ -register char **pp; +static int +readfield( /* get next field in format */ +register char **pp +) { int type = F_NUL; int width = 0; @@ -496,8 +563,9 @@ register char **pp; struct strvar * -getsvar(svname) /* get string variable */ -char *svname; +getsvar( /* get string variable */ +char *svname +) { register struct strvar *sv; @@ -513,8 +581,10 @@ char *svname; } -svpreset(eqn) /* preset a string variable */ -char *eqn; +static void +svpreset( /* preset a string variable */ +char *eqn +) { register struct strvar *sv; register char *val; @@ -533,7 +603,8 @@ char *eqn; } -clearrec() /* clear input record variables */ +static void +clearrec(void) /* clear input record variables */ { register struct field *f; @@ -552,7 +623,8 @@ clearrec() /* clear input record variables */ } -getrec() /* get next record from file */ +static int +getrec(void) /* get next record from file */ { int eatline; register struct field *f; @@ -585,10 +657,12 @@ getrec() /* get next re } -getfield(f) /* get next field */ -register struct field *f; +static int +getfield( /* get next field */ +register struct field *f +) { - static char buf[MAXWORD+1]; /* no recursion! */ + static char buf[RMAXWORD+1]; /* no recursion! */ int delim, inword; double d; char *np; @@ -621,7 +695,7 @@ register struct field *f; delim = f->next->f.sl[0]; cp = buf; do { - if (ipb.chr == EOF) + if (ipb.chr == EOF || ipb.chr == '\n') inword = 0; else if (blnkeq && delim != EOF) inword = isblnk(delim) ? @@ -633,7 +707,7 @@ register struct field *f; *cp++ = ipb.chr; scaninp(); } - } while (inword && cp < &buf[MAXWORD]); + } while (inword && cp < &buf[RMAXWORD]); *cp = '\0'; if (f->f.sv->val == NULL) f->f.sv->val = savqstr(buf); /* first setting */ @@ -662,7 +736,7 @@ register struct field *f; *cp++ = ipb.chr; scaninp(); } - } while (inword && cp < &buf[MAXWORD]); + } while (inword && cp < &buf[RMAXWORD]); *cp = '\0'; d = np==NULL ? 0. : atof(np); if (!vardefined(f->f.nv)) @@ -672,10 +746,12 @@ register struct field *f; return(-1); /* doesn't match! */ return(0); } + return -1; /* pro forma return */ } -putrec() /* output a record */ +static void +putrec(void) /* output a record */ { char fmt[32]; register int n; @@ -725,8 +801,9 @@ putrec() /* output a re } -initinp(fp) /* prepare lookahead buffer */ -FILE *fp; +static void +initinp(FILE *fp) /* prepare lookahead buffer */ + { ipb.fin = fp; ipb.beg = ipb.end = inpbuf; @@ -736,7 +813,8 @@ FILE *fp; } -scaninp() /* scan next character */ +static void +scaninp(void) /* scan next character */ { if (ipb.chr == EOF) return; @@ -755,13 +833,15 @@ scaninp() /* scan next character } -advinp() /* move home to current position */ +static void +advinp(void) /* move home to current position */ { ipb.beg = ipb.pos; } -resetinp() /* rewind position and advance 1 */ +static void +resetinp(void) /* rewind position and advance 1 */ { if (ipb.beg == NULL) /* full */ ipb.beg = ipb.end; @@ -774,16 +854,14 @@ resetinp() /* rewind position and void -eputs(msg) -char *msg; +eputs(char *msg) { fputs(msg, stderr); } void -wputs(msg) -char *msg; +wputs(char *msg) { if (!nowarn) eputs(msg); @@ -791,8 +869,7 @@ char *msg; void -quit(code) -int code; +quit(int code) { exit(code); }