|
libyasm
|
00001 00030 #ifndef YASM_VALPARAM_H 00031 #define YASM_VALPARAM_H 00032 00033 #ifndef YASM_LIB_DECL 00034 #define YASM_LIB_DECL 00035 #endif 00036 00038 struct yasm_valparam { 00039 /*@reldef@*/ STAILQ_ENTRY(yasm_valparam) link; 00040 /*@owned@*/ /*@null@*/ char *val; 00043 enum yasm_param_type { 00044 YASM_PARAM_ID, 00045 YASM_PARAM_STRING, 00046 YASM_PARAM_EXPR 00047 } type; 00050 union yasm_param { 00051 /*@owned@*/ char *id; 00052 /*@owned@*/ char *str; 00053 /*@owned@*/ yasm_expr *e; 00054 } param; 00062 char id_prefix; 00063 }; 00064 00066 /*@reldef@*/ STAILQ_HEAD(yasm_valparamhead, yasm_valparam); 00067 00069 struct yasm_directive { 00074 /*@null@*/ const char *name; 00075 00076 const char *parser; 00084 void (*handler) (yasm_object *object, yasm_valparamhead *valparams, 00085 yasm_valparamhead *objext_valparams, unsigned long line); 00086 00088 enum yasm_directive_flags { 00089 YASM_DIR_ANY = 0, 00090 YASM_DIR_ARG_REQUIRED = 1, 00091 YASM_DIR_ID_REQUIRED = 2 00092 } flags; 00093 }; 00094 00104 YASM_LIB_DECL 00105 void yasm_call_directive(const yasm_directive *directive, yasm_object *object, 00106 yasm_valparamhead *valparams, 00107 yasm_valparamhead *objext_valparams, 00108 unsigned long line); 00109 00116 YASM_LIB_DECL 00117 yasm_valparam *yasm_vp_create_id(/*@keep@*/ char *v, /*@keep@*/ char *p, 00118 int id_prefix); 00119 00125 YASM_LIB_DECL 00126 yasm_valparam *yasm_vp_create_string(/*@keep@*/ char *v, /*@keep@*/ char *p); 00127 00133 YASM_LIB_DECL 00134 yasm_valparam *yasm_vp_create_expr(/*@keep@*/ char *v, 00135 /*@keep@*/ yasm_expr *p); 00136 00145 YASM_LIB_DECL 00146 /*@null@*/ /*@only@*/ yasm_expr *yasm_vp_expr 00147 (const yasm_valparam *vp, yasm_symtab *symtab, unsigned long line); 00148 00155 YASM_LIB_DECL 00156 /*@null@*/ /*@dependent@*/ const char *yasm_vp_string(const yasm_valparam *vp); 00157 00163 YASM_LIB_DECL 00164 /*@null@*/ /*@dependent@*/ const char *yasm_vp_id(const yasm_valparam *vp); 00165 00169 YASM_LIB_DECL 00170 yasm_valparamhead *yasm_vps_create(void); 00171 00175 YASM_LIB_DECL 00176 void yasm_vps_destroy(yasm_valparamhead *headp); 00177 00181 void yasm_vps_initialize(/*@out@*/ yasm_valparamhead *headp); 00182 #ifndef YASM_DOXYGEN 00183 #define yasm_vps_initialize(headp) STAILQ_INIT(headp) 00184 #endif 00185 00191 YASM_LIB_DECL 00192 void yasm_vps_delete(yasm_valparamhead *headp); 00193 00198 void yasm_vps_append(yasm_valparamhead *headp, /*@keep@*/ yasm_valparam *vp); 00199 #ifndef YASM_DOXYGEN 00200 #define yasm_vps_append(headp, vp) do { \ 00201 if (vp) \ 00202 STAILQ_INSERT_TAIL(headp, vp, link); \ 00203 } while(0) 00204 #endif 00205 00210 /*@null@*/ /*@dependent@*/ yasm_valparam *yasm_vps_first 00211 (yasm_valparamhead *headp); 00212 #ifndef YASM_DOXYGEN 00213 #define yasm_vps_first(headp) STAILQ_FIRST(headp) 00214 #endif 00215 00220 /*@null@*/ /*@dependent@*/ yasm_valparam *yasm_vps_next(yasm_valparam *cur); 00221 #ifndef YASM_DOXYGEN 00222 #define yasm_vps_next(cur) STAILQ_NEXT(cur, link) 00223 #endif 00224 00230 #ifndef YASM_DOXYGEN 00231 #define yasm_vps_foreach(iter, headp) STAILQ_FOREACH(iter, headp, link) 00232 #endif 00233 00238 YASM_LIB_DECL 00239 void yasm_vps_print(/*@null@*/ const yasm_valparamhead *headp, FILE *f); 00240 00242 typedef struct yasm_dir_help { 00246 const char *name; 00247 00249 int needsparam; 00250 00260 int (*helper) (void *obj, yasm_valparam *vp, unsigned long line, 00261 void *data, uintptr_t arg); 00262 00269 size_t off; 00270 00273 uintptr_t arg; 00274 } yasm_dir_help; 00275 00294 YASM_LIB_DECL 00295 int yasm_dir_helper(void *obj, yasm_valparam *vp_first, unsigned long line, 00296 const yasm_dir_help *help, size_t nhelp, void *data, 00297 int (*helper_valparam) (void *object, 00298 yasm_valparam *vp, 00299 unsigned long line, 00300 void *data)); 00301 00312 YASM_LIB_DECL 00313 int yasm_dir_helper_flag_set(void *obj, yasm_valparam *vp, unsigned long line, 00314 void *data, uintptr_t arg); 00315 00326 YASM_LIB_DECL 00327 int yasm_dir_helper_flag_or(void *obj, yasm_valparam *vp, unsigned long line, 00328 void *data, uintptr_t arg); 00329 00340 YASM_LIB_DECL 00341 int yasm_dir_helper_flag_and(void *obj, yasm_valparam *vp, unsigned long line, 00342 void *data, uintptr_t arg); 00343 00358 YASM_LIB_DECL 00359 int yasm_dir_helper_expr(void *obj, yasm_valparam *vp, unsigned long line, 00360 void *data, uintptr_t arg); 00361 00376 YASM_LIB_DECL 00377 int yasm_dir_helper_intn(void *obj, yasm_valparam *vp, unsigned long line, 00378 void *data, uintptr_t arg); 00379 00393 YASM_LIB_DECL 00394 int yasm_dir_helper_string(void *obj, yasm_valparam *vp, unsigned long line, 00395 void *data, uintptr_t arg); 00396 00405 YASM_LIB_DECL 00406 int yasm_dir_helper_valparam_warn(void *obj, yasm_valparam *vp, 00407 unsigned long line, void *data); 00408 #endif
1.7.3