commit d25be56

neauoire  ·  2023-08-08 23:47:29 +0000 UTC
parent c5f0dc2
(uxnasm.c) Fixed issue with lambda
1 files changed,  +16, -18
+16, -18
 1@@ -175,6 +175,15 @@ makelabel(char *name)
 2 	return 1;
 3 }
 4 
 5+static char *
 6+makelambda(int id)
 7+{
 8+	scpy("lambda", p.lambda, 0x07);
 9+	p.lambda[6] = '0' + (id >> 0x4);
10+	p.lambda[7] = '0' + (id & 0xf);
11+	return p.lambda;
12+}
13+
14 static int
15 makereference(char *scope, char *label, char rune, Uint16 addr)
16 {
17@@ -183,7 +192,10 @@ makereference(char *scope, char *label, char rune, Uint16 addr)
18 	if(p.refs_len >= 0x800)
19 		return error("References limit exceeded", label);
20 	r = &p.refs[p.refs_len++];
21-	if(label[0] == '&') {
22+	if(label[0] == '{') {
23+		p.lambda_stack[p.lambda_ptr++] = p.lambda_count;
24+		scpy(makelambda(p.lambda_count++), r->name, 0x40);
25+	} else if(label[0] == '&') {
26 		if(!sublabel(subw, scope, label + 1))
27 			return error("Invalid sublabel", label);
28 		scpy(subw, r->name, 0x40);
29@@ -201,15 +213,6 @@ makereference(char *scope, char *label, char rune, Uint16 addr)
30 	return 1;
31 }
32 
33-static char *
34-makelambda(int id)
35-{
36-	scpy("lambda", p.lambda, 0x07);
37-	p.lambda[6] = '0' + (id >> 0x4);
38-	p.lambda[7] = '0' + (id & 0xf);
39-	return p.lambda;
40-}
41-
42 static int
43 writebyte(Uint8 b)
44 {
45@@ -361,14 +364,10 @@ parse(char *w, FILE *f)
46 		while((c = w[++i]))
47 			if(!writebyte(c)) return 0;
48 		break;
49-	case '{': /* lambda start */
50-		p.lambda_stack[p.lambda_ptr++] = p.lambda_count;
51-		makereference(p.scope, makelambda(p.lambda_count++), ' ', p.ptr + 1);
52-		return writebyte(0x60) && writeshort(0xffff, 0);
53 	case '}': /* lambda end */
54 		if(!makelabel(makelambda(p.lambda_stack[--p.lambda_ptr])))
55 			return error("Invalid label", w);
56-		return writebyte(0x6f);
57+		break;
58 	case '[':
59 	case ']':
60 		if(slen(w) == 1) break; /* else fallthrough */
61@@ -498,11 +497,10 @@ writesym(char *filename)
62 int
63 main(int argc, char *argv[])
64 {
65-	int i = 1;
66 	FILE *src, *dst;
67-	if(i == argc)
68+	if(argc == 1)
69 		return error("usage", "uxnasm [-v] input.tal output.rom");
70-	if(argv[i][0] == '-' && argv[i][1] == 'v')
71+	if(argv[1][0] == '-' && argv[1][1] == 'v')
72 		return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 8 Aug 2023.\n");
73 	if(!(src = fopen(argv[1], "r")))
74 		return !error("Invalid input", argv[1]);