My Project
Loading...
Searching...
No Matches
kernel_printf.c
Go to the documentation of this file.
1// kernel_printf_function
2/*
3 * Kernel Printf Function
4 *
5 * Maintainer: Park Jiwoo
6 *
7 * Copyright (C) 2024 Park-Jiwoo
8 *
9 */
10#include <stdio.h>
11#include <stdarg.h>
12#include "kernel_pr_he.h"
13
14// 함수 전방 선언
15int az_default_mod(char *format);
16static void az_default(char *format, va_list ap);
17static void az_input(char *format, va_list ap);
18void az_mod(char *format);
19void az_putstr(const char *s);
20int az_chrpos(const char *s, int c);
21void kernel_putchar(char c);
22int az_skip(char *format, int i);
23void az_fill(int fillcnt, char c);
24char az_getflag(char flag);
25void az_plusflag(int d, char flag, int param, char *format);
26void az_minusflag(int d, char flag);
27void az_spaceflag(int d, char flag, int param);
28void az_zeroflag(int d, char flag);
29int az_output(char *format, char flag, va_list ap, int i);
30void az_speciftypeini(char *format, char specif, char flag, va_list ap);
31void az_o_support(int o, int param, char flag, char f_addon);
32void az_o_support_p2(char flag, char *fmt, char f_addon);
33void az_c_support(char c, int param, char flag, char f_addon);
34int az_getparam(char *format, char flag);
35void az_c(va_list ap, char *format, char flag);
36void az_s(va_list ap, char *format, char flag);
37void az_p(va_list ap);
38void az_x(va_list ap, char *format, char flag);
39void az_d(va_list ap, char *format, char flag);
40void az_i(va_list ap, char *format, char flag);
41void az_o(va_list ap, char *format, char flag);
42void az_f(va_list ap, char *format, char flag);
43void az_u(va_list ap, char *format, char flag);
44
45// az_default 함수는 포맷 문자열을 분석하고 그에 따라 적절한 처리를 수행합니다.
46static void az_default(char *format, va_list ap)
47{
48 int st;
49
50 st = az_default_mod(format); // 포맷 문자열에 따라 처리 방식을 결정
51
52 if (st == 1)
53 {
54 az_input(format, ap); // 포맷 문자열에 따라 가변 인자를 처리
55 }
56 else if (st == 2)
57 {
58 az_mod(format); // 포맷 문자열에서 '%%'를 처리
59 }
60 else
61 {
62 if (st < 0)
63 {
64 az_putstr(format); // 포맷에 '%' 문자가 없으면 문자열을 그대로 출력
65 }
66 }
67}
68
69// az_default_mod 함수는 포맷 문자열에 '%' 문자가 포함되어 있는지 확인합니다.
70int az_default_mod(char *format)
71{
72 int mod;
73
74 mod = az_chrpos(format, '%'); // 포맷 문자열에서 '%'의 위치를 찾음
75 if (format[mod + 1] == '%' && format[mod] == '%')
76 {
77 return (2); // '%%'가 있으면 2를 반환 (az_mod 호출을 위해)
78 }
79 else if (mod == -1)
80 {
81 return (-1); // '%'가 없으면 -1을 반환
82 }
83 else if (mod == 0 || format[0] == '%')
84 {
85 return (1); // 포맷의 시작이 '%'이거나 '%x' 형태라면 1을 반환 (az_input 호출을 위해)
86 }
87 else if (mod > 0)
88 {
89 return (1); // 중간에 '%'가 있으면 1을 반환
90 }
91 else
92 {
93 return (0); // 다른 경우에는 0을 반환
94 }
95}
96
97// az_mod 함수는 포맷 문자열에서 '%%'를 처리하여 '%'를 출력합니다.
98void az_mod(char *format)
99{
100 int i;
101 i = 0;
102 while (format[i])
103 {
104 if (format[i] == '%')
105 {
106 i++;
107 if (format[i] == '%')
108 {
109 kernel_putchar(format[i++]); // '%%'를 '%'로 변환하여 출력
110 }
111 }
112 kernel_putchar(format[i]); // 나머지 문자 출력
113 i++;
114 }
115}
116
120
121// az_input 함수는 포맷 문자열을 순차적으로 분석하여 가변 인자를 적절히 처리합니다.
122static void az_input(char *format, va_list ap)
123{
124 char flag;
125 int i;
126
127 i = 0;
128 while (format[i])
129 {
130 if (format[i] == '%')
131 {
132 i++;
133 flag = az_getflag(format[i]); // 플래그 문자를 가져옴
134 i = az_output(format, flag, ap, i); // 플래그에 따른 출력 처리
135 }
136 else if (format[i] != '\0')
137 {
138 kernel_putchar(format[i]); // 일반 문자 출력
139 }
140 i++;
141 }
142}
143
147
148// az_skip 함수는 플래그 문자 이후 알파벳이 나올 때까지 건너뜁니다.
149int az_skip(char *format, int i)
150{
151 while (!az_isalpha(format[i])) // 알파벳이 나올 때까지
152 i++;
153 return (i);
154}
155
156// az_fill 함수는 특정 문자로 지정된 횟수만큼 채웁니다.
157void az_fill(int fillcnt, char c)
158{
159 int i;
160
161 i = 0;
162 while (i <= fillcnt)
163 {
164 kernel_putchar(c); // fillcnt 횟수만큼 c 문자를 출력
165 i++;
166 }
167}
168
169// az_getflag 함수는 플래그 문자를 반환합니다.
170char az_getflag(char flag)
171{
172 if (flag == '0')
173 return ('0');
174 else if (flag == '#')
175 return ('#');
176 else if (flag == '+')
177 return ('+');
178 else if (flag == '-')
179 return ('-');
180 else if (flag == '*')
181 return ('*');
182 else if (flag == '.')
183 return ('.');
184 else if (flag == '*')
185 return ('*');
186 else
187 return ('\0'); // 플래그가 없으면 null 문자 반환
188}
189
190// az_plusflag 함수는 '+' 플래그에 따른 처리를 수행합니다.
191void az_plusflag(int d, char flag, int param, char *format)
192{
193 int width;
194 char add_flag;
195 char add_flag_val;
196
197 width = param - az_nbrlen(d); // 출력 너비 계산
198 add_flag = format[az_chrpos(format, flag) + 1];
199 add_flag_val = format[az_chrpos(format, flag) + 2];
200
201 if (flag == '+' && add_flag != '0')
202 {
203 if (width)
204 az_fill(width, ' '); // 빈칸 채움
205 if (d > 0)
206 kernel_putchar('+'); // 양수이면 '+' 출력
207 az_putnbr(d); // 숫자 출력
208 }
209
210 if (flag == '+' && add_flag == '0')
211 {
212 d *= -1; // 음수로 변환
213 kernel_putchar('-'); // '-' 출력
214
215 if (add_flag_val != '1')
216 kernel_putchar('0'); // '0' 출력
217 az_putnbr(d); // 숫자 출력
218 }
219}
220
221// az_minusflag 함수는 '-' 플래그에 따른 처리를 수행합니다.
222void az_minusflag(int d, char flag)
223{
224 if (flag == '-')
225 az_putnbr(d); // '-' 플래그일 경우 숫자 출력
226}
227
228// az_spaceflag 함수는 ' ' 플래그에 따른 처리를 수행합니다.
229void az_spaceflag(int d, char flag, int param)
230{
231 if (flag == ' ' && (param < 0) && d > 0)
232 kernel_putchar(' '); // 공백 플래그가 설정되었을 때 공백 출력
233
234 if (flag == ' ' && param)
235 {
236 az_fill(param - az_nbrlen(d), ' '); // 공백을 채움
237 az_putnbr(d); // 숫자 출력
238 }
239}
240
241// az_zeroflag 함수는 '0' 플래그에 따른 처리를 수행합니다.
242void az_zeroflag(int d, char flag)
243{
244 if (flag == '0' && d < 0)
245 {
246 d *= -1; // 음수로 변환
247 kernel_putchar('-'); // '-' 출력
248 kernel_putchar('0'); // '0' 출력
249 az_putnbr(d); // 숫자 출력
250 }
251}
252
255
256// az_output 함수는 플래그에 따라 포맷팅된 출력 문자열을 생성합니다.
257int az_output(char *format, char flag, va_list ap, int i)
258{
259 i = az_skip(format, i); // 플래그 이후의 위치로 이동
260 az_speciftypeini(format, format[i], flag, ap); // 플래그와 타입에 따른 출력 처리
261 return (i);
262}
263
267
268// az_o_support 함수는 'o' (8진수) 형식에 대한 처리를 지원합니다.
269void az_o_support(int o, int param, char flag, char f_addon)
270{
271 if (o)
272 {
273 if (flag == '+' && param > 0)
274 az_fill(param - az_nbrlen(o), ' '); // '+' 플래그에 따른 공백 채움
275 if (flag == '0' && param > 0)
276 az_fill(param - az_nbrlen(o), '0'); // '0' 플래그에 따른 0 채움
277 if (flag == '#')
278 {
279 if (f_addon == '+' && param > 0)
280 az_fill(param - az_nbrlen(o), ' '); // '#' 플래그에 따른 공백 채움
281 kernel_putchar('0'); // '0' 출력
282 }
283 az_putoctal(o); // 8진수 출력
284 if (flag == '#' && f_addon == '-')
285 az_fill(param - az_nbrlen(o), ' '); // '-' 플래그에 따른 공백 채움
286 if (flag == '-' && param > 0)
287 az_fill(param - az_nbrlen(o), ' '); // '-' 플래그에 따른 공백 채움
288 }
289}
290
291// az_o_support_p2 함수는 'o' (8진수) 형식에 대한 추가 처리를 지원합니다.
292void az_o_support_p2(char flag, char *fmt, char f_addon)
293{
294 char *tmp;
295 int param;
296
297 param = '\0';
298 if (flag == '-' && f_addon == '0')
299 {
300 if (az_chrpos(fmt, '#') > 0)
301 {
302 kernel_putchar('0'); // '0' 출력
303 tmp = az_strsub(fmt, az_chrpos(fmt, '0') + 1, az_strlen(fmt));
304 }
305 else
306 tmp = az_strsub(fmt, az_chrpos(fmt, '+'), az_strlen(fmt));
307 param = az_getparam(tmp, flag) - 1;
308 }
309 else if (flag == '#' && f_addon == '-')
310 tmp = az_strsub(fmt, az_chrpos(fmt, '+') + 1, az_strlen(fmt));
311 else
312 param = az_getparam(fmt, flag) - 1;
313 if (param > 0 && !flag)
314 az_fill(param - 1, ' '); // 공백 채움
315}
316
317// az_c_support 함수는 'c' (문자) 형식에 대한 처리를 지원합니다.
318void az_c_support(char c, int param, char flag, char f_addon)
319{
320 if (param > 0 && !flag)
321 az_fill(param - 1, ' '); // 공백 채움
322 kernel_putchar(c); // 문자 출력
323 if (f_addon == '-' && flag == '+')
324 az_fill(param - 1, ' '); // 공백 채움
325}
326
329
330/* getparam */
331
332// az_getparam 함수는 포맷 문자열에서 파라미터 값을 추출합니다.
333int az_getparam(char *format, char flag)
334{
335 char *tmp;
336 int st;
337 int i;
338 int j;
339
340 tmp = az_memalloc(az_strlen(format)); // 메모리 할당
341 i = 0;
342
343 // '.' 플래그가 존재하는 경우 처리
344 if (flag == '.')
345 {
346 i = az_chrpos(format, '.') + 1; // '.' 다음부터 숫자를 가져옴
347 }
348 else if (format[i] == ' ' && az_isdigit(format[i + 1]))
349 i++;
350
351 if (flag)
352 while (!az_isdigit(format[i]) && format[i] != ' ')
353 i++;
354 else if (az_isdigit(format[az_chrpos(format, '%') + 1]))
355 i++;
356 else
357 i = az_chrpos(format, flag) + 1;
358
359 j = 0;
360
361 while (az_isdigit(format[i]))
362 tmp[j++] = format[i++];
363 tmp[j] = '\0';
364 st = az_atoi(tmp); // 문자열을 정수로 변환
365
366 free(tmp); // 메모리 해제
367 return (st);
368}
369
372
373// az_speciftypeini 함수는 포맷 문자에 따라 적절한 출력 함수를 호출합니다.
374void az_speciftypeini(char *format, char specif, char flag, va_list ap) {
375 if (specif == 'c' || specif == 'C')
376 az_c(ap, format, flag);
377 else if (specif == 's' || specif == 'S')
378 az_s(ap, format, flag);
379 else if (specif == 'p')
380 az_p(ap);
381 else if (specif == 'x' || specif == 'X')
382 az_x(ap, format, flag);
383 else if (specif == 'd' || specif == 'D')
384 az_d(ap, format, flag);
385 else if (specif == 'i')
386 az_i(ap, format, flag);
387 else if (specif == 'o' || specif == 'O')
388 az_o(ap, format, flag);
389 else if (specif == 'u' || specif == 'U')
390 az_u(ap, format, flag);
391 else if (specif == 'f' || specif == 'F')
392 az_f(ap, format, flag);
393}
394
395
396// az_f 함수는 'f' (소수점 있는 실수) 형식의 데이터를 처리합니다.
397void az_f(va_list ap, char *format, char flag) {
398 double f = va_arg(ap, double); // 부동소수점 값을 받아옴
399 int param_width = az_getparam(format, flag); // 너비를 가져옴
400 int param_precision = 6; // 기본 정밀도는 6자리로 설정
401
402 // 정밀도 설정
403 char *precision_ptr = az_strchr(format, '.');
404 if (precision_ptr != NULL) {
405 param_precision = atoi(precision_ptr + 1);
406 }
407
408 // 서식 옵션에 따라 부동소수점 출력
409 char format_string[20];
410 sprintf(format_string, "%%%s%d.%df", (flag == '-') ? "-" : "", param_width, param_precision);
411
412 char buffer[50];
413 sprintf(buffer, format_string, f);
414
415 az_putstr(buffer);
416}
417
418
419// az_c 함수는 'c' (문자) 형식의 데이터를 처리합니다.
420void az_c(va_list ap, char *format, char flag)
421{
422 char c;
423 char f_addon;
424 char *tmp;
425 int param;
426 int p_addon;
427
428 c = (char)va_arg(ap, int);
429 f_addon = format[az_chrpos(format, flag) + 1];
430 tmp = az_strsub(format, az_chrpos(format, f_addon), az_strlen(format) - 2);
431 param = az_getparam(format, flag) - 1;
432 p_addon = az_getparam(tmp, flag) - 1;
433 if (flag == '+' && f_addon != '-')
434 az_fill(param - 1, ' ');
435 if (flag == '0' && f_addon != '+')
436 az_fill(param - 1, ' ');
437 if (f_addon == '+' && flag == '0')
438 az_fill(p_addon - 1, ' ');
439 if (c)
440 az_c_support(c, param, flag, f_addon);
441}
442
443// az_s 함수는 's' (문자열) 형식의 데이터를 처리합니다.
444void az_s(va_list ap, char *format, char flag)
445{
446 char *s;
447 int param;
448 int s_length;
449
450 s = va_arg(ap, char *);
451 if (s == NULL && flag == '\0')
452 az_putstr("(null)");
453 else
454 {
455 param = az_getparam(format, flag) - 1;
456 s_length = az_strlen(s);
457 if (az_strcmp(s, "") == 0 && !flag)
458 az_putstr("");
459 if (param > 0 && (flag == ' ' || flag == '+'))
460 az_fill(param - s_length, ' ');
461 if (s)
462 {
463 if (param > 0 && !flag)
464 az_fill(param - s_length, ' ');
465 az_putstr(s);
466 if (flag == '-')
467 az_fill(param - s_length, ' ');
468 }
469 }
470}
471
472// az_p 함수는 'p' (포인터) 형식의 데이터를 처리합니다.
473void az_p(va_list ap)
474{
475 int nbr;
476
477 nbr = va_arg(ap, int);
478 az_putstr("0x");
479 az_puthex(nbr); // 포인터 값 16진수로 출력
480}
481
482// az_x 함수는 'x' 또는 'X' (16진수) 형식의 데이터를 처리합니다.
483void az_x(va_list ap, char *format, char flag)
484{
485 int x;
486 int param;
487
488 x = va_arg(ap, int);
489 param = az_getparam(format, flag);
490 if (flag == '#' && !az_strchr(format, 'X'))
491 az_putstr("0x"); // '0x' 접두사 출력
492 if (flag == '#' && az_strchr(format, 'X'))
493 az_putstr("0X"); // '0X' 접두사 출력
494 if (x && az_strchr(format, 'X'))
495 az_putstr(az_itoa(x, 16)); // 16진수 대문자 형식으로 출력
496 if (x && !param && !az_strchr(format, 'X'))
497 az_puthex(x); // 16진수 소문자 형식으로 출력
498}
499
500// az_d 함수는 'd' 또는 'D' (10진수) 형식의 데이터를 처리합니다.
501void az_d(va_list ap, char *format, char flag)
502{
503 int param;
504 int d;
505
506 param = az_getparam(format, flag) - 1;
507 d = va_arg(ap, int);
508
509 // '-' 플래그 처리 (왼쪽 정렬)
510 if (flag == '-')
511 {
512 az_putnbr(d);
513 if (param > 0)
514 az_fill(param - az_nbrlen(d), ' ');
515 }
516 else
517 {
518 // '+' 플래그 처리 (양수 앞에 +)
519 if (flag == '+' && d >= 0)
520 kernel_putchar('+');
521
522 // 공백 채우기
523 if (param > 0 && flag != '0')
524 az_fill(param - az_nbrlen(d), ' ');
525
526 // 0 채우기
527 if (flag == '0')
528 az_fill(param - az_nbrlen(d), '0');
529
530 az_putnbr(d);
531 }
532}
533
534
535// az_i 함수는 'i' (정수) 형식의 데이터를 처리합니다.
536void az_i(va_list ap, char *format, char flag)
537{
538 int i;
539 int i_length;
540 int param;
541
542 i = va_arg(ap, int);
543 param = az_getparam(format, flag) - 1;
544 i_length = az_nbrlen(i) + 1;
545 if (flag == '0')
546 az_fill(param - i_length, flag);
547 if (flag == '.')
548 az_fill(param - i_length, '0');
549 if (flag == '+')
550 if (i > 0)
551 kernel_putchar('+');
552 az_putnbr(i); // 정수 출력
553}
554
555// az_o 함수는 'o' (8진수) 형식의 데이터를 처리합니다.
556void az_o(va_list ap, char *format, char flag)
557{
558 int o;
559 int param;
560 char f_addon;
561 char *tmp;
562
563 o = va_arg(ap, int);
564 param = az_getparam(format, flag) - 1;
565 f_addon = format[az_chrpos(format, flag) + 1];
566 if (flag == '0')
567 {
568 tmp = az_strsub(format, az_chrpos(format, '0') + 1, az_strlen(format));
569 param = az_getparam(tmp, flag) - 1;
570 }
571 az_o_support_p2(flag, format, f_addon); // 추가 지원 함수 호출
572 az_o_support(o, param - 1, flag, f_addon); // 8진수 출력 지원
573}
574
575// az_u 함수는 'u' (unsigned 정수) 형식의 데이터를 처리합니다.
576void az_u(va_list ap, char *format, char flag)
577{
578 unsigned int u;
579 int param;
580 int u_length;
581
582 u = va_arg(ap, unsigned int);
583 param = az_getparam(format, flag) - 1;
584 u_length = az_nbrlen(u);
585 if (flag == '0')
586 az_fill((param - u_length), flag);
587 if (flag == '.')
588 az_fill((param - u_length), '0');
589 if (param)
590 az_fill(param - u_length, ' ');
591 az_putunsigned(u); // unsigned 정수 출력
592}
593
594// QT에서 사용할 내장함수.
595int kernel_printf(const char *format, ...)
596{
597 va_list ap; // 가변 인자를 저장하기 위한 va_list 선언
598
599 va_start(ap, format); // 가변 인자 리스트를 초기화
600 az_default((char *)format, ap); // 포맷 문자열과 가변 인자 리스트를 처리하는 az_default 함수 호출
601 va_end(ap); // 가변 인자 리스트를 종료
602
603 return (0); // 0을 반환
604}
605
606/* ************************************************************************************
607 *
608 * test_kernel_printf method
609 * 2024.08.21
610 * Copyright (C) 2024 Park-Jiwoo
611 *
612 * This function tests the custom kernel_printf function with various data types
613 * and format specifiers. It outputs the results to the kernel console, ensuring
614 * that the formatting works as expected across different cases.
615 *
616 * Test cases include:
617 * - Simple string output
618 * - Character and integer formatting
619 * - Addition and other arithmetic operations
620 * - Various flags and width specifiers
621 * - Unsigned integers, octal, and hexadecimal formats
622 * - Function calls and special characters
623 *
624 * The output is compared against expected results to ensure correctness (QT Console).
625 *
626 *
627 * Example Outputs:
628 * - Hello world!
629 * - A single character : T
630 * - An integer : 37
631 * - 1 + 1 = 2
632 * - +499 (with correct alignment)
633 * - Hexadecimal representation (e.g., 0xbc614e)
634 *
635 *********************************************************************************** */
636
637int function_Test(int a, int b)
638{
639 int sum = a + b;
640
641 return (sum);
642}
643
645{
646 kernel_printf("Hello world!\n");
647 kernel_printf("A single character : %c \n", 'T');
648 kernel_printf("An integer : %d \n", 37);
649 kernel_printf("An integer : %d \n", 299);
650 kernel_printf("5-4 = %d\n", 1);
651
652 int a = 1;
653 int b = 2;
654
655 kernel_printf("%d + %d = %d\n", a, b, a + b);
656 kernel_printf("%d\t\t\t String.\n", 12345678);
657 kernel_printf("-650\n");
658 kernel_printf("%+d\n", 430);
659 kernel_printf("%+1d\n", 650);
660 kernel_printf("%+10d\n", 499);
661 kernel_printf("% 3d\n", 1230);
662 kernel_printf("%08d\n", 342);
663 kernel_printf("%+03d\n", -430);
664 kernel_printf("%3d\n", -43);
665 kernel_printf("%u\n", 23919293929392);
666 kernel_printf("%+-u\n", 12345);
667 kernel_printf("%+10u\n", 12345);
668 kernel_printf("%-4s\n", "Az");
669 kernel_printf("%o\n", 333);
670 kernel_printf("%-0#+10o\n", 2048);
671 kernel_printf("%X\n", 12345678);
672 kernel_printf("%#+x\n", 12345678);
673 kernel_printf("\n\nfunction call Test\n");
674 kernel_printf("%d + %d = %d", 5, 6, function_Test(5, 6));
675 kernel_printf("\n");
676
677 /*** kernel_putchar ***/
678 kernel_putchar('H');
679 kernel_putchar('E');
680 kernel_putchar('L');
681 kernel_putchar('L');
682 kernel_putchar('O');
683 kernel_putchar('\n');
684 kernel_printf("-\n");
685 kernel_printf(".\n");
686 kernel_printf("/\n");
687 kernel_printf("'()*+,-./\n");
688}
689/* ************************************************************************************ */
int az_atoi(const char *s)
Definition az_atoi.c:12
int az_isalpha(int c)
Definition az_isalpha.c:12
int az_isdigit(int c)
Definition az_isdigit.c:12
char * az_itoa(int value, int base)
Definition az_itoa.c:20
void * az_memalloc(size_t size)
Definition az_memalloc.c:13
size_t az_nbrlen(int n)
Definition az_nbrlen.c:12
void az_puthex(unsigned int n)
Definition az_puthex.c:12
void az_putnbr(int n)
Definition az_putnbr.c:12
void az_putoctal(int n)
Definition az_putoctal.c:12
void az_putunsigned(unsigned int n)
char * az_strchr(const char *s, int c)
Definition az_strchr.c:13
int az_strcmp(const char *s1, const char *s2)
Definition az_strcmp.c:12
size_t az_strlen(const char *s)
Definition az_strlen.c:12
char * az_strsub(char const *s, unsigned int start, size_t len)
Definition az_strsub.c:12
void kernel_putchar(char c)
Definition az_putchar.c:13
void az_plusflag(int d, char flag, int param, char *format)
int az_output(char *format, char flag, va_list ap, int i)
void az_s(va_list ap, char *format, char flag)
void az_mod(char *format)
void az_i(va_list ap, char *format, char flag)
void az_p(va_list ap)
int az_skip(char *format, int i)
void az_minusflag(int d, char flag)
void az_u(va_list ap, char *format, char flag)
void az_f(va_list ap, char *format, char flag)
void az_d(va_list ap, char *format, char flag)
void az_x(va_list ap, char *format, char flag)
void az_fill(int fillcnt, char c)
int function_Test(int a, int b)
void az_spaceflag(int d, char flag, int param)
void az_o_support_p2(char flag, char *fmt, char f_addon)
void az_zeroflag(int d, char flag)
int az_default_mod(char *format)
int az_chrpos(const char *s, int c)
Definition az_chrpos.c:12
void test_kernel_printf()
char az_getflag(char flag)
void az_putstr(const char *s)
Definition az_putstr.c:12
int az_getparam(char *format, char flag)
void az_speciftypeini(char *format, char specif, char flag, va_list ap)
void az_c_support(char c, int param, char flag, char f_addon)
void az_o(va_list ap, char *format, char flag)
void az_c(va_list ap, char *format, char flag)
void az_o_support(int o, int param, char flag, char f_addon)
int b
Definition memo.c:9
int a
Definition memo.c:8
kernel_printf("5-4 = %d\n", 1)