1
+ /* ************************************************************************** */
2
+ /* */
3
+ /* ::: :::::::: */
4
+ /* ft_snprintf.c :+: :+: :+: */
5
+ /* +:+ +:+ +:+ */
6
+ /* By: pchung <[email protected] > +#+ +:+ +#+ */
7
+ /* +#+#+#+#+#+ +#+ */
8
+ /* Created: 2025/03/09 10:34:37 by jidler #+# #+# */
9
+ /* Updated: 2025/03/09 14:06:22 by pchung ### ########.fr */
10
+ /* */
11
+ /* ************************************************************************** */
12
+
1
13
#include <stdarg.h>
14
+ #include <stddef.h>
2
15
#include <stdio.h>
3
16
#include <stdlib.h>
4
17
#include <unistd.h>
5
18
6
- int ft_vsnprintf (char * str , size_t size , const char * format , va_list args );
19
+ int handle_format (char specifier , va_list args , char * buffer ,
20
+ size_t buffer_size )
21
+ {
22
+ int len ;
23
+ const char * s ;
24
+ char c ;
7
25
8
- int ft_snprintf (char * str , size_t size , const char * format , ...)
26
+ len = 0 ;
27
+ if (specifier == 'd' )
28
+ len = snprintf (buffer , buffer_size , "%d" , va_arg (args , int ));
29
+ else if (specifier == 's' )
30
+ {
31
+ s = va_arg (args , const char * );
32
+ len = snprintf (buffer , buffer_size , "%s" , s );
33
+ }
34
+ else if (specifier == 'c' )
35
+ {
36
+ c = (char )va_arg (args , int );
37
+ len = snprintf (buffer , buffer_size , "%c" , c );
38
+ }
39
+ else
40
+ {
41
+ buffer [0 ] = specifier ;
42
+ buffer [1 ] = '\0' ;
43
+ len = 1 ;
44
+ }
45
+ return (len );
46
+ }
47
+
48
+ void append_buffer (char * str , size_t * j , size_t size , char * buffer )
9
49
{
10
- va_list args ;
11
- int len ;
50
+ size_t k ;
12
51
13
- va_start (args , format );
14
- len = ft_vsnprintf (str , size , format , args );
15
- va_end (args );
52
+ k = 0 ;
53
+ while (buffer [k ] && (* j ) < size - 1 )
54
+ {
55
+ str [* j ] = buffer [k ];
56
+ (* j )++ ;
57
+ k ++ ;
58
+ }
59
+ }
60
+
61
+ size_t process_format (const char * format , size_t * i , va_list args ,
62
+ char * buffer , size_t buffer_size )
63
+ {
64
+ int len ;
65
+
66
+ len = 0 ;
67
+ if (format [* i ] == '%' && format [* i + 1 ])
68
+ {
69
+ (* i )++ ;
70
+ len = handle_format (format [* i ], args , buffer , buffer_size );
71
+ }
72
+ else
73
+ {
74
+ buffer [0 ] = format [* i ];
75
+ buffer [1 ] = '\0' ;
76
+ len = 1 ;
77
+ }
16
78
return (len );
17
79
}
18
80
19
81
int ft_vsnprintf (char * str , size_t size , const char * format , va_list args )
20
82
{
21
- size_t i = 0 , j = 0 ;
22
- int len = 0 ;
83
+ size_t i ;
84
+ size_t j ;
85
+ int len ;
23
86
char buffer [64 ];
24
87
88
+ i = 0 ;
89
+ j = 0 ;
90
+ len = 0 ;
25
91
while (format [i ])
26
92
{
27
- if (format [i ] == '%' && format [i + 1 ])
28
- {
93
+ len += process_format (format , & i , args , buffer , sizeof (buffer ));
94
+ append_buffer (str , & j , size , buffer );
95
+ if (format [i ] != '%' )
29
96
i ++ ;
30
- if (format [i ] == 'd' ) // Handling %d (integer)
31
- {
32
- int num = va_arg (args , int );
33
- len += snprintf (buffer , sizeof (buffer ), "%d" , num );
34
- }
35
- else if (format [i ] == 's' ) // Handling %s (string)
36
- {
37
- const char * s = va_arg (args , const char * );
38
- len += snprintf (buffer , sizeof (buffer ), "%s" , s );
39
- }
40
- else if (format [i ] == 'c' ) // Handling %c (char)
41
- {
42
- char c = (char )va_arg (args , int );
43
- len += snprintf (buffer , sizeof (buffer ), "%c" , c );
44
- }
45
- else
46
- {
47
- buffer [0 ] = format [i ];
48
- buffer [1 ] = '\0' ;
49
- len += 1 ;
50
- }
51
- for (int k = 0 ; buffer [k ] && j < size - 1 ; k ++ , j ++ )
52
- str [j ] = buffer [k ];
53
- }
54
- else if (j < size - 1 )
55
- str [j ++ ] = format [i ], len ++ ;
56
- i ++ ;
57
97
}
58
98
if (size > 0 )
59
99
str [j ] = '\0' ;
60
100
return (len );
61
- }
101
+ }
102
+
103
+ int ft_snprintf (char * str , size_t size , const char * format , ...)
104
+ {
105
+ va_list args ;
106
+ int len ;
107
+
108
+ va_start (args , format );
109
+ len = ft_vsnprintf (str , size , format , args );
110
+ va_end (args );
111
+ return (len );
112
+ }
0 commit comments