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