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 ;