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;
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)
{

View File

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

View File

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

View File

@ -351,12 +351,14 @@
* @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 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.
*/
virtual bool ParseFile_INI(const char *file,
ITextListener_INI *ini_listener,
unsigned int *line,
unsigned int *col) =0;
unsigned int *col,
bool inline_comment = true) =0;
/**
* @brief Parses an SMC-format text file.