diff --git a/courses/cunix2/ft_printf/printf.a b/courses/cunix2/ft_printf/printf.a new file mode 100644 index 00000000..190887e4 Binary files /dev/null and b/courses/cunix2/ft_printf/printf.a differ diff --git a/courses/cunix2/ft_printf/printf.h b/courses/cunix2/ft_printf/printf.h new file mode 100644 index 00000000..516e17e1 --- /dev/null +++ b/courses/cunix2/ft_printf/printf.h @@ -0,0 +1,24 @@ +#ifndef LIB_H +#define LIB_H + + #include + #include + #include + + void ft_printf(char *format, ...); + + char *ft_itoa(int val, int base); + + unsigned int ft_strlen(char *str); + + int ft_atoi(const char *str); + + void my_print_buf(char *buf, int align, int len); + + void my_print_char(char ch, int align); + + void my_print_str(char *str, int align); + + void my_pad_with_zeros(int num, int len); + +#endif diff --git a/courses/cunix2/ft_printf/printf_test/Makefile b/courses/cunix2/ft_printf/printf_test/Makefile index 1d25114e..1cd7d9b6 100644 --- a/courses/cunix2/ft_printf/printf_test/Makefile +++ b/courses/cunix2/ft_printf/printf_test/Makefile @@ -2,7 +2,7 @@ FT_PRINTF_PATH = ../ CC = gcc CCFLAGS = -Wall -Wextra -Wno-trigraphs # Adding -std=c99 causes crash -LDFLAGS = -L$(FT_PRINTF_PATH) -lftprintf +LDFLAGS = -L$(FT_PRINTF_PATH) -l:printf.a NAME = ft_printf_test CHECK_LEAKS_NAME = check_leaks diff --git a/courses/cunix2/ft_printf/src/ft_atoi.c b/courses/cunix2/ft_printf/src/ft_atoi.c new file mode 100644 index 00000000..10c2ce6b --- /dev/null +++ b/courses/cunix2/ft_printf/src/ft_atoi.c @@ -0,0 +1,31 @@ +#include "../printf.h" + +int ft_atoi(const char *str) +{ + char ch; + int count = 0, res = 0, digit; + int sign = 1; + if ((ch = *str) == '-') + { + str++; + sign = -1; + } + + while ((ch = *str) >= 48 && ch <= 57) + { + str++; + count++; + } + int power = 0; + while ((power++) < count) + { + int multiple = 1; + digit = *(--str) - 48; + for (int i = 1; i < power; i++) + { + multiple *= 10; + } + res += digit * multiple; + } + return res * sign; +} diff --git a/courses/cunix2/ft_printf/src/ft_itoa.c b/courses/cunix2/ft_printf/src/ft_itoa.c new file mode 100644 index 00000000..32c0caea --- /dev/null +++ b/courses/cunix2/ft_printf/src/ft_itoa.c @@ -0,0 +1,27 @@ +char *ft_itoa(int val, int base) +{ + char temp[24]; + int pos_temp = 0, pos_res = 0; + static char res[20]; + int count = 0; + if (val < 0) + { + val *= -1; + res[pos_res++] = '-'; + } + + do + { + temp[pos_temp++] = val % base + '0'; + val /= base; + count++; + } + while (val > 0); + + while (count-- > 0) + { + res[pos_res++] = temp[--pos_temp]; + } + res[pos_res] = '\0'; + return res; +} diff --git a/courses/cunix2/ft_printf/src/ft_printf.c b/courses/cunix2/ft_printf/src/ft_printf.c new file mode 100644 index 00000000..7becc3e9 --- /dev/null +++ b/courses/cunix2/ft_printf/src/ft_printf.c @@ -0,0 +1,104 @@ +#include "../printf.h" + +void ft_printf(char *format, ...) +{ + va_list list; + va_start(list, format); + int num = 0; + int format_mode = 0; + int align_len = 0; + int plus_found = 0, minus_found = 0, number_found = 0, space_found = 0, zero_found = 0; + char *parsed = NULL; + while (*format) + { + if (format_mode) + { + switch (*format) + { + case '%': + write(1, "%", 1); + format_mode = 0; + break; + case ' ': + space_found = 1; + break; + case 'd': + case 'i': + num = va_arg(list, int); + if (zero_found) + { + my_pad_with_zeros(num, align_len); + break; + } + if (space_found && num >= 0 && !align_len) + { + my_print_str(" ", 0); + } + if (plus_found && num >= 0) + { + my_print_str("+", 0); + } + parsed = ft_itoa(num, 10); + my_print_str(parsed, align_len); + align_len = format_mode = number_found = 0; + break; + case 's': + my_print_str(va_arg(list, char *), align_len); + align_len = format_mode = number_found = 0; + break; + case 'c': + my_print_char(va_arg(list, int), align_len); + align_len = format_mode = number_found = 0; + break; + case '+': + plus_found = 1; + break; + case '-': + minus_found = 1; + break; + default: + if (*format < 48 || *format > 59) + { + write(1, format, 1); + format_mode = 0; + } + else + { + if (!number_found) + { + if (*format == '0') + { + zero_found = 1; + } + number_found = 1; + if (minus_found) + { + align_len = (-1) * ft_atoi(format); + minus_found = 0; + } + else if (plus_found || number_found) + { + align_len = ft_atoi(format); + plus_found = 0; + } + } + } + break; + } + } + else + { + if (*format == '%') + { + format_mode = 1; + } + else + { + write(1, format, 1); + } + } + format++; + } + va_end(list); +} + diff --git a/courses/cunix2/ft_printf/src/ft_strlen.c b/courses/cunix2/ft_printf/src/ft_strlen.c new file mode 100644 index 00000000..f51d0f7d --- /dev/null +++ b/courses/cunix2/ft_printf/src/ft_strlen.c @@ -0,0 +1,16 @@ +#include "../printf.h" + +unsigned int ft_strlen(char *str) +{ + if (!str) + { + return 0; + } + int count = 0; + while (*str != '\0') + { + count++; + str++; + } + return count; +} diff --git a/courses/cunix2/ft_printf/src/my_pad_with_zeros.c b/courses/cunix2/ft_printf/src/my_pad_with_zeros.c new file mode 100644 index 00000000..01a76c0a --- /dev/null +++ b/courses/cunix2/ft_printf/src/my_pad_with_zeros.c @@ -0,0 +1,24 @@ +#include "../printf.h" + +void my_pad_with_zeros(int num, int len) +{ + if (num < 0) + { + num *= -1; + write(1, "-", 1); + len--; + } + char *str = ft_itoa(num, 10); + size_t str_len = ft_strlen(str); + int pad = len - str_len; + if (pad < 0) + { + pad = 0; + } + while (pad--) + { + write(1, "0", 1); + } + write(1, str, str_len); +} + diff --git a/courses/cunix2/ft_printf/src/my_print_buf.c b/courses/cunix2/ft_printf/src/my_print_buf.c new file mode 100644 index 00000000..c2097d37 --- /dev/null +++ b/courses/cunix2/ft_printf/src/my_print_buf.c @@ -0,0 +1,51 @@ +#include "../printf.h" + +void my_print_buf(char *buf, int align, int len) +{ + int pad = 0; + if (!buf) + { + len = 6; + } + if (align < 0) + { + align *= -1; + if (buf) + { + write(1, buf, len); + } + else + { + write(1, "(null)", 6); + } + pad = align - len; + if (pad < 0) + { + pad = 0; + } + while (pad--) + { + write(1, " ", 1); + } + } + else + { + pad = align - len; + if (pad < 0) + { + pad = 0; + } + while (pad--) + { + write(1, " ", 1); + } + if (buf) + { + write(1, buf, len); + } + else + { + write(1, "(null)", 6); + } + } +} diff --git a/courses/cunix2/ft_printf/src/my_print_char.c b/courses/cunix2/ft_printf/src/my_print_char.c new file mode 100644 index 00000000..1d7e69f5 --- /dev/null +++ b/courses/cunix2/ft_printf/src/my_print_char.c @@ -0,0 +1,10 @@ +#include "../printf.h" + +void my_print_char(char ch, int align) +{ + char *str_buf = malloc(2 * sizeof(char)); + str_buf[0] = ch; + str_buf[1] = '\0'; + my_print_buf(str_buf, align, 1); + free(str_buf); +} diff --git a/courses/cunix2/ft_printf/src/my_print_str.c b/courses/cunix2/ft_printf/src/my_print_str.c new file mode 100644 index 00000000..dd2bd743 --- /dev/null +++ b/courses/cunix2/ft_printf/src/my_print_str.c @@ -0,0 +1,7 @@ +#include "../printf.h" + +void my_print_str(char *str, int align) +{ + size_t len = ft_strlen(str); + my_print_buf(str, align, len); +} diff --git a/courses/cunix2/libft/libft.h b/courses/cunix2/libft/libft.h new file mode 100644 index 00000000..f8634c06 --- /dev/null +++ b/courses/cunix2/libft/libft.h @@ -0,0 +1,73 @@ +#ifndef LIBFT_H +#define LIBFT_H + + #include + #include + + void ft_bzero(void *s, size_t n); + + char *ft_strdup(const char *s); + + unsigned int ft_strlen(const char *str); + + int ft_strncmp(const char *s1, const char *s2, size_t n); + + char *ft_strchr(const char *s, int c); + + char *ft_strrchr(const char *s, int c); + + int ft_isalpha (int c); + + int ft_isdigit(int c); + + int ft_isascii(int c); + + int ft_toupper(int c); + + int ft_tolower(int c); + + char *ft_strstr(const char *haystack, const char *needle); + + char *ft_strnstr(const char *hay, const char *need, size_t len); + + int abs(int i); + + div_t ft_div(int num, int denom); + + void *ft_memalloc(size_t size); + + void *ft_memccpy(void *dst, const void *src, int c, size_t n); + + 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 *destination, const void *src, size_t n); + + void *ft_memmove(void *dst, const void *src, size_t len); + + void *ft_memset(void *destination, int c, size_t n); + + char *ft_strcat(char *s1, const char *s2); + + char *ft_strcpy(char *dst, const char *src); + + void ft_striter(char *s, void (*f)(char *)); + + char *ft_strjoin(char const *s1, char const *s2); + + char *ft_strmap(char const *s, char (*f)(char)); + + char *ft_strnew(size_t size); + + char **ft_strsplit(char const *s, char c); + + char *ft_strsub(char const *s, unsigned int start, size_t len); + + char *ft_strtrim(char const *s); + + int ft_strwhitespace(char c); + + int ft_count(char const *str, char c); + +#endif diff --git a/courses/cunix2/libft/src/ft_abs.c b/courses/cunix2/libft/src/ft_abs.c new file mode 100644 index 00000000..38adf10a --- /dev/null +++ b/courses/cunix2/libft/src/ft_abs.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int abs(int i) +{ + return i < 0 ? -i : i; +} diff --git a/courses/cunix2/libft/src/ft_bzero.c b/courses/cunix2/libft/src/ft_bzero.c new file mode 100644 index 00000000..f80772f2 --- /dev/null +++ b/courses/cunix2/libft/src/ft_bzero.c @@ -0,0 +1,12 @@ +#include "../libft.h" + +void bzero(void *s, size_t n) +{ + char *b = s; + size_t i; + + for (i = 0; i < n; i++) + { + b[i] = '\0'; + } +} diff --git a/courses/cunix2/libft/src/ft_count.c b/courses/cunix2/libft/src/ft_count.c new file mode 100644 index 00000000..bc33a0e7 --- /dev/null +++ b/courses/cunix2/libft/src/ft_count.c @@ -0,0 +1,19 @@ +#include "../libft.h" + +int ft_count(char const *str, char c) +{ + int i = 0; + int flag = 0; + int count = 0; + + while (*str) + { + if (!flag && *str != c) + { + count++; + } + flag = (str[i] == c) ? 0 : 1; + str++; + } + return (count); +} diff --git a/courses/cunix2/libft/src/ft_div.c b/courses/cunix2/libft/src/ft_div.c new file mode 100644 index 00000000..0b7ed41e --- /dev/null +++ b/courses/cunix2/libft/src/ft_div.c @@ -0,0 +1,9 @@ +#include "../libft.h" + +div_t ft_div(int num, int denom) +{ + div_t div; + div.quot = num / denom; + div.rem = num % denom; + return div; +} diff --git a/courses/cunix2/libft/src/ft_isalpha.c b/courses/cunix2/libft/src/ft_isalpha.c new file mode 100644 index 00000000..1878786a --- /dev/null +++ b/courses/cunix2/libft/src/ft_isalpha.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int fr_isalpha(int c) +{ + return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); +} diff --git a/courses/cunix2/libft/src/ft_isascii.c b/courses/cunix2/libft/src/ft_isascii.c new file mode 100644 index 00000000..3db88286 --- /dev/null +++ b/courses/cunix2/libft/src/ft_isascii.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int ft_isascii(int c) +{ + return (c >= 0 && c <= 127); +} diff --git a/courses/cunix2/libft/src/ft_isdigit.c b/courses/cunix2/libft/src/ft_isdigit.c new file mode 100644 index 00000000..875900b5 --- /dev/null +++ b/courses/cunix2/libft/src/ft_isdigit.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int ft_isdigit(int c) +{ + return (c >= '0' && c <= '9'); +} diff --git a/courses/cunix2/libft/src/ft_memalloc.c b/courses/cunix2/libft/src/ft_memalloc.c new file mode 100644 index 00000000..dfdaa709 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memalloc.c @@ -0,0 +1,13 @@ +#include "../libft.h" + +void *ft_memalloc(size_t size) +{ + void *res = malloc((size)); + + if (res == 0) + { + return NULL; + } + ft_bzero(res, size); + return (res); +} diff --git a/courses/cunix2/libft/src/ft_memccpy.c b/courses/cunix2/libft/src/ft_memccpy.c new file mode 100644 index 00000000..4533f443 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memccpy.c @@ -0,0 +1,14 @@ +#include "../libft.h" + +void *ft_memccpy(void *dst, const void *src, int c, size_t n) +{ + while (n--) + { + *(unsigned char *)dst++ = *(unsigned char *)src; + if (*(unsigned char *)src++ == (unsigned char)c) + { + return dst; + } + } + return NULL; +} diff --git a/courses/cunix2/libft/src/ft_memchr.c b/courses/cunix2/libft/src/ft_memchr.c new file mode 100644 index 00000000..18e14a2e --- /dev/null +++ b/courses/cunix2/libft/src/ft_memchr.c @@ -0,0 +1,21 @@ +#include "../libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + int i = 0; + int new_n = (int)n; + unsigned char to_find = (unsigned char)c; + + while (i < new_n) + { + if (((unsigned char *)s)[i] == to_find) + { + return (&((unsigned char *)s)[i]); + } + else + { + i++; + } + } + return NULL; +} diff --git a/courses/cunix2/libft/src/ft_memcmp.c b/courses/cunix2/libft/src/ft_memcmp.c new file mode 100644 index 00000000..67950af0 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memcmp.c @@ -0,0 +1,18 @@ +#include "../libft.h" + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + size_t i = 0; + unsigned char *t1 = (unsigned char *)s1; + unsigned char *t2 = (unsigned char *)s2; + + while (i < n) + { + if (t1[i] != t2[i]) + { + return (t1[i] - t2[i]); + } + ++i; + } + return (0); +} diff --git a/courses/cunix2/libft/src/ft_memcpy.c b/courses/cunix2/libft/src/ft_memcpy.c new file mode 100644 index 00000000..634d0646 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memcpy.c @@ -0,0 +1,11 @@ +#include "../libft.h" + +void *ft_memcpy(void *destination, const void *src, size_t n) +{ + while (n) + { + --n; + ((unsigned char *)destination)[n] = ((unsigned char *)src)[n]; + } + return destination; +} diff --git a/courses/cunix2/libft/src/ft_memmove.c b/courses/cunix2/libft/src/ft_memmove.c new file mode 100644 index 00000000..f97be526 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memmove.c @@ -0,0 +1,27 @@ +#include "../libft.h" + +void *ft_memmove(void *dst, const void *src, size_t len) +{ + size_t i = 0; + char *d = (char *)dst; + char *s = (char *)src; + i = 0; + if (s > d) + { + while (i < len) + { + *(d + i) = *(s + i); + i++; + } + } + if (d > s) + { + while (len > 0) + { + len--; + *(d + len) = *(s + len); + } + } + return (dst); + +} diff --git a/courses/cunix2/libft/src/ft_memset.c b/courses/cunix2/libft/src/ft_memset.c new file mode 100644 index 00000000..74831765 --- /dev/null +++ b/courses/cunix2/libft/src/ft_memset.c @@ -0,0 +1,12 @@ +#include "../libft.h" + +void *ft_memset(void *destination, int c, size_t len) +{ + unsigned i = 0; + + while (i < len) + { + ((unsigned char *)destination)[i++] = (unsigned char)c; + } + return (destination); +} diff --git a/courses/cunix2/libft/src/ft_strcat.c b/courses/cunix2/libft/src/ft_strcat.c new file mode 100644 index 00000000..73a0aaab --- /dev/null +++ b/courses/cunix2/libft/src/ft_strcat.c @@ -0,0 +1,14 @@ +#include "../libft.h" + +char *ft_strcat(char *s1, const char *s2) +{ + int len = ft_strlen(s1); + int i = 0; + + while (s2[i] != 0) + { + s1[len++] = s2[i++]; + } + s1[len] = '\0'; + return (s1); +} diff --git a/courses/cunix2/libft/src/ft_strchr.c b/courses/cunix2/libft/src/ft_strchr.c new file mode 100644 index 00000000..889fa846 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strchr.c @@ -0,0 +1,19 @@ +#include "../libft.h" + +char *ft_strchr(const char *str, int c) +{ + size_t i = 0; + + while (i < ft_strlen(str)) + { + if (str[i] == (char)c) + { + return (&((char *)str)[i]); + } + else + { + i++; + } + } + return NULL; +} diff --git a/courses/cunix2/libft/src/ft_strcpy.c b/courses/cunix2/libft/src/ft_strcpy.c new file mode 100644 index 00000000..c90b2a06 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strcpy.c @@ -0,0 +1,14 @@ +#include "../libft.h" + +char *ft_strcpy(char *dst, const char *src) +{ + int i = 0; + + while (src[i] != 0) + { + dst[i] = src[i]; + i++; + } + dst[i] = '\0'; + return (dst); +} diff --git a/courses/cunix2/libft/src/ft_strdup.c b/courses/cunix2/libft/src/ft_strdup.c new file mode 100644 index 00000000..2a3eb0bd --- /dev/null +++ b/courses/cunix2/libft/src/ft_strdup.c @@ -0,0 +1,15 @@ +#include "../libft.h" + +char *strdup(const char *str) +{ + int len = ft_strlen(str); + char *cp = (char *)malloc(sizeof(char) * (len + 1)); + + for (int i = 0; i <= len; i++) + { + cp[i] = str[i]; + } + + return cp; +} + diff --git a/courses/cunix2/libft/src/ft_striter.c b/courses/cunix2/libft/src/ft_striter.c new file mode 100644 index 00000000..dee30be4 --- /dev/null +++ b/courses/cunix2/libft/src/ft_striter.c @@ -0,0 +1,17 @@ +#include "../libft.h" + +void ft_striter(char *s, void (*f)(char *)) +{ + unsigned int i; + + i = 0; + if(!s || !f) + { + return ; + } + while (s[i] != 0) + { + (*f)(&s[i++]); + } +} + diff --git a/courses/cunix2/libft/src/ft_strjoin.c b/courses/cunix2/libft/src/ft_strjoin.c new file mode 100644 index 00000000..2baf39d2 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strjoin.c @@ -0,0 +1,19 @@ +#include "../libft.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *res; + + if (s1 == NULL || s2 == NULL) + { + return NULL; + } + res = ft_strnew(ft_strlen(s1) + ft_strlen(s2)); + if (!res) + { + return NULL; + } + ft_strcpy(res, s1); + ft_strcat(res, s2); + return (res); +} diff --git a/courses/cunix2/libft/src/ft_strlen.c b/courses/cunix2/libft/src/ft_strlen.c new file mode 100644 index 00000000..1b824f2f --- /dev/null +++ b/courses/cunix2/libft/src/ft_strlen.c @@ -0,0 +1,12 @@ +unsigned int my_strlen(char *str) +{ + unsigned int strlen = 0; + + while (str[strlen] != '\0') + { + strlen++; + } + + return strlen; +} + diff --git a/courses/cunix2/libft/src/ft_strmap.c b/courses/cunix2/libft/src/ft_strmap.c new file mode 100644 index 00000000..26334ab6 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strmap.c @@ -0,0 +1,24 @@ +#include "../libft.h" + +char *ft_strmap(char const *s, char (*f)(char)) +{ + int i = 0; + char *res; + + if (!s || !f) + { + return NULL; + } + if (!(res = ft_strnew(ft_strlen(s)))) + { + return NULL; + } + ft_strcpy(res, s); + while (res[i]) + { + res[i] = f(res[i]); + i++; + } + return res; +} + diff --git a/courses/cunix2/libft/src/ft_strncmp.c b/courses/cunix2/libft/src/ft_strncmp.c new file mode 100644 index 00000000..5efa1c62 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strncmp.c @@ -0,0 +1,21 @@ +#include "../libft.h" + +int ft_strncmp(const char *str1, const char *str2, size_t n) +{ + size_t i = 0; + unsigned char *str1_cp = (unsigned char *)str1; + unsigned char *str2_cp = (unsigned char *)str2; + + while ((str1_cp[i] || str2_cp[i]) != 0 && i < n) + { + if (str1_cp[i] == str2_cp[i]) + { + i++; + } + else + { + return (str1_cp[i] - str2_cp[i]); + } + } + return 0; +} diff --git a/courses/cunix2/libft/src/ft_strnew.c b/courses/cunix2/libft/src/ft_strnew.c new file mode 100644 index 00000000..eda85b0a --- /dev/null +++ b/courses/cunix2/libft/src/ft_strnew.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +char *ft_strnew(size_t size) +{ + return ((char *)ft_memalloc(sizeof(char) * size + 1)); +} diff --git a/courses/cunix2/libft/src/ft_strnstr.c b/courses/cunix2/libft/src/ft_strnstr.c new file mode 100644 index 00000000..efe82adc --- /dev/null +++ b/courses/cunix2/libft/src/ft_strnstr.c @@ -0,0 +1,30 @@ +#include "../libft.h" + +char *ft_strnstr(const char *hay, const char *need, size_t len) +{ + size_t i = 0; + size_t j = 0; + char *s1 = (char *)hay; + char *s2 = (char *)need; + size_t n = ft_strlen(s2); + + if (s2[j] == 0) + { + return (&s1[i]); + } + + while (s1[i] != 0 && n <= len--) + { + j = 0; + while (s2[j] == s1[i + j]) + { + if (s2[j + 1] == '\0') + { + return (&s1[i]); + } + j++; + } + i++; + } + return (NULL); +} diff --git a/courses/cunix2/libft/src/ft_strrchr.c b/courses/cunix2/libft/src/ft_strrchr.c new file mode 100644 index 00000000..79531f8c --- /dev/null +++ b/courses/cunix2/libft/src/ft_strrchr.c @@ -0,0 +1,19 @@ +#include "../libft.h" + +char *ft_strrchr(const char *str, int c) +{ + int i = ft_strlen(str); + + while (i >= 0) + { + if (str[i] == (char)c) + { + return (&((char *)str)[i]); + } + else + { + i--; + } + } + return NULL; +} diff --git a/courses/cunix2/libft/src/ft_strsplit.c b/courses/cunix2/libft/src/ft_strsplit.c new file mode 100644 index 00000000..47cc5df9 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strsplit.c @@ -0,0 +1,40 @@ +#include "../libft.h" + +char **ft_strsplit(char const *s, char c) +{ + char **r; + size_t flag; + size_t index; + size_t i; + size_t start; + + if (!s) + { + return NULL; + } + if (!(r = (char **)ft_memalloc(sizeof(char *) * (ft_count(s, c) + 1)))) + { + return NULL; + } + flag = 0; + i = -1; + index = 0; + start = 0; + while (s[++i]) + { + if (s[i] == c && flag) + { + r[index++] = ft_strsub(s, start, i - start); + } + if (!flag && s[i] != c) + { + start = i; + } + flag = (s[i] == c) ? 0 : 1; + } + if (flag) + { + r[index] = ft_strsub(s, start, i - start); + } + return (r); +} diff --git a/courses/cunix2/libft/src/ft_strstr.c b/courses/cunix2/libft/src/ft_strstr.c new file mode 100644 index 00000000..96baea2c --- /dev/null +++ b/courses/cunix2/libft/src/ft_strstr.c @@ -0,0 +1,30 @@ +#include "../libft.h" + +char *ft_strstr(const char *haystack, const char *needle) +{ + int i = 0; + int j = 0; + + if (needle[j] == 0) + { + return (&((char *)haystack)[i]); + } + + while (haystack[i] != 0) + { + j = 0; + + while (needle[j] == haystack[i + j]) + { + if (needle[j + 1] == '\0') + { + return (&((char *)haystack)[i]); + } + + j++; + } + i++; + } + return (NULL); +} + diff --git a/courses/cunix2/libft/src/ft_strsub.c b/courses/cunix2/libft/src/ft_strsub.c new file mode 100644 index 00000000..790f3d91 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strsub.c @@ -0,0 +1,20 @@ +#include "../libft.h" + +char *ft_strsub(char const *s, unsigned int start, size_t len) +{ + char *res = ft_strnew(len); + size_t i = 0; + + if (!s || !res) + { + return NULL; + } + while (i < len) + { + res[i] = s[start]; + i++; + start++; + } + res[i] = '\0'; + return (res); +} diff --git a/courses/cunix2/libft/src/ft_strtrim.c b/courses/cunix2/libft/src/ft_strtrim.c new file mode 100644 index 00000000..a71f99b9 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strtrim.c @@ -0,0 +1,28 @@ +#include "../libft.h" + +char *ft_strtrim(char const *s) +{ + size_t i; + size_t j; + + if (!s) + { + return NULL; + } + i = 0; + j = ft_strlen(s); + while (ft_strwhitespace(s[i])) + { + i++; + } + while (ft_strwhitespace(s[j - 1])) + { + j--; + } + if (i > j) + { + j = i; + } + + return (ft_strsub(s, i, j - i)); +} diff --git a/courses/cunix2/libft/src/ft_strwhitespace.c b/courses/cunix2/libft/src/ft_strwhitespace.c new file mode 100644 index 00000000..6bd1bb22 --- /dev/null +++ b/courses/cunix2/libft/src/ft_strwhitespace.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int ft_strwhitespace(char c) +{ + return (c == 32 || c == '\n' || c == '\t'); +} diff --git a/courses/cunix2/libft/src/ft_tolower.c b/courses/cunix2/libft/src/ft_tolower.c new file mode 100644 index 00000000..1f988479 --- /dev/null +++ b/courses/cunix2/libft/src/ft_tolower.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int ft_tolower(int c) +{ + return (c >= 'A' && c <= 'Z') ? c += 32 : c; +} diff --git a/courses/cunix2/libft/src/ft_toupper.c b/courses/cunix2/libft/src/ft_toupper.c new file mode 100644 index 00000000..2c5df81f --- /dev/null +++ b/courses/cunix2/libft/src/ft_toupper.c @@ -0,0 +1,6 @@ +#include "../libft.h" + +int ft_toupper(int c) +{ + return (c >= 'a' && c <= 'z') ? c -= 32 : c; +}