From 157e46b5bc5cf2f1b4c80031d63320dd443332ae Mon Sep 17 00:00:00 2001 From: Axy Date: Tue, 2 Dec 2025 23:19:31 +0100 Subject: [PATCH] Comments and shenanigans --- .gitignore | 2 ++ a.out | Bin 0 -> 17144 bytes cheatalloc.c | 15 +++++++++- clist.c | 2 +- pushswap.c => main_pushswap.c | 15 +++++++--- output.c | 4 +-- psval.c | 55 ++++++++++++++++++++++++++++++++++ pushswap.h | 36 ++++++++++++++-------- stacks.c | 4 +-- 9 files changed, 110 insertions(+), 23 deletions(-) create mode 100755 a.out rename pushswap.c => main_pushswap.c (68%) create mode 100644 psval.c diff --git a/.gitignore b/.gitignore index 47cb25a..612d16d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ **.a **.o +pushswap +checker diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..e052e40365ab42c92cd18bc402ec6672996a21f6 GIT binary patch literal 17144 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 15:07:21 by agilliar #+# #+# */ -/* Updated: 2025/12/02 16:41:27 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 23:19:25 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,6 +43,19 @@ void cheatexit(int errcode) exit(errcode); } +// I present to you: "null garbage collector" allocator +// When your program is on a device intended to explode in 5 seconds, +// you do not need to worry about frees, the world is your garbage collector +// +// Since our program has a bounded amount of allocations per run, and no +// allocations are used as scrath working space, we would not need to free +// except on program termination. +// The OS is an excellent garbage collector, however some consider memory leaks +// errors. +// +// We just keep a in-allocation linked list that gets automatically freed on +// exit. The only requirement is that `cheatexit` be called in all termination +// paths. void *cheatalloc(size_t len) { void **new; diff --git a/clist.c b/clist.c index cbfb0de..4a78d4b 100644 --- a/clist.c +++ b/clist.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 11:02:13 by agilliar #+# #+# */ -/* Updated: 2025/12/02 17:37:32 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 23:05:13 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/pushswap.c b/main_pushswap.c similarity index 68% rename from pushswap.c rename to main_pushswap.c index 29a20e5..9c4970e 100644 --- a/pushswap.c +++ b/main_pushswap.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* pushswap.c :+: :+: :+: */ +/* main_pushswap.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */ -/* Updated: 2025/12/02 22:16:49 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 23:15:12 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,13 @@ int main(int argc, char **argv) { - (void) argc; - (void) argv; + t_stacks stacks; + + stacks = stacks_new(); + for (int i = 1; i < argc; i++) + stacks_insert_init(&stacks, psval_parse(argv[i])); + for (int i = 1; i < argc; i++) + psval_output(psval_parse(argv[i])); + output_flush(); + cheatexit(!stacks_is_solved(&stacks)); } diff --git a/output.c b/output.c index 4c2235e..c1fed0b 100644 --- a/output.c +++ b/output.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 16:47:00 by agilliar #+# #+# */ -/* Updated: 2025/12/02 22:11:55 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 22:42:38 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,7 @@ void output_flush(void) store->written = 0; } -static void output_char(char c) +void output_char(char c) { t_output_store *store; diff --git a/psval.c b/psval.c new file mode 100644 index 0000000..a565da9 --- /dev/null +++ b/psval.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* psval.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/12/02 22:35:19 by agilliar #+# #+# */ +/* Updated: 2025/12/02 22:54:24 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "pushswap.h" + +static void psval_output_no_sign(t_psval val) +{ + if (val > 9 || val < -9) + psval_output_no_sign(val / 10); + val %= 10; + if (val < 0) + val = -val; + output_char("0123456789"[val]); +} + +void psval_output(t_psval val) +{ + if (val < 0) + output_char('-'); + psval_output_no_sign(val); +} + +t_psval psval_parse(const char *s) +{ + t_psval sign; + t_psval res; + + sign = 1; + res = 0; + if (*s == '-') + { + s++; + sign = -1; + } + while (*s) + { + if (*s < '0' || *s > '9') + cheatexit(1); + if (__builtin_mul_overflow(res, 10, &res)) + cheatexit(1); + if (__builtin_add_overflow(res, sign * (*s - '0'), &res)) + cheatexit(1); + s++; + } + return (res); +} diff --git a/pushswap.h b/pushswap.h index 57219e0..7015368 100644 --- a/pushswap.h +++ b/pushswap.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 11:02:44 by agilliar #+# #+# */ -/* Updated: 2025/12/02 18:40:21 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 23:05:01 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -70,19 +70,29 @@ typedef struct s_ops t_closure ops[11]; } t_ops; -void cheatexit(int errcode); -void *cheatalloc(size_t len); +void cheatexit(int errcode); +void *cheatalloc(size_t len); -t_clist *clist_new(t_psval val); +t_clist *clist_new(t_psval val); // Positive numbers are forward, which wraps back to end of stack -t_psval clist_get_at(const t_clist *list, int i); -t_clist *clist_pop(t_clist **src); -// *dst: : Nullable -void clist_push(t_clist **dst, t_clist *lst); -// *dst: : Nullable -void clist_push_back(t_clist **dst, t_clist *lst); - -void output_str(char *s); -void output_str_ln(char *s); +t_psval clist_get_at(const t_clist *list, int i); +t_clist *clist_pop(t_clist **src); +// *dst : Nullable +void clist_push(t_clist **dst, t_clist *lst); +// *dst : Nullable +void clist_push_back(t_clist **dst, t_clist *lst); + +void output_char(char c); +void output_str(char *s); +void output_str_ln(char *s); +void output_flush(void); + +t_stacks stacks_new(void); +void stacks_insert_init(t_stacks *stacks, t_psval val); +bool stacks_is_solved(const t_stacks *stacks); +void stacks_apply(t_stacks *stacks, const t_ops *ops, t_algorithm algo); + +t_psval psval_parse(const char *s); +void psval_output(t_psval val); #endif diff --git a/stacks.c b/stacks.c index 85844c6..b8a0a82 100644 --- a/stacks.c +++ b/stacks.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 15:57:41 by agilliar #+# #+# */ -/* Updated: 2025/12/02 22:17:14 by agilliar ### ########.fr */ +/* Updated: 2025/12/02 22:25:54 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ void stacks_insert_init(t_stacks *stacks, t_psval val) stacks->a_len++; } -bool stack_is_solved(const t_stacks *stacks) +bool stacks_is_solved(const t_stacks *stacks) { size_t i; -- 2.51.0