From: Eric Kohl Date: Sun, 21 Mar 1999 21:32:45 +0000 (+0000) Subject: changes to make cmd compile (not link) X-Git-Tag: ReactOS-0.0.14~173 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=108fcceee22216b169b448932bb3f86c81b9448e changes to make cmd compile (not link) svn path=/trunk/; revision=326 --- diff --git a/reactos/apps/utils/cmd/alias.c b/reactos/apps/utils/cmd/alias.c index ac0a9149d09..5f2d520bb0f 100644 --- a/reactos/apps/utils/cmd/alias.c +++ b/reactos/apps/utils/cmd/alias.c @@ -26,7 +26,6 @@ * Redirection safe! */ -#define WIN32_LEAN_AND_MEAN #include "config.h" diff --git a/reactos/apps/utils/cmd/attrib.c b/reactos/apps/utils/cmd/attrib.c index 65a2c316731..8316e63ef05 100644 --- a/reactos/apps/utils/cmd/attrib.c +++ b/reactos/apps/utils/cmd/attrib.c @@ -29,8 +29,6 @@ * Added handling of multiple filenames. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_ATTRIB @@ -38,6 +36,7 @@ #include #include #include +#include #include "cmd.h" diff --git a/reactos/apps/utils/cmd/batch.c b/reactos/apps/utils/cmd/batch.c index b1ea5be8903..36df898a38b 100644 --- a/reactos/apps/utils/cmd/batch.c +++ b/reactos/apps/utils/cmd/batch.c @@ -52,14 +52,13 @@ * Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/reactos/apps/utils/cmd/batch.h b/reactos/apps/utils/cmd/batch.h index 11324e38c61..cdc37f2a161 100644 --- a/reactos/apps/utils/cmd/batch.h +++ b/reactos/apps/utils/cmd/batch.h @@ -4,6 +4,9 @@ * */ +#ifndef _BATCH_H_INCLUDED_ +#define _BATCH_H_INCLUDED_ + typedef struct tagBATCHCONTEXT { @@ -37,3 +40,5 @@ LPTSTR BatchParams (LPTSTR, LPTSTR); VOID ExitBatch (LPTSTR); BOOL Batch (LPTSTR, LPTSTR, LPTSTR); LPTSTR ReadBatchLine (LPBOOL); + +#endif /* _BATCH_H_INCLUDED_ */ diff --git a/reactos/apps/utils/cmd/beep.c b/reactos/apps/utils/cmd/beep.c index 9f9834c5775..bafe06c23ff 100644 --- a/reactos/apps/utils/cmd/beep.c +++ b/reactos/apps/utils/cmd/beep.c @@ -21,8 +21,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_BEEP @@ -48,8 +46,11 @@ INT cmd_beep (LPTSTR cmd, LPTSTR param) if (bc == NULL) return 1; #endif - +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif return 0; } diff --git a/reactos/apps/utils/cmd/call.c b/reactos/apps/utils/cmd/call.c index db5dd630217..6777b177c4f 100644 --- a/reactos/apps/utils/cmd/call.c +++ b/reactos/apps/utils/cmd/call.c @@ -25,14 +25,13 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/reactos/apps/utils/cmd/chcp.c b/reactos/apps/utils/cmd/chcp.c index 6831e576906..b72c9123f21 100644 --- a/reactos/apps/utils/cmd/chcp.c +++ b/reactos/apps/utils/cmd/chcp.c @@ -9,8 +9,6 @@ * */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_CHCP @@ -18,6 +16,7 @@ #include #include #include +#include #include "cmd.h" #include "chcp.h" diff --git a/reactos/apps/utils/cmd/cls.c b/reactos/apps/utils/cmd/cls.c index 2e27fcc0246..e6a5991d0ec 100644 --- a/reactos/apps/utils/cmd/cls.c +++ b/reactos/apps/utils/cmd/cls.c @@ -23,8 +23,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_CLS diff --git a/reactos/apps/utils/cmd/cmd.c b/reactos/apps/utils/cmd/cmd.c index 2841c33dec0..966c5d798af 100644 --- a/reactos/apps/utils/cmd/cmd.c +++ b/reactos/apps/utils/cmd/cmd.c @@ -105,14 +105,13 @@ * Replaced spawnl() by CreateProcess(). */ -// #define WIN32_LEAN_AND_MEAN - #include "config.h" #include -// #include +#include #include #include +#include #include "cmd.h" #include "batch.h" @@ -125,7 +124,7 @@ BOOL bExit = FALSE; /* indicates EXIT was typed */ BOOL bCanExit = TRUE; /* indicates if this shell is exitable */ BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */ BOOL bIgnoreEcho = FALSE; /* Ignore 'newline' before 'cls' */ -INT errorlevel = 0; /* Errorlevel of last launched external program */ +INT nErrorLevel = 0; /* Errorlevel of last launched external program */ OSVERSIONINFO osvi; HANDLE hIn; HANDLE hOut; @@ -179,9 +178,7 @@ Execute (LPTSTR first, LPTSTR rest) /* get the PATH environment variable and parse it */ /* search the PATH environment variable for the binary */ - find_which (first, szFullName); - - if (szFullName[0] == _T('\0')) + if (!SearchForExecutable (first, szFullName)) { error_bad_command (); return; @@ -209,7 +206,7 @@ Execute (LPTSTR first, LPTSTR rest) #endif /* build command line for CreateProcess() */ _tcscpy (szFullCmdLine, szFullName); - _tcscat (szFullCmdLine, " "); + _tcscat (szFullCmdLine, _T(" ")); _tcscat (szFullCmdLine, rest); /* fill startup info */ @@ -221,8 +218,10 @@ Execute (LPTSTR first, LPTSTR rest) if (CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &stui, &prci)) { + DWORD dwExitCode; WaitForSingleObject (prci.hProcess, INFINITE); - GetExitCodeProcess (prci.hProcess, &errorlevel); + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; CloseHandle (prci.hThread); CloseHandle (prci.hProcess); } @@ -302,8 +301,8 @@ DoCommand (LPTSTR line) cl = _tcslen (cmdptr->name); if ((cmdptr->flags & CMD_SPECIAL) && - (!_tcsncmp (cmdptr->name, com, cl)) && - (_tcschr (_T("\\.-"), *(com + cl)))) + (!_tcsncmp (cmdptr->name, com, cl)) && + (_tcschr (_T("\\.-"), *(com + cl)))) { /* OK its one of the specials...*/ @@ -688,7 +687,7 @@ ProcessInput (BOOL bFlag) case _T('7'): case _T('8'): case _T('9'): - if (tp = FindArg (*ip - _T('0'))) + if ((tp = FindArg (*ip - _T('0')))) { cp = stpcpy (cp, tp); ip++; @@ -698,12 +697,12 @@ ProcessInput (BOOL bFlag) break; case _T('?'): - cp += wsprintf (cp, _T("%u"), errorlevel); + cp += wsprintf (cp, _T("%u"), nErrorLevel); ip++; break; default: - if (tp = _tcschr (ip, _T('%'))) + if ((tp = _tcschr (ip, _T('%')))) { char evar[512]; *tp = _T('\0'); @@ -846,10 +845,10 @@ static VOID Initialize (int argc, char *argv[]) #endif /* get version information */ - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx (&osvi); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx (&osvi); - InitLocale (); + InitLocale (); /* get default input and output console handles */ hOut = GetStdHandle (STD_OUTPUT_HANDLE); @@ -859,7 +858,7 @@ static VOID Initialize (int argc, char *argv[]) InitLastPath (); #endif - if (argc >= 2) + if (argc >= 2) { if (!_tcsncmp (argv[1], _T("/?"), 2)) { @@ -932,10 +931,13 @@ static VOID Initialize (int argc, char *argv[]) ShowCommands (); /* Set COMSPEC environment variable */ - SetEnvironmentVariable (_T("COMSPEC"), argv[0]); + if (argv) + SetEnvironmentVariable (_T("COMSPEC"), argv[0]); /* add ctrl handler */ +#if 0 SetConsoleCtrlHandler (NULL, TRUE); +#endif } @@ -952,7 +954,9 @@ static VOID Cleanup (VOID) #endif /* remove ctrl handler */ -// SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE); +#if 0 + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE); +#endif } @@ -964,7 +968,9 @@ int main (int argc, char *argv[]) INT nExitCode; AllocConsole (); - SetFileApisToOEM (); +#ifndef __REACTOS__ + SetFileApisToOEM (); +#endif /* check switches on command-line */ Initialize (argc, argv); diff --git a/reactos/apps/utils/cmd/cmd.h b/reactos/apps/utils/cmd/cmd.h index e34fffedb1d..9c35a460955 100644 --- a/reactos/apps/utils/cmd/cmd.h +++ b/reactos/apps/utils/cmd/cmd.h @@ -11,18 +11,37 @@ * Moved error messages in here * * 07/12/98 (Rob Lake) - * Moved more error messages here + * Moved more error messages here. * * 30-Jul-1998 (John P Price ) - * Added compile date to version + * Added compile date to version. + * + * 26-Feb-1999 (Eric Kohl ) + * Introduced a new version string. + * Thanks to Emanuele Aliberti! */ -// #define WIN32_LEAN_AND_MEAN +#ifndef _CMD_H_INCLUDED_ +#define _CMD_H_INCLUDED_ + +#include "config.h" #include -// #include +#include + + +#define CMD_VER "0.1 pre 1" + +#ifdef _MSC_VER +#define SHELLVER "Version " CMD_VER " [" __DATE__ ", msc]" +#else +#ifdef __LCC__ +#define SHELLVER "Version " CMD_VER " [" __DATE__ ", lcc-win32]" +#else +#define SHELLVER "Version " CMD_VER " [" __DATE__ "]" +#endif +#endif -#define SHELLVER "version 0.0.4 [" __DATE__"]" #define BREAK_BATCHFILE 1 #define BREAK_OUTOFBATCH 2 @@ -48,7 +67,7 @@ -/* prototypes for CMD.C */ +/* Prototypes for CMD.C */ extern HANDLE hOut; extern HANDLE hIn; extern WORD wColor; @@ -56,7 +75,7 @@ extern WORD wDefColor; extern BOOL bCtrlBreak; extern BOOL bIgnoreEcho; extern BOOL bExit; -extern int errorlevel; +extern INT nErrorLevel; extern SHORT maxx; extern SHORT maxy; extern OSVERSIONINFO osvi; @@ -70,24 +89,32 @@ int c_brk(void); -/* prototypes for ALIAS.C */ -VOID ExpandAlias (char *, int); -INT cmd_alias (LPTSTR, LPTSTR); +/* Prototypes for ALIAS.C */ +VOID ExpandAlias (LPTSTR, INT); +INT cmd_alias (LPTSTR, LPTSTR); -/* prototyped for ATTRIB.C */ +/* Prototypes for ATTRIB.C */ INT cmd_attrib (LPTSTR, LPTSTR); -/* prototypes for CLS.C */ +/* Prototypes for BEEP.C */ +INT cmd_beep (LPTSTR, LPTSTR); + + +/* Prototypes for CALL.C */ +INT cmd_call (LPTSTR, LPTSTR); + + +/* Prototypes for CLS.C */ INT cmd_cls (LPTSTR, LPTSTR); -/* prototypes for CMDINPUT.C */ +/* Prototypes for CMDINPUT.C */ VOID ReadCommand (LPTSTR, INT); -/* prototypes for CMDTABLE.C */ +/* Prototypes for CMDTABLE.C */ #define CMD_SPECIAL 1 #define CMD_BATCHONLY 2 @@ -99,12 +126,12 @@ typedef struct tagCOMMAND } COMMAND, *LPCOMMAND; -/* prototypes for COLOR.C */ +/* Prototypes for COLOR.C */ VOID SetScreenColor (WORD); INT cmd_color (LPTSTR, LPTSTR); -/* prototypes for CONSOLE.C */ +/* Prototypes for CONSOLE.C */ #ifdef _DEBUG VOID DebugPrintf (LPTSTR, ...); #endif /* _DEBUG */ @@ -122,33 +149,33 @@ VOID ConErrChar (TCHAR); VOID ConErrPuts (LPTSTR); VOID ConErrPrintf (LPTSTR, ...); - -SHORT wherex (VOID); -SHORT wherey (VOID); -VOID goxy (SHORT, SHORT); +SHORT GetCursorX (VOID); +SHORT GetCursorY (VOID); +VOID GetCursorXY (PSHORT, PSHORT); +VOID SetCursorXY (SHORT, SHORT); VOID GetScreenSize (PSHORT, PSHORT); VOID SetCursorType (BOOL, BOOL); -/* prototypes for COPY.C */ +/* Prototypes for COPY.C */ INT cmd_copy (LPTSTR, LPTSTR); -/* prototypes for DATE.C */ +/* Prototypes for DATE.C */ INT cmd_date (LPTSTR, LPTSTR); -/* prototypes for DEL.C */ +/* Prototypes for DEL.C */ INT cmd_del (LPTSTR, LPTSTR); -/* prototypes for DIR.C */ +/* Prototypes for DIR.C */ //int incline(int *line, unsigned flags); INT cmd_dir (LPTSTR, LPTSTR); -/* prototypes for DIRSTACK.C */ +/* Prototypes for DIRSTACK.C */ VOID InitDirectoryStack (VOID); VOID DestroyDirectoryStack (VOID); INT GetDirectoryStackDepth (VOID); @@ -156,6 +183,10 @@ INT cmd_pushd (LPTSTR, LPTSTR); INT cmd_popd (LPTSTR, LPTSTR); +/* Prototypes for ECHO.C */ +INT cmd_echo (LPTSTR, LPTSTR); + + /* Prototypes for ERROR.C */ VOID ErrorMessage (DWORD, LPTSTR, ...); @@ -175,7 +206,7 @@ VOID error_syntax (LPTSTR); VOID msg_pause (VOID); -/* prototypes for FILECOMP.C */ +/* Prototypes for FILECOMP.C */ #ifdef FEATURE_UNIX_FILENAME_COMPLETION VOID CompleteFilename (LPTSTR, INT); INT ShowCompletionMatches (LPTSTR, INT); @@ -184,28 +215,36 @@ INT ShowCompletionMatches (LPTSTR, INT); #endif -/* prototypes for HISTORY.C */ +/* Prototypes for FOR.C */ +INT cmd_for (LPTSTR, LPTSTR); + + +/* Prototypes for GOTO.C */ +INT cmd_goto (LPTSTR, LPTSTR); + + +/* Prototypes for HISTORY.C */ #ifdef FEATURE_HISTORY VOID History (INT, LPTSTR); #endif -/* prototypes for INTERNAL.C */ +/* Prototypes for INTERNAL.C */ VOID InitLastPath (VOID); VOID FreeLastPath (VOID); -int cmd_chdir(char *, char *); -int cmd_mkdir(char *, char *); -int cmd_rmdir(char *, char *); -int internal_exit(char *, char *); -int cmd_rem(char *, char *); -int cmd_showcommands(char *, char *); +INT cmd_chdir (LPTSTR, LPTSTR); +INT cmd_mkdir (LPTSTR, LPTSTR); +INT cmd_rmdir (LPTSTR, LPTSTR); +INT internal_exit (LPTSTR, LPTSTR); +INT cmd_rem (LPTSTR, LPTSTR); +INT cmd_showcommands (LPTSTR, LPTSTR); -/* prototyped for LABEL.C */ +/* Prototypes for LABEL.C */ INT cmd_label (LPTSTR, LPTSTR); -/* prototypes for LOCALE.C */ +/* Prototypes for LOCALE.C */ extern TCHAR cDateSeparator; extern INT nDateFormat; extern TCHAR cTimeSeparator; @@ -226,23 +265,24 @@ VOID freep (LPTSTR *); LPTSTR stpcpy (LPTSTR, LPTSTR); BOOL IsValidPathName (LPCTSTR); BOOL IsValidFileName (LPCTSTR); +BOOL IsValidDirectory (LPCTSTR); BOOL FileGetString (HANDLE, LPTSTR, INT); -/* prototypes for MOVE.C */ +/* Prototypes for MOVE.C */ INT cmd_move (LPTSTR, LPTSTR); -/* prototypes from PATH.C */ +/* Prototypes from PATH.C */ INT cmd_path (LPTSTR, LPTSTR); -/* prototypes from PROMPT.C */ +/* Prototypes from PROMPT.C */ VOID PrintPrompt (VOID); INT cmd_prompt (LPTSTR, LPTSTR); -/* prototypes for REDIR.C */ +/* Prototypes for REDIR.C */ #define INPUT_REDIRECTION 1 #define OUTPUT_REDIRECTION 2 #define OUTPUT_APPEND 4 @@ -251,50 +291,48 @@ INT cmd_prompt (LPTSTR, LPTSTR); INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT); -/* prototypes for REN.C */ +/* Prototypes for REN.C */ INT cmd_rename (LPTSTR, LPTSTR); -/* prototypes for SET.C */ +/* Prototypes for SET.C */ INT cmd_set (LPTSTR, LPTSTR); -/* prototypes for TIME.C */ +/* Prototypes for TIME.C */ INT cmd_time (LPTSTR, LPTSTR); -/* prototypes for TYPE.C */ +/* Prototypes for TITLE.C */ +INT cmd_title (LPTSTR, LPTSTR); + + +/* Prototypes for TYPE.C */ INT cmd_type (LPTSTR, LPTSTR); -/* prototypes for VER.C */ +/* Prototypes for VER.C */ VOID ShortVersion (VOID); INT cmd_ver (LPTSTR, LPTSTR); -/* prototypes for VERIFY.C */ +/* Prototypes for VERIFY.C */ INT cmd_verify (LPTSTR, LPTSTR); -/* prototypes for VOL.C */ +/* Prototypes for VOL.C */ INT cmd_vol (LPTSTR, LPTSTR); -/* prototypes for WHERE.C */ -BOOL find_which (LPCTSTR, LPTSTR); +/* Prototypes for WHERE.C */ +BOOL SearchForExecutable (LPCTSTR, LPTSTR); /* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */ -int cmd_call(char *, char *); -int cmd_echo(char *, char *); -int cmd_for(char *, char *); -int cmd_goto(char *, char *); int cmd_if(char *, char *); int cmd_pause(char *, char *); int cmd_shift(char *, char *); -int cmd_beep(char *, char *); - - +#endif /* _CMD_H_INCLUDED_ */ diff --git a/reactos/apps/utils/cmd/cmdinput.c b/reactos/apps/utils/cmd/cmdinput.c index 6ac5302529d..e2021bbf455 100644 --- a/reactos/apps/utils/cmd/cmdinput.c +++ b/reactos/apps/utils/cmd/cmdinput.c @@ -88,14 +88,12 @@ * Unicode and redirection safe! * * 04-Feb-1999 (Eric Kohl ) - * Fixed input bug. A "line feed" character remined in the keyboard + * Fixed input bug. A "line feed" character remained in the keyboard * input queue when you pressed . This sometimes caused * some very strange effects. * Fixed some command line editing annoyances. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -121,11 +119,15 @@ ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy) { INT count; - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); for (count = 0; count < (INT)_tcslen (str); count++) ConOutChar (_T(' ')); +#ifndef __REACTOS__ _tcsnset (str, _T('\0'), maxlen); - goxy (orgx, orgy); +#else + memset (str, 0, maxlen * sizeof(TCHAR)); +#endif + SetCursorXY (orgx, orgy); } @@ -150,8 +152,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (bEcho) PrintPrompt(); - orgx = wherex (); - orgy = wherey (); + GetCursorXY (&orgx, &orgy); memset (str, 0, maxlen * sizeof (TCHAR)); @@ -171,29 +172,28 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { /* if at end of line */ str[current - 1] = _T('\0'); - if (wherex () != 0) + if (GetCursorX () != 0) { ConOutPrintf ("\b \b"); } else { - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); ConOutChar (_T(' ')); - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); } } else { for (count = current - 1; count < charcount; count++) str[count] = str[count + 1]; - if (wherex () != 0) - goxy ((SHORT)(wherex () - 1), wherey ()); + if (GetCursorX () != 0) + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); else - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); - curx = wherex (); - cury = wherey (); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + GetCursorXY (&curx, &cury); ConOutPrintf (_T("%s "), &str[current - 1]); - goxy (curx, cury); + SetCursorXY (curx, cury); } charcount--; current--; @@ -213,10 +213,9 @@ VOID ReadCommand (LPTSTR str, INT maxlen) for (count = current; count < charcount; count++) str[count] = str[count + 1]; charcount--; - curx = wherex (); - cury = wherey (); + GetCursorXY (&curx, &cury); ConOutPrintf (_T("%s "), &str[current]); - goxy (curx, cury); + SetCursorXY (curx, cury); } break; @@ -224,7 +223,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* goto beginning of string */ if (current != 0) { - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); current = 0; } break; @@ -233,7 +232,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* goto end of string */ if (current != charcount) { - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); current = charcount; } @@ -251,7 +250,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) charcount = _tcslen (str); current = charcount; - goxy(orgx, orgy); + SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) orgy--; @@ -262,15 +261,18 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (ShowCompletionMatches (str, charcount)) { PrintPrompt (); - orgx = wherex (); - orgy = wherey (); + GetCursorXY (&orgx, &orgy); ConOutPrintf (_T("%s"), str); } } } else { +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } #endif #ifdef FEATURE_4NT_FILENAME_COMPLETION @@ -330,15 +332,18 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current > 0) { current--; - if (wherex () == 0) - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + if (GetCursorX () == 0) + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); else - goxy ((SHORT)(wherex () - 1), wherey ()); + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); } else { -// Beep (440, 100); +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } break; @@ -347,41 +352,47 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current != charcount) { current++; - if (wherex () == maxx - 1) - goxy (0, (SHORT)(wherey () + 1)); + if (GetCursorX () == maxx - 1) + SetCursorXY (0, (SHORT)(GetCursorY () + 1)); else - goxy ((SHORT)(wherex () + 1), wherey ()); + SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ()); } break; default: +#ifdef __REACTOS__ + ch = ir.Event.KeyEvent.AsciiChar; + if ((ch >= 32) && (charcount != (maxlen - 2))) + { +#else #ifdef _UNICODE ch = ir.Event.KeyEvent.uChar.UnicodeChar; #else ch = ir.Event.KeyEvent.uChar.AsciiChar; -#endif +#endif /* _UNICODE */ if ((ch >= 32 && ch <= 255) && (charcount != (maxlen - 2))) { +#endif /* __REACTOS__ */ /* insert character into string... */ if (bInsert && current != charcount) { for (count = charcount; count > current; count--) str[count] = str[count - 1]; str[current++] = ch; - if (wherex () == maxx - 1) + if (GetCursorX () == maxx - 1) { curx = 0; - cury = wherey () + 1; + cury = GetCursorY () + 1; } else { - curx = wherex () + 1; - cury = wherey (); + GetCursorXY (&curx, &cury); + curx++; } ConOutPrintf (_T("%s"), &str[current - 1]); if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) cury--; - goxy (curx, cury); + SetCursorXY (curx, cury); charcount++; } else @@ -397,8 +408,11 @@ VOID ReadCommand (LPTSTR str, INT maxlen) #if 0 else { -// Beep (440, 100); +#ifdef __REACTOS__ + Beep (440, 100); +#else MessageBeep (-1); +#endif } #endif break; diff --git a/reactos/apps/utils/cmd/cmdtable.c b/reactos/apps/utils/cmd/cmdtable.c index f2d8339dfce..9ef5c5d146f 100644 --- a/reactos/apps/utils/cmd/cmdtable.c +++ b/reactos/apps/utils/cmd/cmdtable.c @@ -17,8 +17,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -175,6 +173,10 @@ COMMAND cmds[] = {_T("time"), 0, cmd_time}, #endif +#ifdef INCLUDE_CMD_TITLE + {_T("title"), 0, cmd_title}, +#endif + #ifdef INCLUDE_CMD_TYPE {_T("type"), 0, cmd_type}, #endif diff --git a/reactos/apps/utils/cmd/color.c b/reactos/apps/utils/cmd/color.c index f5d086704db..322a0f43928 100644 --- a/reactos/apps/utils/cmd/color.c +++ b/reactos/apps/utils/cmd/color.c @@ -14,8 +14,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_COLOR diff --git a/reactos/apps/utils/cmd/config.h b/reactos/apps/utils/cmd/config.h index 1e214e276e4..9ed6362c77f 100644 --- a/reactos/apps/utils/cmd/config.h +++ b/reactos/apps/utils/cmd/config.h @@ -9,6 +9,15 @@ * */ +#define __REACTOS__ + +#ifndef _CONFIG_H_INCLUDED_ +#define _CONFIG_H_INCLUDED_ + +#ifndef __REACTOS__ +#define WIN32_LEAN_AND_MEAN +#endif /* __REACTOS__ */ + /* JPP 20 Jul 1998 - define DEBUG to add debugging code */ /*#define DEBUG */ @@ -38,22 +47,27 @@ /* Define one of these to select the used locale. */ /* (date and time formats etc.) used in DATE, TIME */ /* DIR and PROMPT. */ -#define LOCALE_WINDOWS /* System locale */ +#ifdef __REACTOS__ +#define LOCALE_DEFAULT +#else +#define LOCALE_WINDOWS /* System locale */ /* #define LOCALE_GERMAN */ /* German locale */ /* #define LOCALE_DEFAULT */ /* United States locale */ - +#endif #define INCLUDE_CMD_ATTRIB -//#define INCLUDE_CMD_BREAK +/*#define INCLUDE_CMD_BREAK*/ #define INCLUDE_CMD_CHCP #define INCLUDE_CMD_CHDIR #define INCLUDE_CMD_CLS #define INCLUDE_CMD_COLOR #define INCLUDE_CMD_COPY -//#define INCLUDE_CMD_CTTY +/*#define INCLUDE_CMD_CTTY*/ #define INCLUDE_CMD_DATE #define INCLUDE_CMD_DEL +#ifndef __REACTOS__ #define INCLUDE_CMD_DIR +#endif #define INCLUDE_CMD_LABEL #define INCLUDE_CMD_MKDIR #define INCLUDE_CMD_MOVE @@ -63,6 +77,7 @@ #define INCLUDE_CMD_RENAME #define INCLUDE_CMD_SET #define INCLUDE_CMD_TIME +#define INCLUDE_CMD_TITLE #define INCLUDE_CMD_TYPE #define INCLUDE_CMD_VER #define INCLUDE_CMD_REM @@ -84,3 +99,6 @@ shift */ + + +#endif /* _CONFIG_H_INCLUDED_ */ diff --git a/reactos/apps/utils/cmd/console.c b/reactos/apps/utils/cmd/console.c index c740f2a2ed7..37d028440d0 100644 --- a/reactos/apps/utils/cmd/console.c +++ b/reactos/apps/utils/cmd/console.c @@ -8,12 +8,13 @@ * started */ - - -#define WIN32_LEAN_AND_MEAN +#include "config.h" #include #include +#include +#include +#include #include "cmd.h" @@ -33,7 +34,7 @@ VOID DebugPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); OutputDebugString (szOut); @@ -134,7 +135,7 @@ VOID ConOutPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), szOut, _tcslen(szOut), &dwWritten, NULL); @@ -165,7 +166,7 @@ VOID ConErrPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); WriteFile (GetStdHandle (STD_ERROR_HANDLE), szOut, _tcslen(szOut), &dwWritten, NULL); @@ -174,10 +175,7 @@ VOID ConErrPrintf (LPTSTR szFormat, ...) -/* - * goxy -- move the cursor on the screen. - */ -VOID goxy (SHORT x, SHORT y) +VOID SetCursorXY (SHORT x, SHORT y) { COORD coPos; @@ -187,7 +185,18 @@ VOID goxy (SHORT x, SHORT y) } -SHORT wherex (VOID) +VOID GetCursorXY (PSHORT x, PSHORT y) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi); + + *x = csbi.dwCursorPosition.X; + *y = csbi.dwCursorPosition.Y; +} + + +SHORT GetCursorX (VOID) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -197,7 +206,7 @@ SHORT wherex (VOID) } -SHORT wherey (VOID) +SHORT GetCursorY (VOID) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -229,45 +238,3 @@ VOID SetCursorType (BOOL bInsert, BOOL bVisible) SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci); } - - - -VOID InitializePageOut (VOID) -{ - sLineCount = 0; - - if (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == FILE_TYPE_CHAR) - { - bPageable = TRUE; - GetScreenSize (NULL, &sMaxLines); - } - else - { - bPageable = FALSE; - } -} - - -VOID TerminatePageOut (VOID) -{ - - -} - - - -int LinePageOut (LPTSTR szLine) -{ - ConOutPuts (szLine); - - if (bPageable) - { - sLineCount++; - if (sLineCount >= sMaxLines) - { - sLineCount = 0; - cmd_pause ("", ""); - } - } - return 0; -} diff --git a/reactos/apps/utils/cmd/copy.c b/reactos/apps/utils/cmd/copy.c index 16b561727d0..eac53d4d4de 100644 --- a/reactos/apps/utils/cmd/copy.c +++ b/reactos/apps/utils/cmd/copy.c @@ -18,8 +18,6 @@ * Replaced CRT io functions by Win32 io functions. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_COPY @@ -51,8 +49,8 @@ typedef struct tagFILES static BOOL DoSwitches (LPTSTR, LPDWORD); -static BOOL AddFile (LPFILES, char *, int *, int *, unsigned *); -static BOOL AddFiles (LPFILES, char *, int *, int *, int *, unsigned *); +static BOOL AddFile (LPFILES, char *, int *, int *, LPDWORD); +static BOOL AddFiles (LPFILES, char *, int *, int *, int *, LPDWORD); static BOOL GetDestination (LPFILES, LPFILES); static INT ParseCommand (LPFILES, int, char **, LPDWORD); static VOID DeleteFileList (LPFILES); @@ -60,7 +58,8 @@ static INT Overwrite (LPTSTR); -static BOOL IsDirectory (LPTSTR fn) +static BOOL +IsDirectory (LPTSTR fn) { if (!IsValidFileName (fn)) return FALSE; @@ -68,7 +67,8 @@ static BOOL IsDirectory (LPTSTR fn) } -static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) +static BOOL +DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) { if (!_tcsicmp (arg, _T("/-Y"))) { @@ -112,7 +112,7 @@ static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) static BOOL -AddFile (LPFILES f, char *arg, int *source, int *dest, unsigned *flags) +AddFile (LPFILES f, char *arg, int *source, int *dest, LPDWORD flags) { if (*dest) { @@ -145,7 +145,7 @@ AddFile (LPFILES f, char *arg, int *source, int *dest, unsigned *flags) static BOOL AddFiles (LPFILES f, char *arg, int *source, int *dest, - int *count, unsigned *flags) + int *count, LPDWORD flags) { char t[128]; int j; @@ -202,7 +202,8 @@ AddFiles (LPFILES f, char *arg, int *source, int *dest, } -static BOOL GetDestination (LPFILES f, LPFILES dest) +static BOOL +GetDestination (LPFILES f, LPFILES dest) { LPFILES p; LPFILES start = f; diff --git a/reactos/apps/utils/cmd/date.c b/reactos/apps/utils/cmd/date.c index e2712366d85..24b271dd0df 100644 --- a/reactos/apps/utils/cmd/date.c +++ b/reactos/apps/utils/cmd/date.c @@ -28,8 +28,6 @@ * Fixed date input bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DATE @@ -52,7 +50,7 @@ static WORD awMonths[2][13] = static VOID PrintDate (VOID) { -#if 0 +#ifdef __REACTOS__ SYSTEMTIME st; GetLocalTime (&st); @@ -75,12 +73,13 @@ PrintDate (VOID) aszDayNames[st.wDayOfWeek], st.wYear, cDateSeparator, st.wMonth, cDateSeparator, st.wDay); break; } -#endif +#else TCHAR szDate[32]; GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, szDate, sizeof (szDate)); ConOutPrintf (_T("Current date is: %s\n"), szDate); +#endif } @@ -195,7 +194,7 @@ ParseDate (LPTSTR s) break; } - /* if only entered two digits: + /* if only entered two digits: */ /* assume 2000's if value less than 80 */ /* assume 1900's if value greater or equal 80 */ if (d.wYear <= 99) diff --git a/reactos/apps/utils/cmd/del.c b/reactos/apps/utils/cmd/del.c index c249670c472..2095ac414be 100644 --- a/reactos/apps/utils/cmd/del.c +++ b/reactos/apps/utils/cmd/del.c @@ -25,8 +25,6 @@ * First working version. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DEL @@ -35,6 +33,7 @@ #include #include #include +#include #include "cmd.h" @@ -97,6 +96,8 @@ static INT Prompt (LPTSTR str) else if (*p == _T('\03')) return PROMPT_BREAK; #endif + + return PROMPT_NO; } diff --git a/reactos/apps/utils/cmd/dir.c b/reactos/apps/utils/cmd/dir.c index c56d8470bb3..19c7c7b83a4 100644 --- a/reactos/apps/utils/cmd/dir.c +++ b/reactos/apps/utils/cmd/dir.c @@ -106,10 +106,11 @@ * * 20-Jan-1999 (Eric Kohl ) * Redirection safe! + * + * 01-Mar-1999 (Eric Kohl ) + * Replaced all runtime io functions by their Win32 counterparts. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DIR @@ -119,15 +120,9 @@ #include #include -#include - #include "cmd.h" -/* useful macro */ -#define MEM_ERR error_out_of_memory(); return 1; - - /* flag definitions */ /* Changed hex to decimal, hex wouldn't work * if > 8, Rob Lake 06/17/98. @@ -148,9 +143,9 @@ enum /* Globally save the # of dirs, files and bytes, * probabaly later pass them to functions. Rob Lake */ -long recurse_dir_cnt; -long recurse_file_cnt; -ULARGE_INTEGER recurse_bytes; +static ULONG recurse_dir_cnt; +static ULONG recurse_file_cnt; +static ULARGE_INTEGER recurse_bytes; /* @@ -161,7 +156,6 @@ ULARGE_INTEGER recurse_bytes; */ static VOID Help (VOID) { -#if 1 ConOutPuts (_T("Displays a list of files and subdirectories in a directory.\n" "\n" "DIR [drive:][path][filename] [/A] [/B] [/L] [/N] [/S] [/P] [/W] [/4]\n" @@ -183,43 +177,18 @@ static VOID Help (VOID) "of the - (hyphen) can turn off defined swtiches. Ex. /-W would\n" "turn off printing in wide format.\n" )); -#endif -#if 0 - InitializePageOut (); - LinePageOut (_T("Displays a list of files and subdirectories in a directory.")); - LinePageOut (_T("")); - LinePageOut (_T("DIR [drive:][path][filename] [/A] [/B] [/L] [/N] [/S] [/P] [/W] [/4]")); - LinePageOut (_T("")); - LinePageOut (_T(" [drive:][path][filename]")); - LinePageOut (_T(" Specifies drive, directory, and/or files to list.")); - LinePageOut (_T("")); - LinePageOut (_T(" /A Displays files with HIDDEN SYSTEM attributes")); - LinePageOut (_T(" default is ARCHIVE and READ ONLY")); - LinePageOut (_T(" /B Uses bare format (no heading information or summary).")); - LinePageOut (_T(" /L Uses lowercase.")); - LinePageOut (_T(" /N New long list format where filenames are on the far right.")); - LinePageOut (_T(" /S Displays files in specified directory and all subdirectories")); - LinePageOut (_T(" /P Pauses after each screen full")); - LinePageOut (_T(" /W Prints in wide format")); - LinePageOut (_T(" /4 Display four digit years.")); - LinePageOut (_T("")); - LinePageOut (_T("Switches may be present in the DIRCMD environment variable. Use")); - LinePageOut (_T("of the - (hyphen) can turn off defined swtiches. Ex. /-W would")); - LinePageOut (_T("turn off printing in wide format.")); - TerminatePageOut (); -#endif } /* - * dir_read_param + * DirReadParam * * read the parameters from the command line */ static BOOL -DirReadParam (char *line, char **param, LPDWORD lpFlags) +DirReadParam (LPTSTR line, LPTSTR *param, LPDWORD lpFlags) { - int slash = 0; + INT slash = 0; if (!line) return TRUE; @@ -340,50 +309,35 @@ DirReadParam (char *line, char **param, LPDWORD lpFlags) /* - * extend_file + * ExtendFilespec * * extend the filespec, possibly adding wildcards */ -void extend_file (char **file) +static VOID +ExtendFilespec (LPTSTR file) { - LPTSTR tmp; - - if (!*file) + if (!file) return; /* if no file spec, change to "*.*" */ - if (!**file) + if (*file == _T('\0')) { - free (*file); - *file = _tcsdup (_T("*.*")); + _tcscpy (file, _T("*.*")); return; } /* if starts with . add * in front */ - if (**file == _T('.')) + if (*file == _T('.')) { - tmp = malloc ((_tcslen (*file) + 2) * sizeof(TCHAR)); - if (tmp) - { - *tmp = _T('*'); - _tcscpy (&tmp[1], *file); - } - free (*file); - *file = tmp; + memmove (&file[1], &file[0], (_tcslen (file) + 1) * sizeof(TCHAR)); + file[0] = _T('*'); return; } /* if no . add .* */ - if (!_tcschr (*file, _T('.'))) + if (!_tcschr (file, _T('.'))) { - tmp = malloc ((_tcslen (*file) + 3) * sizeof(TCHAR)); - if (tmp) - { - _tcscpy (tmp, *file); - _tcscat (tmp, _T(".*")); - } - free (*file); - *file = tmp; + _tcscat (file, _T(".*")); return; } } @@ -394,65 +348,55 @@ void extend_file (char **file) * * split the pathspec into drive, directory, and filespec */ -static int -DirParsePathspec (char *pathspec, int *drive, char **dir, char **file) +static INT +DirParsePathspec (LPTSTR szPathspec, LPTSTR szPath, LPTSTR szFilespec) { - TCHAR orig_dir[MAX_PATH]; + TCHAR szOrigPath[MAX_PATH]; LPTSTR start; LPTSTR tmp; INT i; - INT wildcards = 0; + BOOL bWildcards = FALSE; + GetCurrentDirectory (MAX_PATH, szOrigPath); /* get the drive and change to it */ - if (pathspec[1] == _T(':')) + if (szPathspec[1] == _T(':')) { - *drive = _totupper (pathspec[0]) - _T('@'); - start = pathspec + 2; - _chdrive (*drive); + TCHAR szRootPath[] = _T("A:"); + + szRootPath[0] = szPathspec[0]; + start = szPathspec + 2; + SetCurrentDirectory (szRootPath); } else { - *drive = _getdrive (); - start = pathspec; + start = szPathspec; } - GetCurrentDirectory (MAX_PATH, orig_dir); /* check for wildcards */ - for (i = 0; pathspec[i]; i++) - if (pathspec[i] == _T('*') || pathspec[i] == _T('?')) - wildcards = 1; + for (i = 0; szPathspec[i]; i++) + { + if (szPathspec[i] == _T('*') || szPathspec[i] == _T('?')) + bWildcards = TRUE; + } /* check if this spec is a directory */ - if (!wildcards) + if (!bWildcards) { - if (chdir(pathspec) == 0) + if (SetCurrentDirectory (szPathspec)) { - *file = _tcsdup (_T("*.*")); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, _T("*.*")); - tmp = getcwd (NULL, MAX_PATH); - if (!tmp) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - chdir (orig_dir); - MEM_ERR + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; } - *dir = _tcsdup (&tmp[2]); - free (tmp); - if (!*dir) - { - free (*file); - chdir (orig_dir); - MEM_ERR - } - - chdir (orig_dir); + SetCurrentDirectory (szOrigPath); return 0; } } @@ -463,69 +407,50 @@ DirParsePathspec (char *pathspec, int *drive, char **dir, char **file) /* if no path is specified */ if (!tmp) { - *file = _tcsdup (start); - extend_file (file); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, start); + ExtendFilespec (szFilespec); - tmp = getcwd (NULL, _MAX_PATH); - if (!tmp) - { - free (*file); - chdir (orig_dir); - MEM_ERR - } - *dir = _tcsdup (&tmp[2]); - free(tmp); - if (!*dir) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - chdir (orig_dir); - MEM_ERR + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; } + SetCurrentDirectory (szOrigPath); return 0; } /* get the filename */ - *file = _tcsdup (tmp + 1); - extend_file (file); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, tmp+1); + ExtendFilespec (szFilespec); - *tmp = 0; + *tmp = _T('\0'); /* change to this directory and get its full name */ - if (chdir (start) < 0) + if (!SetCurrentDirectory (start)) { - error_path_not_found (); *tmp = _T('\\'); - free (*file); - chdir (orig_dir); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); return 1; } - tmp = getcwd (NULL, _MAX_PATH); - if (!tmp) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - MEM_ERR - } - *dir = _tcsdup (&tmp[2]); - free(tmp); - if (!*dir) - { - free(*file); - MEM_ERR + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory (); + return 1; } *tmp = _T('\\'); - chdir(orig_dir); + SetCurrentDirectory (szOrigPath); + return 0; } @@ -550,16 +475,16 @@ Pause (VOID) * increment our line if paginating, display message at end of screen */ static INT -incline (int *line, DWORD dwFlags) +IncLine (LPINT pLine, DWORD dwFlags) { if (!(dwFlags & DIR_PAGE)) return 0; - (*line)++; + (*pLine)++; - if (*line >= (int)maxy - 2) + if (*pLine >= (int)maxy - 2) { - *line = 0; + *pLine = 0; return Pause (); } @@ -573,7 +498,7 @@ incline (int *line, DWORD dwFlags) * print the header for the dir command */ static BOOL -PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) +PrintDirectoryHeader (LPTSTR szPath, LPINT pLine, DWORD dwFlags) { TCHAR szRootName[] = _T("A:\\"); TCHAR szVolName[80]; @@ -583,7 +508,7 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) return TRUE; /* get the media ID of the drive */ - szRootName[0] = drive + _T('@'); + szRootName[0] = szPath[0]; if (!GetVolumeInformation (szRootName, szVolName, 80, &dwSerialNr, NULL, NULL, NULL, 0)) { @@ -599,13 +524,13 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) else ConOutPrintf (_T(" has no label\n")); - if (incline (line, dwFlags) != 0) + if (IncLine (pLine, dwFlags)) return FALSE; /* print the volume serial number if the return was successful */ ConOutPrintf (_T(" Volume Serial Number is %04X-%04X\n"), HIWORD(dwSerialNr), LOWORD(dwSerialNr)); - if (incline (line, dwFlags) != 0) + if (IncLine (pLine, dwFlags)) return FALSE; return TRUE; @@ -618,7 +543,7 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) * insert commas into a number */ static INT -ConvertLong (LONG num, LPTSTR des, INT len) +ConvertULong (ULONG num, LPTSTR des, INT len) { TCHAR temp[32]; INT c = 0; @@ -690,16 +615,17 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) { case 0: /* mmddyy */ default: - ConOutPrintf ("%.2d%c%.2d%c%d", dt->wMonth, cDateSeparator, dt->wDay, cDateSeparator, wYear); + ConOutPrintf (_T("%.2d%c%.2d%c%d"), + dt->wMonth, cDateSeparator, dt->wDay, cDateSeparator, wYear); break; case 1: /* ddmmyy */ - ConOutPrintf ("%.2d%c%.2d%c%d", + ConOutPrintf (_T("%.2d%c%.2d%c%d"), dt->wDay, cDateSeparator, dt->wMonth, cDateSeparator, wYear); break; case 2: /* yymmdd */ - ConOutPrintf ("%d%c%.2d%c%.2d", + ConOutPrintf (_T("%d%c%.2d%c%.2d"), wYear, cDateSeparator, dt->wMonth, cDateSeparator, dt->wDay); break; } @@ -708,14 +634,14 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) { case 0: /* 12 hour format */ default: - ConOutPrintf (" %2d%c%.2u%c", + ConOutPrintf (_T(" %2d%c%.2u%c"), (dt->wHour == 0 ? 12 : (dt->wHour <= 12 ? dt->wHour : dt->wHour - 12)), cTimeSeparator, dt->wMinute, (dt->wHour <= 11 ? 'a' : 'p')); break; case 1: /* 24 hour format */ - ConOutPrintf (" %2d%c%.2u", + ConOutPrintf (_T(" %2d%c%.2u"), dt->wHour, cTimeSeparator, dt->wMinute); break; } @@ -729,33 +655,33 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) * */ static INT -PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, - DWORD flags, int *line) +PrintSummary (LPTSTR szPath, ULONG ulFiles, ULONG ulDirs, ULARGE_INTEGER bytes, + LPINT pLine, DWORD dwFlags) { TCHAR buffer[64]; - if (flags & DIR_BARE) + if (dwFlags & DIR_BARE) return 0; /* print number of files and bytes */ - ConvertLong (files, buffer, sizeof(buffer)); + ConvertULong (ulFiles, buffer, sizeof(buffer)); ConOutPrintf (_T(" %6s File%c"), - buffer, files == 1 ? _T(' ') : _T('s')); + buffer, ulFiles == 1 ? _T(' ') : _T('s')); ConvertULargeInteger (bytes, buffer, sizeof(buffer)); ConOutPrintf (_T(" %15s byte%c\n"), buffer, bytes.QuadPart == 1 ? _T(' ') : _T('s')); - if (incline (line, flags) != 0) + if (IncLine (pLine, dwFlags)) return 1; /* print number of dirs and bytes free */ - ConvertLong (dirs, buffer, sizeof(buffer)); + ConvertULong (ulDirs, buffer, sizeof(buffer)); ConOutPrintf (_T(" %6s Dir%c"), - buffer, files == 1 ? _T(' ') : _T('s')); + buffer, ulDirs == 1 ? _T(' ') : _T('s')); - if (!(flags & DIR_RECURSE)) + if (!(dwFlags & DIR_RECURSE)) { ULARGE_INTEGER uliFree; TCHAR szRoot[] = _T("A:\\"); @@ -764,14 +690,14 @@ PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, DWORD dwFreeCl; DWORD dwTotCl; - szRoot[0] = drive + _T('@'); + szRoot[0] = szPath[0]; GetDiskFreeSpace (szRoot, &dwSecPerCl, &dwBytPerSec, &dwFreeCl, &dwTotCl); - uliFree.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; + uliFree.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; ConvertULargeInteger (uliFree, buffer, sizeof(buffer)); ConOutPrintf (_T(" %15s bytes free\n"), buffer); } - if (incline (line, flags) != 0) + if (IncLine (pLine, dwFlags)) return 1; return 0; @@ -783,39 +709,37 @@ PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, * * list the files in the directory */ -static int -dir_list (int drive, char *directory, char *filespec, int *line, - DWORD flags) +static INT +DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) { - char pathspec[_MAX_PATH], - *ext, - buffer[32]; - WIN32_FIND_DATA file; - ULARGE_INTEGER bytecount; - long filecount = 0, - dircount = 0; - int count; - FILETIME ft; - SYSTEMTIME dt; - HANDLE hFile; - - bytecount.QuadPart = 0; - - if (directory[strlen(directory) - 1] == '\\') - wsprintf(pathspec, "%c:%s%s", drive + '@', directory, filespec); - else - wsprintf(pathspec, "%c:%s\\%s", drive + '@', directory, filespec); - - hFile = FindFirstFile (pathspec, &file); + TCHAR szFullPath[MAX_PATH]; + WIN32_FIND_DATA file; + ULARGE_INTEGER bytecount; + FILETIME ft; + SYSTEMTIME dt; + HANDLE hFile; + TCHAR buffer[32]; + ULONG filecount = 0; + ULONG dircount = 0; + INT count; + + bytecount.QuadPart = 0; + + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscat (szFullPath, szFilespec); + + hFile = FindFirstFile (szFullPath, &file); if (hFile == INVALID_HANDLE_VALUE) { /* Don't want to print anything if scanning recursively * for a file. RL */ - if ((flags & DIR_RECURSE) == 0) + if ((dwFlags & DIR_RECURSE) == 0) { - error_file_not_found(); - incline(line, flags); + error_file_not_found (); + IncLine (pLine, dwFlags); FindClose (hFile); return 1; } @@ -823,205 +747,212 @@ dir_list (int drive, char *directory, char *filespec, int *line, return 0; } - /* moved down here because if we are recursively searching and - * don't find any files, we don't want just to print - * Directory of C:\SOMEDIR - * with nothing else - * Rob Lake 06/13/98 - */ - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf (" Directory of %c:%s\n", drive + '@', directory); - if (incline(line, flags) != 0) - return 1; - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - } - - /* For counting columns of output */ - count = 0; - - do - { - /* next file, if user doesn't want all files */ - if (!(flags & DIR_ALL) && - ((file.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || - (file.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))) - continue; - - /* begin Rob Lake */ - if (flags & DIR_LWR) + /* moved down here because if we are recursively searching and + * don't find any files, we don't want just to print + * Directory of C:\SOMEDIR + * with nothing else + * Rob Lake 06/13/98 + */ + if ((dwFlags & DIR_BARE) == 0) { - strlwr(file.cAlternateFileName); + ConOutPrintf (_T(" Directory of %s\n"), szPath); + if (IncLine (pLine, dwFlags)) + return 1; + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; } - if (flags & DIR_WIDE && (flags & DIR_BARE) == 0) - { - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (file.cAlternateFileName[0] == '\0') - wsprintf (buffer, _T("[%s]"), file.cFileName); - else - wsprintf (buffer, _T("[%s]"), file.cAlternateFileName); - dircount++; - } - else - { - if (file.cAlternateFileName[0] == '\0') - wsprintf (buffer, _T("%s"), file.cFileName); - else - wsprintf (buffer, _T("%s"), file.cAlternateFileName); - filecount++; - } - ConOutPrintf (_T("%-15s"), buffer); - count++; - if (count == 5) - { - /* output 5 columns */ - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - count = 0; - } - - /* FIXME: this is buggy - now overflow check */ - bytecount.LowPart += file.nFileSizeLow; - bytecount.HighPart += file.nFileSizeHigh; - - /* next block 06/17/98 */ - } - else if (flags & DIR_BARE) - { - if (strcmp(file.cFileName, ".") == 0 || - strcmp(file.cFileName, "..") == 0) - continue; - - if (flags & DIR_RECURSE) - { - TCHAR dir[MAX_PATH]; - wsprintf (dir, _T("%c:%s\\"), drive + _T('@'), directory); - if (flags & DIR_LWR) - strlwr(dir); - ConOutPrintf (dir); - } - ConOutPrintf (_T("%-13s\n"), file.cFileName); - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - dircount++; - else - filecount++; - if (incline(line, flags) != 0) - return 1; - - /* FIXME: this is buggy - no overflow check */ - bytecount.LowPart += file.nFileSizeLow; - bytecount.HighPart += file.nFileSizeHigh; - } - else - { - /* end Rob Lake */ - if (flags & DIR_NEW) - { - /* print file date and time */ - if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) - { - FileTimeToSystemTime (&ft, &dt); - PrintFileDateTime (&dt, flags); - } + /* For counting columns of output */ + count = 0; - /* print file size */ - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + do + { + /* next file, if user doesn't want all files */ + if (!(dwFlags & DIR_ALL) && + ((file.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || + (file.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))) + continue; + + if (dwFlags & DIR_LWR) { - ConOutPrintf (" "); - dircount++; + _tcslwr (file.cAlternateFileName); } - else + + if (dwFlags & DIR_WIDE && (dwFlags & DIR_BARE) == 0) { ULARGE_INTEGER uliSize; - uliSize.LowPart = file.nFileSizeLow; - uliSize.HighPart = file.nFileSizeHigh; + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (file.cAlternateFileName[0] == _T('\0')) + wsprintf (buffer, _T("[%s]"), file.cFileName); + else + wsprintf (buffer, _T("[%s]"), file.cAlternateFileName); + dircount++; + } + else + { + if (file.cAlternateFileName[0] == _T('\0')) + wsprintf (buffer, _T("%s"), file.cFileName); + else + wsprintf (buffer, _T("%s"), file.cAlternateFileName); + filecount++; + } - ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); - ConOutPrintf (_T(" %20s"), buffer); + ConOutPrintf (_T("%-15s"), buffer); + count++; + if (count == 5) + { + /* output 5 columns */ + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; + count = 0; + } + uliSize.u.LowPart += file.nFileSizeLow; + uliSize.u.HighPart += file.nFileSizeHigh; bytecount.QuadPart += uliSize.QuadPart; - filecount++; } - - /* print long filename */ - ConOutPrintf (" %s\n", file.cFileName); - } - else - { - if (file.cFileName[0] == '.') - ConOutPrintf ("%-13s ", file.cFileName); - else if (file.cAlternateFileName[0] == '\0') + else if (dwFlags & DIR_BARE) { - char szShortName[13]; - strncpy (szShortName, file.cFileName, 13); - ext = strchr(szShortName, '.'); - if (!ext) - ext = ""; - else - *ext++ = 0; - ConOutPrintf ("%-8s %-3s ", szShortName, ext); - } - else - { - ext = strchr(file.cAlternateFileName, '.'); - if (!ext) - ext = ""; - else - *ext++ = 0; - ConOutPrintf ("%-8s %-3s ", file.cAlternateFileName, ext); - } + ULARGE_INTEGER uliSize; - /* print file size */ - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - ConOutPrintf ("%-14s", ""); - dircount++; + if (_tcscmp (file.cFileName, _T(".")) == 0 || + _tcscmp (file.cFileName, _T("..")) == 0) + continue; + + if (dwFlags & DIR_RECURSE) + { + TCHAR dir[MAX_PATH]; + + _tcscpy (dir, szPath); + _tcscat (dir, _T("\\")); + if (dwFlags & DIR_LWR) + _tcslwr (dir); + ConOutPrintf (dir); + } + + ConOutPrintf (_T("%-13s\n"), file.cFileName); + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + dircount++; + else + filecount++; + if (IncLine (pLine, dwFlags)) + return 1; + + uliSize.u.LowPart += file.nFileSizeLow; + uliSize.u.HighPart += file.nFileSizeHigh; + bytecount.QuadPart += uliSize.QuadPart; } else { - ULARGE_INTEGER uliSize; + if (dwFlags & DIR_NEW) + { + /* print file date and time */ + if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) + { + FileTimeToSystemTime (&ft, &dt); + PrintFileDateTime (&dt, dwFlags); + } - uliSize.LowPart = file.nFileSizeLow; - uliSize.HighPart = file.nFileSizeHigh; + /* print file size */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + ConOutPrintf (_T(" ")); + dircount++; + } + else + { + ULARGE_INTEGER uliSize; - ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); - ConOutPrintf (_T(" %10s "), buffer); + uliSize.u.LowPart = file.nFileSizeLow; + uliSize.u.HighPart = file.nFileSizeHigh; - bytecount.QuadPart += uliSize.QuadPart; - filecount++; - } + ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); + ConOutPrintf (_T(" %20s"), buffer); - /* print file date and time */ - if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) - { - FileTimeToSystemTime (&ft, &dt); - PrintFileDateTime (&dt, flags); - } + bytecount.QuadPart += uliSize.QuadPart; + filecount++; + } + + /* print long filename */ + ConOutPrintf (_T(" %s\n"), file.cFileName); + } + else + { + if (file.cFileName[0] == _T('.')) + ConOutPrintf (_T("%-13s "), file.cFileName); + else if (file.cAlternateFileName[0] == _T('\0')) + { + TCHAR szShortName[13]; + LPTSTR ext; + + _tcsncpy (szShortName, file.cFileName, 13); + ext = _tcschr (szShortName, _T('.')); + if (!ext) + ext = _T(""); + else + *ext++ = _T('\0'); + ConOutPrintf (_T("%-8s %-3s "), szShortName, ext); + } + else + { + LPTSTR ext; + + ext = _tcschr (file.cAlternateFileName, _T('.')); + if (!ext) + ext = _T(""); + else + *ext++ = _T('\0'); + ConOutPrintf (_T("%-8s %-3s "), file.cAlternateFileName, ext); + } + + /* print file size */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + ConOutPrintf ("%-14s", ""); + dircount++; + } + else + { + ULARGE_INTEGER uliSize; - /* print long filename */ - ConOutPrintf (" %s\n", file.cFileName); - } + uliSize.u.LowPart = file.nFileSizeLow; + uliSize.u.HighPart = file.nFileSizeHigh; - if (incline(line, flags) != 0) - return 1; - } - } - while (FindNextFile (hFile, &file)); + ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); + ConOutPrintf (_T(" %10s "), buffer); - FindClose (hFile); + bytecount.QuadPart += uliSize.QuadPart; + filecount++; + } + + /* print file date and time */ + if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) + { + FileTimeToSystemTime (&ft, &dt); + PrintFileDateTime (&dt, dwFlags); + } + + /* print long filename */ + ConOutPrintf (" %s\n", file.cFileName); + } + + if (IncLine (pLine, dwFlags)) + return 1; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); /* Rob Lake, need to make clean output */ /* JPP 07/08/1998 added check for count != 0 */ - if ((flags & DIR_WIDE) && (count != 0)) + if ((dwFlags & DIR_WIDE) && (count != 0)) { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) return 1; } @@ -1031,9 +962,8 @@ dir_list (int drive, char *directory, char *filespec, int *line, recurse_file_cnt += filecount; recurse_bytes.QuadPart += bytecount.QuadPart; - /* The code that was here is now in print_summary */ - if (PrintSummary (drive, filecount, dircount, - bytecount, flags, line) != 0) + /* print_summary */ + if (PrintSummary (szPath, filecount, dircount, bytecount, pLine, dwFlags)) return 1; } else @@ -1049,104 +979,102 @@ dir_list (int drive, char *directory, char *filespec, int *line, /* * _Read_Dir: Actual function that does recursive listing */ -static int -Read_Dir (int drive, char *parent, char *filespec, int *lines, - DWORD flags) +static INT +DirRead (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) { - char fullpath[_MAX_PATH]; - WIN32_FIND_DATA file; - HANDLE hFile; - - strcpy (fullpath, parent); - strcat (fullpath, "\\"); - strcat (fullpath, filespec); - - hFile = FindFirstFile (fullpath, &file); - if (hFile == INVALID_HANDLE_VALUE) - return 1; - - do - { - /* don't list "." and ".." */ - if (strcmp (file.cFileName, ".") == 0 || - strcmp (file.cFileName, "..") == 0) - continue; - - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (dir_list(drive, file.cFileName, filespec, lines, flags) != 0) - { - FindClose (hFile); - return 1; - } - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf ("\n"); - if (incline(lines, flags) != 0) - return 1; - } - if (Read_Dir(drive, file.cFileName, filespec, lines, flags) == 1) - { - FindClose (hFile); - return 1; - } - } - } - while (FindNextFile (hFile, &file)); - - if (!FindClose (hFile)) - return 1; - - return 0; + TCHAR szFullPath[MAX_PATH]; + WIN32_FIND_DATA file; + HANDLE hFile; + + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen (szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscat (szFullPath, szFilespec); + + hFile = FindFirstFile (szFullPath, &file); + if (hFile == INVALID_HANDLE_VALUE) + return 1; + + do + { + /* don't list "." and ".." */ + if (_tcscmp (file.cFileName, _T(".")) == 0 || + _tcscmp (file.cFileName, _T("..")) == 0) + continue; + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (DirList (file.cFileName, szFilespec, pLine, dwFlags)) + { + FindClose (hFile); + return 1; + } + + if ((dwFlags & DIR_BARE) == 0) + { + ConOutPrintf ("\n"); + if (IncLine (pLine, dwFlags) != 0) + return 1; + } + + if (DirRead (file.cFileName, szFilespec, pLine, dwFlags) == 1) + { + FindClose (hFile); + return 1; + } + } + } + while (FindNextFile (hFile, &file)); + + if (!FindClose (hFile)) + return 1; + + return 0; } /* * do_recurse: Sets up for recursive directory listing */ -static int -do_recurse(int drive, char *directory, char *filespec, - int *line, DWORD flags) +static INT +DirRecurse (LPTSTR szPath, LPTSTR szSpec, LPINT pLine, DWORD dwFlags) { - char cur_dir[_MAX_DIR]; + recurse_dir_cnt = 0L; + recurse_file_cnt = 0L; + recurse_bytes.QuadPart = 0; - recurse_dir_cnt = recurse_file_cnt = 0L; - recurse_bytes.QuadPart = 0; + if (!PrintDirectoryHeader (szPath, pLine, dwFlags)) + return 1; - _chdrive (drive); - getcwd(cur_dir, sizeof(cur_dir)); + if (DirList (szPath, szSpec, pLine, dwFlags)) + return 1; - if (chdir(directory) == -1) - return 1; + if ((dwFlags & DIR_BARE) == 0) + { + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; + } - if (!PrintDirectoryHeader (drive, line, flags)) + if (DirRead (szPath, szSpec, pLine, dwFlags)) return 1; - if (dir_list(drive, directory, filespec, line, flags) != 0) - return 1; - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - } - if (Read_Dir(drive, directory, filespec, line, flags) != 0) - return 1; - if ((flags & DIR_BARE) == 0) - ConOutPrintf ("Total files listed:\n"); - flags &= ~DIR_RECURSE; - - if (PrintSummary (drive, recurse_file_cnt, - recurse_dir_cnt, recurse_bytes, flags, line) != 0) + if ((dwFlags & DIR_BARE) == 0) + ConOutPrintf (_T("Total files listed:\n")); + + dwFlags &= ~DIR_RECURSE; + + if (PrintSummary (szPath, recurse_file_cnt, + recurse_dir_cnt, recurse_bytes, pLine, dwFlags)) return 1; - if ((flags & DIR_BARE) == 0) + if ((dwFlags & DIR_BARE) == 0) { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) return 1; } - chdir(cur_dir); + return 0; } @@ -1158,15 +1086,12 @@ do_recurse(int drive, char *directory, char *filespec, */ INT cmd_dir (LPTSTR first, LPTSTR rest) { - DWORD dwFlags = DIR_NEW | DIR_FOUR; - char *param; - TCHAR dircmd[256]; - int line = 0; - int drive, - orig_drive; - char *directory, - *filespec, - orig_dir[_MAX_DIR]; + DWORD dwFlags = DIR_NEW | DIR_FOUR; + TCHAR dircmd[256]; + TCHAR szPath[MAX_PATH]; + TCHAR szFilespec[MAX_PATH]; + LPTSTR param; + INT nLine = 0; /* read the parameters from the DIRCMD environment variable */ @@ -1184,39 +1109,26 @@ INT cmd_dir (LPTSTR first, LPTSTR rest) if (!param) param = "."; - if (strchr(param, '/')) - param = strtok (param, "/"); - - /* save the current directory info */ - orig_drive = _getdrive (); - getcwd(orig_dir, sizeof(orig_dir)); + if (_tcschr (param, _T('/'))) + param = _tcstok (param, _T("/")); /* parse the directory info */ - if (DirParsePathspec (param, &drive, &directory, &filespec) != 0) - { - _chdrive (orig_drive); - chdir(orig_dir); + if (DirParsePathspec (param, szPath, szFilespec)) return 1; - } if (dwFlags & DIR_RECURSE) { - incline(&line, dwFlags); - if (do_recurse (drive, directory, filespec, &line, dwFlags) != 0) + IncLine (&nLine, dwFlags); + if (DirRecurse (szPath, szFilespec, &nLine, dwFlags)) return 1; - _chdrive (orig_drive); - chdir (orig_dir); return 0; } /* print the header */ - if (!PrintDirectoryHeader (drive, &line, dwFlags)) + if (!PrintDirectoryHeader (szPath, &nLine, dwFlags)) return 1; - chdir (orig_dir); - _chdrive (orig_drive); - - if (dir_list (drive, directory, filespec, &line, dwFlags) != 0) + if (DirList (szPath, szFilespec, &nLine, dwFlags)) return 1; return 0; diff --git a/reactos/apps/utils/cmd/dirstack.c b/reactos/apps/utils/cmd/dirstack.c index 5c00c21d609..04c1cf97c15 100644 --- a/reactos/apps/utils/cmd/dirstack.c +++ b/reactos/apps/utils/cmd/dirstack.c @@ -11,8 +11,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_DIRECTORY_STACK diff --git a/reactos/apps/utils/cmd/echo.c b/reactos/apps/utils/cmd/echo.c index 9d85c5ffe24..0e0f51293e6 100644 --- a/reactos/apps/utils/cmd/echo.c +++ b/reactos/apps/utils/cmd/echo.c @@ -20,8 +20,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/reactos/apps/utils/cmd/error.c b/reactos/apps/utils/cmd/error.c index d89fe3132c6..2887cb8c8f2 100644 --- a/reactos/apps/utils/cmd/error.c +++ b/reactos/apps/utils/cmd/error.c @@ -17,12 +17,11 @@ * Use FormatMessage() for error reports. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include +#include #include #include "cmd.h" @@ -53,10 +52,10 @@ VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) return; va_start (arg_ptr, szFormat); - wvsprintf (szMessage, szFormat, arg_ptr); + _vstprintf (szMessage, szFormat, arg_ptr); va_end (arg_ptr); -#if 1 +#ifndef __REACTOS__ if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), @@ -69,7 +68,6 @@ VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) else { ConErrPrintf (_T("Unknown error! Error code: 0x%lx\n"), dwErrorCode); -// ConErrPrintf (_T("No error message available!\n")); return; } diff --git a/reactos/apps/utils/cmd/filecomp.c b/reactos/apps/utils/cmd/filecomp.c index 2f9d53823b9..deb43818c70 100644 --- a/reactos/apps/utils/cmd/filecomp.c +++ b/reactos/apps/utils/cmd/filecomp.c @@ -13,14 +13,13 @@ * Cleanup. Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" @@ -31,7 +30,6 @@ VOID CompleteFilename (LPTSTR str, INT charcount) { WIN32_FIND_DATA file; HANDLE hFile; - INT curplace = 0; INT start; INT count; @@ -70,11 +68,11 @@ VOID CompleteFilename (LPTSTR str, INT charcount) _tcscpy (path, &str[start]); /* look for a '.' in the filename */ - for (count = _tcslen (directory); path[count] != 0; count++) + for (count = _tcslen (directory); path[count] != _T('\0'); count++) { if (path[count] == _T('.')) { - found_dot = 1; + found_dot = TRUE; break; } } @@ -94,7 +92,8 @@ VOID CompleteFilename (LPTSTR str, INT charcount) do { /* ignore "." and ".." */ - if (file.cFileName[0] == _T('.')) + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) continue; _tcscpy (fname, file.cFileName); @@ -129,12 +128,20 @@ VOID CompleteFilename (LPTSTR str, INT charcount) _tcscat (&str[start], maxmatch); if (!perfectmatch) +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } else { /* no match found */ +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } } @@ -173,7 +180,8 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) /* extract directory from word */ _tcscpy (directory, &str[start]); curplace = _tcslen (directory) - 1; - while (curplace >= 0 && directory[curplace] != _T('\\') && + while (curplace >= 0 && + directory[curplace] != _T('\\') && directory[curplace] != _T(':')) { directory[curplace] = 0; @@ -183,7 +191,7 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) _tcscpy (path, &str[start]); /* look for a . in the filename */ - for (count = _tcslen (directory); path[count] != 0; count++) + for (count = _tcslen (directory); path[count] != _T('\0'); count++) { if (path[count] == _T('.')) { @@ -191,6 +199,7 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) break; } } + if (found_dot) _tcscat (path, _T("*")); else @@ -208,7 +217,8 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) do { /* ignore . and .. */ - if (file.cFileName[0] == _T('.')) + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) continue; if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) @@ -233,7 +243,11 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) else { /* no match found */ +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif return FALSE; } @@ -250,4 +264,4 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) // VOID RemoveFilenameMatchList (VOID) -#endif \ No newline at end of file +#endif diff --git a/reactos/apps/utils/cmd/for.c b/reactos/apps/utils/cmd/for.c index 7ccb445252e..c614893c777 100644 --- a/reactos/apps/utils/cmd/for.c +++ b/reactos/apps/utils/cmd/for.c @@ -20,14 +20,13 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/reactos/apps/utils/cmd/goto.c b/reactos/apps/utils/cmd/goto.c index def1cbf57f2..c80a9e4047a 100644 --- a/reactos/apps/utils/cmd/goto.c +++ b/reactos/apps/utils/cmd/goto.c @@ -23,13 +23,12 @@ * Added help text ("/?"). */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/reactos/apps/utils/cmd/history.c b/reactos/apps/utils/cmd/history.c index 2e48d597882..cae614013ee 100644 --- a/reactos/apps/utils/cmd/history.c +++ b/reactos/apps/utils/cmd/history.c @@ -19,8 +19,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_HISTORY diff --git a/reactos/apps/utils/cmd/if.c b/reactos/apps/utils/cmd/if.c index 64744bca5d6..5ab4d737b40 100644 --- a/reactos/apps/utils/cmd/if.c +++ b/reactos/apps/utils/cmd/if.c @@ -20,13 +20,12 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" #include "batch.h" @@ -98,7 +97,7 @@ INT cmd_if (LPTSTR cmd, LPTSTR param) while (_istdigit (*pp)) n = n * 10 + (*pp++ - _T('0')); - x_flag ^= (errorlevel < n) ? 0 : X_EXEC; + x_flag ^= (nErrorLevel < n) ? 0 : X_EXEC; x_flag |= X_EMPTY; /* Syntax error if comd empty */ } diff --git a/reactos/apps/utils/cmd/internal.c b/reactos/apps/utils/cmd/internal.c index b2019f7d056..15913c24eeb 100644 --- a/reactos/apps/utils/cmd/internal.c +++ b/reactos/apps/utils/cmd/internal.c @@ -115,16 +115,19 @@ * * 30-Jan-1999 (Eric Kohl ) * Added "cd -" feature. Changes to the previous directory. + * + * 15-Mar-1999 (Eric Kohl ) + * Fixed bug in "cd -" feature. If the previous directory was a root + * directory, it was ignored. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" @@ -252,7 +255,7 @@ INT cmd_chdir (LPTSTR cmd, LPTSTR param) } /* remove trailing \ if any, but ONLY if dir is not the root dir */ - if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\\')) + if (_tcslen (dir) > 3 && dir[_tcslen (dir) - 1] == _T('\\')) dir[_tcslen(dir) - 1] = _T('\0'); diff --git a/reactos/apps/utils/cmd/label.c b/reactos/apps/utils/cmd/label.c index 285421954dd..6c065389192 100644 --- a/reactos/apps/utils/cmd/label.c +++ b/reactos/apps/utils/cmd/label.c @@ -14,8 +14,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_LABEL @@ -23,6 +21,7 @@ #include #include #include +#include #include "cmd.h" @@ -118,4 +117,4 @@ INT cmd_label (LPTSTR cmd, LPTSTR param) return 0; } -#endif /* INCLUDE_CMD_LABEL */ \ No newline at end of file +#endif /* INCLUDE_CMD_LABEL */ diff --git a/reactos/apps/utils/cmd/locale.c b/reactos/apps/utils/cmd/locale.c index b97c97102b3..2e1e70bf585 100644 --- a/reactos/apps/utils/cmd/locale.c +++ b/reactos/apps/utils/cmd/locale.c @@ -11,8 +11,6 @@ * Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/reactos/apps/utils/cmd/makefile b/reactos/apps/utils/cmd/makefile index f956db79f62..0553027a0d7 100644 --- a/reactos/apps/utils/cmd/makefile +++ b/reactos/apps/utils/cmd/makefile @@ -1,29 +1,30 @@ # +# ReactOS makefile for CMD # -LIB=../../lib -COMMON=../common - # target: raw binary (does not work right now) #all: cmd.bin # target: executable (not tested/experimental) all: cmd.exe -OBJECTS = $(COMMON)/crt0.o cmd.o attrib.o alias.o batch.o beep.o call.o cls.o cmdinput.o cmdtable.o\ - color.o date.o del.o dir.o echo.o err_hand.o error.o filecomp.o for.o goto.o history.o if.o\ - internal.o label.o misc.o path.o pause.o redir.o ren.o set.o shift.o tempfile.o time.o type.o ver.o\ - verify.o where.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 del.o dir.o dirstack.o echo.o error.o filecomp.o for.o goto.o history.o if.o\ + internal.o label.o locale.o misc.o move.o path.o pause.o prompt.o redir.o ren.o ros.o set.o shift.o time.o title.o type.o ver.o\ + verify.o vol.o where.o + +LIBS= ../../lib/kernel32/kernel32.a ../../lib/ntdll/ntdll.a -LIBS = $(LIB)/mingw32/mingw32.a $(LIB)/crtdll/crtdll.a \ - $(LIB)/kernel32/kernel32.a $(LIB)/ntdll/ntdll.a cmd.bin: $(OBJECTS) $(LD) -Ttext 0x10000 $(OBJECTS) $(LIBS) -o cmd.exe $(OBJCOPY) -O binary cmd.exe cmd.bin -cmd.exe: $(OBJECTS) - $(LD) $(OBJECTS) $(LIBS) -o cmd.exe +cmd.exe: $(OBJECTS) $(LIBS) + $(CC) -specs=../../specs $(OBJECTS) $(LIBS) -lgcc -o cmd.exe + $(NM) --numeric-sort cmd.exe > cmd.sym include ../../rules.mak + + diff --git a/reactos/apps/utils/cmd/misc.c b/reactos/apps/utils/cmd/misc.c index 1eb5ca46869..b010cd9e4e2 100644 --- a/reactos/apps/utils/cmd/misc.c +++ b/reactos/apps/utils/cmd/misc.c @@ -26,16 +26,13 @@ * FileGetString() seems to be working now. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include - -#include +#include #include "cmd.h" @@ -45,32 +42,36 @@ */ TCHAR cgetchar (VOID) { - TCHAR ch; -#if 0 - DWORD dwRead; - DWORD dwOldMode; - HANDLE hIn; - - hIn = GetStdHandle (STD_INPUT_HANDLE); - ConInSwallowInput (hIn); - - GetConsoleMode (hIn, &dwOldMode); - SetConsoleMode (hIn, 0); - - ReadConsole (hIn, &ch, 1, &dwRead, NULL); - - DebugPrintf ("[cgetchar (0x%x) \'%c\']\n", ch, ch); - - SetConsoleMode (hIn, dwOldMode); -#endif - - if ((ch = getch()) == 0) - ch = getch() << 8; + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD irBuffer; + DWORD dwRead; - if (ch == 3) - bCtrlBreak = TRUE; + do + { + WaitForSingleObject (hInput, INFINITE); + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + if ((irBuffer.EventType == KEY_EVENT) && + (irBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + if ((irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) & + (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')) + bCtrlBreak = TRUE; - return ch; + break; + } + } + while (TRUE); + +#ifdef __REACTOS__ + return irBuffer.Event.KeyEvent.AsciiChar; +#else +#ifndef _UNICODE + return irBuffer.Event.KeyEvent.uChar.AsciiChar; +#else + return irBuffer.Event.KeyEvent.uChar.UnicodeChar; +#endif /* _UNICODE */ +#endif /* __REACTOS__ */ } @@ -266,6 +267,11 @@ BOOL IsValidFileName (LPCTSTR pszPath) } +BOOL IsValidDirectory (LPCTSTR pszPath) +{ + return (GetFileAttributes (pszPath) & FILE_ATTRIBUTE_DIRECTORY); +} + BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) { diff --git a/reactos/apps/utils/cmd/move.c b/reactos/apps/utils/cmd/move.c index 54158d721a2..462326a587e 100644 --- a/reactos/apps/utils/cmd/move.c +++ b/reactos/apps/utils/cmd/move.c @@ -22,8 +22,6 @@ * Added "/N" option. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_MOVE @@ -31,6 +29,7 @@ #include #include #include +#include #include "cmd.h" @@ -264,4 +263,4 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) return 0; } -#endif /* INCLUDE_CMD_MOVE */ \ No newline at end of file +#endif /* INCLUDE_CMD_MOVE */ diff --git a/reactos/apps/utils/cmd/path.c b/reactos/apps/utils/cmd/path.c index 714ee3879a7..68e2fe6f5eb 100644 --- a/reactos/apps/utils/cmd/path.c +++ b/reactos/apps/utils/cmd/path.c @@ -23,8 +23,6 @@ * Fixed Win32 environment handling. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_PATH diff --git a/reactos/apps/utils/cmd/pause.c b/reactos/apps/utils/cmd/pause.c index f4c01bba15a..19e67d539d1 100644 --- a/reactos/apps/utils/cmd/pause.c +++ b/reactos/apps/utils/cmd/pause.c @@ -17,8 +17,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_PAUSE diff --git a/reactos/apps/utils/cmd/prompt.c b/reactos/apps/utils/cmd/prompt.c index fa674f1c4ce..412dbbf8510 100644 --- a/reactos/apps/utils/cmd/prompt.c +++ b/reactos/apps/utils/cmd/prompt.c @@ -44,17 +44,85 @@ * Fixed Win32 environment handling. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" +static VOID PrintDate (VOID) +{ +#ifdef __REACTOS__ + SYSTEMTIME st; + + GetLocalTime (&st); + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + ConOutPrintf (_T("%s %02d%c%02d%c%04d"), + aszDayNames[st.wDayOfWeek], st.wMonth, cDateSeparator, st.wDay, cDateSeparator, st.wYear); + break; + + case 1: /* ddmmyy */ + ConOutPrintf (_T("%s %02d%c%02d%c%04d"), + aszDayNames[st.wDayOfWeek], st.wDay, cDateSeparator, st.wMonth, cDateSeparator, st.wYear); + break; + + case 2: /* yymmdd */ + ConOutPrintf (_T("%s %04d%c%02d%c%02d"), + aszDayNames[st.wDayOfWeek], st.wYear, cDateSeparator, st.wMonth, cDateSeparator, st.wDay); + break; + } +#else + TCHAR szDate[32]; + + GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, + szDate, sizeof (szDate)); + ConOutPrintf (_T("%s"), szDate); +#endif +} + + +static VOID +PrintTime (VOID) +{ +#ifdef __REACTOS__ + SYSTEMTIME st; + + GetLocalTime (&st); + + switch (nTimeFormat) + { + case 0: /* 12 hour format */ + default: + ConOutPrintf (_T("%2d%c%02d%c%02d%c%02d%c"), + (st.wHour == 0 ? 12 : (st.wHour <= 12 ? st.wHour : st.wHour - 12)), + cTimeSeparator, st.wMinute, cTimeSeparator, st.wSecond, cDecimalSeparator, + st.wMilliseconds / 10, (st.wHour <= 11 ? 'a' : 'p')); + break; + + case 1: /* 24 hour format */ + ConOutPrintf (_T("%2d%c%02d%c%02d%c%02d"), + st.wHour, cTimeSeparator, st.wMinute, cTimeSeparator, + st.wSecond, cDecimalSeparator, st.wMilliseconds / 10); + break; + } +#else + TCHAR szTime[32]; + + GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, NULL, + szTime, sizeof (szTime)); + ConOutPrintf (_T("%s"), szTime); +#endif +} + + /* * print the command-line prompt * @@ -95,13 +163,7 @@ VOID PrintPrompt(VOID) break; case _T('D'): - { - TCHAR szDate[32]; - - GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, - NULL, NULL, szDate, sizeof (szDate)); - ConOutPrintf (_T("%s"), szDate); - } + PrintDate (); break; case _T('E'): @@ -145,12 +207,7 @@ VOID PrintPrompt(VOID) break; case _T('T'): - { - TCHAR szTime[32]; - GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, - NULL, szTime, sizeof (szTime)); - ConOutPrintf (_T("%s"), szTime); - } + PrintTime (); break; case _T('V'): diff --git a/reactos/apps/utils/cmd/redir.c b/reactos/apps/utils/cmd/redir.c index 594bc112099..ffca9de9e77 100644 --- a/reactos/apps/utils/cmd/redir.c +++ b/reactos/apps/utils/cmd/redir.c @@ -22,8 +22,6 @@ * Added new error AND output redirection "&>" and "&>>". */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_REDIRECTION diff --git a/reactos/apps/utils/cmd/ren.c b/reactos/apps/utils/cmd/ren.c index 2023d075cf6..b8976e395f0 100644 --- a/reactos/apps/utils/cmd/ren.c +++ b/reactos/apps/utils/cmd/ren.c @@ -14,8 +14,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_RENAME diff --git a/reactos/apps/utils/cmd/ros.c b/reactos/apps/utils/cmd/ros.c new file mode 100644 index 00000000000..5c5cfcc8e2d --- /dev/null +++ b/reactos/apps/utils/cmd/ros.c @@ -0,0 +1,111 @@ + +#ifdef __REACTOS__ + +#include +#include +#include +//#include +//#include + +void* malloc(size_t _size) +{ + return(HeapAlloc(GetProcessHeap(), + 0, + _size)); +} + +void free(void* _ptr) +{ + HeapFree(GetProcessHeap(), + 0, + _ptr); +} + +#if 0 +void* calloc(size_t _nmemb, size_t _size) +{ + return(HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + _nmemb*_size)); +} +#endif + +void* realloc(void* _ptr, size_t _size) +{ + return(HeapReAlloc(GetProcessHeap(), + 0, + _ptr, + _size)); +} + +char * +_strdup(const char *_s) +{ + char *rv; + if (_s == 0) + return 0; + rv = (char *)malloc(strlen(_s) + 1); + if (rv == 0) + return 0; + strcpy(rv, _s); + return rv; +} + +size_t +strlen(const char *str) +{ + const char *s; + + if (str == 0) + return 0; + for (s = str; *s; ++s); + return s-str; +} + + +void +_makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext ) +{ + int dir_len; + if ( drive != NULL ) { + strcat(path,drive); + strcat(path,":"); + } + + if ( dir != NULL ) { + strcat(path,dir); + if ( *dir != '\\' ) + strcat(path,"\\"); + dir_len = strlen(dir); + if ( *(dir + dir_len - 1) != '\\' ) + strcat(path,"\\"); + } + if ( fname != NULL ) { + strcat(path,fname); + if ( ext != NULL ) { + if ( *ext != '.') + strcat(path,"."); + strcat(path,ext); + } + } +} + +#if 0 +int getch(void) +{ + DWORD NumberOfCharsRead = 0; + DWORD dwWritten; + char c; + + ReadConsoleA (GetStdHandle (STD_INPUT_HANDLE), &c, 1, &NumberOfCharsRead, NULL); + + if ( c == 10 ) + c = 13; + + WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), &c, 1, &dwWritten, NULL); + + return c; +} +#endif + +#endif \ No newline at end of file diff --git a/reactos/apps/utils/cmd/set.c b/reactos/apps/utils/cmd/set.c index 7be3388eac9..a1c9dc7ba97 100644 --- a/reactos/apps/utils/cmd/set.c +++ b/reactos/apps/utils/cmd/set.c @@ -26,10 +26,11 @@ * 24-Jan-1999 (Eric Kohl ) * Fixed Win32 environment handling. * Unicode and redirection safe! + * + * 25-Feb-1999 (Eric Kohl ) + * Fixed little bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_SET @@ -42,7 +43,7 @@ #include "cmd.h" -/* size of environment variable buffer */ +/* initial size of environment variable buffer */ #define ENV_BUFFER_SIZE 1024 @@ -81,7 +82,7 @@ INT cmd_set (LPTSTR cmd, LPTSTR param) lpOutput += (len + 1); } } - FreeEnvironmentStrings (lpEnv); + FreeEnvironmentStrings (lpEnv); } return 0; @@ -112,7 +113,7 @@ INT cmd_set (LPTSTR cmd, LPTSTR param) else if (dwBuffer > ENV_BUFFER_SIZE) { pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); - GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE); + GetEnvironmentVariable (param, pszBuffer, dwBuffer * sizeof (TCHAR)); } ConOutPrintf ("%s\n", pszBuffer); diff --git a/reactos/apps/utils/cmd/shift.c b/reactos/apps/utils/cmd/shift.c index 92ee0363c12..87ce454b178 100644 --- a/reactos/apps/utils/cmd/shift.c +++ b/reactos/apps/utils/cmd/shift.c @@ -20,8 +20,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/reactos/apps/utils/cmd/time.c b/reactos/apps/utils/cmd/time.c index f2b01d84aa2..08d70bc18f4 100644 --- a/reactos/apps/utils/cmd/time.c +++ b/reactos/apps/utils/cmd/time.c @@ -21,8 +21,6 @@ * Fixed time input bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_TIME @@ -38,7 +36,7 @@ static VOID PrintTime (VOID) { -#if 0 +#ifdef __REACTOS__ SYSTEMTIME st; GetLocalTime (&st); @@ -59,13 +57,13 @@ PrintTime (VOID) st.wSecond, cDecimalSeparator, st.wMilliseconds / 10); break; } -#endif - - TCHAR szTime[32]; +#else + TCHAR szTime[32]; GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, NULL, szTime, sizeof (szTime)); ConOutPrintf (_T("Current date is: %s\n"), szTime); +#endif } diff --git a/reactos/apps/utils/cmd/title.c b/reactos/apps/utils/cmd/title.c new file mode 100644 index 00000000000..3ed69859e1d --- /dev/null +++ b/reactos/apps/utils/cmd/title.c @@ -0,0 +1,42 @@ +/* + * title.c - title internal command. + * + * + * History: + * 1999-02-11 Emanuele Aliberti + */ + +#include "config.h" + +#ifdef INCLUDE_CMD_TITLE + +#include +#include +#include + +#include "cmd.h" + + +INT cmd_title (LPTSTR cmd, LPTSTR param) +{ + /* Do nothing if no args */ + if (*param == _T('\0')) + return 0; + + /* Asking help? */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutPuts (_T("Sets the window title for the command prompt window.\n" + "\n" + "TITLE [string]\n" + "\n" + " string Specifies the title for the command prompt window.")); + return 0; + } + + return SetConsoleTitle (param); +} + +#endif /* def INCLUDE_CMD_TITLE */ + +/* EOF */ \ No newline at end of file diff --git a/reactos/apps/utils/cmd/type.c b/reactos/apps/utils/cmd/type.c index b4713562b90..8d772dd0205 100644 --- a/reactos/apps/utils/cmd/type.c +++ b/reactos/apps/utils/cmd/type.c @@ -20,8 +20,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_TYPE diff --git a/reactos/apps/utils/cmd/ver.c b/reactos/apps/utils/cmd/ver.c index f5e76fc79e7..4367effb966 100644 --- a/reactos/apps/utils/cmd/ver.c +++ b/reactos/apps/utils/cmd/ver.c @@ -16,24 +16,27 @@ * * 20-Jan-1999 (Eric Kohl ) * Unicode and redirection safe! + * + * 26-Feb-1999 (Eric Kohl ) + * New version info and some output changes. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" -#define VER_HELP "display shell version info VER [/C/R/W/?]" VOID ShortVersion (VOID) { - ConOutPuts (_T("\n" SHELLINFO " " SHELLVER "\n")); + ConOutPuts (_T("\n" + SHELLINFO "\n" + SHELLVER "\n")); } @@ -48,9 +51,11 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) { INT i; - /* JPP 07/08/1998 clean up and shortened info. */ - - ConOutPuts (_T("\n" SHELLINFO " " SHELLVER "\nCopyright (C) 1994-1998 Tim Norman and others.")); + ConOutPuts (_T("\n" + SHELLINFO "\n" + SHELLVER "\n" + "\n" + "Copyright (C) 1994-1998 Tim Norman and others.")); ConOutPuts (_T("Copyright (C) 1998,1999 Eric Kohl.")); /* Basic copyright notice */ @@ -67,7 +72,7 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) /* MS-DOS ver prints just help if /? is alone or not */ if (_tcsstr (param, _T("/?")) != NULL) { - ConOutPuts (_T(USAGE ": " VER_HELP)); + ConOutPuts (_T("\ndisplay shell version info\n\nVER [/C/R/W/?]")); return 0; } @@ -91,7 +96,6 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) if (_totupper (param[i]) == _T('W')) { /* Warranty notice */ - /* JPP 07/08/1998 removed extra printf calls */ ConOutPuts (_T("\n This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" @@ -100,7 +104,6 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) else if (_totupper (param[i]) == _T('R')) { /* Redistribution notice */ - /* JPP 07/08/1998 removed extra printf calls */ ConOutPuts (_T("\n This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" @@ -109,16 +112,15 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) else if (_totupper (param[i]) == _T('C')) { /* Developer listing */ - /* JPP 07/08/1998 removed extra printf calls; rearranged names */ - ConOutPuts (_T("\ndeveloped by:\n" + ConOutPuts (_T("\nFreeDOS version written by:\n" " Tim Norman Matt Rains\n" " Evan Jeffrey Steffen Kaiser\n" " Svante Frey Oliver Mueller\n" " Aaron Kaufman Marc Desrochers\n" " Rob Lake John P Price\n" " Hans B Pufal\n" - "\nconverted to Win32 by:\n" - " Eric Kohl\n")); + "\nReactOS version written by:\n" + " Eric Kohl Emanuele Aliberti\n")); } else { @@ -130,7 +132,7 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) ConOutPuts (_T("\nSend bug reports to .\n" /* - "Updates are available at ftp://www.sid-dis.com/..." + "Updates are available at http://www.sid-dis.com/reactos" */ )); return 0; diff --git a/reactos/apps/utils/cmd/verify.c b/reactos/apps/utils/cmd/verify.c index e3b1f08a8b7..4aeaa94e9e4 100644 --- a/reactos/apps/utils/cmd/verify.c +++ b/reactos/apps/utils/cmd/verify.c @@ -15,8 +15,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_VERIFY diff --git a/reactos/apps/utils/cmd/vol.c b/reactos/apps/utils/cmd/vol.c index 13bd0e1e712..71ee531ad30 100644 --- a/reactos/apps/utils/cmd/vol.c +++ b/reactos/apps/utils/cmd/vol.c @@ -20,8 +20,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_VOL diff --git a/reactos/apps/utils/cmd/where.c b/reactos/apps/utils/cmd/where.c index 1ea1625f77d..70f96c39e87 100644 --- a/reactos/apps/utils/cmd/where.c +++ b/reactos/apps/utils/cmd/where.c @@ -1,67 +1,71 @@ /* - * WHERE.C - file serch functions. + * WHERE.C - file search functions. * * * History: * - * 07/15/95 (Tim Norman) - * started. + * 07/15/95 (Tim Norman) + * started. * - * 08/08/95 (Matt Rains) - * i have cleaned up the source code. changes now bring this source into - * guidelines for recommended programming practice. + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. * - * 12/12/95 (Steffan Kaiser & Tim Norman) - * added some patches to fix some things and make more efficient + * 12/12/95 (Steffan Kaiser & Tim Norman) + * added some patches to fix some things and make more efficient * - * 1/6/96 (Tim Norman) - * fixed a stupid pointer mistake... Thanks to everyone who noticed it! + * 1/6/96 (Tim Norman) + * fixed a stupid pointer mistake... + * Thanks to everyone who noticed it! * - * 8/1/96 (Tim Norman) - * fixed a bug when getenv returns NULL + * 8/1/96 (Tim Norman) + * fixed a bug when getenv returns NULL * - * 8/7/96 (Steffan Kaiser and Tim Norman) - * speed improvements and bug fixes + * 8/7/96 (Steffan Kaiser and Tim Norman) + * speed improvements and bug fixes * - * 8/27/96 (Tim Norman) - * changed code to use pointers directly into PATH environment variable - * rather than making our own copy. This saves some memory, but requires - * we write our own function to copy pathnames out of the variable. + * 8/27/96 (Tim Norman) + * changed code to use pointers directly into PATH environment + * variable rather than making our own copy. This saves some memory, + * but requires we write our own function to copy pathnames out of + * the variable. * - * 12/23/96 (Aaron Kaufman) - * Fixed a bug in get_paths() that did not point to the first PATH in the - * environment variable. + * 12/23/96 (Aaron Kaufman) + * Fixed a bug in get_paths() that did not point to the first PATH + * in the environment variable. * - * 7/12/97 (Tim Norman) - * Apparently, Aaron's bugfix got lost, so I fixed it again. + * 7/12/97 (Tim Norman) + * Apparently, Aaron's bugfix got lost, so I fixed it again. * - * 16 July 1998 (John P. Price) - * Added stand alone code. + * 16 July 1998 (John P. Price) + * Added stand alone code. * - * 17 July 1998 (John P. Price) - * Rewrote find_which to use searchpath function + * 17 July 1998 (John P. Price) + * Rewrote find_which to use searchpath function * - * 24-Jul-1998 (John P Price ) - * - fixed bug where didn't check all extensions when path was specified + * 24-Jul-1998 (John P Price ) + * fixed bug where didn't check all extensions when path was specified * - * 27-Jul-1998 (John P Price ) - * - added config.h include + * 27-Jul-1998 (John P Price ) + * added config.h include * - * 30-Jul-1998 (John P Price ) - * - fixed so that it find_which returns NULL if filename is not executable - * (does not have .bat, .com, or .exe extention). Before command would - * to execute any file with any extension (opps!) + * 30-Jul-1998 (John P Price ) + * fixed so that it find_which returns NULL if filename is not + * executable (does not have .bat, .com, or .exe extention). + * Before command would to execute any file with any extension (opps!) * - * 03-Dec_1998 (Eric Kohl ) + * 03-Dec-1998 (Eric Kohl ) * Changed find_which(). * - * 07-Dec_1998 (Eric Kohl ) + * 07-Dec-1998 (Eric Kohl ) * Added ".CMD" extension. * Replaced numeric constant by _NR_OF_EXTENSIONS. + * + * 26-Feb-1999 (Eric Kohl ) + * Replaced find_which() by SearchForExecutable(). + * Now files are serched with the right order of extensions. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -71,91 +75,188 @@ #include "cmd.h" +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + static LPTSTR ext[] = {".BAT", ".CMD", ".COM", ".EXE"}; static INT nExtCount = sizeof(ext) / sizeof(LPTSTR); /* searches for file using path info. */ -BOOL find_which (LPCTSTR fname, LPTSTR fullbuffer) +BOOL +SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) { - static TCHAR temp[MAX_PATH]; - LPTSTR fullname; - INT x; + TCHAR szPathBuffer[MAX_PATH]; + LPTSTR pszBuffer; + DWORD dwBuffer; + INT n; + LPTSTR p,s,f; + + /* load environment varable PATH into buffer */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + ConErrPrintf (_T("Not PATH environment variable found!\n")); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR)); + } + - *fullbuffer = _T('\0'); + /* initialize full name buffer */ + *pFullName = _T('\0'); - /* if there an extension and it is in the last path component, then - * don't test all the extensions. */ - if (!(fullname = _tcsrchr (fname, _T('.'))) || - _tcschr (fullname + 1, _T('\\'))) + if (!(p = _tcsrchr (pFileName, _T('.'))) || + _tcschr (p + 1, _T('\\'))) { + /* There is no extension ==> test all the extensions. */ #ifdef _DEBUG - DebugPrintf ("No filename extension!\n"); + DebugPrintf (_T("No filename extension!\n")); #endif - for (x = 0; x < nExtCount; x++) + /* search in current directory */ + GetCurrentDirectory (MAX_PATH, szPathBuffer); + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + + p = szPathBuffer + _tcslen (szPathBuffer); + + for (n = 0; n < nExtCount; n++) { - _tcscpy (temp, fname); - _tcscat (temp, ext[x]); + _tcscpy (p, ext[n]); + #ifdef _DEBUG - DebugPrintf ("Checking for %s\n", temp); + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); #endif - if (_tcschr (fname, _T('\\'))) + + if (IsValidFileName (szPathBuffer)) { - if (IsValidFileName (temp)) - { - _tcscpy (fullbuffer, temp); - return TRUE; - } +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + } + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; } else { - _searchenv (temp, _T("PATH"), fullbuffer); - if (*fullbuffer != '\0') + _tcscpy (szPathBuffer, s); + s = NULL; + } + + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + + p = szPathBuffer + _tcslen (szPathBuffer); + + for (n = 0; n < nExtCount; n++) + { + _tcscpy (p, ext[n]); + +#ifdef _DEBUG + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); +#endif + + if (IsValidFileName (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); return TRUE; + } } } } else { - /* there is an extension... don't test other extensions */ - /* make sure that the extention is one of the four */ + /* There is an extension and it is in the last path component, */ + /* so don't test all the extensions. */ #ifdef _DEBUG - DebugPrintf ("No filename extension!\n"); + DebugPrintf (_T("Filename extension!\n")); #endif - for (x = 0; x < nExtCount; x++) + + /* search in current directory */ + GetCurrentDirectory (MAX_PATH, szPathBuffer); + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + +#ifdef _DEBUG + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); +#endif + if (IsValidFileName (szPathBuffer)) { - if (!_tcsicmp (_tcsrchr (fname, _T('.')), ext[x])) - { - if (_tcschr (fname, _T('\\'))) - { - if (IsValidFileName (fname)) - { - _tcscpy (fullbuffer, fname); #ifdef _DEBUG - DebugPrintf ("Found: %s\n", fullbuffer); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif - return TRUE; - } - } - else - { + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; + } + else + { + _tcscpy (szPathBuffer, s); + s = NULL; + } + + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + #ifdef _DEBUG - DebugPrintf ("Checking for %s\n", fname); + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); #endif - _searchenv (fname, _T("PATH"), fullbuffer); - if (*fullbuffer != _T('\0')) - { + if (IsValidFileName (szPathBuffer)) + { #ifdef _DEBUG - DebugPrintf ("Found: %s\n", fullbuffer); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif - return TRUE; - } - } + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; } } } + free (pszBuffer); + return FALSE; -} +} \ No newline at end of file diff --git a/reactos/drivers/dd/beep/beep.c b/reactos/drivers/dd/beep/beep.c index 0afd9dbbc30..037022c0dd1 100644 --- a/reactos/drivers/dd/beep/beep.c +++ b/reactos/drivers/dd/beep/beep.c @@ -24,7 +24,7 @@ typedef struct _BEEP_DEVICE_EXTENSION KDPC Dpc; KTIMER Timer; KEVENT Event; - DWORD BeepOn; + LONG BeepOn; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; @@ -275,7 +275,7 @@ NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) /* set up device extension */ pDeviceObject->Flags |= DO_BUFFERED_IO; pDeviceExtension = pDeviceObject->DeviceExtension; - pDeviceExtension->BeepOn = FALSE; + pDeviceExtension->BeepOn = 0; /* FALSE */ KeInitializeDpc (&(pDeviceExtension->Dpc), BeepDPC, diff --git a/reactos/include/base.h b/reactos/include/base.h index 5dd506ca5d5..a1737b9879d 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -313,11 +313,17 @@ typedef DWORD SERVICE_STATUS_HANDLE; #ifdef UNICODE typedef unsigned short TBYTE; +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED typedef unsigned short TCHAR; +#endif /* _TCHAR_DEFINED */ typedef unsigned short BCHAR; #else typedef unsigned char TBYTE; +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED typedef char TCHAR; +#endif /* _TCHAR_DEFINED */ typedef BYTE BCHAR; #endif /* UNICODE */ diff --git a/reactos/include/tchar.h b/reactos/include/tchar.h new file mode 100644 index 00000000000..11ae87b6742 --- /dev/null +++ b/reactos/include/tchar.h @@ -0,0 +1,231 @@ +/* + * tchar.h + * + * Unicode mapping layer for the standard C library. By including this + * file and using the 't' names for string functions + * (eg. _tprintf) you can make code which can be easily adapted to both + * Unicode and non-unicode environments. In a unicode enabled compile define + * _UNICODE before including tchar.h, otherwise the standard non-unicode + * library functions will be used. + * + * Note that you still need to include string.h or stdlib.h etc. to define + * the appropriate functions. Also note that there are several defines + * included for non-ANSI functions which are commonly available (but using + * the convention of prepending an underscore to non-ANSI library function + * names). + * + * This file is part of the Mingw32 package. + * + * Contributors: + * Created by Colin Peters + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * $Revision: 1.1 $ + * $Author: ekohl $ + * $Date: 1999/03/21 21:32:44 $ + * + */ + +#ifndef _TCHAR_H_ +#define _TCHAR_H_ + +/* + * NOTE: This tests _UNICODE, which is different from the UNICODE define + * used to differentiate Win32 API calls. + */ +#ifdef _UNICODE + + +/* + * Use TCHAR instead of char or wchar_t. It will be appropriately translated + * if _UNICODE is correctly defined (or not). + */ +#ifndef _TCHAR_DEFINED +#ifndef RC_INVOKED +typedef wchar_t TCHAR; +#endif /* Not RC_INVOKED */ +#define _TCHAR_DEFINED +#endif + + +/* + * Enclose constant strings and literal characters in the _TEXT and _T macro to make + * them unicode constant strings when _UNICODE is defined. + */ +#define _TEXT(x) L ## x +#define _T(x) L ## x + +/* + * Unicode functions + */ + +#define _tprintf wprintf +#define _ftprintf fwprintf +#define _stprintf swprintf +#define _sntprintf _snwprintf +#define _vtprintf vwprintf +#define _vftprintf vfwprintf +#define _vstprintf vswprintf +#define _vsntprintf _vsnwprintf +#define _tscanf wscanf +#define _ftscanf fwscanf +#define _stscanf swscanf +#define _fgettc fgetwc +#define _fgettchar _fgetwchar +#define _fgetts fgetws +#define _fputtc fputwc +#define _fputtchar _fputwchar +#define _fputts fputws +#define _gettc getwc +#define _getts getws +#define _puttc putwc +#define _putts putws +#define _ungettc ungetwc +#define _tcstod wcstod +#define _tcstol wcstol +#define _tcstoul wcstoul +#define _tcscat wcscat +#define _tcschr wcschr +#define _tcscmp wcscmp +#define _tcscpy wcscpy +#define _tcscspn wcscspn +#define _tcslen wcslen +#define _tcsncat wcsncat +#define _tcsncmp wcsncmp +#define _tcsncpy wcsncpy +#define _tcspbrk wcspbrk +#define _tcsrchr wcsrchr +#define _tcsspn wcsspn +#define _tcsstr wcsstr +#define _tcstok wcstok +#define _tcsdup _wcsdup +#define _tcsicmp _wcsicmp +#define _tcsnicmp _wcsnicmp +#define _tcsnset _wcsnset +#define _tcsrev _wcsrev +#define _tcsset _wcsset +#define _tcslwr _wcslwr +#define _tcsupr _wcsupr +#define _tcsxfrm wcsxfrm +#define _tcscoll wcscoll +#define _tcsicoll _wcsicoll +#define _istalpha iswalpha +#define _istupper iswupper +#define _istlower iswlower +#define _istdigit iswdigit +#define _istxdigit iswxdigit +#define _istspace iswspace +#define _istpunct iswpunct +#define _istalnum iswalnum +#define _istprint iswprint +#define _istgraph iswgraph +#define _istcntrl iswcntrl +#define _istascii iswascii +#define _totupper towupper +#define _totlower towlower +#define _ttoi _wtoi +#define _tcsftime wcsftime + +#else /* Not _UNICODE */ + +/* + * TCHAR, the type you should use instead of char. + */ +#ifndef _TCHAR_DEFINED +#ifndef RC_INVOKED +typedef char TCHAR; +#endif +#define _TCHAR_DEFINED +#endif + +/* + * Enclose constant strings and characters in the _TEXT and _T macro. + */ +#define _TEXT(x) x +#define _T(x) x + + +/* + * Non-unicode (standard) functions + */ + +#define _tprintf printf +#define _ftprintf fprintf +#define _stprintf sprintf +#define _sntprintf _snprintf +#define _vtprintf vprintf +#define _vftprintf vfprintf +#define _vstprintf vsprintf +#define _vsntprintf _vsnprintf +#define _tscanf scanf +#define _ftscanf fscanf +#define _stscanf sscanf +#define _fgettc fgetc +#define _fgettchar _fgetchar +#define _fgetts fgets +#define _fputtc fputc +#define _fputtchar _fputchar +#define _fputts fputs +#define _gettc getc +#define _getts gets +#define _puttc putc +#define _putts puts +#define _ungettc ungetc +#define _tcstod strtod +#define _tcstol strtol +#define _tcstoul strtoul +#define _tcscat strcat +#define _tcschr strchr +#define _tcscmp strcmp +#define _tcscpy strcpy +#define _tcscspn strcspn +#define _tcslen strlen +#define _tcsncat strncat +#define _tcsncmp strncmp +#define _tcsncpy strncpy +#define _tcspbrk strpbrk +#define _tcsrchr strrchr +#define _tcsspn strspn +#define _tcsstr strstr +#define _tcstok strtok +#define _tcsdup _strdup +#define _tcsicmp _stricmp +#define _tcsnicmp _strnicmp +#define _tcsnset _strnset +#define _tcsrev _strrev +#define _tcsset _strset +#define _tcslwr _strlwr +#define _tcsupr _strupr +#define _tcsxfrm strxfrm +#define _tcscoll strcoll +#define _tcsicoll _stricoll +#define _istalpha isalpha +#define _istupper isupper +#define _istlower islower +#define _istdigit isdigit +#define _istxdigit isxdigit +#define _istspace isspace +#define _istpunct ispunct +#define _istalnum isalnum +#define _istprint isprint +#define _istgraph isgraph +#define _istcntrl iscntrl +#define _istascii isascii +#define _totupper toupper +#define _totlower tolower +#define _ttoi atoi +#define _tcsftime strftime + +#endif /* Not _UNICODE */ + +#endif /* Not _TCHAR_H_ */ + diff --git a/reactos/makefile.dos b/reactos/makefile.dos index 9b98581dc12..97725e8f312 100644 --- a/reactos/makefile.dos +++ b/reactos/makefile.dos @@ -19,7 +19,7 @@ include rules.mak # # Required to run the system # -COMPONENTS = iface_native ntoskrnl kernel32 ntdll +COMPONENTS = iface_native ntoskrnl kernel32 ntdll # crtdll mingw32 # @@ -34,12 +34,12 @@ LOADERS = dos # # Select the device drivers and filesystems you want -# +# KERNEL_SERVICES = blue parallel keyboard null mouse serial sound ide test sdisk \ - minix vfat + minix vfat # cmd -APPS = hello shell +APPS = hello shell cmd all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS) .PHONY: all @@ -75,13 +75,13 @@ iface_native_clean: # vfat: dummy make -C services/fs/vfat - + sdisk: dummy make -C services/dd/sdisk - + minix: dummy make -C services/fs/minix - + template: dummy make -C services/fs/template @@ -89,7 +89,7 @@ ide-test: dummy make -C services/dd/ide-test ide: dummy - make -C services/dd/ide + make -C services/dd/ide test: dummy make -C services/dd/test @@ -111,7 +111,7 @@ blue: dummy mouse: dummy make -C services/dd/mouse - + serial: dummy make -C services/dd/serial diff --git a/reactos/ntoskrnl/libgcc.a b/reactos/ntoskrnl/libgcc.a index 23af550a66e..89875e22f27 100644 Binary files a/reactos/ntoskrnl/libgcc.a and b/reactos/ntoskrnl/libgcc.a differ diff --git a/rosapps/cmd/alias.c b/rosapps/cmd/alias.c index ac0a9149d09..5f2d520bb0f 100644 --- a/rosapps/cmd/alias.c +++ b/rosapps/cmd/alias.c @@ -26,7 +26,6 @@ * Redirection safe! */ -#define WIN32_LEAN_AND_MEAN #include "config.h" diff --git a/rosapps/cmd/attrib.c b/rosapps/cmd/attrib.c index 65a2c316731..8316e63ef05 100644 --- a/rosapps/cmd/attrib.c +++ b/rosapps/cmd/attrib.c @@ -29,8 +29,6 @@ * Added handling of multiple filenames. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_ATTRIB @@ -38,6 +36,7 @@ #include #include #include +#include #include "cmd.h" diff --git a/rosapps/cmd/batch.c b/rosapps/cmd/batch.c index b1ea5be8903..36df898a38b 100644 --- a/rosapps/cmd/batch.c +++ b/rosapps/cmd/batch.c @@ -52,14 +52,13 @@ * Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/rosapps/cmd/batch.h b/rosapps/cmd/batch.h index 11324e38c61..cdc37f2a161 100644 --- a/rosapps/cmd/batch.h +++ b/rosapps/cmd/batch.h @@ -4,6 +4,9 @@ * */ +#ifndef _BATCH_H_INCLUDED_ +#define _BATCH_H_INCLUDED_ + typedef struct tagBATCHCONTEXT { @@ -37,3 +40,5 @@ LPTSTR BatchParams (LPTSTR, LPTSTR); VOID ExitBatch (LPTSTR); BOOL Batch (LPTSTR, LPTSTR, LPTSTR); LPTSTR ReadBatchLine (LPBOOL); + +#endif /* _BATCH_H_INCLUDED_ */ diff --git a/rosapps/cmd/beep.c b/rosapps/cmd/beep.c index 9f9834c5775..bafe06c23ff 100644 --- a/rosapps/cmd/beep.c +++ b/rosapps/cmd/beep.c @@ -21,8 +21,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_BEEP @@ -48,8 +46,11 @@ INT cmd_beep (LPTSTR cmd, LPTSTR param) if (bc == NULL) return 1; #endif - +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif return 0; } diff --git a/rosapps/cmd/call.c b/rosapps/cmd/call.c index db5dd630217..6777b177c4f 100644 --- a/rosapps/cmd/call.c +++ b/rosapps/cmd/call.c @@ -25,14 +25,13 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/rosapps/cmd/chcp.c b/rosapps/cmd/chcp.c index 6831e576906..b72c9123f21 100644 --- a/rosapps/cmd/chcp.c +++ b/rosapps/cmd/chcp.c @@ -9,8 +9,6 @@ * */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_CHCP @@ -18,6 +16,7 @@ #include #include #include +#include #include "cmd.h" #include "chcp.h" diff --git a/rosapps/cmd/cls.c b/rosapps/cmd/cls.c index 2e27fcc0246..e6a5991d0ec 100644 --- a/rosapps/cmd/cls.c +++ b/rosapps/cmd/cls.c @@ -23,8 +23,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_CLS diff --git a/rosapps/cmd/cmd.c b/rosapps/cmd/cmd.c index 2841c33dec0..966c5d798af 100644 --- a/rosapps/cmd/cmd.c +++ b/rosapps/cmd/cmd.c @@ -105,14 +105,13 @@ * Replaced spawnl() by CreateProcess(). */ -// #define WIN32_LEAN_AND_MEAN - #include "config.h" #include -// #include +#include #include #include +#include #include "cmd.h" #include "batch.h" @@ -125,7 +124,7 @@ BOOL bExit = FALSE; /* indicates EXIT was typed */ BOOL bCanExit = TRUE; /* indicates if this shell is exitable */ BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */ BOOL bIgnoreEcho = FALSE; /* Ignore 'newline' before 'cls' */ -INT errorlevel = 0; /* Errorlevel of last launched external program */ +INT nErrorLevel = 0; /* Errorlevel of last launched external program */ OSVERSIONINFO osvi; HANDLE hIn; HANDLE hOut; @@ -179,9 +178,7 @@ Execute (LPTSTR first, LPTSTR rest) /* get the PATH environment variable and parse it */ /* search the PATH environment variable for the binary */ - find_which (first, szFullName); - - if (szFullName[0] == _T('\0')) + if (!SearchForExecutable (first, szFullName)) { error_bad_command (); return; @@ -209,7 +206,7 @@ Execute (LPTSTR first, LPTSTR rest) #endif /* build command line for CreateProcess() */ _tcscpy (szFullCmdLine, szFullName); - _tcscat (szFullCmdLine, " "); + _tcscat (szFullCmdLine, _T(" ")); _tcscat (szFullCmdLine, rest); /* fill startup info */ @@ -221,8 +218,10 @@ Execute (LPTSTR first, LPTSTR rest) if (CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &stui, &prci)) { + DWORD dwExitCode; WaitForSingleObject (prci.hProcess, INFINITE); - GetExitCodeProcess (prci.hProcess, &errorlevel); + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; CloseHandle (prci.hThread); CloseHandle (prci.hProcess); } @@ -302,8 +301,8 @@ DoCommand (LPTSTR line) cl = _tcslen (cmdptr->name); if ((cmdptr->flags & CMD_SPECIAL) && - (!_tcsncmp (cmdptr->name, com, cl)) && - (_tcschr (_T("\\.-"), *(com + cl)))) + (!_tcsncmp (cmdptr->name, com, cl)) && + (_tcschr (_T("\\.-"), *(com + cl)))) { /* OK its one of the specials...*/ @@ -688,7 +687,7 @@ ProcessInput (BOOL bFlag) case _T('7'): case _T('8'): case _T('9'): - if (tp = FindArg (*ip - _T('0'))) + if ((tp = FindArg (*ip - _T('0')))) { cp = stpcpy (cp, tp); ip++; @@ -698,12 +697,12 @@ ProcessInput (BOOL bFlag) break; case _T('?'): - cp += wsprintf (cp, _T("%u"), errorlevel); + cp += wsprintf (cp, _T("%u"), nErrorLevel); ip++; break; default: - if (tp = _tcschr (ip, _T('%'))) + if ((tp = _tcschr (ip, _T('%')))) { char evar[512]; *tp = _T('\0'); @@ -846,10 +845,10 @@ static VOID Initialize (int argc, char *argv[]) #endif /* get version information */ - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx (&osvi); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx (&osvi); - InitLocale (); + InitLocale (); /* get default input and output console handles */ hOut = GetStdHandle (STD_OUTPUT_HANDLE); @@ -859,7 +858,7 @@ static VOID Initialize (int argc, char *argv[]) InitLastPath (); #endif - if (argc >= 2) + if (argc >= 2) { if (!_tcsncmp (argv[1], _T("/?"), 2)) { @@ -932,10 +931,13 @@ static VOID Initialize (int argc, char *argv[]) ShowCommands (); /* Set COMSPEC environment variable */ - SetEnvironmentVariable (_T("COMSPEC"), argv[0]); + if (argv) + SetEnvironmentVariable (_T("COMSPEC"), argv[0]); /* add ctrl handler */ +#if 0 SetConsoleCtrlHandler (NULL, TRUE); +#endif } @@ -952,7 +954,9 @@ static VOID Cleanup (VOID) #endif /* remove ctrl handler */ -// SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE); +#if 0 + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE); +#endif } @@ -964,7 +968,9 @@ int main (int argc, char *argv[]) INT nExitCode; AllocConsole (); - SetFileApisToOEM (); +#ifndef __REACTOS__ + SetFileApisToOEM (); +#endif /* check switches on command-line */ Initialize (argc, argv); diff --git a/rosapps/cmd/cmd.h b/rosapps/cmd/cmd.h index e34fffedb1d..9c35a460955 100644 --- a/rosapps/cmd/cmd.h +++ b/rosapps/cmd/cmd.h @@ -11,18 +11,37 @@ * Moved error messages in here * * 07/12/98 (Rob Lake) - * Moved more error messages here + * Moved more error messages here. * * 30-Jul-1998 (John P Price ) - * Added compile date to version + * Added compile date to version. + * + * 26-Feb-1999 (Eric Kohl ) + * Introduced a new version string. + * Thanks to Emanuele Aliberti! */ -// #define WIN32_LEAN_AND_MEAN +#ifndef _CMD_H_INCLUDED_ +#define _CMD_H_INCLUDED_ + +#include "config.h" #include -// #include +#include + + +#define CMD_VER "0.1 pre 1" + +#ifdef _MSC_VER +#define SHELLVER "Version " CMD_VER " [" __DATE__ ", msc]" +#else +#ifdef __LCC__ +#define SHELLVER "Version " CMD_VER " [" __DATE__ ", lcc-win32]" +#else +#define SHELLVER "Version " CMD_VER " [" __DATE__ "]" +#endif +#endif -#define SHELLVER "version 0.0.4 [" __DATE__"]" #define BREAK_BATCHFILE 1 #define BREAK_OUTOFBATCH 2 @@ -48,7 +67,7 @@ -/* prototypes for CMD.C */ +/* Prototypes for CMD.C */ extern HANDLE hOut; extern HANDLE hIn; extern WORD wColor; @@ -56,7 +75,7 @@ extern WORD wDefColor; extern BOOL bCtrlBreak; extern BOOL bIgnoreEcho; extern BOOL bExit; -extern int errorlevel; +extern INT nErrorLevel; extern SHORT maxx; extern SHORT maxy; extern OSVERSIONINFO osvi; @@ -70,24 +89,32 @@ int c_brk(void); -/* prototypes for ALIAS.C */ -VOID ExpandAlias (char *, int); -INT cmd_alias (LPTSTR, LPTSTR); +/* Prototypes for ALIAS.C */ +VOID ExpandAlias (LPTSTR, INT); +INT cmd_alias (LPTSTR, LPTSTR); -/* prototyped for ATTRIB.C */ +/* Prototypes for ATTRIB.C */ INT cmd_attrib (LPTSTR, LPTSTR); -/* prototypes for CLS.C */ +/* Prototypes for BEEP.C */ +INT cmd_beep (LPTSTR, LPTSTR); + + +/* Prototypes for CALL.C */ +INT cmd_call (LPTSTR, LPTSTR); + + +/* Prototypes for CLS.C */ INT cmd_cls (LPTSTR, LPTSTR); -/* prototypes for CMDINPUT.C */ +/* Prototypes for CMDINPUT.C */ VOID ReadCommand (LPTSTR, INT); -/* prototypes for CMDTABLE.C */ +/* Prototypes for CMDTABLE.C */ #define CMD_SPECIAL 1 #define CMD_BATCHONLY 2 @@ -99,12 +126,12 @@ typedef struct tagCOMMAND } COMMAND, *LPCOMMAND; -/* prototypes for COLOR.C */ +/* Prototypes for COLOR.C */ VOID SetScreenColor (WORD); INT cmd_color (LPTSTR, LPTSTR); -/* prototypes for CONSOLE.C */ +/* Prototypes for CONSOLE.C */ #ifdef _DEBUG VOID DebugPrintf (LPTSTR, ...); #endif /* _DEBUG */ @@ -122,33 +149,33 @@ VOID ConErrChar (TCHAR); VOID ConErrPuts (LPTSTR); VOID ConErrPrintf (LPTSTR, ...); - -SHORT wherex (VOID); -SHORT wherey (VOID); -VOID goxy (SHORT, SHORT); +SHORT GetCursorX (VOID); +SHORT GetCursorY (VOID); +VOID GetCursorXY (PSHORT, PSHORT); +VOID SetCursorXY (SHORT, SHORT); VOID GetScreenSize (PSHORT, PSHORT); VOID SetCursorType (BOOL, BOOL); -/* prototypes for COPY.C */ +/* Prototypes for COPY.C */ INT cmd_copy (LPTSTR, LPTSTR); -/* prototypes for DATE.C */ +/* Prototypes for DATE.C */ INT cmd_date (LPTSTR, LPTSTR); -/* prototypes for DEL.C */ +/* Prototypes for DEL.C */ INT cmd_del (LPTSTR, LPTSTR); -/* prototypes for DIR.C */ +/* Prototypes for DIR.C */ //int incline(int *line, unsigned flags); INT cmd_dir (LPTSTR, LPTSTR); -/* prototypes for DIRSTACK.C */ +/* Prototypes for DIRSTACK.C */ VOID InitDirectoryStack (VOID); VOID DestroyDirectoryStack (VOID); INT GetDirectoryStackDepth (VOID); @@ -156,6 +183,10 @@ INT cmd_pushd (LPTSTR, LPTSTR); INT cmd_popd (LPTSTR, LPTSTR); +/* Prototypes for ECHO.C */ +INT cmd_echo (LPTSTR, LPTSTR); + + /* Prototypes for ERROR.C */ VOID ErrorMessage (DWORD, LPTSTR, ...); @@ -175,7 +206,7 @@ VOID error_syntax (LPTSTR); VOID msg_pause (VOID); -/* prototypes for FILECOMP.C */ +/* Prototypes for FILECOMP.C */ #ifdef FEATURE_UNIX_FILENAME_COMPLETION VOID CompleteFilename (LPTSTR, INT); INT ShowCompletionMatches (LPTSTR, INT); @@ -184,28 +215,36 @@ INT ShowCompletionMatches (LPTSTR, INT); #endif -/* prototypes for HISTORY.C */ +/* Prototypes for FOR.C */ +INT cmd_for (LPTSTR, LPTSTR); + + +/* Prototypes for GOTO.C */ +INT cmd_goto (LPTSTR, LPTSTR); + + +/* Prototypes for HISTORY.C */ #ifdef FEATURE_HISTORY VOID History (INT, LPTSTR); #endif -/* prototypes for INTERNAL.C */ +/* Prototypes for INTERNAL.C */ VOID InitLastPath (VOID); VOID FreeLastPath (VOID); -int cmd_chdir(char *, char *); -int cmd_mkdir(char *, char *); -int cmd_rmdir(char *, char *); -int internal_exit(char *, char *); -int cmd_rem(char *, char *); -int cmd_showcommands(char *, char *); +INT cmd_chdir (LPTSTR, LPTSTR); +INT cmd_mkdir (LPTSTR, LPTSTR); +INT cmd_rmdir (LPTSTR, LPTSTR); +INT internal_exit (LPTSTR, LPTSTR); +INT cmd_rem (LPTSTR, LPTSTR); +INT cmd_showcommands (LPTSTR, LPTSTR); -/* prototyped for LABEL.C */ +/* Prototypes for LABEL.C */ INT cmd_label (LPTSTR, LPTSTR); -/* prototypes for LOCALE.C */ +/* Prototypes for LOCALE.C */ extern TCHAR cDateSeparator; extern INT nDateFormat; extern TCHAR cTimeSeparator; @@ -226,23 +265,24 @@ VOID freep (LPTSTR *); LPTSTR stpcpy (LPTSTR, LPTSTR); BOOL IsValidPathName (LPCTSTR); BOOL IsValidFileName (LPCTSTR); +BOOL IsValidDirectory (LPCTSTR); BOOL FileGetString (HANDLE, LPTSTR, INT); -/* prototypes for MOVE.C */ +/* Prototypes for MOVE.C */ INT cmd_move (LPTSTR, LPTSTR); -/* prototypes from PATH.C */ +/* Prototypes from PATH.C */ INT cmd_path (LPTSTR, LPTSTR); -/* prototypes from PROMPT.C */ +/* Prototypes from PROMPT.C */ VOID PrintPrompt (VOID); INT cmd_prompt (LPTSTR, LPTSTR); -/* prototypes for REDIR.C */ +/* Prototypes for REDIR.C */ #define INPUT_REDIRECTION 1 #define OUTPUT_REDIRECTION 2 #define OUTPUT_APPEND 4 @@ -251,50 +291,48 @@ INT cmd_prompt (LPTSTR, LPTSTR); INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT); -/* prototypes for REN.C */ +/* Prototypes for REN.C */ INT cmd_rename (LPTSTR, LPTSTR); -/* prototypes for SET.C */ +/* Prototypes for SET.C */ INT cmd_set (LPTSTR, LPTSTR); -/* prototypes for TIME.C */ +/* Prototypes for TIME.C */ INT cmd_time (LPTSTR, LPTSTR); -/* prototypes for TYPE.C */ +/* Prototypes for TITLE.C */ +INT cmd_title (LPTSTR, LPTSTR); + + +/* Prototypes for TYPE.C */ INT cmd_type (LPTSTR, LPTSTR); -/* prototypes for VER.C */ +/* Prototypes for VER.C */ VOID ShortVersion (VOID); INT cmd_ver (LPTSTR, LPTSTR); -/* prototypes for VERIFY.C */ +/* Prototypes for VERIFY.C */ INT cmd_verify (LPTSTR, LPTSTR); -/* prototypes for VOL.C */ +/* Prototypes for VOL.C */ INT cmd_vol (LPTSTR, LPTSTR); -/* prototypes for WHERE.C */ -BOOL find_which (LPCTSTR, LPTSTR); +/* Prototypes for WHERE.C */ +BOOL SearchForExecutable (LPCTSTR, LPTSTR); /* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */ -int cmd_call(char *, char *); -int cmd_echo(char *, char *); -int cmd_for(char *, char *); -int cmd_goto(char *, char *); int cmd_if(char *, char *); int cmd_pause(char *, char *); int cmd_shift(char *, char *); -int cmd_beep(char *, char *); - - +#endif /* _CMD_H_INCLUDED_ */ diff --git a/rosapps/cmd/cmdinput.c b/rosapps/cmd/cmdinput.c index 6ac5302529d..e2021bbf455 100644 --- a/rosapps/cmd/cmdinput.c +++ b/rosapps/cmd/cmdinput.c @@ -88,14 +88,12 @@ * Unicode and redirection safe! * * 04-Feb-1999 (Eric Kohl ) - * Fixed input bug. A "line feed" character remined in the keyboard + * Fixed input bug. A "line feed" character remained in the keyboard * input queue when you pressed . This sometimes caused * some very strange effects. * Fixed some command line editing annoyances. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -121,11 +119,15 @@ ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy) { INT count; - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); for (count = 0; count < (INT)_tcslen (str); count++) ConOutChar (_T(' ')); +#ifndef __REACTOS__ _tcsnset (str, _T('\0'), maxlen); - goxy (orgx, orgy); +#else + memset (str, 0, maxlen * sizeof(TCHAR)); +#endif + SetCursorXY (orgx, orgy); } @@ -150,8 +152,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (bEcho) PrintPrompt(); - orgx = wherex (); - orgy = wherey (); + GetCursorXY (&orgx, &orgy); memset (str, 0, maxlen * sizeof (TCHAR)); @@ -171,29 +172,28 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { /* if at end of line */ str[current - 1] = _T('\0'); - if (wherex () != 0) + if (GetCursorX () != 0) { ConOutPrintf ("\b \b"); } else { - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); ConOutChar (_T(' ')); - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); } } else { for (count = current - 1; count < charcount; count++) str[count] = str[count + 1]; - if (wherex () != 0) - goxy ((SHORT)(wherex () - 1), wherey ()); + if (GetCursorX () != 0) + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); else - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); - curx = wherex (); - cury = wherey (); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + GetCursorXY (&curx, &cury); ConOutPrintf (_T("%s "), &str[current - 1]); - goxy (curx, cury); + SetCursorXY (curx, cury); } charcount--; current--; @@ -213,10 +213,9 @@ VOID ReadCommand (LPTSTR str, INT maxlen) for (count = current; count < charcount; count++) str[count] = str[count + 1]; charcount--; - curx = wherex (); - cury = wherey (); + GetCursorXY (&curx, &cury); ConOutPrintf (_T("%s "), &str[current]); - goxy (curx, cury); + SetCursorXY (curx, cury); } break; @@ -224,7 +223,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* goto beginning of string */ if (current != 0) { - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); current = 0; } break; @@ -233,7 +232,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* goto end of string */ if (current != charcount) { - goxy (orgx, orgy); + SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); current = charcount; } @@ -251,7 +250,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) charcount = _tcslen (str); current = charcount; - goxy(orgx, orgy); + SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) orgy--; @@ -262,15 +261,18 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (ShowCompletionMatches (str, charcount)) { PrintPrompt (); - orgx = wherex (); - orgy = wherey (); + GetCursorXY (&orgx, &orgy); ConOutPrintf (_T("%s"), str); } } } else { +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } #endif #ifdef FEATURE_4NT_FILENAME_COMPLETION @@ -330,15 +332,18 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current > 0) { current--; - if (wherex () == 0) - goxy ((SHORT)(maxx - 1), (SHORT)(wherey () - 1)); + if (GetCursorX () == 0) + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); else - goxy ((SHORT)(wherex () - 1), wherey ()); + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); } else { -// Beep (440, 100); +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } break; @@ -347,41 +352,47 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current != charcount) { current++; - if (wherex () == maxx - 1) - goxy (0, (SHORT)(wherey () + 1)); + if (GetCursorX () == maxx - 1) + SetCursorXY (0, (SHORT)(GetCursorY () + 1)); else - goxy ((SHORT)(wherex () + 1), wherey ()); + SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ()); } break; default: +#ifdef __REACTOS__ + ch = ir.Event.KeyEvent.AsciiChar; + if ((ch >= 32) && (charcount != (maxlen - 2))) + { +#else #ifdef _UNICODE ch = ir.Event.KeyEvent.uChar.UnicodeChar; #else ch = ir.Event.KeyEvent.uChar.AsciiChar; -#endif +#endif /* _UNICODE */ if ((ch >= 32 && ch <= 255) && (charcount != (maxlen - 2))) { +#endif /* __REACTOS__ */ /* insert character into string... */ if (bInsert && current != charcount) { for (count = charcount; count > current; count--) str[count] = str[count - 1]; str[current++] = ch; - if (wherex () == maxx - 1) + if (GetCursorX () == maxx - 1) { curx = 0; - cury = wherey () + 1; + cury = GetCursorY () + 1; } else { - curx = wherex () + 1; - cury = wherey (); + GetCursorXY (&curx, &cury); + curx++; } ConOutPrintf (_T("%s"), &str[current - 1]); if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) cury--; - goxy (curx, cury); + SetCursorXY (curx, cury); charcount++; } else @@ -397,8 +408,11 @@ VOID ReadCommand (LPTSTR str, INT maxlen) #if 0 else { -// Beep (440, 100); +#ifdef __REACTOS__ + Beep (440, 100); +#else MessageBeep (-1); +#endif } #endif break; diff --git a/rosapps/cmd/cmdtable.c b/rosapps/cmd/cmdtable.c index f2d8339dfce..9ef5c5d146f 100644 --- a/rosapps/cmd/cmdtable.c +++ b/rosapps/cmd/cmdtable.c @@ -17,8 +17,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -175,6 +173,10 @@ COMMAND cmds[] = {_T("time"), 0, cmd_time}, #endif +#ifdef INCLUDE_CMD_TITLE + {_T("title"), 0, cmd_title}, +#endif + #ifdef INCLUDE_CMD_TYPE {_T("type"), 0, cmd_type}, #endif diff --git a/rosapps/cmd/color.c b/rosapps/cmd/color.c index f5d086704db..322a0f43928 100644 --- a/rosapps/cmd/color.c +++ b/rosapps/cmd/color.c @@ -14,8 +14,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_COLOR diff --git a/rosapps/cmd/config.h b/rosapps/cmd/config.h index 1e214e276e4..9ed6362c77f 100644 --- a/rosapps/cmd/config.h +++ b/rosapps/cmd/config.h @@ -9,6 +9,15 @@ * */ +#define __REACTOS__ + +#ifndef _CONFIG_H_INCLUDED_ +#define _CONFIG_H_INCLUDED_ + +#ifndef __REACTOS__ +#define WIN32_LEAN_AND_MEAN +#endif /* __REACTOS__ */ + /* JPP 20 Jul 1998 - define DEBUG to add debugging code */ /*#define DEBUG */ @@ -38,22 +47,27 @@ /* Define one of these to select the used locale. */ /* (date and time formats etc.) used in DATE, TIME */ /* DIR and PROMPT. */ -#define LOCALE_WINDOWS /* System locale */ +#ifdef __REACTOS__ +#define LOCALE_DEFAULT +#else +#define LOCALE_WINDOWS /* System locale */ /* #define LOCALE_GERMAN */ /* German locale */ /* #define LOCALE_DEFAULT */ /* United States locale */ - +#endif #define INCLUDE_CMD_ATTRIB -//#define INCLUDE_CMD_BREAK +/*#define INCLUDE_CMD_BREAK*/ #define INCLUDE_CMD_CHCP #define INCLUDE_CMD_CHDIR #define INCLUDE_CMD_CLS #define INCLUDE_CMD_COLOR #define INCLUDE_CMD_COPY -//#define INCLUDE_CMD_CTTY +/*#define INCLUDE_CMD_CTTY*/ #define INCLUDE_CMD_DATE #define INCLUDE_CMD_DEL +#ifndef __REACTOS__ #define INCLUDE_CMD_DIR +#endif #define INCLUDE_CMD_LABEL #define INCLUDE_CMD_MKDIR #define INCLUDE_CMD_MOVE @@ -63,6 +77,7 @@ #define INCLUDE_CMD_RENAME #define INCLUDE_CMD_SET #define INCLUDE_CMD_TIME +#define INCLUDE_CMD_TITLE #define INCLUDE_CMD_TYPE #define INCLUDE_CMD_VER #define INCLUDE_CMD_REM @@ -84,3 +99,6 @@ shift */ + + +#endif /* _CONFIG_H_INCLUDED_ */ diff --git a/rosapps/cmd/console.c b/rosapps/cmd/console.c index c740f2a2ed7..37d028440d0 100644 --- a/rosapps/cmd/console.c +++ b/rosapps/cmd/console.c @@ -8,12 +8,13 @@ * started */ - - -#define WIN32_LEAN_AND_MEAN +#include "config.h" #include #include +#include +#include +#include #include "cmd.h" @@ -33,7 +34,7 @@ VOID DebugPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); OutputDebugString (szOut); @@ -134,7 +135,7 @@ VOID ConOutPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), szOut, _tcslen(szOut), &dwWritten, NULL); @@ -165,7 +166,7 @@ VOID ConErrPrintf (LPTSTR szFormat, ...) va_list arg_ptr; va_start (arg_ptr, szFormat); - wvsprintf (szOut, szFormat, arg_ptr); + _vstprintf (szOut, szFormat, arg_ptr); va_end (arg_ptr); WriteFile (GetStdHandle (STD_ERROR_HANDLE), szOut, _tcslen(szOut), &dwWritten, NULL); @@ -174,10 +175,7 @@ VOID ConErrPrintf (LPTSTR szFormat, ...) -/* - * goxy -- move the cursor on the screen. - */ -VOID goxy (SHORT x, SHORT y) +VOID SetCursorXY (SHORT x, SHORT y) { COORD coPos; @@ -187,7 +185,18 @@ VOID goxy (SHORT x, SHORT y) } -SHORT wherex (VOID) +VOID GetCursorXY (PSHORT x, PSHORT y) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi); + + *x = csbi.dwCursorPosition.X; + *y = csbi.dwCursorPosition.Y; +} + + +SHORT GetCursorX (VOID) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -197,7 +206,7 @@ SHORT wherex (VOID) } -SHORT wherey (VOID) +SHORT GetCursorY (VOID) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -229,45 +238,3 @@ VOID SetCursorType (BOOL bInsert, BOOL bVisible) SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci); } - - - -VOID InitializePageOut (VOID) -{ - sLineCount = 0; - - if (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == FILE_TYPE_CHAR) - { - bPageable = TRUE; - GetScreenSize (NULL, &sMaxLines); - } - else - { - bPageable = FALSE; - } -} - - -VOID TerminatePageOut (VOID) -{ - - -} - - - -int LinePageOut (LPTSTR szLine) -{ - ConOutPuts (szLine); - - if (bPageable) - { - sLineCount++; - if (sLineCount >= sMaxLines) - { - sLineCount = 0; - cmd_pause ("", ""); - } - } - return 0; -} diff --git a/rosapps/cmd/copy.c b/rosapps/cmd/copy.c index 16b561727d0..eac53d4d4de 100644 --- a/rosapps/cmd/copy.c +++ b/rosapps/cmd/copy.c @@ -18,8 +18,6 @@ * Replaced CRT io functions by Win32 io functions. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_COPY @@ -51,8 +49,8 @@ typedef struct tagFILES static BOOL DoSwitches (LPTSTR, LPDWORD); -static BOOL AddFile (LPFILES, char *, int *, int *, unsigned *); -static BOOL AddFiles (LPFILES, char *, int *, int *, int *, unsigned *); +static BOOL AddFile (LPFILES, char *, int *, int *, LPDWORD); +static BOOL AddFiles (LPFILES, char *, int *, int *, int *, LPDWORD); static BOOL GetDestination (LPFILES, LPFILES); static INT ParseCommand (LPFILES, int, char **, LPDWORD); static VOID DeleteFileList (LPFILES); @@ -60,7 +58,8 @@ static INT Overwrite (LPTSTR); -static BOOL IsDirectory (LPTSTR fn) +static BOOL +IsDirectory (LPTSTR fn) { if (!IsValidFileName (fn)) return FALSE; @@ -68,7 +67,8 @@ static BOOL IsDirectory (LPTSTR fn) } -static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) +static BOOL +DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) { if (!_tcsicmp (arg, _T("/-Y"))) { @@ -112,7 +112,7 @@ static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags) static BOOL -AddFile (LPFILES f, char *arg, int *source, int *dest, unsigned *flags) +AddFile (LPFILES f, char *arg, int *source, int *dest, LPDWORD flags) { if (*dest) { @@ -145,7 +145,7 @@ AddFile (LPFILES f, char *arg, int *source, int *dest, unsigned *flags) static BOOL AddFiles (LPFILES f, char *arg, int *source, int *dest, - int *count, unsigned *flags) + int *count, LPDWORD flags) { char t[128]; int j; @@ -202,7 +202,8 @@ AddFiles (LPFILES f, char *arg, int *source, int *dest, } -static BOOL GetDestination (LPFILES f, LPFILES dest) +static BOOL +GetDestination (LPFILES f, LPFILES dest) { LPFILES p; LPFILES start = f; diff --git a/rosapps/cmd/date.c b/rosapps/cmd/date.c index e2712366d85..24b271dd0df 100644 --- a/rosapps/cmd/date.c +++ b/rosapps/cmd/date.c @@ -28,8 +28,6 @@ * Fixed date input bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DATE @@ -52,7 +50,7 @@ static WORD awMonths[2][13] = static VOID PrintDate (VOID) { -#if 0 +#ifdef __REACTOS__ SYSTEMTIME st; GetLocalTime (&st); @@ -75,12 +73,13 @@ PrintDate (VOID) aszDayNames[st.wDayOfWeek], st.wYear, cDateSeparator, st.wMonth, cDateSeparator, st.wDay); break; } -#endif +#else TCHAR szDate[32]; GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, szDate, sizeof (szDate)); ConOutPrintf (_T("Current date is: %s\n"), szDate); +#endif } @@ -195,7 +194,7 @@ ParseDate (LPTSTR s) break; } - /* if only entered two digits: + /* if only entered two digits: */ /* assume 2000's if value less than 80 */ /* assume 1900's if value greater or equal 80 */ if (d.wYear <= 99) diff --git a/rosapps/cmd/del.c b/rosapps/cmd/del.c index c249670c472..2095ac414be 100644 --- a/rosapps/cmd/del.c +++ b/rosapps/cmd/del.c @@ -25,8 +25,6 @@ * First working version. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DEL @@ -35,6 +33,7 @@ #include #include #include +#include #include "cmd.h" @@ -97,6 +96,8 @@ static INT Prompt (LPTSTR str) else if (*p == _T('\03')) return PROMPT_BREAK; #endif + + return PROMPT_NO; } diff --git a/rosapps/cmd/dir.c b/rosapps/cmd/dir.c index c56d8470bb3..19c7c7b83a4 100644 --- a/rosapps/cmd/dir.c +++ b/rosapps/cmd/dir.c @@ -106,10 +106,11 @@ * * 20-Jan-1999 (Eric Kohl ) * Redirection safe! + * + * 01-Mar-1999 (Eric Kohl ) + * Replaced all runtime io functions by their Win32 counterparts. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_DIR @@ -119,15 +120,9 @@ #include #include -#include - #include "cmd.h" -/* useful macro */ -#define MEM_ERR error_out_of_memory(); return 1; - - /* flag definitions */ /* Changed hex to decimal, hex wouldn't work * if > 8, Rob Lake 06/17/98. @@ -148,9 +143,9 @@ enum /* Globally save the # of dirs, files and bytes, * probabaly later pass them to functions. Rob Lake */ -long recurse_dir_cnt; -long recurse_file_cnt; -ULARGE_INTEGER recurse_bytes; +static ULONG recurse_dir_cnt; +static ULONG recurse_file_cnt; +static ULARGE_INTEGER recurse_bytes; /* @@ -161,7 +156,6 @@ ULARGE_INTEGER recurse_bytes; */ static VOID Help (VOID) { -#if 1 ConOutPuts (_T("Displays a list of files and subdirectories in a directory.\n" "\n" "DIR [drive:][path][filename] [/A] [/B] [/L] [/N] [/S] [/P] [/W] [/4]\n" @@ -183,43 +177,18 @@ static VOID Help (VOID) "of the - (hyphen) can turn off defined swtiches. Ex. /-W would\n" "turn off printing in wide format.\n" )); -#endif -#if 0 - InitializePageOut (); - LinePageOut (_T("Displays a list of files and subdirectories in a directory.")); - LinePageOut (_T("")); - LinePageOut (_T("DIR [drive:][path][filename] [/A] [/B] [/L] [/N] [/S] [/P] [/W] [/4]")); - LinePageOut (_T("")); - LinePageOut (_T(" [drive:][path][filename]")); - LinePageOut (_T(" Specifies drive, directory, and/or files to list.")); - LinePageOut (_T("")); - LinePageOut (_T(" /A Displays files with HIDDEN SYSTEM attributes")); - LinePageOut (_T(" default is ARCHIVE and READ ONLY")); - LinePageOut (_T(" /B Uses bare format (no heading information or summary).")); - LinePageOut (_T(" /L Uses lowercase.")); - LinePageOut (_T(" /N New long list format where filenames are on the far right.")); - LinePageOut (_T(" /S Displays files in specified directory and all subdirectories")); - LinePageOut (_T(" /P Pauses after each screen full")); - LinePageOut (_T(" /W Prints in wide format")); - LinePageOut (_T(" /4 Display four digit years.")); - LinePageOut (_T("")); - LinePageOut (_T("Switches may be present in the DIRCMD environment variable. Use")); - LinePageOut (_T("of the - (hyphen) can turn off defined swtiches. Ex. /-W would")); - LinePageOut (_T("turn off printing in wide format.")); - TerminatePageOut (); -#endif } /* - * dir_read_param + * DirReadParam * * read the parameters from the command line */ static BOOL -DirReadParam (char *line, char **param, LPDWORD lpFlags) +DirReadParam (LPTSTR line, LPTSTR *param, LPDWORD lpFlags) { - int slash = 0; + INT slash = 0; if (!line) return TRUE; @@ -340,50 +309,35 @@ DirReadParam (char *line, char **param, LPDWORD lpFlags) /* - * extend_file + * ExtendFilespec * * extend the filespec, possibly adding wildcards */ -void extend_file (char **file) +static VOID +ExtendFilespec (LPTSTR file) { - LPTSTR tmp; - - if (!*file) + if (!file) return; /* if no file spec, change to "*.*" */ - if (!**file) + if (*file == _T('\0')) { - free (*file); - *file = _tcsdup (_T("*.*")); + _tcscpy (file, _T("*.*")); return; } /* if starts with . add * in front */ - if (**file == _T('.')) + if (*file == _T('.')) { - tmp = malloc ((_tcslen (*file) + 2) * sizeof(TCHAR)); - if (tmp) - { - *tmp = _T('*'); - _tcscpy (&tmp[1], *file); - } - free (*file); - *file = tmp; + memmove (&file[1], &file[0], (_tcslen (file) + 1) * sizeof(TCHAR)); + file[0] = _T('*'); return; } /* if no . add .* */ - if (!_tcschr (*file, _T('.'))) + if (!_tcschr (file, _T('.'))) { - tmp = malloc ((_tcslen (*file) + 3) * sizeof(TCHAR)); - if (tmp) - { - _tcscpy (tmp, *file); - _tcscat (tmp, _T(".*")); - } - free (*file); - *file = tmp; + _tcscat (file, _T(".*")); return; } } @@ -394,65 +348,55 @@ void extend_file (char **file) * * split the pathspec into drive, directory, and filespec */ -static int -DirParsePathspec (char *pathspec, int *drive, char **dir, char **file) +static INT +DirParsePathspec (LPTSTR szPathspec, LPTSTR szPath, LPTSTR szFilespec) { - TCHAR orig_dir[MAX_PATH]; + TCHAR szOrigPath[MAX_PATH]; LPTSTR start; LPTSTR tmp; INT i; - INT wildcards = 0; + BOOL bWildcards = FALSE; + GetCurrentDirectory (MAX_PATH, szOrigPath); /* get the drive and change to it */ - if (pathspec[1] == _T(':')) + if (szPathspec[1] == _T(':')) { - *drive = _totupper (pathspec[0]) - _T('@'); - start = pathspec + 2; - _chdrive (*drive); + TCHAR szRootPath[] = _T("A:"); + + szRootPath[0] = szPathspec[0]; + start = szPathspec + 2; + SetCurrentDirectory (szRootPath); } else { - *drive = _getdrive (); - start = pathspec; + start = szPathspec; } - GetCurrentDirectory (MAX_PATH, orig_dir); /* check for wildcards */ - for (i = 0; pathspec[i]; i++) - if (pathspec[i] == _T('*') || pathspec[i] == _T('?')) - wildcards = 1; + for (i = 0; szPathspec[i]; i++) + { + if (szPathspec[i] == _T('*') || szPathspec[i] == _T('?')) + bWildcards = TRUE; + } /* check if this spec is a directory */ - if (!wildcards) + if (!bWildcards) { - if (chdir(pathspec) == 0) + if (SetCurrentDirectory (szPathspec)) { - *file = _tcsdup (_T("*.*")); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, _T("*.*")); - tmp = getcwd (NULL, MAX_PATH); - if (!tmp) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - chdir (orig_dir); - MEM_ERR + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; } - *dir = _tcsdup (&tmp[2]); - free (tmp); - if (!*dir) - { - free (*file); - chdir (orig_dir); - MEM_ERR - } - - chdir (orig_dir); + SetCurrentDirectory (szOrigPath); return 0; } } @@ -463,69 +407,50 @@ DirParsePathspec (char *pathspec, int *drive, char **dir, char **file) /* if no path is specified */ if (!tmp) { - *file = _tcsdup (start); - extend_file (file); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, start); + ExtendFilespec (szFilespec); - tmp = getcwd (NULL, _MAX_PATH); - if (!tmp) - { - free (*file); - chdir (orig_dir); - MEM_ERR - } - *dir = _tcsdup (&tmp[2]); - free(tmp); - if (!*dir) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - chdir (orig_dir); - MEM_ERR + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; } + SetCurrentDirectory (szOrigPath); return 0; } /* get the filename */ - *file = _tcsdup (tmp + 1); - extend_file (file); - if (!*file) - { - MEM_ERR - } + _tcscpy (szFilespec, tmp+1); + ExtendFilespec (szFilespec); - *tmp = 0; + *tmp = _T('\0'); /* change to this directory and get its full name */ - if (chdir (start) < 0) + if (!SetCurrentDirectory (start)) { - error_path_not_found (); *tmp = _T('\\'); - free (*file); - chdir (orig_dir); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); return 1; } - tmp = getcwd (NULL, _MAX_PATH); - if (!tmp) + if (!GetCurrentDirectory (MAX_PATH, szPath)) { - free (*file); - MEM_ERR - } - *dir = _tcsdup (&tmp[2]); - free(tmp); - if (!*dir) - { - free(*file); - MEM_ERR + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory (); + return 1; } *tmp = _T('\\'); - chdir(orig_dir); + SetCurrentDirectory (szOrigPath); + return 0; } @@ -550,16 +475,16 @@ Pause (VOID) * increment our line if paginating, display message at end of screen */ static INT -incline (int *line, DWORD dwFlags) +IncLine (LPINT pLine, DWORD dwFlags) { if (!(dwFlags & DIR_PAGE)) return 0; - (*line)++; + (*pLine)++; - if (*line >= (int)maxy - 2) + if (*pLine >= (int)maxy - 2) { - *line = 0; + *pLine = 0; return Pause (); } @@ -573,7 +498,7 @@ incline (int *line, DWORD dwFlags) * print the header for the dir command */ static BOOL -PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) +PrintDirectoryHeader (LPTSTR szPath, LPINT pLine, DWORD dwFlags) { TCHAR szRootName[] = _T("A:\\"); TCHAR szVolName[80]; @@ -583,7 +508,7 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) return TRUE; /* get the media ID of the drive */ - szRootName[0] = drive + _T('@'); + szRootName[0] = szPath[0]; if (!GetVolumeInformation (szRootName, szVolName, 80, &dwSerialNr, NULL, NULL, NULL, 0)) { @@ -599,13 +524,13 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) else ConOutPrintf (_T(" has no label\n")); - if (incline (line, dwFlags) != 0) + if (IncLine (pLine, dwFlags)) return FALSE; /* print the volume serial number if the return was successful */ ConOutPrintf (_T(" Volume Serial Number is %04X-%04X\n"), HIWORD(dwSerialNr), LOWORD(dwSerialNr)); - if (incline (line, dwFlags) != 0) + if (IncLine (pLine, dwFlags)) return FALSE; return TRUE; @@ -618,7 +543,7 @@ PrintDirectoryHeader (int drive, int *line, DWORD dwFlags) * insert commas into a number */ static INT -ConvertLong (LONG num, LPTSTR des, INT len) +ConvertULong (ULONG num, LPTSTR des, INT len) { TCHAR temp[32]; INT c = 0; @@ -690,16 +615,17 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) { case 0: /* mmddyy */ default: - ConOutPrintf ("%.2d%c%.2d%c%d", dt->wMonth, cDateSeparator, dt->wDay, cDateSeparator, wYear); + ConOutPrintf (_T("%.2d%c%.2d%c%d"), + dt->wMonth, cDateSeparator, dt->wDay, cDateSeparator, wYear); break; case 1: /* ddmmyy */ - ConOutPrintf ("%.2d%c%.2d%c%d", + ConOutPrintf (_T("%.2d%c%.2d%c%d"), dt->wDay, cDateSeparator, dt->wMonth, cDateSeparator, wYear); break; case 2: /* yymmdd */ - ConOutPrintf ("%d%c%.2d%c%.2d", + ConOutPrintf (_T("%d%c%.2d%c%.2d"), wYear, cDateSeparator, dt->wMonth, cDateSeparator, dt->wDay); break; } @@ -708,14 +634,14 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) { case 0: /* 12 hour format */ default: - ConOutPrintf (" %2d%c%.2u%c", + ConOutPrintf (_T(" %2d%c%.2u%c"), (dt->wHour == 0 ? 12 : (dt->wHour <= 12 ? dt->wHour : dt->wHour - 12)), cTimeSeparator, dt->wMinute, (dt->wHour <= 11 ? 'a' : 'p')); break; case 1: /* 24 hour format */ - ConOutPrintf (" %2d%c%.2u", + ConOutPrintf (_T(" %2d%c%.2u"), dt->wHour, cTimeSeparator, dt->wMinute); break; } @@ -729,33 +655,33 @@ PrintFileDateTime (LPSYSTEMTIME dt, DWORD dwFlags) * */ static INT -PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, - DWORD flags, int *line) +PrintSummary (LPTSTR szPath, ULONG ulFiles, ULONG ulDirs, ULARGE_INTEGER bytes, + LPINT pLine, DWORD dwFlags) { TCHAR buffer[64]; - if (flags & DIR_BARE) + if (dwFlags & DIR_BARE) return 0; /* print number of files and bytes */ - ConvertLong (files, buffer, sizeof(buffer)); + ConvertULong (ulFiles, buffer, sizeof(buffer)); ConOutPrintf (_T(" %6s File%c"), - buffer, files == 1 ? _T(' ') : _T('s')); + buffer, ulFiles == 1 ? _T(' ') : _T('s')); ConvertULargeInteger (bytes, buffer, sizeof(buffer)); ConOutPrintf (_T(" %15s byte%c\n"), buffer, bytes.QuadPart == 1 ? _T(' ') : _T('s')); - if (incline (line, flags) != 0) + if (IncLine (pLine, dwFlags)) return 1; /* print number of dirs and bytes free */ - ConvertLong (dirs, buffer, sizeof(buffer)); + ConvertULong (ulDirs, buffer, sizeof(buffer)); ConOutPrintf (_T(" %6s Dir%c"), - buffer, files == 1 ? _T(' ') : _T('s')); + buffer, ulDirs == 1 ? _T(' ') : _T('s')); - if (!(flags & DIR_RECURSE)) + if (!(dwFlags & DIR_RECURSE)) { ULARGE_INTEGER uliFree; TCHAR szRoot[] = _T("A:\\"); @@ -764,14 +690,14 @@ PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, DWORD dwFreeCl; DWORD dwTotCl; - szRoot[0] = drive + _T('@'); + szRoot[0] = szPath[0]; GetDiskFreeSpace (szRoot, &dwSecPerCl, &dwBytPerSec, &dwFreeCl, &dwTotCl); - uliFree.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; + uliFree.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; ConvertULargeInteger (uliFree, buffer, sizeof(buffer)); ConOutPrintf (_T(" %15s bytes free\n"), buffer); } - if (incline (line, flags) != 0) + if (IncLine (pLine, dwFlags)) return 1; return 0; @@ -783,39 +709,37 @@ PrintSummary (int drive, long files, long dirs, ULARGE_INTEGER bytes, * * list the files in the directory */ -static int -dir_list (int drive, char *directory, char *filespec, int *line, - DWORD flags) +static INT +DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) { - char pathspec[_MAX_PATH], - *ext, - buffer[32]; - WIN32_FIND_DATA file; - ULARGE_INTEGER bytecount; - long filecount = 0, - dircount = 0; - int count; - FILETIME ft; - SYSTEMTIME dt; - HANDLE hFile; - - bytecount.QuadPart = 0; - - if (directory[strlen(directory) - 1] == '\\') - wsprintf(pathspec, "%c:%s%s", drive + '@', directory, filespec); - else - wsprintf(pathspec, "%c:%s\\%s", drive + '@', directory, filespec); - - hFile = FindFirstFile (pathspec, &file); + TCHAR szFullPath[MAX_PATH]; + WIN32_FIND_DATA file; + ULARGE_INTEGER bytecount; + FILETIME ft; + SYSTEMTIME dt; + HANDLE hFile; + TCHAR buffer[32]; + ULONG filecount = 0; + ULONG dircount = 0; + INT count; + + bytecount.QuadPart = 0; + + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscat (szFullPath, szFilespec); + + hFile = FindFirstFile (szFullPath, &file); if (hFile == INVALID_HANDLE_VALUE) { /* Don't want to print anything if scanning recursively * for a file. RL */ - if ((flags & DIR_RECURSE) == 0) + if ((dwFlags & DIR_RECURSE) == 0) { - error_file_not_found(); - incline(line, flags); + error_file_not_found (); + IncLine (pLine, dwFlags); FindClose (hFile); return 1; } @@ -823,205 +747,212 @@ dir_list (int drive, char *directory, char *filespec, int *line, return 0; } - /* moved down here because if we are recursively searching and - * don't find any files, we don't want just to print - * Directory of C:\SOMEDIR - * with nothing else - * Rob Lake 06/13/98 - */ - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf (" Directory of %c:%s\n", drive + '@', directory); - if (incline(line, flags) != 0) - return 1; - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - } - - /* For counting columns of output */ - count = 0; - - do - { - /* next file, if user doesn't want all files */ - if (!(flags & DIR_ALL) && - ((file.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || - (file.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))) - continue; - - /* begin Rob Lake */ - if (flags & DIR_LWR) + /* moved down here because if we are recursively searching and + * don't find any files, we don't want just to print + * Directory of C:\SOMEDIR + * with nothing else + * Rob Lake 06/13/98 + */ + if ((dwFlags & DIR_BARE) == 0) { - strlwr(file.cAlternateFileName); + ConOutPrintf (_T(" Directory of %s\n"), szPath); + if (IncLine (pLine, dwFlags)) + return 1; + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; } - if (flags & DIR_WIDE && (flags & DIR_BARE) == 0) - { - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (file.cAlternateFileName[0] == '\0') - wsprintf (buffer, _T("[%s]"), file.cFileName); - else - wsprintf (buffer, _T("[%s]"), file.cAlternateFileName); - dircount++; - } - else - { - if (file.cAlternateFileName[0] == '\0') - wsprintf (buffer, _T("%s"), file.cFileName); - else - wsprintf (buffer, _T("%s"), file.cAlternateFileName); - filecount++; - } - ConOutPrintf (_T("%-15s"), buffer); - count++; - if (count == 5) - { - /* output 5 columns */ - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - count = 0; - } - - /* FIXME: this is buggy - now overflow check */ - bytecount.LowPart += file.nFileSizeLow; - bytecount.HighPart += file.nFileSizeHigh; - - /* next block 06/17/98 */ - } - else if (flags & DIR_BARE) - { - if (strcmp(file.cFileName, ".") == 0 || - strcmp(file.cFileName, "..") == 0) - continue; - - if (flags & DIR_RECURSE) - { - TCHAR dir[MAX_PATH]; - wsprintf (dir, _T("%c:%s\\"), drive + _T('@'), directory); - if (flags & DIR_LWR) - strlwr(dir); - ConOutPrintf (dir); - } - ConOutPrintf (_T("%-13s\n"), file.cFileName); - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - dircount++; - else - filecount++; - if (incline(line, flags) != 0) - return 1; - - /* FIXME: this is buggy - no overflow check */ - bytecount.LowPart += file.nFileSizeLow; - bytecount.HighPart += file.nFileSizeHigh; - } - else - { - /* end Rob Lake */ - if (flags & DIR_NEW) - { - /* print file date and time */ - if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) - { - FileTimeToSystemTime (&ft, &dt); - PrintFileDateTime (&dt, flags); - } + /* For counting columns of output */ + count = 0; - /* print file size */ - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + do + { + /* next file, if user doesn't want all files */ + if (!(dwFlags & DIR_ALL) && + ((file.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || + (file.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))) + continue; + + if (dwFlags & DIR_LWR) { - ConOutPrintf (" "); - dircount++; + _tcslwr (file.cAlternateFileName); } - else + + if (dwFlags & DIR_WIDE && (dwFlags & DIR_BARE) == 0) { ULARGE_INTEGER uliSize; - uliSize.LowPart = file.nFileSizeLow; - uliSize.HighPart = file.nFileSizeHigh; + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (file.cAlternateFileName[0] == _T('\0')) + wsprintf (buffer, _T("[%s]"), file.cFileName); + else + wsprintf (buffer, _T("[%s]"), file.cAlternateFileName); + dircount++; + } + else + { + if (file.cAlternateFileName[0] == _T('\0')) + wsprintf (buffer, _T("%s"), file.cFileName); + else + wsprintf (buffer, _T("%s"), file.cAlternateFileName); + filecount++; + } - ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); - ConOutPrintf (_T(" %20s"), buffer); + ConOutPrintf (_T("%-15s"), buffer); + count++; + if (count == 5) + { + /* output 5 columns */ + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; + count = 0; + } + uliSize.u.LowPart += file.nFileSizeLow; + uliSize.u.HighPart += file.nFileSizeHigh; bytecount.QuadPart += uliSize.QuadPart; - filecount++; } - - /* print long filename */ - ConOutPrintf (" %s\n", file.cFileName); - } - else - { - if (file.cFileName[0] == '.') - ConOutPrintf ("%-13s ", file.cFileName); - else if (file.cAlternateFileName[0] == '\0') + else if (dwFlags & DIR_BARE) { - char szShortName[13]; - strncpy (szShortName, file.cFileName, 13); - ext = strchr(szShortName, '.'); - if (!ext) - ext = ""; - else - *ext++ = 0; - ConOutPrintf ("%-8s %-3s ", szShortName, ext); - } - else - { - ext = strchr(file.cAlternateFileName, '.'); - if (!ext) - ext = ""; - else - *ext++ = 0; - ConOutPrintf ("%-8s %-3s ", file.cAlternateFileName, ext); - } + ULARGE_INTEGER uliSize; - /* print file size */ - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - ConOutPrintf ("%-14s", ""); - dircount++; + if (_tcscmp (file.cFileName, _T(".")) == 0 || + _tcscmp (file.cFileName, _T("..")) == 0) + continue; + + if (dwFlags & DIR_RECURSE) + { + TCHAR dir[MAX_PATH]; + + _tcscpy (dir, szPath); + _tcscat (dir, _T("\\")); + if (dwFlags & DIR_LWR) + _tcslwr (dir); + ConOutPrintf (dir); + } + + ConOutPrintf (_T("%-13s\n"), file.cFileName); + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + dircount++; + else + filecount++; + if (IncLine (pLine, dwFlags)) + return 1; + + uliSize.u.LowPart += file.nFileSizeLow; + uliSize.u.HighPart += file.nFileSizeHigh; + bytecount.QuadPart += uliSize.QuadPart; } else { - ULARGE_INTEGER uliSize; + if (dwFlags & DIR_NEW) + { + /* print file date and time */ + if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) + { + FileTimeToSystemTime (&ft, &dt); + PrintFileDateTime (&dt, dwFlags); + } - uliSize.LowPart = file.nFileSizeLow; - uliSize.HighPart = file.nFileSizeHigh; + /* print file size */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + ConOutPrintf (_T(" ")); + dircount++; + } + else + { + ULARGE_INTEGER uliSize; - ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); - ConOutPrintf (_T(" %10s "), buffer); + uliSize.u.LowPart = file.nFileSizeLow; + uliSize.u.HighPart = file.nFileSizeHigh; - bytecount.QuadPart += uliSize.QuadPart; - filecount++; - } + ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); + ConOutPrintf (_T(" %20s"), buffer); - /* print file date and time */ - if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) - { - FileTimeToSystemTime (&ft, &dt); - PrintFileDateTime (&dt, flags); - } + bytecount.QuadPart += uliSize.QuadPart; + filecount++; + } + + /* print long filename */ + ConOutPrintf (_T(" %s\n"), file.cFileName); + } + else + { + if (file.cFileName[0] == _T('.')) + ConOutPrintf (_T("%-13s "), file.cFileName); + else if (file.cAlternateFileName[0] == _T('\0')) + { + TCHAR szShortName[13]; + LPTSTR ext; + + _tcsncpy (szShortName, file.cFileName, 13); + ext = _tcschr (szShortName, _T('.')); + if (!ext) + ext = _T(""); + else + *ext++ = _T('\0'); + ConOutPrintf (_T("%-8s %-3s "), szShortName, ext); + } + else + { + LPTSTR ext; + + ext = _tcschr (file.cAlternateFileName, _T('.')); + if (!ext) + ext = _T(""); + else + *ext++ = _T('\0'); + ConOutPrintf (_T("%-8s %-3s "), file.cAlternateFileName, ext); + } + + /* print file size */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + ConOutPrintf ("%-14s", ""); + dircount++; + } + else + { + ULARGE_INTEGER uliSize; - /* print long filename */ - ConOutPrintf (" %s\n", file.cFileName); - } + uliSize.u.LowPart = file.nFileSizeLow; + uliSize.u.HighPart = file.nFileSizeHigh; - if (incline(line, flags) != 0) - return 1; - } - } - while (FindNextFile (hFile, &file)); + ConvertULargeInteger (uliSize, buffer, sizeof(buffer)); + ConOutPrintf (_T(" %10s "), buffer); - FindClose (hFile); + bytecount.QuadPart += uliSize.QuadPart; + filecount++; + } + + /* print file date and time */ + if (FileTimeToLocalFileTime (&file.ftLastWriteTime, &ft)) + { + FileTimeToSystemTime (&ft, &dt); + PrintFileDateTime (&dt, dwFlags); + } + + /* print long filename */ + ConOutPrintf (" %s\n", file.cFileName); + } + + if (IncLine (pLine, dwFlags)) + return 1; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); /* Rob Lake, need to make clean output */ /* JPP 07/08/1998 added check for count != 0 */ - if ((flags & DIR_WIDE) && (count != 0)) + if ((dwFlags & DIR_WIDE) && (count != 0)) { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) return 1; } @@ -1031,9 +962,8 @@ dir_list (int drive, char *directory, char *filespec, int *line, recurse_file_cnt += filecount; recurse_bytes.QuadPart += bytecount.QuadPart; - /* The code that was here is now in print_summary */ - if (PrintSummary (drive, filecount, dircount, - bytecount, flags, line) != 0) + /* print_summary */ + if (PrintSummary (szPath, filecount, dircount, bytecount, pLine, dwFlags)) return 1; } else @@ -1049,104 +979,102 @@ dir_list (int drive, char *directory, char *filespec, int *line, /* * _Read_Dir: Actual function that does recursive listing */ -static int -Read_Dir (int drive, char *parent, char *filespec, int *lines, - DWORD flags) +static INT +DirRead (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) { - char fullpath[_MAX_PATH]; - WIN32_FIND_DATA file; - HANDLE hFile; - - strcpy (fullpath, parent); - strcat (fullpath, "\\"); - strcat (fullpath, filespec); - - hFile = FindFirstFile (fullpath, &file); - if (hFile == INVALID_HANDLE_VALUE) - return 1; - - do - { - /* don't list "." and ".." */ - if (strcmp (file.cFileName, ".") == 0 || - strcmp (file.cFileName, "..") == 0) - continue; - - if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (dir_list(drive, file.cFileName, filespec, lines, flags) != 0) - { - FindClose (hFile); - return 1; - } - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf ("\n"); - if (incline(lines, flags) != 0) - return 1; - } - if (Read_Dir(drive, file.cFileName, filespec, lines, flags) == 1) - { - FindClose (hFile); - return 1; - } - } - } - while (FindNextFile (hFile, &file)); - - if (!FindClose (hFile)) - return 1; - - return 0; + TCHAR szFullPath[MAX_PATH]; + WIN32_FIND_DATA file; + HANDLE hFile; + + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen (szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscat (szFullPath, szFilespec); + + hFile = FindFirstFile (szFullPath, &file); + if (hFile == INVALID_HANDLE_VALUE) + return 1; + + do + { + /* don't list "." and ".." */ + if (_tcscmp (file.cFileName, _T(".")) == 0 || + _tcscmp (file.cFileName, _T("..")) == 0) + continue; + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (DirList (file.cFileName, szFilespec, pLine, dwFlags)) + { + FindClose (hFile); + return 1; + } + + if ((dwFlags & DIR_BARE) == 0) + { + ConOutPrintf ("\n"); + if (IncLine (pLine, dwFlags) != 0) + return 1; + } + + if (DirRead (file.cFileName, szFilespec, pLine, dwFlags) == 1) + { + FindClose (hFile); + return 1; + } + } + } + while (FindNextFile (hFile, &file)); + + if (!FindClose (hFile)) + return 1; + + return 0; } /* * do_recurse: Sets up for recursive directory listing */ -static int -do_recurse(int drive, char *directory, char *filespec, - int *line, DWORD flags) +static INT +DirRecurse (LPTSTR szPath, LPTSTR szSpec, LPINT pLine, DWORD dwFlags) { - char cur_dir[_MAX_DIR]; + recurse_dir_cnt = 0L; + recurse_file_cnt = 0L; + recurse_bytes.QuadPart = 0; - recurse_dir_cnt = recurse_file_cnt = 0L; - recurse_bytes.QuadPart = 0; + if (!PrintDirectoryHeader (szPath, pLine, dwFlags)) + return 1; - _chdrive (drive); - getcwd(cur_dir, sizeof(cur_dir)); + if (DirList (szPath, szSpec, pLine, dwFlags)) + return 1; - if (chdir(directory) == -1) - return 1; + if ((dwFlags & DIR_BARE) == 0) + { + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) + return 1; + } - if (!PrintDirectoryHeader (drive, line, flags)) + if (DirRead (szPath, szSpec, pLine, dwFlags)) return 1; - if (dir_list(drive, directory, filespec, line, flags) != 0) - return 1; - if ((flags & DIR_BARE) == 0) - { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) - return 1; - } - if (Read_Dir(drive, directory, filespec, line, flags) != 0) - return 1; - if ((flags & DIR_BARE) == 0) - ConOutPrintf ("Total files listed:\n"); - flags &= ~DIR_RECURSE; - - if (PrintSummary (drive, recurse_file_cnt, - recurse_dir_cnt, recurse_bytes, flags, line) != 0) + if ((dwFlags & DIR_BARE) == 0) + ConOutPrintf (_T("Total files listed:\n")); + + dwFlags &= ~DIR_RECURSE; + + if (PrintSummary (szPath, recurse_file_cnt, + recurse_dir_cnt, recurse_bytes, pLine, dwFlags)) return 1; - if ((flags & DIR_BARE) == 0) + if ((dwFlags & DIR_BARE) == 0) { - ConOutPrintf ("\n"); - if (incline(line, flags) != 0) + ConOutPrintf (_T("\n")); + if (IncLine (pLine, dwFlags)) return 1; } - chdir(cur_dir); + return 0; } @@ -1158,15 +1086,12 @@ do_recurse(int drive, char *directory, char *filespec, */ INT cmd_dir (LPTSTR first, LPTSTR rest) { - DWORD dwFlags = DIR_NEW | DIR_FOUR; - char *param; - TCHAR dircmd[256]; - int line = 0; - int drive, - orig_drive; - char *directory, - *filespec, - orig_dir[_MAX_DIR]; + DWORD dwFlags = DIR_NEW | DIR_FOUR; + TCHAR dircmd[256]; + TCHAR szPath[MAX_PATH]; + TCHAR szFilespec[MAX_PATH]; + LPTSTR param; + INT nLine = 0; /* read the parameters from the DIRCMD environment variable */ @@ -1184,39 +1109,26 @@ INT cmd_dir (LPTSTR first, LPTSTR rest) if (!param) param = "."; - if (strchr(param, '/')) - param = strtok (param, "/"); - - /* save the current directory info */ - orig_drive = _getdrive (); - getcwd(orig_dir, sizeof(orig_dir)); + if (_tcschr (param, _T('/'))) + param = _tcstok (param, _T("/")); /* parse the directory info */ - if (DirParsePathspec (param, &drive, &directory, &filespec) != 0) - { - _chdrive (orig_drive); - chdir(orig_dir); + if (DirParsePathspec (param, szPath, szFilespec)) return 1; - } if (dwFlags & DIR_RECURSE) { - incline(&line, dwFlags); - if (do_recurse (drive, directory, filespec, &line, dwFlags) != 0) + IncLine (&nLine, dwFlags); + if (DirRecurse (szPath, szFilespec, &nLine, dwFlags)) return 1; - _chdrive (orig_drive); - chdir (orig_dir); return 0; } /* print the header */ - if (!PrintDirectoryHeader (drive, &line, dwFlags)) + if (!PrintDirectoryHeader (szPath, &nLine, dwFlags)) return 1; - chdir (orig_dir); - _chdrive (orig_drive); - - if (dir_list (drive, directory, filespec, &line, dwFlags) != 0) + if (DirList (szPath, szFilespec, &nLine, dwFlags)) return 1; return 0; diff --git a/rosapps/cmd/dirstack.c b/rosapps/cmd/dirstack.c index 5c00c21d609..04c1cf97c15 100644 --- a/rosapps/cmd/dirstack.c +++ b/rosapps/cmd/dirstack.c @@ -11,8 +11,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_DIRECTORY_STACK diff --git a/rosapps/cmd/echo.c b/rosapps/cmd/echo.c index 9d85c5ffe24..0e0f51293e6 100644 --- a/rosapps/cmd/echo.c +++ b/rosapps/cmd/echo.c @@ -20,8 +20,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/rosapps/cmd/error.c b/rosapps/cmd/error.c index d89fe3132c6..2887cb8c8f2 100644 --- a/rosapps/cmd/error.c +++ b/rosapps/cmd/error.c @@ -17,12 +17,11 @@ * Use FormatMessage() for error reports. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include +#include #include #include "cmd.h" @@ -53,10 +52,10 @@ VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) return; va_start (arg_ptr, szFormat); - wvsprintf (szMessage, szFormat, arg_ptr); + _vstprintf (szMessage, szFormat, arg_ptr); va_end (arg_ptr); -#if 1 +#ifndef __REACTOS__ if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), @@ -69,7 +68,6 @@ VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) else { ConErrPrintf (_T("Unknown error! Error code: 0x%lx\n"), dwErrorCode); -// ConErrPrintf (_T("No error message available!\n")); return; } diff --git a/rosapps/cmd/filecomp.c b/rosapps/cmd/filecomp.c index 2f9d53823b9..deb43818c70 100644 --- a/rosapps/cmd/filecomp.c +++ b/rosapps/cmd/filecomp.c @@ -13,14 +13,13 @@ * Cleanup. Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" @@ -31,7 +30,6 @@ VOID CompleteFilename (LPTSTR str, INT charcount) { WIN32_FIND_DATA file; HANDLE hFile; - INT curplace = 0; INT start; INT count; @@ -70,11 +68,11 @@ VOID CompleteFilename (LPTSTR str, INT charcount) _tcscpy (path, &str[start]); /* look for a '.' in the filename */ - for (count = _tcslen (directory); path[count] != 0; count++) + for (count = _tcslen (directory); path[count] != _T('\0'); count++) { if (path[count] == _T('.')) { - found_dot = 1; + found_dot = TRUE; break; } } @@ -94,7 +92,8 @@ VOID CompleteFilename (LPTSTR str, INT charcount) do { /* ignore "." and ".." */ - if (file.cFileName[0] == _T('.')) + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) continue; _tcscpy (fname, file.cFileName); @@ -129,12 +128,20 @@ VOID CompleteFilename (LPTSTR str, INT charcount) _tcscat (&str[start], maxmatch); if (!perfectmatch) +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } else { /* no match found */ +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif } } @@ -173,7 +180,8 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) /* extract directory from word */ _tcscpy (directory, &str[start]); curplace = _tcslen (directory) - 1; - while (curplace >= 0 && directory[curplace] != _T('\\') && + while (curplace >= 0 && + directory[curplace] != _T('\\') && directory[curplace] != _T(':')) { directory[curplace] = 0; @@ -183,7 +191,7 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) _tcscpy (path, &str[start]); /* look for a . in the filename */ - for (count = _tcslen (directory); path[count] != 0; count++) + for (count = _tcslen (directory); path[count] != _T('\0'); count++) { if (path[count] == _T('.')) { @@ -191,6 +199,7 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) break; } } + if (found_dot) _tcscat (path, _T("*")); else @@ -208,7 +217,8 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) do { /* ignore . and .. */ - if (file.cFileName[0] == _T('.')) + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) continue; if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) @@ -233,7 +243,11 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) else { /* no match found */ +#ifdef __REACTOS__ + Beep (440, 50); +#else MessageBeep (-1); +#endif return FALSE; } @@ -250,4 +264,4 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) // VOID RemoveFilenameMatchList (VOID) -#endif \ No newline at end of file +#endif diff --git a/rosapps/cmd/for.c b/rosapps/cmd/for.c index 7ccb445252e..c614893c777 100644 --- a/rosapps/cmd/for.c +++ b/rosapps/cmd/for.c @@ -20,14 +20,13 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/rosapps/cmd/goto.c b/rosapps/cmd/goto.c index def1cbf57f2..c80a9e4047a 100644 --- a/rosapps/cmd/goto.c +++ b/rosapps/cmd/goto.c @@ -23,13 +23,12 @@ * Added help text ("/?"). */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" #include "batch.h" diff --git a/rosapps/cmd/history.c b/rosapps/cmd/history.c index 2e48d597882..cae614013ee 100644 --- a/rosapps/cmd/history.c +++ b/rosapps/cmd/history.c @@ -19,8 +19,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_HISTORY diff --git a/rosapps/cmd/if.c b/rosapps/cmd/if.c index 64744bca5d6..5ab4d737b40 100644 --- a/rosapps/cmd/if.c +++ b/rosapps/cmd/if.c @@ -20,13 +20,12 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" #include "batch.h" @@ -98,7 +97,7 @@ INT cmd_if (LPTSTR cmd, LPTSTR param) while (_istdigit (*pp)) n = n * 10 + (*pp++ - _T('0')); - x_flag ^= (errorlevel < n) ? 0 : X_EXEC; + x_flag ^= (nErrorLevel < n) ? 0 : X_EXEC; x_flag |= X_EMPTY; /* Syntax error if comd empty */ } diff --git a/rosapps/cmd/internal.c b/rosapps/cmd/internal.c index b2019f7d056..15913c24eeb 100644 --- a/rosapps/cmd/internal.c +++ b/rosapps/cmd/internal.c @@ -115,16 +115,19 @@ * * 30-Jan-1999 (Eric Kohl ) * Added "cd -" feature. Changes to the previous directory. + * + * 15-Mar-1999 (Eric Kohl ) + * Fixed bug in "cd -" feature. If the previous directory was a root + * directory, it was ignored. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include +#include #include "cmd.h" @@ -252,7 +255,7 @@ INT cmd_chdir (LPTSTR cmd, LPTSTR param) } /* remove trailing \ if any, but ONLY if dir is not the root dir */ - if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\\')) + if (_tcslen (dir) > 3 && dir[_tcslen (dir) - 1] == _T('\\')) dir[_tcslen(dir) - 1] = _T('\0'); diff --git a/rosapps/cmd/label.c b/rosapps/cmd/label.c index 285421954dd..6c065389192 100644 --- a/rosapps/cmd/label.c +++ b/rosapps/cmd/label.c @@ -14,8 +14,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_LABEL @@ -23,6 +21,7 @@ #include #include #include +#include #include "cmd.h" @@ -118,4 +117,4 @@ INT cmd_label (LPTSTR cmd, LPTSTR param) return 0; } -#endif /* INCLUDE_CMD_LABEL */ \ No newline at end of file +#endif /* INCLUDE_CMD_LABEL */ diff --git a/rosapps/cmd/locale.c b/rosapps/cmd/locale.c index b97c97102b3..2e1e70bf585 100644 --- a/rosapps/cmd/locale.c +++ b/rosapps/cmd/locale.c @@ -11,8 +11,6 @@ * Unicode safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/rosapps/cmd/makefile b/rosapps/cmd/makefile index f956db79f62..0553027a0d7 100644 --- a/rosapps/cmd/makefile +++ b/rosapps/cmd/makefile @@ -1,29 +1,30 @@ # +# ReactOS makefile for CMD # -LIB=../../lib -COMMON=../common - # target: raw binary (does not work right now) #all: cmd.bin # target: executable (not tested/experimental) all: cmd.exe -OBJECTS = $(COMMON)/crt0.o cmd.o attrib.o alias.o batch.o beep.o call.o cls.o cmdinput.o cmdtable.o\ - color.o date.o del.o dir.o echo.o err_hand.o error.o filecomp.o for.o goto.o history.o if.o\ - internal.o label.o misc.o path.o pause.o redir.o ren.o set.o shift.o tempfile.o time.o type.o ver.o\ - verify.o where.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 del.o dir.o dirstack.o echo.o error.o filecomp.o for.o goto.o history.o if.o\ + internal.o label.o locale.o misc.o move.o path.o pause.o prompt.o redir.o ren.o ros.o set.o shift.o time.o title.o type.o ver.o\ + verify.o vol.o where.o + +LIBS= ../../lib/kernel32/kernel32.a ../../lib/ntdll/ntdll.a -LIBS = $(LIB)/mingw32/mingw32.a $(LIB)/crtdll/crtdll.a \ - $(LIB)/kernel32/kernel32.a $(LIB)/ntdll/ntdll.a cmd.bin: $(OBJECTS) $(LD) -Ttext 0x10000 $(OBJECTS) $(LIBS) -o cmd.exe $(OBJCOPY) -O binary cmd.exe cmd.bin -cmd.exe: $(OBJECTS) - $(LD) $(OBJECTS) $(LIBS) -o cmd.exe +cmd.exe: $(OBJECTS) $(LIBS) + $(CC) -specs=../../specs $(OBJECTS) $(LIBS) -lgcc -o cmd.exe + $(NM) --numeric-sort cmd.exe > cmd.sym include ../../rules.mak + + diff --git a/rosapps/cmd/misc.c b/rosapps/cmd/misc.c index 1eb5ca46869..b010cd9e4e2 100644 --- a/rosapps/cmd/misc.c +++ b/rosapps/cmd/misc.c @@ -26,16 +26,13 @@ * FileGetString() seems to be working now. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include #include - -#include +#include #include "cmd.h" @@ -45,32 +42,36 @@ */ TCHAR cgetchar (VOID) { - TCHAR ch; -#if 0 - DWORD dwRead; - DWORD dwOldMode; - HANDLE hIn; - - hIn = GetStdHandle (STD_INPUT_HANDLE); - ConInSwallowInput (hIn); - - GetConsoleMode (hIn, &dwOldMode); - SetConsoleMode (hIn, 0); - - ReadConsole (hIn, &ch, 1, &dwRead, NULL); - - DebugPrintf ("[cgetchar (0x%x) \'%c\']\n", ch, ch); - - SetConsoleMode (hIn, dwOldMode); -#endif - - if ((ch = getch()) == 0) - ch = getch() << 8; + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD irBuffer; + DWORD dwRead; - if (ch == 3) - bCtrlBreak = TRUE; + do + { + WaitForSingleObject (hInput, INFINITE); + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + if ((irBuffer.EventType == KEY_EVENT) && + (irBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + if ((irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) & + (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')) + bCtrlBreak = TRUE; - return ch; + break; + } + } + while (TRUE); + +#ifdef __REACTOS__ + return irBuffer.Event.KeyEvent.AsciiChar; +#else +#ifndef _UNICODE + return irBuffer.Event.KeyEvent.uChar.AsciiChar; +#else + return irBuffer.Event.KeyEvent.uChar.UnicodeChar; +#endif /* _UNICODE */ +#endif /* __REACTOS__ */ } @@ -266,6 +267,11 @@ BOOL IsValidFileName (LPCTSTR pszPath) } +BOOL IsValidDirectory (LPCTSTR pszPath) +{ + return (GetFileAttributes (pszPath) & FILE_ATTRIBUTE_DIRECTORY); +} + BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) { diff --git a/rosapps/cmd/move.c b/rosapps/cmd/move.c index 54158d721a2..462326a587e 100644 --- a/rosapps/cmd/move.c +++ b/rosapps/cmd/move.c @@ -22,8 +22,6 @@ * Added "/N" option. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_MOVE @@ -31,6 +29,7 @@ #include #include #include +#include #include "cmd.h" @@ -264,4 +263,4 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) return 0; } -#endif /* INCLUDE_CMD_MOVE */ \ No newline at end of file +#endif /* INCLUDE_CMD_MOVE */ diff --git a/rosapps/cmd/path.c b/rosapps/cmd/path.c index 714ee3879a7..68e2fe6f5eb 100644 --- a/rosapps/cmd/path.c +++ b/rosapps/cmd/path.c @@ -23,8 +23,6 @@ * Fixed Win32 environment handling. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_PATH diff --git a/rosapps/cmd/pause.c b/rosapps/cmd/pause.c index f4c01bba15a..19e67d539d1 100644 --- a/rosapps/cmd/pause.c +++ b/rosapps/cmd/pause.c @@ -17,8 +17,6 @@ * Unicode ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_PAUSE diff --git a/rosapps/cmd/prompt.c b/rosapps/cmd/prompt.c index fa674f1c4ce..412dbbf8510 100644 --- a/rosapps/cmd/prompt.c +++ b/rosapps/cmd/prompt.c @@ -44,17 +44,85 @@ * Fixed Win32 environment handling. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" +static VOID PrintDate (VOID) +{ +#ifdef __REACTOS__ + SYSTEMTIME st; + + GetLocalTime (&st); + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + ConOutPrintf (_T("%s %02d%c%02d%c%04d"), + aszDayNames[st.wDayOfWeek], st.wMonth, cDateSeparator, st.wDay, cDateSeparator, st.wYear); + break; + + case 1: /* ddmmyy */ + ConOutPrintf (_T("%s %02d%c%02d%c%04d"), + aszDayNames[st.wDayOfWeek], st.wDay, cDateSeparator, st.wMonth, cDateSeparator, st.wYear); + break; + + case 2: /* yymmdd */ + ConOutPrintf (_T("%s %04d%c%02d%c%02d"), + aszDayNames[st.wDayOfWeek], st.wYear, cDateSeparator, st.wMonth, cDateSeparator, st.wDay); + break; + } +#else + TCHAR szDate[32]; + + GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, + szDate, sizeof (szDate)); + ConOutPrintf (_T("%s"), szDate); +#endif +} + + +static VOID +PrintTime (VOID) +{ +#ifdef __REACTOS__ + SYSTEMTIME st; + + GetLocalTime (&st); + + switch (nTimeFormat) + { + case 0: /* 12 hour format */ + default: + ConOutPrintf (_T("%2d%c%02d%c%02d%c%02d%c"), + (st.wHour == 0 ? 12 : (st.wHour <= 12 ? st.wHour : st.wHour - 12)), + cTimeSeparator, st.wMinute, cTimeSeparator, st.wSecond, cDecimalSeparator, + st.wMilliseconds / 10, (st.wHour <= 11 ? 'a' : 'p')); + break; + + case 1: /* 24 hour format */ + ConOutPrintf (_T("%2d%c%02d%c%02d%c%02d"), + st.wHour, cTimeSeparator, st.wMinute, cTimeSeparator, + st.wSecond, cDecimalSeparator, st.wMilliseconds / 10); + break; + } +#else + TCHAR szTime[32]; + + GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, NULL, + szTime, sizeof (szTime)); + ConOutPrintf (_T("%s"), szTime); +#endif +} + + /* * print the command-line prompt * @@ -95,13 +163,7 @@ VOID PrintPrompt(VOID) break; case _T('D'): - { - TCHAR szDate[32]; - - GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, - NULL, NULL, szDate, sizeof (szDate)); - ConOutPrintf (_T("%s"), szDate); - } + PrintDate (); break; case _T('E'): @@ -145,12 +207,7 @@ VOID PrintPrompt(VOID) break; case _T('T'): - { - TCHAR szTime[32]; - GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, - NULL, szTime, sizeof (szTime)); - ConOutPrintf (_T("%s"), szTime); - } + PrintTime (); break; case _T('V'): diff --git a/rosapps/cmd/redir.c b/rosapps/cmd/redir.c index 594bc112099..ffca9de9e77 100644 --- a/rosapps/cmd/redir.c +++ b/rosapps/cmd/redir.c @@ -22,8 +22,6 @@ * Added new error AND output redirection "&>" and "&>>". */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef FEATURE_REDIRECTION diff --git a/rosapps/cmd/ren.c b/rosapps/cmd/ren.c index 2023d075cf6..b8976e395f0 100644 --- a/rosapps/cmd/ren.c +++ b/rosapps/cmd/ren.c @@ -14,8 +14,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_RENAME diff --git a/rosapps/cmd/ros.c b/rosapps/cmd/ros.c new file mode 100644 index 00000000000..5c5cfcc8e2d --- /dev/null +++ b/rosapps/cmd/ros.c @@ -0,0 +1,111 @@ + +#ifdef __REACTOS__ + +#include +#include +#include +//#include +//#include + +void* malloc(size_t _size) +{ + return(HeapAlloc(GetProcessHeap(), + 0, + _size)); +} + +void free(void* _ptr) +{ + HeapFree(GetProcessHeap(), + 0, + _ptr); +} + +#if 0 +void* calloc(size_t _nmemb, size_t _size) +{ + return(HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + _nmemb*_size)); +} +#endif + +void* realloc(void* _ptr, size_t _size) +{ + return(HeapReAlloc(GetProcessHeap(), + 0, + _ptr, + _size)); +} + +char * +_strdup(const char *_s) +{ + char *rv; + if (_s == 0) + return 0; + rv = (char *)malloc(strlen(_s) + 1); + if (rv == 0) + return 0; + strcpy(rv, _s); + return rv; +} + +size_t +strlen(const char *str) +{ + const char *s; + + if (str == 0) + return 0; + for (s = str; *s; ++s); + return s-str; +} + + +void +_makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext ) +{ + int dir_len; + if ( drive != NULL ) { + strcat(path,drive); + strcat(path,":"); + } + + if ( dir != NULL ) { + strcat(path,dir); + if ( *dir != '\\' ) + strcat(path,"\\"); + dir_len = strlen(dir); + if ( *(dir + dir_len - 1) != '\\' ) + strcat(path,"\\"); + } + if ( fname != NULL ) { + strcat(path,fname); + if ( ext != NULL ) { + if ( *ext != '.') + strcat(path,"."); + strcat(path,ext); + } + } +} + +#if 0 +int getch(void) +{ + DWORD NumberOfCharsRead = 0; + DWORD dwWritten; + char c; + + ReadConsoleA (GetStdHandle (STD_INPUT_HANDLE), &c, 1, &NumberOfCharsRead, NULL); + + if ( c == 10 ) + c = 13; + + WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), &c, 1, &dwWritten, NULL); + + return c; +} +#endif + +#endif \ No newline at end of file diff --git a/rosapps/cmd/set.c b/rosapps/cmd/set.c index 7be3388eac9..a1c9dc7ba97 100644 --- a/rosapps/cmd/set.c +++ b/rosapps/cmd/set.c @@ -26,10 +26,11 @@ * 24-Jan-1999 (Eric Kohl ) * Fixed Win32 environment handling. * Unicode and redirection safe! + * + * 25-Feb-1999 (Eric Kohl ) + * Fixed little bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_SET @@ -42,7 +43,7 @@ #include "cmd.h" -/* size of environment variable buffer */ +/* initial size of environment variable buffer */ #define ENV_BUFFER_SIZE 1024 @@ -81,7 +82,7 @@ INT cmd_set (LPTSTR cmd, LPTSTR param) lpOutput += (len + 1); } } - FreeEnvironmentStrings (lpEnv); + FreeEnvironmentStrings (lpEnv); } return 0; @@ -112,7 +113,7 @@ INT cmd_set (LPTSTR cmd, LPTSTR param) else if (dwBuffer > ENV_BUFFER_SIZE) { pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); - GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE); + GetEnvironmentVariable (param, pszBuffer, dwBuffer * sizeof (TCHAR)); } ConOutPrintf ("%s\n", pszBuffer); diff --git a/rosapps/cmd/shift.c b/rosapps/cmd/shift.c index 92ee0363c12..87ce454b178 100644 --- a/rosapps/cmd/shift.c +++ b/rosapps/cmd/shift.c @@ -20,8 +20,6 @@ * Unicode and redirection safe! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include diff --git a/rosapps/cmd/time.c b/rosapps/cmd/time.c index f2b01d84aa2..08d70bc18f4 100644 --- a/rosapps/cmd/time.c +++ b/rosapps/cmd/time.c @@ -21,8 +21,6 @@ * Fixed time input bug. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_TIME @@ -38,7 +36,7 @@ static VOID PrintTime (VOID) { -#if 0 +#ifdef __REACTOS__ SYSTEMTIME st; GetLocalTime (&st); @@ -59,13 +57,13 @@ PrintTime (VOID) st.wSecond, cDecimalSeparator, st.wMilliseconds / 10); break; } -#endif - - TCHAR szTime[32]; +#else + TCHAR szTime[32]; GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, NULL, szTime, sizeof (szTime)); ConOutPrintf (_T("Current date is: %s\n"), szTime); +#endif } diff --git a/rosapps/cmd/title.c b/rosapps/cmd/title.c new file mode 100644 index 00000000000..3ed69859e1d --- /dev/null +++ b/rosapps/cmd/title.c @@ -0,0 +1,42 @@ +/* + * title.c - title internal command. + * + * + * History: + * 1999-02-11 Emanuele Aliberti + */ + +#include "config.h" + +#ifdef INCLUDE_CMD_TITLE + +#include +#include +#include + +#include "cmd.h" + + +INT cmd_title (LPTSTR cmd, LPTSTR param) +{ + /* Do nothing if no args */ + if (*param == _T('\0')) + return 0; + + /* Asking help? */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutPuts (_T("Sets the window title for the command prompt window.\n" + "\n" + "TITLE [string]\n" + "\n" + " string Specifies the title for the command prompt window.")); + return 0; + } + + return SetConsoleTitle (param); +} + +#endif /* def INCLUDE_CMD_TITLE */ + +/* EOF */ \ No newline at end of file diff --git a/rosapps/cmd/type.c b/rosapps/cmd/type.c index b4713562b90..8d772dd0205 100644 --- a/rosapps/cmd/type.c +++ b/rosapps/cmd/type.c @@ -20,8 +20,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_TYPE diff --git a/rosapps/cmd/ver.c b/rosapps/cmd/ver.c index f5e76fc79e7..4367effb966 100644 --- a/rosapps/cmd/ver.c +++ b/rosapps/cmd/ver.c @@ -16,24 +16,27 @@ * * 20-Jan-1999 (Eric Kohl ) * Unicode and redirection safe! + * + * 26-Feb-1999 (Eric Kohl ) + * New version info and some output changes. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include #include #include +#include #include "cmd.h" -#define VER_HELP "display shell version info VER [/C/R/W/?]" VOID ShortVersion (VOID) { - ConOutPuts (_T("\n" SHELLINFO " " SHELLVER "\n")); + ConOutPuts (_T("\n" + SHELLINFO "\n" + SHELLVER "\n")); } @@ -48,9 +51,11 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) { INT i; - /* JPP 07/08/1998 clean up and shortened info. */ - - ConOutPuts (_T("\n" SHELLINFO " " SHELLVER "\nCopyright (C) 1994-1998 Tim Norman and others.")); + ConOutPuts (_T("\n" + SHELLINFO "\n" + SHELLVER "\n" + "\n" + "Copyright (C) 1994-1998 Tim Norman and others.")); ConOutPuts (_T("Copyright (C) 1998,1999 Eric Kohl.")); /* Basic copyright notice */ @@ -67,7 +72,7 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) /* MS-DOS ver prints just help if /? is alone or not */ if (_tcsstr (param, _T("/?")) != NULL) { - ConOutPuts (_T(USAGE ": " VER_HELP)); + ConOutPuts (_T("\ndisplay shell version info\n\nVER [/C/R/W/?]")); return 0; } @@ -91,7 +96,6 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) if (_totupper (param[i]) == _T('W')) { /* Warranty notice */ - /* JPP 07/08/1998 removed extra printf calls */ ConOutPuts (_T("\n This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" @@ -100,7 +104,6 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) else if (_totupper (param[i]) == _T('R')) { /* Redistribution notice */ - /* JPP 07/08/1998 removed extra printf calls */ ConOutPuts (_T("\n This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" @@ -109,16 +112,15 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) else if (_totupper (param[i]) == _T('C')) { /* Developer listing */ - /* JPP 07/08/1998 removed extra printf calls; rearranged names */ - ConOutPuts (_T("\ndeveloped by:\n" + ConOutPuts (_T("\nFreeDOS version written by:\n" " Tim Norman Matt Rains\n" " Evan Jeffrey Steffen Kaiser\n" " Svante Frey Oliver Mueller\n" " Aaron Kaufman Marc Desrochers\n" " Rob Lake John P Price\n" " Hans B Pufal\n" - "\nconverted to Win32 by:\n" - " Eric Kohl\n")); + "\nReactOS version written by:\n" + " Eric Kohl Emanuele Aliberti\n")); } else { @@ -130,7 +132,7 @@ INT cmd_ver (LPTSTR cmd, LPTSTR param) ConOutPuts (_T("\nSend bug reports to .\n" /* - "Updates are available at ftp://www.sid-dis.com/..." + "Updates are available at http://www.sid-dis.com/reactos" */ )); return 0; diff --git a/rosapps/cmd/verify.c b/rosapps/cmd/verify.c index e3b1f08a8b7..4aeaa94e9e4 100644 --- a/rosapps/cmd/verify.c +++ b/rosapps/cmd/verify.c @@ -15,8 +15,6 @@ * Unicode and redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_VERIFY diff --git a/rosapps/cmd/vol.c b/rosapps/cmd/vol.c index 13bd0e1e712..71ee531ad30 100644 --- a/rosapps/cmd/vol.c +++ b/rosapps/cmd/vol.c @@ -20,8 +20,6 @@ * Redirection ready! */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #ifdef INCLUDE_CMD_VOL diff --git a/rosapps/cmd/where.c b/rosapps/cmd/where.c index 1ea1625f77d..70f96c39e87 100644 --- a/rosapps/cmd/where.c +++ b/rosapps/cmd/where.c @@ -1,67 +1,71 @@ /* - * WHERE.C - file serch functions. + * WHERE.C - file search functions. * * * History: * - * 07/15/95 (Tim Norman) - * started. + * 07/15/95 (Tim Norman) + * started. * - * 08/08/95 (Matt Rains) - * i have cleaned up the source code. changes now bring this source into - * guidelines for recommended programming practice. + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. * - * 12/12/95 (Steffan Kaiser & Tim Norman) - * added some patches to fix some things and make more efficient + * 12/12/95 (Steffan Kaiser & Tim Norman) + * added some patches to fix some things and make more efficient * - * 1/6/96 (Tim Norman) - * fixed a stupid pointer mistake... Thanks to everyone who noticed it! + * 1/6/96 (Tim Norman) + * fixed a stupid pointer mistake... + * Thanks to everyone who noticed it! * - * 8/1/96 (Tim Norman) - * fixed a bug when getenv returns NULL + * 8/1/96 (Tim Norman) + * fixed a bug when getenv returns NULL * - * 8/7/96 (Steffan Kaiser and Tim Norman) - * speed improvements and bug fixes + * 8/7/96 (Steffan Kaiser and Tim Norman) + * speed improvements and bug fixes * - * 8/27/96 (Tim Norman) - * changed code to use pointers directly into PATH environment variable - * rather than making our own copy. This saves some memory, but requires - * we write our own function to copy pathnames out of the variable. + * 8/27/96 (Tim Norman) + * changed code to use pointers directly into PATH environment + * variable rather than making our own copy. This saves some memory, + * but requires we write our own function to copy pathnames out of + * the variable. * - * 12/23/96 (Aaron Kaufman) - * Fixed a bug in get_paths() that did not point to the first PATH in the - * environment variable. + * 12/23/96 (Aaron Kaufman) + * Fixed a bug in get_paths() that did not point to the first PATH + * in the environment variable. * - * 7/12/97 (Tim Norman) - * Apparently, Aaron's bugfix got lost, so I fixed it again. + * 7/12/97 (Tim Norman) + * Apparently, Aaron's bugfix got lost, so I fixed it again. * - * 16 July 1998 (John P. Price) - * Added stand alone code. + * 16 July 1998 (John P. Price) + * Added stand alone code. * - * 17 July 1998 (John P. Price) - * Rewrote find_which to use searchpath function + * 17 July 1998 (John P. Price) + * Rewrote find_which to use searchpath function * - * 24-Jul-1998 (John P Price ) - * - fixed bug where didn't check all extensions when path was specified + * 24-Jul-1998 (John P Price ) + * fixed bug where didn't check all extensions when path was specified * - * 27-Jul-1998 (John P Price ) - * - added config.h include + * 27-Jul-1998 (John P Price ) + * added config.h include * - * 30-Jul-1998 (John P Price ) - * - fixed so that it find_which returns NULL if filename is not executable - * (does not have .bat, .com, or .exe extention). Before command would - * to execute any file with any extension (opps!) + * 30-Jul-1998 (John P Price ) + * fixed so that it find_which returns NULL if filename is not + * executable (does not have .bat, .com, or .exe extention). + * Before command would to execute any file with any extension (opps!) * - * 03-Dec_1998 (Eric Kohl ) + * 03-Dec-1998 (Eric Kohl ) * Changed find_which(). * - * 07-Dec_1998 (Eric Kohl ) + * 07-Dec-1998 (Eric Kohl ) * Added ".CMD" extension. * Replaced numeric constant by _NR_OF_EXTENSIONS. + * + * 26-Feb-1999 (Eric Kohl ) + * Replaced find_which() by SearchForExecutable(). + * Now files are serched with the right order of extensions. */ -#define WIN32_LEAN_AND_MEAN - #include "config.h" #include @@ -71,91 +75,188 @@ #include "cmd.h" +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + static LPTSTR ext[] = {".BAT", ".CMD", ".COM", ".EXE"}; static INT nExtCount = sizeof(ext) / sizeof(LPTSTR); /* searches for file using path info. */ -BOOL find_which (LPCTSTR fname, LPTSTR fullbuffer) +BOOL +SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) { - static TCHAR temp[MAX_PATH]; - LPTSTR fullname; - INT x; + TCHAR szPathBuffer[MAX_PATH]; + LPTSTR pszBuffer; + DWORD dwBuffer; + INT n; + LPTSTR p,s,f; + + /* load environment varable PATH into buffer */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + ConErrPrintf (_T("Not PATH environment variable found!\n")); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR)); + } + - *fullbuffer = _T('\0'); + /* initialize full name buffer */ + *pFullName = _T('\0'); - /* if there an extension and it is in the last path component, then - * don't test all the extensions. */ - if (!(fullname = _tcsrchr (fname, _T('.'))) || - _tcschr (fullname + 1, _T('\\'))) + if (!(p = _tcsrchr (pFileName, _T('.'))) || + _tcschr (p + 1, _T('\\'))) { + /* There is no extension ==> test all the extensions. */ #ifdef _DEBUG - DebugPrintf ("No filename extension!\n"); + DebugPrintf (_T("No filename extension!\n")); #endif - for (x = 0; x < nExtCount; x++) + /* search in current directory */ + GetCurrentDirectory (MAX_PATH, szPathBuffer); + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + + p = szPathBuffer + _tcslen (szPathBuffer); + + for (n = 0; n < nExtCount; n++) { - _tcscpy (temp, fname); - _tcscat (temp, ext[x]); + _tcscpy (p, ext[n]); + #ifdef _DEBUG - DebugPrintf ("Checking for %s\n", temp); + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); #endif - if (_tcschr (fname, _T('\\'))) + + if (IsValidFileName (szPathBuffer)) { - if (IsValidFileName (temp)) - { - _tcscpy (fullbuffer, temp); - return TRUE; - } +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + } + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; } else { - _searchenv (temp, _T("PATH"), fullbuffer); - if (*fullbuffer != '\0') + _tcscpy (szPathBuffer, s); + s = NULL; + } + + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + + p = szPathBuffer + _tcslen (szPathBuffer); + + for (n = 0; n < nExtCount; n++) + { + _tcscpy (p, ext[n]); + +#ifdef _DEBUG + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); +#endif + + if (IsValidFileName (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); return TRUE; + } } } } else { - /* there is an extension... don't test other extensions */ - /* make sure that the extention is one of the four */ + /* There is an extension and it is in the last path component, */ + /* so don't test all the extensions. */ #ifdef _DEBUG - DebugPrintf ("No filename extension!\n"); + DebugPrintf (_T("Filename extension!\n")); #endif - for (x = 0; x < nExtCount; x++) + + /* search in current directory */ + GetCurrentDirectory (MAX_PATH, szPathBuffer); + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + +#ifdef _DEBUG + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); +#endif + if (IsValidFileName (szPathBuffer)) { - if (!_tcsicmp (_tcsrchr (fname, _T('.')), ext[x])) - { - if (_tcschr (fname, _T('\\'))) - { - if (IsValidFileName (fname)) - { - _tcscpy (fullbuffer, fname); #ifdef _DEBUG - DebugPrintf ("Found: %s\n", fullbuffer); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif - return TRUE; - } - } - else - { + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; + } + else + { + _tcscpy (szPathBuffer, s); + s = NULL; + } + + if (szPathBuffer[_tcslen(szPathBuffer)-1] != _T('\\')) + _tcscat (szPathBuffer, _T("\\")); + _tcscat (szPathBuffer, pFileName); + #ifdef _DEBUG - DebugPrintf ("Checking for %s\n", fname); + DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); #endif - _searchenv (fname, _T("PATH"), fullbuffer); - if (*fullbuffer != _T('\0')) - { + if (IsValidFileName (szPathBuffer)) + { #ifdef _DEBUG - DebugPrintf ("Found: %s\n", fullbuffer); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif - return TRUE; - } - } + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; } } } + free (pszBuffer); + return FALSE; -} +} \ No newline at end of file