#include "printfs.h" #include #include uint8 number_conversion_ascii(uint32 dat, int8 *p, uint8 neg_type, uint8 radix) { int32 neg_dat; uint32 pos_dat; uint8 temp_data = 0; uint8 valid_num = 0; if(neg_type) { neg_dat = (int32)dat; if(neg_dat<0) neg_dat = -neg_dat; while(1) { *p = neg_dat%radix + '0'; neg_dat = neg_dat/radix; valid_num++; if(!neg_dat) break; p++; } } else { pos_dat = dat; while(1) { temp_data = pos_dat%radix; if(10 <= temp_data) temp_data += 'A'-10; else temp_data += '0'; *p = temp_data; pos_dat = pos_dat/radix; valid_num++; if(!pos_dat) break; p++; } } return valid_num; } void printf_reverse_order(int8 *d_buff, uint32 len) { uint32 i; int8 temp_data; for(i=0;ivlen) { vstr[vlen] = '0'; vlen++; } vstr[vlen] = '.'; vlen++; printf_reverse_order(vstr,vlen); memcpy(buff,vstr,vlen); buff += vlen; buff_len += vlen; break; } case 'u':// 无符号十进制整数 { int8 vstr[33]; uint32 ival = (uint32)va_arg(arg, uint32); uint8 vlen = number_conversion_ascii(ival, vstr, 0, 10); printf_reverse_order(vstr,vlen); memcpy(buff,vstr,vlen); buff += vlen; buff_len += vlen; }break; case 'o':// 无符号八进制整数 { int8 vstr[33]; uint32 ival = (uint32)va_arg(arg, uint32); uint8 vlen = number_conversion_ascii(ival, vstr, 0, 8); printf_reverse_order(vstr,vlen); memcpy(buff,vstr,vlen); buff += vlen; buff_len += vlen; }break; case 'x':// 无符号十六进制整数 case 'X':// 无符号十六进制整数 { int8 vstr[33]; uint32 ival = (uint32)va_arg(arg, uint32); uint8 vlen = number_conversion_ascii(ival, vstr, 0, 16); printf_reverse_order(vstr,vlen); memcpy(buff,vstr,vlen); buff += vlen; buff_len += vlen; }break; case 's':// 字符串 { int8 *pc = va_arg(arg, int8 *); while (*pc) { *buff = *pc; buff++; buff_len++; pc++; } }break; case 'p':// 以16进制形式输出指针 { int8 vstr[33]; uint32 ival = (uint32)va_arg(arg, uint32); //uint8 vlen = number_conversion_ascii(ival, vstr, 0, 16); number_conversion_ascii(ival, vstr, 0, 16); printf_reverse_order(vstr,8); memcpy(buff,vstr,8); buff += 8; buff_len += 8; }break; case '%':// 输出字符% { *buff = '%'; buff++; buff_len++; }break; default:break; } } else { *buff = (int8)(*format); buff++; buff_len++; } format++; } va_end(arg); return buff_len; }