Skip to content

Commit 456a696

Browse files
committed
remove code duplication and streamline identifiers
In regparse.c: * Reduce coode duplication by merging the almost identical functions create_sequence_node and create_alternate_node into a new function create_node_from_array, adding a parameter that distinguishes between creating a list and creating an alternative. * Streamline variable/function naming. Unicode UAX #29 uses 'sequence', but the regular expression library uses 'list' for the same concept. Keep 'sequence' in the ccmments that are taken from UAX #29, but use 'list' in variable names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66234 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent ce37214 commit 456a696

File tree

1 file changed

+37
-58
lines changed

1 file changed

+37
-58
lines changed

regparse.c

Lines changed: 37 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5765,41 +5765,20 @@ quantify_property_node(Node **np, ScanEnv* env, const char* propname, char repet
57655765
return quantify_node(np, lower, upper);
57665766
}
57675767

5768-
/* IMPORTANT: Make sure node_array ends with NULL_NODE */
5769-
static int
5770-
create_sequence_node(Node **np, Node **node_array)
5771-
{
5772-
Node* tmp = NULL_NODE;
5773-
int i = 0;
5774-
5775-
while (node_array[i] != NULL_NODE) i++;
5776-
while (--i >= 0) {
5777-
*np = node_new_list(node_array[i], tmp);
5778-
if (IS_NULL(*np)) {
5779-
while (i >= 0) {
5780-
onig_node_free(node_array[i]);
5781-
node_array[i--] = NULL_NODE;
5782-
}
5783-
onig_node_free(tmp);
5784-
return ONIGERR_MEMORY;
5785-
}
5786-
else
5787-
node_array[i] = NULL_NODE;
5788-
tmp = *np;
5789-
}
5790-
return 0;
5791-
}
5768+
#define LIST 0
5769+
#define ALT 1
57925770

57935771
/* IMPORTANT: Make sure node_array ends with NULL_NODE */
57945772
static int
5795-
create_alternate_node(Node **np, Node **node_array)
5773+
create_node_from_array(int kind, Node **np, Node **node_array)
57965774
{
57975775
Node* tmp = NULL_NODE;
57985776
int i = 0;
57995777

58005778
while (node_array[i] != NULL_NODE) i++;
58015779
while (--i >= 0) {
5802-
*np = onig_node_new_alt(node_array[i], tmp);
5780+
*np = kind==LIST ? node_new_list(node_array[i], tmp)
5781+
: onig_node_new_alt(node_array[i], tmp);
58035782
if (IS_NULL(*np)) {
58045783
while (i >= 0) {
58055784
onig_node_free(node_array[i]);
@@ -5869,10 +5848,10 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
58695848

58705849
/* precore* core postcore* */
58715850
{
5872-
Node *seq[4];
5851+
Node *list[4];
58735852

58745853
/* precore*; precore := Prepend */
5875-
R_ERR(quantify_property_node(seq+0, env, "Grapheme_Cluster_Break=Prepend", '*'));
5854+
R_ERR(quantify_property_node(list+0, env, "Grapheme_Cluster_Break=Prepend", '*'));
58765855

58775856
/* core := hangul-syllable
58785857
* | ri-sequence
@@ -5890,9 +5869,9 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
58905869

58915870
/* L* (V+ | LV V* | LVT) T* */
58925871
{
5893-
Node *H_seq[4];
5872+
Node *H_list[4];
58945873

5895-
R_ERR(quantify_property_node(H_seq+0, env, "Grapheme_Cluster_Break=L", '*'));
5874+
R_ERR(quantify_property_node(H_list+0, env, "Grapheme_Cluster_Break=L", '*'));
58965875

58975876
/* V+ | LV V* | LVT */
58985877
{
@@ -5902,25 +5881,25 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
59025881

59035882
/* LV V* */
59045883
{
5905-
Node *H_seq2[3];
5884+
Node *H_list2[3];
59065885

5907-
R_ERR(create_property_node(H_seq2+0, env, "Grapheme_Cluster_Break=LV"));
5908-
R_ERR(quantify_property_node(H_seq2+1, env, "Grapheme_Cluster_Break=V", '*'));
5886+
R_ERR(create_property_node(H_list2+0, env, "Grapheme_Cluster_Break=LV"));
5887+
R_ERR(quantify_property_node(H_list2+1, env, "Grapheme_Cluster_Break=V", '*'));
59095888

5910-
H_seq2[2] = NULL_NODE;
5911-
R_ERR(create_sequence_node(H_alt2+1, H_seq2));
5889+
H_list2[2] = NULL_NODE;
5890+
R_ERR(create_node_from_array(LIST, H_alt2+1, H_list2));
59125891
}
59135892

59145893
R_ERR(create_property_node(H_alt2+2, env, "Grapheme_Cluster_Break=LVT"));
59155894

59165895
H_alt2[3] = NULL_NODE;
5917-
R_ERR(create_alternate_node(H_seq+1, H_alt2));
5896+
R_ERR(create_node_from_array(ALT, H_list+1, H_alt2));
59185897
}
59195898

5920-
R_ERR(quantify_property_node(H_seq+2, env, "Grapheme_Cluster_Break=T", '*'));
5899+
R_ERR(quantify_property_node(H_list+2, env, "Grapheme_Cluster_Break=T", '*'));
59215900

5922-
H_seq[3] = NULL_NODE;
5923-
R_ERR(create_sequence_node(core_alts+0, H_seq));
5901+
H_list[3] = NULL_NODE;
5902+
R_ERR(create_node_from_array(LIST, core_alts+0, H_list));
59245903
}
59255904

59265905
/* L+ */
@@ -5935,31 +5914,31 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
59355914

59365915
/* xpicto-sequence := \p{Extended_Pictographic} (Extend* ZWJ \p{Extended_Pictographic})* */
59375916
{
5938-
Node *XP_seq[3];
5917+
Node *XP_list[3];
59395918

5940-
R_ERR(create_property_node(XP_seq+0, env, "Extended_Pictographic"));
5919+
R_ERR(create_property_node(XP_list+0, env, "Extended_Pictographic"));
59415920

59425921
/* (Extend* ZWJ \p{Extended_Pictographic})* */
59435922
{
5944-
Node *Ex_seq[4];
5923+
Node *Ex_list[4];
59455924

5946-
R_ERR(quantify_property_node(Ex_seq+0, env, "Grapheme_Cluster_Break=Extend", '*'));
5925+
R_ERR(quantify_property_node(Ex_list+0, env, "Grapheme_Cluster_Break=Extend", '*'));
59475926

59485927
/* ZWJ (ZERO WIDTH JOINER) */
59495928
r = ONIGENC_CODE_TO_MBC(env->enc, 0x200D, buf);
59505929
if (r < 0) goto err;
5951-
Ex_seq[1] = node_new_str_raw(buf, buf + r);
5952-
if (IS_NULL(Ex_seq[1])) goto err;
5930+
Ex_list[1] = node_new_str_raw(buf, buf + r);
5931+
if (IS_NULL(Ex_list[1])) goto err;
59535932

5954-
R_ERR(create_property_node(Ex_seq+2, env, "Extended_Pictographic"));
5933+
R_ERR(create_property_node(Ex_list+2, env, "Extended_Pictographic"));
59555934

5956-
Ex_seq[3] = NULL_NODE;
5957-
R_ERR(create_sequence_node(XP_seq+1, Ex_seq));
5935+
Ex_list[3] = NULL_NODE;
5936+
R_ERR(create_node_from_array(LIST, XP_list+1, Ex_list));
59585937
}
5959-
R_ERR(quantify_node(XP_seq+1, 0, REPEAT_INFINITE)); /* TODO: Check about node freeing */
5938+
R_ERR(quantify_node(XP_list+1, 0, REPEAT_INFINITE)); /* TODO: Check about node freeing */
59605939

5961-
XP_seq[2] = NULL_NODE;
5962-
R_ERR(create_sequence_node(core_alts+4, XP_seq));
5940+
XP_list[2] = NULL_NODE;
5941+
R_ERR(create_node_from_array(LIST, core_alts+4, XP_list));
59635942
}
59645943

59655944
/* [^Control CR LF] */
@@ -5984,18 +5963,18 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
59845963
}
59855964

59865965
core_alts[6] = NULL_NODE;
5987-
R_ERR(create_alternate_node(seq+1, core_alts));
5966+
R_ERR(create_node_from_array(ALT, list+1, core_alts));
59885967
}
59895968

59905969
/* postcore*; postcore = [Extend ZWJ SpacingMark] */
5991-
R_ERR(create_property_node(seq+2, env, "Grapheme_Cluster_Break=Extend"));
5992-
cc = NCCLASS(seq[2]);
5970+
R_ERR(create_property_node(list+2, env, "Grapheme_Cluster_Break=Extend"));
5971+
cc = NCCLASS(list[2]);
59935972
R_ERR(add_property_to_cc(cc, "Grapheme_Cluster_Break=SpacingMark", 0, env));
59945973
R_ERR(add_code_range(&(cc->mbuf), env, 0x200D, 0x200D));
5995-
R_ERR(quantify_node(seq+2, 0, REPEAT_INFINITE));
5974+
R_ERR(quantify_node(list+2, 0, REPEAT_INFINITE));
59965975

5997-
seq[3] = NULL_NODE;
5998-
R_ERR(create_sequence_node(alts+1, seq));
5976+
list[3] = NULL_NODE;
5977+
R_ERR(create_node_from_array(LIST, alts+1, list));
59995978
}
60005979

60015980
/* PerlSyntax: (?s:.), RubySyntax: (?m:.) */
@@ -6012,7 +5991,7 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env)
60125991
alts[2] = tmp;
60135992

60145993
alts[3] = NULL_NODE;
6015-
R_ERR(create_alternate_node(&top_alt, alts));
5994+
R_ERR(create_node_from_array(ALT, &top_alt, alts));
60165995
}
60175996
}
60185997
else

0 commit comments

Comments
 (0)