Subversion Repositories shark

Rev

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