Subversion Repositories Kolibri OS

Rev

Rev 5190 | Rev 6068 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include 
8
#include 
9
#include 
10
11
 
12
{
13
    char  banner[8];
14
    int   version;
15
    int   start;
16
    int   iend;
17
    int   memsize;
18
    int   stacktop;
19
    char  *cmdline;
20
    char  *path;
21
    int    reserved;
22
    void  *__idata_start;
23
    void  *__idata_end;
24
    int  (*main)(int argc, char **argv, char **envp);
25
};
26
27
 
5190 serge 28
void init_loader(void *libc_image);
29
void init_reent();
30
4349 Serge 31
 
5190 serge 32
void* get_entry_point(void *raw);
4349 Serge 33
int (*entry)(int, char **, char **);
34
35
 
5190 serge 36
int   __appenv_size;
37
4349 Serge 38
 
5190 serge 39
4349 Serge 40
 
41
__thread_startup (int (*entry)(void*), void *param,
42
                  void *stacklow, void *stackhigh)
43
{
44
    int retval;
45
46
 
5190 serge 47
4349 Serge 48
 
49
    "movl %0, %%fs:8    \n\t"           // use TLS
50
    "movl %1, %%fs:12    \n\t"
51
    ::"r"(stacklow), "r"(stackhigh));
52
53
 
54
55
 
56
57
 
58
};
59
60
 
61
{
62
    return NULL;
63
}
64
65
 
5190 serge 66
{
67
    enum quote_state
68
    {
69
        QUOTE_NONE,         /* no " active in current parm       */
70
        QUOTE_DELIMITER,    /* " was first char and must be last */
71
        QUOTE_STARTED       /* " was seen, look for a match      */
72
    };
73
4349 Serge 74
 
5190 serge 75
    unsigned int argc;
76
    char *p = cmdline;
77
    char *new_arg, *start;
78
4349 Serge 79
 
5190 serge 80
4349 Serge 81
 
5190 serge 82
    {
83
        /* skip over spaces and tabs */
84
        if ( *p )
85
        {
86
            while (*p == ' ' || *p == '\t')
87
                ++p;
88
        }
89
4349 Serge 90
 
5190 serge 91
            break;
92
93
 
94
        if( *p == '\"' )
95
        {
96
            p++;
97
            state = QUOTE_DELIMITER;
98
        }
99
        new_arg = start = p;
100
        for (;;)
101
        {
102
            if( *p == '\"' )
103
            {
104
                p++;
105
                if( state == QUOTE_NONE )
106
                {
107
                    state = QUOTE_STARTED;
108
                }
109
                else
110
                {
111
                    state = QUOTE_NONE;
112
                }
113
                continue;
114
            }
115
116
 
117
            {
118
                if( state == QUOTE_NONE )
119
                {
120
                    break;
121
                }
122
            }
123
124
 
125
                break;
126
127
 
128
            {
129
                if( p[1] == '\"' )
130
                {
131
                    ++p;
132
                    if( p[-2] == '\\' )
133
                    {
134
                        continue;
135
                    }
136
                }
137
            }
138
            if( argv )
139
            {
140
                *(new_arg++) = *p;
141
            }
142
            ++p;
143
        };
144
145
 
146
        {
147
            argv[ argc ] = start;
148
            ++argc;
149
150
 
151
              The *new = '\0' is req'd in case there was a \" to "
152
              translation. It must be after the *p check against
153
              '\0' because new and p could point to the same char
154
              in which case the scan would be terminated too soon.
155
            */
156
157
 
158
            {
159
                *new_arg = '\0';
160
                break;
161
            }
162
            *new_arg = '\0';
163
            ++p;
164
        }
165
        else
166
        {
167
            ++argc;
168
            if( *p == '\0' )
169
            {
170
                break;
171
            }
172
            ++p;
173
        }
174
    }
175
176
 
177
};
178
179
 
4349 Serge 180
libc_crt_startup (void *libc_base)
181
{
182
    struct   app_hdr *header = NULL;
183
    int retval = 0;
5190 serge 184
4349 Serge 185
 
5190 serge 186
    int    argc;
187
4349 Serge 188
 
189
190
 
191
    _tls_map[0] = 0xE0;
192
    init_reent();
193
    init_stdio();
4921 Serge 194
4349 Serge 195
 
196
197
 
198
199
 
200
        goto done;
201
202
 
203
    {
204
        argc = split_cmdline(header->cmdline, NULL) + 1;
5190 serge 205
        argv = alloca((argc+1)*sizeof(char*));
206
        argv[0] = header->path;
207
208
 
209
    }
4349 Serge 210
    else
5190 serge 211
    {
212
        argc = 1;
213
        argv = alloca((argc+1)*sizeof(char*));
214
        argv[0] = header->path;
215
    }
216
    argv[argc] = NULL;
217
4349 Serge 218
 
5190 serge 219
done:
4349 Serge 220
    exit (retval);
221
}
222