diff lwasm/lwasm.c @ 142:697bc543368c

Implement distinction between . and * for OS9 modules
author lost@l-w.ca
date Fri, 19 Aug 2011 23:55:40 -0600
parents 7e621e00b887
children 8dead67ba607
line wrap: on
line diff
--- a/lwasm/lwasm.c	Fri Aug 19 20:36:43 2011 -0600
+++ b/lwasm/lwasm.c	Fri Aug 19 23:55:40 2011 -0600
@@ -104,7 +104,16 @@
 				return lw_expr_build(lw_expr_type_int, 0);
 			return NULL;
 		}
-			
+
+	case lwasm_expr_linedlen:
+		{
+			line_t *cl = ptr;
+			if (cl -> dlen == -1)
+				return NULL;
+			return lw_expr_build(lw_expr_type_int, cl -> dlen);
+		}
+		break;
+					
 	case lwasm_expr_linelen:
 		{
 			line_t *cl = ptr;
@@ -114,6 +123,12 @@
 		}
 		break;
 		
+	case lwasm_expr_linedaddr:
+		{
+			line_t *cl = ptr;
+			return lw_expr_copy(cl -> daddr);
+		}
+	
 	case lwasm_expr_lineaddr:
 		{
 			line_t *cl = ptr;
@@ -284,14 +299,19 @@
 	if (!**p)
 		return NULL;
 	
-	if (**p == '*' || (
-			**p == '.'
+	if (**p == '.'
 			&& !((*p)[1] >= 'A' && (*p)[1] <= 'Z')
 			&& !((*p)[1] >= 'a' && (*p)[1] <= 'z')
 			&& !((*p)[1] >= '0' && (*p)[1] <= '9')
-		))
+		)
 	{
-		// special "symbol" for current line addr (*, .)
+		(*p)++;
+		return lw_expr_build(lw_expr_type_special, lwasm_expr_linedaddr, as -> cl);
+	}
+	
+	if (**p == '*')
+	{
+		// special "symbol" for current line addr (*)
 		(*p)++;
 		return lw_expr_build(lw_expr_type_special, lwasm_expr_lineaddr, as -> cl);
 	}