⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myprintf.c

📁 S3C4510(ARM7)开发板bootloader实现及板载硬件测试代码
💻 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 + -