//***************************************************************************** void new_line_handler(microrl_t * pThis){ char const * tkn_arr [_COMMAND_TOKEN_NMB]; int status; if (echo) terminal_newline (pThis); #ifdef _USE_HISTORY if (pThis->cmdlen > 0) hist_save_line (&pThis->ring_hist, pThis->cmdline, pThis->cmdlen); #endif status = split (pThis, pThis->cmdlen, tkn_arr); if (status == -1){ // pThis->print ("ERROR: Max token amount exseed\n"); pThis->print ("ERROR:too many tokens"); pThis->print (ENDL); } if ((status > 0) && (pThis->execute != NULL)) pThis->execute (status, tkn_arr); print_prompt (pThis); pThis->cmdlen = 0; pThis->cursor = 0; memset(pThis->cmdline, 0, _COMMAND_LINE_LEN); #ifdef _USE_HISTORY pThis->ring_hist.cur = 0; #endif }
//***************************************************************************** static void microrl_get_complite (microrl_t * pThis) { char const * tkn_arr[_COMMAND_TOKEN_NMB]; const char ** compl_token; if (pThis->get_completion == NULL) // callback was not set return; int status = split (pThis, pThis->cursor, tkn_arr); if (pThis->cmdline[pThis->cursor-1] == '\0') tkn_arr[status++] = ""; compl_token = pThis->get_completion (status, tkn_arr); if (compl_token[0] != NULL) { int i = 0; int len; if (compl_token[1] == NULL) { len = strlen (compl_token[0]); } else { len = common_len (compl_token); terminal_newline (pThis); while (compl_token [i] != NULL) { pThis->print (compl_token[i]); pThis->print (" "); i++; } terminal_newline (pThis); print_prompt (pThis); } if (len) { microrl_insert_text (pThis, compl_token[0] + strlen(tkn_arr[status-1]), len - strlen(tkn_arr[status-1])); if (compl_token[1] == NULL) microrl_insert_text (pThis, " ", 1); } terminal_reset_cursor (pThis); terminal_print_line (pThis, 0, pThis->cursor); } }
void microrl_insert_char (microrl_t * pThis, int ch) { #ifdef _USE_ESC_SEQ if (pThis->escape) { if (escape_process(pThis, ch)) pThis->escape = 0; } else { #endif switch (ch) { //----------------------------------------------------- #ifdef _ENDL_CR case KEY_CR: new_line_handler(pThis); break; case KEY_LF: break; #elif defined(_ENDL_CRLF) case KEY_CR: pThis->tmpch = KEY_CR; break; case KEY_LF: if (pThis->tmpch == KEY_CR) new_line_handler(pThis); break; #elif defined(_ENDL_LFCR) case KEY_LF: pThis->tmpch = KEY_LF; break; case KEY_CR: if (pThis->tmpch == KEY_LF) new_line_handler(pThis); break; #else case KEY_CR: break; case KEY_LF: new_line_handler(pThis); break; #endif //----------------------------------------------------- #ifdef _USE_COMPLETE case KEY_HT: microrl_get_complite (pThis); break; #endif //----------------------------------------------------- case KEY_ESC: #ifdef _USE_ESC_SEQ pThis->escape = 1; #endif break; //----------------------------------------------------- case KEY_NAK: // ^U while (pThis->cursor > 0) { microrl_backspace (pThis); } terminal_print_line (pThis, 0, pThis->cursor); break; //----------------------------------------------------- case KEY_VT: // ^K pThis->print ("\033[K"); pThis->cmdlen = pThis->cursor; break; //----------------------------------------------------- case KEY_ENQ: // ^E terminal_move_cursor (pThis, pThis->cmdlen-pThis->cursor); pThis->cursor = pThis->cmdlen; break; //----------------------------------------------------- case KEY_SOH: // ^A terminal_reset_cursor (pThis); pThis->cursor = 0; break; //----------------------------------------------------- case KEY_ACK: // ^F if (pThis->cursor < pThis->cmdlen) { terminal_move_cursor (pThis, 1); pThis->cursor++; } break; //----------------------------------------------------- case KEY_STX: // ^B if (pThis->cursor) { terminal_move_cursor (pThis, -1); pThis->cursor--; } break; //----------------------------------------------------- case KEY_DLE: //^P #ifdef _USE_HISTORY hist_search (pThis, _HIST_UP); #endif break; //----------------------------------------------------- case KEY_SO: //^N #ifdef _USE_HISTORY hist_search (pThis, _HIST_DOWN); #endif break; //----------------------------------------------------- case KEY_DEL: // Backspace case KEY_BS: // ^U microrl_backspace (pThis); terminal_print_line (pThis, pThis->cursor, pThis->cursor); break; //----------------------------------------------------- case KEY_DC2: // ^R terminal_newline (pThis); print_prompt (pThis); terminal_reset_cursor (pThis); terminal_print_line (pThis, 0, pThis->cursor); break; //----------------------------------------------------- #ifdef _USE_CTLR_C case KEY_ETX: if (pThis->sigint != NULL) pThis->sigint(); break; #endif //----------------------------------------------------- default: if (((ch == ' ') && (pThis->cmdlen == 0)) || IS_CONTROL_CHAR(ch)) break; if (microrl_insert_text (pThis, (char*)&ch, 1)) terminal_print_line (pThis, pThis->cursor-1, pThis->cursor); break; } #ifdef _USE_ESC_SEQ } #endif }