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

📄 78.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<html>
<head>
<title>kernel/vsprintf.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/104.html'>kernel</a>/vsprintf.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L23'>[^]</a><a href='#L137'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L23' title='Defined at 23.'>skip_atoi</a>
<li><a href='#L52' title='Defined at 52.'>number</a>
<li><a href='#L137' title='Defined at 137.'>vsprintf</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/vsprintf.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><i><font color='green'>/* vsprintf.c -- Lars Wirzenius &amp; Linus Torvalds. */</font></i>
<a name='L8'><i><font color='green'>/*</font></i>
<a name='L9'><i><font color='green'>* Wirzenius wrote this portably, Torvalds fucked it up :-)</font></i>
<a name='L10'><i><font color='green'>*/</font></i>
<a name='L11'>
<a name='L12'><font color='darkred'>#include</font> &lt;<a href='40.html'>stdarg.h</a>&gt;             <i><font color='green'>// 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个</font></i>
<a name='L13'><i><font color='green'>// 类型(va_list)和三个宏(va_start, va_arg 和va_end),用于</font></i>
<a name='L14'><i><font color='green'>// vsprintf、vprintf、vfprintf 函数。</font></i>
<a name='L15'><font color='darkred'>#include</font> &lt;<a href='42.html'>string.h</a>&gt;             <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L16'>
<a name='L17'><i><font color='green'>/* we use this so that we can do without the ctype library */</font></i>
<a name='L18'><i><font color='green'>/* 我们使用下面的定义,这样我们就可以不使用ctype 库了 */</font></i>
<a name='L19'><font color='darkred'>#define</font> <a href='../R/512.html' title='Multiple refered from 3 places.'>is_digit</a>(c) ((c) &gt;= '' &amp;&amp; (c) &lt;= '9')   <i><font color='green'>// 判断字符是否数字字符。</font></i>
<a name='L20'>
<a name='L21'><i><font color='green'>// 该函数将字符数字串转换成整数。输入是数字串指针的指针,返回是结果数值。另外指针将前移。</font></i>
<a name='L22'><b>static</b> <b>int</b>
<a name='L23'><a href='../R/612.html' title='Multiple refered from 2 places.'>skip_atoi</a> (<b>const</b> <b>char</b> **s)
<a name='L24'><font color='red'>{</font>
<a name='L25'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0;
<a name='L26'>
<a name='L27'>  <b>while</b> (<a href='../S/78.html#L19' title='Defined at 19 in kernel/vsprintf.c.'>is_digit</a> (**s))
<a name='L28'>    <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 10 + *((*s)++) - '';
<a name='L29'>  <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L30'><font color='red'>}</font>
<a name='L31'>
<a name='L32'><i><font color='green'>// 这里定义转换类型的各种符号常数。</font></i>
<a name='L33'><font color='darkred'>#define</font> <a href='../R/315.html' title='Multiple refered from 5 places.'>ZEROPAD</a> 1 <i><font color='green'>/* pad with zero */</font></i>   <i><font color='green'>/* 填充零 */</font></i>
<a name='L34'><font color='darkred'>#define</font> <a href='../R/223.html' title='Multiple refered from 2 places.'>SIGN</a> 2 <i><font color='green'>/* unsigned/signed long */</font></i>       <i><font color='green'>/* 无符号/符号长整数 */</font></i>
<a name='L35'><font color='darkred'>#define</font> <a href='../R/204.html' title='Multiple refered from 2 places.'>PLUS</a> 4 <i><font color='green'>/* show plus */</font></i>  <i><font color='green'>/* 显示加 */</font></i>
<a name='L36'><font color='darkred'>#define</font> <a href='../R/230.html' title='Multiple refered from 2 places.'>SPACE</a> 8 <i><font color='green'>/* space if plus */</font></i>     <i><font color='green'>/* 如是加,则置空格 */</font></i>
<a name='L37'><font color='darkred'>#define</font> <a href='../R/114.html' title='Multiple refered from 10 places.'>LEFT</a> 16 <i><font color='green'>/* left justified */</font></i>    <i><font color='green'>/* 左调整 */</font></i>
<a name='L38'><font color='darkred'>#define</font> <a href='../R/231.html' title='Multiple refered from 3 places.'>SPECIAL</a> 32 <i><font color='green'>/* 0x */</font></i>     <i><font color='green'>/* 0x */</font></i>
<a name='L39'><font color='darkred'>#define</font> <a href='../R/229.html' title='Multiple refered from 2 places.'>SMALL</a> 64 <i><font color='green'>/* use 'abcdef' instead of 'ABCDEF' */</font></i> <i><font color='green'>/* 使用小写字母 */</font></i>
<a name='L40'>
<a name='L41'><i><font color='green'>// 除操作。输入:n 为被除数,base 为除数;结果:n 为商,函数返回值为余数。</font></i>
<a name='L42'><i><font color='green'>// 参见4.5.3 节有关嵌入汇编的信息。</font></i>
<a name='L43'><font color='darkred'>#define</font> <a href='../S/78.html#L93' title='Refered from 93 in kernel/vsprintf.c.'>do_div</a>(n,base) (<font color='red'>{</font> \
<a name='L44'><b>int</b> __res; \
<a name='L45'><b>__asm__</b>( "divl %4": "=a" (n), "=d" (__res): "" (n), "1" (0), "r" (base)); \
<a name='L46'>__res; <font color='red'>}</font>)
<a name='L47'>
<a name='L48'><i><font color='green'>// 将整数转换为指定进制的字符串。</font></i>
<a name='L49'><i><font color='green'>// 输入:num-整数;base-进制;size-字符串长度;precision-数字长度(精度);type-类型选项。</font></i>
<a name='L50'><i><font color='green'>// 输出:str 字符串指针。</font></i>
<a name='L51'><b>static</b> <b>char</b> *
<a name='L52'><a href='../R/539.html' title='Multiple refered from 4 places.'>number</a> (<b>char</b> *str, <b>int</b> num, <b>int</b> base, <b>int</b> size, <b>int</b> precision, <b>int</b> type)
<a name='L53'><font color='red'>{</font>
<a name='L54'>  <b>char</b> c, sign, tmp[36];
<a name='L55'>  <b>const</b> <b>char</b> *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
<a name='L56'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L57'>
<a name='L58'><i><font color='green'>// 如果类型type 指出用小写字母,则定义小写字母集。</font></i>
<a name='L59'><i><font color='green'>// 如果类型指出要左调整(靠左边界),则屏蔽类型中的填零标志。</font></i>
<a name='L60'><i><font color='green'>// 如果进制基数小于2 或大于36,则退出处理,也即本程序只能处理基数在2-32 之间的数。</font></i>
<a name='L61'>  <b>if</b> (type &amp; <a href='../S/78.html#L39' title='Defined at 39 in kernel/vsprintf.c.'>SMALL</a>)
<a name='L62'>    digits = "0123456789abcdefghijklmnopqrstuvwxyz";
<a name='L63'>  <b>if</b> (type &amp; <a href='../D/215.html' title='Multiple defined in 2 places.'>LEFT</a>)
<a name='L64'>    type &amp;= ~<a href='../S/78.html#L33' title='Defined at 33 in kernel/vsprintf.c.'>ZEROPAD</a>;
<a name='L65'>  <b>if</b> (base &lt; 2 || base &gt; 36)
<a name='L66'>    <b>return</b> 0;
<a name='L67'><i><font color='green'>// 如果类型指出要填零,则置字符变量c='0'(也即''),否则c 等于空格字符。</font></i>
<a name='L68'><i><font color='green'>// 如果类型指出是带符号数并且数值num 小于0,则置符号变量sign=负号,并使num 取绝对值。</font></i>
<a name='L69'><i><font color='green'>// 否则如果类型指出是加号,则置sign=加号,否则若类型带空格标志则sign=空格,否则置0。</font></i>
<a name='L70'>  c = (type &amp; <a href='../S/78.html#L33' title='Defined at 33 in kernel/vsprintf.c.'>ZEROPAD</a>) ? '' : ' ';
<a name='L71'>  <b>if</b> (type &amp; <a href='../S/78.html#L34' title='Defined at 34 in kernel/vsprintf.c.'>SIGN</a> &amp;&amp; num &lt; 0)
<a name='L72'>    <font color='red'>{</font>
<a name='L73'>      sign = '-';
<a name='L74'>      num = -num;
<a name='L75'>    <font color='red'>}</font>
<a name='L76'>  <b>else</b>
<a name='L77'>    sign = (type &amp; <a href='../S/78.html#L35' title='Defined at 35 in kernel/vsprintf.c.'>PLUS</a>) ? '+' : ((type &amp; <a href='../S/78.html#L36' title='Defined at 36 in kernel/vsprintf.c.'>SPACE</a>) ? ' ' : 0);
<a name='L78'><i><font color='green'>// 若带符号,则宽度值减1。若类型指出是特殊转换,则对于十六进制宽度再减少2 位(用于0x),</font></i>
<a name='L79'><i><font color='green'>// 对于八进制宽度减1(用于八进制转换结果前放一个零)。</font></i>
<a name='L80'>  <b>if</b> (sign)
<a name='L81'>    size--;
<a name='L82'>  <b>if</b> (type &amp; <a href='../S/78.html#L38' title='Defined at 38 in kernel/vsprintf.c.'>SPECIAL</a>)
<a name='L83'>    <b>if</b> (base == 16)
<a name='L84'>      size -= 2;
<a name='L85'>    <b>else</b> <b>if</b> (base == 8)
<a name='L86'>      size--;
<a name='L87'><i><font color='green'>// 如果数值num 为0,则临时字符串='0';否则根据给定的基数将数值num 转换成字符形式。</font></i>
<a name='L88'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0;
<a name='L89'>  <b>if</b> (num == 0)
<a name='L90'>    tmp[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++] = '';
<a name='L91'>  <b>else</b>
<a name='L92'>    <b>while</b> (num != 0)
<a name='L93'>      tmp[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++] = digits[<a href='../S/78.html#L43' title='Defined at 43 in kernel/vsprintf.c.'>do_div</a> (num, base)];
<a name='L94'><i><font color='green'>// 若数值字符个数大于精度值,则精度值扩展为数字个数值。</font></i>
<a name='L95'><i><font color='green'>// 宽度值size 减去用于存放数值字符的个数。</font></i>
<a name='L96'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt; precision)
<a name='L97'>    precision = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L98'>  size -= precision;
<a name='L99'><i><font color='green'>// 从这里真正开始形成所需要的转换结果,并暂时放在字符串str 中。</font></i>
<a name='L100'><i><font color='green'>// 若类型中没有填零(ZEROPAD)和左靠齐(左调整)标志,则在str 中首先</font></i>
<a name='L101'><i><font color='green'>// 填放剩余宽度值指出的空格数。若需带符号位,则存入符号。</font></i>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -