📄 printk.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 + -