debut ecriture gestionlst
This commit is contained in:
205
ft_printf.c
205
ft_printf.c
@@ -1,83 +1,53 @@
|
|||||||
|
|
||||||
//#include "ft_printf.h"
|
#include "ft_printf.h"
|
||||||
#include <libc.h>
|
|
||||||
|
|
||||||
typedef unsigned char *ta_list;
|
int ft_error(int i)
|
||||||
#define ta_start(list, param) (list = (((ta_list)¶m) + sizeof(param)))
|
|
||||||
#define ta_arg(list, type) (*(type *)((list += sizeof(type)) - sizeof(type)))
|
|
||||||
|
|
||||||
//int ft_printf(char *string, ...)
|
|
||||||
int ft_printf(int num, ...)
|
|
||||||
{
|
{
|
||||||
// ta_list ap;
|
if (i == 0)
|
||||||
char *arg;
|
return (1);
|
||||||
// int d;
|
return (0);
|
||||||
// char c;
|
}
|
||||||
// char *s;
|
|
||||||
|
|
||||||
arg = (char *)#
|
t_list *ft_store(char *str)
|
||||||
arg++;
|
{
|
||||||
printf("%s\n", arg);
|
t_prist *arglst;
|
||||||
/* while (*arg != '\0')
|
t_list *lst;
|
||||||
arg++;
|
char *tmp;
|
||||||
arg += 1;
|
|
||||||
//arg = (((char*)&string) + sizeof(string));
|
//str = "truc: %i, machins:%s\n"
|
||||||
//ta_start(ap, string);
|
while (*str != '\0')
|
||||||
|
{
|
||||||
|
(*arglst) = (t_prist *)malloc(sizeof(*arglst));
|
||||||
|
lst = ft_lstadd_back(&lst, arglst);
|
||||||
|
if (tmp = strchr(str,%))
|
||||||
|
tmp[0] = '\0'
|
||||||
|
(*arglst)->str = ft_strdup(str);
|
||||||
|
...fill_flag...;
|
||||||
|
if (tmp != NULL)
|
||||||
|
tmp[0] = '%';
|
||||||
|
str = tmp;
|
||||||
|
}
|
||||||
|
return (*arglst);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ft_printf(char *string, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
t_list *lst;
|
||||||
|
|
||||||
|
va_start(ap, string);
|
||||||
|
lst = ft_store(string);
|
||||||
while (*string != '\0')
|
while (*string != '\0')
|
||||||
{
|
{
|
||||||
if (*string == 's')
|
if (*string == 's')
|
||||||
{
|
printf("string %s\n", va_arg(ap, char *));
|
||||||
//s = ta_arg(ap, char *);
|
|
||||||
s = (char *)arg;
|
|
||||||
printf("string '%s'\n", s);
|
|
||||||
// while (*arg != '\0')
|
|
||||||
// {
|
|
||||||
// printf(" '%1$i%1$c' ", *arg);
|
|
||||||
// arg++;
|
|
||||||
// }
|
|
||||||
// printf(" '%1$i%1$c' ", *arg);
|
|
||||||
arg += sizeof(char *);
|
|
||||||
// printf(" '%1$i%1$c' \n", *arg);
|
|
||||||
//arg += sizeof(char *);
|
|
||||||
}
|
|
||||||
if (*string == 'd')
|
if (*string == 'd')
|
||||||
{
|
printf("int %d\n", va_arg(ap, int));
|
||||||
//d = ta_arg(ap, int);
|
|
||||||
d = (int)(*arg);
|
|
||||||
printf("int %d\n", d);
|
|
||||||
}
|
|
||||||
if (*string == 'c')
|
if (*string == 'c')
|
||||||
{
|
printf("char %c\n", va_arg(ap, int));
|
||||||
//c = ta_arg(ap, int);
|
|
||||||
//c = (char)(*arg);
|
|
||||||
printf("char %s\n", arg);
|
|
||||||
}
|
|
||||||
string++;
|
string++;
|
||||||
}*/
|
}
|
||||||
|
va_end(ap);
|
||||||
// va_list ap;
|
|
||||||
//
|
|
||||||
// va_start(ap, string);
|
|
||||||
// while (*string != '\0')
|
|
||||||
// {
|
|
||||||
// if (*string == 's')
|
|
||||||
// {
|
|
||||||
// s = va_arg(ap, char *);
|
|
||||||
// printf("string %s\n", s);
|
|
||||||
// }
|
|
||||||
// if (*string == 'd')
|
|
||||||
// {
|
|
||||||
// d = va_arg(ap, int);
|
|
||||||
// printf("int %d\n", d);
|
|
||||||
// }
|
|
||||||
// if (*string == 'c')
|
|
||||||
// {
|
|
||||||
// c = va_arg(ap, int);
|
|
||||||
// printf("char %c\n", c);
|
|
||||||
// }
|
|
||||||
// string++;
|
|
||||||
// }
|
|
||||||
// va_end(ap);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +63,7 @@ int main(void)
|
|||||||
str = "bravo";
|
str = "bravo";
|
||||||
i = 6;
|
i = 6;
|
||||||
printf("%s-%s-%c-%i\n\n", s, str, c, i);
|
printf("%s-%s-%c-%i\n\n", s, str, c, i);
|
||||||
ft_printf(4, s, c, str, i);
|
ft_printf(s, c, str, i);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,43 +78,80 @@ conversions : nfge
|
|||||||
% [flags 0,- ][width *][.precision *] [specifier d,i,u,x,X,c,s,p,% ]
|
% [flags 0,- ][width *][.precision *] [specifier d,i,u,x,X,c,s,p,% ]
|
||||||
% [flags #,', ,+] [length hh,h,ll,l ][specifier e,f,g,n ]
|
% [flags #,', ,+] [length hh,h,ll,l ][specifier e,f,g,n ]
|
||||||
|
|
||||||
|
int flag: pw+ '#-0
|
||||||
|
00000000 00000000 00000000 00000001 == 1 '0'
|
||||||
|
00000000 00000000 00000000 00000010 == 2 '-'
|
||||||
|
00000000 00000000 00000000 00000100 == 4 '#'
|
||||||
|
00000000 00000000 00000000 00001000 == 8 '''
|
||||||
|
00000000 00000000 00000000 00010000 == 16 ' '
|
||||||
|
00000000 00000000 00000000 00100000 == 32 '+'
|
||||||
|
00000000 00000000 00000000 01000000 == 64 '*' width
|
||||||
|
00000000 00000000 00000000 10000000 == 128 '*' precision
|
||||||
|
|
||||||
typedef struct s_prist
|
typedef struct s_prist
|
||||||
{
|
{
|
||||||
int print_nbr;
|
char *str;
|
||||||
int arg_nbr;
|
int flag; // default 0 ; [0-#' +**] binary
|
||||||
int flag; //[0-#' +*] binary
|
int width; // default 0 ;
|
||||||
int width;
|
int prec; // default 0 ; precision
|
||||||
int precision;
|
char *length; // default "\0" ;
|
||||||
char *length;
|
char spec; // default 0 ; specifier
|
||||||
char specifier;
|
char *arg; // default "\0" ;
|
||||||
char *arg;
|
int p_nb; // default 0 ; print_nb : order in which to print (order it was found in string)
|
||||||
|
int a_nb; // default 0 ; arg_nb : number of the corresponding argument (for flag $)
|
||||||
struct s_prist *next;
|
struct s_prist *next;
|
||||||
} t_prist;
|
} t_prist;
|
||||||
|
|
||||||
("2 1 3 4 3", 1, 2, 3, 4)
|
("2 1 3 4 3", 1, 2, 3, 4)
|
||||||
|
|
||||||
ft_store
|
ft_error(int err)
|
||||||
for each : ft_check_error
|
ft_store("%i truc %-10d machin\n")
|
||||||
{{printf_nbr 1; arg_nbr 2; flag; width; precision; length; specifier},
|
ft_split_print(str)
|
||||||
{printf_nbr 2; arg_nbr 1; flag; width; precision; length; specifier},
|
prist->str = "%i";
|
||||||
{printf_nbr 3; arg_nbr 3; flag; width; precision; length; specifier},
|
ft_fill_lst(prist)
|
||||||
{printf_nbr 4; arg_nbr 4; flag; width; precision; length; specifier},
|
prist->flag; // default = 0
|
||||||
{printf_nbr 5; arg_nbr 3; flag; width; precision; length; specifier}}
|
prist->width; // default = 0
|
||||||
|
prist->prec; // default = 0
|
||||||
|
prist->length;
|
||||||
|
prist->spec;
|
||||||
|
prist->p_nb;
|
||||||
|
prist->a_nb; // if not $ == p_nb
|
||||||
|
prist->str = " truc ";
|
||||||
|
ft_fill_lst(prist)
|
||||||
|
... // if str start without % it means it can be printed as a string directly
|
||||||
|
prist->str = "%-10d";
|
||||||
|
ft_fill_lst...
|
||||||
|
prist->str = " machin\n";
|
||||||
|
ft_fill_lst...
|
||||||
|
return
|
||||||
|
{{str; flag; width; precision; length; specifier; p_nb 1; a_nb 2},
|
||||||
|
{str; flag; width; precision; length; specifier; p_nb 2; a_nb 1},
|
||||||
|
{str; flag; width; precision; length; specifier; p_nb 3; a_nb 3},
|
||||||
|
{str; flag; width; precision; length; specifier; p_nb 4; a_nb 4},
|
||||||
|
{str; flag; width; precision; length; specifier; p_nb 5; a_nb 3}}
|
||||||
|
|
||||||
ft_sort_by_arg
|
ft_sort_by_arg
|
||||||
{{printf_nbr 2; arg_nbr 1; flag; width; precision; length; specifier},
|
{{str; flag; width; precision; length; specifier; p_nb 2; a_nb 1},
|
||||||
{printf_nbr 1; arg_nbr 2; flag; width; precision; length; specifier},
|
{str; flag; width; precision; length; specifier; p_nb 1; a_nb 2},
|
||||||
{printf_nbr 3; arg_nbr 3; flag; width; precision; length; specifier},
|
{str; flag; width; precision; length; specifier; p_nb 3; a_nb 3},
|
||||||
{printf_nbr 5; arg_nbr 3; flag; width; precision; length; specifier},
|
{str; flag; width; precision; length; specifier; p_nb 5; a_nb 3},
|
||||||
{printf_nbr 4; arg_nbr 4; flag; width; precision; length; specifier}}
|
{str; flag; width; precision; length; specifier; p_nb 4; a_nb 4}}
|
||||||
|
|
||||||
ft_add_arg
|
ft_add_arg
|
||||||
if flag == * >> rerun for next argument but same list element
|
if lst->str[o] != '\%' rerun without looking for argument
|
||||||
if lst->next->arg == lst->arg rerun for next list element but same argument
|
if lst->flag == * rerun for next argument but same list element
|
||||||
{{printf_nbr 2; arg_nbr 1; flag; width; precision; length; specifier; arg},
|
[fl][w][p] or or
|
||||||
{printf_nbr 1; arg_nbr 2; flag; width; precision; length; specifier; arg},
|
%i ,1 -> '1' [] [0][0] [ ][0][0] [] [0][0]
|
||||||
{printf_nbr 3; arg_nbr 3; flag; width; precision; length; specifier; arg},
|
%*i ,3,1 -> ' 1' [*] [0][0] [* ][0][0] [w] [0][0]
|
||||||
{printf_nbr 5; arg_nbr 3; flag; width; precision; length; specifier; arg},
|
%.*i ,2,1 -> '01' [*] [0][0] [ *][0][0] [p] [0][0]
|
||||||
{printf_nbr 4; arg_nbr 4; flag; width; precision; length; specifier; arg}}
|
%*.*i ,3,2,1 -> ' 01' [**][0][0] [**][0][0] [wp][0][0]
|
||||||
|
%3.*i ,2,1 -> ' 01' [*] [3][0] [ *][3][0] [p] [3][0]
|
||||||
|
%*.2i ,3,1 -> ' 01' [*] [0][2] [* ][0][2] [w] [0][2]
|
||||||
|
%3.2i ,1 -> ' 01' [] [3][2] [ ][3][2] [] [3][2]
|
||||||
|
if lst->next->a_nb == lst->a_nb rerun for next list element but same argument
|
||||||
|
{{str; flag; width; precision; length; specifier; arg; p_nb 2; a_nb 1},
|
||||||
|
{str; flag; width; precision; length; specifier; arg; p_nb 1; a_nb 2},
|
||||||
|
{str; flag; width; precision; length; specifier; arg; p_nb 3; a_nb 3},
|
||||||
|
{str; flag; width; precision; length; specifier; arg; p_nb 5; a_nb 3},
|
||||||
|
{str; flag; width; precision; length; specifier; arg; p_nb 4; a_nb 4}}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -8,14 +8,15 @@ int ft_printf(char *string, ...);
|
|||||||
|
|
||||||
typedef struct s_prist
|
typedef struct s_prist
|
||||||
{
|
{
|
||||||
int print_nbr;
|
char *str;
|
||||||
int arg_nbr;
|
|
||||||
int flag;
|
int flag;
|
||||||
int width;
|
int width;
|
||||||
int precision;
|
int prec;
|
||||||
char *length;
|
char *length;
|
||||||
char specifier;
|
char spec;
|
||||||
char *arg;
|
char *arg;
|
||||||
|
int p_nb;
|
||||||
|
int a_nb;
|
||||||
struct s_prist *next;
|
struct s_prist *next;
|
||||||
} t_prist;
|
} t_prist;
|
||||||
|
|
||||||
|
|||||||
1
libft
Submodule
1
libft
Submodule
Submodule libft added at e9c7619e97
9
main.c
9
main.c
@@ -198,6 +198,12 @@ int main(void)
|
|||||||
// printf("(\"%%.*i-%%.*i\",0,1,2,3) ft : "); ft_printf("'%.*i-%.*i'\n", 0, 1, 2, 3);
|
// printf("(\"%%.*i-%%.*i\",0,1,2,3) ft : "); ft_printf("'%.*i-%.*i'\n", 0, 1, 2, 3);
|
||||||
printf("(\"%%.*i-%%.*i\",0,1,2,3) : "); printf("'%.*i-%.*i'\n", 0, 1, 2, 3); printf("\n");
|
printf("(\"%%.*i-%%.*i\",0,1,2,3) : "); printf("'%.*i-%.*i'\n", 0, 1, 2, 3); printf("\n");
|
||||||
|
|
||||||
|
// printf("(\"%%3.2i\",1) ft : "); ft_printf("'%3.2i'\n", 1);
|
||||||
|
printf("(\"%%3.2i\",1) : "); printf("'%3.2i'\n", 1); printf("\n");
|
||||||
|
|
||||||
|
// printf("(\"%%*.*i\",3,2,1) ft : "); ft_printf("'%*.*i'\n", 3, 2, 1);
|
||||||
|
printf("(\"%%*.*i\",3,2,1) : "); printf("'%*.*i'\n", 3, 2, 1); printf("\n");
|
||||||
|
|
||||||
|
|
||||||
// printf("-----------------------------------------------\n");
|
// printf("-----------------------------------------------\n");
|
||||||
// printf("- BONUS -\n");
|
// printf("- BONUS -\n");
|
||||||
@@ -262,6 +268,9 @@ int main(void)
|
|||||||
// printf("(\"%%\",8645) ft : "); ft_printf("'%'", 8645);
|
// printf("(\"%%\",8645) ft : "); ft_printf("'%'", 8645);
|
||||||
printf("(\"%%\",8645) : ");/* printf("'%'", 8645);*/ printf(" missing conversion specifier\n\n");
|
printf("(\"%%\",8645) : ");/* printf("'%'", 8645);*/ printf(" missing conversion specifier\n\n");
|
||||||
|
|
||||||
|
// printf("(\"%%2$i-%%i\",3,2) ft : "); ft_printf("'%2$i-%i'\n", 3, 2);
|
||||||
|
printf("(\"%%2$i-%%i\",3,2) : ");/* printf("'%2$i-%i'", 3, 2);*/ printf(" cannot mix positioned and non-positioned args\n\n");
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
34
test.c
Normal file
34
test.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int ft_printf(char *string, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int d;
|
||||||
|
char c;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
va_start(ap, string);
|
||||||
|
while (*string != '\0')
|
||||||
|
{
|
||||||
|
if (*string == 's')
|
||||||
|
s = va_arg(ap, char *);
|
||||||
|
if (*string == 'd')
|
||||||
|
d = va_arg(ap, int);
|
||||||
|
if (*string == 'c')
|
||||||
|
c = va_arg(ap, int);
|
||||||
|
string++;
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
char *s = "csd";
|
||||||
|
char *str = "bravo";
|
||||||
|
char c = 'p';
|
||||||
|
int i = 9;
|
||||||
|
|
||||||
|
ft_printf(s, c, str, i);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user