commit a11660f57db0c6ec6fa1b1e048674d86e2a818fd
parent d15b2367f3de1a97bf4b1f2eb95883f2bbfdc361
Author: neauoire <aliceffekt@gmail.com>
Date: Tue, 8 Aug 2023 16:46:35 -0700
(uxnasm.c) Fixed issue with lambda
Diffstat:
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/src/uxnasm.c b/src/uxnasm.c
@@ -175,6 +175,15 @@ makelabel(char *name)
return 1;
}
+static char *
+makelambda(int id)
+{
+ scpy("lambda", p.lambda, 0x07);
+ p.lambda[6] = '0' + (id >> 0x4);
+ p.lambda[7] = '0' + (id & 0xf);
+ return p.lambda;
+}
+
static int
makereference(char *scope, char *label, char rune, Uint16 addr)
{
@@ -183,7 +192,10 @@ makereference(char *scope, char *label, char rune, Uint16 addr)
if(p.refs_len >= 0x800)
return error("References limit exceeded", label);
r = &p.refs[p.refs_len++];
- if(label[0] == '&') {
+ if(label[0] == '{') {
+ p.lambda_stack[p.lambda_ptr++] = p.lambda_count;
+ scpy(makelambda(p.lambda_count++), r->name, 0x40);
+ } else if(label[0] == '&') {
if(!sublabel(subw, scope, label + 1))
return error("Invalid sublabel", label);
scpy(subw, r->name, 0x40);
@@ -201,15 +213,6 @@ makereference(char *scope, char *label, char rune, Uint16 addr)
return 1;
}
-static char *
-makelambda(int id)
-{
- scpy("lambda", p.lambda, 0x07);
- p.lambda[6] = '0' + (id >> 0x4);
- p.lambda[7] = '0' + (id & 0xf);
- return p.lambda;
-}
-
static int
writebyte(Uint8 b)
{
@@ -361,14 +364,10 @@ parse(char *w, FILE *f)
while((c = w[++i]))
if(!writebyte(c)) return 0;
break;
- case '{': /* lambda start */
- p.lambda_stack[p.lambda_ptr++] = p.lambda_count;
- makereference(p.scope, makelambda(p.lambda_count++), ' ', p.ptr + 1);
- return writebyte(0x60) && writeshort(0xffff, 0);
case '}': /* lambda end */
if(!makelabel(makelambda(p.lambda_stack[--p.lambda_ptr])))
return error("Invalid label", w);
- return writebyte(0x6f);
+ break;
case '[':
case ']':
if(slen(w) == 1) break; /* else fallthrough */
@@ -498,11 +497,10 @@ writesym(char *filename)
int
main(int argc, char *argv[])
{
- int i = 1;
FILE *src, *dst;
- if(i == argc)
+ if(argc == 1)
return error("usage", "uxnasm [-v] input.tal output.rom");
- if(argv[i][0] == '-' && argv[i][1] == 'v')
+ if(argv[1][0] == '-' && argv[1][1] == 'v')
return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 8 Aug 2023.\n");
if(!(src = fopen(argv[1], "r")))
return !error("Invalid input", argv[1]);