libyasm/valparam.h

Go to the documentation of this file.
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     /*@reldef@*/ STAILQ_ENTRY(yasm_valparam) link;  
00044     /*@owned@*/ /*@null@*/ 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         /*@owned@*/ char *id;                   
00056         /*@owned@*/ char *str;                  
00057         /*@owned@*/ yasm_expr *e;               
00058     } param;                                    
00066     char id_prefix;
00067 };
00068 
00070 /*@reldef@*/ STAILQ_HEAD(yasm_valparamhead, yasm_valparam);
00071 
00073 struct yasm_directive {
00078     /*@null@*/ 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(/*@keep@*/ char *v, /*@keep@*/ char *p,
00122                                  int id_prefix);
00123 
00129 YASM_LIB_DECL
00130 yasm_valparam *yasm_vp_create_string(/*@keep@*/ char *v, /*@keep@*/ char *p);
00131 
00137 YASM_LIB_DECL
00138 yasm_valparam *yasm_vp_create_expr(/*@keep@*/ char *v,
00139                                    /*@keep@*/ yasm_expr *p);
00140 
00149 YASM_LIB_DECL
00150 /*@null@*/ /*@only@*/ yasm_expr *yasm_vp_expr
00151     (const yasm_valparam *vp, yasm_symtab *symtab, unsigned long line);
00152 
00159 YASM_LIB_DECL
00160 /*@null@*/ /*@dependent@*/ const char *yasm_vp_string(const yasm_valparam *vp);
00161 
00167 YASM_LIB_DECL
00168 /*@null@*/ /*@dependent@*/ 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(/*@out@*/ 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, /*@keep@*/ 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 /*@null@*/ /*@dependent@*/ 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 /*@null@*/ /*@dependent@*/ 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(/*@null@*/ 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

Generated on Sat Sep 6 01:23:36 2008 for libyasm by  doxygen 1.5.2