(uxnasm) Generalized lambdas as common labels
This commit is contained in:
parent
9ca8e9623d
commit
2ddc20b1b6
29
src/uxnasm.c
29
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 */
|
||||
|
|
Loading…
Reference in New Issue