0,0 → 1,335 |
#include <stdlib.h> |
#include <string.h> |
#include <stdio.h> |
#include "parser.h" |
|
#define PAR_TOTAL_EXEC_TIME 0 |
#define PAR_TIME 2 |
#define PAR_ACT_TYPE 3 |
#define PAR_TASK_NUMBER 4 |
#define PAR_EXEC_TYPE 5 |
#define PAR_TASK_TYPE 6 |
#define PAR_NOTHING 8 |
#define PAR_END 9 |
#define PAR_ERROR 10 |
#define PAR_FOUND 11 |
|
#define PAR_EXEC_CONST 12 |
#define PAR_EXEC_MEAN 13 |
#define PAR_EXEC_EXP 14 |
#define PAR_EXEC_EXP_MAX 15 |
|
#define PAR_ACT_SINGLE 16 |
#define PAR_ACT_PERIODIC 17 |
#define PAR_ACT_MEAN 18 |
#define PAR_ACT_EXP 19 |
#define PAR_ACT_EXP_MAX 20 |
|
#define PAR_TASK_NRT 21 |
#define PAR_TASK_HARD 22 |
#define PAR_TASK_SOFT 23 |
|
#define PARSER_DEBUG |
|
static int find_break(char **buf, int find_type, struct timespec *time, int *val) |
{ |
|
int i; |
char str[20]; |
|
i = 0; |
while (((char *)(*buf))[i] == ' ' || ((char *)(*buf))[i] == ':') i++; |
*buf += i; |
|
if (((char *)(*buf))[0] == '#') return PAR_NOTHING; |
|
switch (find_type) { |
|
case PAR_END: |
if (((char *)(*buf))[0] == ';' || ((char *)(*buf))[0] == '\n') return PAR_FOUND; |
break; |
|
case PAR_TOTAL_EXEC_TIME: |
if (!strncmp(*buf, "TOTAL_EXEC_TIME:",16)) { |
*buf += 16; |
return PAR_FOUND; |
} |
break; |
|
case PAR_TIME: |
if (((char *)(*buf))[0] != '[') return PAR_ERROR; |
*buf += 1; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
time->tv_sec = atoi(str); |
i += 2; |
*buf += i; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
time->tv_nsec = atoi(str) * 1000; |
i += 2; |
*buf += i; |
return PAR_FOUND; |
break; |
|
case PAR_TASK_TYPE: |
if (!strncmp(*buf, "NRT:",4)) { |
*val = PAR_TASK_NRT; |
*buf += 4; |
return PAR_FOUND; |
} |
if (!strncmp(*buf, "HARD:",5)) { |
*val = PAR_TASK_HARD; |
*buf += 5; |
return PAR_FOUND; |
} |
if (!strncmp(*buf, "SOFT:",5)) { |
*val = PAR_TASK_SOFT; |
*buf += 5; |
return PAR_FOUND; |
} |
break; |
|
case PAR_TASK_NUMBER: |
if (((char *)(*buf))[0] != '[') return PAR_ERROR; |
*buf += 1; |
i = 0; |
while (((char *)(*buf))[i] >= '0' && ((char *)(*buf))[i] <= '9') { |
str[i] = ((char *)(*buf))[i]; |
i++; |
} |
if (((char *)(*buf))[i] != ']') return PAR_ERROR; |
str[i] = 0; |
*val = atoi(str); |
i += 2; |
*buf += i; |
return PAR_FOUND; |
break; |
|
case PAR_ACT_TYPE: |
if (!strncmp(*buf,"ACT_SINGLE(",11)) { |
*buf += 11; |
*val = PAR_ACT_SINGLE; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"ACT_PERIODIC(",13)) { |
*buf += 13; |
*val = PAR_ACT_PERIODIC; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"ACT_MEAN(",9)) { |
*buf += 9; |
*val = PAR_ACT_MEAN; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"ACT_EXP(",8)) { |
*buf += 8; |
*val = PAR_ACT_EXP; |
return PAR_FOUND;; |
} |
if (!strncmp(*buf,"ACT_EXP_MAX(",12)) { |
*buf += 12; |
*val = PAR_ACT_EXP_MAX; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
|
case PAR_EXEC_TYPE: |
if (!strncmp(*buf,"EXEC_CONST(",11)) { |
*buf += 11; |
*val = PAR_EXEC_CONST; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"EXEC_MEAN(",10)) { |
*buf += 10; |
*val = PAR_EXEC_MEAN; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"EXEC_EXP(",9)) { |
*buf += 9; |
*val = PAR_EXEC_EXP; |
return PAR_FOUND; |
} |
if (!strncmp(*buf,"EXEC_EXP_MAX(",13)) { |
*buf += 13; |
*val = PAR_EXEC_EXP_MAX; |
return PAR_FOUND; |
} |
return PAR_ERROR; |
break; |
|
} |
|
return PAR_ERROR; |
|
} |
|
void par_error(int line_num) |
{ |
|
cprintf("\nParser error: line [%d]\n",line_num); |
|
} |
|
int line_parser(void) |
{ |
char buf[1000]; |
char *pbuf = buf; |
struct timespec time,total_exec_time; |
struct loader_task ld; |
int val, res; |
|
sprintf(buf,"NRT:[1]:[1]:ACT_PERIODIC([13][123],[45][456]):[0][1000]:EXEC_CONST([0][10]);\n"); |
|
res = find_break(&pbuf,PAR_TOTAL_EXEC_TIME, &time, &val); |
if (res == PAR_FOUND) { |
NULL_TIMESPEC(&total_exec_time); |
res = find_break(&pbuf, PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
TIMESPEC_ASSIGN(&total_exec_time,&time); |
#ifdef PARSER_DEBUG |
cprintf("TOTAL EXEC TIME SEC = %ld NSEC = %ld\n",total_exec_time.tv_sec,total_exec_time.tv_nsec); |
#endif |
return 0; |
} else par_error(1); |
} |
|
res = find_break(&pbuf,PAR_TASK_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("TASK TYPE = %d\n",val); |
#endif |
ld.task_type = val; |
} else par_error(1); |
|
res = find_break(&pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("TASK LEVEL = %d\n",val); |
#endif |
ld.task_level = val; |
} else par_error(1); |
|
res = find_break(&pbuf,PAR_TASK_NUMBER, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("TASK NUMBER = %d\n",val); |
#endif |
ld.number = val; |
} else par_error(1); |
|
res = find_break(&pbuf,PAR_ACT_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("ACTIVATION TYPE: %d (",val); |
#endif |
ld.act_type = val; |
|
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.act_par_1,&time); |
} else par_error(1); |
|
if (ld.act_type != PAR_ACT_SINGLE) { |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.act_par_2,&time); |
} else par_error(1); |
} |
|
if (ld.act_type != PAR_ACT_SINGLE && ld.act_type != PAR_ACT_PERIODIC) { |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.act_par_3,&time); |
} else par_error(1); |
} |
|
if (ld.act_type != PAR_ACT_SINGLE && ld.act_type != PAR_ACT_PERIODIC && |
ld.act_type != PAR_ACT_MEAN && ld.act_type != PAR_ACT_EXP) { |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.act_par_4,&time); |
} else par_error(1); |
} |
|
#ifdef PARSER_DEBUG |
cprintf(")\n"); |
#endif |
|
} else par_error(1); |
|
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("WCET: [%ld][%ld]\n",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.wcet,&time); |
} else par_error(1); |
|
res = find_break(&pbuf,PAR_EXEC_TYPE, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("EXEC TYPE: %d (",val); |
#endif |
ld.exec_type = val; |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf("[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.exec_par_1,&time); |
} else par_error(1); |
|
if (ld.exec_type != PAR_EXEC_CONST) { |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.exec_par_2,&time); |
} else par_error(1); |
} |
|
if (ld.exec_type != PAR_EXEC_CONST && ld.exec_type != PAR_EXEC_MEAN && |
ld.exec_type != PAR_EXEC_EXP) { |
res = find_break(&pbuf,PAR_TIME, &time, &val); |
if (res == PAR_FOUND) { |
#ifdef PARSER_DEBUG |
cprintf(",[%ld][%ld]",time.tv_sec,time.tv_nsec/1000); |
#endif |
TIMESPEC_ASSIGN(&ld.exec_par_3,&time); |
} else par_error(1); |
} |
|
#ifdef PARSER_DEBUG |
cprintf(")\n"); |
#endif |
|
} else par_error(1); |
|
return 0; |
|
} |