1b9a9d97f6ed61a535c31d754db3d610ba22ff64
[reactos.git] / reactos / lib / crtdll / misc / GetArgs.c
1 #include <windows.h>
2 #include <crtdll/stdlib.h>
3 #include <crtdll/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 }