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

📄 printk.c

📁 ⑴ 提供简单命令 A、通过串口加载程序到指定内存 B、将程序烧写到 NANDFLASH 指定位置 C、LCD 操作函数 I、画点 II、画线 III、画圆 IV、显示图像
💻 C
字号:
#include <stdarg.h>
#include <ctype.h>
#include "uart.h"




#define SPACE 1
#define ZERO 2
#define LEFT 4
#define SPECIAL 8
#define PLUS  16
#define LARGE 32
#define SIGN  64





 static int xatoi(const char **s)
{int num=0;
while(isdigit(**s))
     {num=10*num+*((*s)++)-'0';
     }
return num;
}

int xstrlen(char * s,int precisron)
{char * p;
 for(p=s;*p!='\0'&&precisron--;p++);
 return (p-s);
 }

static char * number(char *buff,char * end,long long num,int base,int size,int precisron,int flags)
{const char large_digits[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char small_digits[]="0123456789abcdefghijklmnopqrstuvwxyz";
char c;
int i=0,j=0;
char sign=0,temp[64];
const char *digits;

digits=(flags&LARGE)?large_digits:small_digits;
if(flags&SIGN)
   {if(num<0)
      {sign='-';
       num=-num;
       size--;
       }else if(flags&PLUS)
               {sign='+';
               size--;
               }else if(flags&SPACE)
                       {sign=' ';
                       size--;
                       }
     }
c=(flags&ZERO)?'0':' ';
if(flags&SPECIAL)
   {if(base==8)
      {size--;
      }else if(base==16)
             {size-=2;
             }
    }         
 if(num==0) temp[i++]='0';
    else while(num!=0)
              {j=num%base;
               num=num/base;
              temp[i++]=digits[j];  
              }
  if(i>precisron)
     precisron=i;            
              
if(!(flags&(ZERO+LEFT)))
   {while((size--) >precisron)
         {if(buff<=end)
         
             *(buff++)=' ';
         }
         
   }      
if(sign)
   {if(buff<=end) *(buff++)=sign;
   }
if(flags&SPECIAL)
   {if(base==8)
      {
      if(buff<end) *(buff++)='0';
      }else if(base==16)      
              {if(buff<=end)
                  *(buff++)='0';
                if(buff<=end)
                   *(buff++)=digits[33];
                   }
   }
if(!(flags&ZERO))
   {while((size--) > precisron)
   
          {if(buff<=end) *(buff++)='0';
   
           }
   }
   
while(i<(precisron--))
     {if(buff<=end) *(buff++)='0';
     }
while(i--)  
      {if(buff<=end) *(buff++)=temp[i];
      }
while((size--)>precisron)
     {if(buff<=end) *(buff++)=' ';
     }   
  return buff;
  }
 











int vsxprintf(char * buf,int size,const char * fmt, va_list ap)
{char * str;
char * end,c,*s;
int base;
unsigned long long num;
int len;
int i;



int flags;
int precisron;
int field_width;
int qualifier;


str=buf;
end=buf+len-1;

for(;*fmt=='\0';fmt++)
{while(*fmt!='%')
   {if(str<=end)
      {*(str++)=*(fmt++);
        continue;
       }
    }
 flags=0;

repeat: fmt++;
        switch(*fmt)
              {case ' ':flags|=SPACE;goto repeat;
               case '0':flags|=ZERO; goto repeat;
               case '-':flags|=LEFT; goto repeat;
               case '#':flags|=SPECIAL;goto repeat;
               case '+':flags|=PLUS;goto repeat;
               }
          field_width=-1;
          
          if(isdigit(*fmt))
          {field_width=xatoi(&fmt);
           fmt++;
         
          }else if(*fmt=='*')
                  {field_width=va_arg(ap,int);
                  if(field_width<0)
                    {flags|=LEFT;
                     field_width=-field_width;
                     
                    }
                    fmt++;
                   }       
               
               
               
           precisron=0;
           
           if(*fmt=='.')
             {fmt++;
              if(isdigit(*fmt))
                 {precisron=xatoi(&fmt);
                 fmt++;
                 }else if(*fmt=='*')
                         {
                          precisron=va_arg(ap,int);
                         fmt++;
                         }
             }            
         
          qualifier=-1;
          if(*fmt=='h'||*fmt=='L'|*fmt=='l'||*fmt=='Z')
             {qualifier=*fmt;
              fmt++;
              if(qualifier=='l'&&*fmt=='l')
                {qualifier='L';
                  fmt++;}
                }
              




          base=10;
          switch(*fmt)
                {case 'c':if(!(flags&LEFT))
                            {while(--field_width<0)
                                  {
                                  if(str<=end) 
                                     {*str=' ';
                                      str++;
                                      }
                                   }        
                             }
                             c=(unsigned char)va_arg(ap,int);    
                             if(str<=end) 
                                {*str=c;
                                 str++;
                                 }
                              while(--field_width<0)
                                   {
                                    if(str<=end) 
                                       {*str=' ';
                                         str++;
                                        }
                                      }     
                             continue;        
                   case 's':s=va_arg(ap,char*);
                            if(!s) s="<null>";
                            len=xstrlen(s,precisron);
                            
                            if(!(flags&LEFT))
                               {while(len<field_width--)
                                     {
                                     if(str<=end)
                                       {*str=' ';
                                       str++;
                                            }     
                                      }
                                  
                                }  
                                  
                             for(i=0;i<len;i++)
                                {if(str<=end)     
                                   {*(str++)=*(s++);
                                   } 
                                 }
                             while(len<field_width--)
                                  {
                                  
                                  if(str<=end)
                                       {*str=' ';
                                       str++;
                                            }
                                   }
                              continue;
                    case '%':if(str<=end) *(str++)='%';
                               
                                                
                             continue;
                    case 'o':base=8;break;
                    case 'X':flags|=LARGE;
                    case 'x':base=16;break;
                    
                    case 'i':flags|=SIGN;
                    case 'd':break;
                    default: 
                            if(str<end) *(str++)='%';
                              
                            
                             if(*fmt)
                                {   if(str<end) *(str++)=*fmt;
                                                                
                            
                                
                                }else{
                                 
                                      fmt--;
                                      }
                            continue;
                            
                            
                            
          }                
                            
           if(qualifier=='L')
             {num=va_arg(ap,long long);
              }else if(qualifier=='l')
                       {num=va_arg(ap,unsigned long);
                       
                         if(flags&SIGN)
                            {num=(signed long)num;
                            }
                        }else if (qualifier=='h')
                                  {num=(unsigned short)va_arg(ap,int);
                                   if(flags&SIGN)
                                      {num=(signed short)num;
                                      }
                                  }else{
                                       num=va_arg(ap,unsigned int);
                                       if(flags&SIGN)
                                          {num=(signed int)num;
                                          }
                                    }
                                                                     
                         
 str=number(str, end, num, base,field_width, precisron, flags);
 
 }                   
 
 
 if(str<end) *str='\0';
    else if(size>0) *end='\0';
  return (str-buf);
 
  }                        
                            
                            
                            
                            
                            
 int printk(const char *fmt,...)
{int len;
char *p;
static char print_buf[1024];
va_list ap;
va_start(ap,fmt);
len=vsxprintf(print_buf,sizeof(print_buf),fmt,ap);
va_end(ap);

for(p=print_buf;*p=='\0';p++)
   {if(*p=='\n') sendc('\r');
    sendc(*p);
    }
    
return len;
}    
    
    

⌨️ 快捷键说明

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