/* * * printk.c * * printk for bootbox * * support format: * %c * %s * %[[0]n]x * %[[0]n]X * %[[0]n]d * */ #include #include #include #include "main.h" static int itostr(char *buf, int in_data, int base, int upper, int sign) { int res, len, i; unsigned int data; char *str; if(base==10 && sign && in_data<0){ data = -in_data; }else{ data = in_data; } str = buf; do{ res = data%base; data = data/base; if(res<10){ res += '0'; }else{ if(upper){ res += 'A'-10; }else{ res += 'a'-10; } } *str++ = res; }while(data); len = str-buf; /* reverse digital order */ for(i=0; i'0' && *fmt<='9'){ field_width = field_width*10+(*fmt-'0'); fmt++; } if(*fmt && *fmt=='.'){ fmt++; /* skip n */ while(*fmt && *fmt>'0' && *fmt<='9'){ fmt++; } } /* get format char */ upper = 0; base = 0; sign = 0; len = 0; s = digital_buf; while((ch=*fmt)!=0){ fmt++; switch(ch){ /* hexadecimal */ case 'p': case 'X': upper = 1; case 'x': base = 16; break; /* decimal */ case 'd': case 'i': sign = 1; case 'u': base = 10; break; /* octal */ case 'o': base = 8; break; /* character */ case 'c': digital_buf[0] = (unsigned char) va_arg(args, int); len = 1; break; /* string */ case 's': s = va_arg(args, char *); if(!s) s = ""; len = strlen(s); break; /* float format, skip it */ case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'a': case 'A': (void)(va_arg(args, double)); s = NULL; break; /* length modifier */ case 'l': case 'L': case 'h': case 'j': case 'z': case 't': /* skip it */ continue; /* bad format */ default: s = sstr; len = fmt-sstr; break; } break; } if(base){ i = va_arg(args, int); if(base==10 && sign){ if(i<0){ add_sign = '-'; } }else{ add_sign = 0; } len = itostr(digital_buf, i, base, upper, sign); }else{ zero_pad = ' '; add_sign = 0; } if(s){ if(len>=field_width){ field_width = len; if(add_sign) field_width++; } for(i=0; i