From: Lukas Krickl Date: Mon, 20 Nov 2023 18:17:50 +0000 (+0100) Subject: Fixed files X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=0436000ca3a8e231c138ca2be407b5e0298aac4d;p=ulas%2F.git Fixed files --- diff --git a/include/ulas.h b/include/ulas.h index a1b2a9e..0f37c43 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -46,6 +46,10 @@ #define ULAS_TOK_PREPROC_BEGIN '#' #define ULASINFO() fprintf(ulaserr, "%s:%ld ", ulas.filename, ulas.line); +#define ULASDBG(...) \ + if (ulascfg.verbose) { \ + fprintf(ulaserr, __VA_ARGS__); \ + } #define ULASERR(...) ULASINFO() fprintf(ulaserr, __VA_ARGS__); #define ULASWARN(...) ULASINFO() fprintf(ulaserr, __VA_ARGS__); #define ULASPANIC(...) \ @@ -61,9 +65,20 @@ fprintf((f), "%s", (fmt)); \ } +/** + * Output target files + */ + +// input file for source reader extern FILE *ulasin; +// source code output target extern FILE *ulasout; +// error output target extern FILE *ulaserr; +// assembly listing output +extern FILE *ulaslstout; +// symbol list output +extern FILE *ulassymout; struct ulas_expr; struct ulas_tok; @@ -150,9 +165,6 @@ struct ulas { // internal counter // used whenever a new unique number might be needed int icntr; - - FILE *lstout; - FILE *symout; }; extern struct ulas ulas; diff --git a/src/main.c b/src/main.c index b1e618a..d801c9b 100644 --- a/src/main.c +++ b/src/main.c @@ -55,7 +55,7 @@ void ulas_getopt(int argc, char **argv, struct ulas_config *cfg) { cfg->sym_path = strndup(optarg, ULAS_PATHMAX); break; case 'l': - cfg->sym_path = strndup(optarg, ULAS_PATHMAX); + cfg->lst_path = strndup(optarg, ULAS_PATHMAX); break; case '?': break; diff --git a/src/ulas.c b/src/ulas.c index 6dc78b3..903b739 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -8,6 +8,8 @@ FILE *ulasin = NULL; FILE *ulasout = NULL; FILE *ulaserr = NULL; +FILE *ulaslstout = NULL; +FILE *ulassymout = NULL; struct ulas_config ulascfg; struct ulas ulas; @@ -22,6 +24,7 @@ void ulas_init(struct ulas_config cfg) { if (ulaserr == NULL) { ulaserr = stderr; } + ulascfg = cfg; // init assembly context @@ -35,7 +38,6 @@ void ulas_init(struct ulas_config cfg) { ulas.toks = ulas_tokbuf(); ulas.exprs = ulas_exprbuf(); - ulas.lstout = stdout; } void ulas_free(void) { @@ -53,25 +55,49 @@ struct ulas_config ulas_cfg_from_env(void) { return cfg; } +FILE *ulas_fopen(const char *path, const char *mode, FILE *stdfile) { + if (!path || strncmp(path, "-", 1) == 0) { + return stdfile; + } + FILE *f = fopen(path, mode); + + if (!f) { + ULASPANIC("%s: %s\n", path, strerror(errno)); + return NULL; + } + return f; +} + +void ulas_fclose(FILE *f) { + if (!f || f == stdin || f == stdout || f == stderr) { + return; + } + + fclose(f); +} + int ulas_main(struct ulas_config cfg) { int rc = 0; + ulas_init(cfg); if (cfg.output_path) { - ulasout = fopen(cfg.output_path, "we"); - if (!ulasout) { - fprintf(ulaserr, "%s: %s\n", cfg.output_path, strerror(errno)); - return -1; - } + ULASDBG("output: %s\n", cfg.output_path); + ulasout = ulas_fopen(cfg.output_path, "we", stdout); } - if (cfg.argc > 0) { - ulasin = fopen(cfg.argv[0], "re"); - if (!ulasin) { - fprintf(ulaserr, "%s: %s\n", cfg.argv[0], strerror(errno)); - return -1; - } + if (cfg.sym_path) { + ULASDBG("symbols: %s\n", cfg.sym_path); + ulassymout = ulas_fopen(cfg.sym_path, "we", stdout); } - ulas_init(cfg); + if (cfg.lst_path) { + ULASDBG("list: %s\n", cfg.lst_path); + ulaslstout = ulas_fopen(cfg.lst_path, "we", stdout); + } + + if (cfg.argc > 0) { + ULASDBG("input: %s\n", cfg.argv[0]); + ulasin = ulas_fopen(cfg.argv[0], "re", stdin); + } FILE *preprocdst = NULL; @@ -92,25 +118,23 @@ int ulas_main(struct ulas_config cfg) { cleanup: if (!cfg.preproc_only) { - fclose(preprocdst); + ulas_fclose(preprocdst); } if (cfg.output_path) { - fclose(ulasout); + ulas_fclose(ulasout); } if (cfg.sym_path) { - fclose(ulas.symout); - ulas.symout = NULL; + ulas_fclose(ulassymout); } if (cfg.lst_path) { - fclose(ulas.lstout); - ulas.lstout = NULL; + ulas_fclose(ulaslstout); } if (cfg.argc > 0) { - fclose(ulasin); + ulas_fclose(ulasin); } ulas_free(); @@ -1396,9 +1420,9 @@ int ulas_asmline(FILE *dst, FILE *src, const char *line, unsigned long n) { fwrite(outbuf, 1, towrite, dst); - if (ulas.lstout) { + if (ulaslstout) { // TODO: verbose output
\tline - fprintf(ulas.lstout, "%08X\t%s", ulas.address, start); + fprintf(ulaslstout, "%08X\t%s", ulas.address, start); } fail: