ddl/ddlgenerators/generator_library/headerrepresentation/parserhelper.cpp
2019-12-12 14:41:47 +01:00

254 lines
6.2 KiB
C++

/**
* @file
*
* @copyright
* @verbatim
Copyright @ 2017 Audi Electronics Venture GmbH. All rights reserved.
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular file, then
You may include the notice in a location (such as a LICENSE file in a
relevant directory) where a recipient would be likely to look for such a notice.
You may add additional accurate notices of copyright ownership.
@endverbatim
*/
#include <cstring>
#include "parserhelper.h"
namespace ddl_generator
{
void skipWhitespace(const char*& p, const char* additional_whitechars)
{
if (nullptr == p)
{
return;
}
if (additional_whitechars != nullptr)
{
while (a_util::strings::white_space.find(*p) != std::string::npos || (*p != '\0' && strchr(additional_whitechars, *p) != nullptr))
{
p++;
}
}
else
{
while (a_util::strings::white_space.find(*p) != std::string::npos)
{
p++;
}
}
}
bool getNextWord(const char*& src, std::string& dest, const char* additional_separator, bool use_escape)
{
if (nullptr == src)
{
return false;
}
dest.clear();
skipWhitespace(src);
if (*src == '\0')
{
return false;
}
char escape_active = false;
char last_char = '\0';
char quote = '\0';
if (*src == '\"' || *src == '\'')
{
quote = *(src++);
const char* strc_start = src;
while (*src != '\0' && (escape_active || *src != quote))
{
escape_active = use_escape && (*src == '\\' && last_char != '\\'); // escape next char?
last_char = *src;
src++;
}
dest.assign(strc_start, src - strc_start);
//dest.set(strc_start, src-strc_start);
if (*src == quote)
{
src++;
}
}
else
{
const char* src_start = src;
if (additional_separator == nullptr)
{
while (*src != '\0' && a_util::strings::white_space.find(*src) == std::string::npos)
{
src++;
size_t n = a_util::strings::white_space.find(*src);
size_t n_m = std::string::npos;
if (*src == '\"' || *src == '\'')
{
quote = *(src);
do
{
escape_active = use_escape && (*src == '\\' && last_char != '\\');
last_char = *src;
src++;
} while (*src != '\0' && (escape_active || *src != quote));
}
}
dest.assign(src_start, src-src_start);
}
else
{
while (*src != '\0' && (a_util::strings::white_space.find(*src) == std::string::npos
&& strchr(additional_separator, *src) == nullptr))
{
src++;
}
dest.assign(src_start, src-src_start);
}
}
return true;
}
void seekChars(const char*& p, const char* chars, bool ignore_quotes)
{
if ((nullptr == p) ||
(nullptr == chars))
{
return;
}
char escape_active = false;
char last_char = '\0';
bool inside_quotes = false;
char quote = '\0';
while (*p != '\0' && (escape_active || inside_quotes || (strchr(chars, *p) == nullptr)))
{
if (!ignore_quotes)
{
if (!escape_active && (*p == '\"' || *p == '\''))
{
if (inside_quotes && quote == *p)
{
quote = '\0';
inside_quotes = false;
}
else
{
quote = *p;
inside_quotes = true;
}
}
}
else
{
if (!escape_active && (*p == '\"' || *p == '\''))
{
quote = '\0';
}
}
escape_active = (*p == '\\' && last_char != '\\'); // escape next char?
last_char = *p;
p++;
}
}
void seekString(const char*& p, const char* seek_string, char* comment, bool ignore_quotes)
{
if ((nullptr == p) ||
(nullptr == seek_string))
{
return;
}
bool escape_active = false;
char last_char = '\0';
bool inside_quotes = false;
char quote = '\0';
size_t str_len = a_util::strings::getLength(seek_string);
int n_char = 0;
if (comment)
{
comment[n_char] = '\0';
}
while (*p != '\0')
{
if (!ignore_quotes)
{
if (!escape_active && !inside_quotes && *p == *seek_string)
{
if (a_util::strings::compare(p, seek_string, str_len) == 0)
{
if (comment)
{
comment[n_char] = '\0';
}
return;
}
}
if (!escape_active && (*p == '\"' || *p == '\''))
{
if (inside_quotes && quote == *p)
{
quote = '\0';
inside_quotes = false;
}
else
{
quote = *p;
inside_quotes = true;
}
}
}
else
{
if (!escape_active && *p == *seek_string)
{
if (a_util::strings::compare(p, seek_string, str_len) == 0)
{
if (comment)
{
comment[n_char] = '\0';
}
return;
}
}
}
escape_active = (*p == '\\' && last_char != '\\'); // escape next char?
last_char = *p;
if (comment)
{
comment[n_char] = *p;
}
++p;
n_char++;
}
if (comment)
{
comment[n_char] = '\0';
}
}
} // namespace A_UTILS_NS