diff options
-rw-r--r-- | iron.golem | 196 |
1 files changed, 94 insertions, 102 deletions
@@ -1,57 +1,48 @@ aton(str) { - local i = 0; local out = 0; loop { - if ([str + i] != '+') + if ([str] != '+') break; - i++; + str++; } loop { - if ([str + i] == 0 | isdigit([str + i]) == 0) - break; - out = out * 10 + [str + i] - '0'; - i++; + if ([str] == 0 | isdigit([str]) == 0) + return out; + out = out * 10 + [str] - '0'; + str++; } - return out; } aton_s(str) { - local i = 0; local sign = 0; local out = 0; loop { - if ([str + i] == '-') + if ([str] == '-') sign = sign == 0; - else if ([str + i] != '+') + else if ([str] != '+') break; - i++; + str++; } loop { - if ([str + i] == 0 | isdigit([str + i]) == 0) - break; - out = out * 10 + [str + i] - '0'; - i++; + if ([str] == 0 | isdigit([str]) == 0) + return (sign * (0 - out)) | ((sign == 0) * out); + out = out * 10 + [str] - '0'; + str++; } - if (sign) - return (0 - out); - return out; } -bzero(tab, size) memset(tab, size, 0); +bzero(tab, size) => memset(tab, size, 0); contain_only(to_big, to_find) { - local tmp; - - tmp = to_big; loop { - if ([tmp] == 0) + if ([to_big] == 0) return 1; - if (strchr(to_find, [tmp]) == 0) + if (strchr(to_find, [to_big]) == 0) return 0; - tmp++; + to_big++; } } define NUM_MAX = 0xffff; @@ -71,9 +62,9 @@ free_tab(tab) free([tmp]); tmp++; } - free(tab); + return free(tab); } -define HEAP_SIZE = 0x8000; +define HEAP_SIZE = 0x4000; global heap[HEAP_SIZE] = 0; define PADDING_SIZE = 4; @@ -101,11 +92,7 @@ define HEADER_SIZE = 5; 🗿 Is used to check invalid write 🗿 If a case doesn't equal to 0 it is an invalid write -define LOCATION_INITIALISED = 0; -define LOCATION_USED = 1; -define LOCATION_SIZE = 2; -define LOCATION_PREV = 3; -define LOCATION_NEXT = 4; +enum LOCATION_INITIALISED, LOCATION_USED, LOCATION_SIZE, LOCATION_PREV, LOCATION_NEXT; define LOCATION_DATA = HEADER_SIZE + PADDING_SIZE; galloc_setup_header(ptr, used, size, next_block, prev_block) @@ -242,21 +229,38 @@ leaks() { return ([heap + LOCATION_NEXT] != 0); } -geadline(prompt) { +geadline2(prompt, text) +{ local capacity = 64, size = 0, i = 0, c, a, - buf = galloc(capacity); + buf; + if (text) { + size = strlen(text); + i = size; + loop { + if (capacity > size) + break; + capacity = capacity * 2; + } + buf = galloc(capacity); + if (buf == NULL) + return NULL; + strcpy(buf, text); + } else { + buf = galloc(capacity); + if (buf == NULL) + return NULL; + [buf] = 0; + } if (prompt) putstr(prompt); - if (buf == NULL) - return NULL; - [buf] = 0; + putstr(buf); loop { - red &c; + c = getchar(); if ((c == 0xffff) | (c == 0x04)) { if ((size == 0) | (c == 0xffff)) { free(buf); @@ -264,8 +268,8 @@ geadline(prompt) { } } else if (c == 0x1b) { // ESC code - red &c; // skip [ - red &c; // value + getchar(); // skip [ + c = getchar(); // value if ((c == 'A') & (size > 0)) { loop { @@ -316,6 +320,8 @@ geadline(prompt) { esccode('D'); } } + } else if (c == '\n') { + return buf; } else { size = size + 1; if (size >= capacity) { @@ -342,17 +348,24 @@ geadline(prompt) { esccode('D'); } i = i + 1; - if (c == '\n') - return buf; } } } -esccode(c) { +geadline(prompt) => geadline2(prompt, NULL); + +esccode(c) +{ wrt 0x1b; wrt '['; wrt c; } +getchar() +{ + local c; + red &c; + return c; +} get_raw_bit(number) { local tab = galloc(16); @@ -376,11 +389,11 @@ get_raw_bit(number) [tab + 15] = number & 0x1; return tab; } -isalpha(c) return (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z'); -isascii(c) return c < 128; -isdigit(c) return c >= '0' & c <= '9'; -isalnum(c) return isalpha(c) | isdigit(c); -isprint(c) return c >= ' ' & c <= '~'; +isalpha(c) => (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z'); +isascii(c) => c < 128; +isdigit(c) => c >= '0' & c <= '9'; +isalnum(c) => isalpha(c) | isdigit(c); +isprint(c) => c >= ' ' & c <= '~'; memset(tab, size, value) { local i = 0; @@ -388,7 +401,8 @@ memset(tab, size, value) loop { if (i == size) return (tab); - [tab + i++] = value; + [tab + i] = value; + i++; } } ntoa_get_size(number) @@ -396,7 +410,7 @@ ntoa_get_size(number) local size = 0; if (number == 0) - size++; + return 1; loop { if (number == 0) @@ -422,26 +436,11 @@ ntoa(number) { if (number == 0) return (str); - [str + size - 1] = number % 10 + '0'; - number = number / 10; size--; - } -} -ntoa_get_size(number) -{ - local size = 0; - - if (number == 0) - size++; - loop - { - if (number == 0) - return (size); + [str + size] = number % 10 + '0'; number = number / 10; - size++; } } - ntoa_s(number) { local str, sign, size; @@ -473,17 +472,18 @@ ntoa_s(number) } print_raw_bit(number) { - local tab = get_raw_bit(number), i = 0; + local tab = get_raw_bit(number); puttab_num(tab, 16); free(tab); } -putchar(c) wrt c; +putchar(c) +{ + wrt c; + return c; +} putnum(number) { - local str; - str = ntoa(number); - if (str == 0) - return; + local str = ntoa(number); putstr(str); free(str); } @@ -495,31 +495,34 @@ putnum_s(num_s) } putstr(str) { - local i = 0; + local tmp = str; + if (str == NULL) { + putstr("(null)"); + return NULL; + } loop { - if ([str + i] == 0) - return; - putchar([str + i]); - i++; + if ([tmp] == 0) + return str; + putchar([tmp]); + tmp++; } } puttab_str(tab) { - local tmp = tab; - putchar('['); loop { - if ([tmp] == 0) - break; + if ([tab] == 0) { + putchar(']'); + return; + } putchar('"'); - putstr([tmp]); + putstr([tab]); putchar('"'); - if ([tmp + 1] != 0) + tab++; + if ([tab] != 0) putstr(", "); - tmp++; } - putchar(']'); } puttab_num(tab, size) @@ -529,14 +532,15 @@ puttab_num(tab, size) putchar('['); loop { - if (i == size) - break; + if (i == size) { + putchar(']'); + return; + } putnum([tab + i]); i++; if (i != size) putstr(", "); } - putchar(']'); } realloc(ptr, new_size) { @@ -564,7 +568,7 @@ realloc(ptr, new_size) free(ptr); return new_space; } -replace(str, fill, start, stop) +replace_index(str, fill, start, stop) { local out; local sum; @@ -679,18 +683,6 @@ strchr(str, c) start++; } } -strchri(str, c) -{ - local i = 0; - - loop { - if ([str + i] == c) - return (i); - if ([str + i] == 0) - return (0 - 1); - i++; - } -} strcmp(s1, s2) { local i = 0; |