mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 12:04:51 +00:00
nullterm correct string in strndup
nullterm argv list reformat svn path=/trunk/; revision=18406
This commit is contained in:
parent
aa105de9d7
commit
75e85af499
1 changed files with 129 additions and 103 deletions
|
@ -16,128 +16,153 @@ char**__argv = NULL;
|
||||||
wchar_t**__wargv = NULL;
|
wchar_t**__wargv = NULL;
|
||||||
int __argc = 0;
|
int __argc = 0;
|
||||||
|
|
||||||
|
extern wchar_t **__winitenv;
|
||||||
|
|
||||||
extern HANDLE hHeap;
|
extern HANDLE hHeap;
|
||||||
|
|
||||||
char* strndup(char* name, int len)
|
char* strndup(char* name, int len)
|
||||||
{
|
{
|
||||||
char *s = malloc(len + 1);
|
char *s = malloc(len + 1);
|
||||||
if (s != NULL) {
|
if (s != NULL)
|
||||||
strncpy(s, name, len);
|
{
|
||||||
name[len] = 0;
|
memcpy(s, name, len);
|
||||||
}
|
s[len] = 0;
|
||||||
return s;
|
}
|
||||||
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SIZE (4096 / sizeof(char*))
|
#define SIZE (4096 / sizeof(char*))
|
||||||
|
|
||||||
int add(char* name)
|
int add
|
||||||
|
(char* name)
|
||||||
{
|
{
|
||||||
char** _new;
|
char** _new;
|
||||||
if ((__argc % SIZE) == 0) {
|
if ((__argc % SIZE) == 0)
|
||||||
if (__argv == NULL)
|
{
|
||||||
_new = malloc(sizeof(char*) * SIZE);
|
if (__argv == NULL)
|
||||||
else
|
_new = malloc(sizeof(char*) * (1 + SIZE));
|
||||||
_new = realloc(__argv, sizeof(char*) * (__argc + SIZE));
|
else
|
||||||
if (_new == NULL)
|
_new = realloc(__argv, sizeof(char*) * (__argc + 1 + SIZE));
|
||||||
return -1;
|
if (_new == NULL)
|
||||||
__argv = _new;
|
return -1;
|
||||||
}
|
__argv = _new;
|
||||||
__argv[__argc++] = name;
|
}
|
||||||
return 0;
|
__argv[__argc++] = name;
|
||||||
|
__argv[__argc] = NULL;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int expand(char* name, int flag)
|
int expand(char* name, int expand_wildcards)
|
||||||
{
|
{
|
||||||
char* s;
|
char* s;
|
||||||
WIN32_FIND_DATAA fd;
|
WIN32_FIND_DATAA fd;
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
BOOLEAN first = TRUE;
|
BOOLEAN first = TRUE;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
s = strpbrk(name, "*?");
|
if (expand_wildcards && (s = strpbrk(name, "*?")))
|
||||||
if (s && flag) {
|
{
|
||||||
hFile = FindFirstFileA(name, &fd);
|
hFile = FindFirstFileA(name, &fd);
|
||||||
if (hFile != INVALID_HANDLE_VALUE) {
|
if (hFile != INVALID_HANDLE_VALUE)
|
||||||
while(s != name && *s != '/' && *s != '\\')
|
{
|
||||||
s--;
|
while(s != name && *s != '/' && *s != '\\')
|
||||||
pos = s - name;
|
s--;
|
||||||
if (*s == '/' || *s == '\\')
|
pos = s - name;
|
||||||
pos++;
|
if (*s == '/' || *s == '\\')
|
||||||
strncpy(buffer, name, pos);
|
pos++;
|
||||||
do {
|
strncpy(buffer, name, pos);
|
||||||
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
do
|
||||||
strcpy(&buffer[pos], fd.cFileName);
|
{
|
||||||
if (add(_strdup(buffer)) < 0) {
|
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
FindClose(hFile);
|
{
|
||||||
return -1;
|
strcpy(&buffer[pos], fd.cFileName);
|
||||||
}
|
if (add
|
||||||
first = FALSE;
|
(_strdup(buffer)) < 0)
|
||||||
}
|
{
|
||||||
|
FindClose(hFile);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
first = FALSE;
|
||||||
}
|
}
|
||||||
while(FindNextFileA(hFile, &fd));
|
}
|
||||||
FindClose(hFile);
|
while(FindNextFileA(hFile, &fd));
|
||||||
}
|
FindClose(hFile);
|
||||||
}
|
}
|
||||||
if (first) {
|
}
|
||||||
if (add(name) < 0)
|
if (first)
|
||||||
return -1;
|
{
|
||||||
}
|
if (add
|
||||||
else
|
(name) < 0)
|
||||||
free(name);
|
return -1;
|
||||||
return 0;
|
}
|
||||||
|
else
|
||||||
|
free(name);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
int __getmainargs(int* argc, char*** argv, char*** env, int flag)
|
void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, int* new_mode)
|
||||||
{
|
{
|
||||||
int i, afterlastspace, ignorespace, len, doexpand;
|
int i, afterlastspace, ignorespace, len, doexpand;
|
||||||
|
|
||||||
/* missing threading init */
|
/* missing threading init */
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
afterlastspace = 0;
|
afterlastspace = 0;
|
||||||
ignorespace = 0;
|
ignorespace = 0;
|
||||||
doexpand = flag;
|
doexpand = expand_wildcards;
|
||||||
|
|
||||||
len = strlen(_acmdln);
|
len = strlen(_acmdln);
|
||||||
|
|
||||||
while (_acmdln[i]) {
|
while (_acmdln[i])
|
||||||
if (_acmdln[i] == '"') {
|
{
|
||||||
if(ignorespace) {
|
if (_acmdln[i] == '"')
|
||||||
ignorespace = 0;
|
{
|
||||||
} else {
|
if(ignorespace)
|
||||||
ignorespace = 1;
|
{
|
||||||
doexpand = 0;
|
ignorespace = 0;
|
||||||
}
|
}
|
||||||
memmove(_acmdln + i, _acmdln + i + 1, len - i);
|
else
|
||||||
len--;
|
{
|
||||||
continue;
|
ignorespace = 1;
|
||||||
}
|
doexpand = 0;
|
||||||
|
}
|
||||||
|
memmove(_acmdln + i, _acmdln + i + 1, len - i);
|
||||||
|
len--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (_acmdln[i] == ' ' && !ignorespace) {
|
if (_acmdln[i] == ' ' && !ignorespace)
|
||||||
expand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand);
|
{
|
||||||
|
expand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand);
|
||||||
|
i++;
|
||||||
|
while (_acmdln[i]==' ')
|
||||||
i++;
|
i++;
|
||||||
while (_acmdln[i]==' ')
|
afterlastspace=i;
|
||||||
i++;
|
doexpand = expand_wildcards;
|
||||||
afterlastspace=i;
|
}
|
||||||
doexpand = flag;
|
else
|
||||||
} else {
|
{
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_acmdln[afterlastspace] != 0) {
|
if (_acmdln[afterlastspace] != 0)
|
||||||
expand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand);
|
{
|
||||||
}
|
expand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand);
|
||||||
HeapValidate(hHeap, 0, NULL);
|
}
|
||||||
*argc = __argc;
|
|
||||||
*argv = __argv;
|
HeapValidate(hHeap, 0, NULL);
|
||||||
*env = _environ;
|
|
||||||
_pgmptr = _strdup((char*)argv[0]);
|
*argc = __argc;
|
||||||
return 0;
|
*argv = __argv;
|
||||||
|
*env = _environ;
|
||||||
|
_pgmptr = _strdup((char*)argv[0]);
|
||||||
|
|
||||||
|
// if (new_mode) _set_new_mode(*new_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -146,10 +171,11 @@ int __getmainargs(int* argc, char*** argv, char*** env, int flag)
|
||||||
void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
int expand_wildcards, int* new_mode)
|
int expand_wildcards, int* new_mode)
|
||||||
{
|
{
|
||||||
extern wchar_t **__winitenv;
|
*argc = __argc;
|
||||||
*argc = 0;
|
*wargv = __wargv;
|
||||||
*wargv = NULL;
|
*wenv = __winitenv;
|
||||||
*wenv = __winitenv;
|
|
||||||
|
// if (new_mode) _set_new_mode(*new_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -157,7 +183,7 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
*/
|
*/
|
||||||
int* __p___argc(void)
|
int* __p___argc(void)
|
||||||
{
|
{
|
||||||
return &__argc;
|
return &__argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -165,7 +191,7 @@ int* __p___argc(void)
|
||||||
*/
|
*/
|
||||||
char*** __p___argv(void)
|
char*** __p___argv(void)
|
||||||
{
|
{
|
||||||
return &__argv;
|
return &__argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -173,13 +199,13 @@ char*** __p___argv(void)
|
||||||
*/
|
*/
|
||||||
wchar_t*** __p___wargv(void)
|
wchar_t*** __p___wargv(void)
|
||||||
{
|
{
|
||||||
return &__wargv;
|
return &__wargv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int _chkstk(void)
|
int _chkstk(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue