📄 78.html
字号:
<a name='L222'> precision = <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>int</b>);
<a name='L223'> <font color='red'>}</font>
<a name='L224'> <b>if</b> (precision < 0)
<a name='L225'> precision = 0;
<a name='L226'> <font color='red'>}</font>
<a name='L227'>
<a name='L228'><i><font color='green'>// 下面这段代码分析长度修饰符,并将其存入qualifer 变量。(h,l,L 的含义参见列表后的说明)。</font></i>
<a name='L229'><i><font color='green'>/* get the conversion qualifier */</font></i>
<a name='L230'> qualifier = -1;
<a name='L231'> <b>if</b> (*fmt == 'h' || *fmt == 'l' || *fmt == 'L')
<a name='L232'> <font color='red'>{</font>
<a name='L233'> qualifier = *fmt;
<a name='L234'> ++fmt;
<a name='L235'> <font color='red'>}</font>
<a name='L236'>
<a name='L237'><i><font color='green'>// 下面分析转换指示符。</font></i>
<a name='L238'> <b>switch</b> (*fmt)
<a name='L239'> <font color='red'>{</font>
<a name='L240'><i><font color='green'>// 如果转换指示符是'c',则表示对应参数应是字符。此时如果标志域表明不是左靠齐,则该字段前面</font></i>
<a name='L241'><i><font color='green'>// 放入宽度域值-1 个空格字符,然后再放入参数字符。如果宽度域还大于0,则表示为左靠齐,则在</font></i>
<a name='L242'><i><font color='green'>// 参数字符后面添加宽度值-1 个空格字符。</font></i>
<a name='L243'> <b>case</b> 'c':
<a name='L244'> <b>if</b> (!(flags & <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>))
<a name='L245'> <b>while</b> (--field_width > 0)
<a name='L246'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L247'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = (<b>unsigned</b> <b>char</b>) <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>int</b>);
<a name='L248'> <b>while</b> (--field_width > 0)
<a name='L249'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L250'> <b>break</b>;
<a name='L251'>
<a name='L252'><i><font color='green'>// 如果转换指示符是's',则表示对应参数是字符串。首先取参数字符串的长度,若其超过了精度域值,</font></i>
<a name='L253'><i><font color='green'>// 则扩展精度域=字符串长度。此时如果标志域表明不是左靠齐,则该字段前放入(宽度值-字符串长度)</font></i>
<a name='L254'><i><font color='green'>// 个空格字符。然后再放入参数字符串。如果宽度域还大于0,则表示为左靠齐,则在参数字符串后面</font></i>
<a name='L255'><i><font color='green'>// 添加(宽度值-字符串长度)个空格字符。</font></i>
<a name='L256'> <b>case</b> 's':
<a name='L257'> s = <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>char</b> *);
<a name='L258'> len = <a href='../S/42.html#L333' title='Defined at 333 in include/string.h.'>strlen</a> (s);
<a name='L259'> <b>if</b> (precision < 0)
<a name='L260'> precision = len;
<a name='L261'> <b>else</b> <b>if</b> (len > precision)
<a name='L262'> len = precision;
<a name='L263'>
<a name='L264'> <b>if</b> (!(flags & <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>))
<a name='L265'> <b>while</b> (len < field_width--)
<a name='L266'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L267'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < len; ++<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L268'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = *s++;
<a name='L269'> <b>while</b> (len < field_width--)
<a name='L270'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = ' ';
<a name='L271'> <b>break</b>;
<a name='L272'>
<a name='L273'><i><font color='green'>// 如果格式转换符是'o',表示需将对应的参数转换成八进制数的字符串。调用number()函数处理。</font></i>
<a name='L274'> <b>case</b> 'o':
<a name='L275'> <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = <a href='../S/78.html#L52' title='Defined at 52 in kernel/vsprintf.c.'>number</a> (<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>, <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>unsigned</b> <b>long</b>), 8,
<a name='L276'> field_width, precision, flags);
<a name='L277'> <b>break</b>;
<a name='L278'>
<a name='L279'><i><font color='green'>// 如果格式转换符是'p',表示对应参数的一个指针类型。此时若该参数没有设置宽度域,则默认宽度</font></i>
<a name='L280'><i><font color='green'>// 为8,并且需要添零。然后调用number()函数进行处理。</font></i>
<a name='L281'> <b>case</b> 'p':
<a name='L282'> <b>if</b> (field_width == -1)
<a name='L283'> <font color='red'>{</font>
<a name='L284'> field_width = 8;
<a name='L285'> flags |= <a href='../S/78.html#L33' title='Defined at 33 in kernel/vsprintf.c.'>ZEROPAD</a>;
<a name='L286'> <font color='red'>}</font>
<a name='L287'> <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = <a href='../S/78.html#L52' title='Defined at 52 in kernel/vsprintf.c.'>number</a> (<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>,
<a name='L288'> (<b>unsigned</b> <b>long</b>) <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>void</b> *), 16,
<a name='L289'> field_width, precision, flags);
<a name='L290'> <b>break</b>;
<a name='L291'>
<a name='L292'><i><font color='green'>// 若格式转换指示是'x'或'X',则表示对应参数需要打印成十六进制数输出。'x'表示用小写字母表示。</font></i>
<a name='L293'> <b>case</b> 'x':
<a name='L294'> flags |= <a href='../S/78.html#L39' title='Defined at 39 in kernel/vsprintf.c.'>SMALL</a>;
<a name='L295'> <b>case</b> 'X':
<a name='L296'> <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = <a href='../S/78.html#L52' title='Defined at 52 in kernel/vsprintf.c.'>number</a> (<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>, <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>unsigned</b> <b>long</b>), 16,
<a name='L297'> field_width, precision, flags);
<a name='L298'> <b>break</b>;
<a name='L299'>
<a name='L300'><i><font color='green'>// 如果格式转换字符是'd','i'或'u',则表示对应参数是整数,'d', 'i'代表符号整数,因此需要加上</font></i>
<a name='L301'><i><font color='green'>// 带符号标志。'u'代表无符号整数。</font></i>
<a name='L302'> <b>case</b> 'd':
<a name='L303'> <b>case</b> 'i':
<a name='L304'> flags |= <a href='../S/78.html#L34' title='Defined at 34 in kernel/vsprintf.c.'>SIGN</a>;
<a name='L305'> <b>case</b> 'u':
<a name='L306'> <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = <a href='../S/78.html#L52' title='Defined at 52 in kernel/vsprintf.c.'>number</a> (<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>, <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>unsigned</b> <b>long</b>), 10,
<a name='L307'> field_width, precision, flags);
<a name='L308'> <b>break</b>;
<a name='L309'>
<a name='L310'><i><font color='green'>// 若格式转换指示符是'n',则表示要把到目前为止转换输出的字符数保存到对应参数指针指定的位置</font></i>
<a name='L311'> 中。
<a name='L312'><i><font color='green'>// 首先利用va_arg()取得该参数指针,然后将已经转换好的字符数存入该指针所指的位置。</font></i>
<a name='L313'> <b>case</b> 'n':
<a name='L314'> ip = <a href='../S/40.html#L40' title='Defined at 40 in include/stdarg.h.'>va_arg</a> (args, <b>int</b> *);
<a name='L315'> *ip = (<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>);
<a name='L316'> <b>break</b>;
<a name='L317'>
<a name='L318'><i><font color='green'>// 若格式转换符不是'%',则表示格式字符串有错,直接将一个'%'写入输出串中。</font></i>
<a name='L319'><i><font color='green'>// 如果格式转换符的位置处还有字符,则也直接将该字符写入输出串中,并返回到107 行继续处理</font></i>
<a name='L320'><i><font color='green'>// 格式字符串。否则表示已经处理到格式字符串的结尾处,则退出循环。</font></i>
<a name='L321'> <b>default</b>:
<a name='L322'> <b>if</b> (*fmt != '%')
<a name='L323'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = '%';
<a name='L324'> <b>if</b> (*fmt)
<a name='L325'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>++ = *fmt;
<a name='L326'> <b>else</b>
<a name='L327'> --fmt;
<a name='L328'> <b>break</b>;
<a name='L329'> <font color='red'>}</font>
<a name='L330'> <font color='red'>}</font>
<a name='L331'> *<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a> = '\0'; <i><font color='green'>// 最后在转换好的字符串结尾处添上null。</font></i>
<a name='L332'> <b>return</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>; <i><font color='green'>// 返回转换好的字符串长度值。</font></i>
<a name='L333'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>]<a href='#L23'>[^]</a><a href='#L137'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -