* Redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
#include "config.h"
* Added handling of multiple filenames.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_ATTRIB
#include <windows.h>
#include <tchar.h>
#include <string.h>
+#include <ctype.h>
#include "cmd.h"
* 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"
*
*/
+#ifndef _BATCH_H_INCLUDED_
+#define _BATCH_H_INCLUDED_
+
typedef struct tagBATCHCONTEXT
{
VOID ExitBatch (LPTSTR);
BOOL Batch (LPTSTR, LPTSTR, LPTSTR);
LPTSTR ReadBatchLine (LPBOOL);
+
+#endif /* _BATCH_H_INCLUDED_ */
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_BEEP
if (bc == NULL)
return 1;
#endif
-
+#ifdef __REACTOS__
+ Beep (440, 50);
+#else
MessageBeep (-1);
+#endif
return 0;
}
* 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"
*
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_CHCP
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
+#include <string.h>
#include "cmd.h"
#include "chcp.h"
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_CLS
* 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"
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;
/* 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;
#endif
/* build command line for CreateProcess() */
_tcscpy (szFullCmdLine, szFullName);
- _tcscat (szFullCmdLine, " ");
+ _tcscat (szFullCmdLine, _T(" "));
_tcscat (szFullCmdLine, rest);
/* fill startup info */
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);
}
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...*/
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++;
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');
#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);
InitLastPath ();
#endif
- if (argc >= 2)
+ if (argc >= 2)
{
if (!_tcsncmp (argv[1], _T("/?"), 2))
{
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
}
#endif
/* remove ctrl handler */
-// SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE);
+#if 0
+ SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE);
+#endif
}
INT nExitCode;
AllocConsole ();
- SetFileApisToOEM ();
+#ifndef __REACTOS__
+ SetFileApisToOEM ();
+#endif
/* check switches on command-line */
Initialize (argc, argv);
* 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
-/* prototypes for CMD.C */
+/* Prototypes for CMD.C */
extern HANDLE hOut;
extern HANDLE hIn;
extern WORD wColor;
extern BOOL bCtrlBreak;
extern BOOL bIgnoreEcho;
extern BOOL bExit;
-extern int errorlevel;
+extern INT nErrorLevel;
extern SHORT maxx;
extern SHORT maxy;
extern OSVERSIONINFO osvi;
-/* 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
} 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 */
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);
INT cmd_popd (LPTSTR, LPTSTR);
+/* Prototypes for ECHO.C */
+INT cmd_echo (LPTSTR, LPTSTR);
+
+
/* Prototypes for ERROR.C */
VOID ErrorMessage (DWORD, 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);
#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;
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
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_ */
* 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>
{
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);
}
if (bEcho)
PrintPrompt();
- orgx = wherex ();
- orgy = wherey ();
+ GetCursorXY (&orgx, &orgy);
memset (str, 0, maxlen * sizeof (TCHAR));
{
/* 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--;
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;
/* goto beginning of string */
if (current != 0)
{
- goxy (orgx, orgy);
+ SetCursorXY (orgx, orgy);
current = 0;
}
break;
/* goto end of string */
if (current != charcount)
{
- goxy (orgx, orgy);
+ SetCursorXY (orgx, orgy);
ConOutPrintf (_T("%s"), str);
current = charcount;
}
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--;
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
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;
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
#if 0
else
{
-// Beep (440, 100);
+#ifdef __REACTOS__
+ Beep (440, 100);
+#else
MessageBeep (-1);
+#endif
}
#endif
break;
* Unicode ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#include <windows.h>
{_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
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_COLOR
*
*/
+#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
#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
*/
+
+
+#endif /* _CONFIG_H_INCLUDED_ */
* 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"
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);
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);
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);
-/*
- * goxy -- move the cursor on the screen.
- */
-VOID goxy (SHORT x, SHORT y)
+VOID SetCursorXY (SHORT x, SHORT y)
{
COORD coPos;
}
-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;
}
-SHORT wherey (VOID)
+SHORT GetCursorY (VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
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;
-}
* Replaced CRT io functions by Win32 io functions.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_COPY
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);
-static BOOL IsDirectory (LPTSTR fn)
+static BOOL
+IsDirectory (LPTSTR fn)
{
if (!IsValidFileName (fn))
return FALSE;
}
-static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags)
+static BOOL
+DoSwitches (LPTSTR arg, LPDWORD lpdwFlags)
{
if (!_tcsicmp (arg, _T("/-Y")))
{
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)
{
static BOOL
AddFiles (LPFILES f, char *arg, int *source, int *dest,
- int *count, unsigned *flags)
+ int *count, LPDWORD flags)
{
char t[128];
int j;
}
-static BOOL GetDestination (LPFILES f, LPFILES dest)
+static BOOL
+GetDestination (LPFILES f, LPFILES dest)
{
LPFILES p;
LPFILES start = f;
* Fixed date input bug.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_DATE
static VOID
PrintDate (VOID)
{
-#if 0
+#ifdef __REACTOS__
SYSTEMTIME st;
GetLocalTime (&st);
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
}
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)
* First working version.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_DEL
#include <tchar.h>
#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
#include "cmd.h"
else if (*p == _T('\03'))
return PROMPT_BREAK;
#endif
+
+ return PROMPT_NO;
}
*
* 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.
/* 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;
/*
*/
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"
"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;
/*
- * 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;
}
}
*
* 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;
}
}
/* 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;
}
* 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 ();
}
* 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];
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))
{
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;
* 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;
{
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;
}
{
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;
}
*
*/
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:\\");
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;
*
* 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;
}
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;
}
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
/*
* _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;
}
*/
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 */
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;
* Unicode and redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef FEATURE_DIRECTORY_STACK
* Unicode and redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#include <windows.h>
* 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"
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),
else
{
ConErrPrintf (_T("Unknown error! Error code: 0x%lx\n"), dwErrorCode);
-// ConErrPrintf (_T("No error message available!\n"));
return;
}
* 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"
{
WIN32_FIND_DATA file;
HANDLE hFile;
-
INT curplace = 0;
INT start;
INT count;
_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;
}
}
do
{
/* ignore "." and ".." */
- if (file.cFileName[0] == _T('.'))
+ if (!_tcscmp (file.cFileName, _T(".")) ||
+ !_tcscmp (file.cFileName, _T("..")))
continue;
_tcscpy (fname, file.cFileName);
_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
}
}
/* 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;
_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('.'))
{
break;
}
}
+
if (found_dot)
_tcscat (path, _T("*"));
else
do
{
/* ignore . and .. */
- if (file.cFileName[0] == _T('.'))
+ if (!_tcscmp (file.cFileName, _T(".")) ||
+ !_tcscmp (file.cFileName, _T("..")))
continue;
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
else
{
/* no match found */
+#ifdef __REACTOS__
+ Beep (440, 50);
+#else
MessageBeep (-1);
+#endif
return FALSE;
}
// VOID RemoveFilenameMatchList (VOID)
-#endif
\ No newline at end of file
+#endif
* 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"
* 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"
* Unicode and redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef FEATURE_HISTORY
* 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"
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 */
}
*
* 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"
}
/* 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');
* Unicode ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_LABEL
#include <windows.h>
#include <tchar.h>
#include <string.h>
+#include <ctype.h>
#include "cmd.h"
return 0;
}
-#endif /* INCLUDE_CMD_LABEL */
\ No newline at end of file
+#endif /* INCLUDE_CMD_LABEL */
* Unicode safe!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#include <windows.h>
#
+# 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
+
+
* 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__ */
}
}
+BOOL IsValidDirectory (LPCTSTR pszPath)
+{
+ return (GetFileAttributes (pszPath) & FILE_ATTRIBUTE_DIRECTORY);
+}
+
BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength)
{
* Added "/N" option.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_MOVE
#include <windows.h>
#include <tchar.h>
#include <string.h>
+#include <ctype.h>
#include "cmd.h"
return 0;
}
-#endif /* INCLUDE_CMD_MOVE */
\ No newline at end of file
+#endif /* INCLUDE_CMD_MOVE */
* Fixed Win32 environment handling.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_PATH
* Unicode ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_PAUSE
* 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
*
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'):
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'):
* Added new error AND output redirection "&>" and "&>>".
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef FEATURE_REDIRECTION
* Unicode and redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_RENAME
--- /dev/null
+
+#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
* 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
#include "cmd.h"
-/* size of environment variable buffer */
+/* initial size of environment variable buffer */
#define ENV_BUFFER_SIZE 1024
lpOutput += (len + 1);
}
}
- FreeEnvironmentStrings (lpEnv);
+ FreeEnvironmentStrings (lpEnv);
}
return 0;
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);
* Unicode and redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#include <windows.h>
* Fixed time input bug.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_TIME
static VOID
PrintTime (VOID)
{
-#if 0
+#ifdef __REACTOS__
SYSTEMTIME st;
GetLocalTime (&st);
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
}
--- /dev/null
+/*
+ * 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
* Unicode and redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_TYPE
*
* 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"));
}
{
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 */
/* 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;
}
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"
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"
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
{
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;
* Unicode and redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_VERIFY
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_VOL
/*
- * 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
KDPC Dpc;
KTIMER Timer;
KEVENT Event;
- DWORD BeepOn;
+ LONG BeepOn;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
/* set up device extension */
pDeviceObject->Flags |= DO_BUFFERED_IO;
pDeviceExtension = pDeviceObject->DeviceExtension;
- pDeviceExtension->BeepOn = FALSE;
+ pDeviceExtension->BeepOn = 0; /* FALSE */
KeInitializeDpc (&(pDeviceExtension->Dpc),
BeepDPC,
#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 */
--- /dev/null
+/*
+ * 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_ */
+
#
# Required to run the system
#
-COMPONENTS = iface_native ntoskrnl kernel32 ntdll
+COMPONENTS = iface_native ntoskrnl kernel32 ntdll
# crtdll mingw32
#
#
# 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
#
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
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
mouse: dummy
make -C services/dd/mouse
-
+
serial: dummy
make -C services/dd/serial
* Redirection safe!
*/
-#define WIN32_LEAN_AND_MEAN
#include "config.h"
* Added handling of multiple filenames.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_ATTRIB
#include <windows.h>
#include <tchar.h>
#include <string.h>
+#include <ctype.h>
#include "cmd.h"
* 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"
*
*/
+#ifndef _BATCH_H_INCLUDED_
+#define _BATCH_H_INCLUDED_
+
typedef struct tagBATCHCONTEXT
{
VOID ExitBatch (LPTSTR);
BOOL Batch (LPTSTR, LPTSTR, LPTSTR);
LPTSTR ReadBatchLine (LPBOOL);
+
+#endif /* _BATCH_H_INCLUDED_ */
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_BEEP
if (bc == NULL)
return 1;
#endif
-
+#ifdef __REACTOS__
+ Beep (440, 50);
+#else
MessageBeep (-1);
+#endif
return 0;
}
* 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"
*
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_CHCP
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
+#include <string.h>
#include "cmd.h"
#include "chcp.h"
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_CLS
* 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"
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;
/* 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;
#endif
/* build command line for CreateProcess() */
_tcscpy (szFullCmdLine, szFullName);
- _tcscat (szFullCmdLine, " ");
+ _tcscat (szFullCmdLine, _T(" "));
_tcscat (szFullCmdLine, rest);
/* fill startup info */
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);
}
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...*/
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++;
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');
#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);
InitLastPath ();
#endif
- if (argc >= 2)
+ if (argc >= 2)
{
if (!_tcsncmp (argv[1], _T("/?"), 2))
{
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
}
#endif
/* remove ctrl handler */
-// SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE);
+#if 0
+ SetConsoleCtrlHandler ((PHANDLER_ROUTINE)&BreakHandler, FALSE);
+#endif
}
INT nExitCode;
AllocConsole ();
- SetFileApisToOEM ();
+#ifndef __REACTOS__
+ SetFileApisToOEM ();
+#endif
/* check switches on command-line */
Initialize (argc, argv);
* 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
-/* prototypes for CMD.C */
+/* Prototypes for CMD.C */
extern HANDLE hOut;
extern HANDLE hIn;
extern WORD wColor;
extern BOOL bCtrlBreak;
extern BOOL bIgnoreEcho;
extern BOOL bExit;
-extern int errorlevel;
+extern INT nErrorLevel;
extern SHORT maxx;
extern SHORT maxy;
extern OSVERSIONINFO osvi;
-/* 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
} 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 */
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);
INT cmd_popd (LPTSTR, LPTSTR);
+/* Prototypes for ECHO.C */
+INT cmd_echo (LPTSTR, LPTSTR);
+
+
/* Prototypes for ERROR.C */
VOID ErrorMessage (DWORD, 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);
#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;
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
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_ */
* 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>
{
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);
}
if (bEcho)
PrintPrompt();
- orgx = wherex ();
- orgy = wherey ();
+ GetCursorXY (&orgx, &orgy);
memset (str, 0, maxlen * sizeof (TCHAR));
{
/* 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--;
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;
/* goto beginning of string */
if (current != 0)
{
- goxy (orgx, orgy);
+ SetCursorXY (orgx, orgy);
current = 0;
}
break;
/* goto end of string */
if (current != charcount)
{
- goxy (orgx, orgy);
+ SetCursorXY (orgx, orgy);
ConOutPrintf (_T("%s"), str);
current = charcount;
}
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--;
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
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;
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
#if 0
else
{
-// Beep (440, 100);
+#ifdef __REACTOS__
+ Beep (440, 100);
+#else
MessageBeep (-1);
+#endif
}
#endif
break;
* Unicode ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#include <windows.h>
{_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
* Redirection ready!
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_COLOR
*
*/
+#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
#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
*/
+
+
+#endif /* _CONFIG_H_INCLUDED_ */
* 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"
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);
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);
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);
-/*
- * goxy -- move the cursor on the screen.
- */
-VOID goxy (SHORT x, SHORT y)
+VOID SetCursorXY (SHORT x, SHORT y)
{
COORD coPos;
}
-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;
}
-SHORT wherey (VOID)
+SHORT GetCursorY (VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
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;
-}
* Replaced CRT io functions by Win32 io functions.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_COPY
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);
-static BOOL IsDirectory (LPTSTR fn)
+static BOOL
+IsDirectory (LPTSTR fn)
{
if (!IsValidFileName (fn))
return FALSE;
}
-static BOOL DoSwitches (LPTSTR arg, LPDWORD lpdwFlags)
+static BOOL
+DoSwitches (LPTSTR arg, LPDWORD lpdwFlags)
{
if (!_tcsicmp (arg, _T("/-Y")))
{
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)
{
static BOOL
AddFiles (LPFILES f, char *arg, int *source, int *dest,
- int *count, unsigned *flags)
+ int *count, LPDWORD flags)
{
char t[128];
int j;
}
-static BOOL GetDestination (LPFILES f, LPFILES dest)
+static BOOL
+GetDestination (LPFILES f, LPFILES dest)
{
LPFILES p;
LPFILES start = f;
* Fixed date input bug.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_DATE
static VOID
PrintDate (VOID)
{
-#if 0
+#ifdef __REACTOS__
SYSTEMTIME st;
GetLocalTime (&st);
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
}
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)
* First working version.
*/
-#define WIN32_LEAN_AND_MEAN
-
#include "config.h"
#ifdef INCLUDE_CMD_DEL
#include <tchar.h>
#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
#include "cmd.h"
else if (*p == _T('\03'))
return PROMPT_BREAK;
#endif
+
+ return PROMPT_NO;
}
*
* 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.
/* 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;
/*
*/
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"
"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;
/*
- * 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;
}
}
*
* 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;
}
}
/* 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;
}
* 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 ();
}
* 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];
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))
{
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;
* 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;
{
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;
}
{
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;
}
*
*/
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:\\");
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;
*
* 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;
}
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;
}
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
/*
* _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;
}
*/
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 */
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