<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/18692">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Geolocation: Base Asterisk Prereqs<br><br>* Added ast_variable_list_from_quoted_string()<br> Parse a quoted string into an ast_variable list.<br><br>* Added ast_str_substitute_variables_full2()<br> Perform variable/function/expression substitution on an ast_str.<br><br>* Added ast_strsep_quoted()<br> Like ast_strsep except you can specify a specific quote character.<br><br>* Added ast_xml_find_child_element()<br> Find a direct child element by name.<br><br>* Added ast_xml_doc_dump_memory()<br> Dump the specified document to a buffer<br><br>* ast_datastore_free() now checks for a NULL datastore<br> before attempting to destroy it.<br><br>Change-Id: I5dcefed2f5f93a109e8b489e18d80d42e45244ec<br>---<br>M include/asterisk/config.h<br>M include/asterisk/strings.h<br>M main/config.c<br>M main/utils.c<br>M tests/test_config.c<br>5 files changed, 51 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/92/18692/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/config.h b/include/asterisk/config.h</span><br><span>index 2d41f81..2f67fe9 100644</span><br><span>--- a/include/asterisk/config.h</span><br><span>+++ b/include/asterisk/config.h</span><br><span>@@ -1027,6 +1027,26 @@</span><br><span> const char *name_value_separator, const char *quote_str);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Parse a string into an ast_variable list. The reverse of ast_variable_list_join</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param input The name-value pair string to parse.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param item_separator The string used to separate the list items.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Only the first character in the string will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If NULL, "," will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param name_value_separator The string used to separate each item's name and value.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Only the first character in the string will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If NULL, "=" will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param quote_str The string used to quote values.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Only the first character in the string will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If NULL, '"' will be used.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval A pointer to a list of ast_variables.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval NULL if there was an error or no variables could be parsed.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ast_variable *ast_variable_list_from_quoted_string(const char *input, const char *item_separator,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *name_value_separator, const char *quote_str);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span> * \brief Update variable value within a config</span><br><span> *</span><br><span> * \param category Category element within the config</span><br><span>diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h</span><br><span>index 3169f91..8b3a378 100644</span><br><span>--- a/include/asterisk/strings.h</span><br><span>+++ b/include/asterisk/strings.h</span><br><span>@@ -311,6 +311,24 @@</span><br><span> char *ast_strsep_strict(char **s, const char sep, const char quote, uint32_t flags);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Like ast_strsep() except you can specify a specific quote character</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ \param s Pointer to address of the string to be processed.</span><br><span style="color: hsl(120, 100%, 40%);">+ Will be modified and can't be constant.</span><br><span style="color: hsl(120, 100%, 40%);">+ \param sep A single character delimiter.</span><br><span style="color: hsl(120, 100%, 40%);">+ \param quote The quote character</span><br><span style="color: hsl(120, 100%, 40%);">+ \param flags Controls post-processing of the result.</span><br><span style="color: hsl(120, 100%, 40%);">+ AST_STRSEP_TRIM trims all leading and trailing whitespace from the result.</span><br><span style="color: hsl(120, 100%, 40%);">+ AST_STRSEP_STRIP does a trim then strips the outermost quotes. You may want</span><br><span style="color: hsl(120, 100%, 40%);">+ to trim again after the strip. Just OR both the TRIM and STRIP flags.</span><br><span style="color: hsl(120, 100%, 40%);">+ AST_STRSEP_UNESCAPE unescapes '\' sequences.</span><br><span style="color: hsl(120, 100%, 40%);">+ AST_STRSEP_ALL does all of the above processing.</span><br><span style="color: hsl(120, 100%, 40%);">+ \return The next token or NULL if done or if there are more than 8 levels of</span><br><span style="color: hsl(120, 100%, 40%);">+ nested quotes.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+char *ast_strsep_quoted(char **s, const char sep, const char quote, uint32_t flags);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span> \brief Strip backslash for "escaped" semicolons,</span><br><span> the string to be stripped (will be modified).</span><br><span> \return The stripped string.</span><br><span>diff --git a/main/config.c b/main/config.c</span><br><span>index dcf1b9a..0e27d76 100644</span><br><span>--- a/main/config.c</span><br><span>+++ b/main/config.c</span><br><span>@@ -722,7 +722,7 @@</span><br><span> return local_str;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_variable *ast_variable_list_from_string(const char *input, const char *item_separator,</span><br><span style="color: hsl(120, 100%, 40%);">+struct ast_variable *ast_variable_list_from_quoted_string(const char *input, const char *item_separator,</span><br><span> const char *name_value_separator, const char *quote_str)</span><br><span> {</span><br><span> char item_sep;</span><br><span>@@ -744,14 +744,14 @@</span><br><span> quote = ast_strlen_zero(quote_str) ? '"' : quote_str[0];</span><br><span> item_string = ast_strip(ast_strdupa(input));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while ((item = ast_strsep_strict(&item_string, item_sep, quote, AST_STRSEP_ALL))) {</span><br><span style="color: hsl(0, 100%, 40%);">- item_name = ast_strsep_strict(&item, nv_sep, quote, AST_STRSEP_ALL);</span><br><span style="color: hsl(120, 100%, 40%);">+ while ((item = ast_strsep_quoted(&item_string, item_sep, quote, AST_STRSEP_ALL))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ item_name = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);</span><br><span> if (!item_name) {</span><br><span> ast_variables_destroy(new_list);</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- item_value = ast_strsep_strict(&item, nv_sep, quote, AST_STRSEP_ALL);</span><br><span style="color: hsl(120, 100%, 40%);">+ item_value = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);</span><br><span> if (!item_value) {</span><br><span> ast_variables_destroy(new_list);</span><br><span> return NULL;</span><br><span>@@ -767,6 +767,12 @@</span><br><span> return new_list;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ast_variable *ast_variable_list_from_string(const char *input, const char *item_separator,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *name_value_separator)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return ast_variable_list_from_quoted_string(input, item_separator, name_value_separator, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const char *ast_config_option(struct ast_config *cfg, const char *cat, const char *var)</span><br><span> {</span><br><span> const char *tmp;</span><br><span>diff --git a/main/utils.c b/main/utils.c</span><br><span>index 38c5b0c..7d1d6bd 100644</span><br><span>--- a/main/utils.c</span><br><span>+++ b/main/utils.c</span><br><span>@@ -1859,7 +1859,7 @@</span><br><span> return st;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *ast_strsep_strict(char **iss, const char sep, const char quote, uint32_t flags)</span><br><span style="color: hsl(120, 100%, 40%);">+char *ast_strsep_quoted(char **iss, const char sep, const char quote, uint32_t flags)</span><br><span> {</span><br><span> char *st = *iss;</span><br><span> char *is;</span><br><span>diff --git a/tests/test_config.c b/tests/test_config.c</span><br><span>index 08c1bb1..166879a 100644</span><br><span>--- a/tests/test_config.c</span><br><span>+++ b/tests/test_config.c</span><br><span>@@ -1952,7 +1952,7 @@</span><br><span> </span><br><span> switch (cmd) {</span><br><span> case TEST_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">- info->name = "variable_list_from_string";</span><br><span style="color: hsl(120, 100%, 40%);">+ info->name = "variable_list_from_quoted_string";</span><br><span> info->category = "/main/config/";</span><br><span> info->summary = "Test parsing a string into a variable list";</span><br><span> info->description = info->summary;</span><br><span>@@ -1962,7 +1962,7 @@</span><br><span> }</span><br><span> </span><br><span> parse_string = "abc = 'def', ghi = 'j,kl', mno='pq=r', stu = 'vwx=\"yz\", ABC = \"DEF\"'";</span><br><span style="color: hsl(0, 100%, 40%);">- list = ast_variable_list_from_string(parse_string, ",", "=", "'");</span><br><span style="color: hsl(120, 100%, 40%);">+ list = ast_variable_list_from_quoted_string(parse_string, ",", "=", "'");</span><br><span> ast_test_validate(test, list != NULL);</span><br><span> str = ast_variable_list_join(list, "|", "^", "@", NULL);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/18692">change 18692</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/18692"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: development/16/geolocation </div>
<div style="display:none"> Gerrit-Change-Id: I5dcefed2f5f93a109e8b489e18d80d42e45244ec </div>
<div style="display:none"> Gerrit-Change-Number: 18692 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>