-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_printf.c
More file actions
158 lines (148 loc) · 3.07 KB
/
Copy path_printf.c
File metadata and controls
158 lines (148 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "main.h"
#include <stdio.h>
/**
* _printf - a function to replicate the workings of printf
* @format : the string entered by the user
* Return: number of characters printed
*/
int _printf(const char *format, ...)
{
char letter;
int sum = 0;
va_list ap;
if (format == NULL)
return (0);
va_start(ap, format);
while (*format != '\0')
{
if (*format == '%')
{
format++;
switch (*format)
{
case 'd': /* print interger function */
sum += print_d(va_arg(ap, int));
format++;
break;
case 'i': /* print integer function */
sum += print_int(va_arg(ap, int));
format++;
break;
default: /* continue switch in next function */
letter = *format;
sum += _printf_specifier(letter, ap);
format++;
break;
} /* end of switch statement */
} /* end of if statement */
else
{
write(1, format, 1);
sum++;
format++;
} /* end of else statement */
} /* end of while loop */
va_end(ap);
return (sum);
}
/**
*print_unknown - printf unknown format specifiers
*@add: number of char printed
*@format: pointer to the format specifer
*Return: the number of char printed
*/
int print_unknown(char format)
{
int sum = 0;
sum += collab_putchar('%');
sum += collab_putchar(format);
return (sum);
}
/**
*_printf_specifier - printf unknown format specifiers
*@ap: the variable argument list containng arguments
*@format: pointer to the format specifer
*Return: the number of char printed
*/
int _printf_specifier(char format, va_list ap)
{
int sum = 0;
char c;
unsigned int ui;
void *vp;
switch (format)
{
case 'c': /* print character function */
c = (char)va_arg(ap, int);
write(1, &c, 1);
sum++;
break;
case 's': /* print string function */
sum += print_s(ap);
break;
case 'b': /* print binary function */
ui = va_arg(ap, unsigned int);
sum += print_b(ui);
break;
case '%': /* print % sign */
write(1, &format, 1);
sum++;
break;
case 'p': /* print pointer function */
vp = va_arg(ap, void *);
sum += print_pointer(vp);
format++;
break;
case 'x':
sum += print_hex(ap);
break;
case 'X':
ui = va_arg(ap, unsigned int);
sum += print_hex_more(ui);
break;
default:
sum += _printf_specifier2(format, ap);
break;
}
return (sum);
}
/**
*_printf_specifier2 - printf unknown format specifiers
*@ap: the variable argument list containng arguments
*@format: pointer to the format specifer
*Return: the number of char printed
*/
int _printf_specifier2(char format, va_list ap)
{
int sum = 0;
unsigned int ui;
char c;
switch (format)
{
case 'o':
ui = va_arg(ap, unsigned int);
sum += print_octal(ui);
break;
case 'r':
sum += print_rev(ap);
break;
case 'R':
sum += print_rot13(ap);
break;
case 'u':
ui = va_arg(ap, unsigned int);
sum += print_ui(ui);
break;
default:
/*sum += print_unknown(format);*/
c = '%';
if (format != '\0')
{
write(1, &c, 1);
write(1, &format, 1);
sum += 2;
}
break;
}
return (sum);
}