From 16ef6ef2afd8465812e9ad0b2dd0416aa9e8f0fe Mon Sep 17 00:00:00 2001 From: Paolo Pantaleo Date: Tue, 1 Feb 2000 18:29:11 +0000 Subject: [PATCH] history command added and some minor changes to history interface svn path=/trunk/; revision=976 --- rosapps/cmd/cmd.h | 3 +- rosapps/cmd/cmdinput.c | 62 ++++++- rosapps/cmd/cmdtable.c | 4 + rosapps/cmd/history.c | 366 +++++++++++++++++++++++++++++++++++++---- 4 files changed, 395 insertions(+), 40 deletions(-) diff --git a/rosapps/cmd/cmd.h b/rosapps/cmd/cmd.h index 36ed7eec4a7..e599ce5159a 100644 --- a/rosapps/cmd/cmd.h +++ b/rosapps/cmd/cmd.h @@ -1,4 +1,4 @@ -/* $Id: cmd.h,v 1.18 1999/12/28 23:06:35 ekohl Exp $ +/* $Id: cmd.h,v 1.19 2000/02/01 18:29:11 paolopan Exp $ * * CMD.H - header file for the modules in CMD.EXE * @@ -252,6 +252,7 @@ VOID History_move_to_bottom(VOID);/*F3*/ VOID InitHistory(VOID); VOID CleanHistory(VOID); VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/ +INT CommandHistory (LPTSTR cmd, LPTSTR param); #endif diff --git a/rosapps/cmd/cmdinput.c b/rosapps/cmd/cmdinput.c index 57ae388197f..b9a944ab7f5 100644 --- a/rosapps/cmd/cmdinput.c +++ b/rosapps/cmd/cmdinput.c @@ -139,6 +139,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) INPUT_RECORD ir; WORD wLastKey = 0; TCHAR ch; + BOOL bContinue=FALSE;/*is TRUE the second case will not be executed*/ /* get screen size */ GetScreenSize (&maxx, &maxy); @@ -157,6 +158,57 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { ConInKey (&ir); + if (ir.Event.KeyEvent.dwControlKeyState & + (RIGHT_ALT_PRESSED|RIGHT_ALT_PRESSED| + RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) ) + { + + switch (ir.Event.KeyEvent.wVirtualKeyCode) + { + +#ifdef FEATURE_HISTORY + + case 'K': + /*add the current command line to the history*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + + if (str[0]) + History(0,str); + + ClearCommandLine (str, maxlen, orgx, orgy); + current = charcount = 0; + bContinue=TRUE; + break; + } + + case 'D': + /*delete current history entry*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + ClearCommandLine (str, maxlen, orgx, orgy); + History_del_current_entry(str); + current = charcount = _tcslen (str); + ConOutPrintf (_T("%s"), str); + bContinue=TRUE; + break; + } + +#endif/*FEATURE_HISTORY*/ + } + + + + + } + + //if (bContinue) + // continue; + + + switch (ir.Event.KeyEvent.wVirtualKeyCode) { case VK_BACK: @@ -303,8 +355,8 @@ VOID ReadCommand (LPTSTR str, INT maxlen) current = charcount = 0; break; - case VK_F3: #ifdef FEATURE_HISTORY + case VK_F3: History_move_to_bottom(); #endif case VK_UP: @@ -359,8 +411,11 @@ VOID ReadCommand (LPTSTR str, INT maxlen) } break; +#if 0 + #ifdef FEATURE_HISTORY + /*!!!WARNING!!!*/ /*this will only work as long as the two if statement evaluates the same expression and a break is included @@ -368,7 +423,6 @@ VOID ReadCommand (LPTSTR str, INT maxlen) This can be used for any combination using CTRL. For other combinations is needed another system*/ - //case VK_K: case 'K': /*add the current command line to the history*/ if (ir.Event.KeyEvent.dwControlKeyState & @@ -394,7 +448,9 @@ VOID ReadCommand (LPTSTR str, INT maxlen) break; } -#endif +#endif/*FEATURE_HISTORY*/ +#endif/*0*/ + default: #ifdef _UNICODE ch = ir.Event.KeyEvent.uChar.UnicodeChar; diff --git a/rosapps/cmd/cmdtable.c b/rosapps/cmd/cmdtable.c index 46206dbe842..34d973869fd 100644 --- a/rosapps/cmd/cmdtable.c +++ b/rosapps/cmd/cmdtable.c @@ -115,6 +115,10 @@ COMMAND cmds[] = {_T("goto"), CMD_BATCHONLY, cmd_goto}, +#ifdef FEATURE_HISTORY + {_T("history"), 0, CommandHistory}, +#endif + {_T("if"), 0, cmd_if}, #ifdef INCLUDE_CMD_LABEL diff --git a/rosapps/cmd/history.c b/rosapps/cmd/history.c index c8a94a3e752..0541f1e7024 100644 --- a/rosapps/cmd/history.c +++ b/rosapps/cmd/history.c @@ -1,5 +1,4 @@ -/* $Id: history.c,v 1.8 1999/12/24 17:19:20 ekohl Exp $ - * +/* * HISTORY.C - command line history. * * @@ -25,6 +24,8 @@ * */ + + /* * HISTORY.C - command line history. Second version * @@ -34,11 +35,18 @@ * 06/12/99 (Paolo Pantaleo ) * started. * - */ + */ + + + + + #include "config.h" + #ifdef FEATURE_HISTORY + #include #include #include @@ -54,51 +62,137 @@ typedef struct tagHISTORY LPTSTR string; } HIST_ENTRY, * LPHIST_ENTRY; -static INT size; -static INT max_size=10; /* for now not configurable */ +static INT size, + max_size=100; + + static LPHIST_ENTRY Top; static LPHIST_ENTRY Bottom; + + static LPHIST_ENTRY curr_ptr=0; -/* service functions */ -static VOID del (LPHIST_ENTRY item); -static VOID add_at_bottom (LPTSTR string); + +VOID InitHistory(VOID); +VOID History_move_to_bottom(VOID); +VOID History (INT dir, LPTSTR commandline); +VOID CleanHistory(VOID); +VOID History_del_current_entry(LPTSTR str); + +/*service functions*/ +VOID del(LPHIST_ENTRY item); +VOID add_at_bottom(LPTSTR string); +/*VOID add_before_last(LPTSTR string);*/ +VOID set_size(INT new_size); -VOID InitHistory (VOID) + +INT CommandHistory (LPTSTR cmd, LPTSTR param) +{ + LPTSTR tmp; + INT tmp_int; + LPHIST_ENTRY h_tmp; + TCHAR szBuffer[2048]; + + + + tmp=_tcschr(param,_T('/')); + + if (tmp) + { + param=tmp; + switch (_totupper(param[1])) + { + case _T('F'):/*delete history*/ + CleanHistory();InitHistory(); + break; + case _T('R'):/*read history from standard in*/ + //hIn=GetStdHandle (STD_INPUT_HANDLE); + + for(;;) + { + ConInString(szBuffer,sizeof(szBuffer)/sizeof(TCHAR)); + if (*szBuffer!=_T('\0')) + History(0,szBuffer); + else + break; + + } + + + + break; + case _T('A'):/*add an antry*/ + History(0,param+2); + break; + case _T('S'):/*set history size*/ + if (tmp_int=_ttoi(param+2)) + set_size(tmp_int); + break; + default: + return 1; + } + } + else + { + for(h_tmp=Top->prev;h_tmp!=Bottom;h_tmp=h_tmp->prev) + ConErrPuts(h_tmp->string); + } + +} + +VOID set_size(INT new_size) +{ + + while(new_sizeprev); + + + max_size=new_size; +} + + +VOID InitHistory(VOID) { size=0; - + + Top = malloc(sizeof(HIST_ENTRY)); - Bottom = malloc(sizeof(HIST_ENTRY)); + Bottom = malloc(sizeof(HIST_ENTRY)); + Top->prev = Bottom; Top->next = NULL; Top->string = NULL; + Bottom->prev = NULL; - Bottom->next = Top; + Bottom->next = Top; Bottom->string = NULL; curr_ptr=Bottom; } -VOID CleanHistory (VOID) -{ - while (Bottom->next!=Top) - del (Bottom->next); - free (Top); - free (Bottom); + +VOID CleanHistory(VOID) +{ + + while (Bottom->next!=Top) + del(Bottom->next); + + free(Top); + free(Bottom); + } VOID History_del_current_entry(LPTSTR str) { LPHIST_ENTRY tmp; - + if (size==0) return; @@ -108,58 +202,134 @@ VOID History_del_current_entry(LPTSTR str) if(curr_ptr==Top) curr_ptr=Top->prev; - tmp=curr_ptr; + + tmp=curr_ptr; curr_ptr=curr_ptr->prev; del(tmp); History(-1,str); + } static VOID del(LPHIST_ENTRY item) { + if( item==NULL || item==Top || item==Bottom ) { #ifdef _DEBUG DebugPrintf("del in " __FILE__ ": retrning\n" "item is 0x%08x (Bottom is0x%08x)\n", - item, Bottom); + item, Bottom); + #endif return; } + + /*free string's mem*/ if (item->string) free(item->string); + + + + /*set links in prev and next item*/ item->next->prev=item->prev; - item->prev->next=item->next; + item->prev->next=item->next; free(item); size--; + } +#if 0 +static +VOID add_before_last(LPTSTR string) +{ + + LPHIST_ENTRY tmp,before,after; + + + /*delete first entry if maximum number of entries is reached*/ + while(size>=max_size) + del(Top->prev); + + while (_istspace(*string)) + string++; + + if (*string==_T('\0')) + return; + + + + /*allocte entry and string*/ + tmp=malloc(sizeof(HIST_ENTRY)); + tmp->string=malloc(_tcslen(string)+1); + _tcscpy(tmp->string,string); + + + /*set links*/ + before=Bottom->next; + after=before->next; + + tmp->prev=before; + tmp->next=after; + + after->prev=tmp; + before->next=tmp; + + + + + + + + /*set new size*/ + size++; + + +} +#endif/*0*/ static VOID add_at_bottom(LPTSTR string) -{ +{ + + LPHIST_ENTRY tmp; + /*delete first entry if maximum number of entries is reached*/ - if(size==max_size) + while(size>=max_size) del(Top->prev); - /*fill bottom with string*/ - Bottom->string=malloc(_tcslen(string)+1); - _tcscpy(Bottom->string,string); + while (_istspace(*string)) + string++; + if (*string==_T('\0')) + return; + + + /*if new entry is the same than the last do not add it*/ + if(size) + if(_tcscmp(string,Bottom->next->string)==0) + return; + + + /*fill bottom with string, it will become Bottom->next*/ + Bottom->string=malloc(_tcslen(string)+1); + _tcscpy(Bottom->string,string); + /*save Bottom value*/ tmp=Bottom; + /*create new void Bottom*/ - Bottom=malloc(sizeof(HIST_ENTRY)); + Bottom=malloc(sizeof(HIST_ENTRY)); Bottom->next=tmp; Bottom->prev=NULL; Bottom->string=NULL; @@ -168,17 +338,21 @@ VOID add_at_bottom(LPTSTR string) /*set new size*/ size++; + } + VOID History_move_to_bottom(VOID) { curr_ptr=Bottom; + } VOID History (INT dir, LPTSTR commandline) { + if(dir==0) { add_at_bottom(commandline); @@ -192,29 +366,37 @@ VOID History (INT dir, LPTSTR commandline) return; } + if(dir<0)/*key up*/ { if (curr_ptr->next==Top || curr_ptr==Top) { -#ifdef WRAP_HISTORY - curr_ptr=Bottom; -#else +#ifdef WRAP_HISTORY + curr_ptr=Bottom; +#else curr_ptr=Top; commandline[0]=_T('\0'); return; #endif } + curr_ptr = curr_ptr->next; if(curr_ptr->string) _tcscpy(commandline,curr_ptr->string); + } + + + + if(dir>0) { + if (curr_ptr->prev==Bottom || curr_ptr==Bottom) { -#ifdef WRAP_HISTORY +#ifdef WRAP_HISTORY curr_ptr=Top; #else curr_ptr=Bottom; @@ -223,11 +405,123 @@ VOID History (INT dir, LPTSTR commandline) #endif } - curr_ptr=curr_ptr->prev; + curr_ptr=curr_ptr->prev; if(curr_ptr->string) - _tcscpy(commandline,curr_ptr->string); + _tcscpy(commandline,curr_ptr->string); + } } -#endif /* FEATURE_HISTORY */ -/* EOF */ \ No newline at end of file + + + + + +#if 0 + +LPTSTR history = NULL; /*buffer to sotre all the lines*/ +LPTSTR lines[MAXLINES]; /*array of pointers to each line(entry)*/ + /*located in history buffer*/ + +INT curline = 0; /*the last line recalled by user*/ +INT numlines = 0; /*number of entries, included the last*/ + /*empty one*/ + +INT maxpos = 0; /*index of last byte of last entry*/ + + + +VOID History (INT dir, LPTSTR commandline) +{ + + INT count; /*used in for loops*/ + INT length; /*used in the same loops of count*/ + /*both to make room when is full + either history or lines*/ + + /*first time History is called allocate mem*/ + if (!history) + { + history = malloc (history_size * sizeof (TCHAR)); + lines[0] = history; + history[0] = 0; + } + + if (dir > 0) + { + /* next command */ + if (curline < numlines) + { + curline++; + } + + if (curline == numlines) + { + commandline[0] = 0; + } + else + { + _tcscpy (commandline, lines[curline]); + } + } + else if (dir < 0) + { + /* prev command */ + if (curline > 0) + { + curline--; + } + + _tcscpy (commandline, lines[curline]); + } + else + { + /* add to history */ + /* remove oldest string until there's enough room for next one */ + /* strlen (commandline) must be less than history_size! */ + while ((maxpos + (INT)_tcslen (commandline) + 1 > history_size) || (numlines >= MAXLINES)) + { + length = _tcslen (lines[0]) + 1; + + for (count = 0; count < maxpos && count + (lines[1] - lines[0]) < history_size; count++) + { + history[count] = history[count + length]; + } + + maxpos -= length; + + for (count = 0; count <= numlines && count < MAXLINES; count++) + { + lines[count] = lines[count + 1] - length; + } + + numlines--; +#ifdef DEBUG + ConOutPrintf (_T("Reduced size: %ld lines\n"), numlines); + + for (count = 0; count < numlines; count++) + { + ConOutPrintf (_T("%d: %s\n"), count, lines[count]); + } +#endif + } + + /*copy entry in the history bufer*/ + _tcscpy (lines[numlines], commandline); + numlines++; + + /*set last lines[numlines] pointer next the end of last, valid, + just setted entry (the two lines above)*/ + lines[numlines] = lines[numlines - 1] + _tcslen (commandline) + 1; + maxpos += _tcslen (commandline) + 1; + /* last line, empty */ + + curline = numlines; + } + + return; +} + +#endif + +#endif //#if 0 \ No newline at end of file