#include #include #include extern char *_acmdln; extern char *_pgmptr; #undef _environ extern char **_environ; #undef __argv #undef __argc char **__argv = NULL; int __argc = 0; extern HANDLE hHeap; char* strndup(char* name, int len) { char *s = malloc(len + 1); if (s != NULL) { strncpy(s, name, len); } return s; } #define SIZE (4096 / sizeof(char*)) int add(char *name) { char** _new; if ((__argc % SIZE) == 0) { _new = malloc(sizeof(char*) * (__argc + SIZE)); if (_new == NULL) { return -1; } if (__argv) { memcpy(_new, __argv, sizeof(char*) * __argc); free(__argv); } __argv = _new; } __argv[__argc++] = name; } int expand(char* name) { char *s; WIN32_FIND_DATA fd; HANDLE hFile; BOOLEAN first = TRUE; char buffer[256]; int pos; s = strpbrk(name, "*?"); if (s) { hFile = FindFirstFile(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(FindNextFile(hFile, &fd)); FindClose(hFile); } } if (first) { if (add(name) < 0) return -1; } else free(name); return 0; } int __getmainargs(int *argc,char ***argv,char ***env,int flag) { int i,afterlastspace; /* missing threading init */ i=0; afterlastspace=0; while (_acmdln[i]) { if (_acmdln[i]==' ') { expand(strndup(_acmdln + afterlastspace, i - afterlastspace)); i++; while (_acmdln[i]==' ') i++; afterlastspace=i; } else { i++; } } if (_acmdln[afterlastspace] != 0) { expand(strndup(_acmdln+afterlastspace, i - afterlastspace)); } HeapValidate(hHeap,0,NULL); *argc = __argc; *argv = __argv; *env = _environ; _pgmptr = strdup((char *)argv[0]); return 0; } int *__p___argc(void) { return &__argc; } char ***__p___argv(void) { return &__argv; } #if 0 int _chkstk(void) { return 0; } #endif