📄 78.html
字号:
<a name='L102'> <b>if</b> (!(type & (<a href='../S/78.html#L33' title='Defined at 33 in kernel/vsprintf.c.'>ZEROPAD</a> + <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>)))
<a name='L103'> <b>while</b> (size-- > 0)
<a name='L104'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L105'> <b>if</b> (sign)
<a name='L106'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = sign;
<a name='L107'><i><font color='green'>// 若类型指出是特殊转换,则对于八进制转换结果头一位放置一个'0';而对于十六进制则存放'0x'。</font></i>
<a name='L108'> <b>if</b> (type & <a href='../S/78.html#L38' title='Defined at 38 in kernel/vsprintf.c.'>SPECIAL</a>)
<a name='L109'> <b>if</b> (base == 8)
<a name='L110'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = '';
<a name='L111'> <b>else</b> <b>if</b> (base == 16)
<a name='L112'> <font color='red'>{</font>
<a name='L113'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = '';
<a name='L114'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = digits[33]; <i><font color='green'>// 'X'或'x'</font></i>
<a name='L115'> <font color='red'>}</font>
<a name='L116'><i><font color='green'>// 若类型中没有左调整(左靠齐)标志,则在剩余宽度中存放c 字符('0'或空格),见51 行。</font></i>
<a name='L117'> <b>if</b> (!(type & <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>))
<a name='L118'> <b>while</b> (size-- > 0)
<a name='L119'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = c;
<a name='L120'><i><font color='green'>// 此时i 存有数值num 的数字个数。若数字个数小于精度值,则str 中放入(精度值-i)个'0'。</font></i>
<a name='L121'> <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < precision--)
<a name='L122'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = '';
<a name='L123'><i><font color='green'>// 将转数值换好的数字字符填入str 中。共i 个。</font></i>
<a name='L124'> <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>-- > 0)
<a name='L125'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = tmp[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>];
<a name='L126'><i><font color='green'>// 若宽度值仍大于零,则表示类型标志中有左靠齐标志标志。则在剩余宽度中放入空格。</font></i>
<a name='L127'> <b>while</b> (size-- > 0)
<a name='L128'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L129'> <b>return</b> <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>; <i><font color='green'>// 返回转换好的字符串。</font></i>
<a name='L130'><font color='red'>}</font>
<a name='L131'>
<a name='L132'><i><font color='green'>// 下面函数是送格式化输出到字符串中。</font></i>
<a name='L133'><i><font color='green'>// 为了能在内核中使用格式化的输出,Linus 在内核实现了该C 标准函数。</font></i>
<a name='L134'><i><font color='green'>// 其中参数fmt 是格式字符串;args 是个数变化的值;buf 是输出字符串缓冲区。</font></i>
<a name='L135'><i><font color='green'>// 请参见本代码列表后的有关格式转换字符的介绍。</font></i>
<a name='L136'><b>int</b>
<a name='L137'><a href='../R/727.html' title='Multiple refered from 3 places.'>vsprintf</a> (<b>char</b> *buf, <b>const</b> <b>char</b> *fmt, va_list args)
<a name='L138'><font color='red'>{</font>
<a name='L139'> <b>int</b> len;
<a name='L140'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L141'> <b>char</b> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>; <i><font color='green'>// 用于存放转换过程中的字符串。</font></i>
<a name='L142'> <b>char</b> *s;
<a name='L143'> <b>int</b> *ip;
<a name='L144'>
<a name='L145'> <b>int</b> flags; <i><font color='green'>/* flags to number() */</font></i>
<a name='L146'><i><font color='green'>/* number()函数使用的标志 */</font></i>
<a name='L147'> <b>int</b> field_width; <i><font color='green'>/* width of output field */</font></i>
<a name='L148'><i><font color='green'>/* 输出字段宽度*/</font></i>
<a name='L149'> <b>int</b> precision; <i><font color='green'>/* min. # of digits for integers; max</font></i>
<a name='L150'><i><font color='green'> number of chars for from string */</font></i>
<a name='L151'><i><font color='green'>/* min. 整数数字个数;max. 字符串中字符个数 */</font></i>
<a name='L152'> <b>int</b> qualifier; <i><font color='green'>/* 'h', 'l', or 'L' for integer fields */</font></i>
<a name='L153'><i><font color='green'>/* 'h', 'l',或'L'用于整数字段 */</font></i>
<a name='L154'><i><font color='green'>// 首先将字符指针指向buf,然后扫描格式字符串,对各个格式转换指示进行相应的处理。</font></i>
<a name='L155'> <b>for</b> (<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>; *fmt; ++fmt)
<a name='L156'> <font color='red'>{</font>
<a name='L157'><i><font color='green'>// 格式转换指示字符串均以'%'开始,这里从fmt 格式字符串中扫描'%',寻找格式转换字符串的开始。</font></i>
<a name='L158'><i><font color='green'>// 不是格式指示的一般字符均被依次存入str。</font></i>
<a name='L159'> <b>if</b> (*fmt != '%')
<a name='L160'> <font color='red'>{</font>
<a name='L161'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = *fmt;
<a name='L162'> <b>continue</b>;
<a name='L163'> <font color='red'>}</font>
<a name='L164'>
<a name='L165'><i><font color='green'>// 下面取得格式指示字符串中的标志域,并将标志常量放入flags 变量中。</font></i>
<a name='L166'><i><font color='green'>/* process flags */</font></i>
<a name='L167'> flags = 0;
<a name='L168'> repeat:
<a name='L169'> ++fmt; <i><font color='green'>/* this also skips first '%' */</font></i>
<a name='L170'> <b>switch</b> (*fmt)
<a name='L171'> <font color='red'>{</font>
<a name='L172'> <b>case</b> '-':
<a name='L173'> flags |= <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>;
<a name='L174'> <b>goto</b> repeat; <i><font color='green'>// 左靠齐调整。</font></i>
<a name='L175'> <b>case</b> '+':
<a name='L176'> flags |= <a href='../S/78.html#L35' title='Defined at 35 in kernel/vsprintf.c.'>PLUS</a>;
<a name='L177'> <b>goto</b> repeat; <i><font color='green'>// 放加号。</font></i>
<a name='L178'> <b>case</b> ' ':
<a name='L179'> flags |= <a href='../S/78.html#L36' title='Defined at 36 in kernel/vsprintf.c.'>SPACE</a>;
<a name='L180'> <b>goto</b> repeat; <i><font color='green'>// 放空格。</font></i>
<a name='L181'> <b>case</b> '#':
<a name='L182'> flags |= <a href='../S/78.html#L38' title='Defined at 38 in kernel/vsprintf.c.'>SPECIAL</a>;
<a name='L183'> <b>goto</b> repeat; <i><font color='green'>// 是特殊转换。</font></i>
<a name='L184'> <b>case</b> '':
<a name='L185'> flags |= <a href='../S/78.html#L33' title='Defined at 33 in kernel/vsprintf.c.'>ZEROPAD</a>;
<a name='L186'> <b>goto</b> repeat; <i><font color='green'>// 要填零(即'0')。</font></i>
<a name='L187'> <font color='red'>}</font>
<a name='L188'>
<a name='L189'><i><font color='green'>// 取当前参数字段宽度域值,放入field_width 变量中。如果宽度域中是数值则直接取其为宽度值。</font></i>
<a name='L190'><i><font color='green'>// 如果宽度域中是字符'*',表示下一个参数指定宽度。因此调用va_arg 取宽度值。若此时宽度值</font></i>
<a name='L191'><i><font color='green'>// 小于0,则该负数表示其带有标志域'-'标志(左靠齐),因此还需在标志变量中添入该标志,并</font></i>
<a name='L192'><i><font color='green'>// 将字段宽度值取为其绝对值。</font></i>
<a name='L193'><i><font color='green'>/* get field width */</font></i>
<a name='L194'> field_width = -1;
<a name='L195'> <b>if</b> (<a href='../S/78.html#L19' title='Defined at 19 in kernel/vsprintf.c.'>is_digit</a> (*fmt))
<a name='L196'> field_width = <a href='../S/78.html#L23' title='Defined at 23 in kernel/vsprintf.c.'>skip_atoi</a> (&fmt);
<a name='L197'> <b>else</b> <b>if</b> (*fmt == '*')
<a name='L198'> <font color='red'>{</font>
<a name='L199'><i><font color='green'>/* it's the next argument */</font></i>
<a name='L200'> field_width = <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>int</b>);
<a name='L201'> <b>if</b> (field_width < 0)
<a name='L202'> <font color='red'>{</font>
<a name='L203'> field_width = -field_width;
<a name='L204'> flags |= <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>;
<a name='L205'> <font color='red'>}</font>
<a name='L206'> <font color='red'>}</font>
<a name='L207'>
<a name='L208'><i><font color='green'>// 下面这段代码,取格式转换串的精度域,并放入precision 变量中。精度域开始的标志是'.'。</font></i>
<a name='L209'><i><font color='green'>// 其处理过程与上面宽度域的类似。如果精度域中是数值则直接取其为精度值。如果精度域中是</font></i>
<a name='L210'><i><font color='green'>// 字符'*',表示下一个参数指定精度。因此调用va_arg 取精度值。若此时宽度值小于0,则</font></i>
<a name='L211'><i><font color='green'>// 将字段精度值取为其绝对值。</font></i>
<a name='L212'><i><font color='green'>/* get the precision */</font></i>
<a name='L213'> precision = -1;
<a name='L214'> <b>if</b> (*fmt == '.')
<a name='L215'> <font color='red'>{</font>
<a name='L216'> ++fmt;
<a name='L217'> <b>if</b> (<a href='../S/78.html#L19' title='Defined at 19 in kernel/vsprintf.c.'>is_digit</a> (*fmt))
<a name='L218'> precision = <a href='../S/78.html#L23' title='Defined at 23 in kernel/vsprintf.c.'>skip_atoi</a> (&fmt);
<a name='L219'> <b>else</b> <b>if</b> (*fmt == '*')
<a name='L220'> <font color='red'>{</font>
<a name='L221'><i><font color='green'>/* it's the next argument */</font></i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -