114 lines
2.7 KiB
114 lines
2.7 KiB
/*
|
|
* read_lab_file.cpp
|
|
*
|
|
* Created on: 10.09.2012
|
|
* Author: Thomas Heinemann
|
|
*/
|
|
|
|
#include "parser.h"
|
|
|
|
#include "read_lab_file.h"
|
|
|
|
#include "src/exceptions/wrong_file_format.h"
|
|
#include "src/exceptions/file_IO_exception.h"
|
|
|
|
#include <cstring>
|
|
#include <cstdlib>
|
|
#include <cstdio>
|
|
|
|
|
|
namespace mrmc {
|
|
|
|
namespace parser {
|
|
|
|
|
|
/*!
|
|
* Reads a .lab file and puts the result in a labelling structure.
|
|
* @param node_count the number of states.
|
|
* @param filename input .lab file's name.
|
|
* @return returns a pointer to a labelling object.
|
|
*/
|
|
mrmc::dtmc::labeling * read_lab_file(int node_count, const char * filename)
|
|
{
|
|
/* Note that this function uses strtok_r on char-array s.
|
|
* This function will modify this string.
|
|
* However, as only the result of its tokenization is used, this is not a problem.
|
|
*
|
|
* Thread-safety is ensured by using strtok_r instead of strtok.
|
|
*/
|
|
FILE *P;
|
|
char s[BUFFER_SIZE]; //String buffer
|
|
char *saveptr = NULL; //Buffer for strtok_r
|
|
char sep[] = " \n\t"; //Separators for the tokens
|
|
|
|
P = fopen(filename, "r");
|
|
|
|
if (P == NULL) {
|
|
throw mrmc::exceptions::file_IO_exception();
|
|
}
|
|
|
|
if (fgets(s, BUFFER_SIZE, P)) {
|
|
if (strcmp(s, "#DECLARATION\n")) {
|
|
fclose(P);
|
|
throw mrmc::exceptions::wrong_file_format();
|
|
}
|
|
}
|
|
|
|
|
|
mrmc::dtmc::labeling* result = new mrmc::dtmc::labeling(node_count);
|
|
|
|
//Here, all propositions are to be declared...
|
|
if (fgets(s, BUFFER_SIZE, P)) {
|
|
char * proposition;
|
|
for (proposition = strtok_r(s, sep, &saveptr);
|
|
proposition != NULL;
|
|
proposition = strtok_r(NULL, sep, &saveptr)) {
|
|
result -> addProposition(proposition);
|
|
}
|
|
} else {
|
|
fclose(P);
|
|
delete result;
|
|
throw mrmc::exceptions::wrong_file_format();
|
|
}
|
|
|
|
saveptr = NULL; //resetting save pointer for strtok_r
|
|
|
|
if (fgets(s, BUFFER_SIZE, P)) {
|
|
if (strcmp(s, "#END\n")) {
|
|
fclose(P);
|
|
delete result;
|
|
throw mrmc::exceptions::wrong_file_format();
|
|
}
|
|
}
|
|
|
|
while (fgets(s, BUFFER_SIZE, P)) {
|
|
char * token = NULL;
|
|
uint_fast32_t node = 0;
|
|
/* First token has to be a number identifying the node,
|
|
* hence it is treated differently from the other tokens.
|
|
*/
|
|
token = strtok_r(s, sep, &saveptr);
|
|
if (sscanf(token, "%u", &node) == 0) {
|
|
fclose(P);
|
|
delete result;
|
|
throw mrmc::exceptions::wrong_file_format();
|
|
}
|
|
do {
|
|
token = strtok_r(NULL, sep, &saveptr);
|
|
if (token == NULL) {
|
|
break;
|
|
}
|
|
result->addLabelToNode(token, node);
|
|
} while (token != NULL);
|
|
|
|
}
|
|
|
|
fclose(P);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
} //namespace parser
|
|
|
|
} //namespace mrmc
|