--- ray/src/common/calprnt.c 2003/02/22 02:07:21 2.2 +++ ray/src/common/calprnt.c 2021/07/30 00:22:32 2.7 @@ -1,81 +1,50 @@ #ifndef lint -static const char RCSid[] = "$Id: calprnt.c,v 2.2 2003/02/22 02:07:21 greg Exp $"; +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. */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2002 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear in their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ +#include "copyright.h" #include +#include +#include "rterror.h" #include "calcomp.h" +/* 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(ep, fp) /* print a parse tree */ -register EPNODE *ep; -FILE *fp; +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); @@ -110,11 +79,6 @@ FILE *fp; fprintf(fp, "%.9g", ep->v.num); break; - case UMINUS: - fputc('-', fp); - eprint(ep->v.kid, fp); - break; - case CHAN: fprintf(fp, "$%d", ep->v.chan); break; @@ -130,19 +94,40 @@ FILE *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 '^': - fputc('(', fp); - eprint(ep->v.kid, fp); - fputc(' ', fp); - fputc(ep->type, fp); - fputc(' ', fp); - eprint(ep->v.kid->sibling, fp); - fputc(')', 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: @@ -150,16 +135,16 @@ FILE *fp; quit(1); } - } void -dprint(name, fp) /* print a definition (all if no name) */ -char *name; -FILE *fp; +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()) {