static void nextfor(void) /* do one iteration of a for loop */ { int done; float v = forp->sym->s_val.f; switch (forp->op) { case '+': case ' ': done = v > forp->to; break; case '-': done = v < forp->to; break; case '*': done = v * forp->to < 0. ? (fabs(forp->by) > 0) : (fabs(v) > fabs(forp->to)) ; break; case '/': done = v * forp->to < 0. ? (fabs(forp->by) > 0) : (fabs(v) < fabs(forp->to)) ; break; } if (done) { free(forp->str); if (--forp < forstk) fatal("forstk popped too far"); } else { /* another iteration */ pushsrc(pString, "\n_Endfor\n"); pushsrc(pString, forp->str); } }
void nextfor(void) /* do one iteration of a for loop */ { /* BUG: this should depend on op and direction */ if (getfval(forp->var) > SLOP * forp->to) { /* loop is done */ free(forp->str); if (--forp < forstk) ERROR "forstk popped too far" FATAL; } else { /* another iteration */ pushsrc(String, "\nEndfor\n"); pushsrc(String, forp->str); } }
void ifdef(void) /* do body if name is defined */ { char name[100], *p; getstr(name, sizeof(name)); /* get name */ cstr(token, 1, SSIZE); /* and body */ if (lookup(deftbl, name) != NULL) { /* found it */ p = strsave(token); pushsrc(Free, p); pushsrc(String, p); } }
int main(int argc, char *argv[]) { extern void onintr(int), fpecatch(int); lib_defines = unsharp(GRAPDEFINES); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr); signal(SIGFPE, fpecatch); cmdname = argv[0]; tempfile = strdup("grap.XXXXXX"); mkstemp(tempfile); while (argc > 1 && *argv[1] == '-') { switch (argv[1][1]) { case 'd': dbg = 1; tfd = stdout; strcpy(tempfile, "grap.temp"); unlink(tempfile); fprintf(stderr, "%s\n", version); break; case 'l': /* turn off /usr/lib inclusion */ lib = 0; break; } argc--; argv++; } setdefaults(); curfile = infile; if (argc <= 1) { curfile->fin = stdin; curfile->fname = tostring("-"); pushsrc(File, curfile->fname); getdata(); } else while (argc-- > 1) { if ((curfile->fin = fopen(*++argv, "r")) == NULL) { fprintf(stderr, "grap: can't open %s\n", *argv); onintr(0); } curfile->fname = tostring(*argv); pushsrc(File, curfile->fname); getdata(); fclose(curfile->fin); free(curfile->fname); } if (!dbg) unlink(tempfile); exit(0); }
void dodef(struct symtab *stp) /* collect args and switch input to defn */ { int i, len; char *p; pArg *ap; ap = argfp+1; if (ap >= args+10) fatal("arguments too deep"); argcnt = 0; if (dwb_input() != '(') fatal("disaster in dodef\n"); if (ap->argval == 0) ap->argval = malloc(1000); for (p = ap->argval; (len = getarg(p)) != -1; p += len) { ap->argstk[argcnt++] = p; if (dwb_input() == ')') break; } for (i = argcnt; i < MAXARGS; i++) ap->argstk[i] = ""; argfp = ap; pushsrc(Macro, stp->s_val.p); }
void dodef(Obj *stp) /* collect args and switch input to defn */ { int i, len; char *p; Arg *ap; ap = argfp+1; if (ap >= args+10) ERROR "arguments too deep" FATAL; argcnt = 0; if (input9() != '(') ERROR "disaster in dodef" FATAL; if (ap->argval == 0) ap->argval = malloc(1000); for (p = ap->argval; (len = getarg(p)) != -1; p += len) { ap->argstk[argcnt++] = p; if (input9() == ')') break; } for (i = argcnt; i < MAXARGS; i++) ap->argstk[i] = ""; if (dbg) for (i = 0; i < argcnt; i++) printf("arg %d.%d = <%s>\n", ap-args, i+1, ap->argstk[i]); argfp = ap; pushsrc(Macro, stp->val); }
int main(int argc, char **argv) { char buf[20]; signal(SIGFPE, fpecatch); cmdname = argv[0]; while (argc > 1 && *argv[1] == '-') { switch (argv[1][1]) { case 'd': dbg = atoi(&argv[1][2]); if (dbg == 0) dbg = 1; fprintf(stderr, "%s\n", version); break; } argc--; argv++; } setdefaults(); objlist = (obj **) grow((char *)objlist, "objlist", nobjlist += 1000, sizeof(obj *)); text = (Text *) grow((char *)text, "text", ntextlist += 1000, sizeof(Text)); attr = (Attr *) grow((char *)attr, "attr", nattrlist += 100, sizeof(Attr)); sprintf(buf, "/%d/", getpid()); pushsrc(String, buf); definition("pid"); curfile = infile; pushsrc(File, curfile->fname); if (argc <= 1) { curfile->fin = stdin; curfile->fname = tostring("-"); getdata(); } else while (argc-- > 1) { if ((curfile->fin = fopen(*++argv, "r")) == NULL) { fprintf(stderr, "%s: can't open %s\n", cmdname, *argv); exit(1); } curfile->fname = tostring(*argv); getdata(); fclose(curfile->fin); free(curfile->fname); } return anyerr; }
void main(int argc, char *argv[]) { char *p, buf[20]; cmdname = argv[0]; if (p = getenv("TYPESETTER")) typesetter = p; while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'd': if (argv[1][2] == '\0') { dbg++; printf("...\teqn %s\n", version); } else { lefteq = argv[1][2]; righteq = argv[1][3]; } break; case 's': szstack[0] = gsize = atoi(&argv[1][2]); break; case 'p': deltaps = atoi(&argv[1][2]); dps_set = 1; break; case 'm': minsize = atoi(&argv[1][2]); break; case 'f': strcpy(ftstack[0].name,&argv[1][2]); break; case 'e': noeqn++; break; case 'T': typesetter = &argv[1][2]; break; default: fprintf(stderr, "%s: unknown option %s\n", cmdname, argv[1]); break; } argc--; argv++; } settype(typesetter); sprintf(buf, "\"%s\"", typesetter); install(deftbl, strsave(typesetter), strsave(buf), 0); init_tbl(); /* install other keywords in tables */ curfile = infile; pushsrc(File, curfile->fname); if (argc <= 1) { curfile->fin = stdin; curfile->fname = strsave("-"); getdata(); } else while (argc-- > 1) { if (strcmp(*++argv, "-") == 0) curfile->fin = stdin; else if ((curfile->fin = fopen(*argv, "r")) == NULL) ERROR "can't open file %s", *argv FATAL; curfile->fname = strsave(*argv); getdata(); if (curfile->fin != stdin) fclose(curfile->fin); } exit(0); }
unput(int c) { if (++pb >= pbuf + sizeof pbuf) ERROR "pushback overflow" FATAL; if (--ep < ebuf) ep = ebuf + sizeof(ebuf) - 1; *pb = c; pushsrc(Char, pb); return c; }
int unput(int c) { if (++pb >= pbuf + sizeof pbuf) fatal("pushback overflow\n"); if (--ep < ebuf) ep = ebuf + sizeof(ebuf) - 1; *pb = c; pushsrc(Char, pb); return c; }
char * ifstat(double expr, char *thenpart, char *elsepart) { if (expr) { unput('\n'); pushsrc(Free, thenpart); pushsrc(pString, thenpart); unput('\n'); if (elsepart) free(elsepart); return thenpart; /* to be freed later */ } else { free(thenpart); if (elsepart) { unput('\n'); pushsrc(Free, elsepart); pushsrc(pString, elsepart); unput('\n'); } return elsepart; } }
char *ifstat(double expr, char *thenpart, char *elsepart) { dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : ""); if (expr) { unput('\n'); pushsrc(Free, thenpart); pushsrc(String, thenpart); unput('\n'); if (elsepart) free(elsepart); return thenpart; /* to be freed later */ } else { free(thenpart); if (elsepart) { unput('\n'); pushsrc(Free, elsepart); pushsrc(String, elsepart); unput('\n'); } return elsepart; } }
void copy(void) /* begin input from file, etc. */ { FILE *fin; if (newfile) { if ((fin = fopen(newfile, "r")) == NULL) ERROR "can't open file %s", newfile FATAL; curfile++; curfile->fin = fin; curfile->fname = tostring(newfile); curfile->lineno = 0; printf(".lf 1 %s\n", curfile->fname); pushsrc(File, curfile->fname); newfile = 0; } if (thrudef) { thru = 1; begin = 1; /* wrong place */ } }
void copy(void) /* begin input from file, etc. */ { FILE *fin; if (newfile) { if ((fin = fopen(newfile, "r")) == NULL) fatal("can't open file %s", newfile); curfile++; curfile->fin = fin; curfile->fname = newfile; curfile->lineno = 0; pushsrc(File, curfile->fname); newfile = 0; } if (thrudef) { thru = 1; begin = 1; /* wrong place */ } }
void include(void) { char name[100]; FILE *fin; int c; extern int errno; while ((c = input()) == ' ') ; unput(c); cstr(name, c == '"', sizeof(name)); /* gets it quoted or not */ if ((fin = fopen(name, "r")) == NULL) ERROR "can't open file %s", name FATAL; errno = 0; curfile++; curfile->fin = fin; curfile->fname = strsave(name); curfile->lineno = 0; printf(".lf 1 %s\n", curfile->fname); pushsrc(File, curfile->fname); }
void pbstr(char *s) { pushsrc(String, s); }
void do_thru(void) /* read one line, make into a macro expansion */ { int c, i; char *p; Arg *ap; ap = argfp+1; if (ap >= args+10) ERROR "arguments too deep" FATAL; if (ap->argval == NULL) ap->argval = malloc(1000); p = ap->argval; argcnt = 0; c = nextchar(); if (thru == 0) { /* end of file was seen, so thru is done */ unput(c); return; } for ( ; c != '\n' && c != EOF; ) { if (c == ' ' || c == '\t') { c = nextchar(); continue; } if (argcnt >= MAXARGS) ERROR "too many fields on input line" FATAL; ap->argstk[argcnt++] = p; if (c == '"') { do { *p++ = c; if ((c = nextchar()) == '\\') { *p++ = c; *p++ = nextchar(); c = nextchar(); } } while (c != '"' && c != '\n' && c != EOF); *p++ = '"'; if (c == '"') c = nextchar(); } else { do { *p++ = c; } while ((c = nextchar())!=' ' && c!='\t' && c!='\n' && c!=',' && c!=EOF); if (c == ',') c = nextchar(); } *p++ = '\0'; } if (c == EOF) ERROR "unexpected end of file in do_thru" FATAL; if (argcnt == 0) { /* ignore blank line */ pushsrc(Thru, (char *) 0); return; } for (i = argcnt; i < MAXARGS; i++) ap->argstk[i] = ""; if (dbg) for (i = 0; i < argcnt; i++) printf("arg %d.%d = <%s>\n", ap-args, i+1, ap->argstk[i]); if (strcmp(ap->argstk[0], ".G2") == 0) { thru = 0; thrudef = 0; pushsrc(String, "\n.G2\n"); return; } if (untilstr && strcmp(ap->argstk[0], untilstr) == 0) { thru = 0; thrudef = 0; free(untilstr); untilstr = 0; return; } pushsrc(Thru, (char *) 0); dprintf("do_thru pushing back <%s>\n", thrudef->val); argfp = ap; pushsrc(Macro, thrudef->val); }
nextchar(void) { register int c; loop: switch (srcp->type) { case Free: /* free string */ free(srcp->sp); popsrc(); goto loop; case Thru: /* end of pushed back line */ begin = 1; popsrc(); c = '\n'; break; case Char: if (pb >= pbuf) { c = *pb--; popsrc(); break; } else { /* can't happen? */ popsrc(); goto loop; } case String: c = *srcp->sp++; if (c == '\0') { popsrc(); goto loop; } else { if (*srcp->sp == '\0') /* empty, so pop */ popsrc(); break; } case Macro: c = *srcp->sp++; if (c == '\0') { if (--argfp < args) ERROR "argfp underflow" FATAL; popsrc(); goto loop; } else if (c == '$' && isdigit(*srcp->sp)) { /* $3 */ int n = 0; while (isdigit(*srcp->sp)) n = 10 * n + *srcp->sp++ - '0'; if (n > 0 && n <= MAXARGS) pushsrc(String, argfp->argstk[n-1]); goto loop; } break; case File: c = getc(curfile->fin); if (c == EOF) { if (curfile == infile) ERROR "end of file inside .G1/.G2" FATAL; if (curfile->fin != stdin) { fclose(curfile->fin); free(curfile->fname); /* assumes allocated */ } curfile--; printf(".lf %d %s\n", curfile->lineno, curfile->fname); popsrc(); thru = 0; /* chicken out */ thrudef = 0; if (untilstr) { free(untilstr); untilstr = 0; } goto loop; } if (c == '\n') curfile->lineno++; break; } return c; }
int input(void) { register int c = 0; loop: switch (srcp->type) { case File: c = getc(curfile->fin); if (c == EOF) { if (curfile == infile) break; if (curfile->fin != stdin) { fclose(curfile->fin); free(curfile->fname); /* assumes allocated */ } curfile--; printf(".lf %d %s\n", curfile->lineno, curfile->fname); popsrc(); goto loop; } if (c == '\n') curfile->lineno++; break; case Char: if (pb >= pbuf) { c = *pb--; popsrc(); break; } else { /* can't happen? */ popsrc(); goto loop; } case String: c = *srcp->sp++; if (c == '\0') { popsrc(); goto loop; } else { if (*srcp->sp == '\0') /* empty, so pop */ popsrc(); break; } case Macro: c = *srcp->sp++; if (c == '\0') { if (--argfp < args) ERROR "argfp underflow" FATAL; popsrc(); goto loop; } else if (c == '$' && isdigit((unsigned char)*srcp->sp)) { int n = 0; while (isdigit((unsigned char)*srcp->sp)) n = 10 * n + *srcp->sp++ - '0'; if (n > 0 && n <= MAXARGS) pushsrc(String, argfp->argstk[n-1]); goto loop; } break; case Free: /* free string */ free(srcp->sp); popsrc(); goto loop; } if (ep >= ebuf + sizeof ebuf) ep = ebuf; *ep++ = c; return c; }
static void do_thru(void) /* read one line, make into a macro expansion */ { int c, i; char *p; pArg *ap; ap = argfp+1; if (ap >= args+10) fatal("arguments too deep"); if (ap->argval == NULL) ap->argval = malloc(1000); p = ap->argval; argcnt = 0; c = nextchar(); if (thru == 0) { /* end of file was seen, so thru is done */ unput(c); return; } for ( ; c != '\n' && c != EOF; ) { if (c == ' ' || c == '\t') { c = nextchar(); continue; } ap->argstk[argcnt++] = p; if (c == '"') { do { *p++ = c; if ((c = nextchar()) == '\\') { *p++ = c; *p++ = nextchar(); c = nextchar(); } } while (c != '"' && c != '\n' && c != EOF); *p++ = '"'; if (c == '"') c = nextchar(); } else { do { *p++ = c; } while ((c = nextchar())!=' ' && c!='\t' && c!='\n' && c!=',' && c!=EOF); if (c == ',') c = nextchar(); } *p++ = '\0'; } if (c == EOF) fatal("unexpected end of file in do_thru"); if (argcnt == 0) { /* ignore blank line */ pushsrc(Thru, (char *) 0); return; } for (i = argcnt; i < MAXARGS; i++) ap->argstk[i] = ""; if (strcmp(ap->argstk[0], ".PE") == 0) { thru = 0; thrudef = 0; pushsrc(pString, "\n.PE\n"); return; } if (untilstr && strcmp(ap->argstk[0], untilstr) == 0) { thru = 0; thrudef = 0; free(untilstr); untilstr = 0; return; } pushsrc(Thru, (char *) 0); argfp = ap; pushsrc(Macro, thrudef->s_val.p); }