ReactOS  0.4.14-dev-342-gdc047f9
choice.c File Reference
#include "precomp.h"
Include dependency graph for choice.c:

Go to the source code of this file.

Macros

#define GC_TIMEOUT   -1
 
#define GC_NOKEY   0
 
#define GC_KEYREAD   1
 

Functions

static INT GetCharacterTimeout (LPTCH ch, DWORD dwMilliseconds)
 
static INT IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive)
 
INT CommandChoice (LPTSTR param)
 

Macro Definition Documentation

◆ GC_KEYREAD

#define GC_KEYREAD   1

Definition at line 28 of file choice.c.

◆ GC_NOKEY

#define GC_NOKEY   0

Definition at line 27 of file choice.c.

◆ GC_TIMEOUT

#define GC_TIMEOUT   -1

Definition at line 26 of file choice.c.

Function Documentation

◆ CommandChoice()

INT CommandChoice ( LPTSTR  param)

Definition at line 102 of file choice.c.

103 {
104  LPTSTR lpOptions;
105  TCHAR Options[6];
106  LPTSTR lpText = NULL;
107  BOOL bNoPrompt = FALSE;
109  BOOL bTimeout = FALSE;
110  INT nTimeout = 0;
111  TCHAR cDefault = _T('\0');
112  INPUT_RECORD ir;
113  LPTSTR p, np;
114  LPTSTR *arg;
115  INT argc;
116  INT i;
117  INT val;
118 
119  INT GCret;
120  TCHAR Ch;
121  DWORD amount,clk;
122 
124  lpOptions = Options;
125 
126  if (_tcsncmp (param, _T("/?"), 2) == 0)
127  {
129  return 0;
130  }
131 
132  /* retrieve text */
133  p = param;
134 
135  while (TRUE)
136  {
137  if (*p == _T('\0'))
138  break;
139 
140  if (*p != _T('/'))
141  {
142  lpText = p;
143  break;
144  }
145  np = _tcschr (p, _T(' '));
146  if (!np)
147  break;
148  p = np + 1;
149  }
150 
151  /* build parameter array */
152  arg = split (param, &argc, FALSE, FALSE);
153 
154  /* evaluate arguments */
155  if (argc > 0)
156  {
157  for (i = 0; i < argc; i++)
158  {
159  if (_tcsnicmp (arg[i], _T("/c"), 2) == 0)
160  {
161  if (arg[i][2] == _T(':'))
162  lpOptions = &arg[i][3];
163  else
164  lpOptions = &arg[i][2];
165 
166  if (_tcslen (lpOptions) == 0)
167  {
169  freep (arg);
170  return 1;
171  }
172  }
173  else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0)
174  {
175  bNoPrompt = TRUE;
176  }
177  else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0)
178  {
180  }
181  else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0)
182  {
183  LPTSTR s;
184 
185  if (arg[i][2] == _T(':'))
186  {
187  cDefault = arg[i][3];
188  s = &arg[i][4];
189  }
190  else
191  {
192  cDefault = arg[i][2];
193  s = &arg[i][3];
194  }
195 
196  if (*s != _T(','))
197  {
199  freep (arg);
200  return 1;
201  }
202 
203  s++;
204  nTimeout = _ttoi(s);
205  bTimeout = TRUE;
206  }
207  else if (arg[i][0] == _T('/'))
208  {
210  freep (arg);
211  return 1;
212  }
213  }
214  }
215 
216  /* print text */
217  if (lpText)
218  ConOutPrintf (_T("%s"), lpText);
219 
220  /* print options */
221  if (bNoPrompt == FALSE)
222  {
223  ConOutPrintf (_T("[%c"), lpOptions[0]);
224 
225  for (i = 1; (unsigned)i < _tcslen (lpOptions); i++)
226  ConOutPrintf (_T(",%c"), lpOptions[i]);
227 
228  ConOutPrintf (_T("]?"));
229  }
230 
231  ConInFlush ();
232 
233  if (!bTimeout)
234  {
235  while (TRUE)
236  {
237  ConInKey (&ir);
238 
239  val = IsKeyInString (lpOptions,
240 #ifdef _UNICODE
242 #else
244 #endif
246 
247  if (val >= 0)
248  {
249  ConOutPrintf (_T("%c\n"), lpOptions[val]);
250 
251  nErrorLevel = val + 1;
252 
253  break;
254  }
255 
256  Beep (440, 50);
257  }
258 
259  freep (arg);
260  TRACE ("ErrorLevel: %d\n", nErrorLevel);
261  return 0;
262  }
263 
264  clk = GetTickCount ();
265  amount = nTimeout*1000;
266 
267 loop:
268  GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk));
269 
270  switch (GCret)
271  {
272  case GC_TIMEOUT:
273  TRACE ("GC_TIMEOUT\n");
274  TRACE ("elapsed %d msecs\n", GetTickCount () - clk);
275  break;
276 
277  case GC_NOKEY:
278  TRACE ("GC_NOKEY\n");
279  TRACE ("elapsed %d msecs\n", GetTickCount () - clk);
280  goto loop;
281 
282  case GC_KEYREAD:
283  TRACE ("GC_KEYREAD\n");
284  TRACE ("elapsed %d msecs\n", GetTickCount () - clk);
285  TRACE ("read %c", Ch);
286  if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1)
287  {
288  Beep (440, 50);
289  goto loop;
290  }
291  cDefault=Ch;
292  break;
293  }
294 
295  TRACE ("exiting wait loop after %d msecs\n",
296  GetTickCount () - clk);
297 
298  val = IsKeyInString (lpOptions, cDefault, bCaseSensitive);
299  ConOutPrintf(_T("%c\n"), lpOptions[val]);
300 
301  nErrorLevel = val + 1;
302 
303  freep (arg);
304 
305  TRACE ("ErrorLevel: %d\n", nErrorLevel);
306 
307  return 0;
308 }
INT nErrorLevel
Definition: cmd.c:157
static int argc
Definition: ServiceArgs.c:12
static BOOL bCaseSensitive
Definition: systempage.cpp:56
#define TRUE
Definition: types.h:120
WCHAR UnicodeChar
Definition: wincon.h:230
static INT GetCharacterTimeout(LPTCH ch, DWORD dwMilliseconds)
Definition: choice.c:32
#define GC_NOKEY
Definition: choice.c:27
#define ConErrResPuts(uID)
Definition: console.h:39
#define GC_KEYREAD
Definition: choice.c:28
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:445
#define STRING_CHOICE_ERROR
Definition: resource.h:24
union _KEY_EVENT_RECORD::@3175 uChar
#define ConOutPrintf(szStr,...)
Definition: console.h:42
void * arg
Definition: msvc.h:12
VOID ConOutResPaging(BOOL StartPaging, UINT resID)
Definition: console.c:182
#define Ch(x, y, z)
Definition: sha2.c:141
enum OPTION_FLAGS Options
Definition: stats.c:44
int32_t INT
Definition: typedefs.h:56
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define STRING_CHOICE_HELP
Definition: resource.h:73
VOID ConInKey(PINPUT_RECORD lpBuffer)
Definition: console.c:61
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ConErrResPrintf(uID,...)
Definition: console.h:51
#define _tcsnicmp
Definition: xmlstorage.h:207
size_t __cdecl _tcslen(const _TCHAR *str)
Definition: tcslen.h:9
static VOID freep(LPSTR *p)
Definition: cmdcons.c:98
smooth NULL
Definition: ftsmooth.c:416
_TCHAR * _tcschr(const _TCHAR *s, _XINT c)
Definition: tcschr.h:4
GLuint GLfloat * val
Definition: glext.h:7180
char TCHAR
Definition: xmlstorage.h:189
#define _T(x)
Definition: vfdio.h:22
#define TRACE(s)
Definition: solgame.cpp:4
GLfloat param
Definition: glext.h:5796
static LPSTR * split(LPSTR s, LPINT args)
Definition: cmdcons.c:163
KEY_EVENT_RECORD KeyEvent
Definition: wincon.h:263
unsigned long DWORD
Definition: ntddk_ex.h:95
#define GC_TIMEOUT
Definition: choice.c:26
#define STRING_CHOICE_ERROR_TXT
Definition: resource.h:25
#define STRING_CHOICE_ERROR_OPTION
Definition: resource.h:26
VOID ConInFlush(VOID)
Definition: console.c:56
GLdouble s
Definition: gl.h:2039
#define STRING_CHOICE_OPTION
Definition: resource.h:19
int CDECL _ttoi(const _TCHAR *str)
Definition: atoi.c:10
HANDLE CMD_ModuleHandle
Definition: cmd.c:164
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
Definition: deviceio.c:48
union _INPUT_RECORD::@3176 Event
#define _UNICODE
Definition: audio_test.c:1
GLfloat GLfloat p
Definition: glext.h:8902
int _tcsncmp(const _TCHAR *s1, const _TCHAR *s2, size_t n)
Definition: tcsncmp.h:9
#define LoadString
Definition: winuser.h:5720
static INT IsKeyInString(LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive)
Definition: choice.c:75

◆ GetCharacterTimeout()

static INT GetCharacterTimeout ( LPTCH  ch,
DWORD  dwMilliseconds 
)
static

Definition at line 32 of file choice.c.

33 {
34 //--------------------------------------------
35 // Get a character from standard input but with a timeout.
36 // The function will wait a limited amount
37 // of time, then the function returns GC_TIMEOUT.
38 //
39 // dwMilliseconds is the timeout value, that can
40 // be set to INFINITE, so the function works like
41 // stdio.h's getchar()
42 
43  HANDLE hInput;
44  DWORD dwRead;
45 
47 
48  hInput = GetStdHandle (STD_INPUT_HANDLE);
49 
50  //if the timeout expired return GC_TIMEOUT
51  if (WaitForSingleObject (hInput, dwMilliseconds) == WAIT_TIMEOUT)
52  return GC_TIMEOUT;
53 
54  //otherwise get the event
55  ReadConsoleInput (hInput, &lpBuffer, 1, &dwRead);
56 
57  //if the event is a key pressed
58  if ((lpBuffer.EventType == KEY_EVENT) &&
59  (lpBuffer.Event.KeyEvent.bKeyDown != FALSE))
60  {
61  //read the key
62 #ifdef _UNICODE
63  *ch = lpBuffer.Event.KeyEvent.uChar.UnicodeChar;
64 #else
65  *ch = lpBuffer.Event.KeyEvent.uChar.AsciiChar;
66 #endif
67  return GC_KEYREAD;
68  }
69 
70  //else return no key
71  return GC_NOKEY;
72 }
#define GC_NOKEY
Definition: choice.c:27
#define GC_KEYREAD
Definition: choice.c:28
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define ReadConsoleInput
Definition: wincon.h:766
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:173
#define KEY_EVENT
Definition: wincon.h:122
#define STD_INPUT_HANDLE
Definition: winbase.h:264
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define GC_TIMEOUT
Definition: choice.c:26

Referenced by CommandChoice().

◆ IsKeyInString()

static INT IsKeyInString ( LPTSTR  lpString,
TCHAR  cKey,
BOOL  bCaseSensitive 
)
static

Definition at line 75 of file choice.c.

76 {
77  LPTCH p = lpString;
78  INT val = 0;
79 
80  while (*p)
81  {
82  if (bCaseSensitive)
83  {
84  if (*p == cKey)
85  return val;
86  }
87  else
88  {
89  if (_totlower (*p) == _totlower (cKey))
90  return val;
91  }
92 
93  val++;
94  p++;
95  }
96 
97  return -1;
98 }
static BOOL bCaseSensitive
Definition: systempage.cpp:56
int32_t INT
Definition: typedefs.h:56
GLuint GLfloat * val
Definition: glext.h:7180
#define _totlower
Definition: tchar.h:1511
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by CommandChoice().