shithub: rgbds

Download patch

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");