--- 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()) {