Merge branch 'refactor-klib' into 'master'

Refactor klib

See merge request !147
This commit is contained in:
Yanyan Jiang 2018-02-15 17:32:37 +08:00
commit 64019f5042
2 changed files with 51 additions and 57 deletions

View File

@ -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;

View File

@ -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);