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

View file

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

View file

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

View file

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

View file

@ -18,6 +18,7 @@ batch.c Batch file interpreter
beep.c Implements beep command beep.c Implements beep command
call.c Implements call command call.c Implements call command
chcp.c Implements chcp command chcp.c Implements chcp command
choice.c Implements choice command
cls.c Implements cls command cls.c Implements cls command
cmdinput.c Command-line input functions cmdinput.c Command-line input functions
cmdtable.c Table of available internal commands cmdtable.c Table of available internal commands
@ -53,4 +54,4 @@ time.c Implements time command
type.c Implements type command type.c Implements type command
ver.c Implements ver command ver.c Implements ver command
where.c Code to search path for executables 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 Fixed keyboard input bug.
o Rewrote DEL and MOVE commands. 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 Cleaned up DIR command.
o Searching for executables in the right order. o Searching for executables in the right order.
o Fixed some little but nasty bugs. o Fixed some little but nasty bugs.
o Added TITLE command. Thanks to Emanuele Aliberti! o Added TITLE command. Thanks to Emanuele Aliberti!
o Added "/Q", "/W" and "/Z" options to DEL command. o Added "/Q", "/W" and "/Z" options to DEL command.
o Added CHOICE command.

View file

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