NAME=push_swap
-SRCS=algorithm_complex.c algorithm_medium.c algorithm_simple.c cheatalloc.c clist.c closure.c disorder.c frac.c leaf_sort.c leaf_sort_index.c leaf_sort_parse.c list.c main_pushswap.c op_output.c op_p.c op_parse.c op_r.c op_rr.c op_s.c ops.c ops_count.c ops_optimizer.c ops_stackops.c output.c psval.c slice.c splitsort.c splitsort_final.c splitsort_iter.c splitsort_part.c stack.c stacks.c stacks_get.c
+NAME_BONUS=checker
+
+SRCS=algorithm_complex.c algorithm_medium.c algorithm_simple.c algorithm_stdin.c cheatalloc.c clist.c closure.c disorder.c eoutput.c frac.c ft_memcpy.c get_next_op.c leaf_sort.c leaf_sort_index.c leaf_sort_parse.c list.c numutils.c op_output.c op_p.c op_parse.c op_r.c op_rr.c op_s.c ops.c ops_count.c ops_optimizer.c ops_stackops.c output.c psval.c slice.c splitsort.c splitsort_final.c splitsort_iter.c splitsort_part.c stack.c stacks.c stacks_get.c
RESSRCS=_res_leaf_sort_lookup.h
+MAINSRCS=main_pushswap.c
+BONUSSRCS=main_checker.c
+
BUILDDIR=.build
RESDAT=${RESSRCS:_res_%.h=${BUILDDIR}/%.res}
OBJS=${SRCS:%.c=${BUILDDIR}/%.o} ${RESDAT:%.res=%.o}
+MAINOBJS=${MAINSRCS:%.c=${BUILDDIR}/%.o}
+BONUSOBJS=${BONUSSRCS:%.c=${BUILDDIR}/%.o}
+
CFLAGS=-Wall -Wextra -Werror -g
CC=cc
${BUILDDIR} :
mkdir ${BUILDDIR}
-${NAME} : ${OBJS}
+${NAME} : ${OBJS} ${MAINOBJS}
cc -o $@ $^
+${NAME_BONUS} : ${OBJS} ${BONUSOBJS}
+ cc -o $@ $^
+
+bonus : ${NAME_BONUS}
+
clean :
- rm -f ${OBJS} ${RESDAT}
+ rm -f ${OBJS} ${RESDAT} ${MAINOBJS} ${BONUSOBJS}
fclean : clean
- rm -f ${NAME}
+ rm -f ${NAME} ${NAME_BONUS}
rm -fd ${BUILDDIR}
re : fclean all
remakefile : clean
- sed -i "s/^SRCS=.*/$$(echo -n SRCS=; echo -n *.c)/" Makefile
+ sed -i "s/^SRCS=.*/$$(echo -n SRCS=; echo -n *.c | sed "s/main_[^ ]* //g")/" Makefile
sed -i "s/^RESSRCS=.*/$$(echo -n RESSRCS=; echo -n _res_*.h)/" Makefile
.PHONY : all clean fclean re bonus remakefile
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* algorithm_stdin.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/18 15:59:51 by agilliar #+# #+# */
+/* Updated: 2025/12/18 17:16:51 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+void algorithm_stdin(const t_stacks *stacks, t_closure cb)
+{
+ t_op op;
+
+ op = OP_PA;
+ while (get_next_op(&op))
+ closure_call(cb, op);
+ if (!stacks_is_solved(stacks))
+ output_str("KO\n");
+ else
+ output_str("OK\n");
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* eoutput.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/02 16:47:00 by agilliar #+# #+# */
+/* Updated: 2025/12/18 16:32:18 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+#include "output_inner.h"
+#include <unistd.h>
+
+static t_output_store *eoutput_store(void)
+{
+ static t_output_store store = {.written = 0};
+
+ return (&store);
+}
+
+void eoutput_flush(void)
+{
+ size_t i;
+ ssize_t written;
+ t_output_store *store;
+
+ store = eoutput_store();
+ i = 0;
+ while (i < store->written)
+ {
+ written = write(2, &store->buf[i], store->written - i);
+ if (written <= 0)
+ cheatexit(written != 0);
+ i += written;
+ }
+ store->written = 0;
+}
+
+void eoutput_char(char c)
+{
+ t_output_store *store;
+
+ store = eoutput_store();
+ if (store->written == OUTPUT_STORE_SIZE)
+ eoutput_flush();
+ store->buf[store->written++] = c;
+}
+
+void eoutput_str(const char *s)
+{
+ while (*s)
+ eoutput_char(*(s++));
+}
+
+void eoutput_str_ln(const char *s)
+{
+ eoutput_str(s);
+ eoutput_char('\n');
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:48:05 by agilliar #+# #+# */
+/* Updated: 2025/12/18 15:17:29 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+void *ft_memcpy(void *dest, const void *src, size_t n)
+{
+ size_t i;
+
+ i = 0;
+ while (i < n)
+ {
+ ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
+ i++;
+ }
+ return (dest);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* get_next_op.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/18 15:36:01 by agilliar #+# #+# */
+/* Updated: 2025/12/18 17:15:30 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+#include <unistd.h>
+
+#define BUF_SIZE 128
+
+bool get_next_op(t_op *res)
+{
+ static char buf[BUF_SIZE];
+ static size_t used = 0;
+ ssize_t n;
+ t_slice curr;
+ t_slice op;
+
+ while (used < 10)
+ {
+ n = read(0, &buf[used], BUF_SIZE - used);
+ if (n == 0)
+ break ;
+ if (n < 0)
+ cheatexit(1);
+ used += n;
+ }
+ if (!used)
+ return (false);
+ curr = slice_new_range(buf, &buf[used]);
+ op = slice_split(&curr, '\n');
+ *res = op_parse(op);
+ if (*res == OP_INVALID || used - curr.len - op.len == 0)
+ cheatexit(1);
+ ft_memcpy(buf, curr.ptr, curr.len);
+ used = curr.len;
+ return (true);
+}
--- /dev/null
+ra
+ra
+pb
+rr
+ra
+ra
+ra
+pb
+pb
+ra
+pb
+rb
+pb
+rr
+pb
+rb
+pb
+pb
+pb
+ra
+ra
+pb
+ra
+ra
+ra
+pb
+rr
+pb
+rr
+ra
+ra
+pb
+pb
+rb
+pb
+pb
+rr
+pb
+pb
+pb
+rr
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rb
+pb
+rr
+pb
+pb
+pb
+ra
+ra
+ra
+ra
+pb
+rr
+ra
+pb
+ra
+ra
+pb
+pb
+rb
+pb
+rb
+pb
+ra
+pb
+rb
+pb
+rr
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rb
+pb
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rr
+ra
+pb
+rr
+ra
+ra
+ra
+ra
+pb
+pb
+pb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rra
+rb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+pb
+rra
+rra
+pb
+rra
+pb
+rra
+rra
+pb
+rra
+rra
+rra
+pb
+rra
+rb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rra
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+rra
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pa
+pa
+rr
+rb
+rb
+rb
+rb
+pa
+rr
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+pa
+pa
+ra
+pa
+rb
+sa
+pb
+sa
+pb
+sa
+pa
+pa
+rra
+rra
+pb
+rra
+pb
+rra
+sa
+pa
+pa
+rrb
+pa
+rrb
+pa
+rrb
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+rrb
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+pb
+rra
+rra
+sa
+rra
+pa
+pa
+pa
+pa
+pa
+pb
+pb
+ss
+pa
+sa
+pa
+pa
+ra
+pa
+pa
+rb
+pa
+rb
+rb
+rb
+rb
+rb
+rb
+pa
+rb
+rb
+rb
+rb
+rb
+pa
+ra
+pa
+ra
+pa
+ra
+pb
+sa
+pb
+sa
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pb
+sa
+pb
+sa
+pa
+sa
+pa
+rra
+pb
+rra
+rra
+sa
+pa
+rra
+pa
+pa
+pa
+pa
+sa
+pb
+sa
+pa
+sa
+pa
+rb
+rb
+rb
+pa
+rr
+rb
+pa
+rr
+rb
+pa
+rb
+pa
+rr
+pa
+rr
+pa
+rb
+pa
+rb
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+pb
+rra
+rra
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+rrb
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pa
+rrb
+sa
+pb
+sa
+pb
+sa
+pa
+pa
+rra
+pb
+rra
+rra
+pa
+rra
+pa
+pa
+pa
+pa
+pb
+pb
+ss
+pa
+sa
+pa
+sa
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+rb
+rb
+pa
+pa
+rb
+pa
+rr
+pa
+rr
+rb
+rb
+pa
+ra
+pa
+pb
+pb
+ss
+ra
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+rrb
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+rrb
+pa
+rrb
+pa
+ra
+pb
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+rra
+pb
+rra
+rra
+pa
+pa
+pa
+pa
+pa
+sa
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+rb
+pa
+rb
+pa
+rb
+pa
+rr
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+rb
+rb
+rb
+pa
+ra
+pa
+pa
+ra
+pb
+pb
+ss
+ra
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pa
+sa
+rra
+rra
+pb
+rra
+pb
+rra
+sa
+pa
+pa
+pa
+pa
+pa
+pa
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* main_checker.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */
+/* Updated: 2025/12/18 17:11:15 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+static void arg_step(char *str, t_stacks *stacks)
+{
+ stack_push_back(&stacks->a, psval_parse(str));
+}
+
+int main(int argc, char **argv)
+{
+ t_stacks stacks;
+ int i;
+ t_ops ops;
+
+ i = 1;
+ stacks = stacks_new();
+ while (i < argc)
+ arg_step(argv[i++], &stacks);
+ ops = ops_stackops();
+ stacks_apply(&stacks, &ops, &algorithm_stdin);
+ output_flush();
+ eoutput_flush();
+ cheatexit(0);
+}
/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */
-/* Updated: 2025/12/18 14:07:38 by agilliar ### ########.fr */
+/* Updated: 2025/12/18 16:12:13 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
{
t_stacks state;
t_algovar algo;
- t_algorithm *algo_func;
bool bench;
- t_frac disorder;
} t_args;
static t_algorithm *algorithm_get(t_algovar var, t_frac disorder)
}
#define COMPLEXITY_SIMPLE "Simple / O(N^2)"
-#define COMPLEXITY_MEDIUM "Simple / O(N^(3/2))"
-#define COMPLEXITY_COMPLEX "Simple / O(N log N)"
+#define COMPLEXITY_MEDIUM "Medium / O(N^(3/2))"
+#define COMPLEXITY_COMPLEX "Complex / O(N log N)"
#define COMPLEXITY_ADAPTIVE_LOW "Adaptive / O(N^2)"
#define COMPLEXITY_ADAPTIVE_MEDIUM "Adaptive / O(N^(3/2))"
#define COMPLEXITY_ADAPTIVE_HIGH "Adaptive / O(N log N)"
-t_slice complexity_get(t_algovar var, t_frac disorder)
+static const char *complexity_get(t_algovar var, t_frac disorder)
{
if (var == ALGORITHM_SIMPLE)
- return (slice_new(COMPLEXITY_SIMPLE));
+ return (COMPLEXITY_SIMPLE);
if (var == ALGORITHM_MEDIUM)
- return (slice_new(COMPLEXITY_MEDIUM));
+ return (COMPLEXITY_MEDIUM);
if (var == ALGORITHM_COMPLEX)
- return (slice_new(COMPLEXITY_COMPLEX));
+ return (COMPLEXITY_COMPLEX);
if (frac_lt(disorder, frac_new(1, 5)))
- return (slice_new(COMPLEXITY_ADAPTIVE_LOW));
+ return (COMPLEXITY_ADAPTIVE_LOW);
if (frac_lt(disorder, frac_new(1, 2)))
- return (slice_new(COMPLEXITY_ADAPTIVE_MEDIUM));
- return (slice_new(COMPLEXITY_ADAPTIVE_HIGH));
+ return (COMPLEXITY_ADAPTIVE_MEDIUM);
+ return (COMPLEXITY_ADAPTIVE_HIGH);
}
static void arg_step(char *str, t_args *arg)
{
t_ops_count pre_opt;
t_ops_count post_opt;
- t_slice strategy;
+ const char *strategy;
t_frac disorder;
} t_benchres;
t_optimizer opt;
t_benchres res;
- res.disorder = args->disorder;
+ res.disorder = compute_disorder(&args->state.a);
ops = ops_compose(ops_output(), ops_count(&res.post_opt));
ops = ops_optimizer(ops, &opt);
ops = ops_compose(ops_stackops(), ops);
ops = ops_compose(ops_count(&res.pre_opt), ops);
- stacks_apply(&args->state, &ops, args->algo_func);
+ stacks_apply(&args->state, &ops, algorithm_get(args->algo, res.disorder));
ops_optimizer_commit(&opt, &args->state);
+ res.strategy = complexity_get(args->algo, res.disorder);
return (res);
}
+static void output_ops(t_ops_count ops)
+{
+ t_op op;
+ size_t total;
+
+ op = OP_SA;
+ total = 0;
+ while (op <= OP_RRR)
+ {
+ if (op != OP_SA)
+ eoutput_str(", ");
+ eoutput_str(ops_str(op));
+ eoutput_str(": ");
+ eoutput_size(ops.counters[op]);
+ total += ops.counters[op];
+ op++;
+ }
+ eoutput_str("\t| ");
+ eoutput_str("total: ");
+ eoutput_size(total);
+ eoutput_char('\n');
+}
+
+static void output_bench(t_benchres res)
+{
+ eoutput_str_ln("[Bench]");
+ eoutput_str("\tStrategy:\t");
+ eoutput_str_ln(res.strategy);
+ eoutput_str("\tPost-Opt:\t");
+ output_ops(res.post_opt);
+ eoutput_str("\tPre-Opt:\t");
+ output_ops(res.pre_opt);
+}
+
#include <stdio.h>
int main(int argc, char **argv)
{
i = 1;
while (i < argc)
arg_step(argv[i++], &args);
- args.disorder = compute_disorder(&args.state.a);
- args.algo_func = algorithm_get(args.algo, args.disorder);
res = pushswap_solve(&args);
+ output_bench(res);
output_flush();
- printf("pre: %lu\n", res.pre_opt.counters[OP_RR]);
- printf("post: %lu\n", res.post_opt.counters[OP_RR]);
- printf("num: %lu\n", args.disorder.num);
- printf("den: %lu\n", args.disorder.den);
+ eoutput_flush();
cheatexit(!stacks_is_solved(&args.state));
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* numutils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/18 14:58:14 by agilliar #+# #+# */
+/* Updated: 2025/12/18 15:00:37 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+void eoutput_size(size_t n)
+{
+ if (n >= 10)
+ eoutput_size(n / 10);
+ eoutput_char("0123456789"[n % 10]);
+}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/03 12:28:28 by agilliar #+# #+# */
-/* Updated: 2025/12/16 19:07:40 by agilliar ### ########.fr */
+/* Updated: 2025/12/18 14:55:48 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
static t_closure op_output(t_op op)
{
t_closure res;
- const char *const ops[11] = {
- "sa",
- "sb",
- "ss",
- "pa",
- "pb",
- "ra",
- "rb",
- "rr",
- "rra",
- "rrb",
- "rrr",
- };
- res.data = (void *) ops[op];
+ res.data = (void *) ops_str(op);
res.func = &op_output_inner;
return (res);
}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/03 10:57:30 by agilliar #+# #+# */
-/* Updated: 2025/12/11 16:58:11 by agilliar ### ########.fr */
+/* Updated: 2025/12/18 17:16:20 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
}
return (res);
}
+
+const char *ops_str(t_op op)
+{
+ const char *const ops[11] = {
+ "sa",
+ "sb",
+ "ss",
+ "pa",
+ "pb",
+ "ra",
+ "rb",
+ "rr",
+ "rra",
+ "rrb",
+ "rrr",
+ };
+
+ return (ops[op]);
+}
/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/02 11:02:44 by agilliar #+# #+# */
-/* Updated: 2025/12/18 14:07:48 by agilliar ### ########.fr */
+/* Updated: 2025/12/18 16:04:35 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
void output_str_ln(const char *s);
void output_flush(void);
+void eoutput_char(char c);
+void eoutput_str(const char *s);
+void eoutput_str_ln(const char *s);
+void eoutput_flush(void);
+
t_stacks stacks_new(void);
bool stacks_is_solved(const t_stacks *stacks);
void stacks_apply(t_stacks *stacks, const t_ops *ops,
t_closure op_compose(t_closure first, t_closure second);
t_ops ops_compose(t_ops lhs, t_ops rhs);
t_ops ops_init(t_closure (*gen)(t_op));
+const char *ops_str(t_op op);
t_ops ops_stackops(void);
t_ops ops_output(void);
t_slice slice_new_range(void *start, void *end);
bool slice_eq(t_slice lhs, t_slice rhs);
t_slice slice_split(t_slice *rem, char at);
-void slice_output(t_slice s);
void leaf_top_a_a(const t_stacks *stacks, t_closure cb,
size_t size);
void algorithm_simple(const t_stacks *stacks, t_closure cb);
void algorithm_medium(const t_stacks *stacks, t_closure cb);
void algorithm_complex(const t_stacks *stacks, t_closure cb);
+void algorithm_stdin(const t_stacks *stacks, t_closure cb);
t_frac frac_new(size_t num, size_t den);
t_frac frac_mul(t_frac lhs, t_frac rhs);
t_frac compute_disorder(const t_stack *a);
+void eoutput_size(size_t n);
+
+void *ft_memcpy(void *restrict dest, const void *src, size_t n);
+
+bool get_next_op(t_op *res);
+
#endif
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/10 17:08:21 by agilliar #+# #+# */
-/* Updated: 2025/12/10 18:41:15 by agilliar ### ########.fr */
+/* Updated: 2025/12/18 14:34:34 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
}
return (res);
}
-
-void slice_output(t_slice s)
-{
- while (s.len--)
- output_char(*(s.ptr++));
-}