2 * CMDINPUT.C - handles command input (tab completion, history, etc.).
7 * 01/14/95 (Tim Norman)
10 * 08/08/95 (Matt Rains)
11 * i have cleaned up the source code. changes now bring this source
12 * into guidelines for recommended programming practice.
13 * i have added some constants to help making changes easier.
15 * 12/12/95 (Tim Norman)
16 * added findxy() function to get max x/y coordinates to display
17 * correctly on larger screens
19 * 12/14/95 (Tim Norman)
20 * fixed the Tab completion code that Matt Rains broke by moving local
21 * variables to a more global scope and forgetting to initialize them
25 * fixed a bug in tab completion that caused filenames at the beginning
26 * of the command-line to have their first letter truncated
29 * fixed a silly bug using printf instead of fputs, where typing "%i"
32 * 6/14/97 (Steffan Kaiser)
35 * 6/7/97 (Marc Desrochers)
36 * recoded everything! now properly adjusts when text font is changed.
37 * removed findxy(), reposition(), and reprint(), as these functions
38 * were inefficient. added goxy() function as gotoxy() was buggy when
39 * the screen font was changed. the printf() problem with %i on the
40 * command line was fixed by doing printf("%s",str) instead of
41 * printf(str). Don't ask how I find em just be glad I do :)
43 * 7/12/97 (Tim Norman)
44 * Note: above changes pre-empted Steffan's ctrl-break checking.
46 * 7/7/97 (Marc Desrochers)
47 * rewrote a new findxy() because the new dir() used it. This
48 * findxy() simply returns the values of *maxx *maxy. In the
49 * future, please use the pointers, they will always be correct
50 * since they point to BIOS values.
52 * 7/8/97 (Marc Desrochers)
53 * once again removed findxy(), moved the *maxx, *maxy pointers
54 * global and included them as externs in command.h. Also added
55 * insert/overstrike capability
57 * 7/13/97 (Tim Norman)
58 * added different cursor appearance for insert/overstrike mode
60 * 7/13/97 (Tim Norman)
61 * changed my code to use _setcursortype until I can figure out why
62 * my code is crashing on some machines. It doesn't crash on mine :)
64 * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
65 * added config.h include
67 * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
68 * put ifdef's around filename completion code.
70 * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
71 * moved filename completion code to filecomp.c
72 * made second TAB display list of filename matches
74 * 31-Jul-1998 (John P Price <linux-guru@gcfl.net>)
75 * Fixed bug where if you typed something, then hit HOME, then tried
76 * to type something else in insert mode, it crashed.
78 * 07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
79 * Fixed carrage return output to better match MSDOS with echo
80 * on or off.(marked with "JPP 19980708")
82 * 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
83 * Added insert/overwrite cursor.
85 * 25-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
86 * Replaced CRT io functions by Win32 console io functions.
87 * This can handle <Shift>-<Tab> for 4NT filename completion.
88 * Unicode and redirection safe!
90 * 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
91 * Fixed input bug. A "line feed" character remined in the keyboard
92 * input queue when you pressed <RETURN>. This sometimes caused
93 * some very strange effects.
94 * Fixed some command line editing annoyances.
97 #define WIN32_LEAN_AND_MEAN
114 * global command line insert/overwrite flag
116 static BOOL bInsert
= TRUE
;
120 ClearCommandLine (LPTSTR str
, INT maxlen
, SHORT orgx
, SHORT orgy
)
125 for (count
= 0; count
< (INT
)_tcslen (str
); count
++)
126 ConOutChar (_T(' '));
127 _tcsnset (str
, _T('\0'), maxlen
);
132 /* read in a command line */
133 VOID
ReadCommand (LPTSTR str
, INT maxlen
)
135 SHORT orgx
; /* origin x/y */
146 /* get screen size */
147 GetScreenSize (&maxx
, &maxy
);
149 /* JPP 19980807 - if echo off, don't print prompt */
156 memset (str
, 0, maxlen
* sizeof (TCHAR
));
158 SetCursorType (bInsert
, TRUE
);
164 switch (ir
.Event
.KeyEvent
.wVirtualKeyCode
)
167 /* <BACKSPACE> - delete character to left of cursor */
168 if (current
> 0 && charcount
> 0)
170 if (current
== charcount
)
172 /* if at end of line */
173 str
[current
- 1] = _T('\0');
176 ConOutPrintf ("\b \b");
180 goxy ((SHORT
)(maxx
- 1), (SHORT
)(wherey () - 1));
181 ConOutChar (_T(' '));
182 goxy ((SHORT
)(maxx
- 1), (SHORT
)(wherey () - 1));
187 for (count
= current
- 1; count
< charcount
; count
++)
188 str
[count
] = str
[count
+ 1];
190 goxy ((SHORT
)(wherex () - 1), wherey ());
192 goxy ((SHORT
)(maxx
- 1), (SHORT
)(wherey () - 1));
195 ConOutPrintf (_T("%s "), &str
[current
- 1]);
204 /* toggle insert/overstrike mode */
206 SetCursorType (bInsert
, TRUE
);
210 /* delete character under cursor */
211 if (current
!= charcount
&& charcount
> 0)
213 for (count
= current
; count
< charcount
; count
++)
214 str
[count
] = str
[count
+ 1];
218 ConOutPrintf (_T("%s "), &str
[current
]);
224 /* goto beginning of string */
233 /* goto end of string */
234 if (current
!= charcount
)
237 ConOutPrintf (_T("%s"), str
);
243 #ifdef FEATURE_UNIX_FILENAME_COMPLETION
244 /* expand current file name */
245 if (current
== charcount
) // only works at end of line
247 if (wLastKey
!= VK_TAB
)
249 // if first TAB, complete filename
250 CompleteFilename (str
, charcount
);
251 charcount
= _tcslen (str
);
255 ConOutPrintf (_T("%s"), str
);
256 if ((_tcslen (str
) > (USHORT
)(maxx
- orgx
)) && (orgy
== maxy
+ 1))
261 //if second TAB, list matches
262 if (ShowCompletionMatches (str
, charcount
))
267 ConOutPrintf (_T("%s"), str
);
276 #ifdef FEATURE_4NT_FILENAME_COMPLETION
277 /* this is not implemented yet */
278 if (ir
.Event
.KeyEvent
.dwControlKeyState
& SHIFT_PRESSED
)
280 /* get previous match */
292 /* end input, return to main */
293 #ifdef FEATURE_HISTORY
294 /* add to the history */
299 ConOutChar (_T('\n'));
303 /* clear str Make this callable! */
304 ClearCommandLine (str
, maxlen
, orgx
, orgy
);
305 current
= charcount
= 0;
309 #ifdef FEATURE_HISTORY
310 /* get previous command from buffer */
311 ClearCommandLine (str
, maxlen
, orgx
, orgy
);
313 current
= charcount
= _tcslen (str
);
314 ConOutPrintf (_T("%s"), str
);
319 #ifdef FEATURE_HISTORY
320 /* get next command from buffer */
321 ClearCommandLine (str
, maxlen
, orgx
, orgy
);
323 current
= charcount
= _tcslen (str
);
324 ConOutPrintf (_T("%s"), str
);
329 /* move cursor left */
334 goxy ((SHORT
)(maxx
- 1), (SHORT
)(wherey () - 1));
336 goxy ((SHORT
)(wherex () - 1), wherey ());
346 /* move cursor right */
347 if (current
!= charcount
)
350 if (wherex () == maxx
- 1)
351 goxy (0, (SHORT
)(wherey () + 1));
353 goxy ((SHORT
)(wherex () + 1), wherey ());
359 ch
= ir
.Event
.KeyEvent
.uChar
.UnicodeChar
;
361 ch
= ir
.Event
.KeyEvent
.uChar
.AsciiChar
;
363 if ((ch
>= 32 && ch
<= 255) && (charcount
!= (maxlen
- 2)))
365 /* insert character into string... */
366 if (bInsert
&& current
!= charcount
)
368 for (count
= charcount
; count
> current
; count
--)
369 str
[count
] = str
[count
- 1];
371 if (wherex () == maxx
- 1)
374 cury
= wherey () + 1;
378 curx
= wherex () + 1;
381 ConOutPrintf (_T("%s"), &str
[current
- 1]);
382 if ((_tcslen (str
) > (USHORT
)(maxx
- orgx
)) && (orgy
== maxy
+ 1))
389 if (current
== charcount
)
394 if ((_tcslen (str
) > (USHORT
)(maxx
- orgx
)) && (orgy
== maxy
+ 1))
407 wLastKey
= ir
.Event
.KeyEvent
.wVirtualKeyCode
;
409 while (ir
.Event
.KeyEvent
.wVirtualKeyCode
!= VK_RETURN
);
411 SetCursorType (bInsert
, TRUE
);