mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 00:54:40 +00:00
* Move (optional) wildcard expansion to split()
* Only expand arguments actually containing wildcard characters (to prevent expanding directory names to all files within that directory) svn path=/trunk/; revision=4018
This commit is contained in:
parent
1bfce04639
commit
3ade7829d0
16 changed files with 120 additions and 97 deletions
|
@ -224,7 +224,7 @@ INT CommandAttrib (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build parameter array */
|
/* build parameter array */
|
||||||
arg = split (param, &argc);
|
arg = split (param, &argc, FALSE);
|
||||||
|
|
||||||
/* check for options */
|
/* check for options */
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
|
|
|
@ -53,7 +53,7 @@ INT CommandChcp (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get parameters */
|
/* get parameters */
|
||||||
arg = split (param, &args);
|
arg = split (param, &args, FALSE);
|
||||||
|
|
||||||
/* save old code page */
|
/* save old code page */
|
||||||
uOldCodePage = GetConsoleCP ();
|
uOldCodePage = GetConsoleCP ();
|
||||||
|
|
|
@ -160,7 +160,7 @@ CommandChoice (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build parameter array */
|
/* build parameter array */
|
||||||
arg = split (param, &argc);
|
arg = split (param, &argc, FALSE);
|
||||||
|
|
||||||
/* evaluate arguments */
|
/* evaluate arguments */
|
||||||
if (argc > 0)
|
if (argc > 0)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: cmd.h,v 1.21 2001/02/03 10:37:51 ekohl Exp $
|
/* $Id: cmd.h,v 1.22 2003/01/17 00:31:32 gvg Exp $
|
||||||
*
|
*
|
||||||
* CMD.H - header file for the modules in CMD.EXE
|
* CMD.H - header file for the modules in CMD.EXE
|
||||||
*
|
*
|
||||||
|
@ -303,7 +303,7 @@ INT CommandMemory (LPTSTR, LPTSTR);
|
||||||
/* Prototypes for MISC.C */
|
/* Prototypes for MISC.C */
|
||||||
TCHAR cgetchar (VOID);
|
TCHAR cgetchar (VOID);
|
||||||
BOOL CheckCtrlBreak (INT);
|
BOOL CheckCtrlBreak (INT);
|
||||||
LPTSTR *split (LPTSTR, LPINT);
|
LPTSTR *split (LPTSTR, LPINT, BOOL);
|
||||||
VOID freep (LPTSTR *);
|
VOID freep (LPTSTR *);
|
||||||
LPTSTR stpcpy (LPTSTR, LPTSTR);
|
LPTSTR stpcpy (LPTSTR, LPTSTR);
|
||||||
BOOL IsValidPathName (LPCTSTR);
|
BOOL IsValidPathName (LPCTSTR);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: copy.c,v 1.7 2000/04/08 14:50:47 ekohl Exp $
|
/* $Id: copy.c,v 1.8 2003/01/17 00:31:32 gvg Exp $
|
||||||
*
|
*
|
||||||
* COPY.C -- copy internal command.
|
* COPY.C -- copy internal command.
|
||||||
*
|
*
|
||||||
|
@ -647,7 +647,7 @@ INT cmd_copy (LPTSTR first, LPTSTR rest)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = split (rest, &argc);
|
p = split (rest, &argc, FALSE);
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -202,7 +202,7 @@ INT cmd_date (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build parameter array */
|
/* build parameter array */
|
||||||
arg = split (param, &argc);
|
arg = split (param, &argc, FALSE);
|
||||||
|
|
||||||
/* check for options */
|
/* check for options */
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
|
|
|
@ -111,7 +111,7 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg = split (param, &args);
|
arg = split (param, &args, FALSE);
|
||||||
|
|
||||||
if (args > 0)
|
if (args > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,7 +150,7 @@ INT CommandFree (LPTSTR cmd, LPTSTR param)
|
||||||
else
|
else
|
||||||
szParam = param;
|
szParam = param;
|
||||||
|
|
||||||
arg = split (szParam, &argc);
|
arg = split (szParam, &argc, FALSE);
|
||||||
|
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
PrintDiskInfo (arg[i]);
|
PrintDiskInfo (arg[i]);
|
||||||
|
|
|
@ -314,7 +314,7 @@ INT cmd_mkdir (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p = split (param, &argc);
|
p = split (param, &argc, FALSE);
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
/*JPP 20-Jul-1998 use standard error message */
|
/*JPP 20-Jul-1998 use standard error message */
|
||||||
|
@ -387,7 +387,7 @@ INT cmd_rmdir (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p = split (param, &argc);
|
p = split (param, &argc, FALSE);
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
/*JPP 20-Jul-1998 use standard error message */
|
/*JPP 20-Jul-1998 use standard error message */
|
||||||
|
|
|
@ -47,7 +47,7 @@ INT cmd_label (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get parameters */
|
/* get parameters */
|
||||||
arg = split (param, &args);
|
arg = split (param, &args, FALSE);
|
||||||
|
|
||||||
if (args > 2)
|
if (args > 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
//#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
|
@ -122,16 +121,65 @@ BOOL CheckCtrlBreak (INT mode)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* add new entry for new argument */
|
||||||
|
static BOOL add_entry (LPINT ac, LPTSTR **arg, LPTSTR entry)
|
||||||
|
{
|
||||||
|
LPTSTR q;
|
||||||
|
LPTSTR *oldarg;
|
||||||
|
|
||||||
|
q = malloc ((_tcslen(entry) + 1) * sizeof (TCHAR));
|
||||||
|
if (NULL == q)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
_tcscpy (q, entry);
|
||||||
|
|
||||||
|
oldarg = *arg;
|
||||||
|
*arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR));
|
||||||
|
if (NULL == *arg)
|
||||||
|
{
|
||||||
|
*arg = oldarg;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save new entry */
|
||||||
|
(*arg)[*ac] = q;
|
||||||
|
(*arg)[++(*ac)] = NULL;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL expand (LPINT ac, LPTSTR **arg, LPTSTR pattern)
|
||||||
|
{
|
||||||
|
HANDLE hFind;
|
||||||
|
WIN32_FIND_DATA FindData;
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
hFind = FindFirstFile (pattern, &FindData);
|
||||||
|
if (INVALID_HANDLE_VALUE != hFind)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ok = add_entry(ac, arg, FindData.cFileName);
|
||||||
|
} while (FindNextFile (hFind, &FindData) && ok);
|
||||||
|
FindClose (hFind);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ok = add_entry(ac, arg, pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* split - splits a line up into separate arguments, deliminators
|
* split - splits a line up into separate arguments, deliminators
|
||||||
* are spaces and slashes ('/').
|
* are spaces and slashes ('/').
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LPTSTR *split (LPTSTR s, LPINT args)
|
LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards)
|
||||||
{
|
{
|
||||||
LPTSTR *arg;
|
LPTSTR *arg;
|
||||||
LPTSTR *p;
|
|
||||||
LPTSTR start;
|
LPTSTR start;
|
||||||
LPTSTR q;
|
LPTSTR q;
|
||||||
INT ac;
|
INT ac;
|
||||||
|
@ -178,24 +226,33 @@ LPTSTR *split (LPTSTR s, LPINT args)
|
||||||
/* a word was found */
|
/* a word was found */
|
||||||
if (s != start)
|
if (s != start)
|
||||||
{
|
{
|
||||||
/* add new entry for new argument */
|
q = malloc (((len = s - start) + 1) * sizeof (TCHAR));
|
||||||
arg = realloc (p = arg, (ac + 2) * sizeof (LPTSTR));
|
|
||||||
if (!arg)
|
|
||||||
{
|
|
||||||
freep (p);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create new entry */
|
|
||||||
q = arg[ac] = malloc (((len = s - start) + 1) * sizeof (TCHAR));
|
|
||||||
arg[++ac] = NULL;
|
|
||||||
if (!q)
|
if (!q)
|
||||||
{
|
{
|
||||||
freep (arg);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
memcpy (q, start, len * sizeof (TCHAR));
|
memcpy (q, start, len * sizeof (TCHAR));
|
||||||
q[len] = _T('\0');
|
q[len] = _T('\0');
|
||||||
|
if (expand_wildcards && _T('/') != *start &&
|
||||||
|
(NULL != _tcschr(q, _T('*')) || NULL != _tcschr(q, _T('?'))))
|
||||||
|
{
|
||||||
|
if (! expand(&ac, &arg, q))
|
||||||
|
{
|
||||||
|
free (q);
|
||||||
|
freep (arg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! add_entry(&ac, &arg, q))
|
||||||
|
{
|
||||||
|
free (q);
|
||||||
|
freep (arg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free (q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust string pointer if quoted (") */
|
/* adjust string pointer if quoted (") */
|
||||||
|
|
|
@ -110,7 +110,7 @@ INT cmd_move (LPTSTR cmd, LPTSTR param)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg = split (param, &argc);
|
arg = split (param, &argc, FALSE);
|
||||||
nFiles = argc;
|
nFiles = argc;
|
||||||
|
|
||||||
/* read options */
|
/* read options */
|
||||||
|
|
|
@ -84,7 +84,7 @@ INT cmd_rename (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* split the argument list */
|
/* split the argument list */
|
||||||
arg = split(param, &args);
|
arg = split(param, &args, FALSE);
|
||||||
|
|
||||||
if (args < 2)
|
if (args < 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -155,7 +155,7 @@ INT cmd_time (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build parameter array */
|
/* build parameter array */
|
||||||
arg = split (param, &argc);
|
arg = split (param, &argc, FALSE);
|
||||||
|
|
||||||
/* check for options */
|
/* check for options */
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
|
|
|
@ -132,7 +132,7 @@ INT CommandTimer (LPTSTR cmd, LPTSTR param)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
p = split (param,&argc);
|
p = split (param, &argc, FALSE);
|
||||||
|
|
||||||
//read options
|
//read options
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
|
|
|
@ -37,18 +37,16 @@
|
||||||
INT cmd_type (LPTSTR cmd, LPTSTR param)
|
INT cmd_type (LPTSTR cmd, LPTSTR param)
|
||||||
{
|
{
|
||||||
TCHAR buff[256];
|
TCHAR buff[256];
|
||||||
HANDLE hFile, hConsoleOut, hFind;
|
HANDLE hFile, hConsoleOut;
|
||||||
DWORD dwRead;
|
DWORD dwRead;
|
||||||
DWORD dwWritten;
|
DWORD dwWritten;
|
||||||
BOOL bRet;
|
BOOL bRet;
|
||||||
INT argc,i;
|
INT argc,i;
|
||||||
LPTSTR *argv;
|
LPTSTR *argv;
|
||||||
WIN32_FIND_DATA FindData;
|
LPTSTR errmsg;
|
||||||
|
|
||||||
hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE);
|
hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!_tcsncmp (param, _T("/?"), 2))
|
if (!_tcsncmp (param, _T("/?"), 2))
|
||||||
{
|
{
|
||||||
ConOutPuts (_T("Displays the contents of text files.\n\n"
|
ConOutPuts (_T("Displays the contents of text files.\n\n"
|
||||||
|
@ -62,81 +60,49 @@ INT cmd_type (LPTSTR cmd, LPTSTR param)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv = split (param, &argc);
|
argv = split (param, &argc, TRUE);
|
||||||
|
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
{
|
{
|
||||||
hFind=FindFirstFile(argv[i],&FindData);
|
if (_T('/') == argv[i][0])
|
||||||
|
|
||||||
if (hFind==INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
ConErrPrintf("File not found - %s\n",argv[i]);
|
ConErrPrintf("Invalid option \"%s\"\n", argv[i] + 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
hFile = CreateFile(argv[i],
|
||||||
|
GENERIC_READ,
|
||||||
|
FILE_SHARE_READ,NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,NULL);
|
||||||
|
|
||||||
|
if(hFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
|
FORMAT_MESSAGE_IGNORE_INSERTS |
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM,
|
||||||
|
NULL,
|
||||||
|
GetLastError(),
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
|
(LPTSTR) &errmsg,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
ConErrPrintf ("%s - %s", argv[i], errmsg);
|
||||||
|
LocalFree (errmsg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
hFile = CreateFile(FindData.cFileName,
|
bRet = ReadFile(hFile,buff,sizeof(buff),&dwRead,NULL);
|
||||||
GENERIC_READ,
|
|
||||||
FILE_SHARE_READ,NULL,
|
|
||||||
OPEN_EXISTING,
|
|
||||||
FILE_ATTRIBUTE_NORMAL,NULL);
|
|
||||||
|
|
||||||
if(hFile == INVALID_HANDLE_VALUE)
|
if (dwRead>0 && bRet)
|
||||||
{
|
WriteFile(hConsoleOut,buff,dwRead,&dwWritten,NULL);
|
||||||
ConErrPrintf("File not found - %s\n",FindData.cFileName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
bRet = ReadFile(hFile,buff,sizeof(buff),&dwRead,NULL);
|
|
||||||
|
|
||||||
if (dwRead>0 && bRet)
|
|
||||||
WriteFile(hConsoleOut,buff,dwRead,&dwWritten,NULL);
|
|
||||||
|
|
||||||
} while(dwRead>0 && bRet);
|
} while(dwRead>0 && bRet);
|
||||||
|
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
|
|
||||||
}
|
|
||||||
while(FindNextFile(hFind,&FindData));
|
|
||||||
|
|
||||||
FindClose(hFind);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (args > 1)
|
|
||||||
{
|
|
||||||
error_too_many_parameters (_T("\b \b"));
|
|
||||||
freep (arg);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hFile = CreateFile (arg[0], GENERIC_READ, FILE_SHARE_READ,
|
|
||||||
NULL, OPEN_EXISTING,
|
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
error_sfile_not_found (param);
|
|
||||||
freep (arg);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
bResult = ReadFile (hFile, szBuffer, sizeof(szBuffer),
|
|
||||||
&dwBytesRead, NULL);
|
|
||||||
if (dwBytesRead)
|
|
||||||
WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), szBuffer, dwBytesRead,
|
|
||||||
&dwBytesWritten, NULL);
|
|
||||||
}
|
|
||||||
while (bResult && dwBytesRead > 0);
|
|
||||||
|
|
||||||
CloseHandle (hFile);
|
|
||||||
*/
|
|
||||||
freep (argv);
|
freep (argv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue