Nailed it
This commit is contained in:
parent
b98f0041a6
commit
1b8430ae84
2 changed files with 50 additions and 20 deletions
|
@ -24,6 +24,8 @@ enum zx_basic_token_type {
|
||||||
ZX81_BASIC_TOKEN_QUOTE,
|
ZX81_BASIC_TOKEN_QUOTE,
|
||||||
ZX81_BASIC_TOKEN_SYMBOL,
|
ZX81_BASIC_TOKEN_SYMBOL,
|
||||||
ZX81_BASIC_TOKEN_WORD,
|
ZX81_BASIC_TOKEN_WORD,
|
||||||
|
ZX81_BASIC_TOKEN_INTEGRAL,
|
||||||
|
ZX81_BASIC_TOKEN_FLOAT,
|
||||||
};
|
};
|
||||||
|
|
||||||
ssize_t zx81_basic_dump(int fd, FILE *stream);
|
ssize_t zx81_basic_dump(int fd, FILE *stream);
|
||||||
|
|
54
src/basic.c
54
src/basic.c
|
@ -28,6 +28,10 @@ static inline enum zx_basic_token_type zx_basic_token_type_get(uint8_t b) {
|
||||||
return ZX81_BASIC_TOKEN_ALNUM;
|
return ZX81_BASIC_TOKEN_ALNUM;
|
||||||
} else if (codepoint == '"') {
|
} else if (codepoint == '"') {
|
||||||
return ZX81_BASIC_TOKEN_QUOTE;
|
return ZX81_BASIC_TOKEN_QUOTE;
|
||||||
|
} else if (codepoint == '(') {
|
||||||
|
return ZX81_BASIC_TOKEN_PAREN_OPEN;
|
||||||
|
} else if (codepoint == ')') {
|
||||||
|
return ZX81_BASIC_TOKEN_PAREN_CLOSE;
|
||||||
} else {
|
} else {
|
||||||
return ZX81_BASIC_TOKEN_SYMBOL;
|
return ZX81_BASIC_TOKEN_SYMBOL;
|
||||||
}
|
}
|
||||||
|
@ -43,6 +47,10 @@ static inline enum zx_basic_token_type zx_basic_token_type_get(uint8_t b) {
|
||||||
} else {
|
} else {
|
||||||
return ZX81_BASIC_TOKEN_SYMBOL;
|
return ZX81_BASIC_TOKEN_SYMBOL;
|
||||||
}
|
}
|
||||||
|
} else if (ZX81_CHAR_TOKEN_INTEGRAL(b)) {
|
||||||
|
return ZX81_BASIC_TOKEN_INTEGRAL;
|
||||||
|
} else if (ZX81_CHAR_TOKEN_FLOAT(b)) {
|
||||||
|
return ZX81_BASIC_TOKEN_FLOAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ZX81_BASIC_TOKEN_UNKNOWN;
|
return ZX81_BASIC_TOKEN_UNKNOWN;
|
||||||
|
@ -114,22 +122,44 @@ ssize_t zx81_basic_dump(int fd, FILE *stream) {
|
||||||
|
|
||||||
int space = 0;
|
int space = 0;
|
||||||
|
|
||||||
if (type == ZX_BASIC_TOKEN_ALNUM) {
|
switch (type) {
|
||||||
if (type_last == ZX_BASIC_TOKEN_WORD) {
|
case ZX81_BASIC_TOKEN_ALNUM:
|
||||||
|
if (type_last == ZX81_BASIC_TOKEN_WORD)
|
||||||
space = 1;
|
space = 1;
|
||||||
}
|
|
||||||
} else if (type == ZX_BASIC_TOKEN_QUOTE) {
|
break;
|
||||||
if (type_last == ZX_BASIC_TOKEN_WORD) {
|
|
||||||
|
case ZX81_BASIC_TOKEN_QUOTE:
|
||||||
|
if (type_last == ZX81_BASIC_TOKEN_WORD)
|
||||||
space = 1;
|
space = 1;
|
||||||
}
|
|
||||||
} else if (type == ZX_BASIC_TOKEN_SYMBOL) {
|
break;
|
||||||
|
|
||||||
|
case ZX81_BASIC_TOKEN_PAREN_OPEN:
|
||||||
|
if (type_last == ZX81_BASIC_TOKEN_WORD)
|
||||||
|
space = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZX81_BASIC_TOKEN_PAREN_CLOSE:
|
||||||
|
case ZX81_BASIC_TOKEN_SYMBOL:
|
||||||
space = 0;
|
space = 0;
|
||||||
} else if (type == ZX_BASIC_TOKEN_WORD) {
|
break;
|
||||||
if (type_last != ZX_BASIC_TOKEN_SYMBOL) {
|
|
||||||
|
case ZX81_BASIC_TOKEN_WORD:
|
||||||
|
if (type_last != ZX81_BASIC_TOKEN_SYMBOL
|
||||||
|
&& type_last != ZX81_BASIC_TOKEN_PAREN_OPEN)
|
||||||
space = 1;
|
space = 1;
|
||||||
}
|
|
||||||
} else if (ZX81_CHAR_TOKEN_INTEGRAL(c) || ZX81_CHAR_TOKEN_FLOAT(c)) {
|
break;
|
||||||
|
|
||||||
|
case ZX81_BASIC_TOKEN_INTEGRAL:
|
||||||
|
case ZX81_BASIC_TOKEN_FLOAT:
|
||||||
i += 5;
|
i += 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZX81_BASIC_TOKEN_UNKNOWN:
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (space && fputc(' ', stream) < 0) {
|
if (space && fputc(' ', stream) < 0) {
|
||||||
|
@ -143,12 +173,10 @@ ssize_t zx81_basic_dump(int fd, FILE *stream) {
|
||||||
last = c;
|
last = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ZX81_CHAR_NEWLINE(((uint8_t *)buf)[i-1])) {
|
|
||||||
if (fputc('\n', stream) < 0) {
|
if (fputc('\n', stream) < 0) {
|
||||||
goto error_io;
|
goto error_io;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue