diff --git a/Makefile b/Makefile index 579c449..f6bd363 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/03/27 16:51:02 by tmaze #+# #+# # -# Updated: 2019/04/12 11:44:15 by tmaze ### ########.fr # +# Updated: 2019/04/22 09:44:46 by tmaze ### ########.fr # # # #******************************************************************************# @@ -47,9 +47,10 @@ SRC = lm_parser.c \ lm_utils_parser.c \ bfs.c \ lst_ind.c \ - edmunds_karp.c \ + edmonds_karp.c \ push_ants.c \ push_ants_utils.c \ + score_utils.c \ lem_in.c diff --git a/includes/lem_in.h b/includes/lem_in.h index 32c90e1..2c65024 100644 --- a/includes/lem_in.h +++ b/includes/lem_in.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/23 17:31:19 by tmaze #+# #+# */ -/* Updated: 2019/04/20 13:18:46 by mndhlovu ### ########.fr */ +/* Updated: 2019/04/22 10:01:33 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,6 +45,7 @@ typedef struct s_bfs { int parent; char visited; + char old_visited; int queue; } t_bfs; @@ -136,7 +137,9 @@ t_ind *get_node_path(t_ind *lst, int index); void bfs(t_lmdata *data, t_bfs *tab, int start_ind , int end_ind); -t_ind **edmunds_karp(t_lmdata *data, int start_ind, int end_ind); +t_ind **edmonds_karp(t_lmdata *data, int s_ind, int e_ind); +int get_score(t_lmdata *data, t_ind **ret, int nb_paths); +void print_paths(t_lmdata *data, t_ind **ret); int push_ants(t_lmdata *data, t_ind **paths , int nb_paths); diff --git a/libft b/libft deleted file mode 160000 index 5129517..0000000 --- a/libft +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 51295179f30451f2c2d6cbc8653c5accd9fb8a8a diff --git a/libft/Makefile b/libft/Makefile new file mode 100644 index 0000000..d86ae96 --- /dev/null +++ b/libft/Makefile @@ -0,0 +1,165 @@ +#******************************************************************************# +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tmaze +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2018/04/07 12:47:06 by tmaze #+# #+# # +# Updated: 2019/04/18 09:18:00 by tmaze ### ########.fr # +# # +#******************************************************************************# + +CC = gcc +CCFLAGS = -Wall -Werror -Wextra +CCSTD = + +NAME = libft.a + +SRCS = ft_memalloc.c \ + ft_memdel.c \ + ft_memset.c \ + ft_bzero.c \ + ft_memcpy.c \ + ft_memccpy.c \ + ft_memmove.c \ + ft_memchr.c \ + ft_memcmp.c \ + \ + ft_isalpha.c \ + ft_isdigit.c \ + ft_isalnum.c \ + ft_isascii.c \ + ft_isprint.c \ + ft_toupper.c \ + ft_tolower.c \ + ft_isupper.c \ + ft_islower.c \ + ft_iswhitespace.c \ + ft_issign.c \ + \ + ft_strnew.c \ + ft_strdel.c \ + ft_strclr.c \ + ft_striter.c \ + ft_striteri.c \ + ft_strmap.c \ + ft_strmapi.c \ + ft_strequ.c \ + ft_strnequ.c \ + ft_strsub.c \ + ft_strjoin.c \ + ft_strtrim.c \ + ft_strsplit.c \ + ft_strlen.c \ + ft_strdup.c \ + ft_strcpy.c \ + ft_strncpy.c \ + ft_strcat.c \ + ft_strncat.c \ + ft_strlcat.c \ + ft_strchr.c \ + ft_strrchr.c \ + ft_strstr.c \ + ft_strnstr.c \ + ft_strcmp.c \ + ft_strncmp.c \ + ft_str_is_alpha.c \ + ft_str_is_lowercase.c \ + ft_str_is_numeric.c \ + ft_str_is_printable.c \ + ft_str_is_uppercase.c \ + ft_strcapitalize.c \ + ft_strlcpy.c \ + ft_strlowcase.c \ + ft_strupcase.c \ + ft_strndup.c \ + ft_strnchr.c \ + ft_strrnchr.c \ + ft_strsplitwhitespace.c \ + ft_hasdigit.c \ + ft_del_words_tables.c \ + \ + ft_putchar.c \ + ft_putstr.c \ + ft_putendl.c \ + ft_putnbr.c \ + ft_putchar_fd.c \ + ft_putstr_fd.c \ + ft_putendl_fd.c \ + ft_putnbr_fd.c \ + ft_putstrpad.c \ + ft_putnbrpad.c \ + ft_putstrn.c \ + ft_print_words_tables.c \ + ft_putendl2.c \ + ft_putendl_fd2.c \ + \ + ft_lstnew.c \ + ft_lstdelone.c \ + ft_lstdel.c \ + ft_lstadd.c \ + ft_lstiter.c \ + ft_lstmap.c \ + ft_lstaddend.c \ + ft_lstsize.c \ + ft_lstgetat.c \ + ft_lstgetlast.c \ + ft_lstsort.c \ + ft_lstaddsort.c \ + \ + ft_abs.c \ + ft_atoi.c \ + ft_atois.c \ + ft_itoa.c \ + ft_nbrlen.c \ + ft_round.c \ + \ + ft_printf.c \ + ft_printf_check_fields.c \ + ft_printf_check_type.c \ + ft_printf_tools.c \ + ft_printf_tools_char.c \ + ft_printf_tools_float.c \ + ft_printf_tools_hexa.c \ + ft_printf_tools_int.c \ + ft_printf_tools_lenght.c \ + ft_printf_tools_malloc_size.c \ + ft_printf_tools_oct.c \ + ft_printf_tools_prec_size.c \ + ft_printf_tools_str.c \ + ft_printf_tools_unsigned_int.c \ + ft_printf_tools_wchar_t.c \ + ft_printf_tools_wstr.c \ + \ + get_next_line.c \ + ft_getline.c \ + \ + ft_sort_params.c \ + ft_realpath.c + +SRCDIR = srcs +OBJDIR = objs +OBJS = $(SRCS:.c=.o) +OBJP = $(addprefix $(OBJDIR)/, $(OBJS)) +INCLS = -Iincludes + +.PHONY = all clean fclean re + +all: $(NAME) + +$(NAME): $(OBJP) + ar rcs $(NAME) $(OBJP) + +$(OBJDIR)/%.o: $(SRCDIR)/%.c includes/libft.h + @mkdir -p $(OBJDIR) + $(CC) $(CCFLAGS) $(CCSTD) $(INCLS) -c $< -o $@ + +clean: + rm -f $(OBJP) + +fclean: clean + rm -f $(NAME) + rm -rf $(OBJDIR) + +re: fclean all diff --git a/libft/auteur b/libft/auteur new file mode 100644 index 0000000..3d3f281 --- /dev/null +++ b/libft/auteur @@ -0,0 +1 @@ +tmaze diff --git a/libft/includes/libft.h b/libft/includes/libft.h new file mode 100644 index 0000000..8efb2a0 --- /dev/null +++ b/libft/includes/libft.h @@ -0,0 +1,367 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 00:12:36 by tmaze #+# #+# */ +/* Updated: 2019/03/20 16:46:41 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H + +# include +# include +# include +# include +# include +# include +# include + +# define FT_RESET "\x1b[0m" +# define FT_BOLD "\x1b[1m" +# define FT_CLEAR "\x1b[2J" + +# define FT_COLOR_BLACK "\x1b[30m" +# define FT_COLOR_RED "\x1b[31m" +# define FT_COLOR_GREEN "\x1b[32m" +# define FT_COLOR_YELLOW "\x1b[33m" +# define FT_COLOR_BLUE "\x1b[34m" +# define FT_COLOR_MAGENTA "\x1b[35m" +# define FT_COLOR_CYAN "\x1b[36m" +# define FT_COLOR_WHITE "\x1b[37m" + +# define FT_COLOR_BG_BLACK "\x1b[40m" +# define FT_COLOR_BG_RED "\x1b[41m" +# define FT_COLOR_BG_GREEN "\x1b[42m" +# define FT_COLOR_BG_YELLOW "\x1b[43m" +# define FT_COLOR_BG_BLUE "\x1b[44m" +# define FT_COLOR_BG_MAGENTA "\x1b[45m" +# define FT_COLOR_BG_CYAN "\x1b[46m" +# define FT_COLOR_BG_WHITE "\x1b[47m" + +# define FT_INT_MAX 2147483647 +# define FT_INT_MIN -2147483648 + +/* +** définition type t_list +*/ + +typedef struct s_list +{ + void *content; + size_t content_size; + struct s_list *next; +} t_list; + +/* +** definition macro BUFF_SIZE +*/ + +# define BUFF_SIZE 30 + +/* +** definition type t_file +*/ + +typedef struct s_file +{ + int fd; + char buff[BUFF_SIZE + 1]; +} t_file; + +enum e_size +{ + h, + hh, + l, + ll, + j, + z, + L +}; + +enum e_type +{ + p, + d, + i, + D, + o, + O, + u, + x, + X, + U, + s, + S, + c, + C, + percent, + f +}; + +typedef struct s_conv +{ + int fl_minus; + int fl_plus; + int fl_zero; + int fl_hashtag; + int fl_space; + int fl_witdth; + int fl_prec; + enum e_size fl_size; + enum e_type fl_type; + char *str; + int str_size; +} t_conv; + +/* +** Print functions +*/ + +int ft_printf(const char *format, ...); +void ft_putchar(char c); +void ft_putnbr(int n); +void ft_putstr(char const *s); + +/* +** ft_printf tools +*/ + +void init_struct_conv(t_conv *field); +void ft_align_str_zero(char *str, t_conv *field); +void ft_align_str(char *str, t_conv *field); +void set_malloc_sizes(uintmax_t nb, t_conv *field); +void set_malloc_sizeu(uintmax_t nb, t_conv *field); +void set_malloc_sizeo(uintmax_t nb, t_conv *field); +void set_malloc_sizeu(uintmax_t nb, t_conv *field); +int set_malloc_sizef(long double nb, char *nbrstr + , t_conv *field); +void init_handler_tab(char *(*f[14])(t_conv *, va_list)); +int ft_wstrlen(const wint_t *str); +uint64_t dmod(long double nb, long double mod); + +/* +** Check Flags +*/ + +void check_flags(const char **str, t_conv *field); +void check_width(const char **str, t_conv *field, va_list ap); +ssize_t check_precision(const char **str, t_conv *field + , va_list ap); +void check_size(const char **str, t_conv *field); +ssize_t check_type_one(const char **str, t_conv *field); +ssize_t check_type_two(const char **str, t_conv *field); +ssize_t check_fields(const char **str, va_list ap, t_conv *field); + +/* +** Handle type i and d +*/ + +char *handler_int(uintmax_t nb, t_conv *field); +char *select_int_handler(t_conv *field, va_list ap); +char *handle_output_i_d(t_conv *field, va_list ap); + +/* +** Handle type u +*/ + +char *select_uns_int_handler(t_conv *field, va_list ap); +char *handle_output_u(t_conv *field, va_list ap); +char *handler_uns(uintmax_t nb, t_conv *field); + +/* +** Handle type x and X +*/ + +char *handler_hexa(uintmax_t nb, t_conv *field); +char *select_hexa_handler(t_conv *field, va_list ap); +char *handle_output_hexa(t_conv *field, va_list ap); +void ft_align_hex_zero(char *str, t_conv *field); +void ft_align_hex(char *str, t_conv *field); +int set_precision_sizex(uintmax_t nb, t_conv *field); +void set_malloc_sizeh(uintmax_t nb, t_conv *field); + +/* +** Handle type o +*/ + +char *handler_oct(uintmax_t nb, t_conv *field); +char *select_oct_handler(t_conv *field, va_list ap); +char *handle_output_oct(t_conv *field, va_list ap); +void ft_align_oct_zero(char *str, t_conv *field); +void ft_align_oct(char *str, t_conv *field); +int set_precision_sizeo(uintmax_t nb, t_conv *field); + +/* +** Handle type c +*/ + +char *handle_output_char(t_conv *field, va_list ap); + +/* +** Handle type C +*/ + +unsigned int ft_bin_size(unsigned int nb); +void ft_align_wchar(char *str, t_conv *field); +char *handler_2oct_char(wint_t c, t_conv *field); +char *handler_3oct_char(wint_t c, t_conv *field); +char *handler_4oct_char(wint_t c, t_conv *field); +char *handle_output_wchar(t_conv *field, va_list ap); + +/* +** Handle type s +*/ + +char *handle_output_str(t_conv *field, va_list ap); +void ft_align_wstr(char *str, t_conv *field); +int set_precision_sizes(uintmax_t nb, t_conv *field); + +/* +** Handle type S +*/ + +char *handle_output_wstr(t_conv *field, va_list ap); +int set_prec_size_wstr(const wint_t *str, t_conv *field); + +/* +** Handle type f +*/ + +char *handle_output_float(t_conv *field, va_list ap); + +/* +** fonctions obligatoires +*/ + +void *ft_memset(void *b, int c, size_t len); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dest, const void *src,\ + size_t n); +void *ft_memccpy(void *dest, const void *src,\ + int c, size_t n); +void *ft_memmove(void *dest, const void *src, size_t len); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +size_t ft_strlen(const char *s); +char *ft_strdup(const char *s); +char *ft_strcpy(char *dest, const char *src); +char *ft_strncpy(char *dest, const char *src, size_t n); +char *ft_strcat(char *dest, const char *src); +char *ft_strncat(char *dest, const char *src,\ + size_t n); +size_t ft_strlcat(char *dst, const char *src, size_t size); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +char *ft_strstr(const char *haystack, const char *needle); +char *ft_strnstr(const char *haystack, const char *needle,\ + size_t len); +int ft_strcmp(const char *s1, const char *s2); +int ft_strncmp(const char *s1, const char *s2, size_t n); +int ft_atoi(const char *str); +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +int ft_toupper(int c); +int ft_tolower(int c); + +/* +** fonctions supplémentaires +*/ + +void *ft_memalloc(size_t size); +void ft_memdel(void **ap); +char *ft_strnew(size_t size); +void ft_strdel(char **as); +void ft_strclr(char *s); +void ft_striter(char *s, void (*f)(char *)); +void ft_striteri(char *s, void (*f)(unsigned int, char *)); +char *ft_strmap(char const *s, char (*f)(char)); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +int ft_strequ(char const *s1, char const *s2); +int ft_strnequ(char const *s1, char const *s2, size_t n); +char *ft_strsub(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s); +char **ft_strsplit(char const *s, char c); +char *ft_itoa(int n); +void ft_putchar(char c); +void ft_putstr(char const *s); +void ft_putendl(char const *s); +void ft_putnbr(int n); +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char const *s, int fd); +void ft_putendl_fd(char const *s, int fd); +void ft_putnbr_fd(int n, int fd); + +/* +** fonctions bonus +*/ + +t_list *ft_lstnew(void const *content, size_t content_size); +void ft_lstdelone(t_list **alst, void (*del)(void *, size_t)); +void ft_lstdel(t_list **alst, void (*del)(void *, size_t)); +void ft_lstadd(t_list **alst, t_list *new); +void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); + +/* +** fonctions additionneles +*/ + +int ft_isupper(int c); +int ft_islower(int c); +int ft_str_is_alpha(char *str); +int ft_str_is_lowercase(char *str); +int ft_str_is_numeric(char *str); +int ft_str_is_printable(char *str); +int ft_str_is_uppercase(char *str); +char *ft_strlowcase(char *s); +char *ft_strupcase(char *s); +char *ft_strcapitalize(char *str); +size_t ft_strlcpy(char *dst, const char *src,\ + size_t size); +size_t ft_lstsize(t_list *lst); +t_list *ft_lstgetat(t_list *lst, size_t ind); +t_list *ft_lstgetlast(t_list *lst); +void ft_sort_params(int ac, char **av); +void ft_print_words_tables(char **tab); +t_list *ft_lstaddend(t_list **alst, t_list *new); +char *ft_strndup(const char *s1, size_t n); +unsigned int ft_abs(int nb); +char *ft_strnchr(const char *s, int c, int n); +char *ft_strrnchr(const char *s, int c, int n); + +int get_next_line(const int fd, char **line); + +void ft_del_words_tables(char ***word_table); +void ft_putstrn(char const *s, size_t nb); +size_t ft_nbrlen(int nb); +void ft_putstrpad(char *str, size_t size, char pad, char align); +void ft_putnbrpad(int nbr, size_t size, char pad, char align); + +void ft_lstsort(t_list **lst, int (*f)(void *c1, void *c2), + int rev); +void ft_lstaddsort(t_list **lst, t_list *new, + int (*f)(void *c1, void *c2), int rev); + +int ft_round(float x, float ind); + +char *ft_realpath(char *r_path, char **a_path); +int ft_issign(char c); +int ft_iswhitespace(char c); +int ft_hasdigit(char *s); +char **ft_strsplitwhitespace(char *s); +int ft_atois(const char *str, int *nb); +int ft_getline(char **line); +int ft_putendl2(char const *s); +int ft_putendl_fd2(char const *s, int fd); + +#endif diff --git a/libft/srcs/ft_abs.c b/libft/srcs/ft_abs.c new file mode 100644 index 0000000..891e8bb --- /dev/null +++ b/libft/srcs/ft_abs.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_abs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/05 16:44:52 by tmaze #+# #+# */ +/* Updated: 2018/05/05 16:49:04 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +unsigned int ft_abs(int nb) +{ + if (nb < 0) + return (nb * -1); + return (nb); +} diff --git a/libft/srcs/ft_atoi.c b/libft/srcs/ft_atoi.c new file mode 100644 index 0000000..7614ed7 --- /dev/null +++ b/libft/srcs/ft_atoi.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 13:50:22 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:37:42 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_atoi(const char *str) +{ + int nbnum; + int mult; + int ret; + + nbnum = 0; + while (str[nbnum] == ' ' || str[nbnum] == '\t' || str[nbnum] == '\n' + || str[nbnum] == '\v' || str[nbnum] == '\f' || str[nbnum] == '\r') + nbnum++; + if (str[nbnum] == '+' || str[nbnum] == '-') + nbnum++; + while (str[nbnum] != '\0' && ft_isdigit(str[nbnum])) + nbnum++; + nbnum--; + ret = 0; + mult = 1; + while (nbnum >= 0 && ft_isdigit(str[nbnum])) + { + ret += (str[nbnum--] - '0') * mult; + mult *= 10; + } + if (nbnum >= 0 && str[nbnum] == '-') + ret *= -1; + return (ret); +} diff --git a/libft/srcs/ft_atois.c b/libft/srcs/ft_atois.c new file mode 100644 index 0000000..f0c20a0 --- /dev/null +++ b/libft/srcs/ft_atois.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atois.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/27 11:58:44 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:47:50 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_atois(const char *str, int *nb) +{ + int num; + int mult; + int max; + + num = 0; + while (ft_iswhitespace(str[num])) + num++; + max = (str[num] == '-') ? FT_INT_MIN : FT_INT_MAX; + if (str[num] == '+' || str[num] == '-') + num++; + while (str[num] != '\0' && ft_isdigit(str[num])) + num++; + num--; + *nb = 0; + mult = 1; + while (num >= 0 && ft_isdigit(str[num]) + && (ft_abs(max - *nb) >= 2000000000)) + { + *nb += (str[num--] - '0') * mult; + mult *= 10; + } + if (num >= 0 && str[num] == '-') + *nb *= -1; + return (!ft_isdigit(str[num]) || ft_abs(max - *nb) >= 2000000000); +} diff --git a/libft/srcs/ft_bzero.c b/libft/srcs/ft_bzero.c new file mode 100644 index 0000000..1cc6791 --- /dev/null +++ b/libft/srcs/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 16:43:09 by tmaze #+# #+# */ +/* Updated: 2018/04/06 10:49:12 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + ft_memset(s, 0, n); +} diff --git a/libft/srcs/ft_close.c b/libft/srcs/ft_close.c new file mode 100644 index 0000000..e6a9c7d --- /dev/null +++ b/libft/srcs/ft_close.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_close.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/08 13:39:05 by tmaze #+# #+# */ +/* Updated: 2019/03/08 13:44:25 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_close(t_file *file) +{ + int filedes; + + filedes = file->fd; + ft_memdel(file); + return (close(filedes) == 0); +} diff --git a/libft/srcs/ft_del_words_tables.c b/libft/srcs/ft_del_words_tables.c new file mode 100644 index 0000000..86cee0f --- /dev/null +++ b/libft/srcs/ft_del_words_tables.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_del_words_tables.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/07/25 15:13:09 by tmaze #+# #+# */ +/* Updated: 2018/07/25 16:03:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_del_words_tables(char ***word_table) +{ + int i; + + i = -1; + while ((*word_table)[++i]) + ft_strdel(&(*word_table)[i]); + ft_memdel((void**)word_table); + *word_table = NULL; +} diff --git a/libft/srcs/ft_getline.c b/libft/srcs/ft_getline.c new file mode 100644 index 0000000..4801d93 --- /dev/null +++ b/libft/srcs/ft_getline.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_getline.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/07 15:12:59 by tmaze #+# #+# */ +/* Updated: 2019/03/19 17:30:24 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int get_last_ind(char *buff) +{ + int i; + + i = 0; + while (buff[i] && buff[i] != '\n') + i++; + return (i); +} + +static int flush_buff(char **line, char *buff) +{ + char *tmp; + int i; + + i = get_last_ind(buff); + if (*line == NULL) + { + if ((*line = ft_strndup(buff, i)) == NULL) + return (-1); + } + else if (*line != NULL) + { + if ((tmp = ft_strnew(ft_strlen(*line) + i)) != NULL) + { + ft_strcpy(tmp, *line); + ft_strncat(tmp, buff, i); + ft_strdel(line); + *line = tmp; + } + else + { + ft_strdel(line); + return (-1); + } + } + return (i); +} + +static void init_getline(char **line, int *check, int *ret) +{ + *line = NULL; + *check = BUFF_SIZE; + *ret = -2; +} + +int ft_getline(char **line) +{ + static char buff[BUFF_SIZE] = "\0"; + int check; + int ret; + int i; + + if (line == NULL || BUFF_SIZE < 1) + return (-1); + init_getline(line, &check, &ret); + while (check == BUFF_SIZE) + { + if (buff[0] == '\0') + { + if ((ret = read(0, buff, BUFF_SIZE)) == -1) + return (-1); + if (ret == 0 && *line == NULL) + return (0); + } + if ((i = flush_buff(line, buff)) == -1) + return (-1); + check = (buff[i] != '\n' && ret != 0) ? BUFF_SIZE : i; + ft_memmove(buff, buff + i + 1, BUFF_SIZE - i); + ft_memset(buff + BUFF_SIZE - i, '\0', i); + } + return (1); +} diff --git a/libft/srcs/ft_gets.c b/libft/srcs/ft_gets.c new file mode 100644 index 0000000..cbc28b9 --- /dev/null +++ b/libft/srcs/ft_gets.c @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_gets.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/08 13:44:31 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:33:26 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" diff --git a/libft/srcs/ft_hasdigit.c b/libft/srcs/ft_hasdigit.c new file mode 100644 index 0000000..9c57d0d --- /dev/null +++ b/libft/srcs/ft_hasdigit.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hasdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/25 16:16:40 by tmaze #+# #+# */ +/* Updated: 2019/02/28 16:18:26 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_hasdigit(char *s) +{ + int i; + + i = 0; + while (s[i] && !ft_isdigit(s[i])) + i++; + return (ft_isdigit(s[i])); +} diff --git a/libft/srcs/ft_isalnum.c b/libft/srcs/ft_isalnum.c new file mode 100644 index 0000000..2d1d9c5 --- /dev/null +++ b/libft/srcs/ft_isalnum.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 11:51:53 by tmaze #+# #+# */ +/* Updated: 2018/04/04 12:00:08 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalnum(int c) +{ + return (ft_isalpha(c) || ft_isdigit(c)); +} diff --git a/libft/srcs/ft_isalpha.c b/libft/srcs/ft_isalpha.c new file mode 100644 index 0000000..2e24e50 --- /dev/null +++ b/libft/srcs/ft_isalpha.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 10:56:47 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:21:34 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalpha(int c) +{ + return (ft_islower(c) || ft_isupper(c)); +} diff --git a/libft/srcs/ft_isascii.c b/libft/srcs/ft_isascii.c new file mode 100644 index 0000000..9e83a3b --- /dev/null +++ b/libft/srcs/ft_isascii.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 12:23:59 by tmaze #+# #+# */ +/* Updated: 2018/04/04 12:25:37 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isascii(int c) +{ + return (c >= 0 && c <= 127); +} diff --git a/libft/srcs/ft_isdigit.c b/libft/srcs/ft_isdigit.c new file mode 100644 index 0000000..aa76237 --- /dev/null +++ b/libft/srcs/ft_isdigit.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 11:33:35 by tmaze #+# #+# */ +/* Updated: 2018/04/04 11:34:10 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isdigit(int c) +{ + return (c >= '0' && c <= '9'); +} diff --git a/libft/srcs/ft_islower.c b/libft/srcs/ft_islower.c new file mode 100644 index 0000000..a6a6147 --- /dev/null +++ b/libft/srcs/ft_islower.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_islower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:20:43 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:21:23 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_islower(int c) +{ + return (c >= 'a' && c <= 'z'); +} diff --git a/libft/srcs/ft_isprint.c b/libft/srcs/ft_isprint.c new file mode 100644 index 0000000..d57ba58 --- /dev/null +++ b/libft/srcs/ft_isprint.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 12:29:36 by tmaze #+# #+# */ +/* Updated: 2018/04/04 12:30:28 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isprint(int c) +{ + return (c >= 32 && c <= 126); +} diff --git a/libft/srcs/ft_issign.c b/libft/srcs/ft_issign.c new file mode 100644 index 0000000..5b18417 --- /dev/null +++ b/libft/srcs/ft_issign.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_issign.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/25 16:18:54 by tmaze #+# #+# */ +/* Updated: 2019/02/25 16:19:13 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_issign(char c) +{ + return (c == '+' || c == '-'); +} diff --git a/libft/srcs/ft_isupper.c b/libft/srcs/ft_isupper.c new file mode 100644 index 0000000..b86d1e4 --- /dev/null +++ b/libft/srcs/ft_isupper.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:10:12 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:10:31 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isupper(int c) +{ + return (c >= 'A' && c <= 'Z'); +} diff --git a/libft/srcs/ft_iswhitespace.c b/libft/srcs/ft_iswhitespace.c new file mode 100644 index 0000000..48c7fc1 --- /dev/null +++ b/libft/srcs/ft_iswhitespace.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_iswhitespace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/25 16:11:19 by tmaze #+# #+# */ +/* Updated: 2019/02/25 16:13:25 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_iswhitespace(char c) +{ + return (c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' + || c == '\r'); +} diff --git a/libft/srcs/ft_itoa.c b/libft/srcs/ft_itoa.c new file mode 100644 index 0000000..5b2f97b --- /dev/null +++ b/libft/srcs/ft_itoa.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 11:20:12 by tmaze #+# #+# */ +/* Updated: 2018/05/05 16:48:49 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_itoa(int n) +{ + unsigned long mult; + int nb_nbr; + int sign; + unsigned long nbr; + char *ret; + + mult = 10; + nb_nbr = 1; + nbr = ft_abs(n); + sign = (n < 0); + while (mult <= nbr && (nb_nbr++)) + mult *= 10; + nb_nbr += sign; + if ((ret = ft_strnew(nb_nbr)) == NULL) + return (NULL); + nb_nbr = 0; + if (sign && (++nb_nbr)) + ret[0] = '-'; + while (mult > 1) + { + ret[nb_nbr++] = '0' + ((nbr % mult) / (mult / 10)); + mult /= 10; + } + return (ret); +} diff --git a/libft/srcs/ft_lstadd.c b/libft/srcs/ft_lstadd.c new file mode 100644 index 0000000..1cb3221 --- /dev/null +++ b/libft/srcs/ft_lstadd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 19:26:05 by tmaze #+# #+# */ +/* Updated: 2018/04/08 19:27:35 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd(t_list **alst, t_list *new) +{ + new->next = *alst; + *alst = new; +} diff --git a/libft/srcs/ft_lstaddend.c b/libft/srcs/ft_lstaddend.c new file mode 100644 index 0000000..abb02e5 --- /dev/null +++ b/libft/srcs/ft_lstaddend.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstaddend.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/17 20:55:26 by tmaze #+# #+# */ +/* Updated: 2018/11/26 12:30:30 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstaddend(t_list **alst, t_list *new) +{ + t_list *tmp; + + if (new == NULL) + return (NULL); + if (ft_lstsize(*alst) == 0) + ft_lstadd(alst, new); + else if (ft_lstsize(*alst) > 0) + { + tmp = ft_lstgetlast(*alst); + ft_lstadd(&(tmp->next), new); + } + return (*alst); +} diff --git a/libft/srcs/ft_lstaddsort.c b/libft/srcs/ft_lstaddsort.c new file mode 100644 index 0000000..c8aef4a --- /dev/null +++ b/libft/srcs/ft_lstaddsort.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstaddsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/01 11:57:25 by tmaze #+# #+# */ +/* Updated: 2018/10/02 16:43:09 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstaddsort(t_list **lst, t_list *new, int (*f)(void *c1, void *c2), + int rev) +{ + t_list **sort; + + sort = lst; + if (*lst == NULL || (!rev && (*f)((*lst)->content, new->content) > 0) + || (rev && (*f)((*lst)->content, new->content) < 0)) + ft_lstadd(lst, new); + else + { + while ((*sort) && ((rev && (*f)((*sort)->content, new->content) >= 0) + || (!rev && (*f)((*sort)->content, new->content) <= 0))) + sort = &(*sort)->next; + ft_lstadd(&(*sort), new); + } +} diff --git a/libft/srcs/ft_lstdel.c b/libft/srcs/ft_lstdel.c new file mode 100644 index 0000000..c5e6cc9 --- /dev/null +++ b/libft/srcs/ft_lstdel.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 17:19:32 by tmaze #+# #+# */ +/* Updated: 2018/06/12 00:33:45 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdel(t_list **alst, void (*del)(void*, size_t)) +{ + if (*alst) + { + if ((*alst)->next != NULL) + ft_lstdel(&((*alst)->next), del); + ft_lstdelone(alst, del); + } +} diff --git a/libft/srcs/ft_lstdelone.c b/libft/srcs/ft_lstdelone.c new file mode 100644 index 0000000..94c5e15 --- /dev/null +++ b/libft/srcs/ft_lstdelone.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 17:00:17 by tmaze #+# #+# */ +/* Updated: 2018/04/08 17:22:15 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdelone(t_list **alst, void (*del)(void*, size_t)) +{ + (*del)((*alst)->content, (*alst)->content_size); + free(*alst); + *alst = NULL; +} diff --git a/libft/srcs/ft_lstgetat.c b/libft/srcs/ft_lstgetat.c new file mode 100644 index 0000000..9092b65 --- /dev/null +++ b/libft/srcs/ft_lstgetat.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstgetat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 16:35:51 by tmaze #+# #+# */ +/* Updated: 2018/04/09 16:45:36 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstgetat(t_list *lst, size_t ind) +{ + size_t i; + t_list *tmp; + + i = 0; + tmp = lst; + while (i != ind && tmp) + { + i++; + tmp = tmp->next; + } + return (tmp); +} diff --git a/libft/srcs/ft_lstgetlast.c b/libft/srcs/ft_lstgetlast.c new file mode 100644 index 0000000..ebd2bde --- /dev/null +++ b/libft/srcs/ft_lstgetlast.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstgetlast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 17:34:10 by tmaze #+# #+# */ +/* Updated: 2018/04/12 12:23:02 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstgetlast(t_list *lst) +{ + return (ft_lstgetat(lst, ft_lstsize(lst) - 1)); +} diff --git a/libft/srcs/ft_lstiter.c b/libft/srcs/ft_lstiter.c new file mode 100644 index 0000000..bb6882e --- /dev/null +++ b/libft/srcs/ft_lstiter.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 19:48:44 by tmaze #+# #+# */ +/* Updated: 2018/04/08 19:51:33 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstiter(t_list *lst, void (*f)(t_list *elem)) +{ + t_list *tmp; + + tmp = lst; + while (tmp) + { + (*f)(tmp); + tmp = tmp->next; + } +} diff --git a/libft/srcs/ft_lstmap.c b/libft/srcs/ft_lstmap.c new file mode 100644 index 0000000..86be818 --- /dev/null +++ b/libft/srcs/ft_lstmap.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 19:54:31 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:31:03 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void ft_lstdelmem(void *content, size_t content_size) +{ + (void)content_size; + free(content); +} + +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)) +{ + t_list *ret; + t_list *new; + + ret = NULL; + if (lst != NULL && f != NULL) + { + if (lst->next != NULL) + ret = ft_lstmap(lst->next, f); + if ((new = (*f)(lst)) == NULL) + ft_lstdel(&ret, &ft_lstdelmem); + else + ft_lstadd(&ret, new); + } + return (ret); +} diff --git a/libft/srcs/ft_lstnew.c b/libft/srcs/ft_lstnew.c new file mode 100644 index 0000000..d6bbaeb --- /dev/null +++ b/libft/srcs/ft_lstnew.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 00:35:42 by tmaze #+# #+# */ +/* Updated: 2018/04/08 17:15:34 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstnew(void const *content, size_t content_size) +{ + t_list *ret; + + if ((ret = (t_list*)malloc(sizeof(t_list))) != NULL) + { + if (!content) + { + ret->content = NULL; + ret->content_size = 0; + } + else + { + if ((ret->content = malloc(content_size)) == NULL) + { + free(ret); + return (0); + } + ft_memmove(ret->content, content, content_size); + ret->content_size = content_size; + } + ret->next = NULL; + } + return (ret); +} diff --git a/libft/srcs/ft_lstsize.c b/libft/srcs/ft_lstsize.c new file mode 100644 index 0000000..937736b --- /dev/null +++ b/libft/srcs/ft_lstsize.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 13:55:29 by tmaze #+# #+# */ +/* Updated: 2018/11/28 14:46:12 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_lstsize(t_list *lst) +{ + if (lst == NULL) + return (0); + else + return (ft_lstsize(lst->next) + 1); +} diff --git a/libft/srcs/ft_lstsort.c b/libft/srcs/ft_lstsort.c new file mode 100644 index 0000000..08233f7 --- /dev/null +++ b/libft/srcs/ft_lstsort.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/01 11:54:22 by tmaze #+# #+# */ +/* Updated: 2018/10/01 12:42:27 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstsort(t_list **lst, int (*f)(void *c1, void *c2), int rev) +{ + t_list *sorted; + t_list *ind; + t_list *next; + + ind = *lst; + sorted = NULL; + while (ind) + { + next = ind->next; + ft_lstaddsort(&sorted, ind, (*f), rev); + ind = next; + } + *lst = sorted; +} diff --git a/libft/srcs/ft_memalloc.c b/libft/srcs/ft_memalloc.c new file mode 100644 index 0000000..d3dd14e --- /dev/null +++ b/libft/srcs/ft_memalloc.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memalloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 17:38:56 by tmaze #+# #+# */ +/* Updated: 2018/04/06 18:07:20 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memalloc(size_t size) +{ + void *ret; + + if ((ret = malloc(size)) != NULL) + ft_bzero(ret, size); + return (ret); +} diff --git a/libft/srcs/ft_memccpy.c b/libft/srcs/ft_memccpy.c new file mode 100644 index 0000000..fe6cafc --- /dev/null +++ b/libft/srcs/ft_memccpy.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memccpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 11:29:28 by tmaze #+# #+# */ +/* Updated: 2018/04/06 11:30:21 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memccpy(void *dest, const void *src, int c, size_t n) +{ + size_t i; + + i = 0; + while (++i <= n) + { + ((char*)dest)[i - 1] = ((char*)src)[i - 1]; + if (((unsigned char*)src)[i - 1] == (unsigned char)c) + return (dest + i); + } + return (NULL); +} diff --git a/libft/srcs/ft_memchr.c b/libft/srcs/ft_memchr.c new file mode 100644 index 0000000..17937b1 --- /dev/null +++ b/libft/srcs/ft_memchr.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 16:07:52 by tmaze #+# #+# */ +/* Updated: 2018/04/06 16:27:54 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + int i; + char *tmp; + + i = -1; + tmp = (char*)s; + while ((unsigned int)++i < n) + if ((char)tmp[i] == (char)c) + return ((void*)&tmp[i]); + return (NULL); +} diff --git a/libft/srcs/ft_memcmp.c b/libft/srcs/ft_memcmp.c new file mode 100644 index 0000000..8e8b9d6 --- /dev/null +++ b/libft/srcs/ft_memcmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 16:55:25 by tmaze #+# #+# */ +/* Updated: 2018/04/08 13:41:54 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + size_t i; + int diff; + void *str1; + void *str2; + + i = 0; + diff = 0; + str1 = (void*)s1; + str2 = (void*)s2; + if (n > 0) + diff = ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0]; + while (diff == 0 && ++i < n) + diff = ((unsigned char*)str1)[i] - ((unsigned char*)str2)[i]; + return (diff); +} diff --git a/libft/srcs/ft_memcpy.c b/libft/srcs/ft_memcpy.c new file mode 100644 index 0000000..97d9faa --- /dev/null +++ b/libft/srcs/ft_memcpy.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 11:05:36 by tmaze #+# #+# */ +/* Updated: 2018/04/06 11:09:57 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dest, const void *src, size_t n) +{ + size_t i; + + i = 0; + while (++i <= n) + ((char*)dest)[i - 1] = ((char*)src)[i - 1]; + return (dest); +} diff --git a/libft/srcs/ft_memdel.c b/libft/srcs/ft_memdel.c new file mode 100644 index 0000000..1e80242 --- /dev/null +++ b/libft/srcs/ft_memdel.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 18:21:08 by tmaze #+# #+# */ +/* Updated: 2018/04/07 15:27:28 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_memdel(void **ap) +{ + if (ap && *ap) + { + free(*ap); + *ap = NULL; + } +} diff --git a/libft/srcs/ft_memmove.c b/libft/srcs/ft_memmove.c new file mode 100644 index 0000000..c5883c4 --- /dev/null +++ b/libft/srcs/ft_memmove.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 15:06:49 by tmaze #+# #+# */ +/* Updated: 2018/04/08 13:28:55 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memmove(void *dst, const void *src, size_t len) +{ + size_t i; + + i = 0; + if (src < dst) + { + i = len + 1; + while (--i > 0) + ((char*)dst)[i - 1] = ((char*)src)[i - 1]; + } + else if (src > dst) + while (++i <= len) + ((char*)dst)[i - 1] = ((char*)src)[i - 1]; + return (dst); +} diff --git a/libft/srcs/ft_memset.c b/libft/srcs/ft_memset.c new file mode 100644 index 0000000..4fd4fa1 --- /dev/null +++ b/libft/srcs/ft_memset.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 15:22:55 by tmaze #+# #+# */ +/* Updated: 2018/04/06 18:20:06 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *b, int c, size_t len) +{ + size_t i; + + i = 0; + while (i < len) + ((char*)b)[i++] = c; + return (b); +} diff --git a/libft/srcs/ft_nbrlen.c b/libft/srcs/ft_nbrlen.c new file mode 100644 index 0000000..9351379 --- /dev/null +++ b/libft/srcs/ft_nbrlen.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_nbrlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/07/25 17:45:29 by tmaze #+# #+# */ +/* Updated: 2018/07/25 18:20:22 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_nbrlen(int nb) +{ + size_t nb_len; + + nb_len = 0; + if (nb <= 0) + nb_len++; + if (nb < 0) + nb *= -1; + while (nb > 0) + { + nb /= 10; + nb_len++; + } + return (nb_len); +} diff --git a/libft/srcs/ft_open.c b/libft/srcs/ft_open.c new file mode 100644 index 0000000..2706216 --- /dev/null +++ b/libft/srcs/ft_open.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_open.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/08 13:27:26 by tmaze #+# #+# */ +/* Updated: 2019/03/08 13:38:29 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_file *ft_open(char *filename, oint oflag) +{ + t_file *ret; + + if ((ret = ft_memalloc(sizeof(t_file))) == NULL) + return (NULL); + if ((ret->fd = open(filename, oflag)) == -1) + { + ft_memdel(&ret); + return (NULL); + } + ft_bzero(ret->buff, BUFF_SIZE + 1); + return (ret); +} diff --git a/libft/srcs/ft_print_words_tables.c b/libft/srcs/ft_print_words_tables.c new file mode 100644 index 0000000..efa8efc --- /dev/null +++ b/libft/srcs/ft_print_words_tables.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_words_tables.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/15 15:48:16 by tmaze #+# #+# */ +/* Updated: 2018/04/21 15:47:57 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_print_words_tables(char **tab) +{ + unsigned int i; + + i = 0; + while (tab[i]) + { + ft_putendl(tab[i]); + i++; + } +} diff --git a/libft/srcs/ft_printf.c b/libft/srcs/ft_printf.c new file mode 100644 index 0000000..6da2349 --- /dev/null +++ b/libft/srcs/ft_printf.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/28 22:27:58 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:16:43 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void init_handler_tab(char *(*t[16])(t_conv *, va_list)) +{ + t[d] = &handle_output_i_d; + t[D] = &handle_output_i_d; + t[i] = &handle_output_i_d; + t[x] = &handle_output_hexa; + t[X] = &handle_output_hexa; + t[p] = &handle_output_hexa; + t[o] = &handle_output_oct; + t[O] = &handle_output_oct; + t[u] = handle_output_u; + t[U] = handle_output_u; + t[c] = &handle_output_char; + t[C] = &handle_output_wchar; + t[s] = &handle_output_str; + t[S] = &handle_output_wstr; + t[percent] = &handle_output_char; + t[f] = &handle_output_float; +} + +void clean_mem(t_conv *field, va_list ap) +{ + free(field); + va_end(ap); +} + +int handle_conv(const char **str, t_conv *field, va_list ap, int *nb_print) +{ + char *(*handler[16])(t_conv *, va_list); + + init_handler_tab(handler); + (*str)++; + if (check_fields(str, ap, field)) + { + if (!(field->str = handler[field->fl_type](field, ap))) + { + clean_mem(field, ap); + return (0); + } + write(1, field->str, field->str_size); + *nb_print += field->str_size; + free(field->str); + } + else + { + clean_mem(field, ap); + return (0); + } + return (1); +} + +int ft_printf(const char *format, ...) +{ + va_list ap; + const char *str; + int nb_print_chars; + t_conv *field; + + if (!(field = (t_conv *)malloc(sizeof(t_conv)))) + return (-1); + va_start(ap, format); + str = format; + nb_print_chars = 0; + while (str && *str) + { + if (*str != '%') + { + write(1, str, 1); + ++nb_print_chars; + } + else if (!(handle_conv(&str, field, ap, &nb_print_chars))) + return (-1); + ++str; + } + clean_mem(field, ap); + return (nb_print_chars); +} diff --git a/libft/srcs/ft_printf_check_fields.c b/libft/srcs/ft_printf_check_fields.c new file mode 100644 index 0000000..934dfae --- /dev/null +++ b/libft/srcs/ft_printf_check_fields.c @@ -0,0 +1,142 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_fields.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/29 12:33:40 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:16:54 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void check_flags(const char **str, t_conv *field) +{ + while (**str == '-' || **str == '+' || **str == '0' || **str == '#' + || **str == ' ') + { + if (**str == '-') + field->fl_minus = 1; + else if (**str == '+') + field->fl_plus = 1; + else if (**str == '0') + field->fl_zero = 1; + else if (**str == '#') + field->fl_hashtag = 1; + else if (**str == ' ') + field->fl_space = 1; + (*str)++; + } +} + +void check_width(const char **str, t_conv *field, va_list ap) +{ + int tmp; + + if (**str == '*') + { + tmp = va_arg(ap, int); + field->fl_witdth = (tmp < 0) ? -tmp : tmp; + if (tmp < 0) + field->fl_minus = 1; + (*str)++; + } + else + { + field->fl_witdth = 0; + while (**str >= '0' && **str <= '9') + { + field->fl_witdth *= 10; + field->fl_witdth += **str - '0'; + (*str)++; + } + } +} + +ssize_t check_precision(const char **str, t_conv *field, va_list ap) +{ + int tmp; + + if (**str == '.') + { + (*str)++; + if (**str == '*') + { + if ((tmp = va_arg(ap, int)) >= 0) + field->fl_prec = tmp; + (*str)++; + } + else if (**str >= '0' && **str <= '9') + { + field->fl_prec = 0; + while (**str >= '0' && **str <= '9') + { + field->fl_prec *= 10; + field->fl_prec += **str - '0'; + (*str)++; + } + } + else + field->fl_prec = 0; + } + return (1); +} + +void check_size(const char **str, t_conv *field) +{ + if (**str == 'h' || **str == 'l' || **str == 'j' || **str == 'z' + || **str == 'L') + { + if (**str == 'h' && *(*str + 1) == 'h') + { + field->fl_size = hh; + (*str)++; + } + else if (**str == 'h') + field->fl_size = h; + else if (**str == 'l' && *(*str + 1) == 'l') + { + field->fl_size = ll; + (*str)++; + } + else if (**str == 'l') + field->fl_size = l; + else if (**str == 'j') + field->fl_size = l; + else if (**str == 'z') + field->fl_size = l; + else if (**str == 'L') + field->fl_size = L; + (*str)++; + } +} + +ssize_t check_fields(const char **str, va_list ap, t_conv *field) +{ + init_struct_conv(field); + check_flags(str, field); + check_width(str, field, ap); + if (!(check_precision(str, field, ap))) + return (0); + check_size(str, field); + if (!(check_type_one(str, field)) || !(check_type_two(str, field))) + return (0); + if ((field->fl_type != d && field->fl_type != D && field->fl_type != i + && field->fl_type != f) || field->fl_plus == 1) + field->fl_space = 0; + if (field->fl_type < s && field->fl_prec != -1) + field->fl_zero = 0; + else if (field->fl_type < s && field->fl_prec == -1) + field->fl_prec = 1; + if (field->fl_type == C && field->fl_size == h) + field->fl_type = c; + if (field->fl_type == c && field->fl_size == l) + field->fl_type = C; + if (field->fl_type == S && field->fl_size == h) + field->fl_type = s; + if (field->fl_type == s && field->fl_size == l) + field->fl_type = S; + return (1); +} diff --git a/libft/srcs/ft_printf_check_type.c b/libft/srcs/ft_printf_check_type.c new file mode 100644 index 0000000..8b53e2f --- /dev/null +++ b/libft/srcs/ft_printf_check_type.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_type.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/02 21:09:18 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:18:05 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +ssize_t check_type_one(const char **str, t_conv *field) +{ + if (**str == 'd' || **str == 'D' || **str == 'i' || **str == 'o' + || **str == 'u' || **str == 'x' || **str == 'X' || **str == 's' + || **str == 'S' || **str == 'c' || **str == 'C' || **str == 'U' + || **str == 'p' || **str == '%' || **str == 'O' || **str == 'f') + { + if (**str == 'd') + field->fl_type = d; + else if (**str == 'D') + field->fl_type = D; + else if (**str == 'i') + field->fl_type = i; + else if (**str == 'o') + field->fl_type = o; + else if (**str == 'u') + field->fl_type = u; + else if (**str == 'U') + field->fl_type = U; + else if (**str == 'x') + field->fl_type = x; + else if (**str == 'X') + field->fl_type = X; + return (1); + } + return (0); +} + +ssize_t check_type_two(const char **str, t_conv *field) +{ + if (**str == 'd' || **str == 'D' || **str == 'i' || **str == 'o' + || **str == 'u' || **str == 'x' || **str == 'X' || **str == 's' + || **str == 'S' || **str == 'c' || **str == 'C' || **str == 'U' + || **str == 'p' || **str == '%' || **str == 'O' || **str == 'f') + { + if (**str == 's') + field->fl_type = s; + else if (**str == 'S') + field->fl_type = S; + else if (**str == 'c') + field->fl_type = c; + else if (**str == 'C') + field->fl_type = C; + else if (**str == 'p') + field->fl_type = p; + else if (**str == '%') + field->fl_type = percent; + else if (**str == 'O') + field->fl_type = O; + else if (**str == 'f') + field->fl_type = f; + return (1); + } + return (0); +} diff --git a/libft/srcs/ft_printf_tools.c b/libft/srcs/ft_printf_tools.c new file mode 100644 index 0000000..07cbc68 --- /dev/null +++ b/libft/srcs/ft_printf_tools.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/02 21:49:45 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:18:16 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void init_struct_conv(t_conv *field) +{ + field->fl_minus = 0; + field->fl_plus = 0; + field->fl_zero = 0; + field->fl_hashtag = 0; + field->fl_space = 0; + field->fl_witdth = 0; + field->fl_prec = -1; + field->fl_size = -1; + field->fl_type = -1; + field->str = NULL; + field->str_size = 0; +} + +char *ft_strnewb(size_t size) +{ + size_t i; + char *str; + + i = -1; + if (!(str = (char *)malloc(sizeof(char) * (size + 1)))) + return (NULL); + while (++i < (size + 1)) + str[i] = '\0'; + return (str); +} + +uint64_t dmod(long double nb, long double mod) +{ + uint64_t res; + + res = (uint64_t)(nb - mod * (uint64_t)(nb / mod)); + return (res); +} diff --git a/libft/srcs/ft_printf_tools_char.c b/libft/srcs/ft_printf_tools_char.c new file mode 100644 index 0000000..f6d93e2 --- /dev/null +++ b/libft/srcs/ft_printf_tools_char.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/19 08:51:48 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:22:07 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *handle_output_char(t_conv *field, va_list ap) +{ + char *output; + unsigned char c; + + if (field->fl_type == percent) + c = '%'; + else + c = (unsigned char)va_arg(ap, int); + field->str_size = (field->fl_witdth > 1) ? field->fl_witdth : 1; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + output[0] = c; + ft_align_wchar(output, field); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_float.c b/libft/srcs/ft_printf_tools_float.c new file mode 100644 index 0000000..d943957 --- /dev/null +++ b/libft/srcs/ft_printf_tools_float.c @@ -0,0 +1,122 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf_tools_float.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/13 12:52:34 by tmaze #+# #+# */ +/* Updated: 2019/03/07 22:23:31 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void roundup(char *str, long double n, int i, int prec) +{ + int ret; + int len; + + ret = 1; + len = ft_strlen(str); + if ((int)n >= 5 && (n - (int)n) > 0.0) + { + while (i-- != 0 && ret == 1) + { + if (str[i] != '.' && str[i] + 1 > '9' && (ret = 1)) + str[i] = '0'; + else if (str[i] != '.' && !(ret = 0)) + str[i]++; + } + if (ret == 1 && (i = ft_strlen(str)) < 4980) + while (--i > 0) + str[i + 1] = str[i]; + str[0] = (ret == 1 && i < 4980) ? '1' : str[0]; + } + i = 0; + while (str[i] && str[i] != '.') + i++; + i += prec + 1; + while (i < len) + str[i++] = '\0'; +} + +void getint(char *str, long double n, int *i) +{ + uint64_t nb; + long double div; + + nb = n; + div = 1; + while ((nb / div) >= 10) + div *= 10; + nb /= div; + while (*i < 4935 && div != 0) + { + str[*i] = (int)nb + '0'; + div = (div == 1) ? 0 : (div / 10); + nb = dmod((n / div), 10); + (*i)++; + } +} + +char *getnbrstr(long double nb, t_conv *field) +{ + char str[4980]; + int i; + int j; + + ft_bzero(str, 4980); + nb = nb * ((nb < 0.0) ? -1 : 1); + i = 0; + getint(str, nb, &i); + j = 0; + if (field->fl_prec > 0 || field->fl_hashtag) + str[i++] = '.'; + nb = (nb - (uint64_t)nb) * ((nb < 0.0) ? -1 : 1) * 10; + while (j < field->fl_prec && i + j < 4980) + { + str[i + j] = (uint64_t)nb + '0'; + nb = (nb - (uint64_t)nb) * 10; + j++; + } + i += j; + roundup(str, nb, i, field->fl_prec); + return (ft_strdup(str)); +} + +void set_strf(t_conv *f, char *nbrstr, long double nb, int pad) +{ + if (!f->fl_minus && !f->fl_zero) + ft_memset(f->str, ' ', (pad > 0) ? pad : 0); + if (nb < 0.0) + f->str[ft_strlen(f->str)] = '-'; + else if (f->fl_plus || f->fl_space) + f->str[ft_strlen(f->str)] = (f->fl_plus) ? '+' : ' '; + if (!f->fl_minus && f->fl_zero) + ft_memset(&f->str[ft_strlen(f->str)], '0', (pad > 0) ? pad : 0); + ft_strcat(f->str, nbrstr); + if (f->fl_minus) + ft_memset(&f->str[ft_strlen(f->str)], ' ', (pad > 0) ? pad : 0); +} + +char *handle_output_float(t_conv *field, va_list ap) +{ + long double nb; + int pad; + int size; + char *nbrstr; + + if (field->fl_size == L) + nb = (long double)va_arg(ap, long double); + else + nb = (long double)va_arg(ap, double); + field->fl_prec = (field->fl_prec == -1) ? 6 : field->fl_prec; + nbrstr = getnbrstr(nb, field); + size = set_malloc_sizef(nb, nbrstr, field); + pad = field->str_size - size; + if ((field->str = ft_strnew(field->str_size)) != NULL) + set_strf(field, nbrstr, nb, pad); + ft_strdel(&nbrstr); + return (field->str); +} diff --git a/libft/srcs/ft_printf_tools_hexa.c b/libft/srcs/ft_printf_tools_hexa.c new file mode 100644 index 0000000..a2e6857 --- /dev/null +++ b/libft/srcs/ft_printf_tools_hexa.c @@ -0,0 +1,120 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_hexa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/13 19:58:30 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:23:44 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *handler_hexa(uintmax_t nb, t_conv *field) +{ + int size; + uintmax_t n; + char *str; + + size = set_precision_sizex(nb, field); + set_malloc_sizeh(nb, field); + if (!(str = ft_strnew(field->str_size))) + return (NULL); + n = nb; + while (n) + { + str[--size] = (field->fl_type == X) ? "0123456789ABCDEF"[n % 16] + : "0123456789abcdef"[n % 16]; + n /= 16; + } + while (--size >= 0 && field->fl_prec) + str[size] = '0'; + if (field->fl_hashtag) + str[1] = (field->fl_type == X) ? 'X' : 'x'; + if (field->fl_hashtag) + str[0] = '0'; + ft_align_hex(str, field); + return (str); +} + +void ft_align_hex_zero(char *str, t_conv *field) +{ + int i; + int len; + + i = 0; + len = (int)ft_strlen(str); + if (field->fl_hashtag == 0 || (field->fl_hashtag == 1 + && field->fl_zero == 0)) + { + ft_memmove(str + (field->str_size - len), str, len); + while (i < field->str_size - len) + str[i++] = (field->fl_zero) ? '0' : ' '; + } + else + { + i = 1; + ft_memmove(str + (field->str_size - len + 2), str + 2, len - 2); + while (++i < field->str_size - len + 2) + str[i] = '0'; + } +} + +void ft_align_hex(char *str, t_conv *field) +{ + int i; + + i = 0; + if ((int)(ft_strlen(str)) < field->str_size) + { + if (field->fl_minus == 1) + { + while (str[i]) + i++; + while (i < field->str_size) + str[i++] = ' '; + } + else + { + ft_align_hex_zero(str, field); + } + } +} + +char *select_hexa_handler(t_conv *field, va_list ap) +{ + uintmax_t tmp; + + if (field->fl_size == h) + tmp = (uintmax_t)(short unsigned int)va_arg(ap, unsigned int); + else if (field->fl_size == hh) + tmp = (uintmax_t)(unsigned char)va_arg(ap, unsigned int); + else if (field->fl_size == l) + tmp = (uintmax_t)va_arg(ap, long unsigned int); + else if (field->fl_size == ll) + tmp = (uintmax_t)va_arg(ap, unsigned long long int); + else if (field->fl_size == j) + tmp = va_arg(ap, uintmax_t); + else if (field->fl_size == z) + tmp = (uintmax_t)va_arg(ap, size_t); + else + tmp = (uintmax_t)va_arg(ap, unsigned int); + if (tmp == 0 && field->fl_type != p) + field->fl_hashtag = 0; + return (handler_hexa(tmp, field)); +} + +char *handle_output_hexa(t_conv *field, va_list ap) +{ + char *output; + + if (field->fl_type == p) + { + field->fl_hashtag = 1; + field->fl_size = j; + } + output = select_hexa_handler(field, ap); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_int.c b/libft/srcs/ft_printf_tools_int.c new file mode 100644 index 0000000..bdaa061 --- /dev/null +++ b/libft/srcs/ft_printf_tools_int.c @@ -0,0 +1,113 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_int.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/10 14:02:42 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:23:55 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *handler_int(uintmax_t nb, t_conv *field) +{ + int size; + uintmax_t n; + char *str; + + size = set_precision_sizes(nb, field); + set_malloc_sizes(nb, field); + if (!(str = ft_strnew(field->str_size))) + return (NULL); + n = ((intmax_t)nb >= 0) ? (uintmax_t)nb : -(uintmax_t)nb; + while (n) + { + str[--size] = n % 10 + '0'; + n /= 10; + } + while (--size >= 0 && field->fl_prec) + str[size] = '0'; + if ((intmax_t)nb < 0) + str[0] = '-'; + else if (field->fl_plus || field->fl_space) + str[0] = (field->fl_plus) ? '+' : ' '; + ft_align_str(str, field); + return (str); +} + +void ft_align_str_zero(char *str, t_conv *field) +{ + int i; + int len; + + i = 0; + len = (int)ft_strlen(str); + if (field->fl_zero == 0 + || (str[0] != '-' && str[0] != '+' && str[0] != ' ')) + { + ft_memmove(str + (field->str_size - len), str, len); + while (i < field->str_size - len) + str[i++] = (field->fl_zero && field->fl_prec == 1) ? '0' : ' '; + } + else + { + ft_memmove(str + (field->str_size - len + 1), str + 1, len - 1); + while (++i < field->str_size - len + 1) + str[i] = '0'; + } +} + +void ft_align_str(char *str, t_conv *field) +{ + int i; + + i = 0; + if ((int)(ft_strlen(str)) < field->str_size) + { + if (field->fl_minus == 1) + { + while (str[i]) + i++; + while (i < field->str_size) + str[i++] = ' '; + } + else + { + ft_align_str_zero(str, field); + } + } +} + +char *select_int_handler(t_conv *field, va_list ap) +{ + uintmax_t tmp; + + if (field->fl_size == h) + tmp = (uintmax_t)(short int)va_arg(ap, int); + else if (field->fl_size == hh) + tmp = (uintmax_t)(char)va_arg(ap, int); + else if (field->fl_size == l) + tmp = (uintmax_t)va_arg(ap, long int); + else if (field->fl_size == ll) + tmp = (uintmax_t)va_arg(ap, long long int); + else if (field->fl_size == j) + tmp = (uintmax_t)va_arg(ap, intmax_t); + else if (field->fl_size == z) + tmp = (uintmax_t)va_arg(ap, ssize_t); + else + tmp = (uintmax_t)va_arg(ap, int); + return (handler_int(tmp, field)); +} + +char *handle_output_i_d(t_conv *field, va_list ap) +{ + char *output; + + if (field->fl_type == D) + field->fl_size = l; + output = select_int_handler(field, ap); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_lenght.c b/libft/srcs/ft_printf_tools_lenght.c new file mode 100644 index 0000000..d1c5a1d --- /dev/null +++ b/libft/srcs/ft_printf_tools_lenght.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_lenght.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/01 15:40:34 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:19:06 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +unsigned int ft_bin_size(unsigned int nb) +{ + unsigned int n; + unsigned int size; + + n = nb; + size = 1; + while (n /= 2) + size++; + return (size); +} + +int ft_wstrlen(const wint_t *str) +{ + int i; + int len; + + i = 0; + len = 0; + while (str[i]) + { + if (str[i] < 0 || (MB_CUR_MAX == 1 && str[i] > 0xFF) + || (str[i] >= 0xD800 && str[i] <= 0xDFFF) || str[i] > 0x10FFFF) + return (-1); + else if (str[i] <= 0x7F || (MB_CUR_MAX == 1 && str[i] <= 0xFF)) + len += 1; + else if (str[i] <= 0x7FF) + len += 2; + else if (str[i] <= 0xFFFF) + len += 3; + else if (str[i] <= 0x10FFFF) + len += 4; + ++i; + } + return (len); +} diff --git a/libft/srcs/ft_printf_tools_malloc_size.c b/libft/srcs/ft_printf_tools_malloc_size.c new file mode 100644 index 0000000..17256fc --- /dev/null +++ b/libft/srcs/ft_printf_tools_malloc_size.c @@ -0,0 +1,79 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_malloc_size.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/01 13:43:37 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:20:26 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void set_malloc_sizes(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + + if (nb == 0 && field->fl_prec == 0) + field->str_size = 0; + else + field->str_size = 1; + tmp = ((intmax_t)nb >= 0) ? (uintmax_t)nb : -(uintmax_t)nb; + while (tmp /= 10) + ++field->str_size; + field->str_size = (field->str_size < field->fl_prec) + ? field->fl_prec : field->str_size; + field->str_size += ((intmax_t)nb < 0 || field->fl_plus + || field->fl_space) ? 1 : 0; + field->str_size = (field->str_size < field->fl_witdth) + ? field->fl_witdth : field->str_size; +} + +void set_malloc_sizeh(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + + if (nb == 0 && field->fl_prec == 0) + field->str_size = 0; + else + field->str_size = 1; + tmp = nb; + while (tmp /= 16) + field->str_size++; + field->str_size = (field->str_size < field->fl_prec) + ? field->fl_prec : field->str_size; + field->str_size += (field->fl_hashtag) ? 2 : 0; + field->str_size = (field->str_size < field->fl_witdth) + ? field->fl_witdth : field->str_size; +} + +void set_malloc_sizeo(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + + if (nb == 0) + field->str_size = 0; + else + field->str_size = 1; + tmp = nb; + while (tmp /= 8) + ++field->str_size; + field->str_size += (field->fl_hashtag) ? 1 : 0; + field->str_size = (field->str_size < field->fl_prec) + ? field->fl_prec : field->str_size; + field->str_size = (field->str_size < field->fl_witdth) + ? field->fl_witdth : field->str_size; +} + +int set_malloc_sizef(long double nb, char *nbrstr, t_conv *field) +{ + int size; + + size = ft_strlen(nbrstr); + if (nb < 0.0 || field->fl_plus || field->fl_space) + size++; + field->str_size = (field->fl_witdth > size) ? field->fl_witdth : size; + return (size); +} diff --git a/libft/srcs/ft_printf_tools_oct.c b/libft/srcs/ft_printf_tools_oct.c new file mode 100644 index 0000000..c3e6215 --- /dev/null +++ b/libft/srcs/ft_printf_tools_oct.c @@ -0,0 +1,110 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_oct.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/13 20:13:28 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:24:23 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *handler_oct(uintmax_t nb, t_conv *field) +{ + int size; + uintmax_t n; + char *str; + + size = set_precision_sizeo(nb, field); + set_malloc_sizeo(nb, field); + if (!(str = ft_strnew(field->str_size))) + return (NULL); + n = nb; + while (n) + { + str[--size] = n % 8 + '0'; + n /= 8; + } + while (--size >= 0 && field->fl_prec) + str[size] = '0'; + if (field->fl_hashtag) + str[0] = '0'; + ft_align_oct(str, field); + return (str); +} + +void ft_align_oct_zero(char *str, t_conv *field) +{ + int i; + int len; + + i = 0; + len = (int)ft_strlen(str); + if (field->fl_zero == 0 || field->fl_hashtag == 0) + { + ft_memmove(str + (field->str_size - len), str, len); + while (i < field->str_size - len) + str[i++] = (field->fl_zero) ? '0' : ' '; + } + else + { + ft_memmove(str + (field->str_size - len + 1), str + 1, len - 1); + while (++i < field->str_size - len + 1) + str[i] = '0'; + } +} + +void ft_align_oct(char *str, t_conv *field) +{ + int i; + + i = 0; + if ((int)(ft_strlen(str)) < field->str_size) + { + if (field->fl_minus == 1) + { + while (str[i]) + i++; + while (i < field->str_size) + str[i++] = ' '; + } + else + { + ft_align_oct_zero(str, field); + } + } +} + +char *select_oct_handler(t_conv *field, va_list ap) +{ + uintmax_t tmp; + + if (field->fl_size == h) + tmp = (uintmax_t)(short unsigned int)va_arg(ap, unsigned int); + else if (field->fl_size == hh) + tmp = (uintmax_t)(unsigned char)va_arg(ap, unsigned int); + else if (field->fl_size == l) + tmp = (uintmax_t)va_arg(ap, long unsigned int); + else if (field->fl_size == ll) + tmp = (uintmax_t)va_arg(ap, unsigned long long int); + else if (field->fl_size == j) + tmp = va_arg(ap, uintmax_t); + else if (field->fl_size == z) + tmp = (uintmax_t)va_arg(ap, size_t); + else + tmp = (uintmax_t)va_arg(ap, unsigned int); + return (handler_oct(tmp, field)); +} + +char *handle_output_oct(t_conv *field, va_list ap) +{ + char *output; + + if (field->fl_type == O) + field->fl_size = l; + output = select_oct_handler(field, ap); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_prec_size.c b/libft/srcs/ft_printf_tools_prec_size.c new file mode 100644 index 0000000..b9d2cc0 --- /dev/null +++ b/libft/srcs/ft_printf_tools_prec_size.c @@ -0,0 +1,97 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_prec_size.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/01 15:36:42 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:20:49 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int set_precision_sizex(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + int size; + + if (nb == 0 && field->fl_prec == 0) + size = 0; + else + size = 1; + tmp = nb; + while (tmp /= 16) + ++size; + size = (size < field->fl_prec) ? field->fl_prec : size; + size += (field->fl_hashtag) ? 2 : 0; + return (size); +} + +int set_precision_sizes(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + int size; + + if (nb == 0 && field->fl_prec == 0) + size = 0; + else + size = 1; + tmp = ((intmax_t)nb >= 0) ? (uintmax_t)nb : -(uintmax_t)nb; + while (tmp /= 10) + ++size; + size = (size < field->fl_prec) ? field->fl_prec : size; + size += ((intmax_t)nb < 0 || field->fl_plus || field->fl_space) ? 1 : 0; + return (size); +} + +int set_precision_sizeo(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + int size; + + if (nb == 0 && field->fl_prec == 0) + size = 0; + else if (nb == 0) + { + size = 0; + field->fl_hashtag = 0; + } + else + size = 1; + tmp = nb; + while (tmp /= 8) + ++size; + size += (field->fl_hashtag) ? 1 : 0; + size = (size < field->fl_prec) ? field->fl_prec : size; + return (size); +} + +int set_prec_size_wstr(const wint_t *str, t_conv *field) +{ + int i; + int tmp; + + i = 0; + field->str_size = 0; + while (str[i] && (field->str_size < field->fl_prec)) + { + tmp = field->str_size; + if (str[i] < 0 || (MB_CUR_MAX == 1 && str[i] > 0xFF) + || (str[i] >= 0xD800 && str[i] <= 0xDFFF) || str[i] > 0x10FFFF) + return (0); + else if (str[i] <= 0x7F || (MB_CUR_MAX == 1 && str[i] <= 0xFF)) + field->str_size += (field->str_size + 1 <= field->fl_prec) ? 1 : 0; + else if (str[i] <= 0x7FF) + field->str_size += (field->str_size + 2 <= field->fl_prec) ? 2 : 0; + else if (str[i] <= 0xFFFF) + field->str_size += (field->str_size + 3 <= field->fl_prec) ? 3 : 0; + else if (str[i] <= 0x10FFFF) + field->str_size += (field->str_size + 4 <= field->fl_prec) ? 4 : 0; + if (tmp == field->str_size) + return (1); + ++i; + } + return (1); +} diff --git a/libft/srcs/ft_printf_tools_str.c b/libft/srcs/ft_printf_tools_str.c new file mode 100644 index 0000000..8b39deb --- /dev/null +++ b/libft/srcs/ft_printf_tools_str.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf_tools_str.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/19 09:05:22 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:27:38 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_align_wstr(char *str, t_conv *field) +{ + int i; + int len; + + i = 0; + if (field->fl_witdth >= 1) + { + if (field->fl_minus) + { + while (str[i]) + i++; + while (i < field->str_size) + str[i++] = ' '; + } + else + { + len = (int)ft_strlen(str); + ft_memmove(str + (field->str_size - len), str, len); + while (i < (field->str_size - len)) + { + str[i] = ' '; + i++; + } + } + } +} + +char *handle_output_str(t_conv *field, va_list ap) +{ + char *output; + int len; + const char *str; + + str = va_arg(ap, const char *); + if (str == NULL) + str = "(null)"; + len = (int)ft_strlen(str); + if (field->fl_prec != -1) + len = (len > field->fl_prec) ? field->fl_prec : len; + field->str_size = (field->fl_witdth > len) ? field->fl_witdth : len; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + if (field->fl_prec == -1) + ft_strcpy(output, str); + else + ft_strncpy(output, str, len); + ft_align_wstr(output, field); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_unsigned_int.c b/libft/srcs/ft_printf_tools_unsigned_int.c new file mode 100644 index 0000000..e46bcae --- /dev/null +++ b/libft/srcs/ft_printf_tools_unsigned_int.c @@ -0,0 +1,99 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_unsigned_int.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/13 19:43:31 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:25:00 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void set_malloc_sizeu(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + + if (nb == 0 && field->fl_prec == 0) + field->str_size = 0; + else + field->str_size = 1; + tmp = nb; + while (tmp /= 10) + ++field->str_size; + field->str_size = (field->str_size < field->fl_prec) + ? field->fl_prec : field->str_size; + field->str_size = (field->str_size < field->fl_witdth) + ? field->fl_witdth : field->str_size; +} + +int set_precision_sizeu(uintmax_t nb, t_conv *field) +{ + uintmax_t tmp; + int size; + + if (nb == 0 && field->fl_prec == 0) + size = 0; + else + size = 1; + tmp = nb; + while (tmp /= 10) + ++size; + size = (size < field->fl_prec) ? field->fl_prec : size; + return (size); +} + +char *handler_uns(uintmax_t nb, t_conv *field) +{ + int size; + uintmax_t n; + char *str; + + size = set_precision_sizeu(nb, field); + set_malloc_sizeu(nb, field); + if (!(str = ft_strnew(field->str_size))) + return (NULL); + n = nb; + while (n) + { + str[--size] = n % 10 + '0'; + n /= 10; + } + while (--size >= 0 && field->fl_prec) + str[size] = '0'; + ft_align_str(str, field); + return (str); +} + +char *select_uns_int_handler(t_conv *field, va_list ap) +{ + uintmax_t tmp; + + if (field->fl_size == h) + tmp = (uintmax_t)(short unsigned int)va_arg(ap, unsigned int); + else if (field->fl_size == hh) + tmp = (uintmax_t)(unsigned char)va_arg(ap, unsigned int); + else if (field->fl_size == l) + tmp = (uintmax_t)va_arg(ap, long unsigned int); + else if (field->fl_size == ll) + tmp = (uintmax_t)va_arg(ap, unsigned long long int); + else if (field->fl_size == j) + tmp = va_arg(ap, uintmax_t); + else if (field->fl_size == z) + tmp = (uintmax_t)va_arg(ap, size_t); + else + tmp = (uintmax_t)va_arg(ap, unsigned int); + return (handler_uns(tmp, field)); +} + +char *handle_output_u(t_conv *field, va_list ap) +{ + char *output; + + if (field->fl_type == U) + field->fl_size = l; + output = select_uns_int_handler(field, ap); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_wchar_t.c b/libft/srcs/ft_printf_tools_wchar_t.c new file mode 100644 index 0000000..d48cfc7 --- /dev/null +++ b/libft/srcs/ft_printf_tools_wchar_t.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_wchar_t.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/18 18:10:11 by klebon #+# #+# */ +/* Updated: 2019/03/16 15:53:50 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_align_wchar(char *str, t_conv *field) +{ + int i; + int len; + + len = (int)ft_strlen(str); + len = (len) ? len : 1; + if (len < field->str_size) + { + if (field->fl_minus == 1) + { + i = 1; + while (str[i]) + ++i; + while (i < field->str_size) + str[i++] = ' '; + } + else + { + i = 0; + ft_memmove(str + (field->str_size - len), str, len); + while (i < field->str_size - len) + str[i++] = (field->fl_zero) ? '0' : ' '; + } + } +} + +char *handler_2oct_char(wint_t c, t_conv *field) +{ + char *output; + + field->str_size = (field->fl_witdth > 2) ? field->fl_witdth : 2; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + output[0] = (c >> 6) + 0xC0; + output[1] = (c & 0x3F) + 0x80; + ft_align_wchar(output, field); + return (output); +} + +char *handler_3oct_char(wint_t c, t_conv *field) +{ + char *output; + + field->str_size = (field->fl_witdth > 3) ? field->fl_witdth : 3; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + output[0] = (c >> 12) + 0xE0; + output[1] = ((c >> 6) & 0x3F) + 0x80; + output[2] = (c & 0x3F) + 0x80; + ft_align_wchar(output, field); + return (output); +} + +char *handler_4oct_char(wint_t c, t_conv *field) +{ + char *output; + + field->str_size = (field->fl_witdth > 4) ? field->fl_witdth : 4; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + output[0] = (c >> 18) + 0xF0; + output[1] = ((c >> 12) & 0x3F) + 0x80; + output[2] = ((c >> 6) & 0x3F) + 0x80; + output[3] = (c & 0x3F) + 0x80; + ft_align_wchar(output, field); + return (output); +} + +char *handle_output_wchar(t_conv *field, va_list ap) +{ + char *output; + wint_t c; + + c = (wint_t)va_arg(ap, wint_t); + if (c < 0 || (MB_CUR_MAX == 1 && c > 0xFF) || (c >= 0xD800 && c <= 0xDFFF)) + return (NULL); + else if (c <= 0x7F || (MB_CUR_MAX == 1 && c <= 0xFF)) + { + field->str_size = (field->fl_witdth > 1) ? field->fl_witdth : 1; + if (!(output = ft_strnew(field->str_size))) + return (NULL); + output[0] = (char)c; + ft_align_wchar(output, field); + } + else if (c <= 0x7FF) + output = handler_2oct_char(c, field); + else if (c <= 0xFFFF) + output = handler_3oct_char(c, field); + else if (c <= 0x10FFFF) + output = handler_4oct_char(c, field); + else + return (NULL); + return (output); +} diff --git a/libft/srcs/ft_printf_tools_wstr.c b/libft/srcs/ft_printf_tools_wstr.c new file mode 100644 index 0000000..762dc88 --- /dev/null +++ b/libft/srcs/ft_printf_tools_wstr.c @@ -0,0 +1,89 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools_wstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: klebon +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/23 19:48:06 by klebon #+# #+# */ +/* Updated: 2019/03/07 22:25:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void handler_2oct_wstr(wint_t c, char *output, int *i) +{ + output[(*i)++] = (c >> 6) + 0xC0; + output[(*i)++] = (c & 0x3F) + 0x80; +} + +void handler_3oct_wstr(wint_t c, char *output, int *i) +{ + output[(*i)++] = (c >> 12) + 0xE0; + output[(*i)++] = ((c >> 6) & 0x3F) + 0x80; + output[(*i)++] = (c & 0x3F) + 0x80; +} + +void handler_4oct_wstr(wint_t c, char *output, int *i) +{ + output[(*i)++] = (c >> 18) + 0xF0; + output[(*i)++] = ((c >> 12) & 0x3F) + 0x80; + output[(*i)++] = ((c >> 6) & 0x3F) + 0x80; + output[(*i)++] = (c & 0x3F) + 0x80; +} + +void convert_wstr_to_str(const wint_t *str, char *output, t_conv *field) +{ + int i; + int j; + int tmp; + + i = 0; + j = 0; + while (str[i] && j <= field->fl_prec) + { + tmp = j; + if (j + 1 <= field->fl_prec + && (str[i] <= 0x7F || (MB_CUR_MAX == 1 && str[i] <= 0xFF))) + output[j++] = (char)str[i]; + else if (j + 2 <= field->fl_prec && str[i] <= 0x7FF) + handler_2oct_wstr(str[i], output, &j); + else if (j + 3 <= field->fl_prec && str[i] <= 0xFFFF) + handler_3oct_wstr(str[i], output, &j); + else if (j + 4 <= field->fl_prec) + handler_4oct_wstr(str[i], output, &j); + ++i; + if (tmp == j) + break ; + } +} + +char *handle_output_wstr(t_conv *field, va_list ap) +{ + char *output; + const wint_t *str; + + str = (wint_t *)va_arg(ap, const wint_t *); + if (str == NULL) + str = L"(null)"; + if (field->fl_prec != -1) + { + if (set_prec_size_wstr(str, field) == 0) + return (NULL); + } + else + { + if ((field->str_size = ft_wstrlen(str)) == -1) + return (NULL); + } + if (field->fl_prec == -1) + field->fl_prec = field->str_size; + if (field->fl_witdth > field->str_size) + field->str_size += (field->fl_witdth - field->str_size); + if (!(output = ft_strnew(field->str_size))) + return (NULL); + convert_wstr_to_str(str, output, field); + ft_align_wstr(output, field); + return (output); +} diff --git a/libft/srcs/ft_putchar.c b/libft/srcs/ft_putchar.c new file mode 100644 index 0000000..0290a79 --- /dev/null +++ b/libft/srcs/ft_putchar.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 19:03:57 by tmaze #+# #+# */ +/* Updated: 2018/04/07 23:02:29 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/libft/srcs/ft_putchar_fd.c b/libft/srcs/ft_putchar_fd.c new file mode 100644 index 0000000..8bceeb9 --- /dev/null +++ b/libft/srcs/ft_putchar_fd.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 22:43:23 by tmaze #+# #+# */ +/* Updated: 2018/05/01 13:37:42 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + write(fd, &c, 1); +} diff --git a/libft/srcs/ft_putendl.c b/libft/srcs/ft_putendl.c new file mode 100644 index 0000000..4d0be4c --- /dev/null +++ b/libft/srcs/ft_putendl.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 22:37:44 by tmaze #+# #+# */ +/* Updated: 2019/03/19 14:50:20 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl(char const *s) +{ + if (s != NULL) + ft_putstr(s); + ft_putchar('\n'); +} diff --git a/libft/srcs/ft_putendl2.c b/libft/srcs/ft_putendl2.c new file mode 100644 index 0000000..af66e22 --- /dev/null +++ b/libft/srcs/ft_putendl2.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/19 15:14:49 by tmaze #+# #+# */ +/* Updated: 2019/03/20 17:00:52 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_putendl2(char const *s) +{ + char *str; + + if (s != NULL && (str = ft_strnew(ft_strlen(s) + 1)) != NULL) + { + ft_strcpy(str, s); + ft_strcat(str, "\n"); + ft_putstr(str); + ft_strdel(&str); + return (0); + } + return (1); +} diff --git a/libft/srcs/ft_putendl_fd.c b/libft/srcs/ft_putendl_fd.c new file mode 100644 index 0000000..365dcbd --- /dev/null +++ b/libft/srcs/ft_putendl_fd.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 13:02:13 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:27:49 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl_fd(char const *s, int fd) +{ + if (s != NULL && fd >= 0) + { + ft_putstr_fd(s, fd); + ft_putchar_fd('\n', fd); + } +} diff --git a/libft/srcs/ft_putendl_fd2.c b/libft/srcs/ft_putendl_fd2.c new file mode 100644 index 0000000..b9f4635 --- /dev/null +++ b/libft/srcs/ft_putendl_fd2.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/20 16:44:51 by tmaze #+# #+# */ +/* Updated: 2019/03/20 17:00:16 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_putendl_fd2(char const *s, int fd) +{ + char *str; + + if (s != NULL && (str = ft_strnew(ft_strlen(s) + 1)) != NULL) + { + ft_strcpy(str, s); + ft_strcat(str, "\n"); + ft_putstr_fd(str, fd); + ft_strdel(&str); + return (0); + } + return (1); +} diff --git a/libft/srcs/ft_putnbr.c b/libft/srcs/ft_putnbr.c new file mode 100644 index 0000000..8233431 --- /dev/null +++ b/libft/srcs/ft_putnbr.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 12:52:53 by tmaze #+# #+# */ +/* Updated: 2018/04/08 15:33:50 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr(int n) +{ + ft_putnbr_fd(n, 1); +} diff --git a/libft/srcs/ft_putnbr_fd.c b/libft/srcs/ft_putnbr_fd.c new file mode 100644 index 0000000..3a4e8d1 --- /dev/null +++ b/libft/srcs/ft_putnbr_fd.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 13:05:24 by tmaze #+# #+# */ +/* Updated: 2018/05/05 16:50:14 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr_fd(int n, int fd) +{ + unsigned long mult; + int nb_nbr; + unsigned long nbr; + + mult = 10; + nbr = ft_abs(n); + while (mult <= nbr) + mult *= 10; + if (n < 0) + write(fd, "-", 1); + while (mult > 1) + { + nb_nbr = '0' + ((nbr % mult) / (mult / 10)); + write(fd, &nb_nbr, 1); + mult /= 10; + } +} diff --git a/libft/srcs/ft_putnbrpad.c b/libft/srcs/ft_putnbrpad.c new file mode 100644 index 0000000..efe5348 --- /dev/null +++ b/libft/srcs/ft_putnbrpad.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbrpad.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/07/31 13:51:17 by tmaze #+# #+# */ +/* Updated: 2018/07/31 14:04:43 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbrpad(int nbr, size_t size, char pad, char align) +{ + if (align == 'd') + while (size-- != 0) + ft_putchar(pad); + ft_putnbr(nbr); + if (align == 'g') + while (size-- != 0) + ft_putchar(pad); +} diff --git a/libft/srcs/ft_putstr.c b/libft/srcs/ft_putstr.c new file mode 100644 index 0000000..3d7077e --- /dev/null +++ b/libft/srcs/ft_putstr.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 19:13:17 by tmaze #+# #+# */ +/* Updated: 2018/04/12 11:23:29 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr(char const *s) +{ + if (s != NULL) + write(1, s, ft_strlen(s)); +} diff --git a/libft/srcs/ft_putstr_fd.c b/libft/srcs/ft_putstr_fd.c new file mode 100644 index 0000000..89d46e0 --- /dev/null +++ b/libft/srcs/ft_putstr_fd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 23:06:30 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:26:43 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr_fd(char const *s, int fd) +{ + if (s != NULL && fd >= 0) + write(fd, s, ft_strlen(s)); +} diff --git a/libft/srcs/ft_putstrn.c b/libft/srcs/ft_putstrn.c new file mode 100644 index 0000000..8cdab05 --- /dev/null +++ b/libft/srcs/ft_putstrn.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstrn.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/07/25 16:20:52 by tmaze #+# #+# */ +/* Updated: 2018/07/25 16:24:41 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstrn(char const *s, size_t nb) +{ + size_t strlen; + + if (s != NULL) + { + strlen = ft_strlen(s); + write(1, s, (nb < strlen) ? nb : strlen); + } +} diff --git a/libft/srcs/ft_putstrpad.c b/libft/srcs/ft_putstrpad.c new file mode 100644 index 0000000..1f82896 --- /dev/null +++ b/libft/srcs/ft_putstrpad.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstrpad.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/07/31 13:36:56 by tmaze #+# #+# */ +/* Updated: 2018/07/31 14:05:41 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstrpad(char *str, size_t size, char pad, char align) +{ + if (align == 'd') + while (size-- != 0) + ft_putchar(pad); + ft_putstr(str); + if (align == 'g') + while (size-- != 0) + ft_putchar(pad); +} diff --git a/libft/srcs/ft_realpath.c b/libft/srcs/ft_realpath.c new file mode 100644 index 0000000..8411ca3 --- /dev/null +++ b/libft/srcs/ft_realpath.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_realpath.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/01/27 14:42:35 by tmaze #+# #+# */ +/* Updated: 2019/01/29 18:16:22 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_tabtopath(char **tab_path) +{ + size_t total_size; + size_t i; + char *ret; + + i = 0; + total_size = 0; + while (tab_path[i]) + total_size += ft_strlen(tab_path[i++]); + total_size = (total_size == 0) ? 1 : total_size; + if ((ret = ft_strnew(total_size + i)) == NULL) + return (NULL); + i = 0; + ft_strcat(ret, "/"); + while (tab_path[i]) + { + if (i > 0) + ft_strcat(ret, "/"); + ft_strcat(ret, tab_path[i++]); + } + return (ret); +} + +void ft_reducepath(char ***tab) +{ + size_t i; + size_t j; + int strcmp; + + i = 0; + while ((*tab)[i]) + { + if ((strcmp = ft_strcmp((*tab)[i], "..")) == 0 + || ft_strcmp((*tab)[i], ".") == 0) + { + ft_strdel(&((*tab)[i])); + if ((j = i) == i && strcmp == 0 && i != 0) + ft_strdel(&((*tab)[i - 1])); + while ((*tab)[++j]) + (*tab)[j - ((strcmp == 0 && i != 0) ? 2 : 1)] = (*tab)[j]; + if (strcmp == 0 && i != 0) + (*tab)[j - 2] = NULL; + (*tab)[j - 1] = NULL; + if (strcmp == 0 && i != 0) + i--; + } + else + i++; + } +} + +char *ft_realpath(char *r_path, char **a_path) +{ + char **tab_path; + + if ((tab_path = ft_strsplit(r_path, '/')) == NULL) + return (NULL); + ft_reducepath(&tab_path); + *a_path = ft_tabtopath(tab_path); + ft_del_words_tables(&tab_path); + return (*a_path); +} diff --git a/libft/srcs/ft_round.c b/libft/srcs/ft_round.c new file mode 100644 index 0000000..4d9fcf1 --- /dev/null +++ b/libft/srcs/ft_round.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_round.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/10/24 13:37:41 by tmaze #+# #+# */ +/* Updated: 2018/10/24 13:37:52 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_round(float x, float ind) +{ + if ((x - (int)x) > ind) + return ((int)x + 1); + return ((int)x); +} diff --git a/libft/srcs/ft_sort_params.c b/libft/srcs/ft_sort_params.c new file mode 100644 index 0000000..7231eed --- /dev/null +++ b/libft/srcs/ft_sort_params.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sort_params.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 18:28:43 by tmaze #+# #+# */ +/* Updated: 2018/04/09 19:04:57 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_sort_params(int ac, char **av) +{ + int i; + int j; + char *tmp; + + i = 1; + while (++i < ac && (j = i)) + { + tmp = av[i]; + while (j > 1 && ft_strcmp(av[j - 1], tmp) > 0) + { + av[j] = av[j - 1]; + j--; + } + av[j] = tmp; + } +} diff --git a/libft/srcs/ft_str_is_alpha.c b/libft/srcs/ft_str_is_alpha.c new file mode 100644 index 0000000..324a1fd --- /dev/null +++ b/libft/srcs/ft_str_is_alpha.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_alpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:29:18 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:33:32 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_str_is_alpha(char *str) +{ + int i; + + i = 0; + while (str[i]) + if (!ft_isalpha(str[i++])) + return (0); + return (1); +} diff --git a/libft/srcs/ft_str_is_lowercase.c b/libft/srcs/ft_str_is_lowercase.c new file mode 100644 index 0000000..1ca9116 --- /dev/null +++ b/libft/srcs/ft_str_is_lowercase.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_lowercase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:29:18 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:47:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_str_is_lowercase(char *str) +{ + int i; + + i = 0; + while (str[i]) + if (!ft_islower(str[i++])) + return (0); + return (1); +} diff --git a/libft/srcs/ft_str_is_numeric.c b/libft/srcs/ft_str_is_numeric.c new file mode 100644 index 0000000..28e4f62 --- /dev/null +++ b/libft/srcs/ft_str_is_numeric.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_numeric.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:29:18 by tmaze #+# #+# */ +/* Updated: 2018/04/09 10:59:32 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_str_is_numeric(char *str) +{ + int i; + + i = 0; + while (str[i]) + if (!ft_isdigit(str[i++])) + return (0); + return (1); +} diff --git a/libft/srcs/ft_str_is_printable.c b/libft/srcs/ft_str_is_printable.c new file mode 100644 index 0000000..f19b0a5 --- /dev/null +++ b/libft/srcs/ft_str_is_printable.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_printable.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:29:18 by tmaze #+# #+# */ +/* Updated: 2018/04/09 11:11:56 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_str_is_printable(char *str) +{ + int i; + + i = 0; + while (str[i]) + if (!ft_isprint(str[i++])) + return (0); + return (1); +} diff --git a/libft/srcs/ft_str_is_uppercase.c b/libft/srcs/ft_str_is_uppercase.c new file mode 100644 index 0000000..8180ef5 --- /dev/null +++ b/libft/srcs/ft_str_is_uppercase.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_uppercase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 10:29:18 by tmaze #+# #+# */ +/* Updated: 2018/04/09 11:01:45 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_str_is_uppercase(char *str) +{ + int i; + + i = 0; + while (str[i]) + if (!ft_isupper(str[i++])) + return (0); + return (1); +} diff --git a/libft/srcs/ft_strcapitalize.c b/libft/srcs/ft_strcapitalize.c new file mode 100644 index 0000000..765077e --- /dev/null +++ b/libft/srcs/ft_strcapitalize.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcapitalize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 11:16:16 by tmaze #+# #+# */ +/* Updated: 2018/04/09 11:31:18 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcapitalize(char *str) +{ + unsigned int i; + + i = 0; + while (str[i]) + { + if (i == 0 || !ft_isalnum(str[i - 1])) + str[i] = ft_toupper(str[i]); + else if (ft_isalnum(str[i - 1])) + str[i] = ft_tolower(str[i]); + i++; + } + return (str); +} diff --git a/libft/srcs/ft_strcat.c b/libft/srcs/ft_strcat.c new file mode 100644 index 0000000..a4f85c9 --- /dev/null +++ b/libft/srcs/ft_strcat.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 17:56:56 by tmaze #+# #+# */ +/* Updated: 2018/04/04 18:21:46 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcat(char *dest, const char *src) +{ + int dest_len; + + dest_len = ft_strlen(dest); + ft_strcpy(&dest[dest_len], src); + return (dest); +} diff --git a/libft/srcs/ft_strchr.c b/libft/srcs/ft_strchr.c new file mode 100644 index 0000000..0eae992 --- /dev/null +++ b/libft/srcs/ft_strchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 18:54:17 by tmaze #+# #+# */ +/* Updated: 2018/05/16 15:09:08 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strchr(const char *s, int c) +{ + int i; + char *tmp; + + if (s != NULL) + { + i = -1; + tmp = (char*)s; + while (++i == 0 || tmp[i - 1]) + if (tmp[i] == c) + return (&tmp[i]); + } + return (NULL); +} diff --git a/libft/srcs/ft_strclr.c b/libft/srcs/ft_strclr.c new file mode 100644 index 0000000..61297fa --- /dev/null +++ b/libft/srcs/ft_strclr.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strclr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 23:27:33 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:04:24 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_strclr(char *s) +{ + int i; + + i = 0; + if (s != NULL) + while (s[i]) + s[i++] = '\0'; +} diff --git a/libft/srcs/ft_strcmp.c b/libft/srcs/ft_strcmp.c new file mode 100644 index 0000000..76cbb5a --- /dev/null +++ b/libft/srcs/ft_strcmp.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/03 15:38:27 by tmaze #+# #+# */ +/* Updated: 2018/04/08 15:30:24 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strcmp(const char *s1, const char *s2) +{ + int i; + int diff; + + i = 1; + diff = (unsigned char)s1[0] - (unsigned char)s2[0]; + while (diff == 0 && s1[i - 1] && s2[i - 1]) + { + diff = (unsigned char)s1[i] - (unsigned char)s2[i]; + i++; + } + return (diff); +} diff --git a/libft/srcs/ft_strcpy.c b/libft/srcs/ft_strcpy.c new file mode 100644 index 0000000..6ffa032 --- /dev/null +++ b/libft/srcs/ft_strcpy.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 16:15:42 by tmaze #+# #+# */ +/* Updated: 2018/04/04 19:19:41 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcpy(char *dest, const char *src) +{ + int i; + + i = -1; + while (++i == 0 || src[i - 1]) + dest[i] = src[i]; + return (dest); +} diff --git a/libft/srcs/ft_strdel.c b/libft/srcs/ft_strdel.c new file mode 100644 index 0000000..5cac214 --- /dev/null +++ b/libft/srcs/ft_strdel.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 18:59:40 by tmaze #+# #+# */ +/* Updated: 2018/04/06 19:14:01 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_strdel(char **as) +{ + ft_memdel((void**)as); +} diff --git a/libft/srcs/ft_strdup.c b/libft/srcs/ft_strdup.c new file mode 100644 index 0000000..11a2c48 --- /dev/null +++ b/libft/srcs/ft_strdup.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/03 16:33:35 by tmaze #+# #+# */ +/* Updated: 2018/04/09 09:52:08 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strdup(const char *s1) +{ + char *ret; + + if ((ret = ft_strnew(ft_strlen(s1))) != NULL) + ft_strcpy(ret, s1); + return (ret); +} diff --git a/libft/srcs/ft_strequ.c b/libft/srcs/ft_strequ.c new file mode 100644 index 0000000..bb42a96 --- /dev/null +++ b/libft/srcs/ft_strequ.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strequ.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 15:10:56 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:09:20 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strequ(char const *s1, char const *s2) +{ + return ((s1 != NULL && s2 != NULL) ? ft_strcmp(s1, s2) == 0 : 0); +} diff --git a/libft/srcs/ft_striter.c b/libft/srcs/ft_striter.c new file mode 100644 index 0000000..74e24a2 --- /dev/null +++ b/libft/srcs/ft_striter.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 11:17:26 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:05:25 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striter(char *s, void (*f)(char*)) +{ + unsigned int i; + + i = 0; + if (s != NULL && f != NULL) + while (s[i]) + (*f)(&s[i++]); +} diff --git a/libft/srcs/ft_striteri.c b/libft/srcs/ft_striteri.c new file mode 100644 index 0000000..b3b6db3 --- /dev/null +++ b/libft/srcs/ft_striteri.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 11:36:12 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:06:17 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striteri(char *s, void (*f)(unsigned int, char*)) +{ + unsigned int i; + + i = -1; + if (s != NULL && f != NULL) + while (s[++i]) + (*f)(i, &s[i]); +} diff --git a/libft/srcs/ft_strjoin.c b/libft/srcs/ft_strjoin.c new file mode 100644 index 0000000..c497930 --- /dev/null +++ b/libft/srcs/ft_strjoin.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 16:30:47 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:39:59 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *ret; + + ret = NULL; + if (s1 != NULL && s2 != NULL + && (ret = ft_strnew(ft_strlen(s1) + ft_strlen(s2))) != NULL) + { + ft_strcpy(ret, s1); + ft_strcat(ret, s2); + } + return (ret); +} diff --git a/libft/srcs/ft_strlcat.c b/libft/srcs/ft_strlcat.c new file mode 100644 index 0000000..d83c5fc --- /dev/null +++ b/libft/srcs/ft_strlcat.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/08 14:32:30 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:45:42 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcat(char *dest, const char *src, size_t size) +{ + int dest_len; + + dest_len = ft_strlen(dest); + if ((size_t)dest_len < size) + { + ft_strncpy(&dest[dest_len], src, size - dest_len); + dest[size - 1] = '\0'; + } + return (((size_t)dest_len < size) ? (size_t)(dest_len + ft_strlen(src)) + : size + (size_t)ft_strlen(src)); +} diff --git a/libft/srcs/ft_strlcpy.c b/libft/srcs/ft_strlcpy.c new file mode 100644 index 0000000..e6edb7a --- /dev/null +++ b/libft/srcs/ft_strlcpy.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 11:55:11 by tmaze #+# #+# */ +/* Updated: 2018/04/27 18:04:14 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcpy(char *dst, const char *src, size_t size) +{ + size_t src_len; + + if (dst != NULL && src != NULL) + { + src_len = (size_t)ft_strlen(src); + dst = ft_strncpy(dst, src, (src_len > size) ? size : src_len); + dst[(src_len > size) ? size - 1 : src_len] = '\0'; + } + return ((src != NULL) ? ft_strlen(src) : 0); +} diff --git a/libft/srcs/ft_strlen.c b/libft/srcs/ft_strlen.c new file mode 100644 index 0000000..3b397c3 --- /dev/null +++ b/libft/srcs/ft_strlen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/03 15:33:37 by tmaze #+# #+# */ +/* Updated: 2018/05/16 15:33:46 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + int i; + + i = 0; + while (s != NULL && s[i]) + i++; + return (i); +} diff --git a/libft/srcs/ft_strlowcase.c b/libft/srcs/ft_strlowcase.c new file mode 100644 index 0000000..080d2bf --- /dev/null +++ b/libft/srcs/ft_strlowcase.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlowcase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 17:58:10 by tmaze #+# #+# */ +/* Updated: 2018/04/09 18:06:26 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void ft_lowcase(char *c) +{ + *c = ft_tolower(*c); +} + +char *ft_strlowcase(char *s) +{ + ft_striter(s, &ft_lowcase); + return (s); +} diff --git a/libft/srcs/ft_strmap.c b/libft/srcs/ft_strmap.c new file mode 100644 index 0000000..8b17088 --- /dev/null +++ b/libft/srcs/ft_strmap.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 14:57:22 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:18:41 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmap(char const *s, char (*f)(char)) +{ + char *ret; + size_t i; + size_t s_len; + + i = -1; + s_len = 0; + ret = NULL; + if (s != NULL && f != NULL) + { + s_len = ft_strlen(s); + if ((ret = ft_strnew(s_len)) != NULL) + while (++i < s_len) + ret[i] = (*f)(s[i]); + } + return (ret); +} diff --git a/libft/srcs/ft_strmapi.c b/libft/srcs/ft_strmapi.c new file mode 100644 index 0000000..69056ca --- /dev/null +++ b/libft/srcs/ft_strmapi.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmapi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 15:00:23 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:19:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + char *ret; + size_t i; + size_t s_len; + + i = -1; + s_len = 0; + ret = NULL; + if (s != NULL && f != NULL) + { + s_len = ft_strlen(s); + if ((ret = ft_strnew(s_len)) != NULL) + while (++i < s_len) + ret[i] = (*f)(i, s[i]); + } + return (ret); +} diff --git a/libft/srcs/ft_strncat.c b/libft/srcs/ft_strncat.c new file mode 100644 index 0000000..fd23bc4 --- /dev/null +++ b/libft/srcs/ft_strncat.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 18:29:06 by tmaze #+# #+# */ +/* Updated: 2018/04/10 19:13:54 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strncat(char *dest, const char *src, size_t n) +{ + int dest_len; + size_t i; + + dest_len = ft_strlen(dest); + i = 0; + while (i < n && src[i]) + { + dest[dest_len + i] = src[i]; + i++; + } + dest[dest_len + i] = '\0'; + return (dest); +} diff --git a/libft/srcs/ft_strnchr.c b/libft/srcs/ft_strnchr.c new file mode 100644 index 0000000..6fc56c5 --- /dev/null +++ b/libft/srcs/ft_strnchr.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/16 11:41:02 by tmaze #+# #+# */ +/* Updated: 2018/10/08 15:21:15 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnchr(const char *s, int c, int n) +{ + int i; + char *tmp; + + i = -1; + tmp = (char*)s; + while ((++i == 0 || tmp[i - 1]) && n > 0 && i < n) + if (tmp[i] == c) + return (&tmp[i]); + return (NULL); +} diff --git a/libft/srcs/ft_strncmp.c b/libft/srcs/ft_strncmp.c new file mode 100644 index 0000000..9417e2a --- /dev/null +++ b/libft/srcs/ft_strncmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 13:04:21 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:50:07 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, size_t n) +{ + int i; + int diff; + + i = 1; + diff = 0; + if (n > 0) + diff = (unsigned char)s1[0] - (unsigned char)s2[0]; + while ((unsigned int)i < n && diff == 0 && (unsigned char)s1[i - 1] + && (unsigned char)s2[i - 1]) + { + diff = (unsigned char)s1[i] - (unsigned char)s2[i]; + i++; + } + return (diff); +} diff --git a/libft/srcs/ft_strncpy.c b/libft/srcs/ft_strncpy.c new file mode 100644 index 0000000..41d050d --- /dev/null +++ b/libft/srcs/ft_strncpy.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 16:55:29 by tmaze #+# #+# */ +/* Updated: 2019/01/10 17:37:08 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strncpy(char *dest, const char *src, size_t n) +{ + unsigned int i; + + i = -1; + while (++i < n && (i == 0 || src[i - 1])) + dest[i] = src[i]; + while (i < n) + dest[i++] = '\0'; + return (dest); +} diff --git a/libft/srcs/ft_strndup.c b/libft/srcs/ft_strndup.c new file mode 100644 index 0000000..f79591f --- /dev/null +++ b/libft/srcs/ft_strndup.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strndup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/23 15:44:36 by tmaze #+# #+# */ +/* Updated: 2018/04/23 15:45:12 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strndup(const char *s1, size_t n) +{ + char *ret; + + if ((ret = ft_strnew(n)) != NULL) + ft_strncpy(ret, s1, n); + return (ret); +} diff --git a/libft/srcs/ft_strnequ.c b/libft/srcs/ft_strnequ.c new file mode 100644 index 0000000..d00b8b6 --- /dev/null +++ b/libft/srcs/ft_strnequ.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnequ.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 15:24:01 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:09:47 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strnequ(char const *s1, char const *s2, size_t n) +{ + return ((s1 != NULL && s2 != NULL) ? ft_strncmp(s1, s2, n) == 0 : 0); +} diff --git a/libft/srcs/ft_strnew.c b/libft/srcs/ft_strnew.c new file mode 100644 index 0000000..fe6de11 --- /dev/null +++ b/libft/srcs/ft_strnew.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/06 18:33:28 by tmaze #+# #+# */ +/* Updated: 2018/04/06 18:43:32 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnew(size_t size) +{ + return ((char*)ft_memalloc(sizeof(char) * (size + 1))); +} diff --git a/libft/srcs/ft_strnstr.c b/libft/srcs/ft_strnstr.c new file mode 100644 index 0000000..4f2ab5f --- /dev/null +++ b/libft/srcs/ft_strnstr.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 11:35:03 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:52:25 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnstr(const char *haystack, const char *needle, size_t len) +{ + int i; + int j; + char *tmp; + + i = -1; + tmp = (char*)haystack; + if (ft_strequ(needle, "")) + return (tmp); + while ((++i == 0 || tmp[i - 1]) && i < (int)len) + if (tmp[i] == needle[0] && (j = 1)) + { + while (tmp[i + j] == needle[j] && needle[j] && tmp[i + j] + && (i + j) < (int)len) + j++; + if (needle[j] == '\0') + return (&tmp[i]); + } + return (NULL); +} diff --git a/libft/srcs/ft_strrchr.c b/libft/srcs/ft_strrchr.c new file mode 100644 index 0000000..8d357ae --- /dev/null +++ b/libft/srcs/ft_strrchr.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 10:40:13 by tmaze #+# #+# */ +/* Updated: 2018/04/05 11:05:31 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrchr(const char *s, int c) +{ + int i; + char *tmp; + char *ret; + + i = -1; + ret = NULL; + tmp = (char*)s; + while (++i == 0 || tmp[i - 1]) + if (tmp[i] == c) + ret = &tmp[i]; + return (ret); +} diff --git a/libft/srcs/ft_strrnchr.c b/libft/srcs/ft_strrnchr.c new file mode 100644 index 0000000..78bb4b6 --- /dev/null +++ b/libft/srcs/ft_strrnchr.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrnchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/05/16 12:05:03 by tmaze #+# #+# */ +/* Updated: 2018/05/16 12:32:26 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrnchr(const char *s, int c, int n) +{ + int s_len; + char *tmp; + + s_len = ft_strlen(s); + tmp = (char*)s; + n = (s_len < n) ? s_len : n; + s_len = s_len - n; + while (n >= 0) + if (tmp[s_len + n--] == c) + return (&tmp[s_len + n + 1]); + return (NULL); +} diff --git a/libft/srcs/ft_strsplit.c b/libft/srcs/ft_strsplit.c new file mode 100644 index 0000000..c4a9ce2 --- /dev/null +++ b/libft/srcs/ft_strsplit.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsplit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 17:54:29 by tmaze #+# #+# */ +/* Updated: 2018/04/15 15:55:03 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int count_words(char const *s, char c) +{ + int i; + int nb_words; + int in_word; + + in_word = 0; + nb_words = 0; + i = -1; + while (++i == 0 || s[i - 1]) + if (!in_word && s[i] != c && s[i] != '\0') + { + in_word = 1; + nb_words++; + } + else if (in_word && (s[i] == c || s[i] == '\0')) + in_word = 0; + return (nb_words); +} + +static char **get_table(char const *s, char c, char **tab) +{ + int i; + int nb_words; + int in_word; + size_t start; + + nb_words = 0; + in_word = 0; + i = -1; + while (++i == 0 || s[i - 1]) + if (!in_word && s[i] != c && (in_word = 1)) + start = i; + else if (in_word && (s[i] == c || s[i] == '\0')) + { + if ((tab[nb_words] = ft_strsub(s, start, i - start)) == NULL) + { + while (--nb_words >= 0) + ft_strdel(&tab[nb_words]); + free(tab); + return (NULL); + } + nb_words++; + in_word = 0; + } + return (tab); +} + +char **ft_strsplit(char const *s, char c) +{ + int nb_words; + char **tab; + + nb_words = 0; + tab = NULL; + if (s != NULL) + { + nb_words = count_words(s, c); + if ((tab = (char**)malloc(sizeof(char**) * (nb_words + 1))) == NULL) + return (NULL); + tab[nb_words] = NULL; + return (get_table(s, c, tab)); + } + else + return (NULL); +} diff --git a/libft/srcs/ft_strsplitwhitespace.c b/libft/srcs/ft_strsplitwhitespace.c new file mode 100644 index 0000000..6c6b4e3 --- /dev/null +++ b/libft/srcs/ft_strsplitwhitespace.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsplitwhitespace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/25 16:25:18 by tmaze #+# #+# */ +/* Updated: 2019/03/09 15:13:49 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int count_words_ws(char const *s) +{ + int i; + int nb_words; + int in_word; + + in_word = 0; + nb_words = 0; + i = -1; + while (++i == 0 || s[i - 1]) + if (!in_word && !ft_iswhitespace(s[i]) && s[i] != '\0') + { + in_word = 1; + nb_words++; + } + else if (in_word && (ft_iswhitespace(s[i]) || s[i] == '\0')) + in_word = 0; + return (nb_words); +} + +static char **get_table_ws(char const *s, char **tab) +{ + int i; + int nb_words; + int in_word; + size_t start; + + nb_words = 0; + in_word = 0; + i = -1; + while (++i == 0 || s[i - 1]) + if (!in_word && !ft_iswhitespace(s[i]) && (in_word = 1)) + start = i; + else if (in_word && (ft_iswhitespace(s[i]) || s[i] == '\0')) + { + if ((tab[nb_words] = ft_strsub(s, start, i - start)) == NULL) + { + while (--nb_words >= 0) + ft_strdel(&tab[nb_words]); + free(tab); + return (NULL); + } + nb_words++; + in_word = 0; + } + return (tab); +} + +char **ft_strsplitwhitespace(char *s) +{ + int nb_words; + char **tab; + + nb_words = 0; + tab = NULL; + if (s != NULL) + { + nb_words = count_words_ws(s); + if ((tab = (char**)malloc(sizeof(char*) * (nb_words + 1))) == NULL) + return (NULL); + tab[nb_words] = NULL; + return (get_table_ws(s, tab)); + } + else + return (NULL); +} diff --git a/libft/srcs/ft_strstr.c b/libft/srcs/ft_strstr.c new file mode 100644 index 0000000..a8ffd60 --- /dev/null +++ b/libft/srcs/ft_strstr.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/05 10:54:41 by tmaze #+# #+# */ +/* Updated: 2018/04/08 15:25:55 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strstr(const char *haystack, const char *needle) +{ + int i; + int j; + char *tmp; + + i = -1; + tmp = (char*)haystack; + if (ft_strequ(needle, "")) + return (tmp); + while (++i == 0 || tmp[i - 1]) + if (tmp[i] == needle[0] && (j = 1)) + { + while (tmp[i + j] == needle[j] && needle[j] && tmp[i + j]) + j++; + if (needle[j] == '\0') + return (&tmp[i]); + } + return (NULL); +} diff --git a/libft/srcs/ft_strsub.c b/libft/srcs/ft_strsub.c new file mode 100644 index 0000000..3014509 --- /dev/null +++ b/libft/srcs/ft_strsub.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsub.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 15:35:49 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:16:44 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strsub(char const *s, unsigned int start, size_t len) +{ + char *ret; + + ret = NULL; + if (s != NULL && (ret = ft_strnew(len)) != NULL) + ret = ft_strncpy(ret, &s[start], len); + return (ret); +} diff --git a/libft/srcs/ft_strtrim.c b/libft/srcs/ft_strtrim.c new file mode 100644 index 0000000..fcfe047 --- /dev/null +++ b/libft/srcs/ft_strtrim.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/07 17:00:34 by tmaze #+# #+# */ +/* Updated: 2018/04/10 14:15:23 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strtrim(char const *s) +{ + int in_word; + size_t i; + size_t start; + size_t len; + + i = 0; + if (s != NULL) + { + while (s[i] == ' ' || s[i] == '\n' || s[i] == '\t') + i++; + start = i; + in_word = 1; + while (i == 0 || s[i - 1]) + { + if (in_word && (!ft_isprint(s[i]) || s[i] == ' ')) + { + len = i - start; + in_word = 0; + } + else if (!in_word && ft_isprint(s[i]) && s[i] != ' ') + in_word = 1; + i++; + } + } + return ((s != NULL) ? ft_strsub(s, start, len) : NULL); +} diff --git a/libft/srcs/ft_strupcase.c b/libft/srcs/ft_strupcase.c new file mode 100644 index 0000000..71bcd4e --- /dev/null +++ b/libft/srcs/ft_strupcase.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strupcase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/09 18:08:19 by tmaze #+# #+# */ +/* Updated: 2018/04/09 18:09:55 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void ft_upcase(char *c) +{ + *c = ft_toupper(*c); +} + +char *ft_strupcase(char *s) +{ + ft_striter(s, &ft_upcase); + return (s); +} diff --git a/libft/srcs/ft_tolower.c b/libft/srcs/ft_tolower.c new file mode 100644 index 0000000..312d28b --- /dev/null +++ b/libft/srcs/ft_tolower.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 14:24:13 by tmaze #+# #+# */ +/* Updated: 2018/04/04 14:24:34 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_tolower(int c) +{ + return ((c >= 'A' && c <= 'Z') ? c + 32 : c); +} diff --git a/libft/srcs/ft_toupper.c b/libft/srcs/ft_toupper.c new file mode 100644 index 0000000..f0d4494 --- /dev/null +++ b/libft/srcs/ft_toupper.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/04 14:06:21 by tmaze #+# #+# */ +/* Updated: 2018/04/04 14:20:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_toupper(int c) +{ + return ((c >= 'a' && c <= 'z') ? c - 32 : c); +} diff --git a/libft/srcs/get_next_line.c b/libft/srcs/get_next_line.c new file mode 100644 index 0000000..7a6c6b5 --- /dev/null +++ b/libft/srcs/get_next_line.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/04/24 18:08:15 by tmaze #+# #+# */ +/* Updated: 2019/03/16 15:53:27 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static char **get_buff(const int fd, t_list **lst) +{ + t_list *tmp; + + tmp = *lst; + while (tmp) + { + if (tmp->content_size == (size_t)fd) + return ((char**)&tmp->content); + tmp = tmp->next; + } + if ((tmp = ft_lstnew("\0", fd)) == NULL) + return (NULL); + ft_lstadd(lst, tmp); + return (get_buff(fd, lst)); +} + +static char *supercat(char **s1, char **s2) +{ + char *tmp; + + if ((tmp = ft_strjoin(*s1, *s2)) == NULL) + return (NULL); + ft_strdel(s1); + ft_strclr(*s2); + *s1 = tmp; + return (*s1); +} + +static int check_buff(char **buff, char **line) +{ + int ret; + + ret = 1; + if (buff != NULL && (*buff == NULL || ft_strlen(*buff) == 0)) + ret = 0; + else if ((*line = ft_strdup(*buff)) == NULL) + ret = -1; + ft_strclr(*buff); + return (ret); +} + +static int read_gnl(const int fd, char **buff, char **line) +{ + char *tmp; + int ret; + + if ((tmp = ft_strnew(BUFF_SIZE)) == NULL) + return (-1); + while (ft_strrnchr(*buff, '\n', BUFF_SIZE) == NULL + && (ret = read(fd, tmp, BUFF_SIZE)) > 0) + if (supercat(buff, &tmp) == NULL) + { + ft_strdel(&tmp); + return (-1); + } + ft_strdel(&tmp); + if (buff != NULL && *buff != NULL + && ft_strrnchr(*buff, '\n', BUFF_SIZE) != NULL) + return (get_next_line(fd, line)); + else + return (check_buff(buff, line)); +} + +int get_next_line(const int fd, char **line) +{ + static t_list *lst = NULL; + char **buff; + char *tmp; + + tmp = NULL; + if (fd < 0 || read(fd, tmp, 0) == -1 || line == NULL) + return (-1); + if ((buff = get_buff(fd, &lst)) == NULL) + return (-1); + tmp = ft_strchr(*buff, '\n'); + if (tmp != NULL) + { + *line = ft_strndup(*buff, tmp - *buff); + ft_memmove(*buff, &tmp[1], ft_strlen(&tmp[1]) + 1); + return (1); + } + return (read_gnl(fd, buff, line)); +} diff --git a/srcs/bfs.c b/srcs/bfs.c index caabb44..9825639 100644 --- a/srcs/bfs.c +++ b/srcs/bfs.c @@ -5,80 +5,65 @@ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/03/27 14:41:49 by tmaze #+# #+# */ -/* Updated: 2019/04/14 11:39:52 by tmaze ### ########.fr */ +/* Created: 2019/04/18 09:25:05 by tmaze #+# #+# */ +/* Updated: 2019/04/21 14:42:08 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "lem_in.h" -static void bfs_addtoqueue(t_bfs *tab, int node, int nb_nodes) -{ - int i; - - i = 0; - if (tab[node].visited == 0) - { - while (i < nb_nodes && tab[i].queue != -1 && tab[i].queue != node) - i++; - if (i < nb_nodes && tab[i].queue == -1) - tab[i].queue = node; - } -} - -static void bfs_checkadj(t_lmdata *data, t_bfs *tab, int i) -{ - t_ind *it; - char used; - - it = data->adj[tab[i].queue]; - used = 0; - while (it != NULL) - { - if (tab[it->index].visited == 0 && it->weight == 2) - used = 1; - if (used) - break ; - it = it->next; - } - it = data->adj[tab[i].queue]; - while (it != NULL) - { - if (tab[it->index].visited == 0 && ((!used && it->weight == 1) - || (used && it->weight == 2))) - bfs_addtoqueue(tab, it->index, data->nb_nodes); - if (tab[it->index].visited == 0 && ((!used && it->weight == 1) - || (used && it->weight == 2))) - tab[it->index].parent = tab[i].queue; - if (it->weight == 2) - break ; - it = it->next; - } -} - -static void bfs_init(t_bfs *tab, t_lmdata *data) +void bfs_init(t_lmdata *data, t_bfs *tab) { int i; i = 0; while (i < data->nb_nodes) { - tab[i].parent = -1; - tab[i].visited = 0; tab[i].queue = -1; + tab[i].visited = 0; + tab[i].parent = -1; i++; } } -void bfs(t_lmdata *data, t_bfs *tab, int start_ind, int end_ind) +void bfs_add_to_queue(t_lmdata *data, t_bfs *tab, int node, int i) +{ + int j; + + j = 0; + while (j < data->nb_nodes && tab[j].queue != -1 + && tab[j].queue != node) + j++; + if (j < data->nb_nodes && tab[j].queue == -1) + { + tab[j].queue = node; + tab[node].parent = tab[i].queue; + } +} + +void bfs(t_lmdata *data, t_bfs *tab, int s_ind, int e_ind) { int i; + int used; + t_ind *it; - ft_printf("New bfs\n"); - bfs_init(tab, data); - bfs_addtoqueue(tab, start_ind, data->nb_nodes); i = 0; - while (i < data->nb_nodes && tab[i].queue != -1 - && tab[end_ind].parent == -1 && (tab[tab[i].queue].visited = 1)) - bfs_checkadj(data, tab, i++); + bfs_init(data, tab); + tab[i].queue = s_ind; + while (i < data->nb_nodes && tab[i].queue != -1 && tab[e_ind].parent == -1) + { + tab[tab[i].queue].visited = 1; + used = (tab[tab[i].queue].old_visited + && get_node_path(data->adj[tab[tab[i].queue].parent] + , tab[i].queue)->weight == 1); + it = data->adj[tab[i].queue]; + while (it) + { + if (it->weight > 0 && !tab[it->index].visited + && (!used || (used && it->weight == 2))) + bfs_add_to_queue(data, tab, it->index, i); + it = it->next; + } + i++; + } } diff --git a/srcs/edmonds_karp.c b/srcs/edmonds_karp.c new file mode 100644 index 0000000..1d885ff --- /dev/null +++ b/srcs/edmonds_karp.c @@ -0,0 +1,125 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* edmonds_karp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/18 09:59:11 by tmaze #+# #+# */ +/* Updated: 2019/04/21 16:11:56 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lem_in.h" + +static void go_upstream(t_lmdata *data, t_ind **path, int s_ind, t_ind *it) +{ + int nb_nodes; + int j; + t_ind *it2; + + nb_nodes = 1; + j = it->index; + while (j != s_ind) + { + lst_indadd(path, j); + nb_nodes++; + it2 = data->adj[j]; + while (it2 && it2->weight != 2) + it2 = it2->next; + if (it2 && it2->weight == 2) + j = it2->index; + } + (*path)->weight = nb_nodes; +} + +static t_ind **resolve_paths(t_lmdata *data, int nb_paths, int s_ind + , int e_ind) +{ + t_ind **ret; + t_ind *it; + int i; + + if ((ret = (t_ind**)ft_memalloc(sizeof(t_ind*) * (nb_paths + 1))) != NULL) + { + i = 0; + it = data->adj[e_ind]; + while (it && i < nb_paths) + { + if (it->weight == 2) + { + lst_indadd(&(ret[i]), e_ind); + go_upstream(data, &(ret[i]), s_ind, it); + i++; + } + it = it->next; + } + } + return (ret); +} + +static void update_weights(t_lmdata *data, t_bfs *tab, int s_ind, int e_ind) +{ + int i; + t_ind *it; + + i = e_ind; + while (i != s_ind) + { + it = data->adj[i]; + while (it && it->index != tab[i].parent) + it = it->next; + if (it->index == tab[i].parent) + it->weight++; + it = data->adj[tab[i].parent]; + while (it && it->index != i) + it = it->next; + if (it) + it->weight--; + it = data->adj[i]; + while (it && it->weight == 1) + it = it->next; + tab[i].old_visited = (it && it->weight != 1); + i = tab[i].parent; + } +} + +static void cmp_scores(t_ind ***ret, int *scores) +{ + if (ret[0] == NULL || scores[1] < scores[0]) + { + if (ret[0] != NULL) + tablst_inddel(ret[0]); + ret[0] = ret[1]; + scores[0] = scores[1]; + } + else + tablst_inddel(ret[1]); +} + +t_ind **edmonds_karp(t_lmdata *data, int s_ind, int e_ind) +{ + t_bfs tab[data->nb_nodes]; + t_ind **ret[2]; + int nb_paths; + int scores[2]; + int i; + + ret[0] = NULL; + scores[0] = 0; + nb_paths = 0; + i = 0; + while (i < data->nb_nodes) + tab[i++].old_visited = 0; + bfs(data, tab, s_ind, e_ind); + while (tab[e_ind].parent != -1) + { + nb_paths++; + update_weights(data, tab, s_ind, e_ind); + ret[1] = resolve_paths(data, nb_paths, s_ind, e_ind); + scores[1] = get_score(data, ret[1], nb_paths); + cmp_scores(ret, scores); + bfs(data, tab, s_ind, e_ind); + } + return (ret[0]); +} diff --git a/srcs/lem_in.c b/srcs/lem_in.c index 9863927..a3a53f1 100644 --- a/srcs/lem_in.c +++ b/srcs/lem_in.c @@ -6,7 +6,7 @@ /* By: mndhlovu +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/25 06:31:05 by mndhlovu #+# #+# */ -/* Updated: 2019/04/14 12:22:28 by tmaze ### ########.fr */ +/* Updated: 2019/04/22 10:02:05 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,7 +67,7 @@ static int lem_in(t_syntax *synt, t_holder *holder, lm_clear_unv(holder); get_nb_paths_max(lmdata, get_node_role(lmdata, 's')->ind , get_node_role(lmdata, 'e')->ind); - if ((*ret = edmunds_karp(lmdata, get_node_role(lmdata, 's')->ind + if ((*ret = edmonds_karp(lmdata, get_node_role(lmdata, 's')->ind , get_node_role(lmdata, 'e')->ind)) == NULL) return (0); if (!push_ants(lmdata, *ret, get_nb_paths(*ret))) diff --git a/srcs/push_ants.c b/srcs/push_ants.c index 6534414..91b482b 100644 --- a/srcs/push_ants.c +++ b/srcs/push_ants.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/06 11:37:56 by tmaze #+# #+# */ -/* Updated: 2019/04/12 12:06:51 by tmaze ### ########.fr */ +/* Updated: 2019/04/21 16:14:45 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,8 +37,7 @@ static void clean_ants(t_ants **ants) } } -static void print_ants(t_lmdata *data, t_ants **ants, char *has_start - , t_ind **paths) +static void print_ants(t_lmdata *data, t_ants **ants, t_ind **paths) { t_ants *it; @@ -56,43 +55,36 @@ static void print_ants(t_lmdata *data, t_ants **ants, char *has_start ft_putchar(' '); else ft_putchar('\n'); - has_start[it->nb_path] = 0; it = it->next; } clean_ants(ants); } -static void init_ants(t_ants **ants, int *ant_c, char *has_start, int nb_paths) -{ - *ants = NULL; - ft_bzero(has_start, nb_paths); - *ant_c = 2; - has_start[0] = 1; -} - int push_ants(t_lmdata *data, t_ind **paths, int nb_paths) { t_ants *ants; - int i; int ant_c; - char has_start[nb_paths]; + int i; - init_ants(&ants, &ant_c, has_start, nb_paths); - if (add_ant(&ants, 1, 0, paths) == NULL) + ants = NULL; + i = 0; + ant_c = 2; + while (paths[i] && paths[i]->weight == 0) + i++; + if (add_ant(&ants, 1, i, paths) == NULL) return (0); - while ((ants || ant_c <= data->nbants) && (i = -1)) + while (ants || ant_c <= data->nbants) { while (++i < nb_paths) - if (ant_c <= data->nbants && !has_start[i]) + if (paths[i]->weight > 0) { - if (!add_ant(&ants, ant_c, i, paths)) + if (!add_ant(&ants, ant_c++, i, paths)) del_ants(&ants); if (!ants) return (0); - ant_c++; - has_start[i] = 1; } - print_ants(data, &ants, has_start, paths); + print_ants(data, &ants, paths); + i = -1; } return (1); } diff --git a/srcs/push_ants_utils.c b/srcs/push_ants_utils.c index a2684af..dd2a83d 100644 --- a/srcs/push_ants_utils.c +++ b/srcs/push_ants_utils.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/10 11:23:36 by tmaze #+# #+# */ -/* Updated: 2019/04/10 11:24:01 by tmaze ### ########.fr */ +/* Updated: 2019/04/18 19:04:49 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,6 +33,7 @@ t_ants *add_ant(t_ants **ants, int nb_ant, int nb_path, t_ind **paths) it = it->next; it->next = new; } + paths[nb_path]->weight--; } return (new); } diff --git a/srcs/score_utils.c b/srcs/score_utils.c new file mode 100644 index 0000000..bb5c945 --- /dev/null +++ b/srcs/score_utils.c @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* score_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/18 18:05:06 by tmaze #+# #+# */ +/* Updated: 2019/04/21 16:53:11 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lem_in.h" + +static void init_scores(t_ind **ret, int *scores) +{ + int i; + + i = 0; + while (ret[i]) + { + scores[i] = ret[i]->weight; + ret[i]->weight = 0; + i++; + } +} + +static int get_nb_nodes(t_ind *lst) +{ + t_ind *it; + int i; + + i = 0; + it = lst; + while (it && (++i)) + it = it->next; + return (i); +} + +static int get_min_score(t_ind **ret, int *scores) +{ + int i; + int min; + + i = -1; + min = FT_INT_MAX; + while (ret[++i]) + if (min > scores[i]) + min = scores[i]; + return (min); +} + +static int get_final_score(t_ind **ret, int *scores) +{ + int i; + int min; + + i = -1; + min = 0; + while (ret[++i]) + { + scores[i] = (ret[i]->weight > 0) * (get_nb_nodes(ret[i]) + + ret[i]->weight - 1); + if (min < scores[i]) + min = scores[i]; + } + return (min); +} + +int get_score(t_lmdata *data, t_ind **ret, int nb_paths) +{ + int nbants; + int i; + int min; + int scores[nb_paths]; + + nbants = data->nbants; + init_scores(ret, scores); + min = get_min_score(ret, scores); + while (nbants > 0 && (i = -1)) + { + while (++i < nb_paths && nbants > 0) + if (scores[i] == min) + { + nbants--; + ret[i]->weight++; + scores[i] = (ret[i]->weight > 0) * (get_nb_nodes(ret[i]) + + ret[i]->weight - 1); + } + min = get_min_score(ret, scores); + } + return (get_final_score(ret, scores)); +}