Added CHOICE command and fixed a cursor bug.

svn path=/trunk/; revision=627
This commit is contained in:
Eric Kohl 1999-08-22 21:46:50 +00:00
parent a35e54e5f8
commit 7bcdd2ea10
8 changed files with 273 additions and 10 deletions

View file

@ -0,0 +1,245 @@
/*
* CHOICE.C - internal command.
*
*
* History:
*
* 12 Jul 1999 (Eric Kohl)
* started.
*/
#include "config.h"
#ifdef INCLUDE_CMD_CHOICE
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <tchar.h>
#include "cmd.h"
#include "batch.h"
static INT
IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive)
{
PTCHAR p = lpString;
INT val = 0;
while (*p)
{
if (bCaseSensitive)
{
if (*p == cKey)
return val;
}
else
{
if (_totlower (*p) == _totlower (cKey))
return val;
}
val++;
p++;
}
return -1;
}
INT
CommandChoice (LPTSTR cmd, LPTSTR param)
{
LPTSTR lpOptions = "YN";
LPTSTR lpText = NULL;
BOOL bNoPrompt = FALSE;
BOOL bCaseSensitive = FALSE;
BOOL bTimeout = FALSE;
INT nTimeout = 0;
TCHAR cDefault = _T('\0');
INPUT_RECORD ir;
LPTSTR p, np;
LPTSTR *arg;
INT argc;
INT i;
INT val;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutPuts (_T("Prompts the user to select an option.\n"
"\n"
"CHOICE [/C[:]options][/N][/S][/T[:]c,nn][text]\n"
"\n"
" /C[:]options Allowed option characters. Default is YN.\n"
" /N The option characters and the question mark will\n"
" not be appended.\n"
" /S Input is case sensitive.\n"
" /T[:]c,nn Default to c after nn seconds.\n"
" text Displayed prompt.\n"
"\n"
"ERRORLEVEL ...\n"));
return 0;
}
/* retrieve text */
p = param;
while (TRUE)
{
if (*p == _T('\0'))
break;
if (*p != _T('/'))
{
lpText = p;
break;
}
np = _tcschr (p, _T(' '));
if (!np)
break;
p = np + 1;
}
/* build parameter array */
arg = split (param, &argc);
/* evaluate arguments */
if (argc > 0)
{
for (i = 0; i < argc; i++)
{
if (_tcsnicmp (arg[i], _T("/c"), 2) == 0)
{
if (arg[i][2] == _T(':'))
lpOptions = &arg[i][3];
else
lpOptions = &arg[i][2];
if (_tcslen (lpOptions) == 0)
{
ConErrPuts (_T("CHOICE: Error!!"));
freep (arg);
return 1;
}
}
else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0)
{
bNoPrompt = TRUE;
}
else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0)
{
bCaseSensitive = TRUE;
}
else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0)
{
LPTSTR s;
if (arg[i][2] == _T(':'))
{
cDefault = arg[i][3];
s = & arg[i][4];
}
else
{
cDefault = arg[i][2];
s = & arg[i][3];
}
if (*s != _T(','))
{
ConErrPrintf (_T("Format Error: /T!!\n"));
freep (arg);
return 1;
}
s++;
nTimeout = _ttoi(s);
bTimeout = TRUE;
}
else if (arg[i][0] == _T('/'))
{
ConErrPrintf (_T("Illegal Option: %s"), arg[i]);
freep (arg);
return 1;
}
}
}
/* print text */
if (lpText)
ConOutPrintf (_T("%s"), lpText);
/* print options */
if (bNoPrompt == FALSE)
{
ConOutPrintf (_T("[%c"), lpOptions[0]);
for (i = 1; i < _tcslen (lpOptions); i++)
ConOutPrintf (_T(",%c"), lpOptions[i]);
ConOutPrintf (_T("]?"));
}
ConInFlush ();
if (bTimeout)
{
if (WaitForSingleObject (GetStdHandle(STD_INPUT_HANDLE),
nTimeout * 1000) == WAIT_TIMEOUT)
{
val = IsKeyInString (lpOptions,
cDefault,
bCaseSensitive);
if (val >= 0)
{
ConOutPrintf (_T("%c\n"), lpOptions[val]);
nErrorLevel = val + 1;
freep (arg);
#ifdef _DEBUG
DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
#endif /* _DEBUG */
return 0;
}
}
}
while (TRUE)
{
ConInKey (&ir);
val = IsKeyInString (lpOptions,
#ifdef _UNICODE
ir.Event.KeyEvent.uChar.UnicodeChar,
#else
ir.Event.KeyEvent.uChar.AsciiChar,
#endif /* _UNICODE */
bCaseSensitive);
if (val >= 0)
{
ConOutPrintf (_T("%c\n"), lpOptions[val]);
nErrorLevel = val + 1;
break;
}
Beep (440, 50);
}
freep (arg);
#ifdef _DEBUG
DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
#endif /* _DEBUG */
return 0;
}
#endif /* INCLUDE_CMD_CHOICE */
/* EOF */

View file

@ -30,7 +30,7 @@
#include <tchar.h>
#define CMD_VER "0.1 pre 2"
#define CMD_VER "0.1 pre 5"
#ifdef _MSC_VER
#define SHELLVER "Version " CMD_VER " [" __DATE__ ", msc]"
@ -105,6 +105,10 @@ INT cmd_beep (LPTSTR, LPTSTR);
INT cmd_call (LPTSTR, LPTSTR);
/* Prototypes for CHOICE.C */
INT CommandChoice (LPTSTR, LPTSTR);
/* Prototypes for CLS.C */
INT cmd_cls (LPTSTR, LPTSTR);
@ -136,6 +140,7 @@ VOID DebugPrintf (LPTSTR, ...);
#endif /* _DEBUG */
VOID ConInDummy (VOID);
VOID ConInFlush (VOID);
VOID ConInKey (PINPUT_RECORD);
VOID ConInString (LPTSTR, DWORD);

View file

@ -68,6 +68,11 @@ COMMAND cmds[] =
{_T("chcp"), 0, CommandChcp},
#endif
#ifdef INCLUDE_CMD_CHOICE
{_T("choice"), 0, CommandChoice},
#endif
#ifdef INCLUDE_CMD_CLS
{_T("cls"), 0, cmd_cls},
#endif

View file

@ -59,6 +59,7 @@
/*#define INCLUDE_CMD_BREAK*/
#define INCLUDE_CMD_CHCP
#define INCLUDE_CMD_CHDIR
#define INCLUDE_CMD_CHOICE
#define INCLUDE_CMD_CLS
#define INCLUDE_CMD_COLOR
#define INCLUDE_CMD_COPY
@ -86,7 +87,7 @@
#define INCLUDE_CMD_VOL
/*
command that do not have a define:
commands that do not have a define:
exit
call

View file

@ -52,6 +52,11 @@ VOID ConInDummy (VOID)
ReadConsoleInput (hInput, &dummy, 1, &dwRead);
}
VOID ConInFlush (VOID)
{
FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE));
}
VOID ConInKey (PINPUT_RECORD lpBuffer)
{
@ -232,7 +237,7 @@ VOID SetCursorType (BOOL bInsert, BOOL bVisible)
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = bInsert ? 10 : 100;
cci.dwSize = bInsert ? 10 : 99;
cci.bVisible = bVisible;
SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci);

View file

@ -18,6 +18,7 @@ batch.c Batch file interpreter
beep.c Implements beep command
call.c Implements call command
chcp.c Implements chcp command
choice.c Implements choice command
cls.c Implements cls command
cmdinput.c Command-line input functions
cmdtable.c Table of available internal commands
@ -53,4 +54,4 @@ time.c Implements time command
type.c Implements type command
ver.c Implements ver command
where.c Code to search path for executables
verify.c Implements verify command
verify.c Implements verify command

View file

@ -344,10 +344,11 @@ o Added CHCP command.
o Fixed keyboard input bug.
o Rewrote DEL and MOVE commands.
30-Mar-1999 ReactOS CMD version 0.1 pre 2 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
19-Aug-1999 ReactOS CMD version 0.1 pre 5 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Cleaned up DIR command.
o Searching for executables in the right order.
o Fixed some little but nasty bugs.
o Added TITLE command. Thanks to Emanuele Aliberti!
o Added "/Q", "/W" and "/Z" options to DEL command.
o Added CHOICE command.

View file

@ -5,11 +5,11 @@
all: cmd.exe
OBJECTS = ../common/crt0.o cmd.o attrib.o alias.o batch.o beep.o call.o \
chcp.o cls.o cmdinput.o cmdtable.o color.o console.o copy.o date.o \
del.o dir.o dirstack.o echo.o error.o filecomp.o for.o goto.o \
history.o if.o internal.o label.o locale.o misc.o move.o path.o \
pause.o prompt.o redir.o ren.o set.o shift.o start.o time.o title.o \
type.o ver.o verify.o vol.o where.o
chcp.o choice.o cls.o cmdinput.o cmdtable.o color.o console.o \
copy.o date.o del.o dir.o dirstack.o echo.o error.o filecomp.o \
for.o goto.o history.o if.o internal.o label.o locale.o misc.o \
move.o path.o pause.o prompt.o redir.o ren.o set.o shift.o \
start.o time.o title.o type.o ver.o verify.o vol.o where.o
LIBS= ../../lib/kernel32/kernel32.a ../../lib/crtdll/crtdll.a