nullterm correct string in strndup

nullterm argv list
reformat


svn path=/trunk/; revision=18406
This commit is contained in:
Gunnar Dalsnes 2005-10-11 03:23:01 +00:00
parent aa105de9d7
commit 75e85af499

View file

@ -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