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.9 by greg, Tue Apr 23 15:26:26 1991 UTC vs.
Revision 1.13 by greg, Thu Aug 8 12:11:19 1991 UTC

# Line 27 | Line 27 | static char SCCSid[] = "$SunId$ LBL";
27   #include  "calcomp.h"
28  
29   #define  MAXLINE        256             /* maximum line length */
30 #define  MAXWORD        64              /* maximum word length */
30  
31   #define  newnode()      (EPNODE *)ecalloc(1, sizeof(EPNODE))
32  
34 #define  isid(c)        (isalnum(c) || (c) == '_' || (c) == '.')
35
33   #define  isdecimal(c)   (isdigit(c) || (c) == '.')
34  
35   extern double  atof(), pow();
# Line 326 | Line 323 | int  ln;
323   }
324  
325  
326 < scan()                          /* scan next character */
326 > getscanpos(fnp, lnp, spp, fpp)  /* return current scan position */
327 > char  **fnp;
328 > int  *lnp;
329 > char  **spp;
330 > FILE  **fpp;
331   {
332 +    if (fnp != NULL) *fnp = infile;
333 +    if (lnp != NULL) *lnp = lineno;
334 +    if (spp != NULL) *spp = linbuf+linepos;
335 +    if (fpp != NULL) *fpp = infp;
336 + }
337 +
338 +
339 + int
340 + scan()                          /* scan next character, return literal next */
341 + {
342 +    register int  lnext = 0;
343 +
344      do {
345          if (linbuf[linepos] == '\0')
346              if (infp == NULL || fgets(linbuf, MAXLINE, infp) == NULL)
# Line 339 | Line 352 | scan()                         /* scan next character */
352              }
353          else
354              nextc = linbuf[linepos++];
355 +        if (!lnext)
356 +                lnext = nextc;
357          if (nextc == '{') {
358              scan();
359              while (nextc != '}')
# Line 349 | Line 364 | scan()                         /* scan next character */
364              scan();
365          }
366      } while (isspace(nextc));
367 +    return(lnext);
368   }
369  
370  
# Line 422 | Line 438 | char *
438   getname()                       /* scan an identifier */
439   {
440      static char  str[MAXWORD+1];
441 <    register int  i;
441 >    register int  i, lnext;
442  
443 <    for (i = 0; i < MAXWORD && isid(nextc); i++, scan())
444 <        str[i] = nextc;
443 >    lnext = nextc;
444 >    for (i = 0; i < MAXWORD && isid(lnext); i++, lnext = scan())
445 >        str[i] = lnext;
446      str[i] = '\0';
447  
448      return(str);
# Line 435 | Line 452 | getname()                      /* scan an identifier */
452   int
453   getinum()                       /* scan a positive integer */
454   {
455 <    register int  n;
455 >    register int  n, lnext;
456  
457      n = 0;
458 <    while (isdigit(nextc)) {
459 <        n = n * 10 + nextc - '0';
460 <        scan();
458 >    lnext = nextc;
459 >    while (isdigit(lnext)) {
460 >        n = n * 10 + lnext - '0';
461 >        lnext = scan();
462      }
463      return(n);
464   }
# Line 449 | Line 467 | getinum()                      /* scan a positive integer */
467   double
468   getnum()                        /* scan a positive float */
469   {
470 <    register int  i;
470 >    register int  i, lnext;
471      char  str[MAXWORD+1];
472  
473      i = 0;
474 <    while (isdigit(nextc) && i < MAXWORD) {
475 <        str[i++] = nextc;
476 <        scan();
474 >    lnext = nextc;
475 >    while (isdigit(lnext) && i < MAXWORD) {
476 >        str[i++] = lnext;
477 >        lnext = scan();
478      }
479 <    if (nextc == '.' && i < MAXWORD) {
480 <        str[i++] = nextc;
481 <        scan();
482 <        while (isdigit(nextc) && i < MAXWORD) {
483 <            str[i++] = nextc;
484 <            scan();
479 >    if (lnext == '.' && i < MAXWORD) {
480 >        str[i++] = lnext;
481 >        lnext = scan();
482 >        while (isdigit(lnext) && i < MAXWORD) {
483 >            str[i++] = lnext;
484 >            lnext = scan();
485          }
486      }
487 <    if ((nextc == 'e' || nextc == 'E') && i < MAXWORD) {
488 <        str[i++] = nextc;
489 <        scan();
490 <        if ((nextc == '-' || nextc == '+') && i < MAXWORD) {
491 <            str[i++] = nextc;
492 <            scan();
487 >    if ((lnext == 'e' || lnext == 'E') && i < MAXWORD) {
488 >        str[i++] = lnext;
489 >        lnext = scan();
490 >        if ((lnext == '-' || lnext == '+') && i < MAXWORD) {
491 >            str[i++] = lnext;
492 >            lnext = scan();
493          }
494 <        while (isdigit(nextc) && i < MAXWORD) {
495 <            str[i++] = nextc;
496 <            scan();
494 >        while (isdigit(lnext) && i < MAXWORD) {
495 >            str[i++] = lnext;
496 >            lnext = scan();
497          }
498      }
499      str[i] = '\0';
# Line 680 | Line 699 | register EPNODE  *epar;
699   }
700  
701  
702 < isconstvar(ep)                  /* is ep linked to a constant? */
702 > isconstvar(ep)                  /* is ep linked to a constant expression? */
703   register EPNODE  *ep;
704   {
705   #ifdef  VARIABLE
706      register EPNODE  *ep1;
688    
707   #ifdef  FUNCTION
708 +
709      if (ep->type == FUNC) {
710 <        if (ep->v.kid->type != VAR)
711 <            return(0);
693 <        ep1 = ep->v.kid->v.ln->def;
694 <        if (ep1 != NULL && ep1->type != ':')
695 <            return(0);
696 <        if ((ep1 == NULL || ep1->v.kid->type != FUNC)
697 <                && liblookup(ep->v.kid->v.ln->name) == NULL)
698 <            return(0);
710 >        if (!isconstfun(ep->v.kid))
711 >                return(0);
712          for (ep1 = ep->v.kid->sibling; ep1 != NULL; ep1 = ep1->sibling)
713 <            if (ep1->type != NUM)
713 >            if (ep1->type != NUM && !isconstfun(ep1))
714                  return(0);
715          return(1);
716      }
# Line 716 | Line 729 | register EPNODE  *ep;
729      return(ep->type == FUNC);
730   #endif
731   }
732 +
733 +
734 + #if  defined(FUNCTION) && defined(VARIABLE)
735 + isconstfun(ep)                  /* is ep linked to a constant function? */
736 + register EPNODE  *ep;
737 + {
738 +    register EPNODE  *dp;
739 +    register LIBR  *lp;
740 +
741 +    if (ep->type != VAR)
742 +        return(0);
743 +    dp = ep->v.ln->def;
744 +    if (dp != NULL && dp->type != ':')
745 +        return(0);
746 +    if ((dp == NULL || dp->v.kid->type != FUNC)
747 +            && ((lp = liblookup(ep->v.ln->name)) == NULL
748 +                    || lp->atyp != ':'))
749 +        return(0);
750 +    return(1);
751 + }
752 + #endif
753   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines