1 /*
2  * vecsym.h - symbol table interface for vec.c
3  */
4 
5 #ifndef _VECSYM_H_
6 #define _VECSYM_H_
7 
8 /*===================================================================
9  * none of this is used directly by vec.c
10  * The symbol structure is used indirectly, however, through
11  * the macros defined below
12  *===================================================================*/
13 
14 #include <stdio.h>
15 #ifndef _VEC_H_
16 #include "vec.h"    /* for definition of VECDATA */
17 #endif
18 
19 /*----- error return codes -----*/
20 
21 enum SymErrors {
22     SYMERR_NOERR=0, /* no error */
23     SYMERR_NONAME,  /* NULL or blank symbol name */
24     SYMERR_NOEXPR,  /* NULL or blank equation string */
25     SYMERR_SYMTABLE,/* failed to add new symbol to symbol table */
26     SYMERR_MALLOC,  /* malloc failed - out of space */
27     SYMERR_NOFUNC,  /* NULL function pointer */
28     SYMERR_MAXARGS, /* user function has too many arguments */
29     SYMERR_NOVEC,   /* 0 length or NULL vector */
30     SYMERR_TOOLONG, /* symbol name too long */
31     SYMERR_INVALID  /* invalid error code */
32 };
33 
34 /*----- symbol table structure -----*/
35 
36 #define SYMNAME_MAXLEN 32
37 
38 struct symbol_ {
39     char name[SYMNAME_MAXLEN+1];
40     int type;
41     int nargs;
42     size_t len;
43     union {
44         VECFLOAT val;
45         VECFLOAT *vec;
46         char *equ;
47         VECFUNC func;
48         void *data;
49     } op;
50     void *user;
51     struct symbol_ *next;
52 };
53 
54 /*----- callback for deleting a symbol -----*/
55 
56 extern void (*sym_delfunc) (struct symbol_ *);
57 
58 /*----- function prototypes -----*/
59 
60 void sym_free (void); /* free symbol table */
61 
62 char *sym_errmsg (  /* get error message */
63     int errnum      /* error number */
64 );
65 
66 int sym_addval (    /* add value symbol */
67     char *name,     /* symbol name */
68     VECFLOAT val,   /* symbol value */
69     void *user      /* user data */
70 );
71 
72 int sym_addvec (    /* add vector symbol */
73     char *name,     /* symbol name */
74     size_t len,     /* vector length */
75     VECFLOAT *vec,  /* vector */
76     void *user      /* user data */
77 );
78 
79 int sym_addequ (    /* add equation symbol */
80     char *name,     /* symbol name */
81     int nargs,      /* number of arguments */
82     char *equ,      /* equation string */
83     void *user      /* user data */
84 );
85 
86 int sym_addfunc (   /* add function symbol */
87     char *name,     /* symbol name */
88     int nargs,      /* number of arguments */
89     VECFUNC func,   /* function pointer */
90     void *user      /* user data */
91 );
92 
93 int sym_addmacro (  /* add macro symbol */
94     char *name,     /* symbol name */
95     int nargs,      /* number of arguments */
96     char *equ,      /* macro string */
97     void *user      /* user data */
98 );
99 
100 int sym_adddata (   /* add user data symbol */
101     char *name,     /* symbol name */
102     void *data,     /* symbol data */
103     void *user      /* user data */
104 );
105 
106 void sym_delsym (   /* remove symbol */
107     char *name      /* symbol name */
108 );
109 
110 int sym_count (     /* count number of symbols */
111     int type        /* symbol type (0 for all) */
112 );
113 
114 char **sym_names (  /* return NULL terminated list of symbol names */
115     int type        /* symbol type (0 for all) */
116 );
117 
118 int sym_list (      /* list symbols */
119     int type,       /* symbol type (0 for all) */
120     int (*func) (   /* callback function for list */
121         struct symbol_ *,   /* symbol */
122         void *      /* user data */
123     ),
124     void *userdata  /* user data */
125 );
126 
127 void sym_print (    /* print list of symbols */
128     FILE *fp        /* where output goes */
129 );
130 
131 /*===================================================================
132  * the following need to be defined for use by vec.c
133  *===================================================================*/
134 
135 /*----- symbol definition -----*/
136 
137 typedef struct symbol_ VECSYM;
138 
139 /*----- maximum arguments to a function -----*/
140 
141 #define FUNC_MAXARGS    5
142 
143 /*----- symbol types -----*/
144 
145 #define VECSYM_VALUE    1   /* constant value */
146 #define VECSYM_VECTOR   2   /* vector */
147 #define VECSYM_EQUSTR   3   /* equation string */
148 #define VECSYM_FUNC     4   /* user function */
149 #define VECSYM_MACRO    5   /* macro string */
150 #define VECSYM_DATA     6   /* user data */
151 
152 /*----- macros for accessing symbols -----*/
153 
154 #define vecsym_name(SYM)    ((SYM)->name)
155 #define vecsym_type(SYM)    ((SYM)->type)
156 #define vecsym_user(SYM)    ((SYM)->user)
157 
158 #define vecsym_value(SYM)   ((SYM)->op.val)
159 
160 #define vecsym_veclen(SYM)  ((SYM)->len)
161 #define vecsym_vector(SYM)  ((SYM)->op.vec)
162 
163 #define vecsym_nargs(SYM)   ((SYM)->nargs)
164 #define vecsym_equstr(SYM)  ((SYM)->op.equ)
165 #define vecsym_macro(SYM)   ((SYM)->op.equ)
166 #define vecsym_func(SYM)    ((SYM)->op.func)
167 
168 #define vecsym_data(SYM)    ((SYM)->op.data)
169 
170 /*----- function prototypes -----*/
171 
172 VECSYM *find_symbol (   /* find a symbol */
173     char *name,         /* symbol name */
174     int is_func         /* non-zero if symbol is a function */
175 );
176 
177 #endif  /* _VECSYM_H_ */
178