[asterisk-commits] twilson: branch twilson/config_docs r370516 - in /team/twilson/config_docs: d...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jul 25 23:47:19 CDT 2012
Author: twilson
Date: Wed Jul 25 23:47:15 2012
New Revision: 370516
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=370516
Log:
Add handling for config option syntax
Modified:
team/twilson/config_docs/doc/appdocsxml.dtd
team/twilson/config_docs/include/asterisk/xmldoc.h
team/twilson/config_docs/main/config_options.c
team/twilson/config_docs/main/xml.c
team/twilson/config_docs/main/xmldoc.c
Modified: team/twilson/config_docs/doc/appdocsxml.dtd
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/doc/appdocsxml.dtd?view=diff&rev=370516&r1=370515&r2=370516
==============================================================================
--- team/twilson/config_docs/doc/appdocsxml.dtd (original)
+++ team/twilson/config_docs/doc/appdocsxml.dtd Wed Jul 25 23:47:15 2012
@@ -43,7 +43,7 @@
<!ELEMENT configFile (configObject+)>
<!ATTLIST configFile name CDATA #REQUIRED>
- <!ELEMENT configObject (synopsis?,description?,syntax?,configOption+)>
+ <!ELEMENT configObject (synopsis?|description?|syntax?|configOption)*>
<!ATTLIST configObject name ID #REQUIRED>
<!ELEMENT configOption (synopsis,description?,syntax?)*>
@@ -51,10 +51,9 @@
<!ATTLIST configOption regex (yes|no|true|false) "false">
<!ATTLIST configOption default CDATA #IMPLIED>
- <!ELEMENT matchInfo (category,field?)>
+ <!ELEMENT matchInfo (category|field?)>
<!ELEMENT category (#PCDATA)>
- <!ATTLIST category regex CDATA #REQUIRED>
<!ATTLIST category match (yes|no|true|false) #REQUIRED>
<!ELEMENT field (#PCDATA)>
@@ -77,7 +76,7 @@
<!ELEMENT synopsis (#PCDATA)>
- <!ELEMENT syntax (parameter|dataType|category|xi:include)*>
+ <!ELEMENT syntax (parameter|dataType|category|matchInfo|xi:include)*>
<!ATTLIST syntax argsep CDATA ",">
<!ELEMENT description (para|note|warning|variablelist|enumlist|info|xi:include)*>
Modified: team/twilson/config_docs/include/asterisk/xmldoc.h
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/include/asterisk/xmldoc.h?view=diff&rev=370516&r1=370515&r2=370516
==============================================================================
--- team/twilson/config_docs/include/asterisk/xmldoc.h (original)
+++ team/twilson/config_docs/include/asterisk/xmldoc.h Wed Jul 25 23:47:15 2012
@@ -71,7 +71,8 @@
unsigned int regex;
};
-void ast_xml_doc_update_config_option(const char *module, const char *name, const char *object_name, const char *default_value, unsigned int regex);
+void ast_xmldoc_update_config_option(const char *module, const char *name, const char *object_name, const char *default_value, unsigned int regex);
+void ast_xmldoc_update_config_type(const char *module, const char *name, const char *category, const char *matchfield, const char *matchvalue, unsigned int matches);
/*!
* \brief Get the syntax for a specified application or function.
Modified: team/twilson/config_docs/main/config_options.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/config_options.c?view=diff&rev=370516&r1=370515&r2=370516
==============================================================================
--- team/twilson/config_docs/main/config_options.c (original)
+++ team/twilson/config_docs/main/config_options.c Wed Jul 25 23:47:15 2012
@@ -147,7 +147,7 @@
return regex;
}
-static int link_option_to_types(struct aco_type **types, struct aco_option *opt)
+static int link_option_to_types(struct aco_info *info, struct aco_type **types, struct aco_option *opt)
{
size_t idx = 0;
struct aco_type *type;
@@ -160,7 +160,7 @@
return -1;
}
#ifdef AST_XML_DOCS
- ast_xml_doc_update_config_option(AST_MODULE, opt->name, type->name, opt->default_val, opt->match_type == ACO_REGEX);
+ ast_xmldoc_update_config_option(info->module, opt->name, type->name, opt->default_val, opt->match_type == ACO_REGEX);
#endif
}
return 0;
@@ -183,7 +183,7 @@
opt->deprecated = 1;
opt->match_type = ACO_EXACT;
- if (link_option_to_types(types, opt)) {
+ if (link_option_to_types(info, types, opt)) {
ao2_ref(opt, -1);
return -1;
}
@@ -194,7 +194,7 @@
#ifdef AST_XML_DOCS
/*! \brief Find a particular ast_xml_doc_item by module, types, and name
*/
-static struct ast_xml_doc_item *find_docs(struct ast_xml_doc_item *config_info, struct aco_type **types, const char *name)
+static struct ast_xml_doc_item *find_xmldoc_option(struct ast_xml_doc_item *config_info, struct aco_type **types, const char *name)
{
struct ast_xml_doc_item *iter = config_info;
@@ -215,6 +215,22 @@
}
}
return NULL;
+}
+
+static struct ast_xml_doc_item *find_xmldoc_type(struct ast_xml_doc_item *config_info, const char *name)
+{
+ struct ast_xml_doc_item *iter = config_info;
+ if (!iter) {
+ return NULL;
+ }
+ /* First is just the config Info, skip it */
+ while ((iter = iter->next)) {
+ if (strcasecmp(iter->type, "configObject") || strcasecmp(iter->name, name)) {
+ continue;
+ }
+ break;
+ }
+ return iter;
}
#endif
@@ -264,7 +280,7 @@
return -1;
};
- if (link_option_to_types(types, opt)) {
+ if (link_option_to_types(info, types, opt)) {
ao2_ref(opt, -1);
return -1;
}
@@ -275,7 +291,7 @@
RAII_VAR(struct ast_xml_doc_item *, config_info, ao2_find(xmldocs, info->module, OBJ_KEY), ao2_cleanup);
struct ast_xml_doc_item *config_option;
- if (!config_info || !(config_option = find_docs(config_info, types, name))) {
+ if (!config_info || !(config_option = find_xmldoc_option(config_info, types, name))) {
ast_log(LOG_ERROR, "XML Documentation for option '%s' in modules '%s' not found!\n", name, info->module);
/* ao2_ref(opt, -1);
* return -1; */
@@ -669,19 +685,43 @@
return 0;
}
+static void update_runtime_type_docs(const char *module, struct aco_type *type)
+{
+ RAII_VAR(struct ast_xml_doc_item *, config_info, ao2_find(xmldocs, module, OBJ_KEY), ao2_cleanup);
+ struct ast_xml_doc_item *config_type;
+
+ if (!config_info || !(config_type = find_xmldoc_type(config_info, type->name))) {
+ return;
+ }
+ if (ast_str_strlen(config_type->syntax)) {
+ return;
+ }
+
+ ast_str_set(&config_type->syntax, 0, "category %s /%s/\n", type->category_match == ACO_WHITELIST ? "=~" : "!~", type->category);
+ if (!ast_strlen_zero(type->matchfield)) {
+ ast_str_append(&config_type->syntax, 0, "matchfield: %s = %s\n", type->matchfield, type->matchvalue);
+ }
+}
+
int aco_info_init(struct aco_info *info)
{
- size_t x, y;
+ size_t x = 0, y = 0;
+ struct aco_file *file;
+ struct aco_type *type;
if (!(info->internal = ast_calloc(1, sizeof(*info->internal)))) {
return -1;
}
- for (x = 0; info->files[x]; x++) {
- for (y = 0; info->files[x]->types[y]; y++) {
- if (internal_type_init(info->files[x]->types[y])) {
+ while ((file = info->files[x++])) {
+ while ((type = file->types[y++])) {
+ if (internal_type_init(type)) {
goto error;
}
+#ifdef AST_XML_DOCS
+ ast_xmldoc_update_config_type(info->module, type->name, type->category, type->matchfield, type->matchvalue, type->category_match == ACO_WHITELIST);
+ update_runtime_type_docs(info->module, type);
+#endif
}
}
Modified: team/twilson/config_docs/main/xml.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/xml.c?view=diff&rev=370516&r1=370515&r2=370516
==============================================================================
--- team/twilson/config_docs/main/xml.c (original)
+++ team/twilson/config_docs/main/xml.c Wed Jul 25 23:47:15 2012
@@ -28,6 +28,7 @@
#include "asterisk.h"
#include "asterisk/xml.h"
#include "asterisk/logger.h"
+#include "asterisk/utils.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
@@ -348,7 +349,7 @@
}
if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
xmlXPathFreeObject(result);
- ast_log(LOG_WARNING, "No results for query: %s\n", xpath_str);
+ ast_debug(5, "No results for query: %s\n", xpath_str);
return NULL;
}
return (struct ast_xml_xpath_results *) result;
Modified: team/twilson/config_docs/main/xmldoc.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/xmldoc.c?view=diff&rev=370516&r1=370515&r2=370516
==============================================================================
--- team/twilson/config_docs/main/xmldoc.c (original)
+++ team/twilson/config_docs/main/xmldoc.c Wed Jul 25 23:47:15 2012
@@ -1105,7 +1105,7 @@
static char *xmldoc_get_syntax_config_object(struct ast_xml_node *fixnode, const char *name)
{
- struct ast_xml_node *node;
+ struct ast_xml_node *matchinfo, *tmp;
int match;
const char *text;
RAII_VAR(struct ast_str *, syntax, ast_str_create(128), ast_free);
@@ -1113,13 +1113,20 @@
if (!syntax) {
return NULL;
}
- if (!(node = ast_xml_find_element(ast_xml_node_get_children(fixnode), "category", NULL, NULL))) {
+ if (!(matchinfo = ast_xml_find_element(ast_xml_node_get_children(fixnode), "matchInfo", NULL, NULL))) {
return NULL;
}
- match = ast_true(ast_xml_get_attribute(node, "match"));
- text = ast_xml_get_text(node);
+ if (!(tmp = ast_xml_find_element(ast_xml_node_get_children(matchinfo), "category", NULL, NULL))) {
+ return NULL;
+ }
+ match = ast_true(ast_xml_get_attribute(tmp, "match"));
+ text = ast_xml_get_text(tmp);
ast_str_set(&syntax, 0, "category %s /%s/\n", match ? "=~" : "!~", text);
+ if ((tmp = ast_xml_find_element(ast_xml_node_get_children(matchinfo), "field", NULL, NULL))) {
+ text = ast_xml_get_text(tmp);
+ ast_str_append(&syntax, 0, "matchfield: %s = %s\n", ast_xml_get_attribute(tmp, "name"), text);
+ }
return ast_strdup(ast_str_buffer(syntax));
}
@@ -2263,13 +2270,20 @@
return item;
}
-static struct ast_xml_xpath_results *find_config_option(const char *module, const char * object_name, const char *name)
+static struct ast_xml_xpath_results * __attribute__((format(printf, 1, 2))) query_xmldocs(const char *fmt, ...)
{
struct ast_xml_xpath_results *results = NULL;
struct documentation_tree *doctree;
RAII_VAR(struct ast_str *, xpath_str, ast_str_create(128), ast_free);
-
- ast_str_set(&xpath_str, 0, "//configObject[@name='%s']/configOption[@name='%s']", object_name, name);
+ va_list ap;
+
+ if (!xpath_str) {
+ return NULL;
+ }
+
+ va_start(ap, fmt);
+ ast_str_set_va(&xpath_str, 0, fmt, ap);
+ va_end(ap);
AST_RWLIST_RDLOCK(&xmldoc_tree);
AST_LIST_TRAVERSE(&xmldoc_tree, doctree, entry) {
@@ -2283,13 +2297,53 @@
return results;
}
-void ast_xml_doc_update_config_option(const char *module, const char *name, const char *object_name, const char *default_value, unsigned int regex)
-{
- RAII_VAR(struct ast_xml_xpath_results *, results, find_config_option(module, object_name, name), ast_xml_xpath_results_free);
+void ast_xmldoc_update_config_type(const char *module, const char *name, const char *category, const char *matchfield, const char *matchvalue, unsigned int matches)
+{
+ RAII_VAR(struct ast_xml_xpath_results *, results, NULL, ast_xml_xpath_results_free);
+ struct ast_xml_node *type, *syntax, *matchinfo, *tmp;
+
+ /* If we already have a syntax element, bail */
+ if ((results = query_xmldocs("//configInfo[@name='%s']/*/configObject[@name='%s']/syntax", module, name))) {
+ return;
+ }
+
+ if (!(results = query_xmldocs("//configInfo[@name='%s']/*/configObject[@name='%s']", module, name))) {
+ return;
+ }
+
+ if (!(type = ast_xml_xpath_results(results))) {
+ return;
+ }
+
+ if (!(syntax = ast_xml_new_child(type, "syntax"))) {
+ return;
+ }
+
+ if (!(matchinfo = ast_xml_new_child(syntax, "matchInfo"))) {
+ return;
+ }
+
+ if (!(tmp = ast_xml_new_child(matchinfo, "category"))) {
+ return;
+ }
+
+ ast_xml_set_text(tmp, category);
+ ast_xml_set_attribute(tmp, "match", matches ? "true" : "false");
+
+ if (!ast_strlen_zero(matchfield) && !(tmp = ast_xml_new_child(matchinfo, "field"))) {
+ return;
+ }
+
+ ast_xml_set_attribute(tmp, "name", matchfield);
+ ast_xml_set_text(tmp, matchvalue);
+}
+
+void ast_xmldoc_update_config_option(const char *module, const char *name, const char *object_name, const char *default_value, unsigned int regex)
+{
+ RAII_VAR(struct ast_xml_xpath_results *, results, NULL, ast_xml_xpath_results_free);
struct ast_xml_node *option;
-
- if (!results) {
+ if (!(results = query_xmldocs("//configInfo[@name='%s']/*/configObject[@name='%s']/configOption[@name='%s']", module, object_name, name))) {
return;
}
More information about the asterisk-commits
mailing list