Rev 1200 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#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;
}