nullterm correct string in strndup nullterm argv list reformat Modified: trunk/reactos/lib/crt/misc/getargs.c _____
Modified: trunk/reactos/lib/crt/misc/getargs.c --- trunk/reactos/lib/crt/misc/getargs.c 2005-10-11 00:58:45 UTC (rev 18405) +++ trunk/reactos/lib/crt/misc/getargs.c 2005-10-11 03:23:01 UTC (rev 18406) @@ -16,128 +16,153 @@
wchar_t**__wargv = NULL; int __argc = 0;
+extern wchar_t **__winitenv; + extern HANDLE hHeap;
char* strndup(char* name, int len) { - char *s = malloc(len + 1); - if (s != NULL) { - strncpy(s, name, len); - name[len] = 0; - } - return s; + char *s = malloc(len + 1); + if (s != NULL) + { + memcpy(s, name, len); + s[len] = 0; + } + return s; }
#define SIZE (4096 / sizeof(char*))
-int add(char* name) +int add + (char* name) { - char** _new; - if ((__argc % SIZE) == 0) { - if (__argv == NULL) - _new = malloc(sizeof(char*) * SIZE); - else - _new = realloc(__argv, sizeof(char*) * (__argc + SIZE)); - if (_new == NULL) - return -1; - __argv = _new; - } - __argv[__argc++] = name; - return 0; + char** _new; + if ((__argc % SIZE) == 0) + { + if (__argv == NULL) + _new = malloc(sizeof(char*) * (1 + SIZE)); + else + _new = realloc(__argv, sizeof(char*) * (__argc + 1 + SIZE)); + if (_new == NULL) + return -1; + __argv = _new; + } + __argv[__argc++] = name; + __argv[__argc] = NULL; + return 0; }
-int expand(char* name, int flag) +int expand(char* name, int expand_wildcards) { - char* s; - WIN32_FIND_DATAA fd; - HANDLE hFile; - BOOLEAN first = TRUE; - char buffer[256]; - int pos; + char* s; + WIN32_FIND_DATAA fd; + HANDLE hFile; + BOOLEAN first = TRUE; + char buffer[256]; + int pos;
- s = strpbrk(name, "*?"); - if (s && flag) { - hFile = FindFirstFileA(name, &fd); - if (hFile != INVALID_HANDLE_VALUE) { - while(s != name && *s != '/' && *s != '\') - s--; - pos = s - name; - if (*s == '/' || *s == '\') - pos++; - strncpy(buffer, name, pos); - do { - if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - strcpy(&buffer[pos], fd.cFileName); - if (add(_strdup(buffer)) < 0) { - FindClose(hFile); - return -1; - } - first = FALSE; - } + if (expand_wildcards && (s = strpbrk(name, "*?"))) + { + hFile = FindFirstFileA(name, &fd); + if (hFile != INVALID_HANDLE_VALUE) + { + while(s != name && *s != '/' && *s != '\') + s--; + pos = s - name; + if (*s == '/' || *s == '\') + pos++; + strncpy(buffer, name, pos); + do + { + if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + strcpy(&buffer[pos], fd.cFileName); + if (add + (_strdup(buffer)) < 0) + { + FindClose(hFile); + return -1; + } + first = FALSE; } - while(FindNextFileA(hFile, &fd)); - FindClose(hFile); - } - } - if (first) { - if (add(name) < 0) - return -1; - } - else - free(name); - return 0; + } + while(FindNextFileA(hFile, &fd)); + FindClose(hFile); + } + } + if (first) + { + if (add + (name) < 0) + return -1; + } + else + free(name); + return 0; }
/* * @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; - afterlastspace = 0; - ignorespace = 0; - doexpand = flag; + i = 0; + afterlastspace = 0; + ignorespace = 0; + doexpand = expand_wildcards;
- len = strlen(_acmdln); + len = strlen(_acmdln);
- while (_acmdln[i]) { - if (_acmdln[i] == '"') { - if(ignorespace) { - ignorespace = 0; - } else { - ignorespace = 1; - doexpand = 0; - } - memmove(_acmdln + i, _acmdln + i + 1, len - i); - len--; - continue; - } + while (_acmdln[i]) + { + if (_acmdln[i] == '"') + { + if(ignorespace) + { + ignorespace = 0; + } + else + { + ignorespace = 1; + doexpand = 0; + } + memmove(_acmdln + i, _acmdln + i + 1, len - i); + len--; + continue; + }
- if (_acmdln[i] == ' ' && !ignorespace) { - expand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand); + if (_acmdln[i] == ' ' && !ignorespace) + { + expand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand); + i++; + while (_acmdln[i]==' ') i++; - while (_acmdln[i]==' ') - i++; - afterlastspace=i; - doexpand = flag; - } else { - i++; - } - } + afterlastspace=i; + doexpand = expand_wildcards; + } + else + { + i++; + } + }
- if (_acmdln[afterlastspace] != 0) { - expand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand); - } - HeapValidate(hHeap, 0, NULL); - *argc = __argc; - *argv = __argv; - *env = _environ; - _pgmptr = _strdup((char*)argv[0]); - return 0; + if (_acmdln[afterlastspace] != 0) + { + expand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand); + } + + HeapValidate(hHeap, 0, NULL); + + *argc = __argc; + *argv = __argv; + *env = _environ; + _pgmptr = _strdup((char*)argv[0]); + + // if (new_mode) _set_new_mode(*new_mode); }
/* @@ -146,10 +171,11 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv, int expand_wildcards, int* new_mode) { - extern wchar_t **__winitenv; - *argc = 0; - *wargv = NULL; - *wenv = __winitenv; + *argc = __argc; + *wargv = __wargv; + *wenv = __winitenv; + + // if (new_mode) _set_new_mode(*new_mode); }
/* @@ -157,7 +183,7 @@ */ int* __p___argc(void) { - return &__argc; + return &__argc; }
/* @@ -165,7 +191,7 @@ */ char*** __p___argv(void) { - return &__argv; + return &__argv; }
/* @@ -173,13 +199,13 @@ */ wchar_t*** __p___wargv(void) { - return &__wargv; + return &__wargv; }
#if 0 int _chkstk(void) { - return 0; + return 0; } #endif