new printf version, path manipulation
This commit is contained in:
parent
d71c3f8b8a
commit
d55abac64b
11 changed files with 142 additions and 94 deletions
|
|
@ -3,7 +3,21 @@
|
||||||
# include "libft.h"
|
# include "libft.h"
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
# define ALL_FLAGS "#0- +"
|
# define ALL_FLAGS "#0- +"
|
||||||
# define ALL_CONVERSIONS "sSpdDioOuUxXcC"
|
# define ALL_CONVERSIONS "sSpdDioOuUxXcCb"
|
||||||
|
|
||||||
|
typedef struct s_fmt t_fmt;
|
||||||
|
|
||||||
|
typedef char *(t_converter)(t_fmt *fmt, va_list ap);
|
||||||
|
typedef void (t_sharp_func)(char *str, t_fmt *fmt);
|
||||||
|
|
||||||
|
typedef struct s_conv
|
||||||
|
{
|
||||||
|
char id;
|
||||||
|
char allowed_flags[6];
|
||||||
|
char base[20];
|
||||||
|
t_converter *converter;
|
||||||
|
t_sharp_func *sharp_func;
|
||||||
|
} t_conv;
|
||||||
|
|
||||||
typedef struct s_fmt
|
typedef struct s_fmt
|
||||||
{
|
{
|
||||||
|
|
@ -13,25 +27,21 @@ typedef struct s_fmt
|
||||||
char modifier[3];
|
char modifier[3];
|
||||||
char conversion;
|
char conversion;
|
||||||
int valid;
|
int valid;
|
||||||
|
t_conv conv;
|
||||||
} t_fmt;
|
} t_fmt;
|
||||||
|
|
||||||
typedef char *(*t_converter)(t_fmt *fmt, va_list ap);
|
|
||||||
|
|
||||||
typedef struct s_conv
|
|
||||||
{
|
|
||||||
char id;
|
|
||||||
char base[20];
|
|
||||||
t_converter converter;
|
|
||||||
char allowed_flags[6];
|
|
||||||
} t_conv;
|
|
||||||
|
|
||||||
extern t_conv g_convs[];
|
extern t_conv g_convs[];
|
||||||
|
|
||||||
t_fmt *ft_fmt_init(void);
|
t_fmt *ft_fmt_init(void);
|
||||||
void ft_fmt_print(t_fmt *fmt);
|
void ft_fmt_print(t_fmt *fmt);
|
||||||
|
|
||||||
|
t_fmt *ft_parse(char **format, va_list ap);
|
||||||
|
void ft_parse_flags(t_fmt *fmt, char **format);
|
||||||
|
void ft_parse_width(t_fmt *fmt, char **format, va_list ap);
|
||||||
|
void ft_parse_precision(t_fmt *fmt, char **format, va_list ap);
|
||||||
|
void ft_parse_modifiers(t_fmt *fmt, char **format);
|
||||||
|
|
||||||
int ft_printf(const char *format, ...);
|
int ft_printf(const char *format, ...);
|
||||||
t_fmt *ft_parse(char **format);
|
|
||||||
char *ft_transform(t_fmt *fmt, va_list ap);
|
char *ft_transform(t_fmt *fmt, va_list ap);
|
||||||
|
|
||||||
void ft_fmt_error_conv(char conv);
|
void ft_fmt_error_conv(char conv);
|
||||||
|
|
@ -49,9 +59,9 @@ char *ft_unsigned_conversion(t_fmt *fmt, va_list ap);
|
||||||
char *ft_str_conversion(t_fmt *fmt, va_list ap);
|
char *ft_str_conversion(t_fmt *fmt, va_list ap);
|
||||||
char *ft_char_conversion(t_fmt *fmt, va_list ap);
|
char *ft_char_conversion(t_fmt *fmt, va_list ap);
|
||||||
|
|
||||||
|
void ft_pad_sharp_o(char *str, t_fmt *fmt);
|
||||||
|
void ft_pad_sharp_xb(char *str, t_fmt *fmt);
|
||||||
|
|
||||||
void ft_pad_left(char *str, t_fmt *fmt);
|
void ft_pad_left(char *str, t_fmt *fmt);
|
||||||
void ft_pad_right(char *str, t_fmt *fmt);
|
void ft_pad_right(char *str, t_fmt *fmt);
|
||||||
void ft_pad_sharp_o(char *str);
|
|
||||||
void ft_pad_sharp_x(char *str, t_fmt *fmt);
|
|
||||||
void ft_pad_sharp(char *str, t_fmt *fmt);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -119,4 +119,6 @@ size_t ft_uilen(unsigned int n);
|
||||||
int ft_time_isrecent(time_t event);
|
int ft_time_isrecent(time_t event);
|
||||||
int ft_xattr_print(char *path);
|
int ft_xattr_print(char *path);
|
||||||
int ft_xattr_count(char *path);
|
int ft_xattr_count(char *path);
|
||||||
|
|
||||||
|
char *ft_path_notdir(char *path);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -51,5 +51,7 @@ char *ft_str_conversion(t_fmt *fmt, va_list ap)
|
||||||
/* if (ft_strcmp(fmt->modifier, "l") == 0) */
|
/* if (ft_strcmp(fmt->modifier, "l") == 0) */
|
||||||
/* va_arg(ap, wchar_t *); */
|
/* va_arg(ap, wchar_t *); */
|
||||||
ret = ft_strdup(va_arg(ap, char *));
|
ret = ft_strdup(va_arg(ap, char *));
|
||||||
|
if (fmt->precision && fmt->precision < (int)ft_strlen(ret))
|
||||||
|
ret[fmt->precision] = '\0';
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,25 @@
|
||||||
#include "ftprintf.h"
|
#include "ftprintf.h"
|
||||||
|
|
||||||
|
t_fmt *ft_parse(char **format, va_list ap)
|
||||||
|
{
|
||||||
|
t_fmt *fmt;
|
||||||
|
|
||||||
|
fmt = ft_fmt_init();
|
||||||
|
ft_parse_flags(fmt, format);
|
||||||
|
ft_parse_width(fmt, format, ap);
|
||||||
|
ft_parse_precision(fmt, format, ap);
|
||||||
|
ft_parse_modifiers(fmt, format);
|
||||||
|
fmt->conversion = **format;
|
||||||
|
(*format)++;
|
||||||
|
ft_fmt_validate_mod(fmt);
|
||||||
|
ft_fmt_validate_flags(fmt);
|
||||||
|
ft_fmt_simplify(fmt);
|
||||||
|
fmt->valid = ft_fmt_validate_conversion(fmt) ? 0 : 1;
|
||||||
|
|
||||||
|
/* ft_fmt_print(fmt); */
|
||||||
|
return (fmt);
|
||||||
|
}
|
||||||
|
|
||||||
void ft_parse_flags(t_fmt *fmt, char **format)
|
void ft_parse_flags(t_fmt *fmt, char **format)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -24,31 +44,60 @@ void ft_parse_flags(t_fmt *fmt, char **format)
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_parse_nums(t_fmt *fmt, char **format)
|
void ft_parse_width(t_fmt *fmt, char **format, va_list ap)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char buf[10];
|
char buf[10];
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
str = *format;
|
str = *format;
|
||||||
ft_strcpy(buf, "0");
|
if (str[i] == '*')
|
||||||
while (ft_isdigit((int)(str[i])))
|
|
||||||
ft_strncat(buf, str + i++, 1);
|
|
||||||
fmt->width = ft_atoi(buf);
|
|
||||||
ft_strcpy(buf, "0");
|
|
||||||
if (str[i] == '.')
|
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
while (ft_isdigit(str[i]))
|
fmt->width = va_arg(ap, int);
|
||||||
ft_strncat(buf, str + i++, 1);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ft_strcpy(buf, "0");
|
||||||
|
while (ft_isdigit((int)(str[i])))
|
||||||
|
ft_strncat(buf, str + i++, 1);
|
||||||
|
fmt->width = ft_atoi(buf);
|
||||||
}
|
}
|
||||||
fmt->precision = ft_atoi(buf);
|
|
||||||
*format += i;
|
*format += i;
|
||||||
|
/* printf("found width: %i\n", fmt->width); */
|
||||||
/* printf("\nparse_nums: %s\n", *format); */
|
/* printf("\nparse_nums: %s\n", *format); */
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ft_parse_precision(t_fmt *fmt, char **format, va_list ap)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char buf[10];
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
str = *format;
|
||||||
|
if (str[i] == '.')
|
||||||
|
{
|
||||||
|
if (str[++i] == '*')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
fmt->precision = va_arg(ap, int);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ft_strcpy(buf, "0");
|
||||||
|
while (ft_isdigit(str[i]))
|
||||||
|
ft_strncat(buf, str + i++, 1);
|
||||||
|
fmt->precision = ft_atoi(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* printf("found preci: %i\n", fmt->precision); */
|
||||||
|
*format += i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ft_parse_modifiers(t_fmt *fmt, char **format)
|
void ft_parse_modifiers(t_fmt *fmt, char **format)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
@ -72,24 +121,3 @@ void ft_parse_modifiers(t_fmt *fmt, char **format)
|
||||||
/* printf("\nparse_mods: %s\n", *format); */
|
/* printf("\nparse_mods: %s\n", *format); */
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
t_fmt *ft_parse(char **format)
|
|
||||||
{
|
|
||||||
t_fmt *fmt;
|
|
||||||
|
|
||||||
fmt = ft_fmt_init();
|
|
||||||
ft_parse_flags(fmt, format);
|
|
||||||
ft_parse_nums(fmt, format);
|
|
||||||
ft_parse_modifiers(fmt, format);
|
|
||||||
fmt->conversion = **format;
|
|
||||||
(*format)++;
|
|
||||||
|
|
||||||
ft_fmt_validate_mod(fmt);
|
|
||||||
ft_fmt_validate_flags(fmt);
|
|
||||||
ft_fmt_simplify(fmt);
|
|
||||||
fmt->valid = ft_fmt_validate_conversion(fmt) ? 0 : 1;
|
|
||||||
|
|
||||||
/* ft_fmt_print(fmt); */
|
|
||||||
return (fmt);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,15 @@
|
||||||
|
|
||||||
t_conv g_convs[] =
|
t_conv g_convs[] =
|
||||||
{
|
{
|
||||||
{'d', "0123456789", ft_signed_conversion, "0- +"},
|
{'d', "0- +", "0123456789", &ft_signed_conversion, NULL},
|
||||||
{'i', "0123456789", ft_signed_conversion, "0- +"},
|
{'i', "0- +", "0123456789", &ft_signed_conversion, NULL},
|
||||||
{'u', "0123456789", ft_unsigned_conversion, "#0-"},
|
{'u', "0-", "0123456789", &ft_unsigned_conversion, NULL},
|
||||||
{'o', "01234567", ft_unsigned_conversion, "#0-"},
|
{'o', "#0-", "01234567", &ft_unsigned_conversion, &ft_pad_sharp_o},
|
||||||
{'x', "0123456789abcdef", ft_unsigned_conversion, "#0-"},
|
{'x', "#0-", "0123456789abcdef", &ft_unsigned_conversion, &ft_pad_sharp_xb},
|
||||||
{'X', "0123456789ABCDEF", ft_unsigned_conversion, "#0-"},
|
{'X', "#0-", "0123456789ABCDEF", &ft_unsigned_conversion, &ft_pad_sharp_xb},
|
||||||
{'s', "", ft_str_conversion, "-"},
|
{'b', "#0-", "01", &ft_unsigned_conversion, &ft_pad_sharp_xb},
|
||||||
{'c', "", ft_char_conversion, "-"},
|
{'s', "-", "", &ft_str_conversion, NULL},
|
||||||
|
{'c', "-", "", &ft_char_conversion, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int ft_printf(const char *format, ...)
|
int ft_printf(const char *format, ...)
|
||||||
|
|
@ -22,13 +23,12 @@ int ft_printf(const char *format, ...)
|
||||||
va_start(ap1, format);
|
va_start(ap1, format);
|
||||||
str = ft_strdup(format);
|
str = ft_strdup(format);
|
||||||
ft_bzero(final, 1000);
|
ft_bzero(final, 1000);
|
||||||
/* ft_putendl(format); */
|
|
||||||
while (*str)
|
while (*str)
|
||||||
{
|
{
|
||||||
if (*str == '%')
|
if (*str == '%')
|
||||||
{
|
{
|
||||||
str++;
|
str++;
|
||||||
if (!(fmt = ft_parse(&str)))
|
if (!(fmt = ft_parse(&str, ap1)))
|
||||||
return (1);
|
return (1);
|
||||||
if (!fmt->valid)
|
if (!fmt->valid)
|
||||||
ft_strncat(final, &fmt->conversion, 1);
|
ft_strncat(final, &fmt->conversion, 1);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ char *ft_transform(t_fmt *fmt, va_list ap)
|
||||||
i = 0;
|
i = 0;
|
||||||
while (fmt->conversion != g_convs[i].id)
|
while (fmt->conversion != g_convs[i].id)
|
||||||
i++;
|
i++;
|
||||||
ret = (g_convs[i].converter)(fmt, ap);
|
fmt->conv = g_convs[i];
|
||||||
|
ret = (fmt->conv.converter)(fmt, ap);
|
||||||
if (fmt->width > (int)ft_strlen(ret))
|
if (fmt->width > (int)ft_strlen(ret))
|
||||||
{
|
{
|
||||||
buf = ret;
|
buf = ret;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
void ft_pad_right(char *str, t_fmt *fmt)
|
void ft_pad_right(char *str, t_fmt *fmt)
|
||||||
{
|
{
|
||||||
ft_pad_sharp(str, fmt);
|
if (strchr(fmt->flags, '#'))
|
||||||
|
(fmt->conv.sharp_func)(str, fmt);
|
||||||
while ((int)ft_strlen(str) < fmt->width)
|
while ((int)ft_strlen(str) < fmt->width)
|
||||||
ft_strcat(str, " ");
|
ft_strcat(str, " ");
|
||||||
}
|
}
|
||||||
|
|
@ -13,6 +14,7 @@ void ft_pad_left(char *str, t_fmt *fmt)
|
||||||
char sign;
|
char sign;
|
||||||
|
|
||||||
sign = '\0';
|
sign = '\0';
|
||||||
|
ft_bzero(buf, 100);
|
||||||
if (str[0] == '-' || str[0] == '+' || str[0] == ' ')
|
if (str[0] == '-' || str[0] == '+' || str[0] == ' ')
|
||||||
{
|
{
|
||||||
sign = str[0];
|
sign = str[0];
|
||||||
|
|
@ -29,7 +31,8 @@ void ft_pad_left(char *str, t_fmt *fmt)
|
||||||
}
|
}
|
||||||
if (sign)
|
if (sign)
|
||||||
str--;
|
str--;
|
||||||
ft_pad_sharp(str, fmt);
|
if (strchr(fmt->flags, '#'))
|
||||||
|
(fmt->conv.sharp_func)(str, fmt);
|
||||||
while ((int)ft_strlen(str) < fmt->width)
|
while ((int)ft_strlen(str) < fmt->width)
|
||||||
{
|
{
|
||||||
ft_strcpy(buf, " ");
|
ft_strcpy(buf, " ");
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
#include "ftprintf.h"
|
#include "ftprintf.h"
|
||||||
|
|
||||||
void ft_pad_sharp_o(char *str)
|
void ft_pad_sharp_o(char *str, t_fmt *fmt)
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
|
|
||||||
|
(void)fmt;
|
||||||
|
ft_bzero(buf, 100);
|
||||||
if (str[0] != '0')
|
if (str[0] != '0')
|
||||||
{
|
{
|
||||||
ft_strcpy(buf, "0");
|
ft_strcpy(buf, "0");
|
||||||
|
|
@ -12,31 +14,19 @@ void ft_pad_sharp_o(char *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_pad_sharp_x(char *str, t_fmt *fmt)
|
void ft_pad_sharp_xb(char *str, t_fmt *fmt)
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
|
int i;
|
||||||
|
|
||||||
if (str[1] == '0')
|
i = 0;
|
||||||
str[1] = fmt->conversion;
|
ft_bzero(buf, 100);
|
||||||
else
|
ft_strcpy(buf, "0");
|
||||||
{
|
ft_strcat(buf, &fmt->conversion);
|
||||||
ft_strcpy(buf, "0");
|
if (*str == '0')
|
||||||
if (str[0] == '0')
|
i++;
|
||||||
str[0] = fmt->conversion;
|
if (*str == '0')
|
||||||
else
|
i++;
|
||||||
ft_strcat(buf, &fmt->conversion);
|
ft_strcat(buf, str + i);
|
||||||
ft_strcat(buf, str);
|
ft_strcpy(str, buf);
|
||||||
ft_strcpy(str, buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ft_pad_sharp(char *str, t_fmt *fmt)
|
|
||||||
{
|
|
||||||
if (ft_strchr(fmt->flags, '#'))
|
|
||||||
{
|
|
||||||
if (fmt->conversion == 'x' || fmt->conversion == 'X')
|
|
||||||
ft_pad_sharp_x(str, fmt);
|
|
||||||
if (fmt->conversion == 'o')
|
|
||||||
ft_pad_sharp_o(str);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
libft/src/path/ft_path_notdir.c
Normal file
12
libft/src/path/ft_path_notdir.c
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include "libft.h"
|
||||||
|
|
||||||
|
char *ft_path_notdir(char *path)
|
||||||
|
{
|
||||||
|
char *slash;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
ret = path;
|
||||||
|
if ((slash = ft_strrchr(path, '/')))
|
||||||
|
ret = slash + 1;
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
@ -3,17 +3,15 @@
|
||||||
char *ft_strrchr(const char *s, int c)
|
char *ft_strrchr(const char *s, int c)
|
||||||
{
|
{
|
||||||
char *a;
|
char *a;
|
||||||
size_t i;
|
int i;
|
||||||
size_t len;
|
|
||||||
|
|
||||||
a = (char *)s;
|
a = (char *)s;
|
||||||
len = ft_strlen(a);
|
i = ft_strlen(a);
|
||||||
i = 0;
|
while (i >= 0)
|
||||||
while (i <= len)
|
|
||||||
{
|
{
|
||||||
if (a[len - i] == (char)c)
|
if (a[i] == (char)c)
|
||||||
return (a);
|
return (a + i);
|
||||||
i++;
|
i--;
|
||||||
}
|
}
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ int ft_xattr_count(char *path)
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
ft_bzero(list, FT_XATTR_SIZE);
|
||||||
|
/* printf("looking for xattr at: %s\n", path); */
|
||||||
listlen = listxattr(path, list, FT_XATTR_SIZE, XATTR_NOFOLLOW);
|
listlen = listxattr(path, list, FT_XATTR_SIZE, XATTR_NOFOLLOW);
|
||||||
if (listlen == -1)
|
if (listlen == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue