--- ray/src/common/calprnt.c 1991/08/14 16:26:34 1.2 +++ ray/src/common/calprnt.c 2021/07/30 00:22:32 2.7 @@ -1,28 +1,50 @@ -/* Copyright (c) 1991 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: calprnt.c,v 2.7 2021/07/30 00:22:32 greg Exp $"; #endif - /* * calprint.c - routines for printing calcomp expressions. - * - * 1/29/87 */ +#include "copyright.h" + #include +#include +#include "rterror.h" #include "calcomp.h" -eprint(ep, fp) /* print a parse tree */ -register EPNODE *ep; -FILE *fp; +/* is child binary operation lower precedence than parent? */ +static int +lower_precedent_binop(int typ, EPNODE *ekid) { + if (ekid == NULL) + return(0); + switch (typ) { + case '+': + return(0); + case '-': + return(ekid->type == '+'); + case '*': + return(strchr("+-", ekid->type) != NULL); + case '/': + return(strchr("+-*", ekid->type) != NULL); + case '^': + return(strchr("+-*/^", ekid->type) != NULL); + } + return(0); /* child not binary op */ +} + +void +eprint( /* print a parse tree */ + EPNODE *ep, + FILE *fp +) +{ static EPNODE *curdef = NULL; - register EPNODE *ep1; + EPNODE *ep1 = NULL; - switch (ep->type) { + switch (ep==NULL ? -1 : ep->type) { case VAR: fputs(ep->v.ln->name, fp); @@ -34,14 +56,14 @@ FILE *fp; case FUNC: eprint(ep->v.kid, fp); - fputs("(", fp); + fputc('(', fp); ep1 = ep->v.kid->sibling; while (ep1 != NULL) { eprint(ep1, fp); if ((ep1 = ep1->sibling) != NULL) fputs(", ", fp); } - fputs(")", fp); + fputc(')', fp); break; case ARG: @@ -57,11 +79,6 @@ FILE *fp; fprintf(fp, "%.9g", ep->v.num); break; - case UMINUS: - fputs("-", fp); - eprint(ep->v.kid, fp); - break; - case CHAN: fprintf(fp, "$%d", ep->v.chan); break; @@ -71,25 +88,46 @@ FILE *fp; ep1 = curdef; curdef = ep; eprint(ep->v.kid, fp); - putc(' ', fp); - putc(ep->type, fp); - putc(' ', fp); + fputc(' ', fp); + fputc(ep->type, fp); + fputc(' ', fp); eprint(ep->v.kid->sibling, fp); curdef = ep1; break; - + + case UMINUS: + fputc('-', fp); + if (ep->v.kid != NULL && strchr("+-*/^", ep->v.kid->type)) { + fputc('(', fp); + eprint(ep->v.kid, fp); + fputc(')', fp); + } else + eprint(ep->v.kid, fp); + break; + case '+': case '-': case '*': case '/': case '^': - fputs("(", fp); - eprint(ep->v.kid, fp); - putc(' ', fp); - putc(ep->type, fp); - putc(' ', fp); - eprint(ep->v.kid->sibling, fp); - fputs(")", fp); + if (lower_precedent_binop(ep->type, ep->v.kid)) { + fputc('(', fp); + eprint(ep->v.kid, fp); + fputc(')', fp); + } else + eprint(ep->v.kid, fp); + if (ep->type != '^') { + fputc(' ', fp); + fputc(ep->type, fp); + fputc(' ', fp); + } else + fputc(ep->type, fp); + if (lower_precedent_binop(ep->type, ep->v.kid->sibling)) { + fputc('(', fp); + eprint(ep->v.kid->sibling, fp); + fputc(')', fp); + } else + eprint(ep->v.kid->sibling, fp); break; default: @@ -97,15 +135,16 @@ FILE *fp; quit(1); } - } -dprint(name, fp) /* print a definition (all if no name) */ -char *name; -FILE *fp; +void +dprint( /* print a definition (all if no name) */ + char *name, + FILE *fp +) { - register EPNODE *ep; + EPNODE *ep; if (name == NULL) for (ep = dfirst(); ep != NULL; ep = dnext()) {