home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gle / gle / var.c < prev    next >
C/C++ Source or Header  |  1992-11-29  |  4KB  |  201 lines

  1. /*---------------------------------------------------------------------------*/
  2. #include "all.h"
  3.  
  4.  
  5. #define true (!false)
  6. #define false 0
  7.  
  8. int var_local;        /* 0 = global, 1 = local */
  9. char *var_names[100];    /* Global variables */
  10. int var_type[100];
  11. int nvar;
  12. char *lvar_names[100];    /*  Local variables  */
  13. int lvar_type[100];
  14. int nlvar;
  15.  
  16. static void *dp_stack[100];
  17. static void *dp_stackstr[100];
  18. static int ndp;
  19. static double (*lvar_val)[100];
  20. static char *(*lvar_str)[100];
  21. static double var_val[100];
  22. static char *var_str[100];
  23. /*------------------------------------------------------------------*/
  24. int var_check(int *j);
  25. var_check(int *j)
  26. {
  27.     if (*j<0 || *j>400) {
  28.         gprint("Variable index is wrong %d \n",*j);
  29.         *j = 1;
  30.     }
  31.     if (lvar_val == NULL  && *j>=200) {
  32.         *j = 0;
  33.         gprint("No local variables assigned \n");
  34.     }
  35. }
  36. var_alloc_local()
  37. {
  38.      dp_stack[++ndp] = lvar_val;
  39.     dp_stackstr[ndp] = lvar_str;
  40.     lvar_val = myallocz(sizeof(*lvar_val));
  41.     lvar_str = myallocz(sizeof(*lvar_str));
  42. }
  43. var_free_local()
  44. {
  45.     if (ndp==0) {gprint("Cannot free local as none saved \n"); return;}
  46.     myfree(lvar_val);
  47.     myfree(lvar_str);
  48.     lvar_val = dp_stack[ndp];
  49.     lvar_str = dp_stackstr[ndp--];
  50. }
  51. var_set(int jj, double v)
  52. {
  53.     var_check(&jj);
  54.     if (jj<200) {
  55.         var_val[jj] = v;
  56.     } else
  57.         (*lvar_val)[jj-200] = v;
  58. }
  59. var_setstr(int jj, char *s)
  60. {
  61.     var_check(&jj);
  62.     if (jj<200)
  63.         mystrcpy(&var_str[jj],s);
  64.     else
  65.         mystrcpy(&(*lvar_str)[jj-200],s);
  66. }
  67. var_getstr(int jj, char *s)
  68. {
  69.     var_check(&jj);
  70.     if (jj<200) {
  71.         if (var_str[jj]!=NULL) strcpy(s,var_str[jj]);
  72.         else {
  73.             strcpy(s,"");
  74.             gprint("String Variable not defined %d \n",jj);
  75.         }
  76.     } else {
  77.         if ((*lvar_str)[jj-200]!=NULL) strcpy(s,(*lvar_str)[jj-200]);
  78.         if ((*lvar_str)[jj-200]==NULL) gprint("ERROR, variable not defined\n");
  79.     }
  80.  
  81. }
  82. var_get(int jj, double *v)
  83. {
  84.     var_check(&jj);
  85.     if (jj<200)
  86.         *v = var_val[jj];
  87.     else
  88.         *v = (*lvar_val)[jj-200];
  89. }
  90. /*------------------------------------------------------------------*/
  91. var_nlocal(int *l)
  92. {
  93.     *l = nlvar;
  94. }
  95. var_clear_global()
  96. {
  97.     nvar = 0;
  98. }
  99. var_set_local()
  100. {
  101.     var_local = true;
  102.     nlvar = 0;
  103. }
  104. var_set_global()
  105. {
  106.     var_local = false;
  107. }
  108. var_clear_local()
  109. {
  110.     nlvar = 0;
  111. }
  112. var_def(char *s, double x)
  113. {
  114.     int idx,type=1;
  115.     var_findadd(s,&idx,&type);
  116.     var_set(idx,x);
  117. }
  118. var_findadd(char *name,int *idx,int *type)    /* Add a variable to the list */
  119. {
  120.     var_find(name,idx,type);
  121.     if (*idx==-1) var_add(name,idx,type);
  122. }
  123. var_add(char *name,int *idx,int *type)    /* Add a variable to the list */
  124. {
  125.     if (var_local==0) {
  126.         if (nvar>90) gprint("Too many global variables \n");
  127.         mystrcpy(&var_names[nvar],name);
  128.         *idx = nvar;
  129.         if (lastchar(name,'$')) *type=2;
  130.         else *type=1;
  131.         var_type[nvar++] = *type;
  132.     } else {
  133.         if (nlvar>90) gprint("Too many local variables \n");
  134.         mystrcpy(&lvar_names[nlvar],name);
  135.         *idx = nlvar+200;
  136.         if (lastchar(name,'$')) *type=2;
  137.         else *type=1;
  138.         lvar_type[nlvar++] = *type;
  139.     }
  140. }
  141. var_find(char *name,int *idx,int *type)    /* Find a variable in the list */
  142. {
  143.     int i;
  144. /*     if (var_local==0) { */
  145.  
  146.     for (i=0;i<nlvar;i++) {
  147.         if (strcmp(lvar_names[i],name)==0) {
  148.             *idx = i+200;
  149.             *type = lvar_type[i];
  150.             return;
  151.         }
  152.     }
  153.     for (i=0;i<nvar;i++) {
  154.         if (strcmp(var_names[i],name)==0) {
  155.             *idx = i;
  156.             *type = var_type[i];
  157.             return;
  158.         }
  159.     }
  160.     *idx = -1;
  161.  
  162.  
  163. /*     } else { */
  164. /*     } */
  165. }
  166. /*------------------------------------------------------------------*/
  167. var_find_dn(int *idx, int *var, int *nd)
  168. {
  169.     int i,d;
  170.     *nd = 0;
  171.     for (i=0;i<nlvar;i++) {
  172.         if (strncmp(lvar_names[i],"D",1)==0) {
  173.             d = atoi(lvar_names[i]+1);
  174.             if (d>0 && d<100) {
  175.                 ++*nd;
  176.                 *idx++ = i+200;
  177.                 *var++ = d;
  178.             }
  179.         }
  180.     }
  181. }
  182. /*------------------------------------------------------------------*/
  183. str_var(s)
  184. char *s;
  185. {
  186.     int i;
  187.     i = strlen(s);
  188.     if (*(s+i-1)=='$') return true;
  189.       else return false;
  190. }
  191.  
  192. valid_var(s)
  193. char *s;
  194. {
  195.     return true;
  196. }
  197.  
  198. /*------------------------------------------------------------------*/
  199.  
  200.  
  201.