#ifndef ASMPP_H #define ASMPP_H #include "asmln.h" #include "asmdata.h" #include #include typedef struct asmpp_def asmpp_def_t; typedef struct asmpp_lines asmpp_lines_t; typedef struct asmpp_macro asmpp_macro_t; typedef struct asmpp_context asmpp_context_t; typedef struct asmpp asmpp_t; // Either outputs a line or handles some builtin macro typedef int (*asmpp_systemf_t)(asmpp_t* pp, asmln_t* ln); struct asmpp_def { int t; char* value; asmlnx_t* x; }; struct asmpp_lines { asmln_t* line; asmpp_lines_t* next; }; struct asmpp_macro { asmln_t* proto; asmpp_systemf_t systemf; asmpp_lines_t* lines; asmpp_macro_t* next; }; #define ASMPP_CONTEXT_OUTER 0 #define ASMPP_CONTEXT_MACRO_EXPAND 1 #define ASMPP_CONTEXT_MACRO_COLLECT 2 #define ASMPP_CONTEXT_IF_EXPAND 3 #define ASMPP_CONTEXT_IF_PARSEONLY 4 struct asmpp_context { //bool collecting; int type; uint64_t ifvalue; asmpp_macro_t* macro; asmdata_map_t* locals; asmpp_context_t* next; }; struct asmpp { void* udata; asmpp_systemf_t outputf; asmdata_map_t* defs; asmdata_map_t* macros; asmpp_context_t* context; }; asmpp_t* asmpp_new(asmpp_systemf_t outputf, void* udata); void asmpp_delete(asmpp_t* pp); asmpp_context_t* asmpp_enter(asmpp_t* pp, int type, asmpp_macro_t* macro); void asmpp_exit(asmpp_t* pp, asmpp_context_t* context); asmpp_macro_t* asmpp_quickmacro(asmpp_t* pp, asmln_t* proto, asmpp_systemf_t systemf); asmpp_def_t* asmpp_finddef(asmpp_t* pp, char* name); asmpp_macro_t* asmpp_findmacro(asmpp_t* pp, char* name, int nparams); int asmpp_expand(asmpp_t* pp, asmln_t* ln); bool asmpp_binop(asmpp_t* pp, uint64_t lhsresult, int lhssig, char* op, uint64_t rhsresult, int rhssig, uint64_t* resultp, char** errp, int* signp); bool asmpp_calc(asmpp_t* pp, int t, char* str, asmlnx_t* x, uint64_t* resultp, char** errp, int* signp); // From idndef at top of file: #endif