diff lphobos/internal/dmain2.d @ 473:373489eeaf90

Applied downs' lphobos update
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Mon, 04 Aug 2008 19:28:49 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lphobos/internal/dmain2.d	Mon Aug 04 19:28:49 2008 +0200
@@ -0,0 +1,122 @@
+/*
+ * Placed into the Public Domain.
+ * written by Walter Bright
+ * www.digitalmars.com
+ */
+
+module internal.dmain2;
+import object;
+import std.c.stdio;
+import std.c.string;
+import std.c.stdlib;
+import std.string;
+
+extern (C) void _STI_monitor_staticctor();
+extern (C) void _STD_monitor_staticdtor();
+extern (C) void _STI_critical_init();
+extern (C) void _STD_critical_term();
+extern (C) void gc_init();
+extern (C) void gc_term();
+extern (C) void _minit();
+extern (C) void _moduleCtor();
+extern (C) void _moduleDtor();
+extern (C) void _moduleUnitTests();
+
+extern (C) bool no_catch_exceptions;
+
+/***********************************
+ * The D main() function supplied by the user's program
+ */
+int main(char[][] args);
+
+/***********************************
+ * Substitutes for the C main() function.
+ * It's purpose is to wrap the call to the D main()
+ * function and catch any unhandled exceptions.
+ */
+
+extern (C) int main(size_t argc, char **argv)
+{
+    char[] *am;
+    char[][] args;
+    int result;
+    int myesp;
+    int myebx;
+
+    version (linux)
+    {
+	_STI_monitor_staticctor();
+	_STI_critical_init();
+	gc_init();
+	am = cast(char[] *) malloc(argc * (char[]).sizeof);
+	// BUG: alloca() conflicts with try-catch-finally stack unwinding
+	//am = (char[] *) alloca(argc * (char[]).sizeof);
+    }
+    version (Win32)
+    {
+	gc_init();
+	_minit();
+	am = cast(char[] *) alloca(argc * (char[]).sizeof);
+    }
+
+    if (no_catch_exceptions)
+    {
+	_moduleCtor();
+	_moduleUnitTests();
+
+	for (size_t i = 0; i < argc; i++)
+	{
+	    auto len = strlen(argv[i]);
+	    am[i] = argv[i][0 .. len];
+	}
+
+	args = am[0 .. argc];
+
+	result = main(args);
+	_moduleDtor();
+	gc_term();
+    }
+    else
+    {
+	try
+	{
+	    _moduleCtor();
+	    _moduleUnitTests();
+
+	    for (size_t i = 0; i < argc; i++)
+	    {
+		auto len = strlen(argv[i]);
+		am[i] = argv[i][0 .. len];
+	    }
+
+	    args = am[0 .. argc];
+
+	    result = main(args);
+	    _moduleDtor();
+	    gc_term();
+	}
+	catch (Object o)
+	{
+	    version (none)
+	    {
+		printf("Error: ");
+		o.print();
+	    }
+	    else
+	    {
+		auto foo = o.toString();
+		fprintf(stderr, "Error: %.*s\n", foo.length, foo.ptr);
+	    }
+	    exit(EXIT_FAILURE);
+	}
+    }
+
+    version (linux)
+    {
+	free(am);
+	_STD_critical_term();
+	_STD_monitor_staticdtor();
+    }
+    return result;
+}
+