diff options
author | XANTRONIX Development | 2023-09-13 00:43:08 -0400 |
---|---|---|
committer | XANTRONIX Development | 2023-09-13 00:43:08 -0400 |
commit | bff09eb8bb9d807ca6923ab47196e38978053df6 (patch) | |
tree | f090cd1690b3c2b47a4cfdabdc2a0ef4b7063360 | |
parent | 5bc8a00f02156102e3ac613fb89931262b8b5b45 (diff) | |
download | zxdump-bff09eb8bb9d807ca6923ab47196e38978053df6.tar.gz zxdump-bff09eb8bb9d807ca6923ab47196e38978053df6.tar.bz2 zxdump-bff09eb8bb9d807ca6923ab47196e38978053df6.zip |
Do a better job of emitting whitespace
-rw-r--r-- | main.c | 56 |
1 files changed, 51 insertions, 5 deletions
@@ -48,6 +48,14 @@ typedef struct _zx_basic_line { uint16_t num, len; } zx_basic_line; +enum zx_basic_token_type { + ZX_BASIC_TOKEN_UNKNOWN, + ZX_BASIC_TOKEN_ALNUM, + ZX_BASIC_TOKEN_QUOTE, + ZX_BASIC_TOKEN_SYMBOL, + ZX_BASIC_TOKEN_WORD, +}; + #define ZX_BASIC_STATE_SIZE 116 #define ZX_BASIC_LINE_LAST 0x7676 @@ -249,6 +257,33 @@ static inline int zx_print(uint8_t c, int tty) { return 0; } +static inline enum zx_basic_token_type zx_basic_token_type_get(uint8_t b) { + if (ZX_CHAR_LOW(b)) { + uint32_t codepoint = zx_charset[b]; + + if ((codepoint >= 'A' && codepoint <= 'Z') + || (codepoint >= '0' && codepoint <= '9')) { + return ZX_BASIC_TOKEN_ALNUM; + } else { + return ZX_BASIC_TOKEN_SYMBOL; + } + } else if (ZX_CHAR_INVERSE(b)) { + return zx_basic_token_type_get(b - ZX_CHAR_INVERSE_START); + } else if (ZX_CHAR_TOKEN_LOW(b)) { + return ZX_BASIC_TOKEN_WORD; + } else if (ZX_CHAR_TOKEN_HIGH(b)) { + char *token = zx_tokens[b-ZX_CHAR_TOKEN_HIGH_START]; + + if (token[0] >= 'A' && token[0] <= 'Z') { + return ZX_BASIC_TOKEN_WORD; + } else { + return ZX_BASIC_TOKEN_SYMBOL; + } + } + + return ZX_BASIC_TOKEN_UNKNOWN; +} + static ssize_t zx_dump_basic(int fd) { void *buf; ssize_t total = 0; @@ -294,17 +329,28 @@ static ssize_t zx_dump_basic(int fd) { for (i=0; i<len; i++) { uint8_t c = ((uint8_t *)buf)[i]; - int token = ZX_CHAR_TOKEN(c), - token_last = ZX_CHAR_TOKEN(last); - if (token || token_last) { - if (putchar(' ') < 0) { - goto error_io; + enum zx_basic_token_type type = zx_basic_token_type_get(c), + type_last = zx_basic_token_type_get(last); + + int space = 0; + + if (type == ZX_BASIC_TOKEN_ALNUM) { + if (type_last == ZX_BASIC_TOKEN_WORD) { + space = 1; } + } else if (type == ZX_BASIC_TOKEN_SYMBOL) { + space = 0; + } else if (type == ZX_BASIC_TOKEN_WORD) { + space = 1; } else if (ZX_CHAR_TOKEN_INTEGRAL(c) || ZX_CHAR_TOKEN_FLOAT(c)) { i += 5; } + if (space && putchar(' ') < 0) { + goto error_io; + } + if (zx_print(c, tty) < 0) { goto error_io; } |