Skip UTF-8 BOM in FileStorage
This commit is contained in:
parent
6c12533160
commit
38483fe7a7
@ -96,6 +96,15 @@ static inline bool cv_isspace(char c)
|
|||||||
return (9 <= c && c <= 13) || c == ' ';
|
return (9 <= c && c <= 13) || c == ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char* cv_skip_BOM(char* ptr)
|
||||||
|
{
|
||||||
|
if((uchar)ptr[0] == 0xef && (uchar)ptr[1] == 0xbb && (uchar)ptr[2] == 0xbf) //UTF-8 BOM
|
||||||
|
{
|
||||||
|
return ptr + 3;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
static char* icv_itoa( int _val, char* buffer, int /*radix*/ )
|
static char* icv_itoa( int _val, char* buffer, int /*radix*/ )
|
||||||
{
|
{
|
||||||
const int radix = 10;
|
const int radix = 10;
|
||||||
@ -4399,10 +4408,13 @@ cvOpenFileStorage( const char* query, CvMemStorage* dststorage, int flags, const
|
|||||||
const char* json_signature = "{";
|
const char* json_signature = "{";
|
||||||
char buf[16];
|
char buf[16];
|
||||||
icvGets( fs, buf, sizeof(buf)-2 );
|
icvGets( fs, buf, sizeof(buf)-2 );
|
||||||
|
char* bufPtr = cv_skip_BOM(buf);
|
||||||
|
size_t bufOffset = bufPtr - buf;
|
||||||
|
|
||||||
fs->fmt
|
fs->fmt
|
||||||
= strncmp( buf, yaml_signature, strlen(yaml_signature) ) == 0
|
= strncmp( bufPtr, yaml_signature, strlen(yaml_signature) ) == 0
|
||||||
? CV_STORAGE_FORMAT_YAML
|
? CV_STORAGE_FORMAT_YAML
|
||||||
: strncmp( buf, json_signature, strlen(json_signature) ) == 0
|
: strncmp( bufPtr, json_signature, strlen(json_signature) ) == 0
|
||||||
? CV_STORAGE_FORMAT_JSON
|
? CV_STORAGE_FORMAT_JSON
|
||||||
: CV_STORAGE_FORMAT_XML
|
: CV_STORAGE_FORMAT_XML
|
||||||
;
|
;
|
||||||
@ -4420,6 +4432,7 @@ cvOpenFileStorage( const char* query, CvMemStorage* dststorage, int flags, const
|
|||||||
buf_size = MAX( buf_size, (size_t)(CV_FS_MAX_LEN*2 + 1024) );
|
buf_size = MAX( buf_size, (size_t)(CV_FS_MAX_LEN*2 + 1024) );
|
||||||
}
|
}
|
||||||
icvRewind(fs);
|
icvRewind(fs);
|
||||||
|
fs->strbufpos = bufOffset;
|
||||||
|
|
||||||
fs->str_hash = cvCreateMap( 0, sizeof(CvStringHash),
|
fs->str_hash = cvCreateMap( 0, sizeof(CvStringHash),
|
||||||
sizeof(CvStringHashNode), fs->memstorage, 256 );
|
sizeof(CvStringHashNode), fs->memstorage, 256 );
|
||||||
|
|||||||
@ -928,3 +928,25 @@ TEST(Core_InputOutput, filestorage_json_comment)
|
|||||||
|
|
||||||
EXPECT_EQ(str, String("value"));
|
EXPECT_EQ(str, String("value"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Core_InputOutput, filestorage_utf8_bom)
|
||||||
|
{
|
||||||
|
EXPECT_NO_THROW(
|
||||||
|
{
|
||||||
|
String content ="\xEF\xBB\xBF<?xml version=\"1.0\"?>\n<opencv_storage>\n</opencv_storage>\n";
|
||||||
|
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
|
||||||
|
fs.release();
|
||||||
|
});
|
||||||
|
EXPECT_NO_THROW(
|
||||||
|
{
|
||||||
|
String content ="\xEF\xBB\xBF%YAML:1.0\n";
|
||||||
|
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
|
||||||
|
fs.release();
|
||||||
|
});
|
||||||
|
EXPECT_NO_THROW(
|
||||||
|
{
|
||||||
|
String content ="\xEF\xBB\xBF{\n}\n";
|
||||||
|
cv::FileStorage fs(content, cv::FileStorage::READ | cv::FileStorage::MEMORY);
|
||||||
|
fs.release();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user