Subversion Repositories shark

Rev

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