Merge pull request #344 from Arkshine/fix/iniparser-inline-comment

Remove inline comment support in multilingual INI parser (bug 6476)
This commit is contained in:
Vincent Herbet 2016-03-16 23:57:28 +01:00
commit 7522403da8
4 changed files with 38 additions and 32 deletions

View File

@ -490,7 +490,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
Data.currentFile = file; Data.currentFile = file;
unsigned int line, col; unsigned int line, col;
bool result = textparsers->ParseFile_INI(file, static_cast<ITextListener_INI*>(this), &line, &col); bool result = textparsers->ParseFile_INI(file, static_cast<ITextListener_INI*>(this), &line, &col, false);
if (!result) if (!result)
{ {

View File

@ -778,7 +778,7 @@ failed:
* INI parser * INI parser
*/ */
bool TextParsers::ParseFile_INI(const char *file, ITextListener_INI *ini_listener, unsigned int *line, unsigned int *col) bool TextParsers::ParseFile_INI(const char *file, ITextListener_INI *ini_listener, unsigned int *line, unsigned int *col, bool inline_comment)
{ {
FILE *fp = fopen(file, "rt"); FILE *fp = fopen(file, "rt");
unsigned int curline = 0; unsigned int curline = 0;
@ -842,47 +842,50 @@ bool TextParsers::ParseFile_INI(const char *file, ITextListener_INI *ini_listene
continue; continue;
} }
/* Now search for comment characters */ if (inline_comment)
in_quote = false;
save_ptr = ptr;
for (size_t i = 0; i<len; i++, ptr++)
{ {
if (!in_quote) /* Now search for comment characters */
in_quote = false;
save_ptr = ptr;
for (size_t i = 0; i<len; i++, ptr++)
{ {
switch (*ptr) if (!in_quote)
{ {
case '"': switch (*ptr)
{ {
in_quote = true; case '"':
break; {
} in_quote = true;
case ';': break;
{ }
/* Stop the loop */ case ';':
len = i; {
/* Stop the loop */
len = i;
/* Terminate the string here */ /* Terminate the string here */
*ptr = '\0'; *ptr = '\0';
break; break;
}
}
}
else
{
if (*ptr == '"')
{
in_quote = false;
} }
} }
} }
else
if (!len)
{ {
if (*ptr == '"') continue;
{
in_quote = false;
}
} }
}
if (!len) ptr = save_ptr;
{
continue;
} }
ptr = save_ptr;
/* Lastly, strip ending whitespace off */ /* Lastly, strip ending whitespace off */
for (size_t i = len - 1; i<len; i--) for (size_t i = len - 1; i<len; i--)
{ {

View File

@ -52,7 +52,8 @@ public:
bool ParseFile_INI(const char *file, bool ParseFile_INI(const char *file,
ITextListener_INI *ini_listener, ITextListener_INI *ini_listener,
unsigned int *line, unsigned int *line,
unsigned int *col); unsigned int *col,
bool inline_comment);
SMCError ParseFile_SMC(const char *file, SMCError ParseFile_SMC(const char *file,
ITextListener_SMC *smc_listener, ITextListener_SMC *smc_listener,

View File

@ -351,12 +351,14 @@
* @param ini_listener Event handler for reading file. * @param ini_listener Event handler for reading file.
* @param line If non-NULL, will contain last line parsed (0 if file could not be opened). * @param line If non-NULL, will contain last line parsed (0 if file could not be opened).
* @param col If non-NULL, will contain last column parsed (undefined if file could not be opened). * @param col If non-NULL, will contain last column parsed (undefined if file could not be opened).
* @param inline_comment Whether inline comment is allowed.
* @return True if parsing succeeded, false if file couldn't be opened or there was a syntax error. * @return True if parsing succeeded, false if file couldn't be opened or there was a syntax error.
*/ */
virtual bool ParseFile_INI(const char *file, virtual bool ParseFile_INI(const char *file,
ITextListener_INI *ini_listener, ITextListener_INI *ini_listener,
unsigned int *line, unsigned int *line,
unsigned int *col) =0; unsigned int *col,
bool inline_comment = true) =0;
/** /**
* @brief Parses an SMC-format text file. * @brief Parses an SMC-format text file.