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

📄 xil_printf.c

📁 ULTRACTR的源码
💻 C
字号:
/*---------------------------------------------------*//* Modified from :                                   *//* Public Domain version of printf                   *//* Rud Merriam, Compsult, Inc. Houston, Tx.          *//* For Embedded Systems Programming, 1991            *//*                                                   *//*---------------------------------------------------*/#include <ctype.h>#include <string.h>#include <stdarg.h>extern void outbyte (char);/*---------------------------------------------------*//* The purpose of this routine is to output data the *//* same as the standard printf function without the  *//* overhead most run-time libraries involve. Usually *//* the printf brings in many kiolbytes of code and   *//* that is unacceptable in most embedded systems.    *//*---------------------------------------------------*/typedef char* charptr;typedef int (*func_ptr)(int c);static int do_padding;static int left_flag;static int len;static int num1;static int num2;static char pad_character;/*---------------------------------------------------*//*                                                   *//* This routine puts pad characters into the output  *//* buffer.                                           *//*                                                   */static void padding( const int l_flag){   int i;   if (do_padding && l_flag && (len < num1))      for (i=len; i<num1; i++)          outbyte( pad_character);   }/*---------------------------------------------------*//*                                                   *//* This routine moves a string to the output buffer  *//* as directed by the padding and positioning flags. *//*                                                   */static void outs( charptr lp){   /* pad on left if needed                          */   len = strlen( lp);   padding( !left_flag);   /* Move string to the buffer                      */   while (*lp && num2--)      outbyte( *lp++);   /* Pad on right if needed                         */   len = strlen( lp);   padding( left_flag);   }/*---------------------------------------------------*//*                                                   *//* This routine moves a number to the output buffer  *//* as directed by the padding and positioning flags. *//*                                                   */static void outnum( const long num1, const long base){   charptr cp;   int negative;   char outbuf[32];   const char digits[] = "0123456789ABCDEF";   unsigned long num;   /* Check if number is negative                    */   if (base == 10 && num1 < 0L) {      negative = 1;      num = -num1;      }   else{      num = num1;      negative = 0;   }      /* Build number (backwards) in outbuf             */   cp = outbuf;   do {      *cp++ = digits[(int)(num % base)];      } while ((num /= base) > 0);   if (negative)      *cp++ = '-';   *cp-- = 0;   /* Move the converted number to the buffer and    */   /* add in the padding where needed.               */   len = strlen(outbuf);   padding( !left_flag);   while (cp >= outbuf)      outbyte( *cp--);   padding( left_flag);   }/*---------------------------------------------------*//*                                                   *//* This routine gets a number from the format        *//* string.                                           *//*                                                   */static int getnum( charptr* linep){   int n;   charptr cp;   n = 0;   cp = *linep;   while (isdigit(*cp))      n = n*10 + ((*cp++) - '0');   *linep = cp;   return(n);}/*---------------------------------------------------*//*                                                   *//* This routine operates just like a printf/sprintf  *//* routine. It outputs a set of data under the       *//* control of a formatting string. Not all of the    *//* standard C format control are supported. The ones *//* provided are primarily those needed for embedded  *//* systems work. Primarily the floaing point         *//* routines are omitted. Other formats could be      *//* added easily by following the examples shown for  *//* the supported formats.                            *//*                                                   *//* void esp_printf( const func_ptr f_ptr,   const charptr ctrl1, ...) */void xil_printf( const charptr ctrl1, ...){   int long_flag;   int dot_flag;   char ch;   va_list argp;   charptr ctrl = ctrl1;   va_start( argp, ctrl1);   for ( ; *ctrl; ctrl++) {      /* move format string chars to buffer until a  */      /* format control is found.                    */      if (*ctrl != '%') {         outbyte(*ctrl);         continue;         }      /* initialize all the flags for this format.   */      dot_flag   =      long_flag  =      left_flag  =      do_padding = 0;      pad_character = ' ';      num2=32767;try_next:      ch = *(++ctrl);      if (isdigit(ch)) {         if (dot_flag)            num2 = getnum(&ctrl);         else {            if (ch == '0')               pad_character = '0';            num1 = getnum(&ctrl);            do_padding = 1;         }         ctrl--;         goto try_next;      }      switch (tolower(ch)) {         case '%':              outbyte( '%');              continue;         case '-':              left_flag = 1;              break;         case '.':              dot_flag = 1;              break;         case 'l':              long_flag = 1;              break;         case 'd':              if (long_flag || ch == 'D') {                 outnum( va_arg(argp, long), 10L);                 continue;                 }              else {                 outnum( va_arg(argp, int), 10L);                 continue;                 }         case 'x':              outnum((long)va_arg(argp, int), 16L);              continue;         case 's':              outs( va_arg( argp, charptr));              continue;         case 'c':              outbyte( va_arg( argp, int));              continue;         case '\\':              switch (*ctrl) {                 case 'a':                      outbyte( 0x07);                      break;                 case 'h':                      outbyte( 0x08);                      break;                 case 'r':                      outbyte( 0x0D);                      break;                 case 'n':                      outbyte( 0x0D);                      outbyte( 0x0A);                      break;                 default:                      outbyte( *ctrl);                      break;                 }              ctrl++;              break;         default:              continue;         }      goto try_next;      }   va_end( argp);   }/*---------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -