Subversion Repositories shark

Rev

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