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

📄 io.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
            if (res == false) {                do_idle(true);                return _GETS_TIMEOUT;  // Input timed out            }        } else {            mon_read_char(&c);        }        *eol = '\0';        switch (c) {#define CTRL(c) ((c)&0x1F)#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0        case CTRL('P'):            // Fetch the previous line into the buffer            if (_index >= 0) {                // Erase the previous line [crude]                while (ip != buf) {                    mon_write_char('\b');                    mon_write_char(' ');                    mon_write_char('\b');                    ip--;                }                strcpy(buf, _cl_lines[_index]);                while (*ip) {                    mon_write_char(*ip++);                }                eol = ip;                // Move to previous line                _index--;                if (_index < 0) {                    _index = _cl_max_index;                }            } else {                mon_write_char(0x07);  // Audible bell on most devices            }            break;        case CTRL('N'):            // Fetch the next line into the buffer            if (_index >= 0) {                if (++_index > _cl_max_index) _index = 0;                // Erase the previous line [crude]                while (ip != buf) {                    mon_write_char('\b');                    mon_write_char(' ');                    mon_write_char('\b');                    ip--;                }                strcpy(buf, _cl_lines[_index]);                while (*ip) {                    mon_write_char(*ip++);                }                eol = ip;            } else {                mon_write_char(0x07);  // Audible bell on most devices            }            break;        case CTRL('B'):             // Move insertion point backwards            if (ip != buf) {                mon_write_char('\b');                ip--;            }            break;        case CTRL('F'):            // Move insertion point forwards            if (ip != eol) {                mon_write_char(*ip++);            }            break;        case CTRL('E'):            // Move insertion point to end of line            while (ip != eol) {                mon_write_char(*ip++);            }            break;        case CTRL('A'):            // Move insertion point to beginning of line            if (ip != buf) {                xp = ip;                while (xp-- != buf) {                    mon_write_char('\b');                }            }            ip = buf;            break;        case CTRL('K'):            // Kill to the end of line            if (ip != eol) {                xp = ip;                while (xp++ != eol) {                    mon_write_char(' ');                }                while (--xp != ip) {                    mon_write_char('\b');                }                eol = ip;            }            break;        case CTRL('D'):            // Erase the character under the cursor            if (ip != eol) {                xp = ip;                eol--;                while (xp != eol) {                    *xp = *(xp+1);                    mon_write_char(*xp++);                }                mon_write_char(' ');  // Erases last character                mon_write_char('\b');                while (xp-- != ip) {                    mon_write_char('\b');                }            }            break;#endif // CYGNUM_REDBOOT_CMD_LINE_EDITING        case CTRL('C'): // ^C            // Abort current input            diag_printf("^C\n");            *buf = '\0';  // Nothing useful in buffer            return _GETS_CTRLC;        case '\n':        case '\r':            // If previous character was the "other" end-of-line, ignore this one            if (((c == '\n') && (last_ch == '\r')) ||                ((c == '\r') && (last_ch == '\n'))) {                c = '\0';                break;            }            // End of line	    if (console_echo) {                mon_write_char('\r');                mon_write_char('\n');	    }            last_ch = c;#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0            if (cmd_history) {                // History handling - only when enabled#ifdef CYGBLD_REDBOOT_CMD_LINE_HISTORY		expand_history(buf);#endif		if (*buf != '\0') {		    if (++_cl_index == _CL_NUM_LINES) _cl_index = 0;		    if (_cl_index > _cl_max_index) _cl_max_index = _cl_index;		    strcpy(_cl_lines[_cl_index], buf);		}            }#endif            return _GETS_OK;        case '\b':        case 0x7F:  // DEL            if (ip != buf) {#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0                if (ip != eol) {                    ip--;                    mon_write_char('\b');                    xp = ip;                    while (xp != (eol-1)) {                        *xp = *(xp+1);                        mon_write_char(*xp++);                    }                    mon_write_char(' ');  // Erases last character                    mon_write_char('\b');                    while (xp-- != ip) {                        mon_write_char('\b');                    }                } else {                    if (console_echo) {                        mon_write_char('\b');                        mon_write_char(' ');                        mon_write_char('\b');                    }                    ip--;                }                eol--;#else                if (console_echo) {                    mon_write_char('\b');                    mon_write_char(' ');                    mon_write_char('\b');                }                ip--;                eol--;#endif            }            break;#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS        case '+': // fall through        case '$':            if (ip == buf || last_ch != '\\')            {                // Give up and try GDB protocol                ungetDebugChar(c);  // Push back character so stubs will see it                return _GETS_GDB;            }            if (last_ch == '\\') {#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0                if (ip == eol) {                    // Just save \$ as $                    eol = --ip;                } else {                    mon_write_char('\b');                    *--ip = c;                    mon_write_char(c);                    break;                }#else                ip--;  // Save \$ as $#endif            }            // else fall through#endif        default:#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0            // If the insertion point is not at the end of line, make space for it            if (ip != eol) {                xp = eol;                *++eol = '\0';                while (xp != ip) {                    *xp = *(xp-1);                    xp--;                }            }#endif            if (console_echo) {                mon_write_char(c);            }            if (ip == eol) {                // Advance both pointers                *ip++ = c;                eol = ip;#if CYGNUM_REDBOOT_CMD_LINE_EDITING != 0            } else {                // Just insert the character                *ip++ = c;                xp = ip;                while (xp != eol) {                    mon_write_char(*xp++);                }                while (xp-- != ip) {                    mon_write_char('\b');                }#endif            }        }        last_ch = c;        if (ip == buf + buflen - 1) { // Buffer full            *ip = '\0';            return buflen;        }    }}int_rb_gets(char *buf, int buflen, int timeout){    *buf = '\0';  // Empty buffer    return _rb_gets_preloaded(buf, buflen, timeout);}static bool_verify_action(int timeout, char *fmt, va_list ap){    char ans[8];    int ret;#ifdef CYGFUN_REDBOOT_BOOT_SCRIPT    // Don't ask if we're executing a script    if (script && *script)        return 1;#endif    diag_vprintf(fmt, ap);    diag_printf(" - continue (y/n)? ");    if ((ret = _rb_gets(ans, sizeof(ans), timeout)) > 0) {        return ((ans[0] == 'y') || (ans[0] == 'Y'));    } else {        if (ret == _GETS_TIMEOUT) {            diag_printf(" ** Timed out!\n");        }        return 0;  // Timed out or ^C    }}boolverify_action(char *fmt, ...){    va_list ap;    va_start(ap, fmt);    return _verify_action(0, fmt, ap);}boolverify_action_with_timeout(int timeout, char *fmt, ...){    va_list ap;    va_start(ap, fmt);    return _verify_action(timeout, fmt, ap);}#ifdef CYGBLD_REDBOOT_CMD_LINE_HISTORY// parse for history index number. Return number or -1 if not// an index number.static intparse_history_index(char *s){    int val = 0;    while ('0' <= *s && *s <= '9')	val = (val * 10) + (*s++ - '0');    if (*s)	return -1;    return val;}// Check input line to see if it needs history expansion. If so,// try to find matching command and replace buffer as appropriate.static voidexpand_history(char *buf){    int ncmds = _cl_max_index + 1;    int i, index, len;    if (buf[0] != '!' || buf[1] == '\0')	return;    if (ncmds > 0) {	if (!strcmp(buf, "!!")) {	    strcpy(buf, _cl_lines[_cl_index]);	    return;	}	if ((index = parse_history_index(buf + 1)) >= 0) {	    if (index <= _cl_max_index) {		strcpy(buf, _cl_lines[index]);		return;	    }	}	len = strlen(buf + 1);	for (i = 0, index = _cl_index; i < ncmds; i++) {	    if (!strncmp(_cl_lines[index], buf+1, len)) {		strcpy(buf, _cl_lines[index]);		return;	    }	    if (--index < 0)		index = _cl_max_index;	}    }    diag_printf("%s: event not found\n", buf);    *buf = '\0';}static voiddo_history(int argc, char *argv[]){    int ncmds = _cl_max_index + 1;    int i, index;    if (_cl_index == _cl_max_index) {	// history has not wrapped around	for (i = 0; i < ncmds; i++)	    diag_printf("%3d %s\n", i, _cl_lines[i]);    } else {	for (i = 0, index = _cl_index + 1; i < ncmds; i++) {	    diag_printf("%3d %s\n", i, _cl_lines[index++]);	    if (index > _cl_max_index)		index = 0;	}    }}RedBoot_cmd("history",             "Display command history",             "",            do_history    );#endif  // CYGBLD_REDBOOT_CMD_LINE_HISTORY

⌨️ 快捷键说明

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