libyasm

libyasm/valparam.h

Go to the documentation of this file.
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