From 0233628d75680c138f9d9c7db2ba410a5d4d7e54 Mon Sep 17 00:00:00 2001 From: kdx Date: Tue, 24 Jan 2023 17:12:42 +0100 Subject: who cares --- .gitignore | 6 ++++ Makefile | 42 ++++++++++++++++++++++ client.c | 52 +++++++++++++++++++++++++++ client_bonus.c | 52 +++++++++++++++++++++++++++ libft/.gitignore | 4 +++ libft/Makefile | 49 ++++++++++++++++++++++++++ libft/ft_atoi.c | 42 ++++++++++++++++++++++ libft/ft_atol.c | 40 +++++++++++++++++++++ libft/ft_bzero.c | 18 ++++++++++ libft/ft_calloc.c | 27 ++++++++++++++ libft/ft_dprintf.c | 24 +++++++++++++ libft/ft_free.c | 20 +++++++++++ libft/ft_isalnum.c | 18 ++++++++++ libft/ft_isalpha.c | 18 ++++++++++ libft/ft_isascii.c | 18 ++++++++++ libft/ft_isdigit.c | 18 ++++++++++ libft/ft_isprint.c | 18 ++++++++++ libft/ft_itoa.c | 52 +++++++++++++++++++++++++++ libft/ft_lstadd_back.c | 26 ++++++++++++++ libft/ft_lstadd_front.c | 21 +++++++++++ libft/ft_lstclear.c | 27 ++++++++++++++ libft/ft_lstdelone.c | 25 +++++++++++++ libft/ft_lstiter.c | 24 +++++++++++++ libft/ft_lstlast.c | 22 ++++++++++++ libft/ft_lstmap.c | 39 +++++++++++++++++++++ libft/ft_lstnew.c | 25 +++++++++++++ libft/ft_lstsize.c | 26 ++++++++++++++ libft/ft_memchr.c | 31 +++++++++++++++++ libft/ft_memcmp.c | 34 ++++++++++++++++++ libft/ft_memcpy.c | 22 ++++++++++++ libft/ft_memmove.c | 33 ++++++++++++++++++ libft/ft_memset.c | 25 +++++++++++++ libft/ft_printf.c | 24 +++++++++++++ libft/ft_putchar_fd.c | 19 ++++++++++ libft/ft_putendl_fd.c | 19 ++++++++++ libft/ft_puti128_fd.c | 37 ++++++++++++++++++++ libft/ft_putnbr_fd.c | 39 +++++++++++++++++++++ libft/ft_putstr_fd.c | 23 ++++++++++++ libft/ft_putu128x_fd.c | 34 ++++++++++++++++++ libft/ft_split.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ libft/ft_strchr.c | 24 +++++++++++++ libft/ft_strdup.c | 26 ++++++++++++++ libft/ft_striteri.c | 27 ++++++++++++++ libft/ft_strjoin.c | 34 ++++++++++++++++++ libft/ft_strlcat.c | 25 +++++++++++++ libft/ft_strlcpy.c | 28 +++++++++++++++ libft/ft_strlen.c | 23 ++++++++++++ libft/ft_strmapi.c | 32 +++++++++++++++++ libft/ft_strncmp.c | 27 ++++++++++++++ libft/ft_strnstr.c | 37 ++++++++++++++++++++ libft/ft_strrchr.c | 24 +++++++++++++ libft/ft_strtrim.c | 33 ++++++++++++++++++ libft/ft_substr.c | 35 +++++++++++++++++++ libft/ft_tolower.c | 20 +++++++++++ libft/ft_toupper.c | 20 +++++++++++ libft/ft_vdprintf.c | 64 ++++++++++++++++++++++++++++++++++ libft/ft_vprintf.c | 18 ++++++++++ libft/libft.h | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ server.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++ server_bonus.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 60 files changed, 1952 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 client.c create mode 100644 client_bonus.c create mode 100644 libft/.gitignore create mode 100644 libft/Makefile create mode 100644 libft/ft_atoi.c create mode 100644 libft/ft_atol.c create mode 100644 libft/ft_bzero.c create mode 100644 libft/ft_calloc.c create mode 100644 libft/ft_dprintf.c create mode 100644 libft/ft_free.c create mode 100644 libft/ft_isalnum.c create mode 100644 libft/ft_isalpha.c create mode 100644 libft/ft_isascii.c create mode 100644 libft/ft_isdigit.c create mode 100644 libft/ft_isprint.c create mode 100644 libft/ft_itoa.c create mode 100644 libft/ft_lstadd_back.c create mode 100644 libft/ft_lstadd_front.c create mode 100644 libft/ft_lstclear.c create mode 100644 libft/ft_lstdelone.c create mode 100644 libft/ft_lstiter.c create mode 100644 libft/ft_lstlast.c create mode 100644 libft/ft_lstmap.c create mode 100644 libft/ft_lstnew.c create mode 100644 libft/ft_lstsize.c create mode 100644 libft/ft_memchr.c create mode 100644 libft/ft_memcmp.c create mode 100644 libft/ft_memcpy.c create mode 100644 libft/ft_memmove.c create mode 100644 libft/ft_memset.c create mode 100644 libft/ft_printf.c create mode 100644 libft/ft_putchar_fd.c create mode 100644 libft/ft_putendl_fd.c create mode 100644 libft/ft_puti128_fd.c create mode 100644 libft/ft_putnbr_fd.c create mode 100644 libft/ft_putstr_fd.c create mode 100644 libft/ft_putu128x_fd.c create mode 100644 libft/ft_split.c create mode 100644 libft/ft_strchr.c create mode 100644 libft/ft_strdup.c create mode 100644 libft/ft_striteri.c create mode 100644 libft/ft_strjoin.c create mode 100644 libft/ft_strlcat.c create mode 100644 libft/ft_strlcpy.c create mode 100644 libft/ft_strlen.c create mode 100644 libft/ft_strmapi.c create mode 100644 libft/ft_strncmp.c create mode 100644 libft/ft_strnstr.c create mode 100644 libft/ft_strrchr.c create mode 100644 libft/ft_strtrim.c create mode 100644 libft/ft_substr.c create mode 100644 libft/ft_tolower.c create mode 100644 libft/ft_toupper.c create mode 100644 libft/ft_vdprintf.c create mode 100644 libft/ft_vprintf.c create mode 100644 libft/libft.h create mode 100644 server.c create mode 100644 server_bonus.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a2ddf6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.o +client +server +client_bonus +server_bonus +tags diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0939aee --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +CC = gcc +LD = gcc +CFLAGS = -Wall -Wextra -Werror +LDFLAGS = -Llibft -lft +NAME = server + +all: client server + +bonus: client_bonus server_bonus + +$(NAME): libft/libft.a server.o + $(LD) -o $@ server.o $(LDFLAGS) + +client: libft/libft.a client.o + $(LD) -o $@ client.o $(LDFLAGS) + +server_bonus: libft/libft.a server_bonus.o + $(LD) -o $@ server_bonus.o $(LDFLAGS) + +client_bonus: libft/libft.a client_bonus.o + $(LD) -o $@ client_bonus.o $(LDFLAGS) + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +libft/libft.a: + make -C libft + +clean: + rm -f server.o client.o server_bonus.o client_bonus.o + make -C libft clean + +fclean: clean + rm -f server client server_bonus client_bonus + make -C libft fclean + +re: + make fclean + make all + make -C libft re + +.PHONY: all bonus clean fclean re diff --git a/client.c b/client.c new file mode 100644 index 0000000..843bf52 --- /dev/null +++ b/client.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* client.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#include +#include + +static void send(const unsigned char *s, pid_t pid) +{ + size_t bit; + int sig; + size_t i; + + i = 0; + while (1) + { + bit = 0; + while (bit < 8) + { + sig = SIGUSR1; + if (s[i] & (1 << bit)) + sig = SIGUSR2; + kill(pid, sig); + usleep(50 + i / 100); + bit++; + } + if (s[i] == '\0') + break ; + i++; + } +} + +int main(int argc, char **argv) +{ + pid_t server_pid; + + if (argc != 3) + return (1 | ft_dprintf(2, "usage: client \n")); + server_pid = ft_atoi(argv[1]); + send((const unsigned char *)argv[2], server_pid); + return (0); +} diff --git a/client_bonus.c b/client_bonus.c new file mode 100644 index 0000000..d24773c --- /dev/null +++ b/client_bonus.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* client_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#include +#include + +static void send(const unsigned char *s, pid_t pid) +{ + size_t bit; + int sig; + size_t i; + + i = 0; + while (1) + { + bit = 0; + while (bit < 8) + { + sig = SIGUSR1; + if (s[i] & (1 << bit)) + sig = SIGUSR2; + kill(pid, sig); + usleep(50 + i / 100); + bit++; + } + if (s[i] == '\0') + break ; + i++; + } +} + +int main(int argc, char **argv) +{ + pid_t server_pid; + + if (argc != 3) + return (1 | ft_dprintf(2, "usage: client \n")); + server_pid = ft_atoi(argv[1]); + send((const unsigned char *)argv[2], server_pid); + return (0); +} diff --git a/libft/.gitignore b/libft/.gitignore new file mode 100644 index 0000000..b32c3ed --- /dev/null +++ b/libft/.gitignore @@ -0,0 +1,4 @@ +*.a +*.o +a.out +libft.so diff --git a/libft/Makefile b/libft/Makefile new file mode 100644 index 0000000..9e1fb34 --- /dev/null +++ b/libft/Makefile @@ -0,0 +1,49 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: nkimel +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/07/25 16:53:01 by kdx #+# #+# */ +/* Updated: 2022/09/28 04:46:19 by kdx ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +int ft_atoi(const char *nptr) +{ + long result; + int sign; + + while (*nptr == ' ' || *nptr == '\n' || *nptr == '\t' + || *nptr == '\r' || *nptr == '\f' || *nptr == '\v') + nptr++; + sign = 1; + if (*nptr == '+' || *nptr == '-') + { + if (*nptr == '-') + sign = -sign; + nptr++; + } + result = 0; + while (*nptr >= '0' && *nptr <= '9') + { + result = result * 10 + (*nptr - '0') * sign; + nptr++; + if (result > INT_MAX) + return (-1); + if (result < INT_MIN) + return (0); + } + return (result); +} diff --git a/libft/ft_atol.c b/libft/ft_atol.c new file mode 100644 index 0000000..10d96a9 --- /dev/null +++ b/libft/ft_atol.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atol.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/07/25 16:53:01 by kdx #+# #+# */ +/* Updated: 2022/10/07 13:25:39 by kdx ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +t_i64 ft_atol(const char *nptr) +{ + t_i64 result; + int sign; + + while (*nptr == ' ' || *nptr == '\n' || *nptr == '\t' + || *nptr == '\r' || *nptr == '\f' || *nptr == '\v') + nptr++; + sign = 1; + if (*nptr == '+' || *nptr == '-') + { + if (*nptr == '-') + sign = -sign; + nptr++; + } + result = 0; + while (*nptr >= '0' && *nptr <= '9') + { + result = result * 10 + (*nptr - '0') * sign; + if (result >= LONG_MAX / 10 || result <= LONG_MIN / 10) + return (result); + nptr++; + } + return (result); +} diff --git a/libft/ft_bzero.c b/libft/ft_bzero.c new file mode 100644 index 0000000..f5320e7 --- /dev/null +++ b/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +void *ft_calloc(size_t nmemb, size_t size) +{ + void *ptr; + + if (nmemb != 0 && (size_t)(nmemb * size) / nmemb != size) + return (NULL); + ptr = malloc(nmemb * size); + if (ptr == NULL) + return (ptr); + ft_bzero(ptr, nmemb * size); + return (ptr); +} diff --git a/libft/ft_dprintf.c b/libft/ft_dprintf.c new file mode 100644 index 0000000..2a2234a --- /dev/null +++ b/libft/ft_dprintf.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); +} diff --git a/libft/ft_isascii.c b/libft/ft_isascii.c new file mode 100644 index 0000000..4ffcc7d --- /dev/null +++ b/libft/ft_isascii.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = 0 && c <= 127); +} diff --git a/libft/ft_isdigit.c b/libft/ft_isdigit.c new file mode 100644 index 0000000..760e7fe --- /dev/null +++ b/libft/ft_isdigit.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = '0' && c <= '9'); +} diff --git a/libft/ft_isprint.c b/libft/ft_isprint.c new file mode 100644 index 0000000..65226a0 --- /dev/null +++ b/libft/ft_isprint.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = ' ' && c <= '~'); +} diff --git a/libft/ft_itoa.c b/libft/ft_itoa.c new file mode 100644 index 0000000..35c84d1 --- /dev/null +++ b/libft/ft_itoa.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + { + div /= 10; + ptr[i++] = '0' + v / div % 10; + } + ptr[i] = '\0'; + return (ptr); +} + +char *ft_itoa(int n) +{ + long v; + int sign; + long div; + size_t i; + char *ptr; + + if (n == 0) + return (ft_strdup("0")); + v = n; + sign = (v > 0) - (v < 0); + v *= sign; + div = 1; + i = (sign == -1); + while (div <= v && ++i) + div *= 10; + ptr = malloc(i + 1); + if (ptr == NULL) + return (NULL); + return (_itoa(v, sign, div, ptr)); +} diff --git a/libft/ft_lstadd_back.c b/libft/ft_lstadd_back.c new file mode 100644 index 0000000..953f771 --- /dev/null +++ b/libft/ft_lstadd_back.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_back.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx next = new; +} diff --git a/libft/ft_lstadd_front.c b/libft/ft_lstadd_front.c new file mode 100644 index 0000000..ca3b6ca --- /dev/null +++ b/libft/ft_lstadd_front.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_front.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx next = *list; + *list = new; +} diff --git a/libft/ft_lstclear.c b/libft/ft_lstclear.c new file mode 100644 index 0000000..a262722 --- /dev/null +++ b/libft/ft_lstclear.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstclear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx next; + ft_lstdelone(*lst, del); + *lst = next; + } +} diff --git a/libft/ft_lstdelone.c b/libft/ft_lstdelone.c new file mode 100644 index 0000000..6975f88 --- /dev/null +++ b/libft/ft_lstdelone.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx content != NULL) + del(lst->content); + free(lst); + } +} diff --git a/libft/ft_lstiter.c b/libft/ft_lstiter.c new file mode 100644 index 0000000..4f66050 --- /dev/null +++ b/libft/ft_lstiter.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx content); + lst = lst->next; + } +} diff --git a/libft/ft_lstlast.c b/libft/ft_lstlast.c new file mode 100644 index 0000000..926b5d3 --- /dev/null +++ b/libft/ft_lstlast.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstlast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx next != NULL) + lst = lst->next; + return (lst); +} diff --git a/libft/ft_lstmap.c b/libft/ft_lstmap.c new file mode 100644 index 0000000..e962de6 --- /dev/null +++ b/libft/ft_lstmap.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx content)); + if (root == NULL) + return (NULL); + last = root; + lst = lst->next; + while (lst != NULL) + { + last->next = ft_lstnew(f(lst->content)); + if (last->next == NULL) + { + ft_lstclear(&root, del); + return (NULL); + } + lst = lst->next; + last = last->next; + } + return (root); +} diff --git a/libft/ft_lstnew.c b/libft/ft_lstnew.c new file mode 100644 index 0000000..6ccb7a8 --- /dev/null +++ b/libft/ft_lstnew.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx content = content; + lst->next = NULL; + return (lst); +} diff --git a/libft/ft_lstsize.c b/libft/ft_lstsize.c new file mode 100644 index 0000000..5e0c30e --- /dev/null +++ b/libft/ft_lstsize.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx next; + } + return (count); +} diff --git a/libft/ft_memchr.c b/libft/ft_memchr.c new file mode 100644 index 0000000..f3856fb --- /dev/null +++ b/libft/ft_memchr.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + const uint8_t *data_1; + const uint8_t *data_2; + size_t i; + + if (n == 0) + return (0); + data_1 = s1; + data_2 = s2; + i = 0; + while (i + 1 < n) + { + if (data_1[i] != data_2[i]) + return (data_1[i] - data_2[i]); + i++; + } + return (data_1[i] - data_2[i]); +} diff --git a/libft/ft_memcpy.c b/libft/ft_memcpy.c new file mode 100644 index 0000000..90bd13c --- /dev/null +++ b/libft/ft_memcpy.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + ((char *)dest)[n] = ((char *)src)[n]; + return (dest); +} diff --git a/libft/ft_memmove.c b/libft/ft_memmove.c new file mode 100644 index 0000000..41f3100 --- /dev/null +++ b/libft/ft_memmove.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +size_t ft_putchar_fd(char c, int fd) +{ + return (write(fd, &c, 1) == 1); +} diff --git a/libft/ft_putendl_fd.c b/libft/ft_putendl_fd.c new file mode 100644 index 0000000..9fc0cb3 --- /dev/null +++ b/libft/ft_putendl_fd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + { + rv += ft_putchar_fd('0' + v / div % 10, fd); + div /= 10; + } + return (rv); +} diff --git a/libft/ft_putnbr_fd.c b/libft/ft_putnbr_fd.c new file mode 100644 index 0000000..7705180 --- /dev/null +++ b/libft/ft_putnbr_fd.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + { + div /= 10; + ft_putchar_fd('0' + v / div % 10, fd); + } +} diff --git a/libft/ft_putstr_fd.c b/libft/ft_putstr_fd.c new file mode 100644 index 0000000..e971974 --- /dev/null +++ b/libft/ft_putstr_fd.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +size_t ft_putstr_fd(char *s, int fd) +{ + if (s == NULL) + return (ft_putstr_fd("(null)", fd)); + else + write(fd, s, ft_strlen(s)); + return (ft_strlen(s)); +} diff --git a/libft/ft_putu128x_fd.c b/libft/ft_putu128x_fd.c new file mode 100644 index 0000000..01989b4 --- /dev/null +++ b/libft/ft_putu128x_fd.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putu128x_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + { + rv += ft_putchar_fd(set[n / div % 16], fd); + div /= 16; + } + return (rv); +} diff --git a/libft/ft_split.c b/libft/ft_split.c new file mode 100644 index 0000000..d3ed86b --- /dev/null +++ b/libft/ft_split.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +static void *free_array(char **a) +{ + size_t i; + + if (a != NULL) + { + i = 0; + while (a[i] != NULL) + free(a[i++]); + free(a); + } + return (NULL); +} + +static size_t skip_char(const char **s, char c, bool invert) +{ + size_t i; + const char *p; + + i = 0; + p = *s; + while (((!invert && *p == c) || (invert && *p != c)) && *p != '\0') + { + p++; + i++; + } + *s = p; + return (i); +} + +static size_t count_elems(const char *s, char c) +{ + size_t n_elem; + + n_elem = 0; + skip_char(&s, c, false); + while (*s != '\0') + { + skip_char(&s, c, true); + skip_char(&s, c, false); + n_elem++; + } + return (n_elem); +} + +char **ft_split(char const *s, char c) +{ + char **array; + size_t n_elem; + size_t arr_i; + const char *rem_s; + size_t len; + + if (s == NULL) + return (NULL); + n_elem = count_elems(s, c); + array = ft_calloc(n_elem + 1, sizeof(char *)); + if (array == NULL) + return (array); + skip_char(&s, c, false); + arr_i = 0; + while (arr_i < n_elem) + { + rem_s = s; + len = skip_char(&s, c, true); + array[arr_i] = ft_substr(rem_s, 0, len); + if (array[arr_i++] == NULL) + return (free_array(array)); + skip_char(&s, c, false); + } + return (array); +} diff --git a/libft/ft_strchr.c b/libft/ft_strchr.c new file mode 100644 index 0000000..a806312 --- /dev/null +++ b/libft/ft_strchr.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + ptr[s1_len + s2_len] = s2[s2_len]; + while (s1_len-- > 0) + ptr[s1_len] = s1[s1_len]; + return (ptr); +} diff --git a/libft/ft_strlcat.c b/libft/ft_strlcat.c new file mode 100644 index 0000000..cd1f70b --- /dev/null +++ b/libft/ft_strlcat.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = size) + return (ft_strlen(src) + size); + return (dest_size + ft_strlcpy(dst + dest_size, src, size - dest_size)); +} diff --git a/libft/ft_strlcpy.c b/libft/ft_strlcpy.c new file mode 100644 index 0000000..2b42ed2 --- /dev/null +++ b/libft/ft_strlcpy.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/07/18 18:00:30 by kdx #+# #+# */ +/* Updated: 2022/09/27 23:52:19 by kdx ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, size_t n) +{ + if (n == 0) + return (0); + while (--n > 0 && (*s1 != '\0' || *s2 != '\0')) + { + if (*s1 != *s2) + return ((unsigned char)*s1 - (unsigned char)*s2); + s1++; + s2++; + } + return ((unsigned char)*s1 - (unsigned char)*s2); +} diff --git a/libft/ft_strnstr.c b/libft/ft_strnstr.c new file mode 100644 index 0000000..9143d70 --- /dev/null +++ b/libft/ft_strnstr.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx 0) + if (s[i] == c) + return ((char *)(s + i)); + return (NULL); +} diff --git a/libft/ft_strtrim.c b/libft/ft_strtrim.c new file mode 100644 index 0000000..62f41aa --- /dev/null +++ b/libft/ft_strtrim.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx len) + size = len; + ptr = malloc(size + 1); + if (ptr == NULL) + return (NULL); + ptr[size] = '\0'; + while (size-- > 0) + ptr[size] = s[start + size]; + return (ptr); +} diff --git a/libft/ft_tolower.c b/libft/ft_tolower.c new file mode 100644 index 0000000..5c5d65b --- /dev/null +++ b/libft/ft_tolower.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = 'A' && c <= 'Z') + return (c - 'A' + 'a'); + return (c); +} diff --git a/libft/ft_toupper.c b/libft/ft_toupper.c new file mode 100644 index 0000000..ba6983a --- /dev/null +++ b/libft/ft_toupper.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx = 'a' && c <= 'z') + return (c + 'A' - 'a'); + return (c); +} diff --git a/libft/ft_vdprintf.c b/libft/ft_vdprintf.c new file mode 100644 index 0000000..619a6c3 --- /dev/null +++ b/libft/ft_vdprintf.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vdprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx + +static t_i32 put_ptr(void *ptr, int fd) +{ + t_i32 rv; + + rv = 0; + if (ptr != NULL) + { + rv += ft_putstr_fd("0x", fd); + rv += ft_putu128x_fd((t_u64)ptr, fd, 0); + } + else + rv += ft_putstr_fd("(nil)", fd); + return (rv); +} + +static t_i32 put_element(t_i32 fd, const char *fmt, va_list va) +{ + if (*fmt == '%') + return (ft_putchar_fd(*fmt, fd)); + if (*fmt == 'c') + return (ft_putchar_fd(va_arg(va, int), fd)); + if (*fmt == 'd' || *fmt == 'i') + return (ft_puti128_fd(va_arg(va, int), fd)); + if (*fmt == 'u') + return (ft_puti128_fd(va_arg(va, unsigned int), fd)); + if (*fmt == 'p') + return (put_ptr(va_arg(va, void *), fd)); + if (*fmt == 'x' || *fmt == 'X') + return (ft_putu128x_fd(va_arg(va, unsigned int), fd, *fmt == 'X')); + if (*fmt == 's') + return (ft_putstr_fd(va_arg(va, char *), fd)); + return (0); +} + +t_i32 ft_vdprintf(t_i32 fd, const char *fmt, va_list va) +{ + t_i32 rv; + + rv = 0; + while (*fmt != '\0') + { + if (*fmt == '%' && ft_strchr("cdiupxXs%", fmt[1]) != NULL) + rv += put_element(fd, ++fmt, va); + else + rv += ft_putchar_fd(*fmt, fd); + fmt++; + } + return (rv); +} diff --git a/libft/ft_vprintf.c b/libft/ft_vprintf.c new file mode 100644 index 0000000..db53f97 --- /dev/null +++ b/libft/ft_vprintf.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +# include +# include + +typedef int8_t t_i8; +typedef int16_t t_i16; +typedef int32_t t_i32; +typedef int64_t t_i64; +typedef __int128_t t_i128; +typedef uint8_t t_u8; +typedef uint16_t t_u16; +typedef uint32_t t_u32; +typedef uint64_t t_u64; +typedef __uint128_t t_u128; +typedef t_u32 t_err; + +int ft_atoi(const char *nptr); +t_i64 ft_atol(const char *nptr); +void ft_bzero(void *s, size_t n); +void *ft_calloc(size_t nmemb, size_t size); +int ft_isalnum(int c); +int ft_isalpha(int c); +int ft_isascii(int c); +int ft_isdigit(int c); +int ft_isprint(int c); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +void *ft_memcpy(void *dest, const void *src, size_t n); +void *ft_memmove(void *dest, const void *src, size_t n); +void *ft_memset(void *s, int c, size_t n); +char *ft_strchr(const char *s, int c); +char *ft_strdup(const char *s); +size_t ft_strlcat(char *dst, const char *src, size_t size); +size_t ft_strlcpy(char *dst, const char *src, size_t size); +size_t ft_strlen(const char *s); +int ft_strncmp(const char *s1, const char *s2, size_t n); +char *ft_strnstr(const char *big, const char *little, size_t len); +char *ft_strrchr(const char *s, int c); +int ft_tolower(int c); +int ft_toupper(int c); + +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s1, char const *set); +char **ft_split(char const *s, char c); +char *ft_itoa(int n); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +void ft_striteri(char *s, void (*f)(unsigned int, char*)); +size_t ft_putchar_fd(char c, int fd); +size_t ft_putstr_fd(char *s, int fd); +void ft_putendl_fd(char *s, int fd); +void ft_putnbr_fd(int n, int fd); +size_t ft_puti128_fd(t_i128 n, int fd); +size_t ft_putu128x_fd(t_u128 n, int fd, int capitalize); + +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +t_list *ft_lstnew(void *content); +void ft_lstadd_front(t_list **lst, t_list *new); +int ft_lstsize(t_list *lst); +t_list *ft_lstlast(t_list *lst); +void ft_lstadd_back(t_list **lst, t_list *new); +void ft_lstdelone(t_list *lst, void (*del)(void *)); +void ft_lstclear(t_list **lst, void (*del)(void *)); +void ft_lstiter(t_list *lst, void (*f)(void *)); +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); + +t_i32 ft_vdprintf(int fd, const char *fmt, va_list va); +t_i32 ft_dprintf(int fd, const char *fmt, ...); +t_i32 ft_vprintf(const char *fmt, va_list va); +t_i32 ft_printf(const char *fmt, ...); + +void *ft_free(void *ptr); + +#endif diff --git a/server.c b/server.c new file mode 100644 index 0000000..7497970 --- /dev/null +++ b/server.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#include + +static uint8_t *g_buffer; + +static void buffer_append(uint8_t byte) +{ + uint8_t *new_buffer; + size_t len; + + if (g_buffer == NULL) + { + g_buffer = ft_calloc(2, sizeof(char)); + if (g_buffer == NULL) + exit(1); + g_buffer[0] = byte; + } + else + { + len = ft_strlen((char *)g_buffer); + new_buffer = ft_calloc(len + 2, sizeof(char)); + if (new_buffer == NULL) + { + ft_free(g_buffer); + exit(1); + } + ft_strlcpy((char *)new_buffer, (char *)g_buffer, -1); + new_buffer[len] = byte; + ft_free(g_buffer); + g_buffer = new_buffer; + } +} + +static void handler(int signum) +{ + static uint8_t byte; + static size_t bit; + + byte |= (signum == SIGUSR2) << bit; + bit += 1; + if (bit >= 8) + { + if (g_buffer != NULL && byte == 0) + { + write(1, g_buffer, ft_strlen((char *)g_buffer)); + ft_free(g_buffer); + g_buffer = NULL; + } + else if (byte != 0) + buffer_append(byte); + byte = 0; + bit = 0; + } + return ; +} + +static void sigint_handler(int signum) +{ + (void)signum; + ft_free(g_buffer); + exit(0); +} + +int main(void) +{ + pid_t pid; + + pid = getpid(); + if (signal(SIGUSR1, handler) == SIG_ERR || signal(SIGUSR2, handler)) + return (1); + if (signal(SIGINT, sigint_handler) == SIG_ERR) + return (1); + ft_puti128_fd(pid, 1); + ft_putchar_fd('\n', 1); + while (1) + ; + return (0); +} diff --git a/server_bonus.c b/server_bonus.c new file mode 100644 index 0000000..f47fd62 --- /dev/null +++ b/server_bonus.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx +#include + +static uint8_t *g_buffer; + +static void buffer_append(uint8_t byte) +{ + uint8_t *new_buffer; + size_t len; + + if (g_buffer == NULL) + { + g_buffer = ft_calloc(2, sizeof(char)); + if (g_buffer == NULL) + exit(1); + g_buffer[0] = byte; + } + else + { + len = ft_strlen((char *)g_buffer); + new_buffer = ft_calloc(len + 2, sizeof(char)); + if (new_buffer == NULL) + { + ft_free(g_buffer); + exit(1); + } + ft_strlcpy((char *)new_buffer, (char *)g_buffer, -1); + new_buffer[len] = byte; + ft_free(g_buffer); + g_buffer = new_buffer; + } +} + +static void handler(int signum) +{ + static uint8_t byte; + static size_t bit; + + byte |= (signum == SIGUSR2) << bit; + bit += 1; + if (bit >= 8) + { + if (g_buffer != NULL && byte == 0) + { + write(1, g_buffer, ft_strlen((char *)g_buffer)); + ft_free(g_buffer); + g_buffer = NULL; + } + else if (byte != 0) + buffer_append(byte); + byte = 0; + bit = 0; + } + return ; +} + +static void sigint_handler(int signum) +{ + (void)signum; + ft_free(g_buffer); + exit(0); +} + +int main(void) +{ + pid_t pid; + + pid = getpid(); + if (signal(SIGUSR1, handler) == SIG_ERR || signal(SIGUSR2, handler)) + return (1); + if (signal(SIGINT, sigint_handler) == SIG_ERR) + return (1); + ft_puti128_fd(pid, 1); + ft_putchar_fd('\n', 1); + while (1) + ; + return (0); +} -- cgit v1.2.3