annotate dmd/Util.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 1475fd394c9e
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 94
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Library;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.File;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.String;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.FileName;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.PREC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import std.process : getenv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import std.c.string;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import std.stdio : writef, writefln, write;
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
17
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
18 import core.memory;
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
19
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
20 version (Windows)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
21 {
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
22 import std.c.process : spawnl, spawnlp;
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
23 }
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
24 version (POSIX)
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
25 {
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
26 import core.sys.posix.unistd;
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
27 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import core.stdc.stdlib;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import core.stdc.ctype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import core.stdc.stdarg;
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
31 public import core.stdc.stdio;
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
32 version (Bug4054) import core.memory;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 extern(C) int putenv(char*);
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
35 /+version (LOG)
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
36 {
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
37 static if( !is(typeof(printf)) )
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
38 extern (C) int printf(const char*,...);
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
39 }+/
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
40 //version = LOG;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
42 version (TARGET_OSX)
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
43 {
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
44 version = TARGET_FOS; // FreeBSD, OS X, Solaris
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
45 }
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
46 version (TARGET_FREEBSD)
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
47 {
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
48 version = TARGET_FOS; // FreeBSD, OS X, Solaris
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
49 }
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
50 version (TARGET_SOLARIS)
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
51 {
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
52 version = TARGET_FOS; // FreeBSD, OS X, Solaris
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
53 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
55 version (POSIX)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
56 {
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
57 import dmd.Array;
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
58 import dmd.Gnuc;
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
59 import core.sys.posix.stdlib;
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
60 version (TARGET_FOS) import core.stdc.limits;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 enum MAX_PATH = 256; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 version (Windows) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 import core.sys.windows.windows : GetModuleFileNameA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 string fromStringz(const(char)* s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 return s[0..strlen(s)].idup;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 void warning(T...)(string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 void warning(T...)(Loc loc, string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
81 if (global.params.warnings && !global.gag)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
82 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
83 write("warning - ");
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
84 error(loc, format, t);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
85 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 void error(T...)(Loc loc, string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 if (!global.gag)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 string p = loc.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 if (p.length != 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 writef("%s: ", p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 write("Error: ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 writefln(format, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 //halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 global.errors++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
105 T cloneThis(T)(T ptr)
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
106 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
107 size_t size = ptr.classinfo.init.length;
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
108 void* mem = GC.malloc(size);
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
109 memcpy(mem, cast(void*)ptr, size);
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
110
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
111 auto result = cast(T)mem;
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
112
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
113 result.forceRegister();
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
114
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
115 return result;
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
116 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 123
diff changeset
117
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 char* strupr(char* s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 char* t = s;
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
121
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 while (*s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 *s = cast(char)toupper(*s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 s++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 char[] skipspace(char[] p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 foreach (i, c; p) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (!isspace(c)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 return p[i..$];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
138
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 char* skipspace(char* p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 while (isspace(*p))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 p++;
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
146
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 return p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 void inifile(string argv0, string inifile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 char *path; // need path for @P macro
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 string filename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 int i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 int k;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 int envsection = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 writef("inifile(argv0 = '%s', inifile = '%s')\n", argv0, inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 if (FileName.absolute(inifile)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 filename = inifile;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 /* Look for inifile in the following sequence of places:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 * o current directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 * o home directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 * o directory off of argv0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 * o /etc/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 if (FileName.exists(inifile)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 filename = inifile;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 filename = FileName.combine(getenv("HOME"), inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 if (!FileName.exists(filename)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 version (_WIN32) { // This fix by Tim Matthews
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 char resolved_name_b[MAX_PATH + 1];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 auto resolved_name = resolved_name_b[].idup;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 if (GetModuleFileNameA(null, resolved_name_b.ptr, MAX_PATH + 1) && FileName.exists(resolved_name))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 filename = FileName.replaceName(resolved_name, inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 if (FileName.exists(filename)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 filename = FileName.replaceName(argv0, inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 if (!FileName.exists(filename)) {
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
188 version (POSIX) { /// linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
189 version (POSIX) { /// __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun&&__SVR4 // This fix by Thomas Kuehne
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 /* argv0 might be a symbolic link,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 * so try again looking past it to the real path
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 */
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
193 version (TARGET_FOS) {/// #if __APPLE__ || __FreeBSD__ || __sun&&__SVR4
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 char resolved_name[PATH_MAX + 1];
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
195 char* real_argv0 = realpath(toStringz(argv0), resolved_name);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 } else {
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
197 char* real_argv0 = realpath(toStringz(argv0), null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 //printf("argv0 = %s, real_argv0 = %p\n", argv0, real_argv0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 if (real_argv0) {
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
201 filename = FileName.replaceName(fromStringz(real_argv0), inifile);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 version (linux) {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
203 ///free(real_argv0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 if (FileName.exists(filename)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 static assert (false, "use of glibc non-standard extension realpath(char*, null)");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 if (true) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 // Search PATH for argv0
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
214 const(char)* p = toStringz(getenv("PATH"));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 writef("\tPATH='%s'\n", p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 }
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
218 auto paths = FileName.splitPath(fromStringz(p));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 filename = FileName.searchPath(paths, argv0, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 if (!filename) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 goto Letc; // argv0 not found on path
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
223
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 filename = FileName.replaceName(filename, inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 if (FileName.exists(filename)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 // Search /etc/ for inifile
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 Letc:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 filename = FileName.combine("/etc/", inifile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 Ldone:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
240
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 path = cast(char*)toStringz(FileName.path(filename));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 writef("\tpath = '%s', filename = '%s'\n", fromStringz(path), filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 scope File file = new File(filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 if (file.read()) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 return; // error reading file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
252
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 // Parse into lines
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 int eof = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 for (i = 0; i < file.len && !eof; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 int linestart = i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 for (; i < file.len; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 switch (file.buffer[i])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 case '\r':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 case '\n':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 // Skip if it was preceded by '\r'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 if (i && file.buffer[i - 1] == '\r')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 goto Lskip;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 case 0:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 case 0x1A:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 eof = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 // The line is file.buffer[linestart..i]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 char *line;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 int len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 char *p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 char* pn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 line = cast(char*)&file.buffer[linestart];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 len = i - linestart;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 buf.reset();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 // First, expand the macros.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 // Macros are bracketed by % characters.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 for (k = 0; k < len; k++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 if (line[k] == '%')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 int j;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 for (j = k + 1; j < len; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 if (line[j] == '%')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 if (j - k == 3 && memicmp(&line[k + 1], "@P", 2) == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 // %@P% is special meaning the path to the .ini file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 p = path;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 if (!*p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 p = cast(char*)".";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 int l = j - k;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 char tmp[10]; // big enough most of the time
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 if (l <= tmp.sizeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 p = tmp.ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 else
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
324 {
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
325 version (Bug4054)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
326 p = cast(char*)GC.malloc(l);
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
327 else
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 p = cast(char*)alloca(l);
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
329 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 l--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 memcpy(p, &line[k + 1], l);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 p[l] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 strupr(p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 p = core.stdc.stdlib.getenv(p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 if (!p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 p = cast(char*)"";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 buf.writestring(p[0..strlen(p)]); ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 k = j;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 buf.writeByte(line[k]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 // Remove trailing spaces
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 while (buf.offset && isspace(buf.data[buf.offset - 1]))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 buf.offset--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 char[] pp = buf.getString();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 // The expanded line is in p.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 // Now parse it for meaning.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 pp = skipspace(pp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 if (pp.length != 0) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 switch (pp[0])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 case ';': // comment
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 case '[': // look for [Environment]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 pp = skipspace(pp[1..$]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 for (pn = pp.ptr; isalnum(*pn); pn++) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
370
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 if (pn - pp.ptr == 11 &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 memicmp(pp.ptr, "Environment", 11) == 0 &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 *skipspace(pn) == ']'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 envsection = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 envsection = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 if (envsection)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 pn = pp.ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 // Convert name to upper case;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 // remove spaces bracketing =
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 auto p2 = pn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 for ( ; *p2; p2++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 { if (islower(*p2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 *p2 &= ~0x20;
136
9d194c848e3a fixed a few null reference bugs, thx sagitario
Trass3r
parents: 130
diff changeset
391 else if (isspace(*p2))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 memmove(p2, p2 + 1, strlen(p2));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 else if (*p2 == '=')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 p2++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 while (isspace(*p2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 memmove(p2, p2 + 1, strlen(p2));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 //putenv(pn);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 putenv(cast(char*)toStringz(pp));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 writef("\tputenv('%s')\n", pn[0..strlen(pn)]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 //printf("getenv(\"TEST\") = '%s'\n",getenv("TEST"));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 Lskip:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 ///int response_expand(int *pargc, char ***pargv);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 void browse(const(char)* url)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 string[] getenv_setargv(string envvar, string[] args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 char *p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 string[] argv = args.dup;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 int argc = args.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 int instring;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 int slash;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 char c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 string ienv = getenv(envvar);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 if (ienv is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 return args;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 char[] env = ienv.dup; // create our own writable copy
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441
79
43073c7c7769 updated to 2.035
Trass3r
parents: 75
diff changeset
442 int j = 1; // leave argv[0] alone
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 char* e = env.ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 75
diff changeset
446 int wildcard = 1; // do wildcard expansion
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 switch (*e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 case ' ':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 case '\t':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 e++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 case 0:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 case '"':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 wildcard = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 argv ~= assumeUnique(e[0..strlen(e)]); // append
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 //argv.insert(j, env); // insert at position j
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 j++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 argc++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 p = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 slash = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 instring = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 c = 0;
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
468
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 char* ecopy = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 c = *e++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 switch (c)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 case '"':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 p -= (slash >> 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 if (slash & 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 p--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 goto Laddc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 instring ^= 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 slash = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 case '\\':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 slash++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 *p++ = c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 case ' ':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 case '\t':
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 if (instring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 goto Laddc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 case 0:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 *p = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 if (argv.length != 0) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 argv[$-1].length = p - argv[$-1].ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 //if (wildcard)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 //wildcardexpand(); // not implemented
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 if (c == 0) goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 Laddc:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 slash = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 *p++ = c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 Ldone:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 return argv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 void error(T...)(string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 writefln(format, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 exit(EXIT_FAILURE);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 void usage()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 writef("Digital Mars D Compiler %s\n%s %s\n", global.version_, global.copyright, global.written);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 writef(
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 "Documentation: http://www.digitalmars.com/d/2.0/index.html\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 "Usage:\n"
75
cfa3747ebe4c Changed dmd to ddmd in the "usage" message and added "ported to D by community" to desription to distinguish from pure dmd build
korDen
parents: 22
diff changeset
533 " ddmd files.d ... { -switch }\n"
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 "\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 " files.d D source files\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 " @cmdfile read arguments from cmdfile\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 " -c do not link\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538 " -cov do code coverage analysis\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 " -D generate documentation\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 " -Dddocdir write documentation file to docdir directory\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 " -Dffilename write documentation file to filename\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 " -d allow deprecated features\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 " -debug compile in debug code\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 " -debug=level compile in debug code <= level\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 " -debug=ident compile in debug code identified by ident\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 " -debuglib=name set symbolic debug library to name\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 " -defaultlib=name set default library to name\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 " -deps=filename write module dependencies to filename\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 " -g add symbolic debug info\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 " -gc add symbolic debug info, pretend to be C\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 " -H generate 'header' file\n"
79
43073c7c7769 updated to 2.035
Trass3r
parents: 75
diff changeset
552 " -Hddirectory write 'header' file to directory\n"
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 " -Hffilename write 'header' file to filename\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 " --help print help\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 " -Ipath where to look for imports\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 " -ignore ignore unsupported pragmas\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 " -inline do function inlining\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 " -Jpath where to look for string imports\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559 " -Llinkerflag pass linkerflag to link\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 " -lib generate library rather than object files\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561 " -man open web browser on manual page\n"
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
562 " -noboundscheck turns off array bounds checking for all functions\n"
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 " -nofloat do not emit reference to floating point\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 " -O optimize\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 " -o- do not write object file\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 " -odobjdir write object & library files to directory objdir\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 " -offilename name output file to filename\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 " -op do not strip paths from source file\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 " -profile profile runtime performance of generated code\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 " -quiet suppress unnecessary messages\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 " -release compile release version\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 " -run srcfile args... run resulting program, passing args\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 " -unittest compile in unit tests\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 " -v verbose\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 " -version=level compile in version code >= level\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 " -version=ident compile in version code identified by ident\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 " -vtls list all variables going into thread local storage\n"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 " -w enable warnings\n"
79
43073c7c7769 updated to 2.035
Trass3r
parents: 75
diff changeset
579 " -X generate JSON file\n"
43073c7c7769 updated to 2.035
Trass3r
parents: 75
diff changeset
580 " -Xffilename write JSON file to filename\n"
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 );
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 void fatal()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 exit(EXIT_FAILURE);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 void halt()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 void initPrecedence()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 precedence[TOK.TOKdotvar] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 precedence[TOK.TOKimport] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 precedence[TOK.TOKidentifier] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 precedence[TOK.TOKthis] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 precedence[TOK.TOKsuper] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 precedence[TOK.TOKint64] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 precedence[TOK.TOKfloat64] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 precedence[TOK.TOKnull] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 precedence[TOK.TOKstring] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 precedence[TOK.TOKarrayliteral] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 precedence[TOK.TOKtypeid] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 precedence[TOK.TOKis] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 precedence[TOK.TOKassert] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 precedence[TOK.TOKfunction] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 precedence[TOK.TOKvar] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 precedence[TOK.TOKdefault] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 // post
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 precedence[TOK.TOKdotti] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 precedence[TOK.TOKdot] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 // precedence[TOK.TOKarrow] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 precedence[TOK.TOKplusplus] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 precedence[TOK.TOKminusminus] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 precedence[TOK.TOKcall] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 precedence[TOK.TOKslice] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 precedence[TOK.TOKarray] = PREC.PREC_primary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629 precedence[TOK.TOKaddress] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 precedence[TOK.TOKstar] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 precedence[TOK.TOKneg] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 precedence[TOK.TOKuadd] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 precedence[TOK.TOKnot] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 precedence[TOK.TOKtobool] = PREC.PREC_add;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635 precedence[TOK.TOKtilde] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 precedence[TOK.TOKdelete] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 precedence[TOK.TOKnew] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 precedence[TOK.TOKcast] = PREC.PREC_unary;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
640 precedence[TOK.TOKpow] = PREC.PREC_pow;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
641
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 precedence[TOK.TOKmul] = PREC.PREC_mul;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643 precedence[TOK.TOKdiv] = PREC.PREC_mul;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 precedence[TOK.TOKmod] = PREC.PREC_mul;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
645 precedence[TOKpow] = PREC.PREC_mul;
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
646
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 precedence[TOK.TOKadd] = PREC.PREC_add;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 precedence[TOK.TOKmin] = PREC.PREC_add;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 precedence[TOK.TOKcat] = PREC.PREC_add;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 precedence[TOK.TOKshl] = PREC.PREC_shift;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 precedence[TOK.TOKshr] = PREC.PREC_shift;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 precedence[TOK.TOKushr] = PREC.PREC_shift;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 precedence[TOK.TOKlt] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 precedence[TOK.TOKle] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 precedence[TOK.TOKgt] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 precedence[TOK.TOKge] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 precedence[TOK.TOKunord] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 precedence[TOK.TOKlg] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 precedence[TOK.TOKleg] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 precedence[TOK.TOKule] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 precedence[TOK.TOKul] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 precedence[TOK.TOKuge] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 precedence[TOK.TOKug] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 precedence[TOK.TOKue] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 precedence[TOK.TOKin] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 precedence[TOK.TOKequal] = PREC.PREC_equal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 precedence[TOK.TOKnotequal] = PREC.PREC_equal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 precedence[TOK.TOKidentity] = PREC.PREC_equal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 precedence[TOK.TOKnotidentity] = PREC.PREC_equal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 /* Note that we changed precedence, so that < and != have the same
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 * precedence. This change is in the parser, too.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 precedence[TOK.TOKequal] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 precedence[TOK.TOKnotequal] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 precedence[TOK.TOKidentity] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 precedence[TOK.TOKnotidentity] = PREC.PREC_rel;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 precedence[TOK.TOKand] = PREC.PREC_and;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 precedence[TOK.TOKxor] = PREC.PREC_xor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 precedence[TOK.TOKor] = PREC.PREC_or;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 precedence[TOK.TOKandand] = PREC.PREC_andand;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 precedence[TOK.TOKoror] = PREC.PREC_oror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 precedence[TOK.TOKquestion] = PREC.PREC_cond;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696 precedence[TOK.TOKassign] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697 precedence[TOK.TOKconstruct] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 precedence[TOK.TOKblit] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 precedence[TOK.TOKaddass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 precedence[TOK.TOKminass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 precedence[TOK.TOKcatass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
702 precedence[TOK.TOKmulass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703 precedence[TOK.TOKdivass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
704 precedence[TOK.TOKmodass] = PREC.PREC_assign;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
705 precedence[TOK.TOKpowass] = PREC.PREC_assign;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
706 precedence[TOK.TOKshlass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
707 precedence[TOK.TOKshrass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
708 precedence[TOK.TOKushrass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
709 precedence[TOK.TOKandass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
710 precedence[TOK.TOKorass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
711 precedence[TOK.TOKxorass] = PREC.PREC_assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
712
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
713 precedence[TOK.TOKcomma] = PREC.PREC_expr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
714 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716 int runLINK()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 {
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 94
diff changeset
718 version (_WIN32)
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 94
diff changeset
719 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
720 string p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721 int i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 int status;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
723 scope OutBuffer cmdbuf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
725 global.params.libfiles.push(cast(void*)new String("user32"));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
726 global.params.libfiles.push(cast(void*)new String("kernel32"));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
728 for (i = 0; i < global.params.objfiles.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
730 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
731 cmdbuf.writeByte('+');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
732 p = (cast(String)global.params.objfiles.data[i]).str;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
733 string ext = FileName.ext(p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
734 if (ext)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
735 // Write name sans extension
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
736 writeFilename(cmdbuf, p[0..p.length - ext.length - 1]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
737 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738 writeFilename(cmdbuf, p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
739 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740 cmdbuf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 if (global.params.exefile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742 writeFilename(cmdbuf, global.params.exefile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 else
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
744 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745 /* Generate exe file name from first obj name.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 * No need to add it to cmdbuf because the linker will default to it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 string n = (cast(String)global.params.objfiles.data[0]).str;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 n = FileName.name(n);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 FileName fn = FileName.forceExt(n, "exe");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 global.params.exefile = fn.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 // Make sure path to exe file exists
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
755 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 string pp = FileName.path(global.params.exefile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 FileName.ensurePathExists(pp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760 cmdbuf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
761 if (global.params.run)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
762 cmdbuf.writestring("nul");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
764 // if (mapfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
765 // cmdbuf.writestring(output);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
766 cmdbuf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
767
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
768 for (i = 0; i < global.params.libfiles.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
769 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
770 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
771 cmdbuf.writeByte('+');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772 writeFilename(cmdbuf, (cast(String)global.params.libfiles.data[i]).str);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
773 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
774
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 if (global.params.deffile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
777 cmdbuf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
778 writeFilename(cmdbuf, global.params.deffile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
779 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781 /* Eliminate unnecessary trailing commas */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
782 while (1)
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
783 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
784 i = cmdbuf.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
785 if (!i || cmdbuf.data[i - 1] != ',')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 cmdbuf.offset--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
790 if (global.params.resfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 cmdbuf.writestring("/RC:");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 writeFilename(cmdbuf, global.params.resfile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
796 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 if (mapfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 cmdbuf.writestring("/m");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 if (debuginfo)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800 cmdbuf.writestring("/li");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 if (codeview)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 cmdbuf.writestring("/co");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804 if (codeview3)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 cmdbuf.writestring(":3");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 if (global.params.symdebug)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 cmdbuf.writestring("/co");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 cmdbuf.writestring("/noi");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813 for (i = 0; i < global.params.linkswitches.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
814 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 cmdbuf.writestring((cast(String)global.params.linkswitches.data[i]).str);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 cmdbuf.writeByte(';');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
819 p = cmdbuf.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 FileName lnkfilename = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 size_t plen = p.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 if (plen > 7000)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 lnkfilename = FileName.forceExt(global.params.exefile, "lnk");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 scope File flnk = new File(lnkfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 flnk.setbuffer(cast(void*)p.ptr, plen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 flnk.ref_ = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 if (flnk.write())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 error("error writing file %s", lnkfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 if (lnkfilename.len() < plen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 p = std.string.format("@%s", lnkfilename.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 string linkcmd = getenv("LINKCMD");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 if (!linkcmd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 linkcmd = "link";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839 status = executecmd(linkcmd, p, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 if (lnkfilename)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
841 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 remove(toStringz(lnkfilename.toChars()));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843 ///delete lnkfilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
844 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
845 return status;
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
846 } else version (POSIX) {/// linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 pid_t childpid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 int i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 int status;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
850
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
851 // Build argv[]
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
852 Array argv = new Array();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
854 const(char)* cc = core.stdc.stdlib.getenv("CC");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 if (!cc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 cc = "gcc";
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
857 argv.push(cast(void *)cc);
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
858 Array objfiles = new Array;
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
859 for( i = 0; i < global.params.objfiles.dim; i++ )
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
860 { string str = (cast(String)global.params.objfiles.data[i]).str;
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
861 objfiles.push(cast(void*)toStringz(str));
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
862 }
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
863 argv.insert(1, objfiles);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865 // None of that a.out stuff. Use explicit exe file name, or
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
866 // generate one from name of first source file.
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
867 argv.push(cast(void *)cast(char*)"-o");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 if (global.params.exefile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869 {
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
870 argv.push(cast(void*)toStringz(global.params.exefile));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
872 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 { // Generate exe file name from first obj name
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
874 string n = (cast(String)global.params.objfiles.data[0]).str;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
875 n = FileName.name(n);
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
876 string e = FileName.ext(n);
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
877 string ex = e ? n[0..$-(e.length+1)] : "a.out";
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
878
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
879 argv.push(cast(void*)toStringz(ex));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
880 global.params.exefile = ex;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
881 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
883 // Make sure path to exe file exists
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
884 { string p = FileName.path(global.params.exefile);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
885 FileName.ensurePathExists(p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
887
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
888 if (global.params.symdebug)
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
889 argv.push(cast(void *)cast(char*)"-g");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
890
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
891 if (global.params.isX86_64)
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
892 argv.push(cast(void *)cast(char*)"-m64");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
893 else
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
894 argv.push(cast(void *)cast(char*)"-m32");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
896 if (0 && global.params.exefile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
898 /* This switch enables what is known as 'smart linking'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
899 * in the Windows world, where unreferenced sections
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 * are removed from the executable. It eliminates unreferenced
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 * functions, essentially making a 'library' out of a module.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 * Although it is documented to work with ld version 2.13,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903 * in practice it does not, but just seems to be ignored.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 * Thomas Kuehne has verified that it works with ld 2.16.1.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 * BUG: disabled because it causes exception handling to fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 */
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
907 argv.push(cast(void *)cast(char*)"-Xlinker");
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
908 argv.push(cast(void *)cast(char*)"--gc-sections");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
909 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 for (i = 0; i < global.params.linkswitches.dim; i++)
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
912 { char *p = cast(char *)global.params.linkswitches.data[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 if (!p || !p[0] || !(p[0] == '-' && p[1] == 'l'))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
914 // Don't need -Xlinker if switch starts with -l
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
915 argv.push(cast(void *)cast(char*)"-Xlinker");
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
916 argv.push(cast(void *) p);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 /* Add each library, prefixing it with "-l".
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 * The order of libraries passed is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 * 1. any libraries passed with -L command line switch
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 * 2. libraries specified on the command line
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 * 3. libraries specified by pragma(lib), which were appended
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 * to global.params.libfiles.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925 * 4. standard libraries.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 for (i = 0; i < global.params.libfiles.dim; i++)
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
928 { char *p = cast(char *)global.params.libfiles.data[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 size_t plen = strlen(p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 if (plen > 2 && p[plen - 2] == '.' && p[plen -1] == 'a')
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
931 argv.push(cast(void *)p);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933 {
175
94b6033c07f3 get rid of globals
korDen
parents: 174
diff changeset
934 char *s = cast(char *)GC.malloc(plen + 3);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 s[0] = '-';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 s[1] = 'l';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 memcpy(s + 2, p, plen + 1);
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
938 argv.push(cast(void *)s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 /* Standard libraries must go after user specified libraries
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 * passed with -l.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 const char *libname = (global.params.symdebug)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 ? global.params.debuglibname
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 : global.params.defaultlibname;
175
94b6033c07f3 get rid of globals
korDen
parents: 174
diff changeset
948 char *buf = cast(char *)GC.malloc(2 + strlen(libname) + 1);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 strcpy(buf, "-l");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950 strcpy(buf + 2, libname);
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
951 argv.push(cast(void *)buf); // turns into /usr/lib/libphobos2.a
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
953 // argv.push((void *)"-ldruntime");
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
954 argv.push(cast(void *)cast(char*)"-lpthread");
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
955 argv.push(cast(void *)cast(char*)"-lm");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 if (!global.params.quiet || global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 // Print it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 for (i = 0; i < argv.dim; i++)
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
961 printf("%s ", cast(char *)argv.data[i]);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 printf("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 fflush(stdout);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 argv.push(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 childpid = fork();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 if (childpid == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 {
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
970 execvp(cast(char *)argv.data[0], cast(char **)argv.data);
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
971 perror(cast(char *)argv.data[0]); // failed to execute
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 return -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 waitpid(childpid, &status, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 status=WEXITSTATUS(status);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978 if (status)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 printf("--- errorlevel %d\n", status);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 return status;
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
981
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 writef ("Linking is not yet supported for this version of DMD.\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 return -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 int runProgram()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 void deleteExeFile()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 /****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 * Write filename to cmdbuf, quoting if necessary.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 void writeFilename(OutBuffer buf, string filename)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 auto len = filename.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 /* Loop and see if we need to quote
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 for (size_t i = 0; i < len; i++)
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1008 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 char c = filename[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 if (isalnum(c) || c == '_')
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 /* Need to quote
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 buf.writeByte('"');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 buf.writestring(filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 buf.writeByte('"');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 /* No quoting necessary
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 buf.writestring(filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027 /******************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1028 * Execute a rule. Return the status.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 * cmd program to run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030 * args arguments to cmd, as a string
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031 * useenv if cmd knows about _CMDLINE environment variable
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 int executecmd(string cmd, string args, int useenv)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 int status;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 size_t len = args.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 if (!global.params.quiet || global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 printf("%s %s\n", cmd, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 fflush(stdout);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 if (len > 255)
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1047 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 char* q;
175
94b6033c07f3 get rid of globals
korDen
parents: 174
diff changeset
1049 char[9] envname = "@_CMDLINE";
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 envname[0] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052 switch (useenv)
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1053 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 case 0: goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1055 case 2: envname[0] = '%'; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 default: break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057 }
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
1058 version (Bug4054)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
1059 q = cast(char*) GC.malloc(envname.sizeof + len + 1);
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
1060 else
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 q = cast(char*) alloca(envname.sizeof + len + 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 sprintf(q, "%s=%s", envname.ptr + 1, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063 status = putenv(q);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 if (status == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 args = envname[].idup;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 error("command line length of %d is too long",len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1071 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1073 status = executearg0(cmd, args);
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 94
diff changeset
1074 version (Windows) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1075 if (status == -1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076 auto cmdZ = toStringz(cmd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 auto argsZ = toStringz(args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 status = spawnlp(0, cmdZ, cmdZ, argsZ, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1079 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1080 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 // if (global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 // printf("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083 if (status)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1084 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 if (status == -1)
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1086 printf("Can't run '%.*s', check PATH\n", cmd);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1087 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1088 printf("--- errorlevel %d\n", status);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1090 return status;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1091 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1092 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1094 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095 * Attempt to find command to execute by first looking in the directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1096 * where DMD was run from.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1097 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1098 * -1 did not find command there
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1099 * !=-1 exit status from command
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1102 version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 int executearg0(string cmd, string args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 string file;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1106 string argv0 = global.params.argv0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 //printf("argv0='%s', cmd='%s', args='%s'\n",argv0,cmd,args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 // If cmd is fully qualified, we don't do this
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 if (FileName.absolute(cmd))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1112 return -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114 file = FileName.replaceName(argv0, cmd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 //printf("spawning '%s'\n",file);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1117 version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 auto fileZ = toStringz(file);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 auto argsZ = toStringz(args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1120 return spawnl(0, fileZ, fileZ, argsZ, null);
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 94
diff changeset
1121 } else version (Posix) { ///#elif linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1122 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 /+
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1124 char *full;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 int cmdl = strlen(cmd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127 full = (char*) mem.malloc(cmdl + strlen(args) + 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128 if (full == null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1129 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130 strcpy(full, cmd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1131 full [cmdl] = ' ';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1132 strcpy(full + cmdl + 1, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1133
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1134 int result = system(full);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1135
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1136 mem.free(full);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1137 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1138 +/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1139 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1140 static assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 }
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 2
diff changeset
1143 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1144
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1145 extern(C++) void util_assert(char* file,int line)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1146 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1147 fflush(stdout);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1148 printf("Internal error: %s %d\n",file,line);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1149 throw new Exception("Internal error");
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1150 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1151 /*
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1152 extern (C++) {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1153 void* mem_malloc(uint size)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1154 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1155 return GC.malloc(size);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1156 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1157
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1158 void* mem_calloc(uint size)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1159 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1160 return GC.calloc(size);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1161 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1162
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1163 void* mem_realloc(void* ptr, uint size)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1164 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1165 return GC.realloc(ptr, size);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1166 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1167
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1168 void mem_free(void* ptr)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1169 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1170 GC.free(ptr);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1171 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1172
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1173 void* mem_fmalloc(uint size)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1174 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1175 return mem_malloc(size);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1176 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1177
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1178 void* mem_fcalloc(uint size)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1179 {
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1180 return mem_calloc(size);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 137
diff changeset
1181 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1182 }
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1183 */