shithub: rgbds

Download patch

ref: cc3aa969b896d1c507e4a873ec82a7bc2242350f
parent: 7055301616bd19116847ec658ebd41b624ed1ecb
parent: b924f58bb0fe5e5cd532137503d9b6fdf47aa59b
author: Anthony J. Bentley <[email protected]>
date: Wed Feb 25 19:25:32 EST 2015

Merge branch 'cldefines' of https://github.com/stag019/rgbds

--- a/Makefile
+++ b/Makefile
@@ -23,6 +23,7 @@
 	src/asm/symbol.o \
 	src/asm/locallex.o \
 	src/extern/err.o \
+	src/extern/reallocarray.o \
 	src/extern/strlcpy.o \
 	src/extern/strlcat.o
 
--- 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 [-hv] [-b chars] [-g chars] [-i path] [-o outfile]\n"
-"              [-p pad_value] file.asm\n");
+"Usage: rgbasm [-hv] [-b chars] [-Dname[=value]] [-g chars] [-i path]\n"
+"              [-o outfile] [-p pad_value] file.asm\n");
 	exit(1);
 }
 
@@ -226,8 +269,14 @@
 
 	char *tzMainfile;
 
+	cldefines_size = 32;
+	cldefines = reallocarray(cldefines, cldefines_size,
+	                        2 * sizeof(void *));
+	if(!cldefines)
+	{
+		fatalerror("No memory for command line defines");
+	}
 
-
 	if (argc == 1)
 		usage();
 
@@ -247,7 +296,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 +307,9 @@
 				    "option 'b'");
 			}
 			break;
+		case 'D':
+			opt_AddDefine(optarg);
+			break;
 		case 'g':
 			if (strlen(optarg) == 4) {
 				newopt.gbgfx[0] = optarg[1];
@@ -323,6 +375,7 @@
 	nErrors = 0;
 	sym_PrepPass1();
 	fstk_Init(tzMainfile);
+	opt_ParseDefines();
 
 	if (CurrentOptions.verbose) {
 		printf("Pass 1...\n");
@@ -350,6 +403,7 @@
 	fstk_Init(tzMainfile);
 	yy_set_state(LEX_STATE_NORMAL);
 	opt_SetCurrentOptions(&DefaultOptions);
+	opt_ParseDefines();
 
 	if (CurrentOptions.verbose) {
 		printf("Pass 2...\n");
--- a/src/asm/rgbasm.1
+++ b/src/asm/rgbasm.1
@@ -8,6 +8,7 @@
 .Nm rgbasm
 .Op Fl hv
 .Op Fl b Ar chars
+.Op Fl D Ar name Ns Op = Ns Ar value
 .Op Fl g Ar chars
 .Op Fl i Ar path
 .Op Fl o Ar outfile
@@ -22,6 +23,12 @@
 .It Fl b Ar chars
 Change the two characters used for binary constants.
 The defaults are 01.
+.It Fl D Ar name Ns Op = Ns Ar value
+Add string symbol to the compiled source code. This is equivalent to
+.Ar name
+.Cm EQUS
+.Qq Ar "value"
+in code. If a value is not specified, a value of 1 is given.
 .It Fl g Ar chars
 Change the four characters used for binary constants.
 The defaults are 0123.