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

📄 main.c

📁 UBOOT 源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}	} else {		/* echo the character */		wlen = 1;		buf[*num] = ichar;		putnstr(buf + *num, wlen);		(*num)++;	}}static void cread_add_str(char *str, int strsize, int insert, unsigned long *num,	      unsigned long *eol_num, char *buf, unsigned long len){	while (strsize--) {		cread_add_char(*str, insert, num, eol_num, buf, len);		str++;	}}static int cread_line(char *buf, unsigned int *len){	unsigned long num = 0;	unsigned long eol_num = 0;	unsigned long rlen;	unsigned long wlen;	char ichar;	int insert = 1;	int esc_len = 0;	int rc = 0;	char esc_save[8];	while (1) {		rlen = 1;		ichar = getcmd_getch();		if ((ichar == '\n') || (ichar == '\r')) {			putc('\n');			break;		}		/*		 * handle standard linux xterm esc sequences for arrow key, etc.		 */		if (esc_len != 0) {			if (esc_len == 1) {				if (ichar == '[') {					esc_save[esc_len] = ichar;					esc_len = 2;				} else {					cread_add_str(esc_save, esc_len, insert,						      &num, &eol_num, buf, *len);					esc_len = 0;				}				continue;			}			switch (ichar) {			case 'D':	/* <- key */				ichar = CTL_CH('b');				esc_len = 0;				break;			case 'C':	/* -> key */				ichar = CTL_CH('f');				esc_len = 0;				break;	/* pass off to ^F handler */			case 'H':	/* Home key */				ichar = CTL_CH('a');				esc_len = 0;				break;	/* pass off to ^A handler */			case 'A':	/* up arrow */				ichar = CTL_CH('p');				esc_len = 0;				break;	/* pass off to ^P handler */			case 'B':	/* down arrow */				ichar = CTL_CH('n');				esc_len = 0;				break;	/* pass off to ^N handler */			default:				esc_save[esc_len++] = ichar;				cread_add_str(esc_save, esc_len, insert,					      &num, &eol_num, buf, *len);				esc_len = 0;				continue;			}		}		switch (ichar) {		case 0x1b:			if (esc_len == 0) {				esc_save[esc_len] = ichar;				esc_len = 1;			} else {				puts("impossible condition #876\n");				esc_len = 0;			}			break;		case CTL_CH('a'):			BEGINNING_OF_LINE();			break;		case CTL_CH('c'):	/* ^C - break */			*buf = '\0';	/* discard input */			return (-1);		case CTL_CH('f'):			if (num < eol_num) {				getcmd_putch(buf[num]);				num++;			}			break;		case CTL_CH('b'):			if (num) {				getcmd_putch(CTL_BACKSPACE);				num--;			}			break;		case CTL_CH('d'):			if (num < eol_num) {				wlen = eol_num - num - 1;				if (wlen) {					memmove(&buf[num], &buf[num+1], wlen);					putnstr(buf + num, wlen);				}				getcmd_putch(' ');				do {					getcmd_putch(CTL_BACKSPACE);				} while (wlen--);				eol_num--;			}			break;		case CTL_CH('k'):			ERASE_TO_EOL();			break;		case CTL_CH('e'):			REFRESH_TO_EOL();			break;		case CTL_CH('o'):			insert = !insert;			break;		case CTL_CH('x'):			BEGINNING_OF_LINE();			ERASE_TO_EOL();			break;		case DEL:		case DEL7:		case 8:			if (num) {				wlen = eol_num - num;				num--;				memmove(&buf[num], &buf[num+1], wlen);				getcmd_putch(CTL_BACKSPACE);				putnstr(buf + num, wlen);				getcmd_putch(' ');				do {					getcmd_putch(CTL_BACKSPACE);				} while (wlen--);				eol_num--;			}			break;		case CTL_CH('p'):		case CTL_CH('n'):		{			char * hline;			esc_len = 0;			if (ichar == CTL_CH('p'))				hline = hist_prev();			else				hline = hist_next();			if (!hline) {				getcmd_cbeep();				continue;			}			/* nuke the current line */			/* first, go home */			BEGINNING_OF_LINE();			/* erase to end of line */			ERASE_TO_EOL();			/* copy new line into place and display */			strcpy(buf, hline);			eol_num = strlen(buf);			REFRESH_TO_EOL();			continue;		}		default:			cread_add_char(ichar, insert, &num, &eol_num, buf, *len);			break;		}	}	*len = eol_num;	buf[eol_num] = '\0';	/* lose the newline */	if (buf[0] && buf[0] != CREAD_HIST_CHAR)		cread_add_to_hist(buf);	hist_cur = hist_add_idx;	return (rc);}#endif /* CONFIG_CMDLINE_EDITING *//****************************************************************************//* * Prompt for input and read a line. * If  CONFIG_BOOT_RETRY_TIME is defined and retry_time >= 0, * time out when time goes past endtime (timebase time in ticks). * Return:	number of read characters *		-1 if break *		-2 if timed out */int readline (const char *const prompt){#ifdef CONFIG_CMDLINE_EDITING	char *p = console_buffer;	unsigned int len=MAX_CMDBUF_SIZE;	int rc;	static int initted = 0;	if (!initted) {		hist_init();		initted = 1;	}	puts (prompt);	rc = cread_line(p, &len);	return rc < 0 ? rc : len;#else	char   *p = console_buffer;	int	n = 0;				/* buffer index		*/	int	plen = 0;			/* prompt length	*/	int	col;				/* output column cnt	*/	char	c;	/* print prompt */	if (prompt) {		plen = strlen (prompt);		puts (prompt);	}	col = plen;	for (;;) {#ifdef CONFIG_BOOT_RETRY_TIME		while (!tstc()) {	/* while no incoming data */			if (retry_time >= 0 && get_ticks() > endtime)				return (-2);	/* timed out */		}#endif		WATCHDOG_RESET();		/* Trigger watchdog, if needed */#ifdef CONFIG_SHOW_ACTIVITY		while (!tstc()) {			extern void show_activity(int arg);			show_activity(0);		}#endif		c = getc();		/*		 * Special character handling		 */		switch (c) {		case '\r':				/* Enter		*/		case '\n':			*p = '\0';			puts ("\r\n");			return (p - console_buffer);		case '\0':				/* nul			*/			continue;		case 0x03:				/* ^C - break		*/			console_buffer[0] = '\0';	/* discard input */			return (-1);		case 0x15:				/* ^U - erase line	*/			while (col > plen) {				puts (erase_seq);				--col;			}			p = console_buffer;			n = 0;			continue;		case 0x17:				/* ^W - erase word 	*/			p=delete_char(console_buffer, p, &col, &n, plen);			while ((n > 0) && (*p != ' ')) {				p=delete_char(console_buffer, p, &col, &n, plen);			}			continue;		case 0x08:				/* ^H  - backspace	*/		case 0x7F:				/* DEL - backspace	*/			p=delete_char(console_buffer, p, &col, &n, plen);			continue;		default:			/*			 * Must be a normal character then			 */			if (n < CFG_CBSIZE-2) {				if (c == '\t') {	/* expand TABs		*/#ifdef CONFIG_AUTO_COMPLETE					/* if auto completion triggered just continue */					*p = '\0';					if (cmd_auto_complete(prompt, console_buffer, &n, &col)) {						p = console_buffer + n;	/* reset */						continue;					}#endif					puts (tab_seq+(col&07));					col += 8 - (col&07);				} else {					++col;		/* echo input		*/					putc (c);				}				*p++ = c;				++n;			} else {			/* Buffer full		*/				putc ('\a');			}		}	}#endif /* CONFIG_CMDLINE_EDITING */}/****************************************************************************/#ifndef CONFIG_CMDLINE_EDITINGstatic char * delete_char (char *buffer, char *p, int *colp, int *np, int plen){	char *s;	if (*np == 0) {		return (p);	}	if (*(--p) == '\t') {			/* will retype the whole line	*/		while (*colp > plen) {			puts (erase_seq);			(*colp)--;		}		for (s=buffer; s<p; ++s) {			if (*s == '\t') {				puts (tab_seq+((*colp) & 07));				*colp += 8 - ((*colp) & 07);			} else {				++(*colp);				putc (*s);			}		}	} else {		puts (erase_seq);		(*colp)--;	}	(*np)--;	return (p);}#endif /* CONFIG_CMDLINE_EDITING *//****************************************************************************/int parse_line (char *line, char *argv[]){	int nargs = 0;#ifdef DEBUG_PARSER	printf ("parse_line: \"%s\"\n", line);#endif	while (nargs < CFG_MAXARGS) {		/* skip any white space */		while ((*line == ' ') || (*line == '\t')) {			++line;		}		if (*line == '\0') {	/* end of line, no more args	*/			argv[nargs] = NULL;#ifdef DEBUG_PARSER		printf ("parse_line: nargs=%d\n", nargs);#endif			return (nargs);		}		argv[nargs++] = line;	/* begin of argument string	*/		/* find end of string */		while (*line && (*line != ' ') && (*line != '\t')) {			++line;		}		if (*line == '\0') {	/* end of line, no more args	*/			argv[nargs] = NULL;#ifdef DEBUG_PARSER		printf ("parse_line: nargs=%d\n", nargs);#endif			return (nargs);		}		*line++ = '\0';		/* terminate current arg	 */	}	printf ("** Too many args (max. %d) **\n", CFG_MAXARGS);#ifdef DEBUG_PARSER	printf ("parse_line: nargs=%d\n", nargs);#endif	return (nargs);}/****************************************************************************/static void process_macros (const char *input, char *output){	char c, prev;	const char *varname_start = NULL;	int inputcnt = strlen (input);	int outputcnt = CFG_CBSIZE;	int state = 0;		/* 0 = waiting for '$'  */	/* 1 = waiting for '(' or '{' */	/* 2 = waiting for ')' or '}' */	/* 3 = waiting for '''  */#ifdef DEBUG_PARSER	char *output_start = output;	printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen (input),		input);#endif	prev = '\0';		/* previous character   */	while (inputcnt && outputcnt) {		c = *input++;		inputcnt--;		if (state != 3) {			/* remove one level of escape characters */			if ((c == '\\') && (prev != '\\')) {				if (inputcnt-- == 0)					break;				prev = c;				c = *input++;			}		}		switch (state) {		case 0:	/* Waiting for (unescaped) $    */			if ((c == '\'') && (prev != '\\')) {				state = 3;				break;			}			if ((c == '$') && (prev != '\\')) {				state++;			} else {				*(output++) = c;				outputcnt--;			}			break;		case 1:	/* Waiting for (        */			if (c == '(' || c == '{') {				state++;				varname_start = input;			} else {				state = 0;				*(output++) = '$';				outputcnt--;				if (outputcnt) {					*(output++) = c;					outputcnt--;				}			}			break;		case 2:	/* Waiting for )        */			if (c == ')' || c == '}') {				int i;				char envname[CFG_CBSIZE], *envval;				int envcnt = input - varname_start - 1;	/* Varname # of chars */				/* Get the varname */				for (i = 0; i < envcnt; i++) {					envname[i] = varname_start[i];				}				envname[i] = 0;				/* Get its value */				envval = getenv (envname);				/* Copy into the line if it exists */				if (envval != NULL)					while ((*envval) && outputcnt) {						*(output++) = *(envval++);						outputcnt--;					}				/* Look for another '$' */				state = 0;			}			break;		case 3:	/* Waiting for '        */			if ((c == '\'') && (prev != '\\')) {				state = 0;			} else {				*(output++) = c;				outputcnt--;			}			break;		}		prev = c;	}	if (outputcnt)		*output = 0;#ifdef DEBUG_PARSER	printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",		strlen (output_start), output_start);#endif}/**************************************************************************** * returns: *	1  - command executed, repeatable *	0  - command executed but not repeatable, interrupted commands are *	     always considered not repeatable *	-1 - not executed (unrecognized, bootd recursion or too many args) *           (If cmd is NULL or "" or longer than CFG_CBSIZE-1 it is *           considered unrecognized) * * WARNING: * * We must create a temporary copy of the command since the command we get * may be the result from getenv(), which returns a pointer directly to * the environment data, which may change magicly when the command we run * creates or modifies environment variables (like "bootp" does). */int run_command (const char *cmd, int flag){	cmd_tbl_t *cmdtp;	char cmdbuf[CFG_CBSIZE];	/* working copy of cmd		*/	char *token;			/* start of token in cmdbuf	*/	char *sep;			/* end of token (separator) in cmdbuf */	char finaltoken[CFG_CBSIZE];	char *str = cmdbuf;	char *argv[CFG_MAXARGS + 1];	/* NULL terminated	*/	int argc, inquotes;	int repeatable = 1;	int rc = 0;#ifdef DEBUG_PARSER	printf ("[RUN_COMMAND] cmd[%p]=\"", cmd);	puts (cmd ? cmd : "NULL");	/* use puts - string may be loooong */	puts ("\"\n");#endif	clear_ctrlc();		/* forget any previous Control C */	if (!cmd || !*cmd) {		return -1;	/* empty command */	}	if (strlen(cmd) >= CFG_CBSIZE) {		puts ("## Command too long!\n");		return -1;	}	strcpy (cmdbuf, cmd);	/* Process separators and check for invalid	 * repeatable commands	 */#ifdef DEBUG_PARSER	printf ("[PROCESS_SEPARATORS] %s\n", cmd);#endif	while (*str) {		/*		 * Find separator, or string end		 * Allow simple escape of ';' by writing "\;"		 */		for (inquotes = 0, sep = str; *sep; sep++) {			if ((*sep=='\'') &&			    (*(sep-1) != '\\'))				inquotes=!inquotes;			if (!inquotes &&			    (*sep == ';') &&	/* separator		*/			    ( sep != str) &&	/* past string start	*/			    (*(sep-1) != '\\'))	/* and NOT escaped	*/				break;		}		/*		 * Limit the token to data between separators		 */		token = str;		if (*sep) {			str = sep + 1;	/* start of command for next pass */			*sep = '\0';		}		else			str = sep;	/* no more commands for next pass */#ifdef DEBUG_PARSER		printf ("token: \"%s\"\n", token);#endif		/* find macros in this token and replace them */		process_macros (token, finaltoken);		/* Extract arguments */		if ((argc = parse_line (finaltoken, argv)) == 0) {			rc = -1;	/* no command at all */			continue;		}		/* Look up command in command table */		if ((cmdtp = find_cmd(argv[0])) == NULL) {			printf ("Unknown command '%s' - try 'help'\n", argv[0]);			rc = -1;	/* give up after bad command */			continue;		}		/* found - check max args */		if (argc > cmdtp->maxargs) {			printf ("Usage:\n%s\n", cmdtp->usage);			rc = -1;			continue;		}#if (CONFIG_COMMANDS & CFG_CMD_BOOTD)		/* avoid "bootd" recursion */		if (cmdtp->cmd == do_bootd) {#ifdef DEBUG_PARSER			printf ("[%s]\n", finaltoken);#endif			if (flag & CMD_FLAG_BOOTD) {				puts ("'bootd' recursion detected\n");				rc = -1;				continue;			} else {				flag |= CMD_FLAG_BOOTD;			}		}#endif	/* CFG_CMD_BOOTD */		/* OK - call function to do the command */		if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {			rc = -1;		}		repeatable &= cmdtp->repeatable;		/* Did the user stop this? */		if (had_ctrlc ())			return 0;	/* if stopped then not repeatable */	}	return rc ? rc : repeatable;}/****************************************************************************/#if (CONFIG_COMMANDS & CFG_CMD_RUN)int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){	int i;	if (argc < 2) {		printf ("Usage:\n%s\n", cmdtp->usage);		return 1;	}	for (i=1; i<argc; ++i) {		char *arg;		if ((arg = getenv (argv[i])) == NULL) {			printf ("## Error: \"%s\" not defined\n", argv[i]);			return 1;		}#ifndef CFG_HUSH_PARSER		if (run_command (arg, flag) == -1)			return 1;#else		if (parse_string_outer(arg,		    FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0)			return 1;#endif	}	return 0;}#endif	/* CFG_CMD_RUN */

⌨️ 快捷键说明

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