diff --git a/libs/klib/src/printk.c b/libs/klib/src/printk.c index 84fd91bf..4ac25b82 100644 --- a/libs/klib/src/printk.c +++ b/libs/klib/src/printk.c @@ -3,21 +3,24 @@ #ifndef __ISA_NATIVE__ -char* printch(char ch,char** s); -int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s); -int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int count); -char* printstr(char* str,char** s); -void myputc(char c,char** s_h){ - if(*s_h==0)_putc(c); - else {**s_h=c; +char* printch(char ch,char** s,int* limit_n); +int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int* limit_n); +int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int count,int* limit_n); +char* printstr(char* str,char** s,int* limit_n); +void myputc(char c,char** s_h,int* limit_n){ + if(*s_h == 0) _putc(c); + else if(*limit_n != 1){ + **s_h=c; (*s_h)++; + (*limit_n)--; } } -int vprintk(char* out,const char* fmt,va_list ap){ +int vprintk(char* out,int limit,const char* fmt,va_list ap){ unsigned int rewid=0; char** s_v=&out; + int* limit_n = &limit; int vargint=0; unsigned int varguint=0; char* vargpch=0; @@ -53,8 +56,8 @@ int vprintk(char* out,const char* fmt,va_list ap){ pfmt-=2; goto reswitch; case '*':width=va_arg(ap,int);goto reswitch; - case 'c':vargch=va_arg(ap,int);printch(vargch,s_v);rewid++;break; - case '%':printch('%',s_v);rewid++;break; + case 'c':vargch=va_arg(ap,int);printch(vargch,s_v,limit_n);rewid++;break; + case '%':printch('%',s_v,limit_n);rewid++;break; case 'd':vargint=va_arg(ap,int);base=10;if(vargint<0){ abs='-'; varguint=-vargint; @@ -64,27 +67,30 @@ int vprintk(char* out,const char* fmt,va_list ap){ case 'u':varguint=va_arg(ap,unsigned int);base=10;goto nump; case 'x': case 'X':varguint=va_arg(ap,int);base=16;goto nump; - case 'p':myputc('0',s_v);myputc('x',s_v);varguint=(long)va_arg(ap,void*);base=16;goto nump; + case 'p':myputc('0',s_v,limit_n);myputc('x',s_v,limit_n);varguint=(long)va_arg(ap,void*);base=16;goto nump; nump: - rewid+=printdec(varguint,base,width,abs,flagc,s_v);break; - case 's':vargpch=va_arg(ap,char*);printstr(vargpch,s_v);rewid+=strlen(vargpch);break; + rewid+=printdec(varguint,base,width,abs,flagc,s_v,limit_n);break; + case 's':vargpch=va_arg(ap,char*);printstr(vargpch,s_v,limit_n);rewid+=strlen(vargpch);break; default:; } pfmt++; } else{ - out=printch(*pfmt++,s_v); + out=printch(*pfmt++,s_v,limit_n); rewid++; } } - if(out!=0){printch('\0',s_v);rewid++;} + if(out!=0){ + printch('\0',s_v,limit_n); + //rewid++;结尾的\0不算在返回值中 + } return rewid; } int printk(const char* fmt,...){ va_list ap; va_start(ap,fmt); - int r=vprintk(0,fmt,ap); + int r=vprintk(0,0,fmt,ap); va_end(ap); return r; } @@ -92,7 +98,7 @@ int printk(const char* fmt,...){ int sprintf(char* out,const char* fmt,...){ va_list ap; va_start(ap,fmt); - int r=vprintk(out,fmt,ap); + int r=vprintk(out,0,fmt,ap); va_end(ap); return r; } @@ -100,42 +106,28 @@ int sprintf(char* out,const char* fmt,...){ int snprintf(char* out, size_t n, const char* fmt, ...){ va_list ap; va_start(ap,fmt); - int r=vprintk(out,fmt,ap); + int r=vprintk(out,n+1,fmt,ap); va_end(ap); if(strlen(out)>=n)*(out+n)='\0'; return r; } -char* printch(char ch,char** s){ +char* printch(char ch,char** s,int* limit_n){ //if(s==0)_putc(ch); //else *s++=ch; - myputc(ch,s); + myputc(ch,s,limit_n); return *s; } -int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s){ - int rewid=0; +int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int* limit_n){ + int rewid=0,twid=width; if(abs=='-')rewid++; if(dec==0){ - if(width>0){ - if(flagc != '-'){ - while(--width>0){ - if(flagc == '+')myputc(' ',s); - else myputc(flagc,s); - } - } - myputc('0',s); - if(flagc == '-'){ - while(--width>0){ - myputc(' ',s); - } - } - } - else{ - myputc('0',s); - } + //myputc('0',s); + //dec=-1; rewid++; + twid--; } - else vprintdec(dec,base,width,abs,flagc,s,0); + vprintdec(dec,base,twid,abs,flagc,s,0,limit_n); while(dec>0){ dec=dec/base; rewid++; @@ -143,45 +135,47 @@ int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s){ if(width>0&&rewid>width)rewid=width; return rewid; } -int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int count){ - if(dec==0){ +int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int count,int* limit_n){ + if(dec == 0){ if(flagc!='-'){ width++; if(abs=='-')width--; while(width-->1){ if(flagc!='+'){ - myputc(flagc,s); + myputc(flagc,s,limit_n); } else{ - myputc(' ',s); + myputc(' ',s,limit_n); } } - if(flagc=='+')myputc(abs,s); - else if(abs=='-')myputc('-',s); + if(flagc=='+')myputc(abs,s,limit_n); + else if(abs=='-')myputc('-',s,limit_n); else{ - if(width>0)myputc(flagc,s); + if(width>0)myputc(flagc,s,limit_n); } - return width; + //return width; } - else if(abs=='-'){myputc('-',s);width--;} + else if(abs=='-'){myputc('-',s,limit_n);width--;} + if(count == 0)myputc('0',s,limit_n); return width; } - int re;//vprintdec(dec/base,base,width-1,flagc,s+1); - re=vprintdec(dec/base,base,width-1,abs,flagc,s,count+1); - if(dec%base>9)myputc(dec%base+'a'-10,s); - else myputc((char)(dec%base+'0'),s); + //_putc('0'); + int re=0;//vprintdec(dec/base,base,width-1,flagc,s+1); + re=vprintdec(dec/base,base,width-1,abs,flagc,s,count+1,limit_n); + if(dec%base>9)myputc(dec%base+'a'-10,s,limit_n); + else myputc((char)(dec%base+'0'),s,limit_n); if(flagc=='-'&&count==0){ - while(re-->0)myputc(' ',s); + while(re-->0)myputc(' ',s,limit_n); } return re; } -char* printstr(char* str,char** s){ +char* printstr(char* str,char** s,int *limit_n){ while(*str){ //_putc(*str); //if(s==0)_putc(*str++); //else*s++=*str++; - myputc(*str++,s); + myputc(*str++,s,limit_n); } //*s++='\0'; return *s; diff --git a/tests/klibtest/src/main.c b/tests/klibtest/src/main.c index 2162be01..7416379c 100644 --- a/tests/klibtest/src/main.c +++ b/tests/klibtest/src/main.c @@ -7,7 +7,7 @@ void memory_test(); int main() { printk_test(); memory_test(); - //printk("%02dd\n",0); + //printk("%03dd\n",0); // Finally reaches here. int volatile x = 0; assert(x != x);