diff options
author | duerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-27 11:04:02 +0000 |
---|---|---|
committer | duerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-27 11:04:02 +0000 |
commit | 9e2455b7568e6f562c9acb7071532f2cd504d48c (patch) | |
tree | 9874bf2050905bff4f20c442e21adcac483dcc9c /regparse.c | |
parent | 231930ca7dc1eb1f9d8bba8a01872becc9fa92fa (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.c | 50 |
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); |