home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / macraysh.sit / Code / Source / symtab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-04  |  3.6 KB  |  152 lines

  1. /*
  2.  * symtab.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb, Rod G. Bogart
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  * 
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * $Id: symtab.c,v 4.0 91/07/17 14:48:02 kolb Exp Locker: kolb $
  17.  *
  18.  * $Log:    symtab.c,v $
  19.  * Revision 4.0  91/07/17  14:48:02  kolb
  20.  * Initial version.
  21.  * 
  22.  */
  23.  
  24. #include "rayshade.h"
  25. #include "symtab.h"
  26. #include "builtin.h"
  27.  
  28. static struct SymtabPredefinedEntry SymtabPredefined[] = {
  29.     {"pi", 3.141592, NULL, FLOAT_EXPR, FALSE, 0},
  30.     {"dtor", 0.017453, NULL, FLOAT_EXPR, FALSE, 0},
  31.     {"rtod", 57.29578, NULL, FLOAT_EXPR, FALSE, 0},
  32.     {"cos", 0.0, cos, BUILTIN_EXPR, FALSE, 1},
  33.     {"sin", 0.0, sin, BUILTIN_EXPR, FALSE, 1},
  34.     {"tan", 0.0, tan, BUILTIN_EXPR, FALSE, 1},
  35.     {"sqrt", 0.0, sqrt, BUILTIN_EXPR, FALSE, 1},
  36.     {"acos", 0.0, acos, BUILTIN_EXPR, FALSE, 1},
  37.     {"asin", 0.0, asin, BUILTIN_EXPR, FALSE, 1},
  38.     {"atan", 0.0, atan, BUILTIN_EXPR, FALSE, 1},
  39.     {"hypot", 0.0, hypot, BUILTIN_EXPR, FALSE, 2},
  40.     {"time", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  41.     {"frame", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  42.     {"linear", 0.0, LinearTime, BUILTIN_EXPR, TRUE, 4},
  43.     {NULL, 0.0, NULL, 0, 0}
  44. };
  45.  
  46. SymtabEntry *Symtab ;
  47.  
  48. void
  49. SymtabAddEntry(char *name, int type, Expr *expr, Float (*fp)(), int timevary,int params) ;
  50.  
  51. void
  52. SymtabInit()
  53. {
  54.     int i;
  55.  
  56.     Symtab = NULL ;
  57.     for(i=0; SymtabPredefined[i].name; i++) {
  58.         if (SymtabPredefined[i].type == BUILTIN_EXPR)
  59.             SymtabAddEntry(SymtabPredefined[i].name,
  60.                        SymtabPredefined[i].type,
  61.                        NULL,
  62.                        SymtabPredefined[i].fp,
  63.                     SymtabPredefined[i].timevary,    
  64.                        SymtabPredefined[i].params);
  65.         else
  66.             SymtabAddEntry(SymtabPredefined[i].name,
  67.                        SymtabPredefined[i].type,
  68.                        ExprFloatCreate(SymtabPredefined[i].f,
  69.                         SymtabPredefined[i].timevary),
  70.                        NULL, SymtabPredefined[i].timevary, 0);
  71.     }
  72.     TimeExpr = ExprFloatSymtabFind("time");
  73.     FrameExpr = ExprFloatSymtabFind("frame");
  74. }
  75.  
  76. void
  77. SymtabAddEntry(name, type, expr, fp, timevary, params)
  78. char *name;
  79. Expr *expr;
  80. Float (*fp)();
  81. int type, timevary, params;
  82. {
  83.     SymtabEntry *res;
  84.  
  85.     if (SymtabFind(name) != (SymtabEntry *)NULL)
  86.         RLerror(RL_ABORT, "Symbol %s redefined.\n", name,0,0);
  87.  
  88.     res = (SymtabEntry *) Malloc( sizeof(SymtabEntry));
  89.     res->name = strsave(name);
  90.     res->type = type;
  91.     res->timevary = timevary;
  92.     switch (type) {
  93.     case FLOAT_EXPR:
  94.         res->value.expr = expr;
  95.         expr->symtab = TRUE;
  96.         break;
  97.     case BUILTIN_EXPR:
  98.         res->value.fp = fp;
  99.         break;
  100.     default:
  101.         RLerror(RL_WARN,
  102.             "Type %d not implemented!!!",(char *)type,0,0);
  103.     }
  104.     res->params = params;
  105.     res->next = Symtab;
  106.     Symtab = res;
  107. }
  108.  
  109. SymtabEntry *
  110. SymtabFind(name)
  111. char *name;
  112. {
  113.     SymtabEntry *res;
  114.     for(res=Symtab; res; res=res->next) {
  115.         if (!strcmp(res->name,name))
  116.             return res;
  117.     }
  118.     /*error*/
  119.     return NULL;
  120. }
  121.  
  122. Expr *
  123. ExprFloatSymtabFind(name)
  124. char *name;
  125. {
  126.     SymtabEntry *res;
  127.  
  128.     if ((res = SymtabFind(name)) == NULL) 
  129.         RLerror(RL_PANIC,
  130.             "Symbol %s not defined!\n", name,0,0);
  131.     if (res->type != FLOAT_EXPR)
  132.         RLerror(RL_PANIC,
  133.             "Symbol %s is not a float expression!\n", name,0,0);
  134.     return res->value.expr;
  135. }
  136.  
  137.  
  138. SymtabEntry *
  139. SymtabBuiltinFind(name)
  140. char *name;
  141. {
  142.     SymtabEntry *res;
  143.  
  144.     if ((res = SymtabFind(name)) == NULL) 
  145.         RLerror(RL_PANIC,
  146.             "Symbol %s not defined!\n", name,0,0);
  147.     if (res->type != BUILTIN_EXPR)
  148.         RLerror(RL_PANIC,
  149.             "Symbol %s is not a built in function!\n", name,0,0);
  150.     return res;
  151. }
  152.