core(persistence): fix KW issues

pull/13346/head
Alexander Alekhin 6 years ago
parent 197285d12a
commit 4e8311085f
  1. 17
      modules/core/src/persistence.cpp
  2. 14
      modules/core/src/persistence.hpp

@ -114,9 +114,11 @@ char* floatToString( char* buf, float value, bool halfprecision, bool explicitZe
}
else
{
static const char* fmt = halfprecision ? "%.4e" : "%.8e";
char* ptr = buf;
sprintf( buf, fmt, value );
if (halfprecision)
sprintf(buf, "%.4e", value);
else
sprintf(buf, "%.8e", value);
if( *ptr == '+' || *ptr == '-' )
ptr++;
for( ; cv_isdigit(*ptr); ptr++ )
@ -350,6 +352,7 @@ public:
void init()
{
flags = 0;
buffer.clear();
bufofs = 0;
state = UNDEFINED;
@ -358,6 +361,7 @@ public:
write_mode = false;
mem_mode = false;
space = 0;
wrap_margin = 71;
fmt = 0;
file = 0;
gzfile = 0;
@ -615,7 +619,8 @@ public:
for(;;)
{
int line_offset = (int)ftell( file );
char* ptr0 = gets( &xml_buf_[0], xml_buf_size ), *ptr;
const char* ptr0 = this->gets(&xml_buf_[0], xml_buf_size );
const char* ptr = NULL;
if( !ptr0 )
break;
ptr = ptr0;
@ -708,7 +713,7 @@ public:
const char* json_signature = "{";
const char* xml_signature = "<?xml";
char buf[16];
gets( buf, sizeof(buf)-2 );
this->gets( buf, sizeof(buf)-2 );
char* bufPtr = cv_skip_BOM(buf);
size_t bufOffset = bufPtr - buf;
@ -861,7 +866,7 @@ public:
char* gets()
{
char* ptr = gets(bufferStart(), (int)(bufferEnd() - bufferStart()));
char* ptr = this->gets(bufferStart(), (int)(bufferEnd() - bufferStart()));
if( !ptr )
{
ptr = bufferStart(); // FIXIT Why do we need this hack? What is about other parsers JSON/YAML?
@ -1766,11 +1771,13 @@ public:
};
FileStorage::FileStorage()
: state(0)
{
p = makePtr<FileStorage::Impl>(this);
}
FileStorage::FileStorage(const String& filename, int flags, const String& encoding)
: state(0)
{
p = makePtr<FileStorage::Impl>(this);
bool ok = p->open(filename.c_str(), flags, encoding.c_str());

@ -96,11 +96,20 @@ int decodeFormat( const char* dt, int* fmt_pairs, int max_len );
int decodeSimpleFormat( const char* dt );
}
#ifdef CV_STATIC_ANALYSIS
#define CV_PARSE_ERROR_CPP(errmsg) do { (void)fs; abort(); } while (0)
#else
#define CV_PARSE_ERROR_CPP( errmsg ) \
fs->parseError( CV_Func, (errmsg), __FILE__, __LINE__ )
#endif
#define CV_PERSISTENCE_CHECK_END_OF_BUFFER_BUG_CPP() do { \
CV_DbgAssert(ptr); \
if((ptr)[0] == 0 && (ptr) == fs->bufferEnd() - 1) CV_PARSE_ERROR_CPP("OpenCV persistence doesn't support very long lines"); \
} while (0)
#define CV_PERSISTENCE_CHECK_END_OF_BUFFER_BUG_CPP() \
if((ptr)[0] == 0 && (ptr) == fs->bufferEnd() - 1) CV_PARSE_ERROR_CPP("OpenCV persistence doesn't support very long lines")
class FileStorageParser;
class FileStorageEmitter;
@ -151,6 +160,7 @@ public:
virtual double strtod(char* ptr, char** endptr) = 0;
virtual char* parseBase64(char* ptr, int indent, FileNode& collection) = 0;
CV_NORETURN
virtual void parseError(const char* funcname, const std::string& msg,
const char* filename, int lineno) = 0;
};

Loading…
Cancel
Save