X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkGateAsciiImageIO.cxx;h=dd47ef46b61d6b670eead939d387869c41a2273f;hb=13c3d27643a3200f3751ab3c391ba36a32a1293c;hp=f3d4a8d49211670def30995457eb484651210c4e;hpb=1d616cc7be31f7195c8bba4142e02350cd2fb958;p=clitk.git diff --git a/common/clitkGateAsciiImageIO.cxx b/common/clitkGateAsciiImageIO.cxx index f3d4a8d..dd47ef4 100644 --- a/common/clitkGateAsciiImageIO.cxx +++ b/common/clitkGateAsciiImageIO.cxx @@ -17,7 +17,6 @@ ===========================================================================**/ // std include -#include #include #include #include @@ -116,7 +115,7 @@ bool clitk::GateAsciiImageIO::ReadLine(FILE* handle, std::string& line) 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; } @@ -125,11 +124,6 @@ bool clitk::GateAsciiImageIO::ReadLine(FILE* handle, std::string& line) } } -std::string ExtractMatch(const std::string& base, const regmatch_t& match) -{ - return base.substr(match.rm_so,match.rm_eo-match.rm_so); -} - template T ConvertFromString(const std::string& value) { @@ -140,63 +134,53 @@ 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 - int ret = 0; - ret = regcomp(&re_comment,"^#.+$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_matrix_size,"^# +Matrix *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_resol,"^# +Resol *= +\\(([0-9]+),([0-9]+),([0-9]+)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_voxel_size,"^# +Voxel *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_nb_value,"^# +nbVal *= +([0-9]+)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 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(ExtractMatch(line,matches[1])); - header.matrix_size[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.matrix_size[2] = ConvertFromString(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(ExtractMatch(line,matches[1])); - header.resolution[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.resolution[2] = ConvertFromString(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(ExtractMatch(line,matches[1])); - header.voxel_size[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.voxel_size[2] = ConvertFromString(ExtractMatch(line,matches[3])); + if(!FindRegularExpressionNextLine(regex, regexstr[1], handle)) return false; + header.matrix_size[0] = ConvertFromString(regex.match(1)); + header.matrix_size[1] = ConvertFromString(regex.match(2)); + header.matrix_size[2] = ConvertFromString(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(ExtractMatch(line,matches[1])); + if(!FindRegularExpressionNextLine(regex, regexstr[2], handle)) return false; + header.resolution[0] = ConvertFromString(regex.match(1)); + header.resolution[1] = ConvertFromString(regex.match(2)); + header.resolution[2] = ConvertFromString(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(regex.match(1)); + header.voxel_size[1] = ConvertFromString(regex.match(2)); + header.voxel_size[2] = ConvertFromString(regex.match(3)); - return true; + if(!FindRegularExpressionNextLine(regex, regexstr[4], handle)) return false; + header.nb_value = ConvertFromString(regex.match(1)); + + if(!FindRegularExpressionNextLine(regex, regexstr[0], handle)) return false; + + return true; } //--------------------------------------------------------------------