blob: c093441f4e600a2438bc859ffb06ed8f1a052627 [file] [log] [blame]
/** @file
A brief file description
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include "DocNode.h"
#include "ComponentBase.h"
#include <cstring>
#include <string>
#include <map>
#include <list>
#include <cctype>
namespace EsiLib
{
namespace Utils
{
extern ComponentBase::Debug DEBUG_LOG;
extern ComponentBase::Error ERROR_LOG;
void init(ComponentBase::Debug debug_func, ComponentBase::Error error_func);
// looks for the given attribute in given data; a terminator can
// also be specified apart from the end_pos; attr_info will point
// to data inside data string
bool getAttribute(const std::string &data, const std::string &attr, size_t curr_pos, size_t end_pos, Attribute &attr_info,
size_t *term_pos = nullptr, char terminator = 0);
// less specialized version of method above
inline bool
getAttribute(const std::string &data, const char *attr, Attribute &attr_info)
{
return getAttribute(data, std::string(attr), 0, data.size(), attr_info);
}
// trims leading and trailing white space; input arguments
// will be modified to reflect trimmed data
inline void
trimWhiteSpace(const char *&data, int &data_len)
{
if (!data) {
data_len = 0;
} else {
if (data_len == -1) {
data_len = strlen(data);
}
int i, j;
for (i = 0; ((i < data_len) && isspace(data[i])); ++i)
;
for (j = (data_len - 1); ((j > i) && isspace(data[j])); --j)
;
data += i;
data_len = j - i + 1;
}
}
// does case insensitive comparison
inline bool
areEqual(const char *str1, int str1_len, const char *str2, int str2_len)
{
if (str1_len == str2_len) {
return (strncasecmp(str1, str2, str1_len) == 0);
}
return false;
}
inline bool
areEqual(const char *str1, int str1_len, const std::string &str2)
{
return areEqual(str1, str1_len, str2.data(), static_cast<int>(str2.size()));
}
// parses a string of name=value attributes separated by any character in pair_separators;
void parseAttributes(const char *data, int data_len, AttributeList &attr_list, const char *pair_separators = " ");
inline void
parseAttributes(const std::string &data, AttributeList &attr_list, const char *pair_separators = " ")
{
parseAttributes(data.data(), data.size(), attr_list, pair_separators);
}
typedef std::map<std::string, std::string> KeyValueMap;
typedef std::list<std::string> HeaderValueList;
// parses given lines (assumes <key><whitespace><value> format) and
// stores them in supplied map; Lines beginning with '#' are ignored
// also if line starts with "allowlistCookie", we store next token in a list
void parseKeyValueConfig(const std::list<std::string> &lines, KeyValueMap &kvMap, HeaderValueList &allowlistCookies);
inline std::string
unescape(const char *str, int len = -1)
{
std::string retval("");
if (str) {
for (int i = 0; (((len == -1) && (str[i] != '\0')) || (i < len)); ++i) {
if (str[i] != '\\') {
retval += str[i];
}
}
}
return retval;
}
}; // namespace Utils
}; // namespace EsiLib