summaryrefslogtreecommitdiff
path: root/regparse.c
diff options
context:
space:
mode:
authorduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-27 11:04:02 +0000
committerduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-27 11:04:02 +0000
commit9e2455b7568e6f562c9acb7071532f2cd504d48c (patch)
tree9874bf2050905bff4f20c442e21adcac483dcc9c /regparse.c
parent231930ca7dc1eb1f9d8bba8a01872becc9fa92fa (diff)
introduce helper function create_sequence_node()
The new function create_sequence_node() uses its second argument (an array of Node*, from left to right, ending with NULL_NODE) to create a sequence of expressions using node_new_list(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66033 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regparse.c')
-rw-r--r--regparse.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/regparse.c b/regparse.c
index fb9f0d43be..2eb17464ea 100644
--- a/regparse.c
+++ b/regparse.c
@@ -5759,11 +5759,32 @@ quantify_property_node(Node **np, ScanEnv* env, const char* propname, int lower,
return quantify_node(np, lower, upper);
}
+/* IMPORTANT: Make sure node_array ends with NULL_NODE */
+static int
+create_sequence_node(Node **np, Node **node_array)
+{
+ Node* tmp = NULL_NODE;
+ int i = 0;
+
+ while (node_array[i] != NULL_NODE) i++;
+ while (--i >= 0) {
+ *np = node_new_list(node_array[i], tmp);
+ if (IS_NULL(*np)) {
+ onig_node_free(tmp);
+ return ONIGERR_MEMORY;
+ }
+ tmp = *np;
+ }
+ return 0;
+}
+
static int
node_extended_grapheme_cluster(Node** np, ScanEnv* env)
{
Node* tmp = NULL;
Node* np1 = NULL;
+ Node* np2 = NULL;
+ Node* np3 = NULL;
Node* list = NULL;
Node* list2 = NULL;
Node* alt = NULL;
@@ -5876,29 +5897,18 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
np1 = NULL;
/* L* LVT T* */
- r = quantify_property_node(&np1, env, "Grapheme_Cluster_Break=T", 0, REPEAT_INFINITE);
+ r = quantify_property_node(&np1, env, "Grapheme_Cluster_Break=L", 0, REPEAT_INFINITE);
if (r != 0) goto err;
-
- tmp = node_new_list(np1, NULL_NODE);
- if (IS_NULL(tmp)) goto err;
- list2 = tmp;
- np1 = NULL;
-
- r = create_property_node(&np1, env, "Grapheme_Cluster_Break=LVT");
+ r = create_property_node(&np2, env, "Grapheme_Cluster_Break=LVT");
if (r != 0) goto err;
-
- tmp = node_new_list(np1, list2);
- if (IS_NULL(tmp)) goto err;
- list2 = tmp;
- np1 = NULL;
-
- r = quantify_property_node(&np1, env, "Grapheme_Cluster_Break=L", 0, REPEAT_INFINITE);
+ r = quantify_property_node(&np3, env, "Grapheme_Cluster_Break=T", 0, REPEAT_INFINITE);
if (r != 0) goto err;
- tmp = node_new_list(np1, list2);
- if (IS_NULL(tmp)) goto err;
- list2 = tmp;
- np1 = NULL;
+ { /* poor man's varargs :-) */
+ Node* sequence[] = { np1, np2, np3, NULL_NODE };
+ create_sequence_node(&list2, sequence);
+ np1 = np2 = np3 = NULL;
+ }
tmp = onig_node_new_alt(list2, alt);
if (IS_NULL(tmp)) goto err;
@@ -6321,6 +6331,8 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
err:
onig_node_free(np1);
+ onig_node_free(np2);
+ onig_node_free(np3);
onig_node_free(list);
onig_node_free(list2);
onig_node_free(alt);