⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 78.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<a name='L102'>  <b>if</b> (!(type &amp; (<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-- &gt; 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 &amp; <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 &amp; <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>))
<a name='L118'>    <b>while</b> (size-- &gt; 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> &lt; 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>-- &gt; 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-- &gt; 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> (&amp;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 &lt; 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> (&amp;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 + -