home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 334_01 / eval2.c < prev    next >
Text File  |  1991-02-05  |  3KB  |  119 lines

  1. /*
  2.  *
  3.  *    G N U P L O T  --  eval.c
  4.  *
  5.  *  Copyright (C) 1986 Colin Kelley, Thomas Williams
  6.  *
  7.  *  You may use this code as you wish if credit is given and this message
  8.  *  is retained.
  9.  *
  10.  *  Please e-mail any useful additions to vu-vlsi!plot so they may be
  11.  *  included in later releases.
  12.  *
  13.  *  This file should be edited with 4-column tabs!  (:set ts=4 sw=4 in vi)
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include "plot.h"
  18.  
  19. extern int c_token,next_value,next_function;
  20. extern struct udft_entry udft[];
  21. extern struct ft_entry ft[];
  22. extern struct vt_entry vt[];
  23. extern struct at_type *curr_at;
  24. extern struct lexical_unit token[];
  25.  
  26. struct value *integer();
  27.  
  28.  
  29.  
  30. int add_value(t_num)
  31. int t_num;
  32. {
  33. register int i;
  34.  
  35.     /* check if it's already in the table... */
  36.  
  37.     for (i = 0; i < next_value; i++) {
  38.         if (equals(t_num,vt[i].vt_name))
  39.             return(i);
  40.     }
  41.     if (next_value == MAX_VALUES)
  42.         int_error("user defined constant space full",NO_CARET);
  43.     copy_str(vt[next_value].vt_name,t_num);
  44.     vt[next_value].vt_value.type = INT;        /* not necessary, but safe! */
  45.     vt[next_value].vt_undef = TRUE;
  46.     return(next_value++);
  47. }
  48.  
  49.  
  50. add_action(sf_index,arg)
  51. enum operators sf_index;
  52. struct value *arg;
  53.  
  54.  /* argument to pass to standard function indexed by sf_index */
  55. {
  56.  
  57.     if ( curr_at->count >= MAX_AT_LEN ) 
  58.         int_error("action table overflow",NO_CARET);
  59.     curr_at->actions[curr_at->count].index = ((int)sf_index);
  60.     if (arg != (struct value *)0)
  61.         curr_at->actions[curr_at->count].arg = *arg;
  62.     curr_at->count++;
  63. }
  64.  
  65.  
  66. int standard(t_num)  /* return standard function index or 0 */
  67. {
  68. register int i;
  69.     for (i = (int)SF_START; ft[i].ft_name != NULL; i++) {
  70.         if (equals(t_num,ft[i].ft_name))
  71.             return(i);
  72.     }
  73.     return(0);
  74. }
  75.  
  76.  
  77.  
  78. int user_defined(t_num)  /* find or add function and return index */
  79. int t_num; /* index to token[] */
  80. {
  81. register int i;
  82.     for (i = 0; i < next_function; i++) {
  83.         if (equals(t_num,udft[i].udft_name))
  84.             return(i);
  85.     }
  86.     if (next_function == MAX_UDFS)
  87.         int_error("user defined function space full",t_num);
  88.     copy_str(udft[next_function].udft_name,t_num);
  89.     udft[next_function].definition[0] = '\0';
  90.     udft[next_function].at.count = 0;
  91.     (void) integer(&udft[next_function].dummy_value, 0);
  92.     return(next_function++);
  93. }
  94.  
  95.  
  96.  
  97. execute_at(at_ptr)
  98. struct at_type *at_ptr;
  99. {
  100. register int i;
  101.     for (i = 0; i < at_ptr->count; i++) {
  102.         (*ft[at_ptr->actions[i].index].funct)(&(at_ptr->actions[i].arg));
  103.     }
  104. }
  105.  
  106. /*
  107.  
  108.  'ft' is a table containing C functions within this program. 
  109.  
  110.  An 'action_table' contains pointers to these functions and arguments to be
  111.  passed to them. 
  112.  
  113.  at_ptr is a pointer to the action table which must be executed (evaluated)
  114.  
  115.  so the iterated line exectues the function indexed by the at_ptr and 
  116.  passes the argument which is pointed to by the arg_ptr 
  117.  
  118. */
  119.