ULAS_PASS_RESOLVE = 1,
};
+struct ulas_preproc {
+ struct ulas_ppdef *defs;
+ unsigned long defslen;
+
+ struct ulas_str tok;
+ struct ulas_str line;
+
+ // macro parameter buffers
+ struct ulas_str macroparam[ULAS_MACROPARAMMAX];
+ // macro expansion buffer
+ struct ulas_str macrobuf;
+};
+
struct ulas {
+ struct ulas_preproc pp;
char *filename;
char *initial_filename;
unsigned long line;
int undef;
};
-struct ulas_preproc {
- struct ulas_ppdef *defs;
- unsigned long defslen;
-
- struct ulas_str tok;
- struct ulas_str line;
-
- // macro parameter buffers
- struct ulas_str macroparam[ULAS_MACROPARAMMAX];
- // macro expansion buffer
- struct ulas_str macrobuf;
-};
-
/**
* Expressions
*
*/
struct ulas_preproc ulas_preprocinit(void);
+void ulas_preprocclear(struct ulas_preproc *pp);
void ulas_preprocfree(struct ulas_preproc *pp);
/**
#define assert_preproc(expect_dst, expect_ret, input) \
{ \
+ ulas_preprocclear(&ulas.pp); \
ulas.pass = ULAS_PASS_RESOLVE; \
char dstbuf[ULAS_LINEMAX]; \
memset(dstbuf, 0, ULAS_LINEMAX); \
ulas.toks = ulas_tokbuf();
ulas.exprs = ulas_exprbuf();
ulas.syms = ulas_symbuf();
+ ulas.pp = ulas_preprocinit();
}
void ulas_nextpass(void) {
ulas_tokbuffree(&ulas.toks);
ulas_exprbuffree(&ulas.exprs);
ulas_symbuffree(&ulas.syms);
+ ulas_preprocfree(&ulas.pp);
}
int ulas_icntr(void) { return ulas.icntr++; }
return pp;
}
-void ulas_preprocfree(struct ulas_preproc *pp) {
- ulas_strfree(&pp->line);
- ulas_strfree(&pp->tok);
-
+void ulas_preprocclear(struct ulas_preproc *pp) {
for (unsigned long i = 0; i < pp->defslen; i++) {
if (pp->defs[i].name) {
free(pp->defs[i].name);
}
}
+ pp->defslen = 0;
+}
+
+void ulas_preprocfree(struct ulas_preproc *pp) {
+ ulas_strfree(&pp->line);
+ ulas_strfree(&pp->tok);
+
+ ulas_preprocclear(pp);
+
for (unsigned long i = 0; i < ULAS_MACROPARAMMAX; i++) {
ulas_strfree(&pp->macroparam[i]);
}
int rc = 0;
// init
- struct ulas_preproc pp = ulas_preprocinit();
long prevseek = ftell(asmsrc);
// preproc
- while ((rc = ulas_preprocnext(&pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
+ while ((rc = ulas_preprocnext(&ulas.pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
if (ulascfg.preproc_only) {
continue;
}
}
fail:
- // cleanup
- ulas_preprocfree(&pp);
-
return rc;
}