6 cls命令(harib15f)

上来先问个问题,大家知道cls命令吗?啥?不知道?那真是太遗憾啦。好吧,大家可以在Windows的命令行窗口中执行cls命令试试看。明白了?没错,这个命令的作用是清除屏幕上的内容,也就是“clear screen”(清屏)的缩写。顺便补充个小知识,在Linux中清屏命令是“clear”。

下面我们就要给“纸娃娃系统”也增加cls这个命令。可能有人会说,这种无聊的命令做了有啥用?别说那么让人伤心的话嘛,好歹这也是笔者的个人喜好啦(笑)。

于是,只要像mem命令一样,把cls命令也加进去就好了,不过在这里我们要介绍一个新的小技巧。

■■■■■

在harib15e中,为了读取输入的命令内容,我们是这样写的:

  1. if (cmdline[0] == 'm' && cmdline[1] == 'e' && cmdline[2] == 'm' && cmdline[3] == 0) {

这种写法相当差劲,而且代码也很难读。如果我们把cmdline这么长的变量名简化成c试试 看呢?

  1. if (c[0] == 'm' && c[1] == 'e' && c[2] == 'm' && c[3] == 0) {

这个好像不错,代码变短了点。

其实我们还可以写成这样,看下面的代码。

  1. if (strcmp(cmdline, "mem") == 0) {

怎么样,是不是特别棒?如果还不明白这样写的好处,可以想象一下如果要做一个像“haribote”这样8个字符的命令的话要怎么写呢?就知道有人懒得想象,笔者帮你写出来吧。

  1. if (c[0] == 'h' && c[1] == 'a' && c[2] == 'r' && c[3] == 'i' && c[4] == 'b' &&
  2. c[5] == 'o' && c[6] == 't' && c[7] == 'e' && c[8] == 0) {

这样的代码,不觉得很糟糕吗?这样写的话,万一不小心颠倒了“b”和“i”的位置,命令从“haribote”变成了“harbiote”,可能你都完全发现不了,简直是难读到了极点。不过,只要使用strcmp,即便变量名还是cmdline那么长,也可以写成这样:

  1. if (strcmp(cmdline, "haribote") == 0) {

这么短的代码就搞定了,你看,好处显而易见吧?

strcmp这个函数,只要声明#include 即可使用,因此在bootpack.c中我们也要用它。

■■■■■

于是,在添加了cls命令之后,bootpack.c就变成了下面这样。

本次的bootpack.c节选

  1. void console_task(struct SHEET *sheet, unsigned int memtotal)
  2. {
  3. (中略)
  4. for (;;) {
  5. io_cli();
  6. if (fifo32_status(&task->fifo) == 0) {
  7. (中略)
  8. } else {
  9. (中略)
  10. if (256 <= i && i <= 511) { /*键盘数据(通过任务A) */
  11. if (i == 8 + 256) {
  12. /*退格键*/
  13. (中略)
  14. } else if (i == 10 + 256) {
  15. /*回车键*/
  16. (中略)
  17. /*这里! */ if (strcmp(cmdline, "mem") == 0) {
  18. /* mem命令*/
  19. (中略)
  20. /*从此开始 */ } else if (strcmp(cmdline, "cls") == 0) {
  21. /* cls命令*/
  22. for (y = 28; y < 28 + 128; y++) {
  23. for (x = 8; x < 8 + 240; x++) {
  24. sheet->buf[x + y * sheet->bxsize] = COL8_000000;
  25. }
  26. }
  27. sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
  28. /*到此结束*/ cursor_y = 28;
  29. } else if (cmdline[0] != 0) {
  30. /*不是命令,也不是空行 */
  31. (中略)
  32. }
  33. (中略)
  34. } else {
  35. (中略)
  36. }
  37. }
  38. (中略)
  39. }
  40. }
  41. }

顺利写完了,我们来“make run”,然后执行cls命令试试看。哇,真的清除掉了!

6 cls命令(harib15f) - 图1

可能有人没看明白,这是执行了cls命令之后的样子哦

照这样下去,我们已经可以随意增加更多的命令了呢。你要是特别中意哪个命令,一定要添加进去玩玩看哦。如果成功的话,干劲会更足呢。