char *ft_substr(char const *s, unsigned int start, size_t len)
{
size_t i;
size_t j;
char *ans;
i = 0;
j = ft_strlen(s);
if (s == 0)
return (0);
if (j <= start)
return (ft_strdup(""));
j -= start;
if (j < len)
len = j;
ans = (char *)malloc(sizeof(char) * (len + 1));
if (ans == 0)
return (0);
while (i < len && s[start])
ans[i++] = s[start++];
ans[i] = 0;
return (ans);
}
char *ft_strjoin(char const *s1, char const *s2)
{
char *ans;
size_t i;
size_t j;
if (s1 == 0 || s2 == 0)
return (0);
ans = (char *)malloc(sizeof(char) * (ft_strlen(s1) + ft_strlen(s2) + 1));
if (ans == 0)
return (0);
i = 0;
while (i < ft_strlen(s1))
{
ans[i] = s1[i];
i++;
}
j = 0;
while (j < ft_strlen(s2))
{
ans[i + j] = s2[j];
j++;
}
ans[i + j] = 0;
return (ans);
}
char *ft_strtrim(char const *s1, char const *set)
{
size_t start;
size_t end;
start = 0;
end = ft_strlen(s1) - 1;
if (s1 == 0 || set == 0)
return (0);
while (s1[start] && ft_strchr(set, s1[start]))
start++;
if (start >= end)
return (ft_strdup(""));
while (end > start && ft_strchr(set, s1[end]))
end--;
return (ft_substr(s1, start, (end - start + 1)));
}
static size_t word_cnt(char const *s, char c)
{
size_t i;
size_t cnt;
cnt = 0;
i = 0;
while (s[i])
{
if (s[i] != c)
{
cnt++;
while (s[i] != c && s[i])
i++;
}
else
i++;
}
return (cnt);
}
static char *ft_strndup(const char *s, size_t n)
{
size_t i;
char *s1;
i = 0;
s1 = 0;
if (n == 0)
return (0);
s1 = (char *)malloc(sizeof(char) * n + 1);
if (s1 == 0)
return (0);
while (i < n)
{
s1[i] = s[i];
i++;
}
s1[i] = 0;
return (s1);
}
static char **free_thing(char **ans)
{
size_t i;
i = 0;
while (ans[i])
{
free(ans[i]);
i++;
}
free(ans);
return (0);
}
char **ft_split(char const *s, char c)
{
size_t i;
size_t j;
size_t temp;
char **ans;
if (s == 0)
return (0);
ans = (char **)malloc(sizeof(char *) * (word_cnt(s, c) + 1));
if (ans == 0)
return (0);
i = 0;
j = 0;
while (i < word_cnt(s, c) && s[j] != 0)
{
while (s[j] == c)
j++;
temp = j;
while (s[j] != c && s[j] != 0)
j++;
ans[i] = ft_strndup(&s[temp], j - temp);
if (ans[i++] == 0)
return (free_thing(ans));
}
ans[i] = 0;
return (ans);
}
static size_t int_cnt(int n, size_t *sym)
{
size_t i;
*sym = 0;
i = 0;
if (n == 0)
return (1);
if (n < 0)
{
if (n == -2147483648)
return (11);
else
{
n = -n;
*sym = 1;
}
}
while (n)
{
n /= 10;
i++;
}
return (i + *sym);
}
static void str_fill(char *ans, size_t len, int n)
{
if (n == 0)
ans[0] = '0';
while (n)
{
ans[len - 1] = n % 10 + '0';
n /= 10;
len --;
}
}
char *ft_itoa(int n)
{
size_t len;
size_t sym;
char *ans;
len = int_cnt(n, &sym);
ans = malloc(sizeof(unsigned char) * len + 1);
if (ans == 0)
return (0);
ans[len] = 0;
if (n == -2147483648)
{
ans[10] = '8';
ans[0] = '-';
n = 214748364;
len--;
}
else if (sym == 1)
{
ans[0] = '-';
n = -n;
}
str_fill(ans, len, n);
return (ans);
}
char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
{
unsigned int len;
unsigned int i;
char *ans;
if (s == 0 || f == 0)
return (0);
len = (unsigned int)ft_strlen(s);
ans = (char *)malloc(sizeof(char) * len + 1);
if (ans == 0)
return (0);
i = 0;
while (i < len)
{
ans[i] = f(i, s[i]);
i++;
}
ans[len] = 0;
return (ans);
}
void ft_striteri(char *s, void (*f)(unsigned int, char *))
{
unsigned int len;
unsigned int i;
len = (unsigned int)ft_strlen(s);
i = 0;
while (i < len)
{
f(i, &s[i]);
i++;
}
}
파일식별자(file descriptor)란?
파일을 열었을 때 그 파일에 번호를 부여하는 것
0 | 1 | 2 |
---|---|---|
stdinput | stdoutput | stderr |