Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301/* * PROMPT.C - prompt handling. * * * History: * * 14/01/95 (Tim Normal) * started. * * 08/08/95 (Matt Rains) * i have cleaned up the source code. changes now bring this source * into guidelines for recommended programming practice. * * 01/06/96 (Tim Norman) * added day of the week printing (oops, forgot about that!) * * 08/07/96 (Steffan Kaiser) * small changes for speed * * 20-Jul-1998 (John P Price <linux-guru@gcfl.net>) * removed redundant day strings. Use ones defined in date.c. * * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>) * added config.h include * * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>) * moved cmd_prompt from internal.c to here * * 09-Dec-1998 (Eric Kohl) * Added help text ("/?"). * * 14-Dec-1998 (Eric Kohl) * Added "$+" option. * * 09-Jan-1999 (Eric Kohl) * Added "$A", "$C" and "$F" option. * Added locale support. * Fixed "$V" option. * * 20-Jan-1999 (Eric Kohl) * Unicode and redirection safe! * * 24-Jan-1999 (Eric Kohl) * Fixed Win32 environment handling. * * 30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>) * Remove all hardcoded strings in En.rc */#include "precomp.h"
/* The default prompt */static TCHAR DefaultPrompt[] = _T("$P$G");
/* * Initialize prompt support. */VOID InitPrompt(VOID){ TCHAR Buffer[2];
/* * Set the PROMPT environment variable if it doesn't exist already. * You can change the PROMPT environment variable before cmd starts. */ if (GetEnvironmentVariable(_T("PROMPT"), Buffer, _countof(Buffer)) == 0) SetEnvironmentVariable(_T("PROMPT"), DefaultPrompt);}
/* * Checks if information line should be displayed. */BOOL HasInfoLine(VOID){ LPTSTR pr; TCHAR szPrompt[256];
if (GetEnvironmentVariable(_T("PROMPT"), szPrompt, _countof(szPrompt))) { pr = szPrompt; while (*pr) { if (*pr++ != _T('$')) continue; if (!*pr || _totupper(*pr++) != _T('I')) continue;
return TRUE; } }
return FALSE;}
/* * Print an information line on top of the screen. */VOID PrintInfoLine(VOID){#define FOREGROUND_WHITE (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csbi; COORD coPos; DWORD dwWritten;
PTSTR pszInfoLine = NULL; INT iInfoLineLen;
/* Return directly if the output handle is not a console handle */ if (!GetConsoleScreenBufferInfo(hOutput, &csbi)) return;
iInfoLineLen = LoadString(CMD_ModuleHandle, STRING_CMD_INFOLINE, (PTSTR)&pszInfoLine, 0); if (!pszInfoLine || iInfoLineLen == 0) return;
/* Display the localized information line */ coPos.X = 0; coPos.Y = 0; FillConsoleOutputAttribute(hOutput, BACKGROUND_BLUE | FOREGROUND_WHITE, csbi.dwSize.X, coPos, &dwWritten); FillConsoleOutputCharacter(hOutput, _T(' '), csbi.dwSize.X, coPos, &dwWritten);
WriteConsoleOutputCharacter(hOutput, pszInfoLine, iInfoLineLen, coPos, &dwWritten);}
/* * Print the command-line prompt. */VOID PrintPrompt(VOID){ LPTSTR pr, Prompt; TCHAR szPrompt[256]; TCHAR szPath[MAX_PATH];
if (GetEnvironmentVariable(_T("PROMPT"), szPrompt, _countof(szPrompt))) Prompt = szPrompt; else Prompt = DefaultPrompt;
/* * Special pre-handling for $I: If the information line is displayed * on top of the screen, ensure that the prompt won't be hidden below it. */ if (HasInfoLine() && GetCursorY() == 0) ConOutChar(_T('\n'));
/* Parse the prompt string */ for (pr = Prompt; *pr; ++pr) { if (*pr != _T('$')) { ConOutChar(*pr); } else { ++pr; if (!*pr) break; switch (_totupper(*pr)) { case _T('A'): ConOutChar(_T('&')); break;
case _T('B'): ConOutChar(_T('|')); break;
case _T('C'): ConOutChar(_T('(')); break;
case _T('D'): ConOutPrintf(_T("%s"), GetDateString()); break;
case _T('E'): ConOutChar(_T('\x1B')); break;
case _T('F'): ConOutChar(_T(')')); break;
case _T('G'): ConOutChar(_T('>')); break;
case _T('H'): ConOutPuts(_T("\x08 \x08")); break;
case _T('I'): PrintInfoLine(); break;
case _T('L'): ConOutChar(_T('<')); break;
case _T('N'): { GetCurrentDirectory(_countof(szPath), szPath); ConOutChar(szPath[0]); break; }
case _T('P'): { GetCurrentDirectory(_countof(szPath), szPath); ConOutPrintf(_T("%s"), szPath); break; }
case _T('Q'): ConOutChar(_T('=')); break;
case _T('S'): ConOutChar(_T(' ')); break;
case _T('T'): ConOutPrintf(_T("%s"), GetTimeString()); break;
case _T('V'): PrintOSVersion(); break;
case _T('_'): ConOutChar(_T('\n')); break;
case _T('$'): ConOutChar(_T('$')); break;
#ifdef FEATURE_DIRECTORY_STACK case _T('+'): { INT i; for (i = 0; i < GetDirectoryStackDepth(); i++) ConOutChar(_T('+')); break; }#endif } } }}
#ifdef INCLUDE_CMD_PROMPT
INT cmd_prompt(LPTSTR param){ INT retval = 0;
if (!_tcsncmp(param, _T("/?"), 2)) { ConOutResPaging(TRUE, STRING_PROMPT_HELP1);#ifdef FEATURE_DIRECTORY_STACK ConOutResPaging(FALSE, STRING_PROMPT_HELP2);#endif ConOutResPaging(FALSE, STRING_PROMPT_HELP3); return 0; }
/* * Set the PROMPT environment variable. If 'param' is NULL or is * an empty string (the user entered "prompt" only), then remove * the environment variable and therefore use the default prompt. * Otherwise, use the new prompt. */ if (!SetEnvironmentVariable(_T("PROMPT"), (param && param[0] != _T('\0') ? param : NULL))) { retval = 1; }
if (BatType != CMD_TYPE) { if (retval != 0) nErrorLevel = retval; } else { nErrorLevel = retval; }
return retval;}#endif
/* EOF */