**** Merged from MCS ****
[mono-project.git] / mcs / class / System.Windows.Forms / System.Windows.Forms / monostub.c
blob06a48ffecaefb3b6b07f12c2a6fc6be6e9155493
1 #include <mono/jit/jit.h>
2 #include <stdio.h>
3 #include <semaphore.h>
4 #include <string.h>
5 #include <ctype.h>
6 /*
7 * The Mono and WINE header files have overlapping definitions in the
8 * header files. Since we are only using a few functions and definitions
9 * define them here to avoid conflicts.
11 #define __stdcall __attribute__((__stdcall__))
12 #define PASCAL __stdcall
14 typedef int INT;
15 typedef unsigned int UINT;
16 typedef char CHAR;
17 typedef CHAR *LPSTR;
18 typedef void* HINSTANCE;
20 HINSTANCE applicationInstance = NULL;
23 * unresolved symbols when linking w/o pthread (testing):
24 * pthread_kill
25 * sem_post
26 * sem_init
27 * sem_wait
28 * sem_destroy
30 #if 0
31 int pthread_kill (pthread_t thread, int signo)
33 printf ("pthread_kill\n");
34 return 0;
37 int sem_init (sem_t *sem, int pshared, unsigned int value)
39 printf ("sem_init\n");
40 return 0;
43 int sem_post (sem_t * sem)
45 printf ("sem_post\n");
46 return 0;
49 int sem_wait (sem_t * sem)
51 printf ("sem_wait\n");
52 return 0;
55 int sem_destroy(sem_t * sem)
57 printf ("sem_destroy\n");
58 return 0;
60 #endif
62 /* not defined in the public headers but we it to load the DLL mappings */
63 void mono_config_parse (const char *filename);
65 typedef struct
67 MonoDomain *domain;
68 const char *file;
69 int argc;
70 char **argv;
71 } MainThreadArgs;
73 static void main_thread_handler (gpointer user_data)
75 MainThreadArgs *main_args=(MainThreadArgs *)user_data;
76 MonoAssembly *assembly;
77 int i;
79 printf ("opening assembly \"%s\", argc %d\n", main_args->file, main_args->argc);
80 for( i = 0; i < main_args->argc; i++) {
81 printf ("param %d = \"%s\"\n", i, main_args->argv[i]);
83 assembly = mono_domain_assembly_open (main_args->domain,
84 main_args->file);
85 if (!assembly) {
86 printf("error opening assembly\n");
87 return;
90 * mono_jit_exec() will run the Main() method in the assembly.
91 * The return value needs to be looked up from
92 * System.Environment.ExitCode.
94 printf ("executing assembly\n");
95 mono_jit_exec (main_args->domain, assembly, main_args->argc,
96 main_args->argv);
99 #define MAX_ARGV_IDX 1024
101 int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
102 LPSTR lpszCmdLine, int nCmdShow)
104 MonoDomain *domain = NULL;
105 MainThreadArgs main_args;
106 int retval = 0;
107 size_t len;
108 char *CommandLine;
109 char *argv [MAX_ARGV_IDX] = { 0};
110 int argc = 0;
111 char *argv_ptr = 0;
112 char *argv_start;
113 char *argv_end;
114 int isInsideQuote = 0;
116 applicationInstance = hInstance;
118 printf ("parsing configuration file\n");
119 mono_config_parse (NULL);
121 printf ("initializing JIT engine\n");
122 domain = mono_jit_init (lpszCmdLine);
124 printf ("parsing command line \"%s\"\n", lpszCmdLine);
125 len = strlen(lpszCmdLine);
126 CommandLine = (char*)malloc(len + 1);
127 memset(CommandLine, 0,len + 1);
128 strncpy(CommandLine, lpszCmdLine, len);
130 argv_start = CommandLine;
131 argv_end = CommandLine + len;
133 // FIXME: remove "" from arguments
134 for( argv_ptr = argv_start; argv_ptr < argv_end; ) {
135 if( argc == MAX_ARGV_IDX) {
136 break;
138 if( isspace(*argv_ptr)) {
139 if( !isInsideQuote){
140 // parameter completed
141 if( argv_start != argv_ptr) {
142 argv[argc] = argv_start;
143 ++argc;
144 *argv_ptr = '\0';
145 ++argv_ptr;
147 while( argv_ptr <= argv_end && isspace(*argv_ptr) ) ++argv_ptr;
148 argv_start = argv_ptr;
150 else {
151 ++argv_ptr;
154 else {
155 if(*argv_ptr == '\"') {
156 isInsideQuote = isInsideQuote ? 0 : 1;
158 ++argv_ptr;
161 if( argv_start != argv_ptr && argc < MAX_ARGV_IDX) {
162 argv[argc] = argv_start;
163 ++argc;
164 *argv_ptr = '\0';
167 if( argc > 0) {
168 main_args.domain=domain;
169 if( 0 == strcmp(argv[0],"debug")) {
170 argv[0] = "/usr/local/bin/Interpreter.exe";
172 main_args.file=argv[0];
173 main_args.argc=argc;
174 main_args.argv=argv;
175 printf ("runtime exec managed code\n");
177 mono_runtime_exec_managed_code (domain, main_thread_handler,
178 &main_args);
180 else {
181 printf ("no command line parameters.\n");
183 free(CommandLine);
185 printf ("calling JIT cleanup\n");
186 mono_jit_cleanup (domain);
188 return retval;