changes to make cmd compile (not link)
authorEric Kohl <eric.kohl@reactos.org>
Sun, 21 Mar 1999 21:32:45 +0000 (21:32 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 21 Mar 1999 21:32:45 +0000 (21:32 +0000)
svn path=/trunk/; revision=326

101 files changed:
reactos/apps/utils/cmd/alias.c
reactos/apps/utils/cmd/attrib.c
reactos/apps/utils/cmd/batch.c
reactos/apps/utils/cmd/batch.h
reactos/apps/utils/cmd/beep.c
reactos/apps/utils/cmd/call.c
reactos/apps/utils/cmd/chcp.c
reactos/apps/utils/cmd/cls.c
reactos/apps/utils/cmd/cmd.c
reactos/apps/utils/cmd/cmd.h
reactos/apps/utils/cmd/cmdinput.c
reactos/apps/utils/cmd/cmdtable.c
reactos/apps/utils/cmd/color.c
reactos/apps/utils/cmd/config.h
reactos/apps/utils/cmd/console.c
reactos/apps/utils/cmd/copy.c
reactos/apps/utils/cmd/date.c
reactos/apps/utils/cmd/del.c
reactos/apps/utils/cmd/dir.c
reactos/apps/utils/cmd/dirstack.c
reactos/apps/utils/cmd/echo.c
reactos/apps/utils/cmd/error.c
reactos/apps/utils/cmd/filecomp.c
reactos/apps/utils/cmd/for.c
reactos/apps/utils/cmd/goto.c
reactos/apps/utils/cmd/history.c
reactos/apps/utils/cmd/if.c
reactos/apps/utils/cmd/internal.c
reactos/apps/utils/cmd/label.c
reactos/apps/utils/cmd/locale.c
reactos/apps/utils/cmd/makefile
reactos/apps/utils/cmd/misc.c
reactos/apps/utils/cmd/move.c
reactos/apps/utils/cmd/path.c
reactos/apps/utils/cmd/pause.c
reactos/apps/utils/cmd/prompt.c
reactos/apps/utils/cmd/redir.c
reactos/apps/utils/cmd/ren.c
reactos/apps/utils/cmd/ros.c [new file with mode: 0644]
reactos/apps/utils/cmd/set.c
reactos/apps/utils/cmd/shift.c
reactos/apps/utils/cmd/time.c
reactos/apps/utils/cmd/title.c [new file with mode: 0644]
reactos/apps/utils/cmd/type.c
reactos/apps/utils/cmd/ver.c
reactos/apps/utils/cmd/verify.c
reactos/apps/utils/cmd/vol.c
reactos/apps/utils/cmd/where.c
reactos/drivers/dd/beep/beep.c
reactos/include/base.h
reactos/include/tchar.h [new file with mode: 0644]
reactos/makefile.dos
reactos/ntoskrnl/libgcc.a
rosapps/cmd/alias.c
rosapps/cmd/attrib.c
rosapps/cmd/batch.c
rosapps/cmd/batch.h
rosapps/cmd/beep.c
rosapps/cmd/call.c
rosapps/cmd/chcp.c
rosapps/cmd/cls.c
rosapps/cmd/cmd.c
rosapps/cmd/cmd.h
rosapps/cmd/cmdinput.c
rosapps/cmd/cmdtable.c
rosapps/cmd/color.c
rosapps/cmd/config.h
rosapps/cmd/console.c
rosapps/cmd/copy.c
rosapps/cmd/date.c
rosapps/cmd/del.c
rosapps/cmd/dir.c
rosapps/cmd/dirstack.c
rosapps/cmd/echo.c
rosapps/cmd/error.c
rosapps/cmd/filecomp.c
rosapps/cmd/for.c
rosapps/cmd/goto.c
rosapps/cmd/history.c
rosapps/cmd/if.c
rosapps/cmd/internal.c
rosapps/cmd/label.c
rosapps/cmd/locale.c
rosapps/cmd/makefile
rosapps/cmd/misc.c
rosapps/cmd/move.c
rosapps/cmd/path.c
rosapps/cmd/pause.c
rosapps/cmd/prompt.c
rosapps/cmd/redir.c
rosapps/cmd/ren.c
rosapps/cmd/ros.c [new file with mode: 0644]
rosapps/cmd/set.c
rosapps/cmd/shift.c
rosapps/cmd/time.c
rosapps/cmd/title.c [new file with mode: 0644]
rosapps/cmd/type.c
rosapps/cmd/ver.c
rosapps/cmd/verify.c
rosapps/cmd/vol.c
rosapps/cmd/where.c

index ac0a914..5f2d520 100644 (file)
@@ -26,7 +26,6 @@
  *        Redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
 
 #include "config.h"
 
index 65a2c31..8316e63 100644 (file)
@@ -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 <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "cmd.h"
 
index b1ea5be..36df898 100644 (file)
  *        Unicode safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "cmd.h"
 #include "batch.h"
index 11324e3..cdc37f2 100644 (file)
@@ -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_ */
index 9f9834c..bafe06c 100644 (file)
@@ -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;
 }
index db5dd63..6777b17 100644 (file)
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "cmd.h"
 #include "batch.h"
index 6831e57..b72c912 100644 (file)
@@ -9,8 +9,6 @@
  *
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_CHCP
@@ -18,6 +16,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "cmd.h"
 #include "chcp.h"
index 2e27fcc..e6a5991 100644 (file)
@@ -23,8 +23,6 @@
  *        Redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_CLS
index 2841c33..966c5d7 100644 (file)
  *        Replaced spawnl() by CreateProcess().
  */
 
-// #define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
-// #include <tchar.h>
+#include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #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);
index e34fffe..9c35a46 100644 (file)
  *        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 <linux-guru@gcfl.net>)
- *        Added compile date to version
+ *        Added compile date to version.
+ *
+ *    26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        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 <windows.h>
-// #include <tchar.h>
+#include <tchar.h>
+
+
+#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_ */
index 6ac5302..e2021bb 100644 (file)
  *        Unicode and redirection safe!
  *
  *    04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
- *        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 <RETURN>. This sometimes caused
  *        some very strange effects.
  *        Fixed some command line editing annoyances.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
@@ -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;
index f2d8339..9ef5c5d 100644 (file)
@@ -17,8 +17,6 @@
  *        Unicode ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
@@ -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
index f5d0867..322a0f4 100644 (file)
@@ -14,8 +14,6 @@
  *        Redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_COLOR
index 1e214e2..9ed6362 100644 (file)
@@ -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 */
 /* 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_ */
index c740f2a..37d0284 100644 (file)
@@ -8,12 +8,13 @@
  *        started
  */
 
-
-
-#define WIN32_LEAN_AND_MEAN
+#include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
 
 #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;
-}
index 16b5617..eac53d4 100644 (file)
@@ -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;
index e271236..24b271d 100644 (file)
@@ -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)
index c249670..2095ac4 100644 (file)
@@ -25,8 +25,6 @@
  *        First working version.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_DEL
@@ -35,6 +33,7 @@
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "cmd.h"
 
@@ -97,6 +96,8 @@ static INT Prompt (LPTSTR str)
        else if (*p == _T('\03'))
                return PROMPT_BREAK;
 #endif
+
+       return PROMPT_NO;
 }
 
 
index c56d847..19c7c7b 100644 (file)
  *
  *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Redirection safe!
+ *
+ *    01-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Replaced all runtime io functions by their Win32 counterparts.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_DIR
 #include <stdlib.h>
 #include <ctype.h>
 
-#include <direct.h>
-
 #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 ("         <DIR>         ");
-                 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", "<DIR>");
-          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("         <DIR>         "));
+                                       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", "<DIR>");
+                                       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;
index 5c00c21..04c1cf9 100644 (file)
@@ -11,8 +11,6 @@
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef FEATURE_DIRECTORY_STACK
index 9d85c5f..0e0f512 100644 (file)
@@ -20,8 +20,6 @@
  *        Unicode and redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
index d89fe31..2887cb8 100644 (file)
  *        Use FormatMessage() for error reports.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
+#include <stdio.h>
 #include <stdarg.h>
 
 #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;
        }
 
index 2f9d538..deb4381 100644 (file)
  *       Cleanup. Unicode safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #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
index 7ccb445..c614893 100644 (file)
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "cmd.h"
 #include "batch.h"
index def1cbf..c80a9e4 100644 (file)
  *        Added help text ("/?").
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "cmd.h"
 #include "batch.h"
index 2e48d59..cae6140 100644 (file)
@@ -19,8 +19,6 @@
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef FEATURE_HISTORY
index 64744bc..5ab4d73 100644 (file)
  *        Unicode and redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #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 */
        }
index b2019f7..15913c2 100644 (file)
  *
  *    30-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Added "cd -" feature. Changes to the previous directory.
+ *
+ *    15-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        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 <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #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');
 
 
index 2854219..6c06538 100644 (file)
@@ -14,8 +14,6 @@
  *        Unicode ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_LABEL
@@ -23,6 +21,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #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 */
index b97c971..2e1e70b 100644 (file)
@@ -11,8 +11,6 @@
  *        Unicode safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
index f956db7..0553027 100644 (file)
@@ -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
 
+
+
index 1eb5ca4..b010cd9 100644 (file)
  *        FileGetString() seems to be working now.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
-
-#include <conio.h>
+#include <ctype.h>
 
 #include "cmd.h"
 
  */
 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)
 {
index 54158d7..462326a 100644 (file)
@@ -22,8 +22,6 @@
  *        Added "/N" option.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_MOVE
@@ -31,6 +29,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #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 */
index 714ee38..68e2fe6 100644 (file)
@@ -23,8 +23,6 @@
  *        Fixed Win32 environment handling.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_PATH
index f4c01bb..19e67d5 100644 (file)
@@ -17,8 +17,6 @@
  *        Unicode ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_PAUSE
index fa674f1..412dbbf 100644 (file)
  *        Fixed Win32 environment handling.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #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'):
index 594bc11..ffca9de 100644 (file)
@@ -22,8 +22,6 @@
  *        Added new error AND output redirection "&>" and "&>>".
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef FEATURE_REDIRECTION
index 2023d07..b8976e3 100644 (file)
@@ -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 (file)
index 0000000..5c5cfcc
--- /dev/null
@@ -0,0 +1,111 @@
+
+#ifdef __REACTOS__
+
+#include <windows.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <types.h>
+//#include <ddk/ntddk.h>
+
+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
index 7be3388..a1c9dc7 100644 (file)
  *    24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Fixed Win32 environment handling.
  *        Unicode and redirection safe!
+ *
+ *    25-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        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);
index 92ee036..87ce454 100644 (file)
@@ -20,8 +20,6 @@
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
index f2b01d8..08d70bc 100644 (file)
@@ -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 (file)
index 0000000..3ed6985
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *  title.c - title internal command.
+ *
+ *
+ *  History:
+ *     1999-02-11 Emanuele Aliberti
+ */
+
+#include "config.h"
+
+#ifdef INCLUDE_CMD_TITLE
+
+#include <windows.h>
+#include <tchar.h>
+#include <string.h>
+
+#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
index b471356..8d772dd 100644 (file)
@@ -20,8 +20,6 @@
  *        Unicode and redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_TYPE
index f5e76fc..4367eff 100644 (file)
  *
  *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Unicode and redirection safe!
+ *
+ *    26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        New version info and some output changes.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #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 <ekohl@abo.rhein-zeitung.de>.\n"
 /*
-                                  "Updates are available at ftp://www.sid-dis.com/..."
+                                  "Updates are available at http://www.sid-dis.com/reactos"
 */
                           ));
        return 0;
index e3b1f08..4aeaa94 100644 (file)
@@ -15,8 +15,6 @@
  *        Unicode and redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_VERIFY
index 13bd0e1..71ee531 100644 (file)
@@ -20,8 +20,6 @@
  *        Redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_VOL
index 1ea1625..70f96c3 100644 (file)
@@ -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 <linux-guru@gcfl.net>)
- * - fixed bug where didn't check all extensions when path was specified
+ *    24-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ *        fixed bug where didn't check all extensions when path was specified
  *
- * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
- * - added config.h include
+ *    27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ *        added config.h include
  *
- * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
- * - 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 <linux-guru@gcfl.net>)
+ *        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 <ekohl@abo.rhein-zeitung.de>)
+ *    03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Changed find_which().
  *
- *    07-Dec_1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *    07-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Added ".CMD" extension.
  *        Replaced numeric constant by _NR_OF_EXTENSIONS.
+ *
+ *    26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Replaced find_which() by SearchForExecutable().
+ *        Now files are serched with the right order of extensions.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #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
index 0afd9db..037022c 100644 (file)
@@ -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,
index 5dd506c..a1737b9 100644 (file)
@@ -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 (file)
index 0000000..11ae87b
--- /dev/null
@@ -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 <colin@bird.fu.is.saga-u.ac.jp>
+ *
+ *  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_ */
+
index 9b98581..97725e8 100644 (file)
@@ -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
 
index 23af550..89875e2 100644 (file)
Binary files a/reactos/ntoskrnl/libgcc.a and b/reactos/ntoskrnl/libgcc.a differ
index ac0a914..5f2d520 100644 (file)
@@ -26,7 +26,6 @@
  *        Redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
 
 #include "config.h"
 
index 65a2c31..8316e63 100644 (file)
@@ -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 <windows.h>
 #include <tchar.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "cmd.h"
 
index b1ea5be..36df898 100644 (file)
  *        Unicode safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "cmd.h"
 #include "batch.h"
index 11324e3..cdc37f2 100644 (file)
@@ -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_ */
index 9f9834c..bafe06c 100644 (file)
@@ -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;
 }
index db5dd63..6777b17 100644 (file)
  *        Unicode and redirection safe!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "cmd.h"
 #include "batch.h"
index 6831e57..b72c912 100644 (file)
@@ -9,8 +9,6 @@
  *
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_CHCP
@@ -18,6 +16,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "cmd.h"
 #include "chcp.h"
index 2e27fcc..e6a5991 100644 (file)
@@ -23,8 +23,6 @@
  *        Redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_CLS
index 2841c33..966c5d7 100644 (file)
  *        Replaced spawnl() by CreateProcess().
  */
 
-// #define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
-// #include <tchar.h>
+#include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #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);
index e34fffe..9c35a46 100644 (file)
  *        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 <linux-guru@gcfl.net>)
- *        Added compile date to version
+ *        Added compile date to version.
+ *
+ *    26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        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 <windows.h>
-// #include <tchar.h>
+#include <tchar.h>
+
+
+#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_ */
index 6ac5302..e2021bb 100644 (file)
  *        Unicode and redirection safe!
  *
  *    04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
- *        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 <RETURN>. This sometimes caused
  *        some very strange effects.
  *        Fixed some command line editing annoyances.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
@@ -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;
index f2d8339..9ef5c5d 100644 (file)
@@ -17,8 +17,6 @@
  *        Unicode ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #include <windows.h>
@@ -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
index f5d0867..322a0f4 100644 (file)
@@ -14,8 +14,6 @@
  *        Redirection ready!
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_COLOR
index 1e214e2..9ed6362 100644 (file)
@@ -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 */
 /* 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_ */
index c740f2a..37d0284 100644 (file)
@@ -8,12 +8,13 @@
  *        started
  */
 
-
-
-#define WIN32_LEAN_AND_MEAN
+#include "config.h"
 
 #include <windows.h>
 #include <tchar.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
 
 #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;
-}
index 16b5617..eac53d4 100644 (file)
@@ -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;
index e271236..24b271d 100644 (file)
@@ -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)
index c249670..2095ac4 100644 (file)
@@ -25,8 +25,6 @@
  *        First working version.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_DEL
@@ -35,6 +33,7 @@
 #include <tchar.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "cmd.h"
 
@@ -97,6 +96,8 @@ static INT Prompt (LPTSTR str)
        else if (*p == _T('\03'))
                return PROMPT_BREAK;
 #endif
+
+       return PROMPT_NO;
 }
 
 
index c56d847..19c7c7b 100644 (file)
  *
  *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
  *        Redirection safe!
+ *
+ *    01-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Replaced all runtime io functions by their Win32 counterparts.
  */
 
-#define WIN32_LEAN_AND_MEAN
-
 #include "config.h"
 
 #ifdef INCLUDE_CMD_DIR
 #include <stdlib.h>
 #include <ctype.h>
 
-#include <direct.h>
-
 #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 ("         <DIR>         ");
-                 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", "<DIR>");
-          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("         <DIR>         "));
+                                       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", "<DIR>");
+                                       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 t