6 为应用程序自由命名(harib17f)
现在我们的应用程序只能用hlt这个名字,下面我们来让系统支持其他应用程序名,这次我们就用hello吧。将console.c中的“hlt”改成“hello”,好啦,这样我们就可以用hello这个应用程序了……哇!别生气别生气,开个玩笑而已(笑)。
好吧,我们先来改写cons_runcmd。
本次的console.c节选
void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, unsigned int memtotal)
{
if (strcmp(cmdline, "mem") == 0) {
cmd_mem(cons, memtotal);
} else if (strcmp(cmdline, "cls") == 0) {
cmd_cls(cons);
} else if (strcmp(cmdline, "dir") == 0) {
cmd_dir(cons);
} else if (strncmp(cmdline, "type ", 5) == 0) {
cmd_type(cons, fat, cmdline);
} else if (cmdline[0] != 0) { /*从此开始*/
if (cmd_app(cons, fat, cmdline) == 0) {
/*不是命令,不是应用程序,也不是空行*/
putfonts8_asc_sht(cons->sht, 8, cons->cur_y, COL8_FFFFFF, COL8_000000, "Bad command.", 12);
cons_newline(cons);
cons_newline(cons);
}
} /*到此结束 */
return;
}
总结一下修改的地方,首先是去掉了cmd_hlt,并创建了新的cmd_app。这个函数用来根据命令行的内容判断文件名,并运行相应的应用程序,如果找到文件则返回1,没有找到文件则返回0。
现在程序的工作过程是:当输入的命令不是mem、cls、dir、type其中之一时,则调用cmd_app,如果返回0则作为错误处理。这样应该能行。
我们在cmd_hlt的基础上稍作修改后得到cmd_app函数,具体内容如下。
本次的console.c节选
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
{
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
struct FILEINFO *finfo;
struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
char name[18], *p;
int i;
/*根据命令行生成文件名*/
for (i = 0; i < 13; i++) {
if (cmdline[i] <= ' ') {
break;
}
name[i] = cmdline[i];
}
name[i] = 0; /*暂且将文件名的后面置为0*/
/*寻找文件 */
finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
if (finfo == 0 && name[i -1]!= '.') {
/*由于找不到文件,故在文件名后面加上“.hrb”后重新寻找*/
name[i ] = '.';
name[i + 1] = 'H';
name[i + 2] = 'R';
name[i + 3] = 'B';
name[i + 4] = 0;
finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
}
if (finfo != 0) {
/*找到文件的情况*/
p = (char *) memman_alloc_4k(memman, finfo->size);
file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
farcall(0, 1003 * 8);
memman_free_4k(memman, (int) p, finfo->size);
cons_newline(cons);
return 1;
}
/*没有找到文件的情况*/
return 0;
}
我们在程序上动了一点脑筋,使得无论输入“hlt”还是“hlt.hrb”都可以启动“hlt.hrb”。因为在Windows命令行窗口中,不管加不加后面的“.exe”都可以运行程序,所以我们就借鉴了这个设计。
■■■■■
差不多完工了,我们将hlt.nas改名为hello.nas,然后汇编生成hello.hrb。接下来“make run”,用dir命令确认一下磁盘中的内容,再输入“hello”。哦!出来了!成功了!
再来一次,你好!
嗯嗯,不错!我们再来输入“hlt”试一下,这个文件现在已经没有了,会不会报错呢?另外,如果输入“hello.hrb”能否正常运行呢?我们来试试看。
报错了哦
出现错误信息了,加上扩展名的情况也OK,太完美了。