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 */
|
||||
arg = split (param, &argc);
|
||||
arg = split (param, &argc, FALSE);
|
||||
|
||||
/* check for options */
|
||||
for (i = 0; i < argc; i++)
|
||||
|
|
|
@ -53,7 +53,7 @@ INT CommandChcp (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* get parameters */
|
||||
arg = split (param, &args);
|
||||
arg = split (param, &args, FALSE);
|
||||
|
||||
/* save old code page */
|
||||
uOldCodePage = GetConsoleCP ();
|
||||
|
|
|
@ -160,7 +160,7 @@ CommandChoice (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* build parameter array */
|
||||
arg = split (param, &argc);
|
||||
arg = split (param, &argc, FALSE);
|
||||
|
||||
/* evaluate arguments */
|
||||
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
|
||||
*
|
||||
|
@ -303,7 +303,7 @@ INT CommandMemory (LPTSTR, LPTSTR);
|
|||
/* Prototypes for MISC.C */
|
||||
TCHAR cgetchar (VOID);
|
||||
BOOL CheckCtrlBreak (INT);
|
||||
LPTSTR *split (LPTSTR, LPINT);
|
||||
LPTSTR *split (LPTSTR, LPINT, BOOL);
|
||||
VOID freep (LPTSTR *);
|
||||
LPTSTR stpcpy (LPTSTR, LPTSTR);
|
||||
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.
|
||||
*
|
||||
|
@ -647,7 +647,7 @@ INT cmd_copy (LPTSTR first, LPTSTR rest)
|
|||
return 1;
|
||||
}
|
||||
|
||||
p = split (rest, &argc);
|
||||
p = split (rest, &argc, FALSE);
|
||||
|
||||
if (argc == 0)
|
||||
{
|
||||
|
|
|
@ -202,7 +202,7 @@ INT cmd_date (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* build parameter array */
|
||||
arg = split (param, &argc);
|
||||
arg = split (param, &argc, FALSE);
|
||||
|
||||
/* check for options */
|
||||
for (i = 0; i < argc; i++)
|
||||
|
|
|
@ -111,7 +111,7 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
arg = split (param, &args);
|
||||
arg = split (param, &args, FALSE);
|
||||
|
||||
if (args > 0)
|
||||
{
|
||||
|
|
|
@ -150,7 +150,7 @@ INT CommandFree (LPTSTR cmd, LPTSTR param)
|
|||
else
|
||||
szParam = param;
|
||||
|
||||
arg = split (szParam, &argc);
|
||||
arg = split (szParam, &argc, FALSE);
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
PrintDiskInfo (arg[i]);
|
||||
|
|
|
@ -314,7 +314,7 @@ INT cmd_mkdir (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
else
|
||||
{
|
||||
p = split (param, &argc);
|
||||
p = split (param, &argc, FALSE);
|
||||
if (argc > 1)
|
||||
{
|
||||
/*JPP 20-Jul-1998 use standard error message */
|
||||
|
@ -387,7 +387,7 @@ INT cmd_rmdir (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
else
|
||||
{
|
||||
p = split (param, &argc);
|
||||
p = split (param, &argc, FALSE);
|
||||
if (argc > 1)
|
||||
{
|
||||
/*JPP 20-Jul-1998 use standard error message */
|
||||
|
|
|
@ -47,7 +47,7 @@ INT cmd_label (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* get parameters */
|
||||
arg = split (param, &args);
|
||||
arg = split (param, &args, FALSE);
|
||||
|
||||
if (args > 2)
|
||||
{
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
//#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
|
||||
|
@ -122,16 +121,65 @@ BOOL CheckCtrlBreak (INT mode)
|
|||
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
|
||||
* are spaces and slashes ('/').
|
||||
*/
|
||||
|
||||
LPTSTR *split (LPTSTR s, LPINT args)
|
||||
LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards)
|
||||
{
|
||||
LPTSTR *arg;
|
||||
LPTSTR *p;
|
||||
LPTSTR start;
|
||||
LPTSTR q;
|
||||
INT ac;
|
||||
|
@ -178,24 +226,33 @@ LPTSTR *split (LPTSTR s, LPINT args)
|
|||
/* a word was found */
|
||||
if (s != start)
|
||||
{
|
||||
/* add new entry for new argument */
|
||||
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;
|
||||
q = malloc (((len = s - start) + 1) * sizeof (TCHAR));
|
||||
if (!q)
|
||||
{
|
||||
freep (arg);
|
||||
return NULL;
|
||||
}
|
||||
memcpy (q, start, len * sizeof (TCHAR));
|
||||
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 (") */
|
||||
|
|
|
@ -110,7 +110,7 @@ INT cmd_move (LPTSTR cmd, LPTSTR param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
arg = split (param, &argc);
|
||||
arg = split (param, &argc, FALSE);
|
||||
nFiles = argc;
|
||||
|
||||
/* read options */
|
||||
|
|
|
@ -84,7 +84,7 @@ INT cmd_rename (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* split the argument list */
|
||||
arg = split(param, &args);
|
||||
arg = split(param, &args, FALSE);
|
||||
|
||||
if (args < 2)
|
||||
{
|
||||
|
|
|
@ -155,7 +155,7 @@ INT cmd_time (LPTSTR cmd, LPTSTR param)
|
|||
}
|
||||
|
||||
/* build parameter array */
|
||||
arg = split (param, &argc);
|
||||
arg = split (param, &argc, FALSE);
|
||||
|
||||
/* check for options */
|
||||
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
|
||||
for (i = 0; i < argc; i++)
|
||||
|
|
|
@ -37,18 +37,16 @@
|
|||
INT cmd_type (LPTSTR cmd, LPTSTR param)
|
||||
{
|
||||
TCHAR buff[256];
|
||||
HANDLE hFile, hConsoleOut, hFind;
|
||||
HANDLE hFile, hConsoleOut;
|
||||
DWORD dwRead;
|
||||
DWORD dwWritten;
|
||||
BOOL bRet;
|
||||
INT argc,i;
|
||||
LPTSTR *argv;
|
||||
WIN32_FIND_DATA FindData;
|
||||
LPTSTR errmsg;
|
||||
|
||||
hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE);
|
||||
|
||||
|
||||
|
||||
if (!_tcsncmp (param, _T("/?"), 2))
|
||||
{
|
||||
ConOutPuts (_T("Displays the contents of text files.\n\n"
|
||||
|
@ -62,81 +60,49 @@ INT cmd_type (LPTSTR cmd, LPTSTR param)
|
|||
return 1;
|
||||
}
|
||||
|
||||
argv = split (param, &argc);
|
||||
argv = split (param, &argc, TRUE);
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
hFind=FindFirstFile(argv[i],&FindData);
|
||||
|
||||
if (hFind==INVALID_HANDLE_VALUE)
|
||||
if (_T('/') == argv[i][0])
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
hFile = CreateFile(FindData.cFileName,
|
||||
GENERIC_READ,
|
||||
FILE_SHARE_READ,NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,NULL);
|
||||
bRet = ReadFile(hFile,buff,sizeof(buff),&dwRead,NULL);
|
||||
|
||||
if(hFile == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
ConErrPrintf("File not found - %s\n",FindData.cFileName);
|
||||
continue;
|
||||
}
|
||||
if (dwRead>0 && bRet)
|
||||
WriteFile(hConsoleOut,buff,dwRead,&dwWritten,NULL);
|
||||
|
||||
do
|
||||
{
|
||||
bRet = ReadFile(hFile,buff,sizeof(buff),&dwRead,NULL);
|
||||
} while(dwRead>0 && bRet);
|
||||
|
||||
if (dwRead>0 && bRet)
|
||||
WriteFile(hConsoleOut,buff,dwRead,&dwWritten,NULL);
|
||||
|
||||
} while(dwRead>0 && bRet);
|
||||
|
||||
CloseHandle(hFile);
|
||||
|
||||
}
|
||||
while(FindNextFile(hFind,&FindData));
|
||||
|
||||
FindClose(hFind);
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
|
||||
/*
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue