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
This commit is contained in:
duerst 2018-11-27 11:04:02 +00:00
parent 231930ca7d
commit 9e2455b756

View File

@ -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);
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");
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);
if (r != 0) goto err;
r = create_property_node(&np2, env, "Grapheme_Cluster_Break=LVT");
if (r != 0) goto err;
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);