分享一个函数,linux内核0.11代码Vsprintf中的一个函数


// 将整数转换为指定进制的字符串。
// 输入:num-整数;base-进制;size-字符串长度;precision-数字长度(精度);type-类型选项。
// 输出:str 字符串指针。
static char * number(char * str, int num, int base, int size, int precision
,int type)
{
char c,sign,tmp[36];
const char *digits= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i;

// 如果类型type 指出用小写字母,则定义小写字母集。
// 如果类型指出要左调整(靠左边界),则屏蔽类型中的填零标志。
// 如果进制基数小于2 或大于36,则退出处理,也即本程序只能处理基数在2-32 之间的数。

if (type&SMALL) digits= "0123456789abcdefghijklmnopqrstuvwxyz";
if (type&LEFT) type &= ~ZEROPAD;    //#define  ZEROPAD  1 填充0标志
if (base<2 || base>36)
return 0;
// 如果类型指出要填零,则置字符变量c='0'(也即''),否则c 等于空格字符。
// 如果类型指出是带符号数并且数值num 小于0,则置符号变量sign=负号,并使num 取绝对值。
// 否则如果类型指出是加号,则置sign=加号,否则若类型带空格标志则sign=空格,否则置0。
c = (type & ZEROPAD) ? '' : ' ' ;
if (type&SIGN && num<0) {
sign= '-';
num = -num;
} else
sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0);
// 若带符号,则宽度值减1。若类型指出是特殊转换,则对于十六进制宽度再减少2 位(用于0x),
// 对于八进制宽度减1(用于八进制转换结果前放一个零)。
if (sign) size--;
if (type&SPECIAL)
if (base==16) size -= 2;
else if (base==8) size--;
// 如果数值num 为0,则临时字符串='0';否则根据给定的基数将数值num 转换成字符形式。
i=0;
if (num==0)
tmp[i++]= '';
else while (num!=0)
tmp[i++]=digits[do_div(num,base)];
// 若数值字符个数大于精度值,则精度值扩展为数字个数值。
// 宽度值size 减去用于存放数值字符的个数。
if (i>precision) precision=i;
size -= precision;
// 从这里真正开始形成所需要的转换结果,并暂时放在字符串str 中。
// 若类型中没有填零(ZEROPAD)和左靠齐(左调整)标志,则在str 中首先
// 填放剩余宽度值指出的空格数。若需带符号位,则存入符号。
if (!(type&(ZEROPAD+LEFT)))
while(size-->0)
*str++ = ' ';
if (sign)
*str++ = sign;
// 若类型指出是特殊转换,则对于八进制转换结果头一位放置一个'0';而对于十六进制则存放'0x'。
if (type&SPECIAL)
if (base==8)
*str++ = '';
else if (base==16) {
*str++ = '';
*str++ = digits[33]; // 'X'或'x'
}
// 若类型中没有左调整(左靠齐)标志,则在剩余宽度中存放c 字符('0'或空格),见51 行。
if (!(type&LEFT))
while(size-->0)
*str++ = c;
// 此时i 存有数值num 的数字个数。若数字个数小于精度值,则str 中放入(精度值-i)个'0'。
while(i<precision--)
*str++ = '';
// 将转数值换好的数字字符填入str 中。共i 个。
while(i-->0)
*str++ = tmp[i];
// 若宽度值仍大于零,则表示类型标志中有左靠齐标志标志。则在剩余宽度中放入空格。
while(size-->0)
*str++ = ' ';
return str; // 返回转换好的字符串。
}
 以前上学的时候实现过转换成2进制,8进制,16进制的函数,看到这个函数才知道原来可以做的这个强悍。分享一个……

你可能感兴趣的:(分享一个函数,linux内核0.11代码Vsprintf中的一个函数)