diff src/macro.c @ 67:d5fe306f1ab1

Fixed numerous bugs in macro handling
author lost
date Mon, 05 Jan 2009 05:40:33 +0000
parents 035b95a3690f
children cef25b0088e6
line wrap: on
line diff
--- a/src/macro.c	Mon Jan 05 05:40:16 2009 +0000
+++ b/src/macro.c	Mon Jan 05 05:40:33 2009 +0000
@@ -146,7 +146,7 @@
 	macrotab_t *m;
 
 	char **args = NULL;		// macro arguments
-	int nargs;				// number of arguments
+	int nargs = 0;			// number of arguments
 
 	char *p2, *p3;
 	
@@ -183,6 +183,7 @@
 					if (p2[1])
 						p2++;
 				}
+				p2++;
 			}
 			
 			// have arg here
@@ -238,6 +239,7 @@
 			nl -> nocodelen = 0;
 			nl -> addrset = 0;
 			nl -> symaddr = -1;
+			nl -> badop = 0;
 			if (as -> linestail)
 				as -> linestail -> next = nl;
 			as -> linestail = nl;
@@ -256,13 +258,13 @@
 					n = *p2 - '0';
 					if (n == 0)
 					{
-						for (p3 = m -> name; p3; p3++)
+						for (p3 = m -> name; *p3; p3++)
 							macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
 						continue;
 					}
 					if (n < 1 || n > nargs)
 						continue;
-					for (p3 = args[n]; p3; p3++)
+					for (p3 = args[n - 1]; *p3; p3++)
 						macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
 					continue;
 				}
@@ -283,13 +285,13 @@
 					 
 					if (n == 0)
 					{
-						for (p3 = m -> name; p3; p3++)
+						for (p3 = m -> name; *p3; p3++)
 							macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
 						continue;
 					}
 					if (n < 1 || n > nargs)
 						continue;
-					for (p3 = args[n]; p3; p3++)
+					for (p3 = args[n - 1]; *p3; p3++)
 						macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
 					continue;
 				}
@@ -312,11 +314,14 @@
 	as -> context = oldcontext;
 
 	// clean up
-	while (nargs)
+	if (args)
 	{
-		lwasm_free(args[--nargs]);
+		while (nargs)
+		{
+			lwasm_free(args[--nargs]);
+		}
+		lwasm_free(args);
 	}
-	lwasm_free(args);
 
 	// indicate a macro was expanded
 	return 0;