phobos/internal/dmain2.d
2007-09-10 04:01:57 +00:00

86 lines
1.6 KiB
D

import object;
import std.c.stdio;
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();
/***********************************
* 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(int argc, char **argv)
{
char[] *am;
char[][] args;
int i;
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);
}
try
{
_moduleCtor();
_moduleUnitTests();
for (i = 0; i < argc; i++)
{
int len = strlen(argv[i]);
am[i] = argv[i][0 .. len];
}
args = am[0 .. argc];
result = main(args);
}
catch (Object o)
{
printf("Error: ");
o.print();
result = EXIT_FAILURE;
}
_moduleDtor();
gc_term();
version (linux)
{
free(am);
_STD_critical_term();
_STD_monitor_staticdtor();
}
return result;
}