===========================================================================**/
// std include
-#include <regex.h>
#include <cstdio>
#include <sstream>
#include <iostream>
if (ferror(handle)) return false;
if (fread(&item,1,1,handle) != 1) return false;
- if (item=='\n' or feof(handle)) {
+ if (item=='\n' || feof(handle)) {
line = stream.str();
return true;
}
}
}
-std::string ExtractMatch(const std::string& base, const regmatch_t& match)
-{
- return base.substr(match.rm_so,match.rm_eo-match.rm_so);
-}
-
template <typename T>
T ConvertFromString(const std::string& value)
{
return converted;
}
+bool
+clitk::GateAsciiImageIO::FindRegularExpressionNextLine(itksys::RegularExpression ®, std::string &s, FILE* handle)
+{
+ std::string line;
+ if(!ReadLine(handle,line)) return false;
+ if(!reg.compile(s.c_str())) return false;
+ return reg.find(line.c_str());
+}
+
//--------------------------------------------------------------------
// Read Image Header
bool clitk::GateAsciiImageIO::ReadHeader(FILE* handle, GateAsciiHeader& header)
{
assert(handle);
- std::string line;
-
- regex_t re_comment;
- regex_t re_matrix_size;
- regex_t re_resol;
- regex_t re_voxel_size;
- regex_t re_nb_value;
- regmatch_t matches[4];
-
- { // build regex
- assert(regcomp(&re_comment,"^#.+$",REG_EXTENDED|REG_NEWLINE) == 0);
- assert(regcomp(&re_matrix_size,"^# +Matrix *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE) == 0);
- assert(regcomp(&re_resol,"^# +Resol *= +\\(([0-9]+),([0-9]+),([0-9]+)\\)$",REG_EXTENDED|REG_NEWLINE) == 0);
- assert(regcomp(&re_voxel_size,"^# +Voxel *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE) == 0);
- assert(regcomp(&re_nb_value,"^# +nbVal *= +([0-9]+)$",REG_EXTENDED|REG_NEWLINE) == 0);
- }
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_comment,line.c_str(),1,matches,0) == REG_NOMATCH) return false;
+ std::string regexstr[6] =
+ {"^#.+$",
+ "^# +Matrix *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",
+ "^# +Resol *= +\\(([0-9]+),([0-9]+),([0-9]+)\\)$",
+ "^# +Voxel *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",
+ "^# +nbVal *= +([0-9]+)$"};
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_matrix_size,line.c_str(),4,matches,0) == REG_NOMATCH) return false;
- header.matrix_size[0] = ConvertFromString<double>(ExtractMatch(line,matches[1]));
- header.matrix_size[1] = ConvertFromString<double>(ExtractMatch(line,matches[2]));
- header.matrix_size[2] = ConvertFromString<double>(ExtractMatch(line,matches[3]));
+ itksys::RegularExpression regex;
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_resol,line.c_str(),4,matches,0) == REG_NOMATCH) return false;
- header.resolution[0] = ConvertFromString<int>(ExtractMatch(line,matches[1]));
- header.resolution[1] = ConvertFromString<int>(ExtractMatch(line,matches[2]));
- header.resolution[2] = ConvertFromString<int>(ExtractMatch(line,matches[3]));
+ if(!FindRegularExpressionNextLine(regex, regexstr[0], handle)) return false;
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_voxel_size,line.c_str(),4,matches,0) == REG_NOMATCH) return false;
- header.voxel_size[0] = ConvertFromString<double>(ExtractMatch(line,matches[1]));
- header.voxel_size[1] = ConvertFromString<double>(ExtractMatch(line,matches[2]));
- header.voxel_size[2] = ConvertFromString<double>(ExtractMatch(line,matches[3]));
+ if(!FindRegularExpressionNextLine(regex, regexstr[1], handle)) return false;
+ header.matrix_size[0] = ConvertFromString<double>(regex.match(1));
+ header.matrix_size[1] = ConvertFromString<double>(regex.match(2));
+ header.matrix_size[2] = ConvertFromString<double>(regex.match(3));
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_nb_value,line.c_str(),2,matches,0) == REG_NOMATCH) return false;
- header.nb_value = ConvertFromString<int>(ExtractMatch(line,matches[1]));
+ if(!FindRegularExpressionNextLine(regex, regexstr[2], handle)) return false;
+ header.resolution[0] = ConvertFromString<int>(regex.match(1));
+ header.resolution[1] = ConvertFromString<int>(regex.match(2));
+ header.resolution[2] = ConvertFromString<int>(regex.match(3));
- if (!ReadLine(handle,line)) return false;
- if (regexec(&re_comment,line.c_str(),1,matches,0) == REG_NOMATCH) return false;
+ if(!FindRegularExpressionNextLine(regex, regexstr[3], handle)) return false;
+ header.voxel_size[0] = ConvertFromString<double>(regex.match(1));
+ header.voxel_size[1] = ConvertFromString<double>(regex.match(2));
+ header.voxel_size[2] = ConvertFromString<double>(regex.match(3));
- return true;
+ if(!FindRegularExpressionNextLine(regex, regexstr[4], handle)) return false;
+ header.nb_value = ConvertFromString<int>(regex.match(1));
+
+ if(!FindRegularExpressionNextLine(regex, regexstr[0], handle)) return false;
+
+ return true;
}
//--------------------------------------------------------------------