6 cls命令(harib15f)
上来先问个问题,大家知道cls命令吗?啥?不知道?那真是太遗憾啦。好吧,大家可以在Windows的命令行窗口中执行cls命令试试看。明白了?没错,这个命令的作用是清除屏幕上的内容,也就是“clear screen”(清屏)的缩写。顺便补充个小知识,在Linux中清屏命令是“clear”。
下面我们就要给“纸娃娃系统”也增加cls这个命令。可能有人会说,这种无聊的命令做了有啥用?别说那么让人伤心的话嘛,好歹这也是笔者的个人喜好啦(笑)。
于是,只要像mem命令一样,把cls命令也加进去就好了,不过在这里我们要介绍一个新的小技巧。
■■■■■
在harib15e中,为了读取输入的命令内容,我们是这样写的:
if (cmdline[0] == 'm' && cmdline[1] == 'e' && cmdline[2] == 'm' && cmdline[3] == 0) {
这种写法相当差劲,而且代码也很难读。如果我们把cmdline这么长的变量名简化成c试试 看呢?
if (c[0] == 'm' && c[1] == 'e' && c[2] == 'm' && c[3] == 0) {
这个好像不错,代码变短了点。
其实我们还可以写成这样,看下面的代码。
if (strcmp(cmdline, "mem") == 0) {
怎么样,是不是特别棒?如果还不明白这样写的好处,可以想象一下如果要做一个像“haribote”这样8个字符的命令的话要怎么写呢?就知道有人懒得想象,笔者帮你写出来吧。
if (c[0] == 'h' && c[1] == 'a' && c[2] == 'r' && c[3] == 'i' && c[4] == 'b' &&
c[5] == 'o' && c[6] == 't' && c[7] == 'e' && c[8] == 0) {
这样的代码,不觉得很糟糕吗?这样写的话,万一不小心颠倒了“b”和“i”的位置,命令从“haribote”变成了“harbiote”,可能你都完全发现不了,简直是难读到了极点。不过,只要使用strcmp,即便变量名还是cmdline那么长,也可以写成这样:
if (strcmp(cmdline, "haribote") == 0) {
这么短的代码就搞定了,你看,好处显而易见吧?
strcmp这个函数,只要声明#include 即可使用,因此在bootpack.c中我们也要用它。
■■■■■
于是,在添加了cls命令之后,bootpack.c就变成了下面这样。
本次的bootpack.c节选
void console_task(struct SHEET *sheet, unsigned int memtotal)
{
(中略)
for (;;) {
io_cli();
if (fifo32_status(&task->fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据(通过任务A) */
if (i == 8 + 256) {
/*退格键*/
(中略)
} else if (i == 10 + 256) {
/*回车键*/
(中略)
/*这里! */ if (strcmp(cmdline, "mem") == 0) {
/* mem命令*/
(中略)
/*从此开始 */ } else if (strcmp(cmdline, "cls") == 0) {
/* cls命令*/
for (y = 28; y < 28 + 128; y++) {
for (x = 8; x < 8 + 240; x++) {
sheet->buf[x + y * sheet->bxsize] = COL8_000000;
}
}
sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
/*到此结束*/ cursor_y = 28;
} else if (cmdline[0] != 0) {
/*不是命令,也不是空行 */
(中略)
}
(中略)
} else {
(中略)
}
}
(中略)
}
}
}
顺利写完了,我们来“make run”,然后执行cls命令试试看。哇,真的清除掉了!
可能有人没看明白,这是执行了cls命令之后的样子哦
照这样下去,我们已经可以随意增加更多的命令了呢。你要是特别中意哪个命令,一定要添加进去玩玩看哦。如果成功的话,干劲会更足呢。