/* ==================== Prompt_Action User just pressed enter ==================== */ char *Prompt_Action(commandPrompt_t *prompt) { char *s = prompt->inputLine.text; int i, j; Prompt_ClearState(prompt); if (s[0] == 0 || ((s[0] == '/' || s[0] == '\\') && s[1] == 0)) { IF_Clear(&prompt->inputLine); return NULL; // empty line } // save current line in history i = prompt->inputLineNum & HISTORY_MASK; j = (prompt->inputLineNum - 1) & HISTORY_MASK; if (!prompt->history[j] || strcmp(prompt->history[j], s)) { if (prompt->history[i]) { Z_Free(prompt->history[i]); } prompt->history[i] = Z_CopyString(s); prompt->inputLineNum++; } else { i = j; } // stop history search prompt->historyLineNum = prompt->inputLineNum; IF_Clear(&prompt->inputLine); return prompt->history[i]; }
/* ==================== Prompt_HistoryDown ==================== */ void Prompt_HistoryDown( commandPrompt_t *prompt ) { int i; Prompt_ClearState( prompt ); if( prompt->historyLineNum == prompt->inputLineNum ) { return; } prompt->historyLineNum++; i = prompt->historyLineNum & HISTORY_MASK; IF_Replace( &prompt->inputLine, prompt->history[i] ); }
/* ==================== Prompt_Clear ==================== */ void Prompt_Clear( commandPrompt_t *prompt ) { int i; Prompt_ClearState( prompt ); for( i = 0; i < HISTORY_SIZE; i++ ) { if( prompt->history[i] ) { Z_Free( prompt->history[i] ); prompt->history[i] = NULL; } } prompt->historyLineNum = 0; prompt->inputLineNum = 0; IF_Clear( &prompt->inputLine ); }
/* ==================== Prompt_HistoryUp ==================== */ void Prompt_HistoryUp(commandPrompt_t *prompt) { int i; Prompt_ClearState(prompt); if (prompt->historyLineNum == prompt->inputLineNum) { // save current line in history i = prompt->inputLineNum & HISTORY_MASK; if (prompt->history[i]) { Z_Free(prompt->history[i]); } prompt->history[i] = Z_CopyString(prompt->inputLine.text); } if (prompt->inputLineNum - prompt->historyLineNum < HISTORY_SIZE && prompt->historyLineNum > 0) { prompt->historyLineNum--; } i = prompt->historyLineNum & HISTORY_MASK; IF_Replace(&prompt->inputLine, prompt->history[i]); }