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

📄 command.c

📁 Hermit-at-1.1.3,一款bootloader
💻 C
字号:
/* * Copyright (c) 2000 Blue Mug, Inc.  All Rights Reserved. */#include <target/command.h>#include <target/herrno.h>#include <target/io.h>#include <target/str.h>/* command line length limits */#define MAXARGS 16#define MAXLEN 256/* character constants */#define LF      '\n'#define CR      '\r'#define BS      0x08#define DEL     0x7F#define ISWSP(c) ((c)==' ' || (c)=='\t' || (c)=='\r' || (c)=='\n')/* global data that's part of the API */void (*errfunc)();union errdata errdata;/* static global data */static command_list_t *top_command_list;static int interactive = 1;/* do_command scribbles on cmdline! */static int do_command(const command_list_t *cmdlist, char *cmdline);static int do_error(int n);static void command_loop(const command_list_t *cmdlist);static void print_prompt(const command_list_t *cmdlist);/* read and execute commands until one returns -H_EQUITLOOP */static void command_loop(const command_list_t *cmdlist){	char cmdbuf [MAXLEN];	int n;	do {		if (interactive)			print_prompt(cmdlist);		/* read command */		for (n=0; n < (sizeof cmdbuf)-1; /* nada */) {			char c = hgetchar();			if (c == BS || c == DEL) {				/* backspace and rubout */				if (interactive) {					hputchar(BS);					hputchar(' ');					hputchar(BS);				}				if (n > 0) --n;			} else if (c == CR || c == LF) {				/* end of command line */				break;			} else if (c == '!' || c == '~') {				/* toggle interactive mode */				interactive = (c == '!') ? 1 : 0;				n = 0;				break;			} else if (c == 0x02) {			        /* test mode */				if (interactive) 					hputchar(c);				cmdbuf[n++] = c;			} else if (c < ' ') {				/* control character */				if (interactive) {					hputchar('^');					hputchar(c + '@');				}			} else {				/* ordinary character; echo. */				if (interactive)					hputchar(c);				cmdbuf[n++] = c;			}		}		cmdbuf[n] = '\0';		if (interactive)			hprint("\n");		n = do_command(cmdlist, cmdbuf);		if (!interactive && ((n == 0) || (n == -H_EQUITLOOP)))			hprint("+OK\n");	} while (n != -H_EQUITLOOP);}static int do_command(const command_list_t *cmdlist, char *cmdline){	char *argv [MAXARGS];	const command_t *cmd;	const abbrev_t *abbr;	char *p;	int argc, n;	/* parse command line; build argv (modifies cmdline) */	p = cmdline;	for (argc=0; argc < MAXARGS; /* nada */) {		while (ISWSP(*p))			++p;		if (*p == '\0')			break;		argv[argc++] = p;		while (*p && !ISWSP(*p))			++p;		if (*p == '\0')			break;		*p++ = '\0';	}	if (!argc)		return 0;	/* find command; test abbrevs first */	cmd = 0;	if (strlen(*argv) == 1) {		for (n=0; (abbr = cmdlist->abbrevs[n]); ++n) {			if (abbr->abbrev == (*argv)[0]) {				cmd = abbr->cmd;				*argv = (char*) cmd->name;				break;			}		}	}	if (!cmd) {		for (n=0; (cmd = cmdlist->commands[n]); ++n) {			if (!strcmp(cmd->name, *argv))				break;		}	}	if (cmd) {		/* invoke command */		errfunc = 0;		errdata.msg = 0;		n = (cmd->func)(argc, argv);	} else		n = -H_ENOCMD;	if (!n)		return 0;	if (n == -H_EQUITLOOP)		return n;	if (n == -H_EUSAGE) {		hprintf("-NG usage: %s %s\n", cmd->name,			cmd->arghelp ? cmd->arghelp : "");		return n;	}	return do_error(n);}static int do_error(int n){	/* others are all simple or externally defined error messages */	switch ((unsigned char) -n) {	case H_EADDR: errdata.msg = "invalid address"; break;	case H_EALIGN: errdata.msg = "alignment failure"; break;	case H_ECRC: errdata.msg = "CRC mismatch"; break;	case H_EINVAL: errdata.msg = "invalid argument"; break;	case H_EIO: errdata.msg = "I/O error"; break;	case H_ENOCMD: errdata.msg = "command not found"; break;	case H_EOVERFLOW: errdata.msg = "overflow"; break;	case H_EUNDERFLOW: errdata.msg = "underflow"; break;	default:		if (errfunc) {			hprint("-NG ");			(*errfunc)();			hprint("\n");			return n;		}		break;	}	hprintf("-NG %s\n", errdata.msg);	return n;}int do_command_loop(command_list_t *cmdlist){	cmdlist->prev = top_command_list;	top_command_list = cmdlist;	command_loop(cmdlist);	top_command_list = cmdlist->prev;	return 0;}const command_list_t *get_current_commands(void){	return top_command_list;}static void print_prompt_helper(const command_list_t *cmdlist){	if (cmdlist->prev) {		print_prompt_helper(cmdlist->prev);		hprintf(":%s", cmdlist->prompt);	} else		hprint(cmdlist->prompt);}static void print_prompt(const command_list_t *cmdlist){	print_prompt_helper(cmdlist);	hprint("> ");}

⌨️ 快捷键说明

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