mirror of
https://github.com/reactos/reactos.git
synced 2024-08-14 15:16:27 +00:00
Added CHOICE command and fixed a cursor bug.
svn path=/trunk/; revision=627
This commit is contained in:
parent
a35e54e5f8
commit
7bcdd2ea10
245
reactos/apps/utils/cmd/choice.c
Normal file
245
reactos/apps/utils/cmd/choice.c
Normal 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 */
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue