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;
ulas_getopt(argc, argv, &cfg);
cfg.incpaths = incpaths;
cfg.incpathslen = incpathslen;
+ cfg.defs = defs;
+ cfg.defslen = defslen;
int res = ulas_main(cfg);
#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) \
}
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");
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) {
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) {
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;
}
#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 "/"
unsigned int incpathslen;
enum ulas_warm warn_level;
+
+ // initial defs for preproc
+ char **defs;
+ unsigned int defslen;
};
/**