ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/calexpr.c
(Generate patch)

Comparing ray/src/common/calexpr.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:34:27 1989 UTC vs.
Revision 1.8 by greg, Wed Apr 17 10:54:58 1991 UTC

# Line 39 | Line 39 | extern double  atof(), pow();
39   extern char  *fgets(), *savestr();
40   extern char  *emalloc(), *ecalloc();
41   extern EPNODE  *curfunc;
42 < extern double  efunc(), evariable(), enumber(), euminus(), echannel();
43 < extern double  eargument(), eadd(), esubtr(), emult(), edivi(), epow();
44 < extern double  ebotch();
42 > extern double  efunc(), evariable();
43 > static double  euminus(), echannel(), eargument(), enumber();
44 > static double  eadd(), esubtr(), emult(), edivi(), epow();
45 > static double  ebotch();
46   extern int  errno;
47  
48   int  nextc;                             /* lookahead character */
# Line 84 | Line 85 | double  (*eoper[])() = {               /* expression operations */
85          epow,
86   };
87  
87 static char  *infile;                   /* input file name */
88   static FILE  *infp;                     /* input file pointer */
89   static char  *linbuf;                   /* line buffer */
90 + static char  *infile;                   /* input file name */
91 + static int  lineno;                     /* input line number */
92   static int  linepos;                    /* position in buffer */
93  
94  
# Line 96 | Line 98 | char  *expr;
98   {
99      EPNODE  *ep;
100  
101 <    initstr(NULL, expr);
101 >    initstr(expr, NULL, 0);
102   #if  defined(VARIABLE) && defined(FUNCTION)
103      curfunc = NULL;
104   #endif
# Line 128 | Line 130 | register EPNODE  *epar;
130  
131      switch (epar->type) {
132  
133 + #if  defined(VARIABLE) || defined(FUNCTION)
134          case VAR:
135              varfree(epar->v.ln);
136              break;
137 + #endif
138              
139          case SYM:
140              freestr(epar->v.name);
# Line 289 | Line 293 | register EPNODE  *ep;
293   }
294  
295  
296 < initfile(file, fp)              /* prepare input file */
293 < char  *file;
296 > initfile(fp, fn, ln)            /* prepare input file */
297   FILE  *fp;
298 + char  *fn;
299 + int  ln;
300   {
301      static char  inpbuf[MAXLINE];
302  
298    infile = file;
303      infp = fp;
304      linbuf = inpbuf;
305 +    infile = fn;
306 +    lineno = ln;
307      linepos = 0;
308      inpbuf[0] = '\0';
309      scan();
310   }
311  
312  
313 < initstr(file, s)                /* prepare input string */
308 < char  *file;
313 > initstr(s, fn, ln)              /* prepare input string */
314   char  *s;
315 + char  *fn;
316 + int  ln;
317   {
311    infile = file;
318      infp = NULL;
319 +    infile = fn;
320 +    lineno = ln;
321      linbuf = s;
322      linepos = 0;
323      scan();
# Line 324 | Line 332 | scan()                         /* scan next character */
332                  nextc = EOF;
333              else {
334                  nextc = linbuf[0];
335 +                lineno++;
336                  linepos = 1;
337              }
338          else
# Line 341 | Line 350 | scan()                         /* scan next character */
350   }
351  
352  
353 + char *
354 + ltoa(l)                         /* convert long to ascii */
355 + long  l;
356 + {
357 +    static char  buf[16];
358 +    register char  *cp;
359 +    int  neg = 0;
360 +
361 +    if (l == 0)
362 +        return("0");
363 +    if (l < 0) {
364 +        l = -l;
365 +        neg++;
366 +    }
367 +    cp = buf + sizeof(buf);
368 +    *--cp = '\0';
369 +    while (l) {
370 +        *--cp = l % 10 + '0';
371 +        l /= 10;
372 +    }
373 +    if (neg)
374 +        *--cp = '-';
375 +    return(cp);
376 + }
377 +
378 +
379   syntax(err)                     /* report syntax error and quit */
380   char  *err;
381   {
382      register int  i;
383  
384 +    if (infile != NULL || lineno != 0) {
385 +        if (infile != NULL) eputs(infile);
386 +        if (lineno != 0) {
387 +            eputs(infile != NULL ? ", line " : "line ");
388 +            eputs(ltoa((long)lineno));
389 +        }
390 +        eputs(": syntax error:\n");
391 +    }
392      eputs(linbuf);
393 <    if (linbuf[0] == '\0' || linbuf[strlen(linbuf)-1] != '\n')
393 >    if (linbuf[strlen(linbuf)-1] != '\n')
394          eputs("\n");
395      for (i = 0; i < linepos-1; i++)
396          eputs(linbuf[i] == '\t' ? "\t" : " ");
397      eputs("^ ");
355    if (infile != NULL) {
356        eputs(infile);
357        eputs(": ");
358    }
398      eputs(err);
399      eputs("\n");
400      quit(1);
# Line 489 | Line 528 | getE2()                                /* E2 -> E2 MULOP E3 */
528  
529  
530   EPNODE *
531 < getE3()                         /* E3 -> E3 ^ E4 */
531 > getE3()                         /* E3 -> E4 ^ E3 */
532                                  /*       E4 */
533   {
534      register EPNODE  *ep1, *ep2;
535  
536      ep1 = getE4();
537 <    while (nextc == '^') {
537 >    if (nextc == '^') {
538          ep2 = newnode();
539          ep2->type = nextc;
540          scan();
541          addekid(ep2, ep1);
542 <        addekid(ep2, getE4());
542 >        addekid(ep2, getE3());
543   #ifdef  RCONST
544          if (ep1->type == NUM && ep1->sibling->type == NUM)
545                  ep2 = rconst(ep2);
546   #endif
547 <        ep1 = ep2;
547 >        return(ep2);
548      }
549      return(ep1);
550   }
# Line 515 | Line 554 | EPNODE *
554   getE4()                         /* E4 -> ADDOP E5 */
555                                  /*       E5 */
556   {
557 <    register EPNODE  *ep1;
557 >    register EPNODE  *ep1, *ep2;
558  
559      if (nextc == '-') {
560          scan();
561 <        ep1 = newnode();
562 < #ifndef  RCONST
563 <        if (isdecimal(nextc)) {
564 <            ep1->type = NUM;
526 <            ep1->v.num = -getnum();
527 <            return(ep1);
561 >        ep2 = getE5();
562 >        if (ep2->type == NUM) {
563 >                ep2->v.num = -ep2->v.num;
564 >                return(ep2);
565          }
566 < #endif
566 >        ep1 = newnode();
567          ep1->type = UMINUS;
568 <        addekid(ep1, getE5());
532 < #ifdef  RCONST
533 <        if (ep1->v.kid->type == NUM)
534 <                ep1 = rconst(ep1);
535 < #endif
568 >        addekid(ep1, ep2);
569          return(ep1);
570      }
571      if (nextc == '+')

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines