#include "libft.h"
int ft_isalpha(int c)
{
return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}
#include "libft.h"
int ft_isdigit(int c)
{
if (c >= '0' && c <= '9')
return (1);
else
return (0);
}
#include "libft.h"
int ft_isalnum(int c)
{
return (ft_isdigit(c) || ft_isalpha(c));
}
#include "libft.h"
int ft_isascii(int c)
{
return (c >= 0 && c < 128);
}
#include "libft.h"
int ft_isprint(int c)
{
return (c >= 32 && c <= 126);
}
#include "libft.h"
size_t ft_strlen(const char *s)
{
size_t i;
i = 0;
while (s[i])
i++;
return (i);
}
#include "libft.h"
void *ft_memset(void *b, int c, size_t len)
{
char *str;
size_t i;
str = (unsigned char *)b;
i = 0;
while (i < len)
{
str[i] = (unsigned char)c;
i++;
}
return (b);
}
#include "libft.h"
void ft_bzero(void *s, size_t n)
{
char *str;
size_t i;
str = s;
i = 0;
while (i < n)
{
str[i] = 0;
i++;
}
}
#include "libft.h"
void *ft_memcpy(void *dst, const void *src, size_t n)
{
size_t i;
i = 0;
if (dst == src)
return (dst);
while (i < n)
{
((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
i++;
}
return (dst);
}
#include "libft.h"
void *ft_memmove(void *dst, const void *src, size_t len)
{
size_t i;
int pos;
i = 0;
if (src == NULL && dst == NULL)
return (dst);
if (dst < src)
{
while (i < len)
{
((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
i++;
}
}
else
{
while (i < len)
{
pos = len - 1 - i;
((unsigned char *)dst)[pos] = ((unsigned char *)src)[pos];
i++;
}
}
return (dst);
}
memory + move. 메모리를 이동
첫 번째 인자 void *dst 복사한 걸 붙여넣을 메모리를 가리키는 포인터 (목적지)
두 번째 인자 void *src 복사할 메모리를 가리키는 포인터 (출발지)
세 번째 인자 size_t len 복사할 바이트 길이
첫 번째 인자인 dst를 반환
src가 가리키는 메모리로부터 len 바이트 사이즈만큼 dst가 가리키는 메모리에 옮긴다. memcpy는 어딘가를 거치지 않고 바로 그 위치에 복사해서 붙여넣는 함수고, memmove는 복사할 것을 버퍼에 복사하고, 해당 위치에 가서 버퍼에 복사된 것을 붙여 넣는 식으로 구현되어 있다.
성능을 따지자면 memcpy가 버퍼를 거치지 않고 복사하기 때문에 좀 더 좋지만, 버퍼를 이용하는 memmove가 안정성이 더 뛰어나다.
정리: memmove 함수도 메모리를 src에서 dst로 len 길이만큼 복사하는 함수이다. 중간에 버퍼를 이용해서 복사를 하므로 안정성이 memcpy보다 뛰어나다.
#include "libft.h"
size_t ft_strlcpy(char *dst, const char *src, size_t size)
{
size_t i;
i = 0;
if (size > 0)
{
while (src[i] && i < (size - 1))
{
dst[i] = src[i];
i++;
}
dst[i] = 0;
}
while (src[i])
i++;
return (i);
}
#include "libft.h"
size_t ft_strlcat(char *dst, const char *src, size_t size)
{
size_t i;
size_t j;
size_t dst_len;
size_t src_len;
src_len = ft_strlen(src);
dst_len = ft_strlen(dst);
j = dst_len;
i = 0;
if (dst_len < size - 1 && size > 0)
{
while (src[i] && dst_len + i < size - 1)
{
dst[j] = src[i];
j++;
i++;
}
dst[j] = 0;
}
if (dst_len >= size)
dst_len = size;
return (dst_len + src_len);
}
#include "libft.h"
int ft_toupper(int c)
{
if (c >= 'a' && c <= 'z')
c -= 32;
return (c);
}
#include "libft.h"
int ft_tolower(int c)
{
if (c >= 'A' && c <= 'Z')
c += 32;
return (c);
}
#include "libft.h"
char *ft_strchr(const char *s, int c)
{
while (*s)
{
if (*s == (char)c)
return ((char *)s);
++s;
}
if (*s == (char)c)
return ((char *)s);
return (0);
}
#include "libft.h"
char *ft_strrchr(const char *s, int c)
{
int i;
i = 0;
while (s[i])
i++;
while (i >= 0)
{
if (s[i] == (char) c)
return ((char *)(s + i));
i--;
}
return (NULL);
}
#include "libft.h"
int ft_strncmp(const char *s1, const char *s2, size_t n)
{
size_t i;
i = 0;
while (i < n && (s1[i] != '\0' || s2[i] != '\0'))
{
if (s1[i] != s2[i])
return ((unsigned char)(s1[i]) - (unsigned char)(s2[i]));
i++;
}
return (0);
}
#include "libft.h"
void *ft_memchr(const void *s, int c, size_t n)
{
size_t i;
i = 0;
while (i < n)
{
if (((unsigned char *)s)[i] == (unsigned char)c)
return (&((char *)s)[i]);
i++;
}
return (0);
}
#include "libft.h"
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
size_t i;
i = 0;
while (i < n)
{
if (*(unsigned char *)(s1 + i) != *(unsigned char *)(s2 + i))
return (*(unsigned char *)(s1 + i) - *(unㄹsigned char *)(s2 + i));
i++;
}
return (0);
}
#include "libft.h"
char *ft_strnstr(const char *haystack, const char *needle, size_t len)
{
size_t i;
size_t j;
if (!haystack || !needle)
return (NULL);
if (!needle || !needle[0])
return ((char *)haystack);
i = 0;
while (haystack[i] && i < len)
{
j = 0;
while (haystack[i + j] && needle[j] && \
i + j < len && haystack[i + j] == needle[j])
j++;
if (!needle[j])
return ((char *)(haystack + i));
i++;
}
return (NULL);
}
#include "libft.h"
int ft_atoi(const char *str)
{
int minus;
long res;
minus = 1;
res = 0;
while ((9 <= *str && *str <= 13) || *str == ' ')
++str;
if (*str == '+' || *str == '-')
if (*str++ == '-')
minus *= -1;
while ('0' <= *str && *str <= '9')
{
res = res * 10 + (*str++ - '0');
if (res < 0)
return ((minus + 1) / -2);
}
return (res * minus);
}
#include "libft.h"
void *ft_calloc(size_t count, size_t size)
{
void *ptr;
ptr = (void *)malloc(count * size);
if (ptr == 0)
return (0);
ft_memset(ptr, 0, count * size);
return (ptr);
}
#include "libft.h"
char *ft_strdup(const char *s1)
{
char *str;
int i;
int len;
i = 0;
len = ft_strlen(s1);
str = (char *)malloc(sizeof(char) * (len + 1));
if (str == 0)
return (0);
while (i < len)
{
str[i] = s1[i];
i++;
}
str[i] = '\0';
return (str);
}
#include "libft.h"
char *ft_substr(char const *s, unsigned int start, size_t len)
{
size_t i;
size_t j;
char *str;
if(!s)
return(NULL);
str = (char *)malloc(sizeof(*s) * (len + 1));
if (!str)
return (NULL);
i = 0;
j = 0;
while (s[i])
{
if (i >= start && j < len)
{
str[j] = s[i];
j++;
}
i++;
}
str[j] = 0;
return (str);
}
#include "libft.h"
char *ft_strjoin(char const *s1, char const *s2)
{
char *str;
size_t i;
size_t j;
if (!s1 || !s2)
return (NULL);
str = (char *)malloc(sizeof(*s1) * (ft_strlen(s1) + ft_strlen(s2) + 1));
if (!str)
return (NULL);
i = 0;
j = 0;
while (s1[i])
{
str[j++] = s1[i];
i++;
}
i = 0;
while (s2[i])
{
str[j++] = s2[i];
i++;
}
str[j] = 0;
return (str);
}
#include "libft.h"
int char_in_set(char c, char const *set)
{
size_t i;
i = 0;
while (set[i])
{
if (set[i] == c)
return (1);
i++;
}
return (0);
}
char *ft_strtrim(char const *s1, char const *set)
{
char *str;
size_t i;
size_t start;
size_t end;
start = 0;
while (s1[start] && char_in_set(s1[start], set))
start++;
end = ft_strlen(s1);
while (end > start && char_in_set(s1[end - 1], set))
end--;
str = (char *)malloc(sizeof(*s1) * (end - start + 1));
if (!str)
return (NULL);
i = 0;
while (start < end)
start[i++] = s1[start++];
str[i] = 0;
return (str);
}
#include "libft.h"
// s 문자열에서 n+1만큼의 저장 공간을 할당하고 문자열을 저장하여 리턴
char *ft_strndup(const char *s, size_t n)
{
size_t i;
char *str;
i = 0;
str = NULL;
if (n == 0)
return (NULL);
str = (char *)malloc(sizeof(char) * (n + 1));
if (str == 0)
return (NULL);
while (i < n)
{
str[i] = s[i];
i++;
}
str[i] = '\0';
return (str);
}
// list 내부의 할당된 저장 공간들을 모두 free해주고 list도 free
char **ft_freeall(char **list)
{
size_t i;
i = 0;
while (list[i])
{
free(list[i]);
i++;
}
free(list);
return (NULL);
}
// 문자열 s를 c 문자를 기준으로 나누었을 때 총 몇 개의 저장 공간이 필요한지 구하는 함수
size_t ft_wordcount(char const *s, char c)
{
size_t size;
size_t i;
i = 0;
size = 0;
while (s[i] != '\0')
{
if ((i == 0 && s[i] != c) || \
(s[i] == c && s[i + 1] != '\0' && s[i + 1] != c))
size++;
i++;
}
return (size);
}
char **ft_split(char const *s, char c)
{
char **list;
size_t i;
size_t j;
size_t temp;
i = 0;
j = 0;
list = (char **)malloc(sizeof(char *) * (ft_wordcount(s, c) + 1));
if (!list)
return (NULL);
while (i < ft_wordcount(s, c) && s[j] != '\0')
{
while (s[j] == c)
j++;
save = j;
while (s[j] != c && s[j] != '\0')
j++;
list[i] = ft_strndup(&s[temp], j - temp);
if (list[i++] == 0)
return (ft_freeall(list));
}
list[i] = NULL;
return (list);
}
#include "libft.h"
static int ft_abs(int nbr)
{
if (nbr < 0)
return (-nbr);
else
return (nbr);
}
static void ft_strrev(char *str)
{
size_t len;
size_t i;
char tmp;
len = ft_strlen(str);
i = 0;
while (i < len / 2)
{
tmp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = tmp;
i++;
}
}
char *ft_itoa(int n)
{
char *str;
int minus;
size_t len;
minus = (n < 0);
str = ft_calloc(11 + minus, sizeof(*str));
if (!str)
return (NULL);
if (n == 0)
str[0] = '0';
len = 0;
while (n != 0)
{
str[len++] = '0' + ft_abs(n % 10);
n = (n / 10);
}
if (minus)
str[len] = '-';
ft_strrev(str);
return (str);
}
#include "libft.h"
char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
{
char *str;
size_t i;
str = ft_strdup(s);
if (!str)
return (NULL);
i = 0;
while (str[i])
{
str[i] = (*f)(i, str[i]);
i++;
}
return (str);
}
#include "libft.h"
void ft_striteri(char *s, void (*f)(unsigned int, char*))
{
int i;
if (!s || !f)
return ;
i = 0;
while (s[i])
{
f(i, &s[i]);
i++;
}
}
#include "libft.h"
void ft_putchar_fd(char c, int fd)
{
if (fd < 0)
return ;
write(fd, &c, 1);
}
#include "libft.h"
void ft_putstr_fd(char *s, int fd)
{
if (!s)
return ;
write(fd, s, ft_strlen(s));
}
#include "libft.h"
void ft_putendl_fd(char *s, int fd)
{
const char n1 = '\n';
if (fd < 0)
return ;
write(fd, s, ft_strlen(s));
write(fd, &n1, 1);
}
#include "libft.h"
void ft_putnbr_fd(int n, int fd)
{
char str;
if (fd < 0)
return ;
if (n == -2147483648)
{
write(fd, "-2147483648", 11);
return ;
}
else if (n < 0)
{
write(fd, "-", 1);
n = n * -1;
}
if (n >= 10)
{
ft_putnbr_fd(n / 10, fd);
str = '0' + (n % 10);
}
else if (n < 10)
str = '0' + n;
write(fd, &str, 1);
}