branch update for HEAD-2003021201
[reactos.git] / lib / crtdll / misc / GetArgs.c
1 #include <windows.h>
2 #include <msvcrt/stdlib.h>
3 #include <msvcrt/string.h>
4
5
6 char *_pgmptr_dll;
7 char *_acmdln_dll;   
8 unsigned  int _commode_dll;     
9 unsigned  int _winmajor_dll;   
10 unsigned  int _winminor_dll;
11 unsigned  int _winver_dll;    
12
13
14 unsigned  int _osmajor_dll;
15 unsigned  int _osminor_dll;
16 unsigned  int _osmode_dll;
17 unsigned  int _osver_dll;
18 unsigned  int _osversion_dll;
19
20 unsigned int _basemajor_dll;
21 unsigned int _baseminor_dll;
22 unsigned int _baseversion_dll;
23
24 #undef __argv
25 #undef __argc
26
27 char *xargv[1024];
28
29 char  **__argv = xargv;
30 int   __argc = 0;
31 int *__argc_dll = &__argc;        
32 char ***__argv_dll = &__argv;  
33
34
35 #undef _environ
36 char **_environ;
37 #undef _environ_dll
38 char *** _environ_dll = &_environ;    
39 static int envAlloced = 0;
40  
41         
42 int BlockEnvToEnviron()
43 {
44 char * ptr;
45 int i;
46   if (!envAlloced)
47   {
48     envAlloced = 50;
49     _environ = malloc (envAlloced * sizeof (char **));
50     if (!_environ) return -1;
51     _environ[0] =NULL;
52   }
53   ptr = (char *)GetEnvironmentStringsA();
54   if (!ptr) return -1;
55   for (i = 0 ; *ptr ; i++)
56   {
57     if(i>envAlloced-2)
58     {
59       envAlloced = i+3;
60       _environ = realloc (_environ,envAlloced * sizeof (char **));
61     }
62     _environ[i] = ptr;
63     while(*ptr) ptr++;
64     ptr++;
65   }
66   _environ[i] =0;
67   return 0;
68 }
69
70 int __GetMainArgs(int *argc,char ***argv,char ***env,int flag)
71 {
72    int i,afterlastspace;
73    DWORD   version;
74    
75    _acmdln_dll =  GetCommandLineA();
76    
77    version = GetVersion();
78    _osver_dll       = version >> 16;
79    _winminor_dll    = version & 0xFF;
80    _winmajor_dll    = (version>>8) & 0xFF;
81    _winver_dll      = ((version >> 8) & 0xFF) + ((version & 0xFF) << 8);
82    
83    
84    /* missing threading init */
85    
86    i=0;
87    afterlastspace=0;
88    __argc=0;
89    
90    while (_acmdln_dll[i]) 
91      {
92         if (_acmdln_dll[i]==' ') 
93           {
94              __argc++;
95              _acmdln_dll[i]='\0';
96              __argv[__argc-1] = strdup(_acmdln_dll + afterlastspace);
97              _acmdln_dll[i]=' ';
98              i++;
99              while (_acmdln_dll[i]==' ')
100                i++;
101              afterlastspace=i;
102           } 
103         else
104           {
105              i++;
106           }
107      }
108    
109    if (_acmdln_dll[afterlastspace] != 0)
110      {
111         __argc++;
112         _acmdln_dll[i]='\0';
113         __argv[__argc-1] = strdup(_acmdln_dll+afterlastspace);
114      }
115    HeapValidate(GetProcessHeap(),0,NULL);
116    
117    if( BlockEnvToEnviron() )
118         return FALSE;
119    _environ_dll = &_environ;    
120     
121    *argc = __argc;
122    *argv = __argv;
123    *env  = _environ;
124  
125    _pgmptr_dll = strdup((char *)argv[0]);
126
127    return 0;
128 }
129
130 int _chkstk(void)
131 {
132         return 0;
133 }