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]);