Added -D flag to allow defining preproc symbols using the command line
authorLukas Krickl <lukas@krickl.dev>
Fri, 4 Oct 2024 17:27:26 +0000 (19:27 +0200)
committerLukas Krickl <lukas@krickl.dev>
Fri, 4 Oct 2024 17:27:26 +0000 (19:27 +0200)
src/main.c
src/test.c
src/ulas.c
src/ulas.h
tests/t0.bin
tests/t0.s
tests/t0_dasm.s

index 8156550eb3d3e425fa29af51f8b48c038f7342b5..2d31a31d7f797fab725333b344359ba03a5f639e 100644 (file)
@@ -60,6 +60,10 @@ void ulas_getopt(int argc, char **argv, struct ulas_config *cfg) {
     case 'A':
       cfg->print_addrs = 1;
       break;
+    case 'D':
+      assert(defslen < ULAS_DEFSMAX);
+      defs[defslen++] = strndup(optarg, ULAS_PATHMAX);
+      break;
     case 'S':
       if (strcmp("ulas", optarg) == 0) {
         cfg->sym_fmt = ULAS_SYM_FMT_DEFAULT; 
@@ -91,6 +95,8 @@ int main(int argc, char **argv) {
   ulas_getopt(argc, argv, &cfg);
   cfg.incpaths = incpaths;
   cfg.incpathslen = incpathslen;
+  cfg.defs = defs;
+  cfg.defslen = defslen;
 
   int res = ulas_main(cfg);
 
index 8410575fc590cf3720845073ea297311922c1716..8b912b2787721d68adba6edeb503f62c2bebca24 100644 (file)
@@ -410,6 +410,8 @@ void test_symscope(void) {
 #define ASSERT_FULL_ASM(expect_rc, in_path, expect_path)                       \
   {                                                                            \
     struct ulas_config cfg = ulas_cfg_from_env();                              \
+    char *defs[] = {"ULAS_PREDEF"};                                            \
+    cfg.defs = defs;              cfg.defslen = 1;                                             \
     ASSERT_FULL(expect_rc, in_path, expect_path)                               \
   }
 
index a4dedf56b3dcc4c5c985b358539bb3e9cbd7c141..de11a36a53361f86e60d54f9b198051dc1728f13 100644 (file)
@@ -18,9 +18,13 @@ struct ulas ulas;
 char *incpaths[ULAS_INCPATHSMAX];
 unsigned long incpathslen = 0;
 
+char *defs[ULAS_DEFSMAX];
+unsigned long defslen = 0;
+
 void ulas_help(void) {
   printf("%s\n", ULAS_NAME);
-  printf("Usage %s [-%s] [-o=path] [-i=path] [-l=path] [-a=initial-address] [-S=ulas|mlb] "
+  printf("Usage %s [-%s] [-o=path] [-i=path] [-l=path] [-a=initial-address] "
+         "[-S=ulas|mlb] "
          "[input]\n\n",
          ULAS_NAME, ULAS_OPTS);
   ULAS_HELP("h", "display this help and exit");
@@ -35,12 +39,12 @@ void ulas_help(void) {
   ULAS_HELP("A", "Print addresses in disassembler mode");
   ULAS_HELP("d", "Disassemble a file");
   ULAS_HELP("S", "Set the symbol format");
+  ULAS_HELP("D=name", "Define a symbol");
   ULAS_HELP("w=warning", "Toggle warnings: a=all, o=overflow");
 }
 
 void ulas_version(void) { printf("%s version %s\n", ULAS_NAME, ULAS_VER); }
 
-
 void ulas_init(struct ulas_config cfg) {
   // init global cfg
   if (ulasin == NULL) {
@@ -365,8 +369,8 @@ int ulas_symbolout_mlbloc(FILE *dst, long addr) {
     fprintf(dst, "Unknown:");
     return 0;
   }
-  
-  // TODO: maybe allow the user to define this by using 
+
+  // TODO: maybe allow the user to define this by using
   // .section and just trust the label location in the source
   // is correct
   switch (ulas.arch.type) {
@@ -1216,6 +1220,14 @@ struct ulas_preproc ulas_preprocinit(void) {
     pp.macroparam[i] = ulas_str(8);
   }
   pp.macrobuf = ulas_str(8);
+
+  // set up initial defs
+  for (int i = 0; i < ulascfg.defslen; i++) {
+
+    struct ulas_ppdef def = {ULAS_PPDEF, strdup(ulascfg.defs[i]), strdup(""), 0};
+    ulas_preprocdef(&pp, def);
+  }
+
   return pp;
 }
 
index 9a7ea12193220bb1715cd22171dc15219132c9f7..f85c5bf9d6e87eb04ca35a80a1efdbe19c9e58b7 100644 (file)
@@ -13,7 +13,7 @@
 #define ULAS_OPTS "hvVpdA"
 
 // args with value
-#define ULAS_OPTS_ARG "o:l:s:i:w:a:S:"
+#define ULAS_OPTS_ARG "o:l:s:i:w:a:S:D:"
 
 #define ULAS_HELP(a, desc) printf("\t-%s\t%s\n", (a), desc);
 
 extern char *incpaths[ULAS_INCPATHSMAX];
 extern unsigned long incpathslen;
 
+#define ULAS_DEFSMAX 256
+extern char *defs[ULAS_DEFSMAX];
+extern unsigned long defslen;
+
 // if this is used as a path use stdin or stdout instead
 #define ULAS_STDFILEPATH "-"
 #define ULAS_PATHSEP "/"
@@ -161,6 +165,10 @@ struct ulas_config {
   unsigned int incpathslen;
 
   enum ulas_warm warn_level;
+
+  // initial defs for preproc 
+  char **defs;
+  unsigned int defslen;
 };
 
 /**
index 4f18f9a43542ebf2402d537bcb4dba529ac78012..bd436c2f0552e558120389cc70d36fd5b7186cb6 100644 (file)
Binary files a/tests/t0.bin and b/tests/t0.bin differ
index 18f76f82336a7bdc6c3b2c74268663f6ad54e994..684ffa3544f6f22e6237b8e261b0cdb00805b72b 100644 (file)
@@ -160,3 +160,10 @@ toplevel 5, 6
 :
   halt
 
+#ifdef ULAS_PREDEF
+  halt
+#endif
+
+#ifndef ULAS_PREDEF
+  xor a, a
+#endif
index 0ea1f10b768afca26142a3893220a6183d607203..c682cadbf71155a019a1131b6c3f348f2b62e19c 100644 (file)
 .db 0x74
   dec b
   inc b
-.db 0x6
+  ld b, 0x76
 .db 0x76