#include <stdlib.h>
#include <string.h>
#include <assert.h>
-#include <unistd.h>
FILE *ulasin = NULL;
FILE *ulasout = NULL;
ulasin = ulas_fopen(cfg.argv[0], "re", stdin);
}
+ // only do 2 pass if we have a file as input
+ // because we cannot really rewind stdout
+ if (!cfg.preproc_only && ulasin != stdin) {
+ ulas.pass = ULAS_PASS_RESOLVE;
+ }
+
FILE *preprocdst = NULL;
+ while (ulas.pass >= 0) {
+ if (ulascfg.verbose) {
+ fprintf(ulaserr, "[Pass %d]\n", ulas.pass);
+ }
- if (cfg.preproc_only) {
- preprocdst = ulasout;
- } else {
- preprocdst = tmpfile();
- }
+ // FIXME: it would be nice if we could do the 2 pass by clearing the
+ // tmpfile instead of making an entierly new one
+ if (cfg.preproc_only) {
+ preprocdst = ulasout;
+ } else {
+ preprocdst = tmpfile();
+ }
- if (ulas_preproc(preprocdst, ulasin) == -1) {
- rc = -1;
- goto cleanup;
- }
+ if (ulas_preproc(preprocdst, ulasin) == -1) {
+ rc = -1;
+ goto cleanup;
+ }
- if (cfg.preproc_only) {
- goto cleanup;
+ if (ulas.pass > ULAS_PASS_FINAL) {
+ fclose(preprocdst);
+ preprocdst = NULL;
+ rewind(ulasin);
+ }
+ ulas.pass -= 1;
}
cleanup:
- if (!cfg.preproc_only) {
+ if (!cfg.preproc_only && preprocdst) {
ulas_fclose(preprocdst);
}