00001
00034 #ifndef YASM_VALPARAM_H
00035 #define YASM_VALPARAM_H
00036
00037 #ifndef YASM_LIB_DECL
00038 #define YASM_LIB_DECL
00039 #endif
00040
00042 struct yasm_valparam {
00043 STAILQ_ENTRY(yasm_valparam) link;
00044 char *val;
00047 enum yasm_param_type {
00048 YASM_PARAM_ID,
00049 YASM_PARAM_STRING,
00050 YASM_PARAM_EXPR
00051 } type;
00054 union yasm_param {
00055 char *id;
00056 char *str;
00057 yasm_expr *e;
00058 } param;
00066 char id_prefix;
00067 };
00068
00070 STAILQ_HEAD(yasm_valparamhead, yasm_valparam);
00071
00073 struct yasm_directive {
00078 const char *name;
00079
00080 const char *parser;
00088 void (*handler) (yasm_object *object, yasm_valparamhead *valparams,
00089 yasm_valparamhead *objext_valparams, unsigned long line);
00090
00092 enum yasm_directive_flags {
00093 YASM_DIR_ANY = 0,
00094 YASM_DIR_ARG_REQUIRED = 1,
00095 YASM_DIR_ID_REQUIRED = 2
00096 } flags;
00097 };
00098
00108 YASM_LIB_DECL
00109 void yasm_call_directive(const yasm_directive *directive, yasm_object *object,
00110 yasm_valparamhead *valparams,
00111 yasm_valparamhead *objext_valparams,
00112 unsigned long line);
00113
00120 YASM_LIB_DECL
00121 yasm_valparam *yasm_vp_create_id( char *v, char *p,
00122 int id_prefix);
00123
00129 YASM_LIB_DECL
00130 yasm_valparam *yasm_vp_create_string( char *v, char *p);
00131
00137 YASM_LIB_DECL
00138 yasm_valparam *yasm_vp_create_expr( char *v,
00139 yasm_expr *p);
00140
00149 YASM_LIB_DECL
00150 yasm_expr *yasm_vp_expr
00151 (const yasm_valparam *vp, yasm_symtab *symtab, unsigned long line);
00152
00159 YASM_LIB_DECL
00160 const char *yasm_vp_string(const yasm_valparam *vp);
00161
00167 YASM_LIB_DECL
00168 const char *yasm_vp_id(const yasm_valparam *vp);
00169
00173 YASM_LIB_DECL
00174 yasm_valparamhead *yasm_vps_create(void);
00175
00179 YASM_LIB_DECL
00180 void yasm_vps_destroy(yasm_valparamhead *headp);
00181
00185 void yasm_vps_initialize( yasm_valparamhead *headp);
00186 #ifndef YASM_DOXYGEN
00187 #define yasm_vps_initialize(headp) STAILQ_INIT(headp)
00188 #endif
00189
00195 YASM_LIB_DECL
00196 void yasm_vps_delete(yasm_valparamhead *headp);
00197
00202 void yasm_vps_append(yasm_valparamhead *headp, yasm_valparam *vp);
00203 #ifndef YASM_DOXYGEN
00204 #define yasm_vps_append(headp, vp) do { \
00205 if (vp) \
00206 STAILQ_INSERT_TAIL(headp, vp, link); \
00207 } while(0)
00208 #endif
00209
00214 yasm_valparam *yasm_vps_first
00215 (yasm_valparamhead *headp);
00216 #ifndef YASM_DOXYGEN
00217 #define yasm_vps_first(headp) STAILQ_FIRST(headp)
00218 #endif
00219
00224 yasm_valparam *yasm_vps_next(yasm_valparam *cur);
00225 #ifndef YASM_DOXYGEN
00226 #define yasm_vps_next(cur) STAILQ_NEXT(cur, link)
00227 #endif
00228
00234 #ifndef YASM_DOXYGEN
00235 #define yasm_vps_foreach(iter, headp) STAILQ_FOREACH(iter, headp, link)
00236 #endif
00237
00242 YASM_LIB_DECL
00243 void yasm_vps_print( const yasm_valparamhead *headp, FILE *f);
00244
00246 typedef struct yasm_dir_help {
00250 const char *name;
00251
00253 int needsparam;
00254
00264 int (*helper) (void *obj, yasm_valparam *vp, unsigned long line,
00265 void *data, uintptr_t arg);
00266
00273 size_t off;
00274
00277 uintptr_t arg;
00278 } yasm_dir_help;
00279
00298 YASM_LIB_DECL
00299 int yasm_dir_helper(void *obj, yasm_valparam *vp_first, unsigned long line,
00300 const yasm_dir_help *help, size_t nhelp, void *data,
00301 int (*helper_valparam) (void *object,
00302 yasm_valparam *vp,
00303 unsigned long line,
00304 void *data));
00305
00316 YASM_LIB_DECL
00317 int yasm_dir_helper_flag_set(void *obj, yasm_valparam *vp, unsigned long line,
00318 void *data, uintptr_t arg);
00319
00330 YASM_LIB_DECL
00331 int yasm_dir_helper_flag_or(void *obj, yasm_valparam *vp, unsigned long line,
00332 void *data, uintptr_t arg);
00333
00344 YASM_LIB_DECL
00345 int yasm_dir_helper_flag_and(void *obj, yasm_valparam *vp, unsigned long line,
00346 void *data, uintptr_t arg);
00347
00362 YASM_LIB_DECL
00363 int yasm_dir_helper_expr(void *obj, yasm_valparam *vp, unsigned long line,
00364 void *data, uintptr_t arg);
00365
00380 YASM_LIB_DECL
00381 int yasm_dir_helper_intn(void *obj, yasm_valparam *vp, unsigned long line,
00382 void *data, uintptr_t arg);
00383
00397 YASM_LIB_DECL
00398 int yasm_dir_helper_string(void *obj, yasm_valparam *vp, unsigned long line,
00399 void *data, uintptr_t arg);
00400
00409 YASM_LIB_DECL
00410 int yasm_dir_helper_valparam_warn(void *obj, yasm_valparam *vp,
00411 unsigned long line, void *data);
00412 #endif