Rev 1258 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "lparser.h"
#include "common/time.h"
#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
] == ':' ||
((char *)(*buf
))[i
] == '\n' || ((char *)(*buf
))[i
] == '\r') i
++;
*buf
+= i
;
if (!strncmp(*buf
,"END",3) && find_type
== PAR_NOTHING
) {
*buf
+= 3;
return PAR_END
;
}
if (!strncmp(*buf
,"CONTRACT SECTION",16) && find_type
== PAR_NOTHING
) {
*buf
+= 16;
return PAR_CONTRACT_SECTION
;
}
if (!strncmp(*buf
,"TASK SECTION",12) && find_type
== PAR_NOTHING
) {
*buf
+= 12;
return PAR_TASK_SECTION
;
}
i
= 0;
if (((char *)(*buf
))[0] == '#' && find_type
== PAR_NOTHING
) {
while (((char *)(*buf
))[i
] != '\n' && ((char *)(*buf
))[i
] != '\r') i
++;
*buf
+= i
;
return PAR_FOUND
;
}
switch (find_type
) {
case PAR_NOTHING
:
if (((char *)(*buf
))[0] == ';' ||
((char *)(*buf
))[0] < 32) {
*buf
+= 1;
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
, "OS:",3)) {
*val
= PAR_TASK_OS
;
*buf
+= 3;
return PAR_FOUND
;
}
if (!strncmp(*buf
, "CT:",3)) {
*val
= PAR_TASK_CT
;
*buf
+= 3;
return PAR_FOUND
;
}
if (!strncmp(*buf
, "BT:",3)) {
*val
= PAR_TASK_BT
;
*buf
+= 3;
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
;
}
return PAR_ERROR
;
break;
case PAR_LOCAL_SCHEDULER
:
if (!strncmp(*buf
,"POSIX",5)) {
*buf
+= 5;
*val
= PAR_POSIX
;
return PAR_FOUND
;
}
if (!strncmp(*buf
,"EDF",3)) {
*buf
+= 3;
*val
= PAR_EDF
;
return PAR_FOUND
;
}
if (!strncmp(*buf
,"RM",2)) {
*buf
+= 2;
*val
= PAR_RM
;
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
;
}
return PAR_ERROR
;
break;
case PAR_CRIT_SESSION
:
if (!strncmp(*buf
,"NO_CRIT",7)) {
*buf
+= 7;
*val
= PAR_NO_CRIT
;
return PAR_FOUND
;
}
if (!strncmp(*buf
,"CRIT(",5)) {
*buf
+= 5;
*val
= PAR_CRIT
;
return PAR_FOUND
;
}
return PAR_ERROR
;
break;
}
return PAR_ERROR
;
}
void par_error
(int line_num
)
{
printf("\nParser error: line [%d]\n",line_num
);
exit(1);
}
/* result:
* 0 -> nothing
* 1 -> total
* 2 -> new task-loader
* 3 -> end file
*/
int line_parser_task
(char **pbuf
, int line_num
, struct loader_task
**last
)
{
struct timespec
time;
struct loader_task
*ld
= NULL
;
int val
, res
;
res
= find_break
(pbuf
, PAR_NOTHING
, &time, &val
);
if (res
== PAR_FOUND
) return 0;
if (res
== PAR_END
) return 3;
res
= find_break
(pbuf
,PAR_TASK_TYPE
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("TASK TYPE = %d\n",val
);
#endif
ld
= malloc(sizeof(struct loader_task
));
if (ld
== NULL
) par_error
(line_num
);
ld
->next
= NULL
;
*last
= ld
;
ld
->task_type
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TASK_NUMBER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("TASK SERVER = %d\n",val
);
#endif
ld
->server
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_LOCAL_SCHEDULER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("TASK LOCAL SCHEDULER = %d\n",val
);
#endif
ld
->local_scheduler
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TASK_NUMBER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("TASK NUMBER = %d\n",val
);
#endif
ld
->number
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("DEADLINE: [%ld][%ld]\n",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->deadline
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("WCET: [%ld][%ld]\n",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->wcet
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_ACT_TYPE
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("ACTIVATION TYPE: %d (",val
);
#endif
ld
->act_type
= val
;
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->act_par_1
,&time);
} else par_error
(line_num
);
if (ld
->act_type
!= PAR_ACT_SINGLE
) {
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->act_par_2
,&time);
} else par_error
(line_num
);
}
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
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->act_par_3
,&time);
} else par_error
(line_num
);
}
#ifdef PARSER_DEBUG
printf(")\n");
#endif
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_EXEC_TYPE
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("EXEC TYPE: %d (",val
);
#endif
ld
->exec_type
= val
;
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->exec_par_1
,&time);
} else par_error
(line_num
);
if (ld
->exec_type
!= PAR_EXEC_CONST
) {
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->exec_par_2
,&time);
} else par_error
(line_num
);
}
#ifdef PARSER_DEBUG
printf(")\n");
#endif
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_CRIT_SESSION
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("CRITITCAL SESSION: %d (",val
);
#endif
ld
->crit_type
= val
;
if (ld
->crit_type
== PAR_CRIT
) {
res
= find_break
(pbuf
,PAR_TASK_NUMBER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("[%d]",val
);
#endif
ld
->resource
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&ld
->crit_par
,&time);
} else par_error
(line_num
);
}
#ifdef PARSER_DEBUG
printf(")\n");
#endif
} else par_error
(line_num
);
return 2;
}
int line_parser_contract
(char **pbuf
, int line_num
, struct timespec
*total
, struct loader_contract
**last
)
{
struct timespec
time;
struct loader_contract
*lc
= NULL
;
int val
, res
;
res
= find_break
(pbuf
, PAR_NOTHING
, &time, &val
);
if (res
== PAR_FOUND
) return 0;
if (res
== PAR_END
) return 3;
res
= find_break
(pbuf
,PAR_TOTAL_EXEC_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
NULL_TIMESPEC
(total
);
res
= find_break
(pbuf
, PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
TIMESPEC_ASSIGN
(total
,&time);
#ifdef PARSER_DEBUG
printf("TOTAL EXEC TIME SEC = %ld NSEC = %ld\n",total
->tv_sec
,total
->tv_nsec
);
#endif
return 1;
} else par_error
(line_num
);
}
res
= find_break
(pbuf
,PAR_TASK_NUMBER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("CONTRACT [%d]",val
);
#endif
lc
= malloc(sizeof(struct loader_contract
));
if (lc
== NULL
) par_error
(line_num
);
lc
->next
= NULL
;
*last
= lc
;
lc
->number
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&lc
->cmin
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&lc
->tmax
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&lc
->cmax
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TIME
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld],",time.
tv_sec,time.
tv_nsec/1000);
#endif
TIMESPEC_ASSIGN
(&lc
->tmin
,&time);
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_TASK_NUMBER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf(",[%d]\n",val
);
#endif
lc
->workload
= val
;
} else par_error
(line_num
);
res
= find_break
(pbuf
,PAR_LOCAL_SCHEDULER
, &time, &val
);
if (res
== PAR_FOUND
) {
#ifdef PARSER_DEBUG
printf("LOCAL SCHEDULER = %d\n",val
);
#endif
lc
->local_scheduler
= val
;
} else par_error
(line_num
);
return 2;
}