comparison 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
comparison
equal deleted inserted replaced
472:15c804b6ce77 473:373489eeaf90
1 /*
2 * Placed into the Public Domain.
3 * written by Walter Bright
4 * www.digitalmars.com
5 */
6
7 module internal.dmain2;
8 import object;
9 import std.c.stdio;
10 import std.c.string;
11 import std.c.stdlib;
12 import std.string;
13
14 extern (C) void _STI_monitor_staticctor();
15 extern (C) void _STD_monitor_staticdtor();
16 extern (C) void _STI_critical_init();
17 extern (C) void _STD_critical_term();
18 extern (C) void gc_init();
19 extern (C) void gc_term();
20 extern (C) void _minit();
21 extern (C) void _moduleCtor();
22 extern (C) void _moduleDtor();
23 extern (C) void _moduleUnitTests();
24
25 extern (C) bool no_catch_exceptions;
26
27 /***********************************
28 * The D main() function supplied by the user's program
29 */
30 int main(char[][] args);
31
32 /***********************************
33 * Substitutes for the C main() function.
34 * It's purpose is to wrap the call to the D main()
35 * function and catch any unhandled exceptions.
36 */
37
38 extern (C) int main(size_t argc, char **argv)
39 {
40 char[] *am;
41 char[][] args;
42 int result;
43 int myesp;
44 int myebx;
45
46 version (linux)
47 {
48 _STI_monitor_staticctor();
49 _STI_critical_init();
50 gc_init();
51 am = cast(char[] *) malloc(argc * (char[]).sizeof);
52 // BUG: alloca() conflicts with try-catch-finally stack unwinding
53 //am = (char[] *) alloca(argc * (char[]).sizeof);
54 }
55 version (Win32)
56 {
57 gc_init();
58 _minit();
59 am = cast(char[] *) alloca(argc * (char[]).sizeof);
60 }
61
62 if (no_catch_exceptions)
63 {
64 _moduleCtor();
65 _moduleUnitTests();
66
67 for (size_t i = 0; i < argc; i++)
68 {
69 auto len = strlen(argv[i]);
70 am[i] = argv[i][0 .. len];
71 }
72
73 args = am[0 .. argc];
74
75 result = main(args);
76 _moduleDtor();
77 gc_term();
78 }
79 else
80 {
81 try
82 {
83 _moduleCtor();
84 _moduleUnitTests();
85
86 for (size_t i = 0; i < argc; i++)
87 {
88 auto len = strlen(argv[i]);
89 am[i] = argv[i][0 .. len];
90 }
91
92 args = am[0 .. argc];
93
94 result = main(args);
95 _moduleDtor();
96 gc_term();
97 }
98 catch (Object o)
99 {
100 version (none)
101 {
102 printf("Error: ");
103 o.print();
104 }
105 else
106 {
107 auto foo = o.toString();
108 fprintf(stderr, "Error: %.*s\n", foo.length, foo.ptr);
109 }
110 exit(EXIT_FAILURE);
111 }
112 }
113
114 version (linux)
115 {
116 free(am);
117 _STD_critical_term();
118 _STD_monitor_staticdtor();
119 }
120 return result;
121 }
122