Subversion Repositories shark

Rev

Rev 1199 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1200 giacomo 1
#include <kernel/kern.h>
1199 giacomo 2
#include <stdlib.h>
3
#include <string.h>
4
#include <stdio.h>
5
#include "parser.h"
6
 
7
#define PAR_TOTAL_EXEC_TIME 0
8
#define PAR_TIME 2
9
#define PAR_ACT_TYPE 3
10
#define PAR_TASK_NUMBER 4
11
#define PAR_EXEC_TYPE 5
12
#define PAR_TASK_TYPE 6
13
#define PAR_NOTHING 8
14
#define PAR_ERROR 10
15
#define PAR_FOUND 11
16
 
17
#define PAR_EXEC_CONST 12
18
#define PAR_EXEC_MEAN 13
19
#define PAR_EXEC_EXP 14
20
#define PAR_EXEC_EXP_MAX 15
21
 
22
#define PAR_ACT_SINGLE 16
23
#define PAR_ACT_PERIODIC 17
24
#define PAR_ACT_MEAN 18
25
#define PAR_ACT_EXP 19
26
#define PAR_ACT_EXP_MAX 20
27
 
28
#define PAR_TASK_NRT 21
29
#define PAR_TASK_HARD 22
30
#define PAR_TASK_SOFT 23
31
 
32
#define PARSER_DEBUG
33
 
34
static int find_break(char **buf, int find_type, struct timespec *time, int *val)
35
{
36
 
37
  int i;
38
  char str[20];
39
 
40
  i = 0;
41
  while (((char *)(*buf))[i] == ' ' || ((char *)(*buf))[i] == ':') i++;
42
  *buf += i;
43
 
44
  switch (find_type) {
1200 giacomo 45
 
46
    case PAR_NOTHING:
47
      if (((char *)(*buf))[0] == '#' ||
48
          ((char *)(*buf))[0] == ';' ||
49
          ((char *)(*buf))[0] == 0 ||
50
          ((char *)(*buf))[0] == '\n') return PAR_FOUND;
51
      break;
1199 giacomo 52
 
53
    case PAR_TOTAL_EXEC_TIME:
54
      if (!strncmp(*buf, "TOTAL_EXEC_TIME:",16)) {
55
        *buf += 16;
56
        return PAR_FOUND;
57
      }
58
      break;
59
 
60
    case PAR_TIME:
61
      if (((char *)(*buf))[0] != '[') return PAR_ERROR;
62
      *buf += 1;
63
      i = 0;
64
      while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') {
65
        str[i] = ((char *)(*buf))[i];
66
        i++;
67
      }
68
      if (((char *)(*buf))[i] != ']') return PAR_ERROR;
69
      str[i] = 0;
70
      time->tv_sec = atoi(str);
71
      i += 2;
72
      *buf += i;
73
      i = 0;
74
      while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') {
75
        str[i] = ((char *)(*buf))[i];
76
        i++;
77
      }
78
      if (((char *)(*buf))[i] != ']') return PAR_ERROR;
79
      str[i] = 0;
80
      time->tv_nsec = atoi(str) * 1000;
81
      i += 2;
82
      *buf += i;
83
      return PAR_FOUND;
84
      break;
85
 
86
    case PAR_TASK_TYPE:
87
      if (!strncmp(*buf, "NRT:",4)) {
88
        *val = PAR_TASK_NRT;
89
        *buf += 4;
90
        return PAR_FOUND;
91
      }
92
      if (!strncmp(*buf, "HARD:",5)) {
93
        *val = PAR_TASK_HARD;
94
        *buf += 5;
95
        return PAR_FOUND;
96
      }
97
      if (!strncmp(*buf, "SOFT:",5)) {
98
        *val = PAR_TASK_SOFT;
99
        *buf += 5;
100
        return PAR_FOUND;
101
      }
102
      break;
103
 
104
   case PAR_TASK_NUMBER:
105
      if (((char *)(*buf))[0] != '[') return PAR_ERROR;
106
      *buf += 1;
107
      i = 0;
108
      while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') {
109
        str[i] = ((char *)(*buf))[i];
110
        i++;
111
      }
112
      if (((char *)(*buf))[i] != ']') return PAR_ERROR;
113
      str[i] = 0;
114
      *val = atoi(str);
115
      i += 2;
116
      *buf += i;
117
      return PAR_FOUND;
118
      break;
119
 
120
    case PAR_ACT_TYPE:
121
      if (!strncmp(*buf,"ACT_SINGLE(",11)) {
122
        *buf += 11;
123
        *val = PAR_ACT_SINGLE;
124
        return PAR_FOUND;
125
      }
126
      if (!strncmp(*buf,"ACT_PERIODIC(",13)) {
127
        *buf += 13;
128
        *val = PAR_ACT_PERIODIC;
129
        return PAR_FOUND;
130
      }
131
      if (!strncmp(*buf,"ACT_MEAN(",9)) {
132
        *buf += 9;
133
        *val = PAR_ACT_MEAN;
134
        return PAR_FOUND;
135
      }
136
      if (!strncmp(*buf,"ACT_EXP(",8)) {
137
        *buf += 8;
138
        *val = PAR_ACT_EXP;
139
        return PAR_FOUND;;
140
      }
141
      if (!strncmp(*buf,"ACT_EXP_MAX(",12)) {
142
        *buf += 12;
143
        *val = PAR_ACT_EXP_MAX;
144
        return PAR_FOUND;
145
      }
146
      return PAR_ERROR;
147
      break;
148
 
149
   case PAR_EXEC_TYPE:
150
     if (!strncmp(*buf,"EXEC_CONST(",11)) {
151
       *buf += 11;
152
       *val = PAR_EXEC_CONST;
153
       return PAR_FOUND;
154
     }
155
     if (!strncmp(*buf,"EXEC_MEAN(",10)) {
156
       *buf += 10;
157
       *val = PAR_EXEC_MEAN;
158
       return PAR_FOUND;
159
     }
160
     if (!strncmp(*buf,"EXEC_EXP(",9)) {
161
       *buf += 9;
162
       *val = PAR_EXEC_EXP;
163
       return PAR_FOUND;
164
     }
165
     if (!strncmp(*buf,"EXEC_EXP_MAX(",13)) {
166
       *buf += 13;
167
       *val = PAR_EXEC_EXP_MAX;
168
       return PAR_FOUND;
169
     }
170
     return PAR_ERROR;
171
     break;
172
 
173
   }
174
 
175
   return PAR_ERROR;
176
 
177
}
178
 
179
void par_error(int line_num)
180
{
181
 
182
  cprintf("\nParser error: line [%d]\n",line_num);
1200 giacomo 183
  sys_end();
1199 giacomo 184
 
185
}
186
 
1200 giacomo 187
/* result:
188
 * 0 -> nothing
189
 * 1 -> total
190
 * 2 -> new task-loader
191
 */
192
int line_parser(char *buf, int line_num, struct timespec *total, struct loader_task *last)
1199 giacomo 193
{
194
  char *pbuf = buf;
1200 giacomo 195
  struct timespec time;
196
  struct loader_task *ld = NULL;
1199 giacomo 197
  int val, res;
198
 
1200 giacomo 199
  res = find_break(&pbuf, PAR_NOTHING, &time, &val);
200
  if (res == PAR_FOUND) return 0;
201
 
1199 giacomo 202
  res = find_break(&pbuf,PAR_TOTAL_EXEC_TIME, &time, &val);
203
  if (res == PAR_FOUND) {
1200 giacomo 204
    NULL_TIMESPEC(total);
1199 giacomo 205
    res = find_break(&pbuf, PAR_TIME, &time, &val);
206
    if (res == PAR_FOUND) {
1200 giacomo 207
      TIMESPEC_ASSIGN(total,&time);
1199 giacomo 208
      #ifdef PARSER_DEBUG
1200 giacomo 209
        cprintf("TOTAL EXEC TIME SEC = %ld NSEC = %ld\n",total->tv_sec,total->tv_nsec);
1199 giacomo 210
      #endif
1200 giacomo 211
      return 1;
212
    } else par_error(line_num);
1199 giacomo 213
  }
214
 
215
  res = find_break(&pbuf,PAR_TASK_TYPE, &time, &val);
216
  if (res == PAR_FOUND) {
217
    #ifdef PARSER_DEBUG
218
      cprintf("TASK TYPE = %d\n",val);
219
    #endif
220
 
1200 giacomo 221
    ld = malloc(sizeof(struct loader_task));
222
    if (ld == NULL) par_error(line_num);
223
 
224
    ld->next = NULL;
225
    last = ld;
226
 
227
    ld->task_type = val;
228
 
229
  } else par_error(line_num);
230
 
1199 giacomo 231
  res = find_break(&pbuf,PAR_TASK_NUMBER, &time, &val);
232
  if (res == PAR_FOUND) {
233
    #ifdef PARSER_DEBUG
234
      cprintf("TASK LEVEL = %d\n",val);
235
    #endif
236
 
1200 giacomo 237
    ld->task_level = val;
238
 
239
  } else par_error(line_num);
240
 
1199 giacomo 241
  res = find_break(&pbuf,PAR_TASK_NUMBER, &time, &val);
242
  if (res == PAR_FOUND) {
243
    #ifdef PARSER_DEBUG
244
      cprintf("TASK NUMBER = %d\n",val);
245
    #endif
246
 
1200 giacomo 247
    ld->number = val;
248
 
249
  } else par_error(line_num);
250
 
1199 giacomo 251
  res = find_break(&pbuf,PAR_ACT_TYPE, &time, &val);
252
  if (res == PAR_FOUND) {
253
    #ifdef PARSER_DEBUG
254
      cprintf("ACTIVATION TYPE: %d (",val);
255
    #endif
1200 giacomo 256
 
257
    ld->act_type = val;
1199 giacomo 258
 
259
    res = find_break(&pbuf,PAR_TIME, &time, &val);
260
    if (res == PAR_FOUND) {
261
      #ifdef PARSER_DEBUG
262
        cprintf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
263
      #endif
1200 giacomo 264
      TIMESPEC_ASSIGN(&ld->act_par_1,&time);
265
    } else par_error(line_num);
1199 giacomo 266
 
1200 giacomo 267
    if (ld->act_type != PAR_ACT_SINGLE) {
1199 giacomo 268
      res = find_break(&pbuf,PAR_TIME, &time, &val);
269
      if (res == PAR_FOUND) {
270
        #ifdef PARSER_DEBUG
271
          cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
272
        #endif
1200 giacomo 273
        TIMESPEC_ASSIGN(&ld->act_par_2,&time);
274
        } else par_error(line_num);
1199 giacomo 275
    }
276
 
1200 giacomo 277
    if (ld->act_type != PAR_ACT_SINGLE && ld->act_type != PAR_ACT_PERIODIC) {
1199 giacomo 278
      res = find_break(&pbuf,PAR_TIME, &time, &val);
279
      if (res == PAR_FOUND) {
280
        #ifdef PARSER_DEBUG
281
          cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
282
        #endif
1200 giacomo 283
        TIMESPEC_ASSIGN(&ld->act_par_3,&time);
284
        } else par_error(line_num);
1199 giacomo 285
    }
286
 
1200 giacomo 287
    if (ld->act_type != PAR_ACT_SINGLE && ld->act_type != PAR_ACT_PERIODIC &&
288
        ld->act_type != PAR_ACT_MEAN && ld->act_type != PAR_ACT_EXP) {
1199 giacomo 289
      res = find_break(&pbuf,PAR_TIME, &time, &val);
290
      if (res == PAR_FOUND) {
291
        #ifdef PARSER_DEBUG
292
          cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
293
        #endif
1200 giacomo 294
        TIMESPEC_ASSIGN(&ld->act_par_4,&time);
295
        } else par_error(line_num);
1199 giacomo 296
    }
297
 
298
    #ifdef PARSER_DEBUG
299
      cprintf(")\n");
300
    #endif
301
 
1200 giacomo 302
  } else par_error(line_num);
1199 giacomo 303
 
304
  res = find_break(&pbuf,PAR_TIME, &time, &val);
305
  if (res == PAR_FOUND) {
306
    #ifdef PARSER_DEBUG
307
      cprintf("WCET: [%ld][%ld]\n",time.tv_sec,time.tv_nsec/1000);
308
    #endif
1200 giacomo 309
    TIMESPEC_ASSIGN(&ld->wcet,&time);
310
  } else par_error(line_num);
1199 giacomo 311
 
312
  res = find_break(&pbuf,PAR_EXEC_TYPE, &time, &val);
313
  if (res == PAR_FOUND) {
314
    #ifdef PARSER_DEBUG
315
      cprintf("EXEC TYPE: %d (",val);
316
    #endif
1200 giacomo 317
    ld->exec_type = val;
1199 giacomo 318
    res = find_break(&pbuf,PAR_TIME, &time, &val);
319
    if (res == PAR_FOUND) {
320
      #ifdef PARSER_DEBUG
321
        cprintf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
322
      #endif
1200 giacomo 323
      TIMESPEC_ASSIGN(&ld->exec_par_1,&time);
324
    } else par_error(line_num);
1199 giacomo 325
 
1200 giacomo 326
    if (ld->exec_type != PAR_EXEC_CONST) {
1199 giacomo 327
      res = find_break(&pbuf,PAR_TIME, &time, &val);
328
      if (res == PAR_FOUND) {
329
        #ifdef PARSER_DEBUG
330
          cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
331
        #endif
1200 giacomo 332
        TIMESPEC_ASSIGN(&ld->exec_par_2,&time);
333
        } else par_error(line_num);
1199 giacomo 334
    }
335
 
1200 giacomo 336
    if (ld->exec_type != PAR_EXEC_CONST && ld->exec_type != PAR_EXEC_MEAN &&
337
        ld->exec_type != PAR_EXEC_EXP) {
1199 giacomo 338
      res = find_break(&pbuf,PAR_TIME, &time, &val);
339
      if (res == PAR_FOUND) {
340
        #ifdef PARSER_DEBUG
341
          cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000);
342
        #endif
1200 giacomo 343
        TIMESPEC_ASSIGN(&ld->exec_par_3,&time);
344
        } else par_error(line_num);
1199 giacomo 345
    }
346
 
347
    #ifdef PARSER_DEBUG
348
      cprintf(")\n");
349
    #endif
350
 
1200 giacomo 351
  } else par_error(line_num);
1199 giacomo 352
 
1200 giacomo 353
  return 2;
1199 giacomo 354
 
355
}
1200 giacomo 356