60.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 725 行 · 第 1/5 页

HTML
725
字号
<a name='L538'>
<a name='L539'><i><font color='green'>//// 在光标位置处插入nr 行。</font></i>
<a name='L540'><i><font color='green'>// ANSI 转义字符序列'ESC [nL'。</font></i>
<a name='L541'><b>static</b> <b>void</b>
<a name='L542'><a href='../S/60.html#L808' title='Refered from 808 in kernel/chr_drv/console.c.'>csi_L</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L543'><font color='red'>{</font>
<a name='L544'><i><font color='green'>// 如果插入的行数大于屏幕最多行数,则截为屏幕显示行数;若插入行数nr 为0,则插入1 行。</font></i>
<a name='L545'>  <b>if</b> (nr &gt; video_num_lines)
<a name='L546'>    nr = video_num_lines;
<a name='L547'>  <b>else</b> <b>if</b> (!nr)
<a name='L548'>    nr = 1;
<a name='L549'><i><font color='green'>// 循环插入指定行数nr。</font></i>
<a name='L550'>  <b>while</b> (nr--)
<a name='L551'>    <a href='../S/60.html#L473' title='Defined at 473 in kernel/chr_drv/console.c.'>insert_line</a> ();
<a name='L552'><font color='red'>}</font>
<a name='L553'>
<a name='L554'><i><font color='green'>//// 删除光标处的nr 个字符。</font></i>
<a name='L555'><i><font color='green'>// ANSI 转义序列:'ESC [nP'。</font></i>
<a name='L556'><b>static</b> <b>void</b>
<a name='L557'><a href='../S/60.html#L816' title='Refered from 816 in kernel/chr_drv/console.c.'>csi_P</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L558'><font color='red'>{</font>
<a name='L559'><i><font color='green'>// 如果删除的字符数大于一行字符数,则截为一行字符数;若删除字符数nr 为0,则删除1 个字符。</font></i>
<a name='L560'>  <b>if</b> (nr &gt; video_num_columns)
<a name='L561'>    nr = video_num_columns;
<a name='L562'>  <b>else</b> <b>if</b> (!nr)
<a name='L563'>    nr = 1;
<a name='L564'><i><font color='green'>// 循环删除指定字符数nr。</font></i>
<a name='L565'>  <b>while</b> (nr--)
<a name='L566'>    <a href='../S/60.html#L488' title='Defined at 488 in kernel/chr_drv/console.c.'>delete_char</a> ();
<a name='L567'><font color='red'>}</font>
<a name='L568'>
<a name='L569'><i><font color='green'>//// 删除光标处的nr 行。</font></i>
<a name='L570'><i><font color='green'>// ANSI 转义序列:'ESC [nM'。</font></i>
<a name='L571'><b>static</b> <b>void</b>
<a name='L572'><a href='../S/60.html#L812' title='Refered from 812 in kernel/chr_drv/console.c.'>csi_M</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L573'><font color='red'>{</font>
<a name='L574'><i><font color='green'>// 如果删除的行数大于屏幕最多行数,则截为屏幕显示行数;若删除的行数nr 为0,则删除1 行。</font></i>
<a name='L575'>  <b>if</b> (nr &gt; video_num_lines)
<a name='L576'>    nr = video_num_lines;
<a name='L577'>  <b>else</b> <b>if</b> (!nr)
<a name='L578'>    nr = 1;
<a name='L579'><i><font color='green'>// 循环删除指定行数nr。</font></i>
<a name='L580'>  <b>while</b> (nr--)
<a name='L581'>    <a href='../S/60.html#L510' title='Defined at 510 in kernel/chr_drv/console.c.'>delete_line</a> ();
<a name='L582'><font color='red'>}</font>
<a name='L583'>
<a name='L584'><b>static</b> <b>int</b> saved_x = 0;         <i><font color='green'>// 保存的光标列号。</font></i>
<a name='L585'><b>static</b> <b>int</b> saved_y = 0;         <i><font color='green'>// 保存的光标行号。</font></i>
<a name='L586'>
<a name='L587'><i><font color='green'>//// 保存当前光标位置。</font></i>
<a name='L588'><b>static</b> <b>void</b>
<a name='L589'><a href='../R/583.html' title='Multiple refered from 2 places.'>save_cur</a> (<b>void</b>)
<a name='L590'><font color='red'>{</font>
<a name='L591'>  saved_x = x;
<a name='L592'>  saved_y = y;
<a name='L593'><font color='red'>}</font>
<a name='L594'>
<a name='L595'><i><font color='green'>//// 恢复保存的光标位置。</font></i>
<a name='L596'><b>static</b> <b>void</b>
<a name='L597'><a href='../R/576.html' title='Multiple refered from 2 places.'>restore_cur</a> (<b>void</b>)
<a name='L598'><font color='red'>{</font>
<a name='L599'>  <a href='../S/60.html#L134' title='Defined at 134 in kernel/chr_drv/console.c.'>gotoxy</a> (saved_x, saved_y);
<a name='L600'><font color='red'>}</font>
<a name='L601'>
<a name='L602'><i><font color='green'>//// 控制台写函数。</font></i>
<a name='L603'><i><font color='green'>// 从终端对应的tty 写缓冲队列中取字符,并显示在屏幕上。</font></i>
<a name='L604'><b>void</b>
<a name='L605'><a href='../R/405.html' title='Multiple refered from 2 places.'>con_write</a> (<b>struct</b> tty_struct *tty)
<a name='L606'><font color='red'>{</font>
<a name='L607'>  <b>int</b> nr;
<a name='L608'>  <b>char</b> c;
<a name='L609'>
<a name='L610'><i><font color='green'>// 首先取得写缓冲队列中现有字符数nr,然后针对每个字符进行处理。</font></i>
<a name='L611'>  nr = <a href='../S/38.html#L47' title='Defined at 47 in include/linux/tty.h.'>CHARS</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>-&gt;write_q);
<a name='L612'>  <b>while</b> (nr--)
<a name='L613'>    <font color='red'>{</font>
<a name='L614'><i><font color='green'>// 从写队列中取一字符c,根据前面所处理字符的状态state 分别处理。状态之间的转换关系为:</font></i>
<a name='L615'><i><font color='green'>// state = 0:初始状态;或者原是状态4;或者原是状态1,但字符不是'[';</font></i>
<a name='L616'><i><font color='green'>// 1:原是状态0,并且字符是转义字符ESC(0x1b = 033 = 27);</font></i>
<a name='L617'><i><font color='green'>// 2:原是状态1,并且字符是'[';</font></i>
<a name='L618'><i><font color='green'>// 3:原是状态2;或者原是状态3,并且字符是';'或数字。</font></i>
<a name='L619'><i><font color='green'>// 4:原是状态3,并且字符不是';'或数字;</font></i>
<a name='L620'>      <a href='../S/38.html#L49' title='Defined at 49 in include/linux/tty.h.'>GETCH</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>-&gt;write_q, c);
<a name='L621'>      <b>switch</b> (state)
<a name='L622'>        <font color='red'>{</font>
<a name='L623'>        <b>case</b> 0:
<a name='L624'><i><font color='green'>// 如果字符不是控制字符(c&gt;31),并且也不是扩展字符(c&lt;127),则</font></i>
<a name='L625'>          <b>if</b> (c &gt; 31 &amp;&amp; c &lt; 127)
<a name='L626'>            <font color='red'>{</font>
<a name='L627'><i><font color='green'>// 若当前光标处在行末端或末端以外,则将光标移到下行头列。并调整光标位置对应的内存指针pos。</font></i>
<a name='L628'>              <b>if</b> (x &gt;= video_num_columns)
<a name='L629'>                <font color='red'>{</font>
<a name='L630'>                  x -= video_num_columns;
<a name='L631'>                  <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= video_size_row;
<a name='L632'>                  <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L633'>                <font color='red'>}</font>
<a name='L634'><i><font color='green'>// 将字符c 写到显示内存中pos 处,并将光标右移1 列,同时也将pos 对应地移动2 个字节。</font></i>
<a name='L635'>            <b>__asm__</b> ("movb _attr,%%ah\n\t" "movw %%ax,%1\n\t"::"a" (c), "m" (*(<b>short</b> *) <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>):"ax");
<a name='L636'>              <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += 2;
<a name='L637'>              x++;
<a name='L638'><i><font color='green'>// 如果字符c 是转义字符ESC,则转换状态state 到1。</font></i>
<a name='L639'>            <font color='red'>}</font>
<a name='L640'>          <b>else</b> <b>if</b> (c == 27)
<a name='L641'>            state = 1;
<a name='L642'><i><font color='green'>// 如果字符c 是换行符(10),或是垂直制表符VT(11),或者是换页符FF(12),则移动光标到下一行。</font></i>
<a name='L643'>          <b>else</b> <b>if</b> (c == 10 || c == 11 || c == 12)
<a name='L644'>            <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L645'><i><font color='green'>// 如果字符c 是回车符CR(13),则将光标移动到头列(0 列)。</font></i>
<a name='L646'>          <b>else</b> <b>if</b> (c == 13)
<a name='L647'>            <a href='../S/60.html#L303' title='Defined at 303 in kernel/chr_drv/console.c.'>cr</a> ();
<a name='L648'><i><font color='green'>// 如果字符c 是DEL(127),则将光标右边一字符擦除(用空格字符替代),并将光标移到被擦除位置。</font></i>
<a name='L649'>          <b>else</b> <b>if</b> (c == <a href='../S/38.html#L58' title='Defined at 58 in include/linux/tty.h.'>ERASE_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L650'>            <a href='../S/60.html#L312' title='Defined at 312 in kernel/chr_drv/console.c.'>del</a> ();
<a name='L651'><i><font color='green'>// 如果字符c 是BS(backspace,8),则将光标右移1 格,并相应调整光标对应内存位置指针pos。</font></i>
<a name='L652'>          <b>else</b> <b>if</b> (c == 8)
<a name='L653'>            <font color='red'>{</font>
<a name='L654'>              <b>if</b> (x)
<a name='L655'>                <font color='red'>{</font>
<a name='L656'>                  x--;
<a name='L657'>                  <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= 2;
<a name='L658'>                <font color='red'>}</font>
<a name='L659'><i><font color='green'>// 如果字符c 是水平制表符TAB(9),则将光标移到8 的倍数列上。若此时光标列数超出屏幕最大列数,</font></i>
<a name='L660'><i><font color='green'>// 则将光标移到下一行上。</font></i>
<a name='L661'>            <font color='red'>}</font>
<a name='L662'>          <b>else</b> <b>if</b> (c == 9)
<a name='L663'>            <font color='red'>{</font>
<a name='L664'>              c = 8 - (x &amp; 7);
<a name='L665'>              x += c;
<a name='L666'>              <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += c &lt;&lt; 1;
<a name='L667'>              <b>if</b> (x &gt; video_num_columns)
<a name='L668'>                <font color='red'>{</font>
<a name='L669'>                  x -= video_num_columns;
<a name='L670'>                  <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= video_size_row;
<a name='L671'>                  <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L672'>                <font color='red'>}</font>
<a name='L673'>              c = 9;
<a name='L674'><i><font color='green'>// 如果字符c 是响铃符BEL(7),则调用蜂鸣函数,是扬声器发声。</font></i>
<a name='L675'>            <font color='red'>}</font>
<a name='L676'>          <b>else</b> <b>if</b> (c == 7)
<a name='L677'>            <a href='../S/60.html#L978' title='Defined at 978 in kernel/chr_drv/console.c.'>sysbeep</a> ();
<a name='L678'>          <b>break</b>;
<a name='L679'><i><font color='green'>// 如果原状态是0,并且字符是转义字符ESC(0x1b = 033 = 27),则转到状态1 处理。</font></i>
<a name='L680'>        <b>case</b> 1:
<a name='L681'>          state = 0;
<a name='L682'><i><font color='green'>// 如果字符c 是'[',则将状态state 转到2。</font></i>

⌨️ 快捷键说明

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