- Implemented wgetmainargs.

- Fixed the allocating of argv if a empty cmd line is given.  
- Fixed the allocating of pgmptr.

svn path=/trunk/; revision=19501
This commit is contained in:
Hartmut Birr 2005-11-23 21:14:06 +00:00
parent b57ef29796
commit ec55f4fec0
4 changed files with 172 additions and 16 deletions

View file

@ -31,6 +31,8 @@ char **__initenv = NULL; /* pointer to initial environment block */
wchar_t **__winitenv = NULL; /* pointer to initial environment block */
#undef _pgmptr
char *_pgmptr = NULL; /* pointer to program name */
#undef _wpgmptr
wchar_t *_wpgmptr = NULL; /* pointer to program name */
int __app_type = 0; //_UNKNOWN_APP; /* application type */
int __mb_cur_max = 1;
@ -271,8 +273,7 @@ int SetEnv(const wchar_t *option)
* the environments are in sync and the option is at the
* same position. */
free(_environ[index]);
for (; _environ[index] != NULL; index++)
_environ[index] = _environ[index + 1];
memmove(&_environ[index], &_environ[index+1], (count - index) * sizeof(char*));
_environ = realloc(_environ, count * sizeof(char*));
result = SetEnvironmentVariableW(name, NULL) ? 0 : -1;
@ -372,6 +373,14 @@ char **__p__acmdln(void)
return &_acmdln;
}
/*
* @implemented
*/
wchar_t **__p__wcmdln(void)
{
return &_wcmdln;
}
/*
* @implemented
*/
@ -428,6 +437,14 @@ char **__p__pgmptr(void)
return &_pgmptr;
}
/*
* @implemented
*/
wchar_t **__p__wpgmptr(void)
{
return &_wpgmptr;
}
/*
* @implemented
*/

View file

@ -4,7 +4,11 @@
extern char*_acmdln;
extern wchar_t* _wcmdln;
#undef _pgmptr
extern char*_pgmptr;
#undef _wpgmptr
extern wchar_t*_wpgmptr;
#undef _environ
extern char**_environ;
@ -31,10 +35,85 @@ char* strndup(char* name, int len)
return s;
}
wchar_t* wcsndup(wchar_t* name, int len)
{
wchar_t *s = malloc((len + 1) * sizeof(wchar_t));
if (s != NULL)
{
memcpy(s, name, len*sizeof(wchar_t));
s[len] = 0;
}
return s;
}
#define SIZE (4096 / sizeof(char*))
int add
(char* name)
int wadd(wchar_t* name)
{
wchar_t** _new;
if ((__argc % SIZE) == 0)
{
if (__wargv == NULL)
_new = malloc(sizeof(wchar_t*) * (1 + SIZE));
else
_new = realloc(__wargv, sizeof(wchar_t*) * (__argc + 1 + SIZE));
if (_new == NULL)
return -1;
__wargv = _new;
}
__wargv[__argc++] = name;
__wargv[__argc] = NULL;
return 0;
}
int wexpand(wchar_t* name, int expand_wildcards)
{
wchar_t* s;
WIN32_FIND_DATAW fd;
HANDLE hFile;
BOOLEAN first = TRUE;
wchar_t buffer[256];
int pos;
if (expand_wildcards && (s = wcspbrk(name, L"*?")))
{
hFile = FindFirstFileW(name, &fd);
if (hFile != INVALID_HANDLE_VALUE)
{
while(s != name && *s != L'/' && *s != L'\\')
s--;
pos = s - name;
if (*s == L'/' || *s == L'\\')
pos++;
wcsncpy(buffer, name, pos);
do
{
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
wcscpy(&buffer[pos], fd.cFileName);
if (wadd(_wcsdup(buffer)) < 0)
{
FindClose(hFile);
return -1;
}
first = FALSE;
}
}
while(FindNextFileW(hFile, &fd));
FindClose(hFile);
}
}
if (first)
{
if (wadd(name) < 0)
return -1;
}
else
free(name);
return 0;
}
int aadd(char* name)
{
char** _new;
if ((__argc % SIZE) == 0)
@ -52,7 +131,7 @@ int add
return 0;
}
int expand(char* name, int expand_wildcards)
int aexpand(char* name, int expand_wildcards)
{
char* s;
WIN32_FIND_DATAA fd;
@ -77,8 +156,7 @@ int expand(char* name, int expand_wildcards)
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
strcpy(&buffer[pos], fd.cFileName);
if (add
(_strdup(buffer)) < 0)
if (aadd(_strdup(buffer)) < 0)
{
FindClose(hFile);
return -1;
@ -92,8 +170,7 @@ int expand(char* name, int expand_wildcards)
}
if (first)
{
if (add
(name) < 0)
if (aadd(name) < 0)
return -1;
}
else
@ -137,7 +214,7 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
if (_acmdln[i] == ' ' && !ignorespace)
{
expand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand);
aexpand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand);
i++;
while (_acmdln[i]==' ')
i++;
@ -152,15 +229,20 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
if (_acmdln[afterlastspace] != 0)
{
expand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand);
aexpand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand);
}
HeapValidate(hHeap, 0, NULL);
*argc = __argc;
if (__argv == NULL)
{
__argv = (char**)malloc(sizeof(char*));
__argv[0] = 0;
}
*argv = __argv;
*env = _environ;
_pgmptr = _strdup((char*)argv[0]);
_pgmptr = _strdup(__argv[0]);
// if (new_mode) _set_new_mode(*new_mode);
}
@ -171,9 +253,66 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
int expand_wildcards, int* new_mode)
{
int i, afterlastspace, ignorespace, len, doexpand;
/* missing threading init */
i = 0;
afterlastspace = 0;
ignorespace = 0;
doexpand = expand_wildcards;
len = wcslen(_wcmdln);
while (_wcmdln[i])
{
if (_wcmdln[i] == L'"')
{
if(ignorespace)
{
ignorespace = 0;
}
else
{
ignorespace = 1;
doexpand = 0;
}
memmove(_wcmdln + i, _wcmdln + i + 1, (len - i) * sizeof(wchar_t));
len--;
continue;
}
if (_wcmdln[i] == L' ' && !ignorespace)
{
wexpand(wcsndup(_wcmdln + afterlastspace, i - afterlastspace), doexpand);
i++;
while (_wcmdln[i]==L' ')
i++;
afterlastspace=i;
doexpand = expand_wildcards;
}
else
{
i++;
}
}
if (_wcmdln[afterlastspace] != 0)
{
wexpand(wcsndup(_wcmdln+afterlastspace, i - afterlastspace), doexpand);
}
HeapValidate(hHeap, 0, NULL);
*argc = __argc;
if (__wargv == NULL)
{
__wargv = (wchar_t**)malloc(sizeof(wchar_t*));
__wargv[0] = 0;
}
*wargv = __wargv;
*wenv = __winitenv;
_wpgmptr = _wcsdup(__wargv[0]);
// if (new_mode) _set_new_mode(*new_mode);
}

View file

@ -90,7 +90,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved)
if (BlockEnvToEnvironW() < 0)
{
FreeEnvironment((char**)_wenviron);
FreeEnvironment(_environ);
return FALSE;
}

View file

@ -147,12 +147,12 @@ __p__pgmptr
__p__pwctype
__p__timezone
__p__tzname=stub
__p__wcmdln=stub
__p__wcmdln
__p__wenviron
__p__winmajor
__p__winminor
__p__winver
__p__wpgmptr=stub
__p__wpgmptr
__pioinfo
__pxcptinfoptrs
__set_app_type
@ -561,7 +561,7 @@ _waccess
_wasctime
_wchdir
_wchmod
_wcmdln
_wcmdln DATA
_wcreat
_wcsdup
_wcserror=stub