7 extern wchar_t* _wcmdln
;
11 extern wchar_t*_wpgmptr
;
13 extern char**_environ
;
20 wchar_t**__wargv
= NULL
;
23 extern wchar_t **__winitenv
;
25 char* strndup(char const* name
, size_t len
)
27 char *s
= malloc(len
+ 1);
36 wchar_t* wcsndup(wchar_t* name
, size_t len
)
38 wchar_t *s
= malloc((len
+ 1) * sizeof(wchar_t));
41 memcpy(s
, name
, len
*sizeof(wchar_t));
47 #define SIZE (4096 / sizeof(char*))
49 int wadd(wchar_t* name
)
52 if ((__argc
% SIZE
) == 0)
55 _new
= malloc(sizeof(wchar_t*) * (1 + SIZE
));
57 _new
= realloc(__wargv
, sizeof(wchar_t*) * (__argc
+ 1 + SIZE
));
62 __wargv
[__argc
++] = name
;
63 __wargv
[__argc
] = NULL
;
67 int wexpand(wchar_t* name
, int expand_wildcards
)
76 if (expand_wildcards
&& (s
= wcspbrk(name
, L
"*?")))
78 hFile
= FindFirstFileW(name
, &fd
);
79 if (hFile
!= INVALID_HANDLE_VALUE
)
81 while(s
!= name
&& *s
!= L
'/' && *s
!= L
'\\')
84 if (*s
== L
'/' || *s
== L
'\\')
86 wcsncpy(buffer
, name
, pos
);
89 if (!(fd
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
))
91 wcscpy(&buffer
[pos
], fd
.cFileName
);
92 if (wadd(_wcsdup(buffer
)) < 0)
100 while(FindNextFileW(hFile
, &fd
));
117 if ((__argc
% SIZE
) == 0)
120 _new
= malloc(sizeof(char*) * (1 + SIZE
));
122 _new
= realloc(__argv
, sizeof(char*) * (__argc
+ 1 + SIZE
));
127 __argv
[__argc
++] = name
;
128 __argv
[__argc
] = NULL
;
132 int aexpand(char* name
, int expand_wildcards
)
137 BOOLEAN first
= TRUE
;
141 if (expand_wildcards
&& (s
= strpbrk(name
, "*?")))
143 hFile
= FindFirstFileA(name
, &fd
);
144 if (hFile
!= INVALID_HANDLE_VALUE
)
146 while(s
!= name
&& *s
!= '/' && *s
!= '\\')
149 if (*s
== '/' || *s
== '\\')
151 strncpy(buffer
, name
, pos
);
154 if (!(fd
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
))
156 strcpy(&buffer
[pos
], fd
.cFileName
);
157 if (aadd(_strdup(buffer
)) < 0)
165 while(FindNextFileA(hFile
, &fd
));
182 void __getmainargs(int* argc
, char*** argv
, char*** env
, int expand_wildcards
, int* new_mode
)
184 int i
, afterlastspace
, ignorespace
, doexpand
;
188 /* missing threading init */
193 doexpand
= expand_wildcards
;
195 if (__argv
&& _environ
)
205 len
= strlen(_acmdln
);
207 /* Allocate a temporary buffer to be used instead of the original _acmdln parameter. */
208 aNewCmdln
= strndup(_acmdln
, len
);
212 if (aNewCmdln
[i
] == '"')
223 memmove(aNewCmdln
+ i
, aNewCmdln
+ i
+ 1, len
- i
);
228 if (aNewCmdln
[i
] == ' ' && !ignorespace
)
230 aexpand(strndup(aNewCmdln
+ afterlastspace
, i
- afterlastspace
), doexpand
);
232 while (aNewCmdln
[i
] == ' ')
235 doexpand
= expand_wildcards
;
243 if (aNewCmdln
[afterlastspace
] != 0)
245 aexpand(strndup(aNewCmdln
+ afterlastspace
, i
- afterlastspace
), doexpand
);
248 /* Free the temporary buffer. */
251 HeapValidate(GetProcessHeap(), 0, NULL
);
256 __argv
= (char**)malloc(sizeof(char*));
261 _pgmptr
= _strdup(__argv
[0]);
263 // if (new_mode) _set_new_mode(*new_mode);
269 void __wgetmainargs(int* argc
, wchar_t*** wargv
, wchar_t*** wenv
,
270 int expand_wildcards
, int* new_mode
)
272 int i
, afterlastspace
, ignorespace
, doexpand
;
276 /* missing threading init */
281 doexpand
= expand_wildcards
;
283 if (__wargv
&& __winitenv
)
293 len
= wcslen(_wcmdln
);
295 /* Allocate a temporary buffer to be used instead of the original _wcmdln parameter. */
296 wNewCmdln
= wcsndup(_wcmdln
, len
);
300 if (wNewCmdln
[i
] == L
'"')
311 memmove(wNewCmdln
+ i
, wNewCmdln
+ i
+ 1, (len
- i
) * sizeof(wchar_t));
316 if (wNewCmdln
[i
] == L
' ' && !ignorespace
)
318 wexpand(wcsndup(wNewCmdln
+ afterlastspace
, i
- afterlastspace
), doexpand
);
320 while (wNewCmdln
[i
] == L
' ')
323 doexpand
= expand_wildcards
;
331 if (wNewCmdln
[afterlastspace
] != 0)
333 wexpand(wcsndup(wNewCmdln
+ afterlastspace
, i
- afterlastspace
), doexpand
);
336 /* Free the temporary buffer. */
339 HeapValidate(GetProcessHeap(), 0, NULL
);
344 __wargv
= (wchar_t**)malloc(sizeof(wchar_t*));
349 _wpgmptr
= _wcsdup(__wargv
[0]);
351 // if (new_mode) _set_new_mode(*new_mode);
357 int* __p___argc(void)
365 char*** __p___argv(void)
373 wchar_t*** __p___wargv(void)