From ec7ce814011002093a07b03c13fdba1c2f258417 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 20 Jul 2017 19:58:36 +0300 Subject: [PATCH] core: fix FileStorage format detection in case of .gz archives --- modules/core/src/persistence.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index ef655e0338..a67578428e 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -4270,11 +4270,25 @@ cvOpenFileStorage( const char* query, CvMemStorage* dststorage, int flags, const if( fmt == CV_STORAGE_FORMAT_AUTO && filename ) { - const char* dot_pos = strrchr( filename, '.' ); + const char* dot_pos = NULL; + const char* dot_pos2 = NULL; + // like strrchr() implementation, but save two last positions simultaneously + for (const char* pos = filename; pos[0] != 0; pos++) + { + if (pos[0] == '.') + { + dot_pos2 = dot_pos; + dot_pos = pos; + } + } + if (cv_strcasecmp(dot_pos, ".gz") && dot_pos2 != NULL) + { + dot_pos = dot_pos2; + } fs->fmt - = cv_strcasecmp( dot_pos, ".xml" ) + = (cv_strcasecmp(dot_pos, ".xml") || cv_strcasecmp(dot_pos, ".xml.gz")) ? CV_STORAGE_FORMAT_XML - : cv_strcasecmp( dot_pos, ".json" ) + : (cv_strcasecmp(dot_pos, ".json") || cv_strcasecmp(dot_pos, ".json.gz")) ? CV_STORAGE_FORMAT_JSON : CV_STORAGE_FORMAT_YAML ;