/* function for format output to the string */ #include #include #include //#include #include int formatted_double_to_string(long double number,int format1,int format2,char *s) { double n; double nbefor; double nafter; double v,v2; long intdigit; long beforpointdigit; long div; int i; int pos; int size; int fmt1; int fmt2; long mul; char buf[200]; size=(int)s; n=(double)number; if (n<0) {*s='-';s++;n=-n;} fmt1=format1; fmt2=format2; if (fmt2>18) {fmt2=18;} //maximum of size long long type //clear array befor output for(i=0;i<=200;i++) {buf[i]=0;} if ((fmt1>=0) && (n<1)) { //formatted output if 0<=n<1 mul=1; for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} else {*s='0';} s++; } } else { //if n>=1 //v=floorf(n+0.00000000000001); beforpointdigit=floor(n+0.00000000000001); //beforpointdigit=n; nbefor=beforpointdigit; nafter=n-nbefor; //print part of number befor point mul=1; for(i=0;i<200-2;i++) { mul=mul*10; if ((beforpointdigit/mul)==0) {fmt1=i+1;break;} } pos=0; mul=mul/10; for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} s++; } //print part of number after point mul=1; for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} else {*s='0';} s++; } } size=(int)s-size; return(size); } int formatted_long_to_string(long long number,int fmt1,char *s) { int i; int pos; int fmt; int size; int difference_pos; long digit; long mul; long div; char buf[200]; //clear array befor output for(i=0;i<200;i++) {buf[i]=0;} digit=number; size=(int)s; if (digit<0) {*s='-';s++;digit=-digit;} if (digit==0) {*s='0';s++;goto end;} mul=1; for(i=0;i<200-2;i++) { mul=mul*10; if ((digit/mul)==0) {fmt=i+1;break;} } difference_pos=i+1; pos=0; mul=mul/10; for(i=0;i=difference_pos) fmt=fmt1; else fmt=difference_pos; for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} } else { *s=' '; } s++; } end: size=(int)s-size; return(size); } int formatted_hex_to_string(long long number,int fmt1,char flag_register,char *s) { long n; int i,pos; int fmt; long size; int difference_pos; char xdigs_lower[16]="0123456789abcdef"; char xdigs_upper[16]="0123456789ABCDEF"; char buf[200]; n=(long)number; size=(int)s; if (n<0) {*s='-';s++;n=-n;} if (n==0) {*s='0';s++;goto end;} for(i=0;i<200;i++) {buf[i]=0;} i=0; if (flag_register==0) { while (n>0) { buf[i]=xdigs_lower[n & 15]; n=n>>4; i++; } } else { while (n>0) { buf[i]=xdigs_upper[n & 15]; n=n>>4; i++; } } pos=i; difference_pos=i; for(i=pos-1;i>=0;i--) { *s=buf[i]; s++; } if (fmt1-difference_pos>0) { for(i=difference_pos+1;i<=fmt1;i++) { *s=' '; s++; } } end:size=(int)s-size; return(size); } int formatted_octa_to_string(long long number,int fmt1,char flag_register,char *s) { long n; int i,pos; int fmt; long size; int difference_pos; char xdigs_lower[16]="012345678"; char buf[200]; n=number; size=(int)s; if (n<0) {*s='-';s++;n=-n;} if (n==0) {*s='0';s++;goto end;} for(i=0;i<200;i++) {buf[i]=0;} i=0; if (flag_register==0) { while (n>0) { buf[i]=xdigs_lower[n & 7]; n=n>>3; i++; } } pos=i; difference_pos=i; for(i=pos-1;i>=0;i--) { *s=buf[i]; s++; } if (fmt1-difference_pos>0) { for(i=difference_pos+1;i<=fmt1;i++) { *s=' '; s++; } } end:size=(int)s-size; return(size); } int format_print(char *dest, size_t maxlen,const char *fmt0, va_list argp) { int i,j,k; int length; int fmt1,fmt2,stepen; size_t pos,posc; long long intdigit; long double doubledigit; float floatdigit; const char *fmt,*fmtc; char *s; char *str; char buffmt1[30]; char buffmt2[30]; char buf[1024]; char format_flag; char flag_point; char flag_noformat; char flag_long; char flag_unsigned; char flag_register; char flag_plus; fmt=fmt0; s=dest; pos=0; while(pos maxlen) length = maxlen - pos; memcpy(s,str,length); s=s+length;pos=pos+length; break; case 'd': case 'D': case 'i': case 'I': if (flag_long==0) {intdigit=va_arg(argp,int);} if (flag_long==1) {intdigit=va_arg(argp,long);} if (flag_long==2) {intdigit=va_arg(argp,long long);} //intdigit=*((long*)argp); //argp=argp+4; if ((intdigit>0) && (flag_plus==1) && (pos+1<=maxlen)) { *s='+'; s++; pos++; } length=formatted_long_to_string(intdigit,0,buf); if (pos + length > maxlen) length = maxlen - pos; memcpy(s,buf,length); s=s+length;pos=pos+length; break; case 'o': if (flag_long==0) {intdigit=va_arg(argp,int);} if (flag_long==1) {intdigit=va_arg(argp,long);} if (flag_long==2) {intdigit=va_arg(argp,long long);} //intdigit=*((long int *)argp); //argp=argp+4; length=formatted_octa_to_string(intdigit,0,flag_register,buf); if (pos + length > maxlen) length = maxlen - pos; memcpy(s,buf,length); s=s+length;pos=pos+length; break; case 'u': case 'U': if (flag_long==0) {intdigit=va_arg(argp,int);} if (flag_long==1) {intdigit=va_arg(argp,long int);} if (flag_long==2) {intdigit=va_arg(argp,long long);} if (flag_unsigned==1) { if (intdigit<0) {intdigit=-intdigit;} } length=formatted_long_to_string(intdigit,0,buf); if (pos + length > maxlen) length = maxlen - pos; memcpy(s,buf,length); s=s+length;pos=pos+length; break; case 'p': case 'P': case 'x': case 'X': if (flag_long==0) {intdigit=va_arg(argp,int);} if (flag_long==1) {intdigit=va_arg(argp,long);} if (flag_long==2) {intdigit=va_arg(argp,long long);} //intdigit=*((long int *)argp); //argp=argp+4; length=formatted_hex_to_string(intdigit,0,flag_register,buf); if (pos + length > maxlen) length = maxlen - pos; memcpy(s,buf,length); s=s+length;pos=pos+length; break; case 'z': case 'Z': intdigit=va_arg(argp,size_t); if (flag_unsigned==1) { if (intdigit<0) {intdigit=-intdigit;} } length=formatted_long_to_string(intdigit,0,buf); if (pos + length > maxlen) length = maxlen - pos; memcpy(s,buf,length); s=s+length;pos=pos+length; break; default:; } } else { fmt++; flag_point=0; flag_noformat=0; fmt1=0; fmt2=0; j=0; k=0; for(i=pos+1;i=0;i--) { fmt1=fmt1+buffmt1[i]*stepen; stepen=stepen*10; } stepen=1; for(i=k-1;i>=0;i--) { fmt2=fmt2+buffmt2[i]*stepen; stepen=stepen*10; } switch(*fmtc) { case 'f': case 'F': if (flag_long==0) {doubledigit=va_arg(argp,double);} if (flag_long>=1) {doubledigit=va_arg(argp,long double);} //doubledigit=*((double *)argp); //sargp=argp+8; length=formatted_double_to_string(doubledigit,fmt1,fmt2,buf); if ((pos+length)0) && (flag_plus==1) && (pos+1