/*= Backspace ================================================================ Purpose: Performs a backspace operation on the command line Inputs: none Returns: none ============================================================================*/ static void Backspace(void) { UINT8 num_chars; UINT8 orig_index = GET_CURSOR(); /* if cursor is not at the left-most position */ if (GET_CURSOR() != gCmdLinePromptLength) { /* Null out tmp cmd line */ memset(gTmpCmdLine, 0x00, sizeof(gTmpCmdLine)); /* get characters before the backspace */ num_chars = GET_CURSOR() - gCmdLinePromptLength - 1; strncpy( (char *) gTmpCmdLine, (const char *) g_ConsoleContext.rxBuf, num_chars); /* append characters after the deleted char (if there are any) */ if ( (GET_LEN_RX_CMD_STRING() - 1) > 0u) { strcpy( (char *) &gTmpCmdLine[num_chars], (const char *) &g_ConsoleContext.rxBuf[num_chars + 1]); } EraseEntireLine(); /* leaves g_ConsoleContext.cursorIndex at 0 */ strcpy( (char *) g_ConsoleContext.rxBuf, (const char *) gTmpCmdLine); putrsUART( (ROM FAR char *) gCmdLinePrompt); putsUART( (char *) g_ConsoleContext.rxBuf); SET_CURSOR(gCmdLinePromptLength + GET_LEN_RX_CMD_STRING()); CursorHome(); /* to first character after prompt */ /* move cursor to point of backspace */ CursorRight_N(orig_index - 1 - gCmdLinePromptLength); } }
static void Delete(void) { unsigned int num_chars; unsigned int orig_index = GET_CURSOR(); /* if cursor is not at the end of the line */ if (GET_CURSOR() != GET_LEN_RX_CMD_STRING() + gCmdLinePromptLength) { /* Null out tmp cmd line */ memset(gTmpCmdLine, 0x00, sizeof(gTmpCmdLine)); /* get characters before the deleted key */ num_chars = GET_CURSOR() - gCmdLinePromptLength; strncpy( (char *) gTmpCmdLine, (const char *) g_ConsoleContext.rxBuf, num_chars); /* append characters after the deleted char (if there are any) */ if (strlen( (char *) g_ConsoleContext.rxBuf) - 1 > 0u) { strcpy( (char *) &gTmpCmdLine[num_chars], (const char *) &g_ConsoleContext.rxBuf[num_chars + 1]); } EraseEntireLine(); /* leaves g_ConsoleContext.cursorIndex at 0 */ putrsUART( (ROM FAR char *) gCmdLinePrompt); strcpy( (char *) g_ConsoleContext.rxBuf, (const char *) gTmpCmdLine); putsUART( (char *) g_ConsoleContext.rxBuf ); SET_CURSOR(gCmdLinePromptLength + GET_LEN_RX_CMD_STRING()); CursorHome(); /* to first character after prompt */ /* move cursor to point of delete */ CursorRight_N(orig_index - gCmdLinePromptLength); } }
/***************************************************************************** * FUNCTION: DisplayHistoryEntry * * RETURNS: None * * PARAMS: action -- PREV_HISTORY or NEXT_HISTORY * * NOTES: In response to the user pressing up or down arrow key, display * corresponding entry in history buffer. * *****************************************************************************/ static void DisplayHistoryEntry(UINT8 action) { BOOL foundEntry = FALSE; // if nothing in history buffer if (history.seeded == FALSE) { return; } if (action == (UINT8)kWFPrevHistory) { --history.recallIndex; if (history.recallIndex < 0) { history.recallIndex = kWFNumHistoryEntries - 1; } /* search until found a history entry or searched all entries */ while (foundEntry == FALSE) { /* if found a history entry */ if (history.buf[history.recallIndex][0] != 0) { foundEntry = TRUE; } else { --history.recallIndex; if (history.recallIndex < 0) { history.recallIndex = kWFNumHistoryEntries - 1; } } } } else /* action == kWFNextHistory */ { history.recallIndex = (history.recallIndex + 1) % kWFNumHistoryEntries; /* search until found a history entry or searched all entries */ while (foundEntry == FALSE) { /* if found a history entry */ if (history.buf[history.recallIndex][0] != 0) { foundEntry = TRUE; } else { history.recallIndex = (history.recallIndex + 1) % kWFNumHistoryEntries; } } } if (foundEntry) { // erase line on screen and output command from history EraseEntireLine(); /* leaves Cursor_Index at 0 */ putrsUART( (ROM FAR char *) gCmdLinePrompt ); putsUART( (char *) history.buf[history.recallIndex]); // copy history command to console buffer (so they match) and put cursor // at end of line memset(g_ConsoleContext.rxBuf, 0x00, GET_LEN_RX_CMD_STRING() ); strcpy( (char *) g_ConsoleContext.rxBuf, (const char *) history.buf[history.recallIndex]); SET_CURSOR(gCmdLinePromptLength + strlen( (char *) history.buf[history.recallIndex])); } }
/*= InsertCharacter ========================================================= Purpose: Inserts and echoes an printable character into the command line at the cursor location. Inputs: c -- char to insert Returns: none ============================================================================*/ static void InsertCharacter(INT8 c) { UINT8 len; UINT8 i; UINT8 orig_cursor_index = GET_CURSOR(); UINT8 count; /* throw away characters if exceeded cmd line length */ if (GET_LEN_RX_CMD_STRING() >= sizeof(g_ConsoleContext.rxBuf)-1) { return; } len = GET_LEN_RX_CMD_STRING() + gCmdLinePromptLength; /* if inserting a character at end of cmd line */ if (GET_CURSOR() == len) { g_ConsoleContext.rxBuf[GET_CURSOR() - gCmdLinePromptLength] = c; SET_CURSOR(GET_CURSOR() + 1); EchoCharacter(c); } /* inserting a character somewhere before the end of command line */ else { /* Null out tmp cmd line */ memset(gTmpCmdLine, 0x00, sizeof(gTmpCmdLine)); /* copy up to the point of insertion */ strncpy( (char *) gTmpCmdLine, (const char *) g_ConsoleContext.rxBuf, GET_CURSOR() - gCmdLinePromptLength); /* insert the new character */ gTmpCmdLine[GET_CURSOR() - gCmdLinePromptLength] = c; /* copy the chars after the new character */ strncpy( (char *) &gTmpCmdLine[GET_CURSOR() - gCmdLinePromptLength + 1], (const char *) &g_ConsoleContext.rxBuf[GET_CURSOR() - gCmdLinePromptLength], len - GET_CURSOR()); /* put the first part of new string in the cmd line buffer */ strcpy( (char *) g_ConsoleContext.rxBuf, (const char *) gTmpCmdLine); /* erase entire line, put the cursor at index 0 */ EraseEntireLine(); /* output the prompt */ putrsUART( (ROM FAR char *) gCmdLinePrompt); /* Output the updated command line */ putsUART( (char *) &g_ConsoleContext.rxBuf[0]); /* move the cursor to the next insert location */ count = (len + 1) - orig_cursor_index - 1; for (i = 0; i < count; ++i) { putrsUART( (ROM FAR char *) cursorLeftEscapeSequence); } SET_CURSOR(orig_cursor_index + 1); } }
/***************************************************************************** * FUNCTION: DisplayHistoryEntry * * RETURNS: None * * PARAMS: action -- PREV_HISTORY or NEXT_HISTORY * * NOTES: In response to the user pressing up or down arrow key, display * corresponding entry in history buffer. * *****************************************************************************/ static void DisplayHistoryEntry(uint8_t action) { bool foundEntry = false; // if nothing in history buffer if (history.seeded == false) { return; } if (action == (uint8_t)kPrevHistory) { --history.recallIndex; if (history.recallIndex < 0) { history.recallIndex = kNumHistoryEntries - 1; } /* search until found a history entry or searched all entries */ while (foundEntry == false) { /* if found a history entry */ if (history.buf[history.recallIndex][0] != 0) { foundEntry = true; } else { --history.recallIndex; if (history.recallIndex < 0) { history.recallIndex = kNumHistoryEntries - 1; } } } } else /* action == kNextHistory */ { history.recallIndex = (history.recallIndex + 1) % kNumHistoryEntries; /* search until found a history entry or searched all entries */ while (foundEntry == false) { /* if found a history entry */ if (history.buf[history.recallIndex][0] != 0) { foundEntry = true; } else { history.recallIndex = (history.recallIndex + 1) % kNumHistoryEntries; } } } if (foundEntry) { // erase line on screen and output command from history EraseEntireLine(); /* leaves Cursor_Index at 0 */ SYS_CONSOLE_MESSAGE(gCmdLinePrompt ); SYS_CONSOLE_MESSAGE(history.buf[history.recallIndex]); // copy history command to console buffer (so they match) and put cursor // at end of line memset(g_ConsoleContext.rxBuf, 0x00, GET_LEN_RX_CMD_STRING() ); strcpy( (char *) g_ConsoleContext.rxBuf, (const char *) history.buf[history.recallIndex]); SET_CURSOR(gCmdLinePromptLength + strlen( (char *) history.buf[history.recallIndex])); } }