new printf version, path manipulation

This commit is contained in:
Jack Halford 2016-09-25 21:54:48 +02:00
parent d71c3f8b8a
commit d55abac64b
11 changed files with 142 additions and 94 deletions

View file

@ -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

View file

@ -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

View file

@ -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);
} }

View file

@ -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,7 +44,7 @@ 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];
@ -32,23 +52,52 @@ void ft_parse_nums(t_fmt *fmt, char **format)
i = 0; i = 0;
str = *format; str = *format;
if (str[i] == '*')
{
i++;
fmt->width = va_arg(ap, int);
}
else
{
ft_strcpy(buf, "0"); ft_strcpy(buf, "0");
while (ft_isdigit((int)(str[i]))) while (ft_isdigit((int)(str[i])))
ft_strncat(buf, str + i++, 1); ft_strncat(buf, str + i++, 1);
fmt->width = ft_atoi(buf); fmt->width = ft_atoi(buf);
ft_strcpy(buf, "0");
if (str[i] == '.')
{
i++;
while (ft_isdigit(str[i]))
ft_strncat(buf, str + i++, 1);
} }
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);
}

View file

@ -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);

View file

@ -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;

View file

@ -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, " ");

View file

@ -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_strcpy(buf, "0");
if (str[0] == '0')
str[0] = fmt->conversion;
else
ft_strcat(buf, &fmt->conversion); ft_strcat(buf, &fmt->conversion);
ft_strcat(buf, str); if (*str == '0')
i++;
if (*str == '0')
i++;
ft_strcat(buf, str + i);
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);
}
}

View 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);
}

View file

@ -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);
} }

View file

@ -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);