From 040a9182db7c17b96dda916aa1ba50b325d80bb8 Mon Sep 17 00:00:00 2001 From: rtt <141220098@smail.nju.edu.cn> Date: Tue, 18 Jul 2017 08:32:06 -0700 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96printdec=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=8E=BB=E9=99=A4=E5=86=97=E4=BD=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/klib/printk.c | 32 ++++++++++---------------------- tests/klibtest/src/main.c | 2 +- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/libs/klib/printk.c b/libs/klib/printk.c index d5f7322e..800b0d98 100644 --- a/libs/klib/printk.c +++ b/libs/klib/printk.c @@ -113,29 +113,15 @@ char* printch(char ch,char** s){ return *s; } int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s){ - int rewid=0; + 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); while(dec>0){ dec=dec/base; rewid++; @@ -144,7 +130,7 @@ int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s){ return rewid; } int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,int count){ - if(dec==0){ + if(dec == 0){ if(flagc!='-'){ width++; if(abs=='-')width--; @@ -161,12 +147,14 @@ int vprintdec(unsigned int dec,int base,int width,char abs,char flagc,char** s,i else{ if(width>0)myputc(flagc,s); } - return width; + //return width; } else if(abs=='-'){myputc('-',s);width--;} + if(count == 0)myputc('0',s); return width; } - int re;//vprintdec(dec/base,base,width-1,flagc,s+1); + //_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); if(dec%base>9)myputc(dec%base+'a'-10,s); else myputc((char)(dec%base+'0'),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); From fa7ca39d5295ac06e6fed6d4462f4959b58bbc7a Mon Sep 17 00:00:00 2001 From: rtt <141220098@smail.nju.edu.cn> Date: Tue, 18 Jul 2017 09:38:17 -0700 Subject: [PATCH 2/3] =?UTF-8?q?=E7=BB=99myputc=E5=A2=9E=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BD=BF=E5=BE=97snprintf=E4=B8=AD=E5=A4=A7=E4=BA=8En?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86=E4=B8=8D=E5=BE=97=E6=8B=B7=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/klib/printk.c | 75 ++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/libs/klib/printk.c b/libs/klib/printk.c index 800b0d98..3a8e3ecd 100644 --- a/libs/klib/printk.c +++ b/libs/klib/printk.c @@ -3,21 +3,24 @@ //static char* s_h=0; -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,27 @@ 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++;} 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 +95,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,19 +103,19 @@ 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 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){ @@ -121,7 +124,7 @@ int printdec(unsigned int dec,int base,int width,char abs,char flagc,char** s){ rewid++; twid--; } - vprintdec(dec,base,twid,abs,flagc,s,0); + vprintdec(dec,base,twid,abs,flagc,s,0,limit_n); while(dec>0){ dec=dec/base; rewid++; @@ -129,47 +132,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){ +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; } - else if(abs=='-'){myputc('-',s);width--;} - if(count == 0)myputc('0',s); + else if(abs=='-'){myputc('-',s,limit_n);width--;} + if(count == 0)myputc('0',s,limit_n); return width; } //_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); - if(dec%base>9)myputc(dec%base+'a'-10,s); - else myputc((char)(dec%base+'0'),s); + 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; From 6b067740723e502550c3fe245dbc7407b01b29d9 Mon Sep 17 00:00:00 2001 From: rtt <141220098@smail.nju.edu.cn> Date: Thu, 7 Sep 2017 08:45:46 -0700 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3sprintf=E4=B8=AD\0?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/klib/printk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/klib/printk.c b/libs/klib/printk.c index 3a8e3ecd..96832ea4 100644 --- a/libs/klib/printk.c +++ b/libs/klib/printk.c @@ -80,7 +80,10 @@ int vprintk(char* out,int limit,const char* fmt,va_list ap){ rewid++; } } - if(out!=0){printch('\0',s_v,limit_n);rewid++;} + if(out!=0){ + printch('\0',s_v,limit_n); + //rewid++;结尾的\0不算在返回值中 + } return rewid; }