📄 myprintf.c
字号:
#include "myprintf.h"#ifndef TARGET_PC#include <stdarg.h>int putchar(int ch){ int res; static int uart_init_done = 0; if (!uart_init_done) { uart_init(UART0_BASE, BAUD_19200); uart_init_done = 1; } res = uart_putchar(ch); return res;}int puts(const char *str){ int res; static int uart_init_done = 0; if (!uart_init_done) { uart_init(UART0_BASE, BAUD_19200); uart_init_done = 1; } res = uart_puts(str); return res;}static char *itoa(int num, int base){ static char buf[20]; char temp; int i=0, j=0, digit; if (base != 10 && base != 8 && base != 16) { puts("unsupported conversion\n"); //exit(1); return (char *)0; } while (num) { digit = num % base; num /= base; if (digit > 9) buf[i++] = digit - 10 + 'a'; else buf[i++] = digit + '0'; } buf[i] = 0; while (j < i/2) { temp = buf[j]; buf[j] = buf[i-1-j]; buf[i-1-j] = temp; j++; } return buf;}int printf(const char *format, ...){ va_list ap; char c, ch, *p; int i; enum state_t {LITERAL, DIRECTIVE}; enum state_t state = LITERAL; static int uart_init_done = 0; if (!uart_init_done) { uart_init(UART0_BASE, BAUD_19200); uart_init_done = 1; } va_start(ap, format); while ((c = (*(format++))) != '\0') { switch(c) { case '%': if (state == LITERAL) { state = DIRECTIVE; break; } /* state == DIRECTIVE */ putchar(c); state = LITERAL; break; case 'c': if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ /* char is promoted to int when passed through ... */ ch = va_arg(ap, int); putchar(ch); state = LITERAL; break; case 's': if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ p = va_arg(ap, char *); puts(p); state = LITERAL; break; case 'd': if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ i = va_arg(ap, int); puts(itoa(i, 10)); state = LITERAL; break; case 'o': if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ i = va_arg(ap, int); puts(itoa(i, 8)); state = LITERAL; break; case 'x': if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ i = va_arg(ap, int); puts(itoa(i, 16)); state = LITERAL; break; default: if (state == LITERAL) { putchar(c); break; } /* state == DIRECTIVE */ puts("unsupported directive\n"); //exit(1); return -1; } } va_end(ap); return 0;}#endif /* !define TARGET_PC */static void delay(int count){ int i; while (count--) for (i = 0; i < 65535; i++){;}}void printfdemo(void){ int i; printf("demo for myprintf\r\n"); for(i = 0; i < 5; i++) { printf("%cc\t%%%s\n%d %o %x\r\n", 'A', "hello world", 15, 15, 15); delay(20); } printf("test ok\n"); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -