[Krafton Jungle] PintOS 2.0.0
크래프톤 정글 PintOS
 
Loading...
Searching...
No Matches
stdio.h File Reference
#include <debug.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
Include dependency graph for stdio.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define STDIN_FILENO   0
 
#define STDOUT_FILENO   1
 
#define sprintf   dont_use_sprintf_use_snprintf
 
#define vsprintf   dont_use_vsprintf_use_vsnprintf
 

Functions

int printf (const char *,...) PRINTF_FORMAT(1
 
int int snprintf (char *, size_t, const char *,...) PRINTF_FORMAT(3
 
int int int vprintf (const char *, va_list) PRINTF_FORMAT(1
 
int int int int vsnprintf (char *, size_t, const char *, va_list) PRINTF_FORMAT(3
 
int int int int int putchar (int)
 
int puts (const char *)
 
void hex_dump (uintptr_t ofs, const void *, size_t size, bool ascii)
 
void __vprintf (const char *format, va_list args, void(*output)(char, void *), void *aux)
 
void __printf (const char *format, void(*output)(char, void *), void *aux,...)
 

Macro Definition Documentation

◆ sprintf

#define sprintf   dont_use_sprintf_use_snprintf

◆ STDIN_FILENO

#define STDIN_FILENO   0

◆ STDOUT_FILENO

#define STDOUT_FILENO   1

◆ vsprintf

#define vsprintf   dont_use_vsprintf_use_vsnprintf

Function Documentation

◆ __printf()

void __printf ( const char *  format,
void(*)(char, void *)  output,
void *  aux,
  ... 
)
539 {
540 va_list args;
541
542 va_start (args, aux);
543 __vprintf (format, args, output, aux);
544 va_end (args);
545}
#define va_end(LIST)
Definition: stdarg.h:10
#define va_start(LIST, ARG)
Definition: stdarg.h:9
__builtin_va_list va_list
Definition: stdarg.h:7
void __vprintf(const char *format, va_list args, void(*output)(char, void *), void *aux)
Definition: stdio.c:146
Here is the call graph for this function:
Here is the caller graph for this function:

◆ __vprintf()

void __vprintf ( const char *  format,
va_list  args,
void(*)(char, void *)  output,
void *  aux 
)
147 {
148 for (; *format != '\0'; format++) {
149 struct printf_conversion c;
150
151 /* Literally copy non-conversions to output. */
152 if (*format != '%') {
153 output (*format, aux);
154 continue;
155 }
156 format++;
157
158 /* %% => %. */
159 if (*format == '%') {
160 output ('%', aux);
161 continue;
162 }
163
164 /* Parse conversion specifiers. */
165 format = parse_conversion (format, &c, &args);
166
167 /* Do conversion. */
168 switch (*format) {
169 case 'd':
170 case 'i':
171 {
172 /* Signed integer conversions. */
173 intmax_t value;
174
175 switch (c.type) {
176 case CHAR:
177 value = (signed char) va_arg (args, int);
178 break;
179 case SHORT:
180 value = (short) va_arg (args, int);
181 break;
182 case INT:
183 value = va_arg (args, int);
184 break;
185 case INTMAX:
186 value = va_arg (args, intmax_t);
187 break;
188 case LONG:
189 value = va_arg (args, long);
190 break;
191 case LONGLONG:
192 value = va_arg (args, long long);
193 break;
194 case PTRDIFFT:
195 value = va_arg (args, ptrdiff_t);
196 break;
197 case SIZET:
198 value = va_arg (args, size_t);
199 if (value > SIZE_MAX / 2)
200 value = value - SIZE_MAX - 1;
201 break;
202 default:
203 NOT_REACHED ();
204 }
205
206 format_integer (value < 0 ? -value : value,
207 true, value < 0, &base_d, &c, output, aux);
208 }
209 break;
210
211 case 'o':
212 case 'u':
213 case 'x':
214 case 'X':
215 {
216 /* Unsigned integer conversions. */
217 uintmax_t value;
218 const struct integer_base *b;
219
220 switch (c.type) {
221 case CHAR:
222 value = (unsigned char) va_arg (args, unsigned);
223 break;
224 case SHORT:
225 value = (unsigned short) va_arg (args, unsigned);
226 break;
227 case INT:
228 value = va_arg (args, unsigned);
229 break;
230 case INTMAX:
231 value = va_arg (args, uintmax_t);
232 break;
233 case LONG:
234 value = va_arg (args, unsigned long);
235 break;
236 case LONGLONG:
237 value = va_arg (args, unsigned long long);
238 break;
239 case PTRDIFFT:
240 value = va_arg (args, ptrdiff_t);
241#if UINTMAX_MAX != PTRDIFF_MAX
242 value &= ((uintmax_t) PTRDIFF_MAX << 1) | 1;
243#endif
244 break;
245 case SIZET:
246 value = va_arg (args, size_t);
247 break;
248 default:
249 NOT_REACHED ();
250 }
251
252 switch (*format) {
253 case 'o': b = &base_o; break;
254 case 'u': b = &base_d; break;
255 case 'x': b = &base_x; break;
256 case 'X': b = &base_X; break;
257 default: NOT_REACHED ();
258 }
259
260 format_integer (value, false, false, b, &c, output, aux);
261 }
262 break;
263
264 case 'c':
265 {
266 /* Treat character as single-character string. */
267 char ch = va_arg (args, int);
268 format_string (&ch, 1, &c, output, aux);
269 }
270 break;
271
272 case 's':
273 {
274 /* String conversion. */
275 const char *s = va_arg (args, char *);
276 if (s == NULL)
277 s = "(null)";
278
279 /* Limit string length according to precision.
280Note: if c.precision == -1 then strnlen() will get
281SIZE_MAX for MAXLEN, which is just what we want. */
282 format_string (s, strnlen (s, c.precision), &c, output, aux);
283 }
284 break;
285
286 case 'p':
287 {
288 /* Pointer conversion.
289 Format pointers as %#x. */
290 void *p = va_arg (args, void *);
291
292 c.flags = POUND;
293 format_integer ((uintptr_t) p, false, false,
294 &base_x, &c, output, aux);
295 }
296 break;
297
298 case 'f':
299 case 'e':
300 case 'E':
301 case 'g':
302 case 'G':
303 case 'n':
304 /* We don't support floating-point arithmetic,
305 and %n can be part of a security hole. */
306 __printf ("<<no %%%c in kernel>>", output, aux, *format);
307 break;
308
309 default:
310 __printf ("<<no %%%c conversion>>", output, aux, *format);
311 break;
312 }
313 }
314}
#define NOT_REACHED()
Definition: debug.h:34
static uint8_t s[256]
Definition: random.c:17
#define va_arg(LIST, TYPE)
Definition: stdarg.h:11
#define NULL
Definition: stddef.h:4
__PTRDIFF_TYPE__ ptrdiff_t
Definition: stddef.h:9
int64_t intmax_t
Definition: stdint.h:39
uint64_t uintmax_t
Definition: stdint.h:43
#define SIZE_MAX
Definition: stdint.h:49
uint64_t uintptr_t
Definition: stdint.h:36
#define PTRDIFF_MAX
Definition: stdint.h:47
static const struct integer_base base_x
Definition: stdio.c:129
void __printf(const char *format, void(*output)(char, void *), void *aux,...)
Definition: stdio.c:538
static const struct integer_base base_o
Definition: stdio.c:128
static void format_integer(uintmax_t value, bool is_signed, bool negative, const struct integer_base *, const struct printf_conversion *, void(*output)(char, void *), void *aux)
Definition: stdio.c:437
static const char * parse_conversion(const char *format, struct printf_conversion *, va_list *)
Definition: stdio.c:321
static void format_string(const char *string, int length, struct printf_conversion *, void(*output)(char, void *), void *aux)
Definition: stdio.c:523
static const struct integer_base base_X
Definition: stdio.c:130
static const struct integer_base base_d
Definition: stdio.c:127
size_t strnlen(const char *, size_t)
Definition: string.c:284
Definition: stdio.c:120
Definition: stdio.c:89
@ INTMAX
Definition: stdio.c:112
@ LONGLONG
Definition: stdio.c:114
@ CHAR
Definition: stdio.c:109
@ SIZET
Definition: stdio.c:116
@ LONG
Definition: stdio.c:113
@ SHORT
Definition: stdio.c:110
@ INT
Definition: stdio.c:111
@ PTRDIFFT
Definition: stdio.c:115
Here is the call graph for this function:
Here is the caller graph for this function:

◆ hex_dump()

void hex_dump ( uintptr_t  ofs,
const void *  buf_,
size_t  size,
bool  ascii 
)
553 {
554 const uint8_t *buf = buf_;
555 const size_t per_line = 16; /* Maximum bytes per line. */
556
557 while (size > 0) {
558 size_t start, end, n;
559 size_t i;
560
561 /* Number of bytes on this line. */
562 start = ofs % per_line;
563 end = per_line;
564 if (end - start > size)
565 end = start + size;
566 n = end - start;
567
568 /* Print line. */
569 printf ("%016llx ", (uintmax_t) ROUND_DOWN (ofs, per_line));
570 for (i = 0; i < start; i++)
571 printf (" ");
572 for (; i < end; i++)
573 printf ("%02hhx%c",
574 buf[i - start], i == per_line / 2 - 1? '-' : ' ');
575 if (ascii) {
576 for (; i < per_line; i++)
577 printf (" ");
578 printf ("|");
579 for (i = 0; i < start; i++)
580 printf (" ");
581 for (; i < end; i++)
582 printf ("%c",
583 isprint (buf[i - start]) ? buf[i - start] : '.');
584 for (; i < per_line; i++)
585 printf (" ");
586 printf ("|");
587 }
588 printf ("\n");
589
590 ofs += n;
591 buf += n;
592 size -= n;
593 }
594}
static int isprint(int c)
Definition: ctype.h:18
uint16_t size
Definition: mmu.h:0
#define ROUND_DOWN(X, STEP)
Definition: round.h:14
unsigned char uint8_t
Definition: stdint.h:20
int printf(const char *format,...)
Definition: stdio.c:75
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printf()

int printf ( const char *  ,
  ... 
)
Here is the caller graph for this function:

◆ putchar()

int int int int int putchar ( int  c)
152 {
156
157 return c;
158}
static void putchar_have_lock(uint8_t c)
Definition: console.c:172
static void acquire_console(void)
Definition: console.c:85
static void release_console(void)
Definition: console.c:96
Here is the call graph for this function:
Here is the caller graph for this function:

◆ puts()

int puts ( const char *  s)
131 {
133 while (*s != '\0')
134 putchar_have_lock (*s++);
135 putchar_have_lock ('\n');
137
138 return 0;
139}
Here is the call graph for this function:

◆ snprintf()

int int snprintf ( char *  ,
size_t  ,
const char *  ,
  ... 
)
Here is the caller graph for this function:

◆ vprintf()

int int int vprintf ( const char *  ,
va_list   
)
Here is the caller graph for this function:

◆ vsnprintf()

int int int int vsnprintf ( char *  ,
size_t  ,
const char *  ,
va_list   
)