summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-07-25 05:43:48 +0200
committerkdx <kikoodx@paranoici.org>2023-07-26 12:54:53 +0200
commitf2cee4f5d148c6572cefe0aaa704b91342222b4f (patch)
tree14ed2cffecfcd918cdc34f2c10acadea2c1de660
parent6429fcae13a343372c7cff575be577702f059e74 (diff)
downloadegecs-main.tar.gz
update irongolemHEADmain
-rw-r--r--iron.golem196
1 files changed, 94 insertions, 102 deletions
diff --git a/iron.golem b/iron.golem
index 9908d69..6289c37 100644
--- a/iron.golem
+++ b/iron.golem
@@ -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;