From 95d7ef42123cf765fcfa08936d3c35ba7a7d3fac Mon Sep 17 00:00:00 2001 From: Victor Vobis Date: Wed, 14 May 2025 17:53:43 +0200 Subject: [PATCH] changed to file output --- Makefile | 17 +- compile | 18 ++ langc | Bin 38904 -> 0 bytes lib/core.a | Bin 109716 -> 0 bytes lib/gnl/get_next_line.c | 109 +++++++++ lib/gnl/get_next_line.h | 38 ++++ lib/gnl/get_next_line_utils.c | 118 ++++++++++ lib/libft/Makefile | 78 +++++++ lib/libft/ft_atod.c | 57 +++++ lib/libft/ft_atoi.c | 60 +++++ lib/libft/ft_bzero.c | 19 ++ lib/libft/ft_calloc.c | 30 +++ lib/libft/ft_free.c | 22 ++ lib/libft/ft_isalnum.c | 20 ++ lib/libft/ft_isalpha.c | 20 ++ lib/libft/ft_isascii.c | 20 ++ lib/libft/ft_isdigit.c | 18 ++ lib/libft/ft_isprint.c | 18 ++ lib/libft/ft_isspace.c | 18 ++ lib/libft/ft_itoa.c | 75 ++++++ lib/libft/ft_lstadd_back_bonus.c | 30 +++ lib/libft/ft_lstadd_front_bonus.c | 26 +++ lib/libft/ft_lstclear_bonus.c | 28 +++ lib/libft/ft_lstdelone_bonus.c | 21 ++ lib/libft/ft_lstiter_bonus.c | 24 ++ lib/libft/ft_lstlast_bonus.c | 22 ++ lib/libft/ft_lstmap_bonus.c | 44 ++++ lib/libft/ft_lstnew_bonus.c | 25 ++ lib/libft/ft_lstsize_bonus.c | 28 +++ lib/libft/ft_memchr.c | 31 +++ lib/libft/ft_memcmp.c | 31 +++ lib/libft/ft_memcpy.c | 32 +++ lib/libft/ft_memmove.c | 30 +++ lib/libft/ft_memset.c | 23 ++ lib/libft/ft_putchar_fd.c | 18 ++ lib/libft/ft_putendl_fd.c | 21 ++ lib/libft/ft_putnbr_fd.c | 27 +++ lib/libft/ft_putstr_fd.c | 21 ++ lib/libft/ft_read.c | 25 ++ lib/libft/ft_split.c | 84 +++++++ lib/libft/ft_strchr.c | 29 +++ lib/libft/ft_strdup.c | 31 +++ lib/libft/ft_striteri.c | 27 +++ lib/libft/ft_strjoin.c | 41 ++++ lib/libft/ft_strlcat.c | 37 +++ lib/libft/ft_strlcpy.c | 32 +++ lib/libft/ft_strlen.c | 27 +++ lib/libft/ft_strmapi.c | 33 +++ lib/libft/ft_strncmp.c | 31 +++ lib/libft/ft_strnstr.c | 36 +++ lib/libft/ft_strrchr.c | 33 +++ lib/libft/ft_strtrim.c | 47 ++++ lib/libft/ft_substr.c | 41 ++++ lib/libft/ft_tolower.c | 20 ++ lib/libft/ft_toupper.c | 20 ++ lib/libft/libft.h | 92 ++++++++ lib/libft/printf/Makefile | 50 ++++ lib/libft/printf/ft_fprintf.c | 38 ++++ lib/libft/printf/ft_printf.c | 63 ++++++ lib/libft/printf/ft_printf.h | 52 +++++ lib/libft/printf/ft_putascii.c | 49 ++++ lib/libft/printf/ft_putfloat.c | 34 +++ lib/libft/printf/ft_puthex.c | 33 +++ lib/libft/printf/ft_putptr.c | 27 +++ lib/libft/printf/ft_strlen.c | 28 +++ src/core/string/split.s | 4 +- src/core/string/{strcpy.s => strdup.s} | 4 +- src/core/string_builder/sb_append.s | 9 +- src/core/string_builder/sb_dump_to_file.s | 25 ++ src/core/syscall/file_ops.s | 14 +- src/global/function_table.s | 6 +- src/inc/c_alignment.s | 39 ++++ src/lexer/func_boiler_plate.s | 29 ++- src/lexer/lex_func.s | 39 ++-- src/lexer/lex_load.s | 17 +- src/lexer/lexer.s | 5 + src/lexer/program_prologue.s | 36 +-- src/lexer/vars/insert_var.s | 264 ++++++---------------- src/start.s | 87 ++++--- test.s | 24 -- 80 files changed, 2581 insertions(+), 318 deletions(-) create mode 100755 compile delete mode 100755 langc delete mode 100644 lib/core.a create mode 100644 lib/gnl/get_next_line.c create mode 100644 lib/gnl/get_next_line.h create mode 100644 lib/gnl/get_next_line_utils.c create mode 100644 lib/libft/Makefile create mode 100644 lib/libft/ft_atod.c create mode 100644 lib/libft/ft_atoi.c create mode 100644 lib/libft/ft_bzero.c create mode 100644 lib/libft/ft_calloc.c create mode 100644 lib/libft/ft_free.c create mode 100644 lib/libft/ft_isalnum.c create mode 100644 lib/libft/ft_isalpha.c create mode 100644 lib/libft/ft_isascii.c create mode 100644 lib/libft/ft_isdigit.c create mode 100644 lib/libft/ft_isprint.c create mode 100644 lib/libft/ft_isspace.c create mode 100644 lib/libft/ft_itoa.c create mode 100644 lib/libft/ft_lstadd_back_bonus.c create mode 100644 lib/libft/ft_lstadd_front_bonus.c create mode 100644 lib/libft/ft_lstclear_bonus.c create mode 100644 lib/libft/ft_lstdelone_bonus.c create mode 100644 lib/libft/ft_lstiter_bonus.c create mode 100644 lib/libft/ft_lstlast_bonus.c create mode 100644 lib/libft/ft_lstmap_bonus.c create mode 100644 lib/libft/ft_lstnew_bonus.c create mode 100644 lib/libft/ft_lstsize_bonus.c create mode 100644 lib/libft/ft_memchr.c create mode 100644 lib/libft/ft_memcmp.c create mode 100644 lib/libft/ft_memcpy.c create mode 100644 lib/libft/ft_memmove.c create mode 100644 lib/libft/ft_memset.c create mode 100644 lib/libft/ft_putchar_fd.c create mode 100644 lib/libft/ft_putendl_fd.c create mode 100644 lib/libft/ft_putnbr_fd.c create mode 100644 lib/libft/ft_putstr_fd.c create mode 100644 lib/libft/ft_read.c create mode 100644 lib/libft/ft_split.c create mode 100644 lib/libft/ft_strchr.c create mode 100644 lib/libft/ft_strdup.c create mode 100644 lib/libft/ft_striteri.c create mode 100644 lib/libft/ft_strjoin.c create mode 100644 lib/libft/ft_strlcat.c create mode 100644 lib/libft/ft_strlcpy.c create mode 100644 lib/libft/ft_strlen.c create mode 100644 lib/libft/ft_strmapi.c create mode 100644 lib/libft/ft_strncmp.c create mode 100644 lib/libft/ft_strnstr.c create mode 100644 lib/libft/ft_strrchr.c create mode 100644 lib/libft/ft_strtrim.c create mode 100644 lib/libft/ft_substr.c create mode 100644 lib/libft/ft_tolower.c create mode 100644 lib/libft/ft_toupper.c create mode 100644 lib/libft/libft.h create mode 100644 lib/libft/printf/Makefile create mode 100644 lib/libft/printf/ft_fprintf.c create mode 100644 lib/libft/printf/ft_printf.c create mode 100644 lib/libft/printf/ft_printf.h create mode 100644 lib/libft/printf/ft_putascii.c create mode 100644 lib/libft/printf/ft_putfloat.c create mode 100644 lib/libft/printf/ft_puthex.c create mode 100644 lib/libft/printf/ft_putptr.c create mode 100644 lib/libft/printf/ft_strlen.c rename src/core/string/{strcpy.s => strdup.s} (87%) create mode 100644 src/core/string_builder/sb_dump_to_file.s create mode 100644 src/inc/c_alignment.s delete mode 100644 test.s diff --git a/Makefile b/Makefile index d53f989..fd6a7b0 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,7 @@ MATHSRC := $(addprefix $(MATHDIR)/, $(addsuffix .s, \ )) STRSRC := $(addprefix $(STRDIR)/, $(addsuffix .s, \ - strlen split strcpy substr is_num strcmp is_alpha \ + strlen split strdup substr is_num strcmp is_alpha \ )) MEMSRC := $(addprefix $(MEMDIR)/, $(addsuffix .s, \ @@ -120,7 +120,7 @@ GLOBALSRC := $(addprefix $(GLOBALDIR)/, $(addsuffix .s, \ )) SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \ - string_builder sb_append \ + string_builder sb_append sb_dump_to_file \ )) # Collect all sources and objects @@ -131,7 +131,9 @@ ALL_SRC := $(MAIN_SRC) $(MATHSRC) $(STRSRC) $(SBSRC) $(PRINTSRC) $(FILESRC) $(VA ALL_OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(ALL_SRC)) # Library settings -LIBNAME := $(LIBDIR)/core.a +LIBNAME := $(LIBDIR)/core/core.a +LIBFTDIR := $(LIBDIR)/libft +LIBFT := $(LIBFTDIR)/lib/libft.a LIB_OBJ := $(filter-out $(OBJDIR)/start.o, $(ALL_OBJ)) # Module-specific object files for staged compilation @@ -206,8 +208,8 @@ build-main: $(MAIN_OBJ) # Stage 7: Link executable link-executable: $(TARGET) -$(TARGET): $(ALL_OBJ) - ld -g -o $@ $(ALL_OBJ) -nostdlib -static +$(TARGET): $(ALL_OBJ) $(LIBFT) $(LIBNAME) + ld -g -o $@ $(ALL_OBJ) $(LIBFT) $(LIBNAME) -nostdlib -static # Stage 8: Create library create-library: $(LIBNAME) @@ -215,6 +217,9 @@ create-library: $(LIBNAME) $(LIBNAME): $(LIB_OBJ) | $(LIBDIR) ar rcs $@ $(LIB_OBJ) +$(LIBFT): + make -C $(LIBFTDIR) + # Individual file compilation rule $(OBJDIR)/%.o: $(SRCDIR)/%.s | $(OBJDIRS) nasm $(AFLAGS) $< -o $@ @@ -222,6 +227,7 @@ $(OBJDIR)/%.o: $(SRCDIR)/%.s | $(OBJDIRS) # Utility targets clean: rm -rf $(OBJDIR) + make clean -C $(LIBFTDIR) clean-library: rm -f $(LIBNAME) @@ -230,6 +236,7 @@ clean-executable: rm -f $(TARGET) fclean: clean clean-library clean-executable + make fclean -C $(LIBFTDIR) re: fclean all diff --git a/compile b/compile new file mode 100755 index 0000000..91ef6f5 --- /dev/null +++ b/compile @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +LD_ARGS="-nostdlib -static" +NASM_FLAG="-felf64 -g" +LIBS="./lib/core/core.a ./lib/libft/lib/libft.a" +PROGNAME="langproc" + +filename=$1 +comp_out=${filename%.lang}.s +nasm_out=${comp_output%.s}.o + +./langc ${filename} + +nasm ${NASM_FLAG} ${comp_out} -o ${nasm_out} +ld ${nasm_out} ${LD_ARGS} ${LIBS} -o ${PROGNAME} +rm -rf ${comp_out} ${nasm_out} diff --git a/langc b/langc deleted file mode 100755 index 979738284a6ebc667af1dccda49a498ca6214e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38904 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ĺ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 c +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 20:20:17 by vvobis #+# #+# */ +/* Updated: 2024/05/27 17:44:59 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +void *buffer_extend(void *ptr_old, size_t size_new, size_t size_old) +{ + void *ptr_new; + void *ptr_back; + void *ptr_old_free; + + ptr_new = g_calloc(size_new + 1, 1); + if (!ptr_new) + return (free(ptr_old), ptr_old = NULL, NULL); + ptr_back = ptr_new; + ptr_old_free = ptr_old; + while (size_old--) + *(char *)ptr_new++ = *(char *)ptr_old++; + return (free(ptr_old_free), ptr_old_free = NULL, ptr_back); +} + +char *handle_no_nl(char **buf, char **left) +{ + if (left) + { + free(*left); + *left = NULL; + } + if (!buf) + return (NULL); + if (g_strlen(*buf)) + return (*buf); + free(*buf); + *buf = NULL; + return (NULL); +} + +char *line_extract(char **buf_joined, char **left, size_t line_len) +{ + char *line; + + line = g_substr(*buf_joined, 0, line_len); + if (!line) + return (free(*buf_joined), *buf_joined = NULL, NULL); + *left = g_substr(*buf_joined, line_len, g_strlen(*buf_joined) - line_len); + free(*buf_joined); + *buf_joined = NULL; + if (!*left) + return (free(line), line = NULL, NULL); + return (line); +} + +char *line_handle(char **buf_fetch) +{ + char *buf_joined; + size_t line_len; + static char *left; + + if (!buf_fetch) + return (free(left), NULL); + buf_joined = g_strjoin(left, *buf_fetch); + free(*buf_fetch); + *buf_fetch = NULL; + free(left); + left = NULL; + if (!buf_joined) + return (NULL); + line_len = find_newline(buf_joined); + if (line_len) + return (line_extract(&buf_joined, &left, line_len)); + return (handle_no_nl(&buf_joined, &left)); +} + +char *get_next_line(int fd) +{ + char *buf; + ssize_t bytes_read; + size_t buf_size_cur; + size_t buf_size_prev; + + if (fd < 0) + return (line_handle(NULL), NULL); + buf = g_calloc(sizeof(*buf), BUFFER_SIZE + 1); + buf_size_prev = 0; + buf_size_cur = BUFFER_SIZE; + while (1) + { + if (!buf) + return (line_handle(NULL)); + bytes_read = read(fd, buf + buf_size_prev, BUFFER_SIZE); + if (bytes_read < 0) + return (free(buf), buf = NULL, line_handle(NULL)); + if (find_newline(buf) || bytes_read == 0) + break ; + buf_size_prev = buf_size_cur; + buf_size_cur += BUFFER_SIZE; + buf = buffer_extend(buf, buf_size_cur, buf_size_prev); + } + return (line_handle(&buf)); +} diff --git a/lib/gnl/get_next_line.h b/lib/gnl/get_next_line.h new file mode 100644 index 0000000..60a48d4 --- /dev/null +++ b/lib/gnl/get_next_line.h @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/15 14:07:36 by vvobis #+# #+# */ +/* Updated: 2024/05/27 17:43:21 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H + +# define GET_NEXT_LINE_H + +# ifndef BUFFER_SIZE + +# define BUFFER_SIZE 50 + +# endif + +# define MAX_FD 1024 + +# include +# include +# include +# include + +char *get_next_line(int fd); +char *g_strjoin(char const *s1, char const *s2); +size_t g_strlen(char const *str); +void *g_calloc(size_t n, size_t s); +char *g_substr(char const *s, unsigned int start, size_t len); +char *line_handle(char **buf_fetch); +size_t find_newline(char *buf); + +#endif diff --git a/lib/gnl/get_next_line_utils.c b/lib/gnl/get_next_line_utils.c new file mode 100644 index 0000000..3ddd27b --- /dev/null +++ b/lib/gnl/get_next_line_utils.c @@ -0,0 +1,118 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/15 14:14:13 by vvobis #+# #+# */ +/* Updated: 2024/05/20 11:38:03 by victor ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +size_t g_strlen(char const *str) +{ + size_t i; + + if (!str) + return (0); + i = 0; + while (*str) + { + i++; + str++; + } + return (i); +} + +size_t find_newline(char *buf) +{ + size_t i; + + if (!buf) + return (0); + i = 0; + while (*buf) + { + if (*buf == '\n') + return (i + 1); + i++; + buf++; + } + return (0); +} + +char *g_strjoin(char const *s1, char const *s2) +{ + char *tmp; + unsigned int i; + unsigned int j; + + if (!s2) + return (NULL); + if (!s1) + return (g_substr(s2, 0, g_strlen(s2))); + tmp = g_calloc(g_strlen(s1) + g_strlen(s2) + 1, sizeof(*tmp)); + if (!tmp) + return (NULL); + i = 0; + if (s1) + { + while (s1[i]) + { + tmp[i] = s1[i]; + i++; + } + } + j = 0; + if (s2) + while (s2[j]) + tmp[i++] = s2[j++]; + return (tmp); +} + +char *g_substr(char const *s, unsigned int start, size_t len) +{ + char *tmp; + unsigned int i; + + i = 0; + if (!s || start >= g_strlen(s) || len <= 0) + { + tmp = malloc(1); + if (!tmp) + return (NULL); + tmp[i] = 0; + return (tmp); + } + if (len + start > g_strlen(s)) + len = g_strlen(s) - start; + tmp = g_calloc(len + 1, sizeof(*tmp)); + if (!tmp) + return (NULL); + while (i < len && s[i]) + { + tmp[i] = s[i + start]; + i++; + } + return (tmp); +} + +void *g_calloc(size_t n, size_t s) +{ + char *tmp; + unsigned long i; + + i = 0; + if (n == 0) + return (malloc(0)); + if (SIZE_MAX / n < s) + return (NULL); + tmp = malloc(n * s); + if (tmp) + while (i < n * s) + tmp[i++] = 0; + return ((void *)tmp); +} diff --git a/lib/libft/Makefile b/lib/libft/Makefile new file mode 100644 index 0000000..bf0c98b --- /dev/null +++ b/lib/libft/Makefile @@ -0,0 +1,78 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: vvobis +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/09/17 14:23:19 by vvobis #+# #+# # +# Updated: 2025/05/14 15:16:25 by vvobis ### ########.fr # +# # +# **************************************************************************** # + +NAME := libft.a + +CC := cc + +CFLAGS := -Wall -Wextra -Werror -mabi=sysv + +ifdef DEBUG + CFLAGS += -g3 +endif + +SRC := ft_bzero.c ft_isalnum.c ft_isalpha.c ft_isdigit.c \ + ft_isprint.c ft_memcpy.c ft_memmove.c ft_memset.c \ + ft_strlcat.c ft_strlcpy.c ft_strlen.c \ + ft_isascii.c ft_strchr.c ft_strrchr.c ft_strncmp.c \ + ft_toupper.c ft_tolower.c ft_memchr.c ft_strnstr.c \ + ft_atoi.c ft_atod.c ft_memcmp.c ft_calloc.c ft_strdup.c \ + ft_substr.c ft_strjoin.c ft_strtrim.c ft_split.c \ + ft_itoa.c ft_strmapi.c ft_striteri.c ft_putchar_fd.c \ + ft_putstr_fd.c ft_putendl_fd.c ft_putnbr_fd.c \ + ft_isspace.c ft_free.c ft_read.c + +SRCGNL := ../gnl/get_next_line.c ../gnl/get_next_line_utils.c + +SRCPRINT := printf/ft_fprintf.c printf/ft_printf.c printf/ft_putascii.c printf/ft_putptr.c printf/ft_puthex.c printf/ft_putfloat.c + +SRCBON := ft_lstnew_bonus.c ft_lstadd_front_bonus.c ft_lstsize_bonus.c ft_lstlast_bonus.c ft_lstadd_back_bonus.c ft_lstdelone_bonus.c ft_lstclear_bonus.c ft_lstiter_bonus.c ft_lstmap_bonus.c + +OBJBON := $(SRCBON:%.c=%.o) + +OBJ := $(SRC:%.c=%.o) + +OBJGNL := $(SRCGNL:%.c=%.o) + +OBJPRINT := $(SRCPRINT:%.c=%.o) + +LIBDIR := lib + +LIBS := printf + +all: $(NAME) + +bonus: $(OBJBON) $(OBJ) + ar rcs libft.a $(OBJ) $(OBJBON) + +$(NAME): $(LIBDIR) $(OBJ) $(OBJGNL) $(OBJPRINT) $(LIBS) + ar rcs $(LIBDIR)/$@ $(OBJ) $(OBJGNL) $(OBJPRINT) + +$(LIBDIR): + mkdir -p $@ + +%.o: %.c + $(CC) -c $(CFLAGS) $^ -o $@ + +re: fclean all + +so: + $(CC) -fPIC $(CFLAGS) $(SRC) test.c + gcc -shared -o libft.so $(OBJ) $(OBJBON) + +fclean: clean + rm -rf $(LIBDIR) + make fclean -C $(LIBS) + +clean: + rm -f $(OBJ) $(OBJBON) $(OBJGNL) + make clean -C $(LIBS) diff --git a/lib/libft/ft_atod.c b/lib/libft/ft_atod.c new file mode 100644 index 0000000..bfa80b7 --- /dev/null +++ b/lib/libft/ft_atod.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atod.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: victor +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/08 22:25:35 by victor #+# #+# */ +/* Updated: 2024/12/05 20:08:42 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +double atod_collect_fraction(char *n, double d) +{ + int period; + int mult; + + mult = 1; + period = 0; + while (*n && !ft_isspace(*n)) + { + if (*n == '.' && period == 0) + { + period = 1; + n++; + continue ; + } + else if (((*n == '.' && period == 1) || (*n != '.' && !ft_isdigit(*n)))) + return (ft_putendl_fd("Invalid double format: Too many periods", \ + 2), exit(1), 0); + if (period) + mult *= 10; + d *= 10; + d += (*n - '0'); + n++; + } + return (d / mult); +} + +double ft_atod(char *n) +{ + double d; + int sign; + + if (!n) + exit(1); + sign = 1; + if (*n == '-') + { + sign = -1; + n++; + } + d = 0; + return (atod_collect_fraction(n, d) * sign); +} diff --git a/lib/libft/ft_atoi.c b/lib/libft/ft_atoi.c new file mode 100644 index 0000000..5b742df --- /dev/null +++ b/lib/libft/ft_atoi.c @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: bszilas +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/10 10:49:04 by vvobis #+# #+# */ +/* Updated: 2024/09/13 22:19:12 by bszilas ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int is_space(char const c) +{ + if ((c >= 9 && c <= 13) || c == ' ') + return (1); + return (0); +} + +int ft_atoi(char const *s) +{ + int nb; + char const *tmp; + + nb = 0; + while (is_space(*s)) + s++; + tmp = s; + if (*tmp == '+' || *tmp == '-') + tmp++; + while (*tmp >= '0' && *tmp <= '9') + { + nb *= 10; + nb += (*tmp - '0'); + tmp++; + } + if (*s == '-') + nb = -nb; + return (nb); +} + +long ft_atol(const char *nptr) +{ + int64_t n; + int sign; + + n = 0; + sign = 1; + while (ft_isspace(*nptr)) + nptr++; + if (*nptr == '-') + sign = -1; + if (sign == -1 || *nptr == '+') + nptr++; + while (*nptr >= '0' && *nptr <= '9') + n = n * 10 + (*nptr++ - '0'); + return (n * sign); +} diff --git a/lib/libft/ft_bzero.c b/lib/libft/ft_bzero.c new file mode 100644 index 0000000..332517f --- /dev/null +++ b/lib/libft/ft_bzero.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 16:04:55 by vvobis #+# #+# */ +/* Updated: 2024/04/09 20:54:53 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + while (n--) + *(char *)s++ = 0; +} diff --git a/lib/libft/ft_calloc.c b/lib/libft/ft_calloc.c new file mode 100644 index 0000000..dcef84c --- /dev/null +++ b/lib/libft/ft_calloc.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 13:44:00 by vvobis #+# #+# */ +/* Updated: 2024/04/10 16:39:56 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_calloc(size_t n, size_t s) +{ + char *tmp; + unsigned long i; + + i = 0; + if (n == 0) + return (malloc(0)); + if (SIZE_MAX / n < s) + return (NULL); + tmp = malloc(n * s); + if (tmp) + while (i < n * s) + tmp[i++] = 0; + return ((void *)tmp); +} diff --git a/lib/libft/ft_free.c b/lib/libft/ft_free.c new file mode 100644 index 0000000..5bdc3a4 --- /dev/null +++ b/lib/libft/ft_free.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/10 12:16:39 by vvobis #+# #+# */ +/* Updated: 2024/09/10 12:17:34 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_free(void *ptr_ptr) +{ + void **ptr; + + ptr = ptr_ptr; + free(*ptr); + *ptr = NULL; +} diff --git a/lib/libft/ft_isalnum.c b/lib/libft/ft_isalnum.c new file mode 100644 index 0000000..2abb4a5 --- /dev/null +++ b/lib/libft/ft_isalnum.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 15:59:18 by vvobis #+# #+# */ +/* Updated: 2024/04/02 15:59:23 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalnum(int c) +{ + if (ft_isdigit(c) || ft_isalpha(c)) + return (1); + return (0); +} diff --git a/lib/libft/ft_isalpha.c b/lib/libft/ft_isalpha.c new file mode 100644 index 0000000..1dfab51 --- /dev/null +++ b/lib/libft/ft_isalpha.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 15:59:49 by vvobis #+# #+# */ +/* Updated: 2024/04/02 16:00:04 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalpha(int c) +{ + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) + return (1); + return (0); +} diff --git a/lib/libft/ft_isascii.c b/lib/libft/ft_isascii.c new file mode 100644 index 0000000..0693407 --- /dev/null +++ b/lib/libft/ft_isascii.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 19:48:35 by vvobis #+# #+# */ +/* Updated: 2024/04/02 19:49:36 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isascii(int c) +{ + if (c >= 0 && c <= 127) + return (1); + return (0); +} diff --git a/lib/libft/ft_isdigit.c b/lib/libft/ft_isdigit.c new file mode 100644 index 0000000..4dd21ff --- /dev/null +++ b/lib/libft/ft_isdigit.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 16:14:56 by vvobis #+# #+# */ +/* Updated: 2024/04/02 19:38:45 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isdigit(int c) +{ + if (c >= '0' && c <= '9') + return (1); + return (0); +} diff --git a/lib/libft/ft_isprint.c b/lib/libft/ft_isprint.c new file mode 100644 index 0000000..99da20a --- /dev/null +++ b/lib/libft/ft_isprint.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 16:00:49 by vvobis #+# #+# */ +/* Updated: 2024/04/02 16:00:52 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isprint(int c) +{ + if (c >= 32 && c <= 126) + return (1); + return (0); +} diff --git a/lib/libft/ft_isspace.c b/lib/libft/ft_isspace.c new file mode 100644 index 0000000..ee8f522 --- /dev/null +++ b/lib/libft/ft_isspace.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isspace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: victor +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/08 18:27:49 by victor #+# #+# */ +/* Updated: 2024/09/08 18:27:55 by victor ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isspace(int c) +{ + return (c == ' ' || (c > 9 && c < 14)); +} diff --git a/lib/libft/ft_itoa.c b/lib/libft/ft_itoa.c new file mode 100644 index 0000000..f973b4a --- /dev/null +++ b/lib/libft/ft_itoa.c @@ -0,0 +1,75 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/05 20:16:48 by vvobis #+# #+# */ +/* Updated: 2024/04/11 14:48:59 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int get_len(int n) +{ + int i; + + if (n < 0) + n = -n; + i = 0; + while (n) + { + i++; + n /= 10; + } + return (i); +} + +static char *is_negative(int n) +{ + int i; + char *num; + + i = get_len(n); + num = malloc(sizeof(*num) * i + 2); + if (!num) + return (NULL); + num[i + 1] = 0; + while (n) + { + num[i--] = -(n % 10) + 48; + n /= 10; + } + num[i] = 0x2d; + return (num); +} + +static char *is_positive(int n) +{ + int i; + char *num; + + i = get_len(n); + num = malloc(sizeof(*num) * i + 1); + if (!num) + return (NULL); + num[i--] = 0; + while (n) + { + num[i--] = (n % 10) + 48; + n /= 10; + } + return (num); +} + +char *ft_itoa(int n) +{ + if (n == 0) + return (ft_strdup("0")); + else if (n < 0) + return (is_negative(n)); + else + return (is_positive(n)); +} diff --git a/lib/libft/ft_lstadd_back_bonus.c b/lib/libft/ft_lstadd_back_bonus.c new file mode 100644 index 0000000..f3d6959 --- /dev/null +++ b/lib/libft/ft_lstadd_back_bonus.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_back.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 13:51:32 by vvobis #+# #+# */ +/* Updated: 2024/04/09 18:17:12 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd_back(t_list **lst, t_list *new) +{ + t_list *tmp; + + if (!new) + return ; + if (*lst) + { + tmp = *lst; + while (tmp->next) + tmp = tmp->next; + tmp->next = new; + } + else + *lst = new; +} diff --git a/lib/libft/ft_lstadd_front_bonus.c b/lib/libft/ft_lstadd_front_bonus.c new file mode 100644 index 0000000..25714f7 --- /dev/null +++ b/lib/libft/ft_lstadd_front_bonus.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_front.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 12:53:08 by vvobis #+# #+# */ +/* Updated: 2024/04/09 18:17:50 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd_front(t_list **lst, t_list *new) +{ + if (!lst || !new) + return ; + if (!*lst) + *lst = new; + else + { + new->next = *lst; + *lst = new; + } +} diff --git a/lib/libft/ft_lstclear_bonus.c b/lib/libft/ft_lstclear_bonus.c new file mode 100644 index 0000000..8f531fb --- /dev/null +++ b/lib/libft/ft_lstclear_bonus.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstclear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 15:44:23 by vvobis #+# #+# */ +/* Updated: 2024/04/09 22:35:41 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstclear(t_list **lst, void (*del)(void *)) +{ + t_list *tmp; + + if (!*lst || !del || !lst) + return ; + while (*lst) + { + tmp = (*lst)->next; + del((*lst)->content); + free(*lst); + *lst = tmp; + } +} diff --git a/lib/libft/ft_lstdelone_bonus.c b/lib/libft/ft_lstdelone_bonus.c new file mode 100644 index 0000000..c31153b --- /dev/null +++ b/lib/libft/ft_lstdelone_bonus.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 14:24:03 by vvobis #+# #+# */ +/* Updated: 2024/04/09 15:42:04 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdelone(t_list *lst, void (*del)(void *)) +{ + if (!lst || !del) + return ; + del(lst->content); + free(lst); +} diff --git a/lib/libft/ft_lstiter_bonus.c b/lib/libft/ft_lstiter_bonus.c new file mode 100644 index 0000000..c38b240 --- /dev/null +++ b/lib/libft/ft_lstiter_bonus.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 15:57:51 by vvobis #+# #+# */ +/* Updated: 2024/04/09 18:20:05 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstiter(t_list *lst, void (*f)(void *)) +{ + if (!lst || !f) + return ; + while (lst) + { + f(lst->content); + lst = lst->next; + } +} diff --git a/lib/libft/ft_lstlast_bonus.c b/lib/libft/ft_lstlast_bonus.c new file mode 100644 index 0000000..c83f4b0 --- /dev/null +++ b/lib/libft/ft_lstlast_bonus.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstlast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 13:47:08 by vvobis #+# #+# */ +/* Updated: 2024/04/09 15:11:51 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstlast(t_list *lst) +{ + if (!lst) + return (NULL); + while (lst->next) + lst = lst->next; + return (lst); +} diff --git a/lib/libft/ft_lstmap_bonus.c b/lib/libft/ft_lstmap_bonus.c new file mode 100644 index 0000000..9cfc0c5 --- /dev/null +++ b/lib/libft/ft_lstmap_bonus.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 16:18:03 by vvobis #+# #+# */ +/* Updated: 2024/04/09 23:40:57 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void *free_list(t_list **head, void (*del)(void *), void *fcontent) +{ + if (fcontent) + del(fcontent); + ft_lstclear(head, del); + return (NULL); +} + +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) +{ + t_list *tmp; + t_list *head; + void *fcontent; + + if (!lst || !f || !del) + return (NULL); + head = NULL; + while (lst) + { + fcontent = f(lst->content); + if (!fcontent) + return (free_list(&head, del, fcontent)); + tmp = ft_lstnew(fcontent); + if (!tmp) + return (free_list(&head, del, fcontent)); + ft_lstadd_back(&head, tmp); + lst = lst->next; + } + return (head); +} diff --git a/lib/libft/ft_lstnew_bonus.c b/lib/libft/ft_lstnew_bonus.c new file mode 100644 index 0000000..08775c5 --- /dev/null +++ b/lib/libft/ft_lstnew_bonus.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 11:10:05 by vvobis #+# #+# */ +/* Updated: 2024/04/09 18:59:48 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstnew(void *content) +{ + t_list *tmp; + + tmp = malloc(sizeof(*tmp)); + if (!tmp) + return (NULL); + tmp->next = NULL; + tmp->content = content; + return (tmp); +} diff --git a/lib/libft/ft_lstsize_bonus.c b/lib/libft/ft_lstsize_bonus.c new file mode 100644 index 0000000..c8def02 --- /dev/null +++ b/lib/libft/ft_lstsize_bonus.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 13:43:08 by vvobis #+# #+# */ +/* Updated: 2024/04/09 18:21:11 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_lstsize(t_list *lst) +{ + int i; + + if (!lst) + return (0); + i = 1; + while (lst->next) + { + lst = lst->next; + i++; + } + return (i); +} diff --git a/lib/libft/ft_memchr.c b/lib/libft/ft_memchr.c new file mode 100644 index 0000000..3944037 --- /dev/null +++ b/lib/libft/ft_memchr.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 15:13:59 by vvobis #+# #+# */ +/* Updated: 2024/04/09 20:55:24 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memchr(void *s, int c, size_t n) +{ + unsigned char *p; + size_t i; + + i = 0; + p = (unsigned char *)s; + while (i < n) + { + if (p[i] == (unsigned char)c) + return ((void *)&p[i]); + i++; + } + if (p[i - 1] == (unsigned char)c) + return ((void *)&p[i]); + return (NULL); +} diff --git a/lib/libft/ft_memcmp.c b/lib/libft/ft_memcmp.c new file mode 100644 index 0000000..54180dc --- /dev/null +++ b/lib/libft/ft_memcmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 15:27:15 by vvobis #+# #+# */ +/* Updated: 2024/04/09 19:21:02 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_memcmp(void *s1, void const *s2, size_t n) +{ + unsigned char *p1; + unsigned char *p2; + unsigned int i; + + p1 = (unsigned char *)s1; + p2 = (unsigned char *)s2; + i = 0; + while (i < n) + { + if (p1[i] != p2[i]) + return (p1[i] - p2[i]); + i++; + } + return (0); +} diff --git a/lib/libft/ft_memcpy.c b/lib/libft/ft_memcpy.c new file mode 100644 index 0000000..e1e524a --- /dev/null +++ b/lib/libft/ft_memcpy.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 17:13:18 by vvobis #+# #+# */ +/* Updated: 2024/04/09 19:21:29 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dest, void const *src, size_t n) +{ + char *d; + char *s; + + if (n == 0 || (dest == NULL && src == NULL)) + return (dest); + if (dest == NULL || src == NULL) + { + *(char *)dest = 1; + *(char *)src = 1; + } + d = (char *) dest; + s = (char *) src; + while (n--) + *d++ = *s++; + return (dest); +} diff --git a/lib/libft/ft_memmove.c b/lib/libft/ft_memmove.c new file mode 100644 index 0000000..d5c700f --- /dev/null +++ b/lib/libft/ft_memmove.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 17:42:28 by vvobis #+# #+# */ +/* Updated: 2024/04/09 19:21:54 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memmove(void *dest, void const *src, size_t n) +{ + unsigned char *d; + unsigned char *s; + + if (!dest && !src) + return (dest); + d = (unsigned char *)dest; + s = (unsigned char *)src; + if (s < d) + while (n--) + d[n] = s[n]; + else + ft_memcpy(dest, (void *)src, n); + return (dest); +} diff --git a/lib/libft/ft_memset.c b/lib/libft/ft_memset.c new file mode 100644 index 0000000..792867a --- /dev/null +++ b/lib/libft/ft_memset.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 15:57:27 by vvobis #+# #+# */ +/* Updated: 2024/04/03 11:18:10 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *s, int c, size_t n) +{ + char *str; + + str = (char *)s; + while (n--) + str[n] = c; + return (s); +} diff --git a/lib/libft/ft_putchar_fd.c b/lib/libft/ft_putchar_fd.c new file mode 100644 index 0000000..6b5d51f --- /dev/null +++ b/lib/libft/ft_putchar_fd.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 17:34:30 by vvobis #+# #+# */ +/* Updated: 2024/04/07 17:53:33 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + write(fd, &c, 1); +} diff --git a/lib/libft/ft_putendl_fd.c b/lib/libft/ft_putendl_fd.c new file mode 100644 index 0000000..1c7d3b4 --- /dev/null +++ b/lib/libft/ft_putendl_fd.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 17:57:33 by vvobis #+# #+# */ +/* Updated: 2024/04/07 18:00:49 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl_fd(char *str, int fd) +{ + if (!str) + return ; + ft_putstr_fd(str, fd); + ft_putchar_fd(0x0a, fd); +} diff --git a/lib/libft/ft_putnbr_fd.c b/lib/libft/ft_putnbr_fd.c new file mode 100644 index 0000000..5073c24 --- /dev/null +++ b/lib/libft/ft_putnbr_fd.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 18:02:14 by vvobis #+# #+# */ +/* Updated: 2024/04/11 11:23:10 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr_fd(int n, int fd) +{ + if (n < 0) + ft_putchar_fd(0x2d, fd); + if (n <= -10) + ft_putnbr_fd(n / -10, fd); + if (n >= 10) + ft_putnbr_fd(n / 10, fd); + if (n >= 0) + ft_putchar_fd(n % 10 + 0x30, fd); + if (n < 0) + ft_putchar_fd(-(n % -10) + 0x30, fd); +} diff --git a/lib/libft/ft_putstr_fd.c b/lib/libft/ft_putstr_fd.c new file mode 100644 index 0000000..328f96c --- /dev/null +++ b/lib/libft/ft_putstr_fd.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 17:48:41 by vvobis #+# #+# */ +/* Updated: 2024/04/07 17:52:16 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr_fd(char *str, int fd) +{ + if (!str) + return ; + while (*str) + ft_putchar_fd(*str++, fd); +} diff --git a/lib/libft/ft_read.c b/lib/libft/ft_read.c new file mode 100644 index 0000000..e4dc8ca --- /dev/null +++ b/lib/libft/ft_read.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_read.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/18 12:49:30 by vvobis #+# #+# */ +/* Updated: 2024/12/10 21:18:38 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_read(int fd, char *character, unsigned int size_to_read) +{ + int bytes_read; + + bytes_read = read(fd, character, size_to_read); + if (bytes_read == -1) + { + ft_fprintf(STDERR_FILENO, "Read failed\n"); + } + return (bytes_read); +} diff --git a/lib/libft/ft_split.c b/lib/libft/ft_split.c new file mode 100644 index 0000000..9e34265 --- /dev/null +++ b/lib/libft/ft_split.c @@ -0,0 +1,84 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/05 20:14:20 by vvobis #+# #+# */ +/* Updated: 2024/04/09 23:55:49 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int count(char const *s, char const c) +{ + int n; + + n = 0; + if (*s != c && *s) + n = 1; + while (*s) + { + if (*s == c && *(s + 1) != c && *(s + 1)) + n++; + s++; + } + return (n); +} + +static int count_sub(char const *s, char const c) +{ + int i; + + i = 0; + while (*s != c && *s) + { + i++; + s++; + } + return (i); +} + +static char **free_all(char **back) +{ + char **tmp; + + tmp = back; + while (*back) + { + free(*back); + back++; + } + free(tmp); + return (NULL); +} + +char **ft_split(char const *s, char const c) +{ + char **tmp; + char **back; + + if (!s) + return (NULL); + tmp = (char **)ft_calloc(sizeof(*tmp), count(s, c) + 1); + if (!tmp) + return (NULL); + back = tmp; + while (*s && tmp) + { + while (*s == c && *s) + s++; + if (*s) + { + *tmp = ft_substr(s, 0, count_sub(s, c)); + if (!*tmp) + return (free_all(back)); + } + tmp++; + while (*s != c && *s) + s++; + } + return (back); +} diff --git a/lib/libft/ft_strchr.c b/lib/libft/ft_strchr.c new file mode 100644 index 0000000..30d0b93 --- /dev/null +++ b/lib/libft/ft_strchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 12:20:50 by vvobis #+# #+# */ +/* Updated: 2024/04/09 20:54:14 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strchr(char const *s, int c) +{ + int i; + + i = 0; + while (s[i]) + { + if (s[i] == (char)c) + return ((char *)&s[i]); + i++; + } + if ((char)c == 0) + return ((char *)&s[i]); + return (NULL); +} diff --git a/lib/libft/ft_strdup.c b/lib/libft/ft_strdup.c new file mode 100644 index 0000000..941d91b --- /dev/null +++ b/lib/libft/ft_strdup.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 18:44:05 by vvobis #+# #+# */ +/* Updated: 2024/04/12 10:44:23 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strdup(char const *s) +{ + char *tmp; + int i; + + i = 0; + tmp = ft_calloc(ft_strlen(s) + 1, sizeof(*tmp)); + if (!tmp) + return (NULL); + while (s[i]) + { + tmp[i] = s[i]; + i++; + } + tmp[i] = 0; + return (tmp); +} diff --git a/lib/libft/ft_striteri.c b/lib/libft/ft_striteri.c new file mode 100644 index 0000000..8aac9ae --- /dev/null +++ b/lib/libft/ft_striteri.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 17:24:08 by vvobis #+# #+# */ +/* Updated: 2024/04/09 19:27:07 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striteri(char const *s, void (*f)(unsigned int, char *)) +{ + unsigned int i; + + if (!s || !f) + return ; + i = 0; + while (s[i]) + { + f(i, (char *)&s[i]); + i++; + } +} diff --git a/lib/libft/ft_strjoin.c b/lib/libft/ft_strjoin.c new file mode 100644 index 0000000..03be413 --- /dev/null +++ b/lib/libft/ft_strjoin.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 19:08:03 by vvobis #+# #+# */ +/* Updated: 2024/04/12 10:07:26 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *tmp; + unsigned int i; + unsigned int j; + + if (!s1 || !s2) + return (NULL); + tmp = ft_calloc(ft_strlen(s1) + ft_strlen(s2) + 1, sizeof(*tmp)); + if (!tmp) + return (NULL); + i = 0; + while (s1[i]) + { + tmp[i] = s1[i]; + i++; + } + j = 0; + while (s2[j]) + { + tmp[i] = s2[j]; + i++; + j++; + } + tmp[i] = 0; + return (tmp); +} diff --git a/lib/libft/ft_strlcat.c b/lib/libft/ft_strlcat.c new file mode 100644 index 0000000..f89bf09 --- /dev/null +++ b/lib/libft/ft_strlcat.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 16:10:59 by vvobis #+# #+# */ +/* Updated: 2024/04/10 16:41:14 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcat(char *dest, char const *src, size_t size) +{ + size_t dlen; + size_t slen; + + if (size == 0) + return (ft_strlen(src)); + dlen = ft_strlen(dest); + slen = ft_strlen(src); + if (size <= dlen) + return (slen + size); + if (dlen + slen < size) + { + ft_memcpy(&dest[dlen], src, slen); + dest[dlen + slen] = 0; + } + else + { + ft_memcpy(&dest[dlen], src, size - dlen); + dest[size - 1] = 0; + } + return (dlen + slen); +} diff --git a/lib/libft/ft_strlcpy.c b/lib/libft/ft_strlcpy.c new file mode 100644 index 0000000..b34a653 --- /dev/null +++ b/lib/libft/ft_strlcpy.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 19:03:18 by vvobis #+# #+# */ +/* Updated: 2024/04/09 19:28:44 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcpy(char *dest, char const *src, size_t size) +{ + size_t i; + + i = 0; + if (size != 0) + { + while (src[i] != '\0' && i < size - 1) + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; + } + while (src[i] != '\0') + i++; + return (i); +} diff --git a/lib/libft/ft_strlen.c b/lib/libft/ft_strlen.c new file mode 100644 index 0000000..27a2023 --- /dev/null +++ b/lib/libft/ft_strlen.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 16:01:03 by vvobis #+# #+# */ +/* Updated: 2024/04/12 10:40:59 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(char const *str) +{ + size_t i; + + i = 0; + while (*str++) + { + i++; + if (i == SIZE_MAX) + break ; + } + return (i); +} diff --git a/lib/libft/ft_strmapi.c b/lib/libft/ft_strmapi.c new file mode 100644 index 0000000..664792b --- /dev/null +++ b/lib/libft/ft_strmapi.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmapi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/07 17:01:35 by vvobis #+# #+# */ +/* Updated: 2024/04/12 10:13:57 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + char *tmp; + unsigned int i; + + if (!s || !f) + return (NULL); + tmp = ft_calloc(ft_strlen(s) + 1, sizeof(*tmp)); + if (!tmp) + return (NULL); + i = 0; + while (s[i]) + { + tmp[i] = f(i, s[i]); + i++; + } + tmp[i] = 0; + return (tmp); +} diff --git a/lib/libft/ft_strncmp.c b/lib/libft/ft_strncmp.c new file mode 100644 index 0000000..f42fd81 --- /dev/null +++ b/lib/libft/ft_strncmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 13:33:22 by vvobis #+# #+# */ +/* Updated: 2024/04/12 10:29:59 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(char const *s1, char const *s2, size_t n) +{ + size_t i; + + if (n == 0) + return (0); + i = 0; + while ((s1[i] || s2[i]) && i < n) + { + if (s1[i] < s2[i]) + return ((unsigned char)s1[i] - (unsigned char)s2[i]); + else if (s1[i] > s2[i]) + return ((unsigned char)s1[i] - (unsigned char)s2[i]); + i++; + } + return (0); +} diff --git a/lib/libft/ft_strnstr.c b/lib/libft/ft_strnstr.c new file mode 100644 index 0000000..2733d0e --- /dev/null +++ b/lib/libft/ft_strnstr.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 15:36:41 by vvobis #+# #+# */ +/* Updated: 2024/04/10 16:42:02 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnstr(char const *s1, char const *s2, size_t n) +{ + size_t i; + size_t j; + + if (!*s2) + return ((char *)s1); + i = 0; + while (i < n && s1[i]) + { + j = 0; + if (s1[i + j] == s2[j]) + { + while (s1[i + j] == s2[j] && s1[i + j] && i + j < n) + j++; + if (!s2[j]) + return ((char *)&s1[i]); + } + i++; + } + return (NULL); +} diff --git a/lib/libft/ft_strrchr.c b/lib/libft/ft_strrchr.c new file mode 100644 index 0000000..e5d7d65 --- /dev/null +++ b/lib/libft/ft_strrchr.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 12:20:50 by vvobis #+# #+# */ +/* Updated: 2024/04/09 20:54:22 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrchr(char const *s, int c) +{ + char *n; + int i; + + i = 0; + n = NULL; + while (s[i] != 0) + { + if (s[i] == (char)c) + n = (char *)&s[i]; + i++; + } + if ((char)c == 0) + return ((char *)&s[i]); + if (n) + return (n); + return (NULL); +} diff --git a/lib/libft/ft_strtrim.c b/lib/libft/ft_strtrim.c new file mode 100644 index 0000000..e02e096 --- /dev/null +++ b/lib/libft/ft_strtrim.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 19:30:35 by vvobis #+# #+# */ +/* Updated: 2024/04/15 13:07:55 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int is_set(char c, char const *s) +{ + while (*s) + if (c == *s++) + return (1); + return (0); +} + +static int find_end(char const *s1, char const *set) +{ + int i; + + i = 0; + while (*s1) + s1++; + while (is_set(*--s1, set)) + i++; + return (i); +} + +char *ft_strtrim(char const *s1, char const *set) +{ + if (!s1) + return (NULL); + if (!set) + return ((char *)s1); + while (is_set(*s1, set) && *s1) + s1++; + if ((int)ft_strlen(s1) > find_end(s1, set)) + return (ft_substr(s1, 0, ft_strlen(s1) - find_end(s1, set))); + else + return (ft_calloc(1, 1)); +} diff --git a/lib/libft/ft_substr.c b/lib/libft/ft_substr.c new file mode 100644 index 0000000..b9e148f --- /dev/null +++ b/lib/libft/ft_substr.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_substr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/04 18:58:25 by vvobis #+# #+# */ +/* Updated: 2024/04/09 21:50:44 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + char *tmp; + unsigned int i; + + i = 0; + if (!s || start >= ft_strlen(s) || len <= 0) + { + tmp = malloc(1); + if (!tmp) + return (NULL); + tmp[i] = 0; + return (tmp); + } + if (len + start > ft_strlen(s)) + len = ft_strlen(s) - start; + tmp = malloc(sizeof(*tmp) * len + 1); + if (!tmp) + return (NULL); + while (i < len && s[i]) + { + tmp[i] = s[i + start]; + i++; + } + tmp[i] = 0; + return (tmp); +} diff --git a/lib/libft/ft_tolower.c b/lib/libft/ft_tolower.c new file mode 100644 index 0000000..d7c4540 --- /dev/null +++ b/lib/libft/ft_tolower.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 12:01:54 by vvobis #+# #+# */ +/* Updated: 2024/04/03 12:15:18 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_tolower(int c) +{ + if (c >= 65 && c <= 90) + c += 32; + return (c); +} diff --git a/lib/libft/ft_toupper.c b/lib/libft/ft_toupper.c new file mode 100644 index 0000000..7bcb06a --- /dev/null +++ b/lib/libft/ft_toupper.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/03 12:18:44 by vvobis #+# #+# */ +/* Updated: 2024/04/03 12:19:05 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_toupper(int c) +{ + if (c >= 97 && c <= 122) + c -= 32; + return (c); +} diff --git a/lib/libft/libft.h b/lib/libft/libft.h new file mode 100644 index 0000000..6f019fc --- /dev/null +++ b/lib/libft/libft.h @@ -0,0 +1,92 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: bszilas +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/09 23:43:36 by vvobis #+# #+# */ +/* Updated: 2024/12/10 21:12:01 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H + +# define LIBFT_H + +# include "../gnl/get_next_line.h" +# include "./printf/ft_printf.h" +# include +# include +# include +# include +# include + +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isprint(int c); +int ft_isascii(int c); +int ft_isspace(int c); + +/*Memory Management*/ +int ft_memcmp(void *s1, void const *s2, size_t n); +void *ft_memset(void *s, int c, size_t n); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dest, void const *src, size_t n); +void *ft_memmove(void *dest, void const *src, size_t n); +void *ft_memchr(void *s, int c, size_t n); +void *ft_calloc(size_t n, size_t s); + +/*Info Conversion*/ +int ft_atoi(char const *s); +double ft_atod(char *s); +char *ft_itoa(int n); +char **ft_split(char const *s, char c); +void ft_free(void *ptr_ptr); +long ft_atol(const char *nptr); + +/*String Manip*/ +int ft_toupper(int c); +int ft_tolower(int c); +int ft_strncmp(char const *s1, char const *s2, size_t n); +char *ft_strnstr(char const *s1, char const *s2, size_t n); +char *ft_strchr(char const *s, int c); +char *ft_strrchr(char const *s, int c); +char *ft_strdup(char const *s); +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s1, char const *set); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +void ft_striteri(char const *s, void (*f)(unsigned int, char *)); +size_t ft_strlcpy(char *dest, char const *src, size_t size); +size_t ft_strlcat(char *dest, char const *src, size_t size); +size_t ft_strlen(char const *str); + +/*List manip*/ +int ft_lstsize(t_list *lst); +void ft_lstdelone(t_list *lst, void (*del)(void*)); +void ft_lstclear(t_list **lst, void (*del)(void*)); +void ft_lstiter(t_list *lst, void (*f)(void *)); +void ft_lstadd_front(t_list **lst, t_list *node_new); +void ft_lstadd_back(t_list **lst, t_list *node_new); +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); +t_list *ft_lstnew(void *content); +t_list *ft_lstlast(t_list *lst); + +/*Output*/ +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char *str, int fd); +void ft_putendl_fd(char *str, int fd); +void ft_putnbr_fd(int n, int fd); + +/* Get Next Line */ +char *get_next_line(int fd); + +#endif diff --git a/lib/libft/printf/Makefile b/lib/libft/printf/Makefile new file mode 100644 index 0000000..0ad8066 --- /dev/null +++ b/lib/libft/printf/Makefile @@ -0,0 +1,50 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: victor +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/09/14 09:21:46 by victor #+# #+# # +# Updated: 2024/11/11 11:52:05 by marvin ### ########.fr # +# # +# **************************************************************************** # + +LIBDIR := lib +NAME := $(LIBDIR)/libftprintf.a +CC := gcc +CFLAGS = -Wall -Werror -Wextra -g3 +SRC := ft_fprintf.c ft_printf.c ft_putascii.c ft_puthex.c ft_putptr.c ft_strlen.c ft_putfloat.c +OBJ := $(SRC:.c=.o) + +ifdef RELEASE +CFLAGS -= -g3 +endif + +MKDIR = mkdir +ifeq ($(OS), Windows_NT) +RM = del /Q +else +RM = rm -rf +MKDIR += -p +endif + +all: $(NAME) + +$(NAME): $(OBJ) + ar rsc $@ $(OBJ) + +$(OBJ): $(SRC) $(LIBDIR) + $(CC) $(CFLAGS) -c $(SRC) + +$(LIBDIR): + $(MKDIR) $@ + +clean: + $(RM) $(OBJ) + +fclean: clean + $(RM) $(LIBDIR) + + +re: fclean all diff --git a/lib/libft/printf/ft_fprintf.c b/lib/libft/printf/ft_fprintf.c new file mode 100644 index 0000000..0bfdfd1 --- /dev/null +++ b/lib/libft/printf/ft_fprintf.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_fprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/17 12:04:30 by vvobis #+# #+# */ +/* Updated: 2024/09/17 12:09:29 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "./ft_printf.h" + +int ft_fprintf(int fd, const char *format, ...) +{ + va_list args; + int count; + + if (!format || fd < 0) + return (-1); + va_start(args, format); + count = 0; + while (1) + { + while (*format != '%' && *format) + ft_putchar(*format++, &count, fd); + if (!*format) + break ; + else + format++; + if (!*format || !handle_arg(args, *format, &count, fd)) + return (-1); + format++; + } + va_end(args); + return (count); +} diff --git a/lib/libft/printf/ft_printf.c b/lib/libft/printf/ft_printf.c new file mode 100644 index 0000000..8ff9870 --- /dev/null +++ b/lib/libft/printf/ft_printf.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 17:50:35 by vvobis #+# #+# */ +/* Updated: 2024/09/17 14:11:57 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +int handle_arg(va_list args, char format, int *count, int fd) +{ + if (format == 'd' || format == 'i') + ft_putnbr(va_arg(args, int), count, fd); + else if (format == 'u') + ft_putnbr(va_arg(args, unsigned int), count, fd); + else if (format == 's') + ft_putstr(va_arg(args, char *), count, fd); + else if (format == 'X') + ft_puthex_upper(va_arg(args, unsigned int), count, fd); + else if (format == 'x') + ft_puthex_lower(va_arg(args, unsigned int), count, fd); + else if (format == 'p') + ft_putptr(va_arg(args, void *), count, fd); + else if (format == 'c') + ft_putchar(va_arg(args, int), count, fd); + else if (format == '%') + ft_putchar('%', count, fd); + else if (format == 'f') + ft_putnbrf(va_arg(args, double), count, 5, fd); + else + return (0); + return (1); +} + +int ft_printf(const char *format, ...) +{ + va_list args; + int count; + + if (!format) + return (-1); + va_start(args, format); + count = 0; + while (1) + { + while (*format != '%' && *format) + ft_putchar(*format++, &count, STDOUT_FILENO); + if (!*format) + break ; + else + format++; + if (!*format || !handle_arg(args, *format, &count, STDOUT_FILENO)) + return (-1); + format++; + } + va_end(args); + return (count); +} diff --git a/lib/libft/printf/ft_printf.h b/lib/libft/printf/ft_printf.h new file mode 100644 index 0000000..e280307 --- /dev/null +++ b/lib/libft/printf/ft_printf.h @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 12:50:35 by vvobis #+# #+# */ +/* Updated: 2024/11/11 11:42:50 by marvin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRINTF_H + +# define FT_PRINTF_H + +# include +# include +# include + +# ifdef _WIN32 +# include +# undef STDIN_FILENO + +# define STDIN_FILENO _fileno(stdin) +# undef STDOUT_FILENO + +# define STDOUT_FILENO _fileno(stdout) + +# define write _write + +# else + +# include + +# endif + +int ft_fprintf(int fd, const char *format, ...); +int ft_printf(const char *format, ...); + +int handle_arg(va_list args, char format, int *count, int fd); + +void ft_puthex_lower(unsigned long nbr, int *count, int fd); +void ft_puthex_upper(unsigned long nbr, int *count, int fd); +void ft_putchar(int c, int *count, int fd); +void ft_putnbr(long n, int *count, int fd); +void ft_putnbrf(double f, int *count, int precision, int fd); +void ft_putstr(const char *str, int *count, int fd); +void ft_putptr(void *ptr, int *count, int fd); +size_t ft_strlen(const char *s); + +#endif diff --git a/lib/libft/printf/ft_putascii.c b/lib/libft/printf/ft_putascii.c new file mode 100644 index 0000000..65aa2ad --- /dev/null +++ b/lib/libft/printf/ft_putascii.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 17:54:53 by vvobis #+# #+# */ +/* Updated: 2025/05/14 17:11:37 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +void ft_putchar(int c, int *count, int fd) +{ + write(fd, &c, 1); + *count += 1; +} + +void ft_putnbr(long n, int *count, int fd) +{ + if (n < 0) + ft_putchar(0x2d, count, fd); + if (n <= -10) + ft_putnbr(n / -10, count, fd); + if (n >= 10) + ft_putnbr(n / 10, count, fd); + if (n >= 0) + ft_putchar(n % 10 + 0x30, count, fd); + if (n < 0) + ft_putchar(-(n % -10) + 0x30, count, fd); +} + +int putstring(char *str, int fd) { + + return (write(fd, str, ft_strlen(str))); + +} + +void ft_putstr(const char *str, int *count, int fd) +{ + if (!str) + { + *count += putstring("(null)", fd); + return ; + } + *count += putstring((char *)str, fd); +} diff --git a/lib/libft/printf/ft_putfloat.c b/lib/libft/printf/ft_putfloat.c new file mode 100644 index 0000000..85f17de --- /dev/null +++ b/lib/libft/printf/ft_putfloat.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putfloat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/17 11:50:45 by vvobis #+# #+# */ +/* Updated: 2024/09/17 12:07:47 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +void ft_putnbrf(double f, int *count, int precision, int fd) +{ + int number; + double fraction; + unsigned int mult; + + mult = 1; + while (precision-- > 0) + { + mult *= 10; + } + number = (int)f; + fraction = f - (double)number; + if (fraction < 0) + fraction = -fraction; + ft_putnbr(number, count, fd); + ft_putchar('.', count, fd); + number = fraction * mult; + ft_putnbr(number, count, fd); +} diff --git a/lib/libft/printf/ft_puthex.c b/lib/libft/printf/ft_puthex.c new file mode 100644 index 0000000..fad5f1b --- /dev/null +++ b/lib/libft/printf/ft_puthex.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_puthex.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 17:52:38 by vvobis #+# #+# */ +/* Updated: 2024/09/17 12:09:29 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +void ft_puthex_upper(unsigned long nbr, int *count, int fd) +{ + char *base_str; + + base_str = "0123456789ABCDEF"; + if (nbr >= 16) + ft_puthex_upper(nbr / 16, count, fd); + ft_putchar(base_str[(nbr % 16)], count, fd); +} + +void ft_puthex_lower(unsigned long nbr, int *count, int fd) +{ + char *base_str; + + base_str = "0123456789abcdef"; + if (nbr >= 16) + ft_puthex_lower(nbr / 16, count, fd); + ft_putchar(base_str[(nbr % 16)], count, fd); +} diff --git a/lib/libft/printf/ft_putptr.c b/lib/libft/printf/ft_putptr.c new file mode 100644 index 0000000..10a6bea --- /dev/null +++ b/lib/libft/printf/ft_putptr.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putptr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/18 17:53:53 by vvobis #+# #+# */ +/* Updated: 2025/05/14 17:13:56 by vvobis ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +void ft_putptr(void *ptr, int *count, int fd) +{ + void **to_print; + + if (!ptr) + { + ft_putstr("(nil)", count, fd); + return ; + } + to_print = &ptr; + *count += write(fd, "0x", 2); + ft_puthex_lower((unsigned long long)*to_print, count, fd); +} diff --git a/lib/libft/printf/ft_strlen.c b/lib/libft/printf/ft_strlen.c new file mode 100644 index 0000000..850cb1d --- /dev/null +++ b/lib/libft/printf/ft_strlen.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvobis +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/02 16:01:03 by vvobis #+# #+# */ +/* Updated: 2024/09/14 09:24:02 by victor ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" +#include "limits.h" + +size_t ft_strlen(char const *str) +{ + size_t i; + + i = 0; + while (*str++) + { + i++; + if (i == ULONG_MAX) + break ; + } + return (i); +} diff --git a/src/core/string/split.s b/src/core/string/split.s index 7c26ac6..4a060b2 100644 --- a/src/core/string/split.s +++ b/src/core/string/split.s @@ -4,7 +4,7 @@ section .text extern malloc extern putstr extern putnumber - extern strcpy + extern strdup extern memchr extern substr extern strlen @@ -121,7 +121,7 @@ split: ; RAX: char ** split(RDI: char *, RSI: int) jmp .cleanup .no_match: push rcx - call strcpy + call strdup pop rcx mov [rcx], rax .done: diff --git a/src/core/string/strcpy.s b/src/core/string/strdup.s similarity index 87% rename from src/core/string/strcpy.s rename to src/core/string/strdup.s index 6fca9d6..09c9b13 100644 --- a/src/core/string/strcpy.s +++ b/src/core/string/strdup.s @@ -1,10 +1,10 @@ -global strcpy +global strdup section .text extern malloc extern strlen -strcpy: ; rax: char *(rdi: char *) +strdup: ; rax: char *(rdi: char *) push rbx push rcx call strlen diff --git a/src/core/string_builder/sb_append.s b/src/core/string_builder/sb_append.s index e18582c..4b78bfe 100644 --- a/src/core/string_builder/sb_append.s +++ b/src/core/string_builder/sb_append.s @@ -5,6 +5,8 @@ section .text extern memcpy extern malloc extern err_malloc + extern ft_strlcpy + extern ft_strlcat %define SB [rbp - 16] %define SB_LEN dword [rbp - 4] @@ -60,7 +62,7 @@ sb_append: ; (rdi: *sb, rsi: char*) mov rsi, SB mov rsi, [rsi + STR_DATA] mov edx, SB_LEN - call memcpy + call ft_strlcpy pop rax mov rsi, SB pop r9 @@ -72,10 +74,9 @@ sb_append: ; (rdi: *sb, rsi: char*) mov dword [r9 + STR_LEN], eax mov rdi, [r9 + STR_DATA] mov eax, dword [rbp - 4] - lea rdi, [rdi + rax] mov rsi, APPENDIX - mov edx, APP_LEN - call memcpy + mov edx, SB_CAP + call ft_strlcat .done: mov rsp, rbp diff --git a/src/core/string_builder/sb_dump_to_file.s b/src/core/string_builder/sb_dump_to_file.s new file mode 100644 index 0000000..64e0b2e --- /dev/null +++ b/src/core/string_builder/sb_dump_to_file.s @@ -0,0 +1,25 @@ +%include "./src/core/string_builder/sb.s" + +%define FD dword [rbp - 4] + +section .text + extern write + +global sb_dump_to_file +sb_dump_to_file: ; (rdi: *sb, rsi: int fd) + push rbp + mov rbp, rsp + sub rsp, 16 + + ; load data, len and fd into regs to prepare for write syscall + mov FD, esi + mov rsi, [rdi + STR_DATA] + mov rdx, [rdi + STR_LEN] + mov edi, FD + + ; dump to file + call write + + mov rsp, rbp + pop rbp + ret diff --git a/src/core/syscall/file_ops.s b/src/core/syscall/file_ops.s index cf609dc..0067480 100644 --- a/src/core/syscall/file_ops.s +++ b/src/core/syscall/file_ops.s @@ -5,18 +5,24 @@ section .text global read global get_file_size global lseek + global write -open: ; rax: int fd (rdi: char *name, rsi: int flags) - mov rax, 2 ; sys_open +write: ; write(RDI: int fd, RSI: char *buffer, RDX: size_t size) + mov rax, 1 + syscall + ret + +open: ; rax: int fd (rdi: char *name, rsi: int flags) + mov rax, 2 ; sys_open syscall ret close: - mov rax, 3 ; sys_close + mov rax, 3 ; sys_close syscall ret -read: ; read(RDI: int fd, RSI: char *buffer, RDX: size_t size) +read: ; read(RDI: int fd, RSI: char *buffer, RDX: size_t size) mov rax, 0 ; sys_read syscall ; ret diff --git a/src/global/function_table.s b/src/global/function_table.s index 3794311..53883af 100644 --- a/src/global/function_table.s +++ b/src/global/function_table.s @@ -8,10 +8,10 @@ section .data exit_func global func_call_prologue - func_call_prologue: db " push rdi", 0 + func_call_prologue: db " push rdi", 0x0a, 0 global func_call - func_call: db " call ", 0 + func_call: db " call %s", 0x0a, 0 global func_call_epilogue - func_call_epilogue: db " pop rdi", 0 + func_call_epilogue: db " pop rdi", 0x0a, 0 diff --git a/src/inc/c_alignment.s b/src/inc/c_alignment.s new file mode 100644 index 0000000..3832d3f --- /dev/null +++ b/src/inc/c_alignment.s @@ -0,0 +1,39 @@ +%macro c_call 1-* + push r12 + ; Save current stack pointer in a scratch register + mov r12, rsp + mov al, 0 + + ; Align stack to 16 bytes + and rsp, -16 + + ; Set up arguments if provided + %if %0 > 1 + mov rdi, %2 + %endif + %if %0 > 2 + mov rsi, %3 + %endif + %if %0 > 3 + mov rdx, %4 + %endif + %if %0 > 4 + mov rcx, %5 + %endif + %if %0 > 5 + mov r8, %6 + %endif + %if %0 > 6 + mov r9, %7 + %endif + + ; Set al to 0 for variadic functions + mov al, 0 + + ; Make the call + call %1 + + ; Restore original stack pointer + mov rsp, r12 + pop r12 +%endmacro diff --git a/src/lexer/func_boiler_plate.s b/src/lexer/func_boiler_plate.s index bf74706..1cd83c7 100644 --- a/src/lexer/func_boiler_plate.s +++ b/src/lexer/func_boiler_plate.s @@ -1,26 +1,35 @@ +%include "./src/inc/c_alignment.s" + section .text extern putstr extern putnumberendl + extern fd_out + extern ft_fprintf - func_stack_alloc: db " push rbp", 0xa, " mov rbp, rsp", 0xa, " sub rsp, ", 0 + func_stack_alloc: db " push rbp", 0xa, " mov rbp, rsp", 0xa, " sub rsp, %d", 0x0a, 0 func_stack_dealloc: db " mov rsp, rbp", 0xa, " pop rbp", 0xa, 0 ret_inst: db " ret", 0xa, 0 global func_prologue func_prologue: ; (rdi: var_count) + ; calculate var offsets mov rax, 8 imul rax, rdi - push rax - mov rdi, func_stack_alloc - call putstr - pop rdi - call putnumberendl + + ; prepare func call + mov rdi, [fd_out] + mov rsi, func_stack_alloc + mov rdx, rax + + c_call ft_fprintf + ret global func_epilogue func_epilogue: ; - mov rdi, func_stack_dealloc - call putstr - mov rdi, ret_inst - call putstr + mov rdi, [fd_out] + mov rsi, func_stack_dealloc + + c_call ft_fprintf + ret diff --git a/src/lexer/lex_func.s b/src/lexer/lex_func.s index 0a8d581..9c6be4d 100644 --- a/src/lexer/lex_func.s +++ b/src/lexer/lex_func.s @@ -2,6 +2,7 @@ %include "./src/inc/expression.s" %include "./src/inc/function_table.s" %include "./src/inc/token.s" +%include "./src/inc/c_alignment.s" %define FUNC_ERR "[FUNC_ERROR]" @@ -11,6 +12,8 @@ section .data extern func_call_prologue extern func_call_epilogue extern REG_RDI + extern REG_RAX + extern fd_out section .text global lex_func_call @@ -25,6 +28,7 @@ section .text extern insert_mov extern load_var_reg extern load_const_reg + extern ft_fprintf insert_func_with_const: ; (rdi: name*, rsi: arg*) push rbp @@ -34,18 +38,22 @@ insert_func_with_const: ; (rdi: name*, rsi: arg*) mov [rbp - 8], rdi ; store name mov [rbp - 16], rsi ; store arg - mov rdi, func_call_prologue - call putendl + mov rdi, [fd_out] + mov rsi, func_call_prologue + call ft_fprintf mov rdi, [rbp - 16] mov rsi, REG_RDI + mov rdx, REG_RAX call load_const_reg - mov rdi, func_call - call putstr - mov rdi, [rbp - 8] - call putendl + mov rdi, [fd_out] + mov rsi, func_call + mov rdx, [rbp - 8] + c_call ft_fprintf + + mov rdi, [fd_out] mov rdi, func_call_epilogue - call putendl + c_call ft_fprintf mov rsp, rbp pop rbp @@ -59,18 +67,21 @@ insert_func_with_var: ; (rdi: name*, rsi: arg*) mov [rbp - 8], rdi ; store name mov [rbp - 16], rsi ; store arg - mov rdi, func_call_prologue - call putendl + mov rdi, [fd_out] + mov rsi, func_call_prologue + call ft_fprintf mov rdi, [rbp - 16] mov rsi, REG_RDI call load_var_reg - mov rdi, func_call - call putstr - mov rdi, [rbp - 8] - call putendl + mov rdi, [fd_out] + mov rsi, func_call + mov rdx, [rbp - 8] + c_call ft_fprintf + + mov rdi, [fd_out] mov rdi, func_call_epilogue - call putendl + c_call ft_fprintf mov rsp, rbp pop rbp diff --git a/src/lexer/lex_load.s b/src/lexer/lex_load.s index 12c16db..fe834a6 100644 --- a/src/lexer/lex_load.s +++ b/src/lexer/lex_load.s @@ -20,12 +20,13 @@ section .text extern insert_var extern insert_mov extern load_var_rax - extern load_rax_var - extern op_const_rax - extern op_var_rax + extern load_reg_var + extern op_const_reg + extern op_var_reg extern xor_reg extern look_up_var + extern REG_RAX extern lex_eexpect @@ -50,7 +51,8 @@ process_var: ; (rdi: lex*, rsi: name*, rdx: tok_op) mov rdi, rax mov rsi, rdx - call op_var_rax + mov rdx, REG_RAX + call op_var_reg mov rsp, rbp pop rbp @@ -85,7 +87,9 @@ process_token: ; rax: new_last_tok_type (rdi: lex*, rsi: *tok, rdx: last_to mov rdi, [rsi + TOK_VALUE] mov rsi, rdx - call op_const_rax + mov rdx, REG_RAX + + call op_const_reg pop rdi mov rax, TOK_CONST @@ -199,7 +203,8 @@ lex_load: ; rax: bool (rdi: lex*) .done_true: mov rdi, [rbp - 40] - call load_rax_var + mov rsi, REG_RAX + call load_reg_var mov rax, 1 mov rsp, rbp pop rbp diff --git a/src/lexer/lexer.s b/src/lexer/lexer.s index b534236..58e5f73 100644 --- a/src/lexer/lexer.s +++ b/src/lexer/lexer.s @@ -20,6 +20,7 @@ section .text extern func_prologue extern func_epilogue extern memset + extern sb_new extern program_prologue @@ -45,6 +46,10 @@ lex: ; rax: lex* (rdi: char *file_content) mov rdx, LEX_SIZE call memset + mov rdi, 0 + lea rsi, [rax + LEX_OUT] + call sb_new + pop rax mov [rbp - 24], rax ; store lex on stack diff --git a/src/lexer/program_prologue.s b/src/lexer/program_prologue.s index e56e3bb..1a5d84b 100644 --- a/src/lexer/program_prologue.s +++ b/src/lexer/program_prologue.s @@ -1,35 +1,40 @@ +%include "./src/inc/c_alignment.s" %include "./src/inc/lexer.s" %include "./src/inc/token.s" %include "./src/inc/expression.s" section .data - section_text: db "section .text", 0xa, 0 - program_start: db "global _start", 0xa, "_start:", 0xa, 0 - extern_str: db "extern ", 0 + prologue: db "section .text", 0xa, 0 + program_entry: db "global _start", 0xa, "_start:", 0xa, 0 + extern_str: db "extern %s", 0x0a, 0 section .text extern putendl extern putstr + extern fd_out + extern ft_fprintf global program_prologue -print_section_text: - mov rdi, section_text - call putstr +print_program_entry: + mov rdi, [fd_out] + mov rsi, program_entry + c_call ft_fprintf ret -print_program_start: - mov rdi, program_start - call putendl +print_section_text: + mov rdi, [fd_out] + mov rsi, prologue + c_call ft_fprintf ret declare_extern: ; (rdi: func_name*) push rdi - mov rdi, extern_str - call putstr - pop rdi - call putendl + mov rdi, [fd_out] + mov rsi, extern_str + pop rdx + c_call ft_fprintf ret declare_extern_func: ;(rdi: lex*) @@ -88,9 +93,8 @@ declare_extern_func: ;(rdi: lex*) program_prologue: ;(rdi: lex*) push rdi - mov rdi, section_text - call putendl + call print_section_text pop rdi call declare_extern_func - call print_program_start + call print_program_entry ret diff --git a/src/lexer/vars/insert_var.s b/src/lexer/vars/insert_var.s index 4762477..140b3a7 100644 --- a/src/lexer/vars/insert_var.s +++ b/src/lexer/vars/insert_var.s @@ -1,15 +1,22 @@ %include "./src/inc/token.s" +%include "./src/inc/c_alignment.s" + section .data INST_MOV: db " mov ", 0 INST_ADD: db " add ", 0 INST_SUB: db " sub ", 0 - INST_XOR: db " xor ", 0 + INST_XOR: db " xor %s, %s", 0x0a, 0 - OPEN_STACK_VAR: db "[rbp-", 0 - CLOSE_STACK_VAR: db "]", 0 - SEP_INST: db ", ", 0 + OPERAND_PAIR_CONST_REG: db "%s, %s", 0x0a, 0 + OPERAND_PAIR_CONST: db "%s, %s", 0x0a, 0 + OPERAND_PAIR_REG_VAR: db "[rbp-%d], %s", 0x0a, 0 + OPERAND_PAIR_VAR_REG: db "%s, [rbp-%d]", 0x0a, 0 + + LOAD_REG_VAR: db " mov [rbp-%d], %s", 0x0a, 0 + LOAD_VAR_REG: db " mov %s, [rbp-%d]", 0x0a, 0 + LOAD_CONST_REG: db " mov %s, %s", 0x0a, 0 section .text extern putstr @@ -26,28 +33,26 @@ section .text extern REG_RAX extern REG_RDI -global insert_xor -insert_xor: - mov rdi, INST_XOR - call putstr - ret + extern ft_fprintf -global insert_mov -insert_mov: - mov rdi, INST_MOV - call putstr - ret + extern fd_out global insert_add insert_add: - mov rdi, INST_ADD - call putstr + mov rdi, [fd_out] + mov rsi, INST_ADD + + c_call ft_fprintf + ret global insert_sub insert_sub: - mov rdi, INST_SUB - call putstr + mov rdi, [fd_out] + mov rsi, INST_SUB + + c_call ft_fprintf + ret global xor_reg @@ -55,35 +60,37 @@ xor_reg: ; rdi: char* push rbx mov rbx, rdi - call insert_xor + mov rdi, [fd_out] + mov rsi, INST_XOR + mov rdx, rbx + mov rcx, rbx - mov rdi, rbx - call putstr - - mov rdi, SEP_INST - call putstr - - mov rdi, rbx - call putendl + c_call ft_fprintf pop rbx ret +global load_var_reg +load_var_reg: ; (rdi: OFF_S, rsi: REG*) + push rsi + push rdi + mov rdi, [fd_out] + mov rsi, LOAD_VAR_REG + pop rcx + pop rdx + + c_call ft_fprintf + ret + global load_reg_var load_reg_var: ; (rdi: OFF_S, rsi: REG*) push rsi push rdi - call insert_mov - - pop rdi - call insert_var - - mov rdi, SEP_INST - call putstr - - pop rdi - call putendl - + mov rdi, [fd_out] + mov rsi, LOAD_REG_VAR + pop rdx + pop rcx + c_call ft_fprintf ret global load_const_reg @@ -91,75 +98,19 @@ load_const_reg: ; (rdi: const*, rsi: REG*) push rdi push rsi - call insert_mov + mov rdi, [fd_out] + mov rsi, LOAD_CONST_REG + pop rdx + pop rcx - pop rdi - call putstr - - mov rdi, SEP_INST - call putstr - - pop rdi - call insert_const_endl + c_call ft_fprintf ret -global load_var_reg -load_var_reg: ; (rdi: OFF_S, rsi: REG*) - push rdi - push rsi - - call insert_mov - - pop rdi - call putstr - - mov rdi, SEP_INST - call putstr - - pop rdi - call insert_var_endl - - ret - -global load_rax_var -load_rax_var: ; (rdi: OFF_S) - push rdi - call insert_mov - - pop rdi - call insert_var - - mov rdi, SEP_INST - call putstr - - mov rdi, REG_RAX - call putendl - - ret - -global load_var_rax -load_var_rax: ; (rdi: OFF_S) - push rdi - call insert_mov - - mov rdi, REG_RAX - call putstr - - mov rdi , SEP_INST - call putstr - - pop rdi - call insert_var_endl - - mov rdi, '\n' - call putchar - - ret - -global op_const_rax -op_const_rax: ; (rdi: char *, rsi: op) +global op_const_reg +op_const_reg: ; (rdi: char *, rsi: op, rdx: reg*) push rdi + push rdx cmp rsi, TOK_SUB je .sub @@ -171,20 +122,20 @@ op_const_rax: ; (rdi: char *, rsi: op) call insert_add .done: - mov rdi, REG_RAX - call putstr + pop rdx + pop rcx - mov rdi, SEP_INST - call putstr + mov rdi, [fd_out] + mov rsi, OPERAND_PAIR_CONST_REG - pop rdi - call putendl + c_call ft_fprintf ret -global op_var_rax -op_var_rax: ; (rdi: OFF_S, rsi: op) +global op_var_reg +op_var_reg: ; (rdi: OFF_S, rsi: op, rdx: reg) push rdi + push rdx cmp rsi, TOK_SUB je .sub @@ -196,95 +147,12 @@ op_var_rax: ; (rdi: OFF_S, rsi: op) call insert_add .done: - mov rdi, REG_RAX - call putstr + pop rdx + pop rcx - mov rdi, SEP_INST - call putstr + mov rdi, [fd_out] + mov rsi, OPERAND_PAIR_VAR_REG - pop rdi - call insert_var_endl - - ret - -global sub_var_rax -sub_var_rax: ; (rdi: OFF_S) - push rdi - call insert_sub - - mov rdi, REG_RAX - call putstr - - mov rdi , SEP_INST - call putstr - - pop rdi - call insert_var_endl - - ret - -global add_rax_var -add_rax_var: ; (rdi: OFF_S) - push rdi - call insert_add - - pop rdi - call insert_var - - mov rdi , SEP_INST - call putstr - - mov rdi, REG_RAX - call putendl - - ret - -global sub_rax_var -sub_rax_var: ; (rdi: OFF_S) - push rdi - call insert_sub - - pop rdi - call insert_var - - mov rdi , SEP_INST - call putstr - - mov rdi, REG_RAX - call putendl - - ret - -insert_const_endl: ; (rdi: const*) - push rdi - call putendl - pop rdi - - ret - -insert_var_endl: ; (rdi: OFF_S) - push rdi - mov rdi, OPEN_STACK_VAR - call putstr - - pop rdi - call putnumber - - mov rdi, CLOSE_STACK_VAR - call putendl - - ret - -global insert_var -insert_var: ; (rdi: OFF_S) - push rdi - mov rdi, OPEN_STACK_VAR - call putstr - - pop rdi - call putnumber - - mov rdi, CLOSE_STACK_VAR - call putstr + c_call ft_fprintf ret diff --git a/src/start.s b/src/start.s index b4ffb71..a95068b 100644 --- a/src/start.s +++ b/src/start.s @@ -2,10 +2,14 @@ section .data usage: db "Usage: ./debug .lang", 0xa, 0 - example_data: db "Do you know Ligma?" + fd_out: dd 0 + dot_s: db ".s", 0 + + global fd_out section .text global _start + extern exit extern err_args extern get_file_content @@ -18,46 +22,69 @@ section .text extern vec_pop extern sb_new extern sb_append + extern ft_fprintf + extern ft_printf + extern split + extern ft_strjoin + extern open print_usage: mov rdi, usage call putstr - _start: + ;push rbp + ;mov rbp, rsp + ;sub rsp, 16 + ;mov rdi, usage + ;lea rsi, [rbp - 16] + ;call sb_new + ; + ;lea rdi, [rbp - 16] + ;mov rsi, example_data + ;call sb_append + ;mov al, 1 + ;mov rsi, 1 + ;mov rdi, qword [rbp - 16 + STR_DATA] + ;call ft_printf + + pop rdi + cmp rdi, 2 + jne err_args + mov rdi, [rsp + 8] ; argv[1] + push rbp mov rbp, rsp + sub rsp, 16 - mov rdi, usage - lea rsi, [rbp - 16] - call sb_new - mov rdi, [rbp - 16 + STR_DATA] - call putstr - lea rdi, [rbp - 16] - mov rsi, example_data - call sb_append - mov rdi, [rbp - 16 + STR_DATA] - call putstr + ; store filename on stack + mov [rbp - 16], rdi -; pop rdi -; cmp rdi, 2 -; jne err_args -; mov rdi, [rsp + 8] ; argv[1] -; push rbp -; mov rbp, rsp -; -; sub rsp, 16 -; -; call get_file_content -; mov rdi, rax -; mov [rbp - 8], rax -; -; mov rdi, rax -; call lex -; - mov rsp, rbp - pop rbp + mov rsi, '.' + call split + + mov rdi, rax + mov rdi, [rdi] + mov rsi, dot_s + call ft_strjoin + mov rdi, rax + mov rsi, 0x241 + mov rdx, 0o644 + call open + mov [fd_out], rax + + mov rdi, [rbp - 16] + + call get_file_content + mov rdi, rax + mov [rbp - 8], rax + + mov rdi, rax + call lex + + mov rsp, rbp + pop rbp done: xor rdi, rdi diff --git a/test.s b/test.s deleted file mode 100644 index 80d874a..0000000 --- a/test.s +++ /dev/null @@ -1,24 +0,0 @@ -section .text - global _start - extern putnumber - -_start: - push rbp - mov rbp, rsp - sub rsp, 16 -xor rax, rax -add rax, 6 -mov [rbp-8], rax -xor rax, rax -add rax, 5 -sub rax, 2 -add rax, 6 -add rax, [rbp-8] -mov [rbp-16], rax -push rdi -mov rdi, [rbp-16] -call putnumber -pop rdi - mov rsp, rbp - pop rbp - ret