diff lwasm/pragma.c @ 352:f5b77989f675

Added PRAGMA and *PRAGMA
author lost@starbug
date Tue, 30 Mar 2010 20:56:54 -0600
parents 619fd6ad4ab9
children a9521955554f
line wrap: on
line diff
--- a/lwasm/pragma.c	Sat Mar 27 23:37:30 2010 -0600
+++ b/lwasm/pragma.c	Tue Mar 30 20:56:54 2010 -0600
@@ -24,6 +24,7 @@
 #include <lw_string.h>
 
 #include "lwasm.h"
+#include "instab.h"
 
 struct pragma_list
 {
@@ -51,7 +52,7 @@
 	{ 0, 0 }
 };
 
-int parse_pragma_string(asmstate_t *as, char *str)
+int parse_pragma_string(asmstate_t *as, char *str, int ignoreerr)
 {
 	char *p;
 	int i;
@@ -78,12 +79,46 @@
 			}
 		}
 		/* unrecognized pragma here */
-		lw_free(p);
-		return 0;
-		
+		if (!ignoreerr)
+		{
+			lw_free(p);
+			return 0;
+		}
 	out:	
 		lw_free(p);
 	}
 	as -> pragmas = pragmas;
 	return 1;
 }
+
+PARSEFUNC(pseudo_parse_pragma)
+{
+	char *ps, *t;
+	
+	for (t = *p; *t && !isspace(*t); t++)
+		/* do nothing */ ;
+	
+	ps = lw_strndup(*p, t - *p);
+	*p = t;
+
+	if (parse_pragma_string(as, ps, 0) == 0)
+	{
+		lwasm_register_error(as, l, "Unrecognized pragma string");
+	}
+	lw_free(ps);
+}
+
+PARSEFUNC(pseudo_parse_starpragma)
+{
+	char *ps, *t;
+	
+	for (t = *p; *t && !isspace(*t); t++)
+		/* do nothing */ ;
+	
+	ps = lw_strndup(*p, t - *p);
+	*p = t;
+
+	// *pragma must NEVER throw an error
+	parse_pragma_string(as, ps, 1);
+	lw_free(ps);
+}