printf.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 159 行
C
159 行
#include <stdarg.h>static voidserial_out_hex (volatile int *out, unsigned int n){ static char *digit = "0123456789abcdef"; int i; for (i = 7; i >= 0; i--) *out = digit[(n >> (4 * i)) & 15];}static voidserial_out_chars (volatile int *out, int n, char c){ while (n-- > 0) *out = c;}static voidserial_out_str (volatile int *out, char *s, int left, int field){ char *p; int len; if (s == 0) s = "<NULL>"; if (field) { for (p = s, len = 0; *p; p++) len++; if (!left) serial_out_chars (out, field - len, ' '); while (*s) *out = *s++; if (left) serial_out_chars (out, field - len, ' '); } else { while (*s) *out = *s++; }}voidserial_out_dec (volatile int *out, int n, int is_signed, int left, int field){ char buff[40], *s = &buff[39]; unsigned int un, negative; if (is_signed && n < 0) { negative = 1; un = (unsigned int) -n; } else { negative = 0; un = (unsigned int) n; } *s = '\0'; do { *(--s) = '0' + un % 10; un /= 10; } while (un > 0); if (negative) *(--s) = '-'; serial_out_str (out, s, left, field);}static voidformated_out (volatile int *out, char *format, va_list arg_list){ int field, left; if (format == 0) format = "<NULL>"; while (*format) { if (*format != '%') { *out = *format++; continue; } format++; if (*format == '-') { format++; left = 1; } else left = 0; field = 0; while (*format >= '0' && *format <= '9') field = 10 * field + *format++ - '0'; switch (*format) { case 's': serial_out_str (out, va_arg (arg_list, char *), left, field); break; case 'u': serial_out_dec (out, va_arg (arg_list, int), 0, left, field); break; case 'd': serial_out_dec (out, va_arg (arg_list, int), 1, left, field); break; case 'x': serial_out_hex (out, va_arg (arg_list, int)); break; case 'p': serial_out_hex (out, va_arg (arg_list, int)); break; case 'c': *out = va_arg (arg_list, int); break; case '%': *out = *format; break; default: *out = '%'; *out = *format; (void) va_arg (arg_list, int); break; } format++; }}intprintf (char *format, ...){ va_list arg_list; va_start (arg_list, format); formated_out ((volatile int *) 0xb0c2000c, format, arg_list); va_end (arg_list); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?