summaryrefslogtreecommitdiffstats
path: root/include/drm/drm_property.h
AgeCommit message (Expand)Author
2018-09-09drm: drop drmP.h include from drm_plane.cDaniel Vetter
2018-07-13drm: Fix kerneldoc for DRM_MODE_PROP_IMMUTABLESean Paul
2018-04-27drm: Don't pass the index to drm_property_add_enum()Ville Syrjälä
2018-03-22drm: Remove drm_property_{un/reference}_blob aliasesHaneen Mohammed
2018-03-16Revert "drm: Use a flexible array member for blob property data"Ville Syrjälä
2018-03-07drm: Make property flags u32Ville Syrjälä
2017-11-10drm/mode_object: fix documentation for object lookups.Dave Airlie
2017-10-12drm: Pass struct drm_file * to __drm_mode_object_find [v2]Keith Packard
2017-07-14drm: rename, adjust and export drm_atomic_replace_property_blobPeter Rosin
2017-06-08drm: Add const to name field declaration in struct drm_prop_enum_listJyri Sarha
2017-02-28drm: Introduce drm_property_blob_{get,put}()Thierry Reding
2017-01-25drm/kms-core: Use recommened kerneldoc for struct member refsDaniel Vetter
2016-09-19drm: Move a few macros away from drm_crtc.hDaniel Vetter
2016-08-29drm/doc: Polish docs for drm_property&drm_property_blobDaniel Vetter
2016-08-29drm: Extract drm_property.[hc]Daniel Vetter
d>
diff --git a/include/utils.h b/include/utils.h
index 110ac80f..bb462930 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -11,7 +11,6 @@ class utils {
static std::vector<std::string> tokenize(const std::string& str, std::string delimiters = " \r\n\t");
static std::vector<std::string> tokenize_spaced(const std::string& str, std::string delimiters = " \r\n\t");
static std::vector<std::string> tokenize_nl(const std::string& str, std::string delimiters = "\r\n");
- static std::vector<std::string> tokenize_config(const std::string& str, std::string delimiters = " \r\n\t");
static std::vector<std::string> tokenize_quoted(const std::string& str, std::string delimiters = " \r\n\t");
};
diff --git a/src/configparser.cpp b/src/configparser.cpp
index 36474f70..324187c1 100644
--- a/src/configparser.cpp
+++ b/src/configparser.cpp
@@ -19,7 +19,7 @@ void configparser::parse() {
getline(f,line);
while (f.is_open() && !f.eof()) {
GetLogger().log(LOG_DEBUG,"configparser::parse: tokenizing %s",line.c_str());
- std::vector<std::string> tokens = utils::tokenize_config(line);
+ std::vector<std::string> tokens = utils::tokenize_quoted(line);
if (tokens.size() > 0) {
std::string cmd = tokens[0];
config_action_handler * handler = action_handlers[cmd];
diff --git a/src/utils.cpp b/src/utils.cpp
index 7f6c7cb1..fefa78fc 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -3,23 +3,15 @@
namespace newsbeuter {
-std::vector<std::string> utils::tokenize_config(const std::string& str, std::string delimiters) {
- std::vector<std::string> tokens = tokenize_quoted(str,delimiters);
- for (std::vector<std::string>::iterator it=tokens.begin();it!=tokens.end();++it) {
- if ((*it)[0] == '#') {
- tokens.erase(it,tokens.end());
- break;
- }
- }
- return tokens;
-}
-
std::vector<std::string> utils::tokenize_quoted(const std::string& str, std::string delimiters) {
std::vector<std::string> tokens;
std::string::size_type last_pos = str.find_first_not_of(delimiters, 0);
std::string::size_type pos = last_pos;
while (pos != std::string::npos && last_pos != std::string::npos) {
+ if (str[last_pos] == '#') // stop as soon as we found a comment
+ break;
+
if (str[last_pos] == '"') {
++last_pos;
pos = last_pos;
@@ -28,9 +20,47 @@ std::vector<std::string> utils::tokenize_quoted(const std::string& str, std::str
/* TODO: \" needs to be taken care of properly! */
if (pos >= str.length()) {
pos = std::string::npos;
- tokens.push_back(str.substr(last_pos, str.length() - last_pos));
+ std::string token;
+ while (last_pos < str.length()) {
+ if (str[last_pos] == '\\') {
+ if (str[last_pos-1] == '\\')
+ token.append("\\");
+ } else {
+ if (str[last_pos-1] == '\\') {
+ switch (str[last_pos]) {
+ case 'n': token.append("\n"); break;
+ case 'r': token.append("\r"); break;
+ case 't': token.append("\t"); break;
+ case '"': token.append("\""); break;
+ }
+ } else {
+ token.append(1, str[last_pos]);
+ }
+ }
+ ++last_pos;
+ }
+ tokens.push_back(token);
} else {
- tokens.push_back(str.substr(last_pos, pos - last_pos));
+ std::string token;
+ while (last_pos < pos) {
+ if (str[last_pos] == '\\') {
+ if (str[last_pos-1] == '\\')
+ token.append("\\");
+ } else {
+ if (str[last_pos-1] == '\\') {
+ switch (str[last_pos]) {
+ case 'n': token.append("\n"); break;
+ case 'r': token.append("\r"); break;
+ case 't': token.append("\t"); break;
+ case '"': token.append("\""); break;
+ }
+ } else {
+ token.append(1, str[last_pos]);
+ }
+ }
+ ++last_pos;
+ }
+ tokens.push_back(token);
++pos;
}
} else {