ReactOS  0.4.14-dev-608-gd495a4f
prompt.c
Go to the documentation of this file.
1 /*
2  * PROMPT.C - prompt handling.
3  *
4  *
5  * History:
6  *
7  * 14/01/95 (Tim Normal)
8  * started.
9  *
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  *
14  * 01/06/96 (Tim Norman)
15  * added day of the week printing (oops, forgot about that!)
16  *
17  * 08/07/96 (Steffan Kaiser)
18  * small changes for speed
19  *
20  * 20-Jul-1998 (John P Price <linux-guru@gcfl.net>)
21  * removed redundant day strings. Use ones defined in date.c.
22  *
23  * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
24  * added config.h include
25  *
26  * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
27  * moved cmd_prompt from internal.c to here
28  *
29  * 09-Dec-1998 (Eric Kohl)
30  * Added help text ("/?").
31  *
32  * 14-Dec-1998 (Eric Kohl)
33  * Added "$+" option.
34  *
35  * 09-Jan-1999 (Eric Kohl)
36  * Added "$A", "$C" and "$F" option.
37  * Added locale support.
38  * Fixed "$V" option.
39  *
40  * 20-Jan-1999 (Eric Kohl)
41  * Unicode and redirection safe!
42  *
43  * 24-Jan-1999 (Eric Kohl)
44  * Fixed Win32 environment handling.
45  *
46  * 30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
47  * Remove all hardcoded strings in En.rc
48  */
49 #include "precomp.h"
50 
51 /* The default prompt */
52 static TCHAR DefaultPrompt[] = _T("$P$G");
53 
54 /*
55  * Initialize prompt support
56  */
58 {
59  TCHAR Buffer[2];
60 
61  /*
62  * Set the PROMPT environment variable if it doesn't exist already.
63  * You can change the PROMPT environment variable before cmd starts.
64  */
65  if (GetEnvironmentVariable(_T("PROMPT"), Buffer, ARRAYSIZE(Buffer)) == 0)
67 }
68 
69 /*
70  * Print an information line on top of the screen
71  */
73 {
74 #define FOREGROUND_WHITE (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
75 
78  COORD coPos;
79  DWORD dwWritten;
80 
81  PTSTR pszInfoLine = NULL;
82  INT iInfoLineLen;
83 
84  /* Return directly if the output handle is not a console handle */
85  if (!GetConsoleScreenBufferInfo(hOutput, &csbi))
86  return;
87 
88  iInfoLineLen = LoadString(CMD_ModuleHandle, STRING_CMD_INFOLINE, (PTSTR)&pszInfoLine, 0);
89  if (!pszInfoLine || iInfoLineLen == 0)
90  return;
91 
92  /* Display the localized information line */
93  coPos.X = 0;
94  coPos.Y = 0;
96  csbi.dwSize.X,
97  coPos, &dwWritten);
98  FillConsoleOutputCharacter(hOutput, _T(' '),
99  csbi.dwSize.X,
100  coPos, &dwWritten);
101 
102  WriteConsoleOutputCharacter(hOutput, pszInfoLine, iInfoLineLen,
103  coPos, &dwWritten);
104 }
105 
106 /*
107  * Print the command-line prompt
108  */
110 {
111  TCHAR szPrompt[256];
112  LPTSTR pr;
113 
114  if (GetEnvironmentVariable(_T("PROMPT"), szPrompt, 256))
115  pr = szPrompt;
116  else
117  pr = DefaultPrompt;
118 
119  while (*pr)
120  {
121  if (*pr != _T('$'))
122  {
123  ConOutChar(*pr);
124  }
125  else
126  {
127  pr++;
128 
129  switch (_totupper(*pr))
130  {
131  case _T('A'):
132  ConOutChar(_T('&'));
133  break;
134 
135  case _T('B'):
136  ConOutChar(_T('|'));
137  break;
138 
139  case _T('C'):
140  ConOutChar(_T('('));
141  break;
142 
143  case _T('D'):
144  ConOutPrintf(_T("%s"), GetDateString());
145  break;
146 
147  case _T('E'):
148  ConOutChar(_T('\x1B'));
149  break;
150 
151  case _T('F'):
152  ConOutChar(_T(')'));
153  break;
154 
155  case _T('G'):
156  ConOutChar(_T('>'));
157  break;
158 
159  case _T('H'):
160  ConOutChar(_T('\x08'));
161  ConOutChar(_T(' '));
162  ConOutChar(_T('\x08'));
163  break;
164 
165  case _T('I'):
166  PrintInfoLine();
167  break;
168 
169  case _T('L'):
170  ConOutChar(_T('<'));
171  break;
172 
173  case _T('N'):
174  {
177  ConOutChar(szPath[0]);
178  }
179  break;
180 
181  case _T('P'):
182  {
185  ConOutPrintf(_T("%s"), szPath);
186  }
187  break;
188 
189  case _T('Q'):
190  ConOutChar(_T('='));
191  break;
192 
193  case _T('S'):
194  ConOutChar(_T(' '));
195  break;
196 
197  case _T('T'):
198  ConOutPrintf(_T("%s"), GetTimeString());
199  break;
200 
201  case _T('V'):
202  PrintOSVersion();
203  break;
204 
205  case _T('_'):
206  ConOutChar(_T('\n'));
207  break;
208 
209  case '$':
210  ConOutChar(_T('$'));
211  break;
212 
213 #ifdef FEATURE_DIRECTORY_STACK
214  case '+':
215  {
216  INT i;
217  for (i = 0; i < GetDirectoryStackDepth (); i++)
218  ConOutChar(_T('+'));
219  }
220  break;
221 #endif
222  }
223  }
224  pr++;
225  }
226 }
227 
228 
229 #ifdef INCLUDE_CMD_PROMPT
230 
232 {
233  if (!_tcsncmp(param, _T("/?"), 2))
234  {
236 
237 #ifdef FEATURE_DIRECTORY_STACK
239 #endif
241  return 0;
242  }
243 
244  /*
245  * Set the PROMPT environment variable. If 'param' is NULL or is
246  * an empty string (the user entered "prompt" only), then remove
247  * the environment variable and therefore use the default prompt.
248  * Otherwise, use the new prompt.
249  */
250  if (!SetEnvironmentVariable(_T("PROMPT"),
251  (param && param[0] != _T('\0') ? param : NULL)))
252  {
253  return 1;
254  }
255 
256  return 0;
257 }
258 #endif
259 
260 /* EOF */
#define TRUE
Definition: types.h:120
VOID PrintPrompt(VOID)
Definition: prompt.c:109
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:474
#define STRING_PROMPT_HELP1
Definition: resource.h:155
VOID ConOutChar(TCHAR c)
Definition: console.c:123
#define STRING_PROMPT_HELP2
Definition: resource.h:156
VOID InitPrompt(VOID)
Definition: prompt.c:57
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
#define ConOutPrintf(szStr,...)
Definition: console.h:42
#define STRING_CMD_INFOLINE
Definition: resource.h:88
VOID ConOutResPaging(BOOL StartPaging, UINT resID)
Definition: console.c:182
#define _totupper
Definition: tchar.h:1509
int32_t INT
Definition: typedefs.h:56
CHAR * LPTSTR
Definition: xmlstorage.h:192
VOID PrintInfoLine(VOID)
Definition: prompt.c:72
LPTSTR GetTimeString(VOID)
Definition: locale.c:73
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
#define GetCurrentDirectory
Definition: winbase.h:3639
INT GetDirectoryStackDepth(VOID)
Definition: dirstack.c:98
#define STRING_PROMPT_HELP3
Definition: resource.h:157
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
CHAR * PTSTR
Definition: xmlstorage.h:191
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:544
ULONG X
Definition: bl.h:1340
char TCHAR
Definition: xmlstorage.h:189
#define _T(x)
Definition: vfdio.h:22
static TCHAR DefaultPrompt[]
Definition: prompt.c:52
GLfloat param
Definition: glext.h:5796
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
VOID PrintOSVersion(VOID)
Definition: ver.c:114
LPTSTR GetDateString(VOID)
Definition: locale.c:58
#define FOREGROUND_WHITE
#define SetEnvironmentVariable
Definition: winbase.h:3742
#define STD_OUTPUT_HANDLE
Definition: winbase.h:265
#define FillConsoleOutputCharacter
Definition: wincon.h:776
Definition: bl.h:1338
#define BACKGROUND_BLUE
Definition: wincon.h:43
LPCWSTR szPath
Definition: env.c:35
HANDLE CMD_ModuleHandle
Definition: cmd.c:164
#define GetEnvironmentVariable
Definition: winbase.h:3648
INT cmd_prompt(LPTSTR param)
Definition: prompt.c:231
#define WriteConsoleOutputCharacter
Definition: wincon.h:777
ULONG Y
Definition: bl.h:1341
int _tcsncmp(const _TCHAR *s1, const _TCHAR *s2, size_t n)
Definition: tcsncmp.h:9
#define LoadString
Definition: winuser.h:5794