:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / msvcrt / misc / getargs.c
1 #include <windows.h>
2 #include <msvcrt/stdlib.h>
3 #include <msvcrt/string.h>
4
5 extern char *_acmdln;
6 extern char *_pgmptr;
7 #undef _environ
8 extern char **_environ;
9
10 #undef __argv
11 #undef __argc
12
13 char  **__argv = NULL;
14 int   __argc = 0;
15
16 extern HANDLE hHeap;
17
18 char* strndup(char* name, int len)
19 {
20    char *s = malloc(len + 1);
21    if (s != NULL)
22    {
23       strncpy(s, name, len);
24    }
25    return s;
26 }
27    
28 #define SIZE (4096 / sizeof(char*))
29
30 int add(char *name)
31 {
32    char** _new;
33    if ((__argc % SIZE) == 0)
34    {
35       _new = malloc(sizeof(char*) * (__argc + SIZE));
36       if (_new == NULL)
37       {
38          return -1;
39       }
40       if (__argv)
41       {
42          memcpy(_new, __argv, sizeof(char*) * __argc);
43          free(__argv);
44       }
45       __argv = _new;
46    }
47    __argv[__argc++] = name;
48 }
49
50 int expand(char* name)
51 {
52    char *s;
53    WIN32_FIND_DATA fd;
54    HANDLE hFile;
55    BOOLEAN first = TRUE;
56    char buffer[256];
57    int pos;
58
59    s = strpbrk(name, "*?");
60    if (s)
61    {
62       hFile = FindFirstFile(name, &fd);
63       if (hFile != INVALID_HANDLE_VALUE)
64       {
65          while(s != name && *s != '/' && *s != '\\')
66             s--;
67          pos = s - name;
68          if (*s == '/' || *s == '\\')
69             pos++;
70          strncpy(buffer, name, pos);
71          do
72          {
73             if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
74             {
75                strcpy(&buffer[pos], fd.cFileName);
76                if (add(strdup(buffer)) < 0)
77                {
78                   FindClose(hFile);
79                   return -1;
80                }
81                first = FALSE;
82             }
83          }
84          while(FindNextFile(hFile, &fd));
85          FindClose(hFile);
86       }
87    }
88    if (first)
89    {
90       if (add(name) < 0)
91          return -1;
92    }
93    else
94       free(name);
95    return 0;
96 }
97
98 int __getmainargs(int *argc,char ***argv,char ***env,int flag)
99 {
100    int i,afterlastspace;
101   
102    /* missing threading init */
103    
104    i=0;
105    afterlastspace=0;
106    
107    while (_acmdln[i])
108      {
109         if (_acmdln[i]==' ')
110           {
111              expand(strndup(_acmdln + afterlastspace, i - afterlastspace));
112              i++;
113              while (_acmdln[i]==' ')
114                i++;
115              afterlastspace=i;
116           }
117         else
118           {
119              i++;
120           }
121      }
122    
123    if (_acmdln[afterlastspace] != 0)
124      {
125         expand(strndup(_acmdln+afterlastspace, i - afterlastspace));
126      }
127
128    HeapValidate(hHeap,0,NULL);
129    
130    *argc = __argc;
131    *argv = __argv;
132    *env  = _environ;
133
134    _pgmptr = strdup((char *)argv[0]);
135
136    return 0;
137 }
138
139
140 int *__p___argc(void)
141 {
142    return &__argc;
143 }
144
145 char ***__p___argv(void)
146 {
147    return &__argv;
148 }
149
150 #if 0
151 int _chkstk(void)
152 {
153         return 0;
154 }
155 #endif