From 20291d04ad1bf6d8cde29fb870a2e16546ed72e6 Mon Sep 17 00:00:00 2001 From: lejulien Date: Fri, 9 Jan 2026 14:29:09 +0100 Subject: [PATCH] Initial commit --- Colleen/ASM/Colleen.s | 25 +++++++++++++++++++ Colleen/ASM/Makefile | 57 ++++++++++++++++++++++++++++++++++++++++++ Colleen/C/Colleen.c | 17 +++++++++++++ Colleen/C/Makefile | 58 +++++++++++++++++++++++++++++++++++++++++++ Grace/C/Grace.c | 8 ++++++ Grace/C/Makefile | 56 +++++++++++++++++++++++++++++++++++++++++ README.md | 26 +++++++++++++++++++ Sully/C/Makefile | 50 +++++++++++++++++++++++++++++++++++++ Sully/C/Sully.c | 22 ++++++++++++++++ Sully/C/src/Sully.c | 30 ++++++++++++++++++++++ 10 files changed, 349 insertions(+) create mode 100644 Colleen/ASM/Colleen.s create mode 100644 Colleen/ASM/Makefile create mode 100644 Colleen/C/Colleen.c create mode 100644 Colleen/C/Makefile create mode 100644 Grace/C/Grace.c create mode 100644 Grace/C/Makefile create mode 100644 README.md create mode 100644 Sully/C/Makefile create mode 100644 Sully/C/Sully.c create mode 100644 Sully/C/src/Sully.c diff --git a/Colleen/ASM/Colleen.s b/Colleen/ASM/Colleen.s new file mode 100644 index 0000000..afcfd78 --- /dev/null +++ b/Colleen/ASM/Colleen.s @@ -0,0 +1,25 @@ +;Colleen +section .text + extern printf + global main +main: + push rbp + mov rbp, rsp + sub rsp, 32 + and rsp, 0xFFFFFFFFFFFFFFF0 + + mov rdi, fmt + mov rax, 0 + mov rsi, 10 + mov rdx, fmt + mov rcx, 34 + call printf wrt ..plt + + add rsp, 32 + pop rbp + + mov rax,0 + ret +section .data + fmt: + db ";Colleen%1$csection .text%1$c extern printf%1$c global main%1$cmain:%1$c push rbp%1$c mov rbp, rsp%1$c sub rsp, 32%1$c and rsp, 0xFFFFFFFFFFFFFFF0%1$c%1$c mov rdi, fmt%1$c mov rax, 0%1$c mov rsi, 10%1$c mov rdx, fmt%1$c mov rcx, 34%1$c call printf wrt ..plt%1$c%1$c add rsp, 32%1$c pop rbp%1$c%1$c mov rax,0%1$c ret%1$csection .data%1$c fmt:%1$c db %3$c%2$s%3$c, 0%1$c", 0 diff --git a/Colleen/ASM/Makefile b/Colleen/ASM/Makefile new file mode 100644 index 0000000..67d92ee --- /dev/null +++ b/Colleen/ASM/Makefile @@ -0,0 +1,57 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lejulien +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2020/07/05 18:43:38 by lejulien #+# #+# # +# Updated: 2022/07/28 12:58:35 by lejulien ### ########.fr # +# # +# **************************************************************************** # + +SRCS = ./Colleen.s + +SRCS_OBJS = ${SRCS:.s=.o} + +FLAGS = -f elf64 + +.s.o: + nasm $(FLAGS) $(SRCS) -o $(SRCS_OBJS) + +NAME = Colleen + +$(NAME): $(SRCS_OBJS) + @echo "\e[1;35m _ _ _ _ _ _ _ " + @echo "\e[1;35m /\ \ /\ \ \e[1;31m43 6F 6C 6C 65 65 6E\e[1;35m /\ \ /\_\ /\ \ /\ \ _ /\ \ " + @echo "\e[1;35m / \ \____ / \ \ \e[1;32mby lejulien\e[1;35m / \ \ / / / _ \ \ \ / \ \ /\_\ / \ \ " + @echo "\e[1;35m / /\ \_____\ / /\ \ \ / /\ \ \ \ \ \__ /\_\ /\ \_\ / /\ \ \_/ / // /\ \ \ " + @echo "\e[1;35m / / /\/___ // / /\ \_\ / / /\ \ \ \ \___\ / / / / /\/_/ / / /\ \___/ // / /\ \_\ " + @echo "\e[1;35m / / / / / // / /_/ / / / / / \ \_\ \__ / / / / / / / / / / \/____// /_/_ \/_/ " + @echo "\e[1;35m / / / / / // / /__\/ / / / / _ / / / / / / / / / / / / / / / / / // /____/\ " + @echo "\e[1;35m/ / / / / // / /_____/ ___________ / / / /\ \/ / / / / / / / / / / / / / / / // /\____\/ " + @echo "\e[1;35m\ \ \__/ / // / /\ \ \ ___/__________/\ / / /__\ \ \/ / / /___/ / /___/ / /__ / / / / / // / /______ " + @echo "\e[1;35m \ \___\/ // / / \ \ \/__________ \ \/ / /____\ \ \/ / /____\/ //\__\/_/___\/ / / / / // / /_______\ " + @echo "\e[1;35m \/_____/ \/_/ \_\/\____\/ \____\/\/________\_\/\/_________/ \/_________/\/_/ \/_/ \/__________/ " + + gcc $(SRCS_OBJS) -o $(NAME) +clean: + rm -f $(SRCS_OBJS) + +fclean: clean + rm -f $(NAME) + +comp: $(NAME) + @cat Colleen.s > file_o + @./Colleen > bin_o + diff file_o bin_o + @rm bin_o + @rm file_o + @rm Colleen.o + @rm Colleen + +re: fclean $(NAME) + +.PHONY: clean fclean re + + diff --git a/Colleen/C/Colleen.c b/Colleen/C/Colleen.c new file mode 100644 index 0000000..1deaf11 --- /dev/null +++ b/Colleen/C/Colleen.c @@ -0,0 +1,17 @@ +#include +#define FORMAT "#include %1$c#define FORMAT %3$c%2$s%3$c%1$c%1$c/*%1$c This string format the code%1$c*/%1$c%1$cvoid generate() {%1$c printf(FORMAT, 10, FORMAT, 34);%1$c}%1$c%1$cint main(void) {%1$c /*%1$c Call generate function%1$c */%1$c generate();%1$c}%1$c" + +/* + This string format the code +*/ + +void generate() { + printf(FORMAT, 10, FORMAT, 34); +} + +int main(void) { + /* + Call generate function + */ + generate(); +} diff --git a/Colleen/C/Makefile b/Colleen/C/Makefile new file mode 100644 index 0000000..3cb1abb --- /dev/null +++ b/Colleen/C/Makefile @@ -0,0 +1,58 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lejulien +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2020/07/05 18:43:38 by lejulien #+# #+# # +# Updated: 2022/07/28 12:58:35 by lejulien ### ########.fr # +# # +# **************************************************************************** # + +SRCS = ./Colleen.c + +SRCS_OBJS = ${SRCS:.c=.o} + +FLAGS = -Wall -Wextra -Werror + +.c.o: + gcc -c $< -o $(<:.c=.o) + +NAME = Colleen + +$(NAME): $(SRCS_OBJS) + @echo "\e[1;35m _ _ _ _ _ _ _ " + @echo "\e[1;35m /\ \ /\ \ \e[1;31m43 6F 6C 6C 65 65 6E\e[1;35m /\ \ /\_\ /\ \ /\ \ _ /\ \ " + @echo "\e[1;35m / \ \____ / \ \ \e[1;32mby lejulien\e[1;35m / \ \ / / / _ \ \ \ / \ \ /\_\ / \ \ " + @echo "\e[1;35m / /\ \_____\ / /\ \ \ / /\ \ \ \ \ \__ /\_\ /\ \_\ / /\ \ \_/ / // /\ \ \ " + @echo "\e[1;35m / / /\/___ // / /\ \_\ / / /\ \ \ \ \___\ / / / / /\/_/ / / /\ \___/ // / /\ \_\ " + @echo "\e[1;35m / / / / / // / /_/ / / / / / \ \_\ \__ / / / / / / / / / / \/____// /_/_ \/_/ " + @echo "\e[1;35m / / / / / // / /__\/ / / / / _ / / / / / / / / / / / / / / / / / // /____/\ " + @echo "\e[1;35m/ / / / / // / /_____/ ___________ / / / /\ \/ / / / / / / / / / / / / / / / // /\____\/ " + @echo "\e[1;35m\ \ \__/ / // / /\ \ \ ___/__________/\ / / /__\ \ \/ / / /___/ / /___/ / /__ / / / / / // / /______ " + @echo "\e[1;35m \ \___\/ // / / \ \ \/__________ \ \/ / /____\ \ \/ / /____\/ //\__\/_/___\/ / / / / // / /_______\ " + @echo "\e[1;35m \/_____/ \/_/ \_\/\____\/ \____\/\/________\_\/\/_________/ \/_________/\/_/ \/_/ \/__________/ " + + gcc -o $(NAME) $(SRCS_OBJS) $(FLAGS) + +clean: + rm -f $(SRCS_OBJS) + +fclean: clean + rm -f $(NAME) + +comp: $(NAME) + @cat Colleen.c > file_o + @./Colleen > bin_o + diff file_o bin_o + @rm bin_o + @rm file_o + @rm Colleen.o + @rm Colleen + +re: fclean $(NAME) + +.PHONY: clean fclean re + + diff --git a/Grace/C/Grace.c b/Grace/C/Grace.c new file mode 100644 index 0000000..5d0c0cb --- /dev/null +++ b/Grace/C/Grace.c @@ -0,0 +1,8 @@ +#include +#define F "#include %1$c#define F %2$c%3$s%2$c%1$c#define PF() fprintf(o, F, 10, 34, F);%1$c#define FT()int main(){FILE *o=fopen(%2$c./Grace_kid.c%2$c, %2$cw%2$c);PF() fclose(o);}%1$c/*%1$c This will call the main and the defined format, everything will be replaced in compile-time%1$c*/%1$cFT()%1$c" +#define PF() fprintf(o, F, 10, 34, F); +#define FT()int main(){FILE *o=fopen("./Grace_kid.c", "w");PF() fclose(o);} +/* + This will call the main and the defined format, everything will be replaced in compile-time +*/ +FT() diff --git a/Grace/C/Makefile b/Grace/C/Makefile new file mode 100644 index 0000000..b09749d --- /dev/null +++ b/Grace/C/Makefile @@ -0,0 +1,56 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lejulien +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2020/07/05 18:43:38 by lejulien #+# #+# # +# Updated: 2022/07/28 14:21:48 by lejulien ### ########.fr # +# # +# **************************************************************************** # + +SRCS = ./Grace.c + +SRCS_OBJS = ${SRCS:.c=.o} + +FLAGS = -Wall -Wextra -Werror + +.c.o: + gcc -c $< -o $(<:.c=.o) + +NAME = Grace + +$(NAME): $(SRCS_OBJS) + @echo "\e[1;35m _ _ _ _ _ _ _ " + @echo "\e[1;35m /\ \ /\ \ \e[1;31m 47 72 61 63 65 \e[1;35m /\ \ /\_\ /\ \ /\ \ _ /\ \ " + @echo "\e[1;35m / \ \____ / \ \ \e[1;32mby lejulien\e[1;35m / \ \ / / / _ \ \ \ / \ \ /\_\ / \ \ " + @echo "\e[1;35m / /\ \_____\ / /\ \ \ / /\ \ \ \ \ \__ /\_\ /\ \_\ / /\ \ \_/ / // /\ \ \ " + @echo "\e[1;35m / / /\/___ // / /\ \_\ / / /\ \ \ \ \___\ / / / / /\/_/ / / /\ \___/ // / /\ \_\ " + @echo "\e[1;35m / / / / / // / /_/ / / / / / \ \_\ \__ / / / / / / / / / / \/____// /_/_ \/_/ " + @echo "\e[1;35m / / / / / // / /__\/ / / / / _ / / / / / / / / / / / / / / / / / // /____/\ " + @echo "\e[1;35m/ / / / / // / /_____/ ___________ / / / /\ \/ / / / / / / / / / / / / / / / // /\____\/ " + @echo "\e[1;35m\ \ \__/ / // / /\ \ \ ___/__________/\ / / /__\ \ \/ / / /___/ / /___/ / /__ / / / / / // / /______ " + @echo "\e[1;35m \ \___\/ // / / \ \ \/__________ \ \/ / /____\ \ \/ / /____\/ //\__\/_/___\/ / / / / // / /_______\ " + @echo "\e[1;35m \/_____/ \/_/ \_\/\____\/ \____\/\/________\_\/\/_________/ \/_________/\/_/ \/_/ \/__________/ " + + gcc -o $(NAME) $(SRCS_OBJS) $(FLAGS) + +clean: + rm -f $(SRCS_OBJS) + +fclean: clean + rm -f $(NAME) + rm -f $(NAME)_kid.c + +comp: $(NAME) + ./${NAME} + diff Grace_kid.c Grace.c + @rm Grace_kid.c + @rm -f $(SRC_OBJS) + +re: fclean $(NAME) + +.PHONY: clean fclean re + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7916496 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# quine concepts + +A quine is basically a program that write it's own source code. +For this project we had to do 3 quine that are graduatly more difficult. + +## Description + +- Colleen: + This one is simple enough to start understanding how quine are made. + And so with some research I learned that a quine in C works with a format string and printf + ```C + // General algorythm of a quine in C + char f[] = "__CODE_PRINTF_FORMATED__"; + int main (int ac, char **av) { + printf(f, __SOME_VARS_, f, _SOME_VARS_); + } + ``` + And so, we can see that the with the first f we write the file. And with the second one we manage to write it's own format again. + After this the trick is using diff until there are no diffs. +- Grace: + This one is that you have to create a new file and write the code inside instead of outputting it. + Plus you'll need to define you main. +- Sully: + The last one like Grace but you input a number to the program and it will create n file and create n executables. + But not 0 to stop it; + diff --git a/Sully/C/Makefile b/Sully/C/Makefile new file mode 100644 index 0000000..26ac91f --- /dev/null +++ b/Sully/C/Makefile @@ -0,0 +1,50 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lejulien +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2020/07/05 18:43:38 by lejulien #+# #+# # +# Updated: 2022/07/29 12:58:41 by lejulien ### ########.fr # +# # +# **************************************************************************** # + +SRCS = ./Sully.c + +SRCS_OBJS = ${SRCS:.c=.o} + +FLAGS = -Wall -Wextra -Werror + +.c.o: + gcc -c $< -o $(<:.c=.o) + +NAME = Sully + +$(NAME): $(SRCS_OBJS) + @echo "\e[1;35m _ _ _ _ _ _ _ " + @echo "\e[1;35m /\ \ /\ \ \e[1;31m 53 75 6C 6C 79 \e[1;35m /\ \ /\_\ /\ \ /\ \ _ /\ \ " + @echo "\e[1;35m / \ \____ / \ \ \e[1;32mby lejulien\e[1;35m / \ \ / / / _ \ \ \ / \ \ /\_\ / \ \ " + @echo "\e[1;35m / /\ \_____\ / /\ \ \ / /\ \ \ \ \ \__ /\_\ /\ \_\ / /\ \ \_/ / // /\ \ \ " + @echo "\e[1;35m / / /\/___ // / /\ \_\ / / /\ \ \ \ \___\ / / / / /\/_/ / / /\ \___/ // / /\ \_\ " + @echo "\e[1;35m / / / / / // / /_/ / / / / / \ \_\ \__ / / / / / / / / / / \/____// /_/_ \/_/ " + @echo "\e[1;35m / / / / / // / /__\/ / / / / _ / / / / / / / / / / / / / / / / / // /____/\ " + @echo "\e[1;35m/ / / / / // / /_____/ ___________ / / / /\ \/ / / / / / / / / / / / / / / / // /\____\/ " + @echo "\e[1;35m\ \ \__/ / // / /\ \ \ ___/__________/\ / / /__\ \ \/ / / /___/ / /___/ / /__ / / / / / // / /______ " + @echo "\e[1;35m \ \___\/ // / / \ \ \/__________ \ \/ / /____\ \ \/ / /____\/ //\__\/_/___\/ / / / / // / /_______\ " + @echo "\e[1;35m \/_____/ \/_/ \_\/\____\/ \____\/\/________\_\/\/_________/ \/_________/\/_/ \/_/ \/__________/ " + + gcc -o $(NAME) $(SRCS_OBJS) $(FLAGS) + +clean: + rm -f $(SRCS_OBJS) + +fclean: clean + rm -f $(NAME) + rm -f $(NAME)_* + +re: fclean $(NAME) + +.PHONY: clean fclean re + + diff --git a/Sully/C/Sully.c b/Sully/C/Sully.c new file mode 100644 index 0000000..4dd7aea --- /dev/null +++ b/Sully/C/Sully.c @@ -0,0 +1,22 @@ +#include +#include +#include + +#define FORMAT "#include %1$c#include %1$c#include %1$c%1$c#define FORMAT %2$c%4$s%2$c%1$c%1$cint i=%5$d;%1$cchar nbuf[1024];%1$c%1$cint main() {%1$c bzero(nbuf,1024);%1$c sprintf(nbuf,%2$c./Sully_%3$cd.c%2$c,i-1);%1$c FILE *o = fopen(nbuf,%2$cw%2$c);%1$c fprintf(o,FORMAT,10,34,37,FORMAT,i-1);%1$c fclose(o);%1$c bzero(nbuf,1024);%1$c if (i-1>0)%1$c sprintf(nbuf,%2$cclang -Wall -Wextra -Werror ./Sully_%3$c1$d.c -o Sully_%3$c1$d;./Sully_%3$c1$d%2$c,i-1);%1$c else%1$c sprintf(nbuf,%2$cclang -Wall -Wextra -Werror ./Sully_%3$c1$d.c -o Sully_%3$c1$d%2$c,i-1);%1$c system(nbuf);%1$c}%1$c" + +int i=5; +char nbuf[1024]; + +int main() { + bzero(nbuf,1024); + sprintf(nbuf,"./Sully_%d.c",i-1); + FILE *o = fopen(nbuf,"w"); + fprintf(o,FORMAT,10,34,37,FORMAT,i-1); + fclose(o); + bzero(nbuf,1024); + if (i-1>0) + sprintf(nbuf,"clang -Wall -Wextra -Werror ./Sully_%1$d.c -o Sully_%1$d;./Sully_%1$d",i-1); + else + sprintf(nbuf,"clang -Wall -Wextra -Werror ./Sully_%1$d.c -o Sully_%1$d",i-1); + system(nbuf); +} diff --git a/Sully/C/src/Sully.c b/Sully/C/src/Sully.c new file mode 100644 index 0000000..f2bd79d --- /dev/null +++ b/Sully/C/src/Sully.c @@ -0,0 +1,30 @@ +#include +#include +#include + +char f[]="#include %c#include %c#include %c%cchar f[]=%c%s%c;%cint i = %d;%cchar nbuf[1024];%c%cint main(int ac, char **av) {%c // get values%c i = (ac == 2)?atoi(av[1]):i;%c if (i < 0) return 0;%c // open file%c bzero(nbuf, 1024);%c sprintf(nbuf, %c./Sully_%cd.c%c, i);%c FILE *o = fopen(nbuf, %cw%c);%c // write code to other%c fprintf(o, f, 10, 10, 10, 10, 34, f, 34, 10, i, 10, 10, 10, 10, 10, 10, 10, 10, 10, 34, 37, 34, 10, 34, 34, 10, 10, 10, 10, 10, 10, 10, 34, 37, 37, 37, 37, 34, 10, 10, 34, 37, 37, 37, 37, 34, 10, 10, 34, 37, 37, 34, 10, 10, 10, 10);%c fclose(o);%c // prepare compilation settings%c bzero(nbuf, 1024);%c if (ac == 1)%c sprintf(nbuf, %cclang -Wall -Wextra -Werror ./Sully_%cd.c -o Sully_%cd;./Sully_%cd %cd%c, i, i, i, i);%c else if (i > 0)%c sprintf(nbuf, %cclang -Wall -Wextra -Werror ./Sully_%cd.c -o Sully_%cd;./Sully_%cd %cd%c, i, i, i, i-1);%c else%c sprintf(nbuf, %cclang -Wall -Wextra -Werror ./Sully_%cd.c -o Sully_%cd%c, i, i);%c // execute%c system(nbuf);%c}%c"; +int i = 5; +char nbuf[1024]; + +int main(int ac, char **av) { + // get values + i = (ac == 2)?atoi(av[1]):i; + if (i < 0) return 0; + // open file + bzero(nbuf, 1024); + sprintf(nbuf, "./Sully_%d.c", i); + FILE *o = fopen(nbuf, "w"); + // write code to other + fprintf(o, f, 10, 10, 10, 10, 34, f, 34, 10, i, 10, 10, 10, 10, 10, 10, 10, 10, 10, 34, 37, 34, 10, 34, 34, 10, 10, 10, 10, 10, 10, 10, 34, 37, 37, 37, 37, 34, 10, 10, 34, 37, 37, 37, 37, 34, 10, 10, 34, 37, 37, 34, 10, 10, 10, 10); + fclose(o); + // prepare compilation settings + bzero(nbuf, 1024); + if (ac == 1) + sprintf(nbuf, "clang -Wall -Wextra -Werror ./Sully_%d.c -o Sully_%d;./Sully_%d %d", i, i, i, i); + else if (i > 0) + sprintf(nbuf, "clang -Wall -Wextra -Werror ./Sully_%d.c -o Sully_%d;./Sully_%d %d", i, i, i, i-1); + else + sprintf(nbuf, "clang -Wall -Wextra -Werror ./Sully_%d.c -o Sully_%d", i, i); + // execute + system(nbuf); +}