[Asterisk-code-review] aco: Minimize use of regex. (asterisk[13])

Jenkins2 asteriskteam at digium.com
Mon Dec 18 13:32:32 CST 2017


Jenkins2 has submitted this change and it was merged. ( https://gerrit.asterisk.org/7567 )

Change subject: aco: Minimize use of regex.
......................................................................

aco: Minimize use of regex.

Remove nearly all use of regex from ACO users.  Still remaining:
* app_confbridge has a legitamate use of option name regex.
* ast_sorcery_object_fields_register is implemented with regex, all
  callers use simple prefix based regex.  I haven't decided the best
  way to fix this in both 13/15 and master.

Change-Id: Ib5ed478218d8a661ace4d2eaaea98b59a897974b
---
M apps/app_agent_pool.c
M apps/app_skel.c
M apps/confbridge/conf_config_parser.c
M channels/chan_motif.c
M main/cdr.c
M main/cel.c
M main/features_config.c
M main/named_acl.c
M main/stasis.c
M main/udptl.c
M res/ari/config.c
M res/res_hep.c
M res/res_parking.c
M res/res_pjsip_notify.c
M res/res_statsd.c
M res/res_xmpp.c
M tests/test_config.c
17 files changed, 124 insertions(+), 73 deletions(-)

Approvals:
  George Joseph: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, approved
  Jenkins2: Approved for Submit



diff --git a/apps/app_agent_pool.c b/apps/app_agent_pool.c
index a637bbe..ef8b95e 100644
--- a/apps/app_agent_pool.c
+++ b/apps/app_agent_pool.c
@@ -457,11 +457,17 @@
 	struct ao2_container *agents;
 };
 
+static const char *agent_type_blacklist[] = {
+	"general",
+	"agents",
+	NULL,
+};
+
 static struct aco_type agent_type = {
 	.type = ACO_ITEM,
 	.name = "agent-id",
-	.category_match = ACO_BLACKLIST,
-	.category = "^(general|agents)$",
+	.category_match = ACO_BLACKLIST_ARRAY,
+	.category = (const char *)agent_type_blacklist,
 	.item_alloc = agent_cfg_alloc,
 	.item_find = agent_cfg_find,
 	.item_offset = offsetof(struct agents_cfg, agents),
@@ -473,8 +479,8 @@
 static struct aco_type general_type = {
 	.type = ACO_GLOBAL,
 	.name = "global",
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 static struct aco_file agents_conf = {
diff --git a/apps/app_skel.c b/apps/app_skel.c
index 12afdc7..20e6abf 100644
--- a/apps/app_skel.c
+++ b/apps/app_skel.c
@@ -244,8 +244,8 @@
 	.type = ACO_GLOBAL,
 	.name = "globals",
 	.item_offset = offsetof(struct skel_config, global),
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -255,18 +255,24 @@
 	.type = ACO_GLOBAL,
 	.name = "sounds",
 	.item_offset = offsetof(struct skel_config, global),
-	.category_match = ACO_WHITELIST,
-	.category = "^sounds$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "sounds",
 };
 
 struct aco_type *sound_options[] = ACO_TYPES(&sound_option);
+
+static const char *level_categories[] = {
+	"general",
+	"sounds",
+	NULL,
+};
 
 /*! \brief An aco_type structure to link the everything but the "general" and "sounds" categories to the skel_level type */
 static struct aco_type level_option = {
 	.type = ACO_ITEM,
 	.name = "level",
-	.category_match = ACO_BLACKLIST,
-	.category = "^(general|sounds)$",
+	.category_match = ACO_BLACKLIST_ARRAY,
+	.category = (const char *)level_categories,
 	.item_alloc = skel_level_alloc,
 	.item_find = skel_level_find,
 	.item_offset = offsetof(struct skel_config, levels),
diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c
index 2de1ec2..16d3935 100644
--- a/apps/confbridge/conf_config_parser.c
+++ b/apps/confbridge/conf_config_parser.c
@@ -377,7 +377,7 @@
 						regardless if this limit is reached or not.
 					</para></description>
 				</configOption>
-				<configOption name="^sound_">
+				<configOption name="sound_">
 					<synopsis>Override the various conference bridge sound files</synopsis>
 					<description><para>
 						All sounds in the conference are customizable using the bridge profile options below.
@@ -592,8 +592,8 @@
 static struct aco_type bridge_type = {
 	.type = ACO_ITEM,
 	.name = "bridge_profile",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.matchfield = "type",
 	.matchvalue = "bridge",
 	.item_alloc = bridge_profile_alloc,
@@ -629,8 +629,8 @@
 static struct aco_type user_type = {
 	.type = ACO_ITEM,
 	.name  = "user_profile",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.matchfield = "type",
 	.matchvalue = "user",
 	.item_alloc = user_profile_alloc,
@@ -660,8 +660,8 @@
 static struct aco_type menu_type = {
 	.type = ACO_ITEM,
 	.name = "menu",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.matchfield = "type",
 	.matchvalue = "menu",
 	.item_alloc = menu_alloc,
@@ -678,8 +678,8 @@
 static struct aco_type general_type = {
 	.type = ACO_GLOBAL,
 	.name = "global",
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 static struct aco_file confbridge_conf = {
@@ -2149,7 +2149,7 @@
 	aco_option_register(&cfg_info, "record_file", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_file));
 	aco_option_register(&cfg_info, "regcontext", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, regcontext));
 	aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language));
-	aco_option_register_custom(&cfg_info, "^sound_", ACO_REGEX, bridge_types, NULL, sound_option_handler, 0);
+	aco_option_register_custom(&cfg_info, "sound_", ACO_PREFIX, bridge_types, NULL, sound_option_handler, 0);
 	/* This option should only be used with the CONFBRIDGE dialplan function */
 	aco_option_register_custom(&cfg_info, "template", ACO_EXACT, bridge_types, NULL, bridge_template_handler, 0);
 
diff --git a/channels/chan_motif.c b/channels/chan_motif.c
index 3141037..9393807 100644
--- a/channels/chan_motif.c
+++ b/channels/chan_motif.c
@@ -543,8 +543,8 @@
 static struct aco_type endpoint_option = {
 	.type = ACO_ITEM,
 	.name = "endpoint",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.item_alloc = jingle_endpoint_alloc,
 	.item_find = jingle_endpoint_find,
 	.item_offset = offsetof(struct jingle_config, endpoints),
diff --git a/main/cdr.c b/main/cdr.c
index 60532fe..501589a 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -241,8 +241,29 @@
 	.type = ACO_GLOBAL,
 	.name = "general",
 	.item_offset = offsetof(struct module_config, general),
-	.category = "^general$",
-	.category_match = ACO_WHITELIST,
+	.category = "general",
+	.category_match = ACO_WHITELIST_EXACT,
+};
+
+/*! Config sections used by existing modules. Do not add to this list. */
+static const char *ignore_categories[] = {
+	"csv",
+	"custom",
+	"manager",
+	"odbc",
+	"pgsql",
+	"radius",
+	"sqlite",
+	"tds",
+	"mysql",
+	NULL,
+};
+
+static struct aco_type ignore_option = {
+	.type = ACO_IGNORE,
+	.name = "modules",
+	.category = (const char*)ignore_categories,
+	.category_match = ACO_WHITELIST_ARRAY,
 };
 
 static void *module_config_alloc(void);
@@ -252,8 +273,7 @@
 /*! \brief The file definition */
 static struct aco_file module_file_conf = {
 	.filename = "cdr.conf",
-	.skip_category = "(^csv$|^custom$|^manager$|^odbc$|^pgsql$|^radius$|^sqlite$|^tds$|^mysql$)",
-	.types = ACO_TYPES(&general_option),
+	.types = ACO_TYPES(&general_option, &ignore_option),
 };
 
 CONFIG_INFO_CORE("cdr", cfg_info, module_configs, module_config_alloc,
diff --git a/main/cel.c b/main/cel.c
index 0cdf1be..d46f185 100644
--- a/main/cel.c
+++ b/main/cel.c
@@ -244,15 +244,28 @@
 	.type = ACO_GLOBAL,
 	.name = "general",
 	.item_offset = offsetof(struct cel_config, general),
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
+};
+
+/*! Config sections used by existing modules. Do not add to this list. */
+static const char *ignore_categories[] = {
+	"manager",
+	"radius",
+	NULL,
+};
+
+static struct aco_type ignore_option = {
+	.type = ACO_IGNORE,
+	.name = "modules",
+	.category = (const char*)ignore_categories,
+	.category_match = ACO_WHITELIST_ARRAY,
 };
 
 /*! \brief The config file to be processed for the module. */
 static struct aco_file cel_conf = {
 	.filename = "cel.conf",                  /*!< The name of the config file */
-	.types = ACO_TYPES(&general_option),     /*!< The mapping object types to be processed */
-	.skip_category = "(^manager$|^radius$)", /*!< Config sections used by existing modules. Do not add to this list. */
+	.types = ACO_TYPES(&general_option, &ignore_option),     /*!< The mapping object types to be processed */
 };
 
 static int cel_pre_apply_config(void);
diff --git a/main/features_config.c b/main/features_config.c
index 2689687..e2d4057 100644
--- a/main/features_config.c
+++ b/main/features_config.c
@@ -219,7 +219,7 @@
 					The <replaceable>DYNAMIC_FEATURES</replaceable> is a <literal>#</literal> separated list of
 					either applicationmap item names or featuregroup names.</para>
 				</description>
-				<configOption name="^.*$" regex="true">
+				<configOption name="">
 					<synopsis>A custom feature to invoke during a bridged call</synopsis>
 					<description>
 						<para>Each item listed here is a comma-separated list of parameters that determine
@@ -272,7 +272,7 @@
 					DTMF sequence used to invoke an applicationmap item to be overridden with
 					a different sequence.</para>
 				</description>
-				<configOption name="^.*$" regex="true">
+				<configOption name="">
 					<synopsis>Applicationmap item to place in the feature group</synopsis>
 					<description>
 						<para>Each item here must be a name of an item in the applicationmap. The
@@ -578,24 +578,24 @@
 static struct aco_type global_option = {
 	.type = ACO_GLOBAL,
 	.name = "globals",
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 	.item_offset = offsetof(struct features_config, global),
 };
 
 static struct aco_type featuremap_option = {
 	.type = ACO_GLOBAL,
 	.name = "featuremap",
-	.category_match = ACO_WHITELIST,
-	.category = "^featuremap$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "featuremap",
 	.item_offset = offsetof(struct features_config, featuremap),
 };
 
 static struct aco_type applicationmap_option = {
 	.type = ACO_GLOBAL,
 	.name = "applicationmap",
-	.category_match = ACO_WHITELIST,
-	.category = "^applicationmap$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "applicationmap",
 	.item_offset = offsetof(struct features_config, applicationmap),
 };
 
@@ -1851,13 +1851,13 @@
 	aco_option_register_custom(&cfg_info, "automixmon", ACO_EXACT, featuremap_options,
 			DEFAULT_FEATUREMAP_AUTOMIXMON, featuremap_handler, 0);
 
-	aco_option_register_custom(&cfg_info, "^.*$", ACO_REGEX, applicationmap_options,
+	aco_option_register_custom(&cfg_info, "", ACO_PREFIX, applicationmap_options,
 			"", applicationmap_handler, 0);
 
-	aco_option_register_custom(&cfg_info, "^.*$", ACO_REGEX, featuregroup_options,
+	aco_option_register_custom(&cfg_info, "", ACO_PREFIX, featuregroup_options,
 			"", featuregroup_handler, 0);
 
-	aco_option_register_custom_nodoc(&cfg_info, "^.*$", ACO_REGEX, parkinglot_options,
+	aco_option_register_custom_nodoc(&cfg_info, "", ACO_PREFIX, parkinglot_options,
 			"", unsupported_handler, 0);
 
 	if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
diff --git a/main/named_acl.c b/main/named_acl.c
index 3b81c8c..47787e9 100644
--- a/main/named_acl.c
+++ b/main/named_acl.c
@@ -82,8 +82,8 @@
 static struct aco_type named_acl_type = {
 	.type = ACO_ITEM,                  /*!< named_acls are items stored in containers, not individual global objects */
 	.name = "named_acl",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",           /*!< Match everything but "general" */
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",           /*!< Match everything but "general" */
 	.item_alloc = named_acl_alloc,     /*!< A callback to allocate a new named_acl based on category */
 	.item_find = named_acl_find,       /*!< A callback to find a named_acl in some container of named_acls */
 	.item_offset = offsetof(struct named_acl_config, named_acl_list), /*!< Could leave this out since 0 */
diff --git a/main/stasis.c b/main/stasis.c
index 63d17df..d9785ce 100644
--- a/main/stasis.c
+++ b/main/stasis.c
@@ -1436,8 +1436,8 @@
 	.type = ACO_GLOBAL,
 	.name = "threadpool",
 	.item_offset = offsetof(struct stasis_config, threadpool_options),
-	.category = "^threadpool$",
-	.category_match = ACO_WHITELIST,
+	.category = "threadpool",
+	.category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *threadpool_options[] = ACO_TYPES(&threadpool_option);
@@ -1447,8 +1447,8 @@
 	.type = ACO_GLOBAL,
 	.name = "declined_message_types",
 	.item_offset = offsetof(struct stasis_config, declined_message_types),
-	.category_match = ACO_WHITELIST,
-	.category = "^declined_message_types$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "declined_message_types",
 };
 
 struct aco_type *declined_options[] = ACO_TYPES(&declined_option);
diff --git a/main/udptl.c b/main/udptl.c
index 44e9eb9..83989f7 100644
--- a/main/udptl.c
+++ b/main/udptl.c
@@ -239,9 +239,9 @@
 static struct aco_type general_option = {
 	.type = ACO_GLOBAL,
 	.name = "global",
-	.category_match = ACO_WHITELIST,
+	.category_match = ACO_WHITELIST_EXACT,
 	.item_offset = offsetof(struct udptl_config, general),
-	.category = "^general$",
+	.category = "general",
 };
 
 static struct aco_type *general_options[] = ACO_TYPES(&general_option);
diff --git a/res/ari/config.c b/res/ari/config.c
index 2d3a80d..275f41d 100644
--- a/res/ari/config.c
+++ b/res/ari/config.c
@@ -39,8 +39,8 @@
 	.type = ACO_GLOBAL,
 	.name = "general",
 	.item_offset = offsetof(struct ast_ari_conf, general),
-	.category = "^general$",
-	.category_match = ACO_WHITELIST,
+	.category = "general",
+	.category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *general_options[] = ACO_TYPES(&general_option);
@@ -156,8 +156,8 @@
 static struct aco_type user_option = {
 	.type = ACO_ITEM,
 	.name = "user",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.matchfield = "type",
 	.matchvalue = "user",
 	.item_alloc = user_alloc,
diff --git a/res/res_hep.c b/res/res_hep.c
index f3b65ad..5abf901 100644
--- a/res/res_hep.c
+++ b/res/res_hep.c
@@ -260,8 +260,8 @@
 	.type = ACO_GLOBAL,
 	.name = "general",
 	.item_offset = offsetof(struct module_config, general),
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
diff --git a/res/res_parking.c b/res/res_parking.c
index 593134b..ddf8012 100644
--- a/res/res_parking.c
+++ b/res/res_parking.c
@@ -291,8 +291,8 @@
 	.type = ACO_GLOBAL,
 	.name = "globals",
 	.item_offset = offsetof(struct parking_config, global),
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -300,8 +300,8 @@
 static struct aco_type parking_lot_type = {
 	.type = ACO_ITEM,
 	.name = "parking_lot",
-	.category_match = ACO_BLACKLIST,
-	.category = "^(general)$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.item_alloc = parking_lot_cfg_alloc,
 	.item_find = named_item_find,
 	.item_offset = offsetof(struct parking_config, parking_lots),
diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c
index 8258b38..fdc7ecf 100644
--- a/res/res_pjsip_notify.c
+++ b/res/res_pjsip_notify.c
@@ -82,7 +82,7 @@
 					order; any other header is treated as part of the SIP
 					request.</para>
 				</description>
-				<configOption name="^.*$">
+				<configOption name="">
 					<synopsis>A key/value pair to add to a NOTIFY request.</synopsis>
 					<description>
 						<para>If the key is <literal>Content</literal>,
@@ -234,8 +234,8 @@
 static struct aco_type notify_option = {
 	.type = ACO_ITEM,
 	.name = "notify",
-	.category_match = ACO_BLACKLIST,
-	.category = "^general$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.item_offset = offsetof(struct notify_cfg, notify_options),
 	.item_alloc = notify_option_alloc,
 	.item_find = notify_option_find
@@ -993,7 +993,7 @@
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
-	aco_option_register_custom(&notify_cfg, "^.*$", ACO_REGEX, notify_options,
+	aco_option_register_custom(&notify_cfg, "", ACO_PREFIX, notify_options,
 				   "", notify_option_handler, 0);
 
 	if (aco_process_config(&notify_cfg, 0)) {
diff --git a/res/res_statsd.c b/res/res_statsd.c
index b8e4d04..67166e8 100644
--- a/res/res_statsd.c
+++ b/res/res_statsd.c
@@ -233,8 +233,8 @@
 	.type = ACO_GLOBAL,
 	.name = "global",
 	.item_offset = offsetof(struct conf, global),
-	.category = "^general$",
-	.category_match = ACO_WHITELIST
+	.category = "general",
+	.category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *global_options[] = ACO_TYPES(&global_option);
diff --git a/res/res_xmpp.c b/res/res_xmpp.c
index 1b0ae42..41f8996 100644
--- a/res/res_xmpp.c
+++ b/res/res_xmpp.c
@@ -822,8 +822,8 @@
 	.type = ACO_GLOBAL,
 	.name = "global",
 	.item_offset = offsetof(struct xmpp_config, global),
-	.category_match = ACO_WHITELIST,
-	.category = "^general$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -831,8 +831,8 @@
 static struct aco_type client_option = {
 	.type = ACO_ITEM,
 	.name = "client",
-	.category_match = ACO_BLACKLIST,
-	.category = "^(general)$",
+	.category_match = ACO_BLACKLIST_EXACT,
+	.category = "general",
 	.item_alloc = ast_xmpp_client_config_alloc,
 	.item_find = xmpp_config_find,
 	.item_prelink = xmpp_config_prelink,
diff --git a/tests/test_config.c b/tests/test_config.c
index c58bdc7..a2ff328 100644
--- a/tests/test_config.c
+++ b/tests/test_config.c
@@ -1458,13 +1458,19 @@
 static struct aco_type global_defaults = {
 	.type = ACO_GLOBAL,
 	.item_offset = offsetof(struct test_config, global_defaults),
-	.category_match = ACO_WHITELIST,
-	.category = "^global_defaults$",
+	.category_match = ACO_WHITELIST_EXACT,
+	.category = "global_defaults",
 };
+static const char *item_blacklist[] = {
+	"global",
+	"global_defaults",
+	NULL,
+};
+
 static struct aco_type item = {
 	.type = ACO_ITEM,
-	.category_match = ACO_BLACKLIST,
-	.category = "^(global|global_defaults)$",
+	.category_match = ACO_BLACKLIST_ARRAY,
+	.category = (const char *)item_blacklist,
 	.item_alloc = test_item_alloc,
 	.item_find = test_item_find,
 	.item_offset = offsetof(struct test_config, items),

-- 
To view, visit https://gerrit.asterisk.org/7567
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-MessageType: merged
Gerrit-Change-Id: Ib5ed478218d8a661ace4d2eaaea98b59a897974b
Gerrit-Change-Number: 7567
Gerrit-PatchSet: 2
Gerrit-Owner: Corey Farrell <git at cfware.com>
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Jenkins2
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20171218/9e34b81f/attachment-0001.html>


More information about the asterisk-code-review mailing list