给myputc增加参数使得snprintf中大于n的部分不得拷贝
This commit is contained in:
parent
040a9182db
commit
fa7ca39d52
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue