diff dmd/Util.d @ 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.
author Robert Clipsham <robert@octarineparrot.com>
date Sun, 04 Apr 2010 02:06:32 +0100
parents 7427ded8caf7
children 5c9b78899f5d
line wrap: on
line diff
--- a/dmd/Util.d	Wed Mar 31 16:29:36 2010 +0400
+++ b/dmd/Util.d	Sun Apr 04 02:06:32 2010 +0100
@@ -13,19 +13,23 @@
 import std.process : getenv;
 import std.c.string;
 import std.stdio : writef, writefln, write;
-import std.c.process : spawnl, spawnlp;
+version (Windows)
+{
+    import std.c.process : spawnl, spawnlp;
+}
 import core.stdc.stdlib;
 import core.stdc.ctype;
 import core.stdc.stdarg;
 import core.stdc.stdio;
+version (Bug4054) import core.memory;
 
 extern(C) int putenv(char*);
 
 //version = LOG;
 
-version (Windows) {
-} else {
-	import core.sys.posix.stdlib : putenv;
+version (POSIX)
+{
+	import dmd.Gnuc;
 }
 
 enum MAX_PATH = 256; ///
@@ -272,7 +276,12 @@
 							if (l <= tmp.sizeof)
 								p = tmp.ptr;
 							else
+							{
+							version (Bug4054)
+								p = cast(char*)GC.malloc(l);
+							else
 								p = cast(char*)alloca(l);
+							}
 							l--;
 							memcpy(p, &line[k + 1], l);
 							p[l] = 0;
@@ -784,8 +793,8 @@
 		///delete lnkfilename;
     }
     return status;
-} else if (XXX) {/// linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
-	assert(false);
+} else version (POSIX) {/// linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
+	assert(false, "Unimplemented");
 	/+
     pid_t childpid;
     int i;
@@ -1004,6 +1013,9 @@
 			case 2: envname[0] = '%';	break;
 			default: break;	///
 		}
+		version (Bug4054)
+		q = cast(char*) GC.malloc(envname.sizeof + len + 1);
+		else
 		q = cast(char*) alloca(envname.sizeof + len + 1);
 		sprintf(q, "%s=%s", envname.ptr + 1, args);
 		status = putenv(q);
@@ -1086,4 +1098,4 @@
     static assert(false);
 }
 }
-}
\ No newline at end of file
+}