ref: fd4327327c7860095645a51783e863923870338a
parent: d81d128a049bac6e19dca597d7b5d8f551d81e39
author: stag019 <[email protected]>
date: Mon Feb 23 16:23:51 EST 2015
Command line definitions.
--- a/src/asm/main.c
+++ b/src/asm/main.c
@@ -11,10 +11,14 @@
#include "asm/output.h"
#include "asm/main.h"
#include "extern/err.h"
+#include "extern/reallocarray.h"
int yyparse(void);
void setuplex(void);
+int cldefines_index;
+int cldefines_size;
+char **cldefines;
clock_t nStartClock, nEndClock;
SLONG nLineNo;
ULONG nTotalLines, nPass, nPC, nIFDepth, nErrors;
@@ -174,6 +178,45 @@
fatalerror("No entries in the option stack");
}
+void
+opt_AddDefine(char *s)
+{
+ char *value, *equals;
+ if(cldefines_index >= cldefines_size)
+ {
+ cldefines_size *= 2;
+ cldefines = reallocarray(cldefines, cldefines_size
+ 2 * sizeof(void *));
+ if(!cldefines)
+ {
+ fatalerror("No memory for command line defines");
+ }
+ }
+ equals = strchr(s, '=');
+ if(equals)
+ {
+ *equals = '\0';
+ value = equals + 1;
+ }
+ else
+ {
+ value = "1";
+ }
+ cldefines[cldefines_index++] = s;
+ cldefines[cldefines_index++] = value;
+}
+
+void
+opt_ParseDefines()
+{
+ int i;
+
+ for(i = 0; i < cldefines_index; i += 2)
+ {
+ sym_AddString(cldefines[i], cldefines[i + 1]);
+ }
+}
+
/*
* Error handling
*/
@@ -211,8 +254,8 @@
usage(void)
{
printf(
-"Usage: rgbasm [-v] [-h] [-b chars] [-g chars] [-i path] [-o outfile]\n"
-" [-p pad_value] file.asm\n");
+"Usage: rgbasm [-v] [-h] [-b chars] [-Dname[=value]] [-g chars] [-i path]\n"
+" [-o outfile] [-p pad_value] file.asm\n");
exit(1);
}
@@ -226,8 +269,13 @@
char *tzMainfile;
+ cldefines_size = 32;
+ cldefines = reallocarray(cldefines_size, 2 * sizeof(void *));
+ if(!cldefines)
+ {
+ fatalerror("No memory for command line defines");
+ }
-
if (argc == 1)
usage();
@@ -247,7 +295,7 @@
newopt = CurrentOptions;
- while ((ch = getopt(argc, argv, "b:g:hi:o:p:v")) != -1) {
+ while ((ch = getopt(argc, argv, "b:D:g:hi:o:p:v")) != -1) {
switch (ch) {
case 'b':
if (strlen(optarg) == 2) {
@@ -258,6 +306,9 @@
"option 'b'");
}
break;
+ case 'D':
+ opt_AddDefine(optarg);
+ break;
case 'g':
if (strlen(optarg) == 4) {
newopt.gbgfx[0] = optarg[1];
@@ -323,6 +374,7 @@
nErrors = 0;
sym_PrepPass1();
fstk_Init(tzMainfile);
+ opt_ParseDefines();
if (CurrentOptions.verbose) {
printf("Pass 1...\n");
@@ -350,6 +402,7 @@
fstk_Init(tzMainfile);
yy_set_state(LEX_STATE_NORMAL);
opt_SetCurrentOptions(&DefaultOptions);
+ opt_ParseDefines();
if (CurrentOptions.verbose) {
printf("Pass 2...\n");