-.obj
+.build
push_swap
checker
NAME=push_swap
-SRCS=algorithm_quicksort.c algorithm_selection_sort.c cheatalloc.c clist.c list.c main_pushswap.c op_output.c op_p.c op_r.c op_rr.c op_s.c ops.c ops_groups.c ops_optimizer.c output.c psval.c stack.c stacks.c
+SRCS=algorithm_quicksort.c algorithm_selection_sort.c cheatalloc.c clist.c list.c main_pushswap.c op_output.c op_p.c op_r.c op_rr.c op_s.c ops.c ops_groups.c ops_optimizer.c output.c psval.c slice.c stack.c stacks.c
-OBJS=${SRCS:%.c=${OBJDIR}/%.o}
+RESSRCS=_res_leaf_sort_lookup.h
-OBJDIR=.obj
+BUILDDIR=.build
+
+RESDAT=${RESSRCS:_res_%.h=${BUILDDIR}/%.res}
+
+OBJS=${SRCS:%.c=${BUILDDIR}/%.o} ${RESDAT:%.res=%.o}
CFLAGS=-Wall -Wextra -Werror -g
all : ${NAME}
-${OBJDIR}/%.o : %.c | ${OBJDIR}
+%.o : %.res
+ ld -r -b binary -o $@ $<
+
+${BUILDDIR}/%.res: _res_%.h | ${BUILDDIR}
+ sed -n '\?/\*?d; n; n; :x p; n; bx' $^ | head -n-1 > $@
+
+${BUILDDIR}/%.o : %.c | ${BUILDDIR}
${CC} ${CFLAGS} -c -o $@ $<
-${OBJDIR} :
- mkdir ${OBJDIR}
+${BUILDDIR} :
+ mkdir ${BUILDDIR}
${NAME} : ${OBJS}
cc -o $@ $^
clean :
- rm -f ${OBJS}
+ rm -f ${OBJS} ${RESDAT}
fclean : clean
rm -f ${NAME}
- rm -fd ${OBJDIR}
+ rm -fd ${BUILDDIR}
re : fclean all
-remakefile :
+remakefile : clean
sed -i "s/^SRCS=.*/$$(echo -n SRCS=; echo -n *.c)/" Makefile
+ sed -i "s/^BINSRCS=.*/$$(echo -n ASSETSRCS=; echo -n _res_*.h)/" Makefile
+
+.PHONY : all clean fclean re bonus remakefile
-.PHONY : all clean fclean re bonus
+.SECONDARY : ${RESDAT}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* _res_leaf_sort_lookup.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/10 16:53:22 by agilliar #+# #+# */
+/* Updated: 2025/12/10 17:07:25 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+/*
+
+ra
+ra ra
+sa ra ra
+ra ra ra
+ra sa ra ra
+sa ra ra ra
+pb sa ra pa ra ra
+pb sa ra ra pa ra
+sa ra sa ra ra
+ra ra ra ra
+ra ra sa ra ra
+ra sa ra ra ra
+ra pb sa ra pa ra ra
+ra pb sa ra ra pa ra
+ra sa ra sa ra ra
+sa ra ra ra ra
+sa ra ra sa ra ra
+pb sa ra pa ra ra ra
+pb pb sa ra pa pa ra ra ra
+pb pb ss ra pa ra ra pa ra
+sa pb sa ra ra ra pa ra
+pb sa ra ra pa ra ra
+pb pb sa ra pa ra pa ra ra
+sa ra sa ra ra ra
+pb ra sa ra pa ra ra
+pb sa ra sa ra pa ra ra
+pb pb sa ra ra pa pa ra ra
+pb pb sa ra pa ra ra pa ra
+pb sa ra ra ra pa ra
+pb pb sa ra ra pa ra pa ra
+pb sa ra sa ra ra pa ra
+pb ra sa ra ra pa ra
+pb ra ra ra pa ra
+
+pb
+sa pb pb
+pb pb
+sa pb sa pb sb pb
+sa pb sa pb pb
+pb sa pb sb pb
+sa pb pb pb
+pb pb pb
+pb sa pb pb
+sa pb rr sa pb pb rrr pb
+sa pb rr pb pb rrr pb
+pb pb ss rb pb sb pb rrb
+sa pb sa pb ss pb pb
+pb rb pb pb pb rrb
+pb pb ss pb sb pb sb
+pb rr sa pb pb rrr pb
+pb rr pb pb rrr pb
+sa pb pb rr pb sb rrr pb
+sa pb sa pb sb pb pb
+sa pb sa pb pb pb
+pb pb ss pb sb pb
+pb pb rr pb sb rrr pb
+pb sa pb sb pb pb
+pb sa pb rr pb sb rrr pb
+pb sa pb ss pb pb
+pb pb ss pb pb
+sa pb pb pb pb
+pb sa pb pb pb
+pb pb sa pb sb pb
+pb pb pb pb
+pb pb sa pb pb
+pb sa pb sa pb pb
+pb sa pb sa pb sb pb
+*/
/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */
-/* Updated: 2025/12/09 16:06:44 by clefrere ### ########.fr */
+/* Updated: 2025/12/10 17:45:36 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
t_ops ops;
t_optimizer opt;
+ slice_output(slice_new_range(
+ &_binary__build_leaf_sort_lookup_res_start,
+ &_binary__build_leaf_sort_lookup_res_end
+ ));
args.state = stacks_new();
args.bench = false;
args.algo = NULL;
/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/02 11:02:44 by agilliar #+# #+# */
-/* Updated: 2025/12/09 15:54:48 by clefrere ### ########.fr */
+/* Updated: 2025/12/10 17:44:35 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
typedef enum e_op
{
+ OP_SENTINEL = -1,
OP_SA = 0,
OP_SB = 1,
OP_SS = 2,
t_ops commit;
} t_optimizer;
+typedef struct s_slice
+{
+ size_t len;
+ const char *ptr;
+} t_slice;
+
+extern void _binary__build_leaf_sort_lookup_res_start(void);
+extern void _binary__build_leaf_sort_lookup_res_end(void);
+
void cheatexit(int errcode);
void *cheatalloc(size_t len);
t_list list_sub(t_list self, size_t start, size_t end);
void list_sort(t_list list);
+t_slice slice_new(const char *s);
+t_slice slice_new_range(void *start, void *end);
+bool slice_eq(t_slice lhs, t_slice rhs);
+t_slice slice_split_first(t_slice *rem, char at);
+void slice_output(t_slice s);
+
void algorithm_selection_sort(const t_stacks *stacks, t_closure cb);
void algorithm_quicksort(const t_stacks *stacks, t_closure cb);
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* slice.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/10 17:08:21 by agilliar #+# #+# */
+/* Updated: 2025/12/10 17:45:51 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+t_slice slice_new(const char *s)
+{
+ t_slice res;
+
+ res.ptr = s;
+ res.len = 0;
+ while (res.ptr[res.len])
+ res.len++;
+ return (res);
+}
+
+t_slice slice_new_range(void *start, void *end)
+{
+ t_slice res;
+
+ res.len = (size_t) (end - start);
+ res.ptr = start;
+ return (res);
+}
+
+bool slice_eq(t_slice lhs, t_slice rhs)
+{
+ size_t i;
+
+ if (lhs.len != rhs.len)
+ return (false);
+ i = 0;
+ while (i < lhs.len && lhs.ptr[i] == rhs.ptr[i])
+ i++;
+ return (i == lhs.len);
+}
+
+t_slice slice_split_first(t_slice *rem, char at)
+{
+ t_slice res;
+
+ res.len = 0;
+ res.ptr = rem->ptr;
+ while (rem->len)
+ {
+ if (*rem->ptr == at)
+ break ;
+ rem->len--;
+ rem->ptr++;
+ res.len++;
+ }
+ if (rem->len)
+ {
+ rem->len--;
+ rem->ptr++;
+ }
+ return (res);
+}
+
+void slice_output(t_slice s)
+{
+ while (s.len--)
+ output_char(*(s.ptr++));
+}