ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/calprnt.c
Revision: 2.7
Committed: Fri Jul 30 00:22:32 2021 UTC (2 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4
Changes since 2.6: +53 -16 lines
Log Message:
feat(icalc): Better print-out of expressions

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.7 static const char RCSid[] = "$Id: calprnt.c,v 2.6 2012/10/24 00:39:09 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * calprint.c - routines for printing calcomp expressions.
6 greg 2.2 */
7    
8 greg 2.3 #include "copyright.h"
9 greg 1.1
10     #include <stdio.h>
11 greg 2.7 #include <string.h>
12 greg 1.1
13 schorsch 2.4 #include "rterror.h"
14 greg 1.1 #include "calcomp.h"
15    
16    
17 greg 2.7 /* is child binary operation lower precedence than parent? */
18     static int
19     lower_precedent_binop(int typ, EPNODE *ekid)
20     {
21     if (ekid == NULL)
22     return(0);
23     switch (typ) {
24     case '+':
25     return(0);
26     case '-':
27     return(ekid->type == '+');
28     case '*':
29     return(strchr("+-", ekid->type) != NULL);
30     case '/':
31     return(strchr("+-*", ekid->type) != NULL);
32     case '^':
33     return(strchr("+-*/^", ekid->type) != NULL);
34     }
35     return(0); /* child not binary op */
36     }
37    
38 greg 2.2 void
39 greg 2.6 eprint( /* print a parse tree */
40     EPNODE *ep,
41     FILE *fp
42     )
43 greg 1.1 {
44     static EPNODE *curdef = NULL;
45 greg 2.6 EPNODE *ep1 = NULL;
46 greg 1.1
47 greg 2.7 switch (ep==NULL ? -1 : ep->type) {
48 greg 1.1
49     case VAR:
50     fputs(ep->v.ln->name, fp);
51     break;
52    
53     case SYM:
54     fputs(ep->v.name, fp);
55     break;
56    
57     case FUNC:
58     eprint(ep->v.kid, fp);
59 greg 2.2 fputc('(', fp);
60 greg 1.1 ep1 = ep->v.kid->sibling;
61     while (ep1 != NULL) {
62     eprint(ep1, fp);
63     if ((ep1 = ep1->sibling) != NULL)
64     fputs(", ", fp);
65     }
66 greg 2.2 fputc(')', fp);
67 greg 1.1 break;
68    
69     case ARG:
70     if (curdef == NULL || curdef->v.kid->type != FUNC ||
71     (ep1 = ekid(curdef->v.kid, ep->v.chan)) == NULL) {
72     eputs("Bad argument!\n");
73     quit(1);
74     }
75     eprint(ep1, fp);
76     break;
77    
78     case NUM:
79     fprintf(fp, "%.9g", ep->v.num);
80     break;
81    
82     case CHAN:
83     fprintf(fp, "$%d", ep->v.chan);
84     break;
85    
86     case '=':
87     case ':':
88     ep1 = curdef;
89     curdef = ep;
90     eprint(ep->v.kid, fp);
91 greg 2.2 fputc(' ', fp);
92     fputc(ep->type, fp);
93     fputc(' ', fp);
94 greg 1.1 eprint(ep->v.kid->sibling, fp);
95     curdef = ep1;
96     break;
97 greg 2.7
98     case UMINUS:
99     fputc('-', fp);
100     if (ep->v.kid != NULL && strchr("+-*/^", ep->v.kid->type)) {
101     fputc('(', fp);
102     eprint(ep->v.kid, fp);
103     fputc(')', fp);
104     } else
105     eprint(ep->v.kid, fp);
106     break;
107    
108 greg 1.1 case '+':
109     case '-':
110     case '*':
111     case '/':
112     case '^':
113 greg 2.7 if (lower_precedent_binop(ep->type, ep->v.kid)) {
114     fputc('(', fp);
115     eprint(ep->v.kid, fp);
116     fputc(')', fp);
117     } else
118     eprint(ep->v.kid, fp);
119     if (ep->type != '^') {
120     fputc(' ', fp);
121     fputc(ep->type, fp);
122     fputc(' ', fp);
123     } else
124     fputc(ep->type, fp);
125     if (lower_precedent_binop(ep->type, ep->v.kid->sibling)) {
126     fputc('(', fp);
127     eprint(ep->v.kid->sibling, fp);
128     fputc(')', fp);
129     } else
130     eprint(ep->v.kid->sibling, fp);
131 greg 1.1 break;
132    
133     default:
134     eputs("Bad expression!\n");
135     quit(1);
136    
137     }
138     }
139    
140    
141 greg 2.2 void
142 greg 2.6 dprint( /* print a definition (all if no name) */
143     char *name,
144     FILE *fp
145     )
146 greg 1.1 {
147 greg 2.6 EPNODE *ep;
148 greg 1.1
149     if (name == NULL)
150     for (ep = dfirst(); ep != NULL; ep = dnext()) {
151     eprint(ep, fp);
152     fputs(";\n", fp);
153     }
154     else if ((ep = dlookup(name)) != NULL) {
155     eprint(ep, fp);
156     fputs(";\n", fp);
157     } else {
158     wputs(name);
159     wputs(": undefined\n");
160     }
161     }