Reorganize the files.
[monolithium.git] / libraries / mlcrt / src / crt0.c
1 /*
2  * crt0.c
3  *
4  * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <stdlib.h>
21 #include <string.h>
22 #include <monolithium.h>
23
24 int __crt_initialize_heap(void);
25 int __crt_initialize_files(process_params_t *params);
26 int main(int argc, char **argv);
27
28 void process_startup(process_params_t *params)
29 {
30     int argc = 1;
31     char *ptr;
32     int space = 1;
33
34     if (__crt_initialize_heap() < 0) syscall_terminate(INVALID_HANDLE, 255);
35     if (__crt_initialize_files(params) < 0) syscall_terminate(INVALID_HANDLE, 255);
36
37     for (ptr = params->command_line; *ptr; ptr++)
38     {
39         if (space != (isspace(*ptr) != 0))
40         {
41             argc++;
42             space = !space;
43         }
44     }
45
46     char **argv = (char**)__builtin_alloca(argc * sizeof(char*));
47     argc = 0;
48
49     for (ptr = strtok(params->command_line, " \t\r\n\v\f"); ptr != NULL; ptr = strtok(NULL, " \t\r\n\v\f"))
50     {
51         if (*ptr) argv[argc++] = ptr;
52     }
53
54     argv[argc] = NULL;
55
56     int exit_code = main(argc, argv);
57     exit(exit_code);
58 }