summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <public@khwilliamson.com>2011-02-27 14:04:26 -0700
committerKarl Williamson <public@khwilliamson.com>2011-02-27 19:21:32 -0700
commit2c6aa59398a9d39f981ea691c06f8b98ad60b54f (patch)
tree3c0da19867ce36f326a1d8813efd202b963332fb
parent1d791ab2d32bd22ff8566e9d86204da48e96a040 (diff)
downloadperl-2c6aa59398a9d39f981ea691c06f8b98ad60b54f.tar.gz
regcomp.c: Add parameters to fcns
A pointer to the list of multi-char folds in an ANYOF node is now passed to the routines that set the bit map. This is in preparation for those routines to add to the list
-rw-r--r--embed.fnc4
-rw-r--r--embed.h4
-rw-r--r--proto.h14
-rw-r--r--regcomp.c46
4 files changed, 35 insertions, 33 deletions
diff --git a/embed.fnc b/embed.fnc
index eb915efc61..6f4f8fe403 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -979,8 +979,8 @@ Ap |SV* |regclass_swash |NULLOK const regexp *prog \
|NN const struct regnode *node|bool doinit \
|NULLOK SV **listsvp|NULLOK SV **altsvp
#ifdef PERL_IN_REGCOMP_C
-EMi |U8 |set_regclass_bit|NN struct RExC_state_t* pRExC_state|NN regnode* node|const U8 value|NN HV** nonbitmap_ptr
-EMs |U8 |set_regclass_bit_fold|NN struct RExC_state_t *pRExC_state|NN regnode* node|const U8 value|NN HV** nonbitmap_ptr
+EMi |U8 |set_regclass_bit|NN struct RExC_state_t* pRExC_state|NN regnode* node|const U8 value|NN HV** invlist_ptr|NN AV** alternate_ptr
+EMs |U8 |set_regclass_bit_fold|NN struct RExC_state_t *pRExC_state|NN regnode* node|const U8 value|NN HV** invlist_ptr|NN AV** alternate_ptr
EMs |void |add_alternate |NN AV** alternate_ptr|NN U8* string|STRLEN len
#endif
Ap |I32 |pregexec |NN REGEXP * const prog|NN char* stringarg \
diff --git a/embed.h b/embed.h
index d334542dfb..573657e59c 100644
--- a/embed.h
+++ b/embed.h
@@ -909,8 +909,8 @@
#define reguni(a,b,c) S_reguni(aTHX_ a,b,c)
#define regwhite S_regwhite
#define scan_commit(a,b,c,d) S_scan_commit(aTHX_ a,b,c,d)
-#define set_regclass_bit(a,b,c,d) S_set_regclass_bit(aTHX_ a,b,c,d)
-#define set_regclass_bit_fold(a,b,c,d) S_set_regclass_bit_fold(aTHX_ a,b,c,d)
+#define set_regclass_bit(a,b,c,d,e) S_set_regclass_bit(aTHX_ a,b,c,d,e)
+#define set_regclass_bit_fold(a,b,c,d,e) S_set_regclass_bit_fold(aTHX_ a,b,c,d,e)
#define study_chunk(a,b,c,d,e,f,g,h,i,j,k) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k)
# endif
# if defined(PERL_IN_REGEXEC_C)
diff --git a/proto.h b/proto.h
index 92e1ad3732..b9159771a2 100644
--- a/proto.h
+++ b/proto.h
@@ -6210,19 +6210,21 @@ STATIC void S_scan_commit(pTHX_ const struct RExC_state_t *pRExC_state, struct s
#define PERL_ARGS_ASSERT_SCAN_COMMIT \
assert(pRExC_state); assert(data); assert(minlenp)
-PERL_STATIC_INLINE U8 S_set_regclass_bit(pTHX_ struct RExC_state_t* pRExC_state, regnode* node, const U8 value, HV** nonbitmap_ptr)
+PERL_STATIC_INLINE U8 S_set_regclass_bit(pTHX_ struct RExC_state_t* pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
__attribute__nonnull__(pTHX_1)
__attribute__nonnull__(pTHX_2)
- __attribute__nonnull__(pTHX_4);
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
#define PERL_ARGS_ASSERT_SET_REGCLASS_BIT \
- assert(pRExC_state); assert(node); assert(nonbitmap_ptr)
+ assert(pRExC_state); assert(node); assert(invlist_ptr); assert(alternate_ptr)
-STATIC U8 S_set_regclass_bit_fold(pTHX_ struct RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** nonbitmap_ptr)
+STATIC U8 S_set_regclass_bit_fold(pTHX_ struct RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
__attribute__nonnull__(pTHX_1)
__attribute__nonnull__(pTHX_2)
- __attribute__nonnull__(pTHX_4);
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
#define PERL_ARGS_ASSERT_SET_REGCLASS_BIT_FOLD \
- assert(pRExC_state); assert(node); assert(nonbitmap_ptr)
+ assert(pRExC_state); assert(node); assert(invlist_ptr); assert(alternate_ptr)
STATIC I32 S_study_chunk(pTHX_ struct RExC_state_t *pRExC_state, regnode **scanp, I32 *minlenp, I32 *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U8* recursed, struct regnode_charclass_class *and_withp, U32 flags, U32 depth)
__attribute__nonnull__(pTHX_1)
diff --git a/regcomp.c b/regcomp.c
index a737ebe0f5..0c969faa2e 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -9123,14 +9123,14 @@ S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
ANYOF_##NAME: \
for (value = 0; value < 256; value++) \
if (TEST) \
- stored += set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap); \
+ stored += set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate); \
yesno = '+'; \
what = WORD; \
break; \
case ANYOF_N##NAME: \
for (value = 0; value < 256; value++) \
if (!TEST) \
- stored += set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap); \
+ stored += set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate); \
yesno = '!'; \
what = WORD; \
break
@@ -9145,14 +9145,14 @@ ANYOF_##NAME: \
else if (UNI_SEMANTICS) { \
for (value = 0; value < 256; value++) { \
if (TEST_8(value)) stored += \
- set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap); \
+ set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate); \
} \
} \
else { \
for (value = 0; value < 128; value++) { \
if (TEST_7(UNI_TO_NATIVE(value))) stored += \
set_regclass_bit(pRExC_state, ret, \
- (U8) UNI_TO_NATIVE(value), &nonbitmap); \
+ (U8) UNI_TO_NATIVE(value), &nonbitmap, &unicode_alternate); \
} \
} \
yesno = '+'; \
@@ -9163,18 +9163,18 @@ case ANYOF_N##NAME: \
else if (UNI_SEMANTICS) { \
for (value = 0; value < 256; value++) { \
if (! TEST_8(value)) stored += \
- set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap); \
+ set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate); \
} \
} \
else { \
for (value = 0; value < 128; value++) { \
if (! TEST_7(UNI_TO_NATIVE(value))) stored += set_regclass_bit( \
- pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &nonbitmap); \
+ pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &nonbitmap, &unicode_alternate); \
} \
if (AT_LEAST_ASCII_RESTRICTED) { \
for (value = 128; value < 256; value++) { \
stored += set_regclass_bit( \
- pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &nonbitmap); \
+ pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &nonbitmap, &unicode_alternate); \
} \
ANYOF_FLAGS(ret) |= ANYOF_UNICODE_ALL; \
} \
@@ -9208,7 +9208,7 @@ case ANYOF_N##NAME: \
#endif
STATIC U8
-S_set_regclass_bit_fold(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** nonbitmap_ptr)
+S_set_regclass_bit_fold(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
{
/* Handle the setting of folds in the bitmap for non-locale ANYOF nodes.
@@ -9245,7 +9245,7 @@ S_set_regclass_bit_fold(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8
and they have a fold, they should match if the target is utf8, and
not otherwise. We add the character here, and calculate the fold
later, with the other nonbitmap folds */
- *nonbitmap_ptr = add_range_to_invlist(*nonbitmap_ptr, value, value);
+ *invlist_ptr = add_range_to_invlist(*invlist_ptr, value, value);
}
return stored;
@@ -9253,7 +9253,7 @@ S_set_regclass_bit_fold(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8
PERL_STATIC_INLINE U8
-S_set_regclass_bit(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** nonbitmap_ptr)
+S_set_regclass_bit(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
{
/* This inline function sets a bit in the bitmap if not already set, and if
* appropriate, its fold, returning the number of bits that actually
@@ -9271,7 +9271,7 @@ S_set_regclass_bit(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 valu
stored = 1;
if (FOLD && ! LOC) { /* Locale folds aren't known until runtime */
- stored += set_regclass_bit_fold(pRExC_state, node, value, nonbitmap_ptr);
+ stored += set_regclass_bit_fold(pRExC_state, node, value, invlist_ptr, alternate_ptr);
}
return stored;
@@ -9623,10 +9623,10 @@ parseit:
w, w, rangebegin);
stored +=
- set_regclass_bit(pRExC_state, ret, '-', &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, '-', &nonbitmap, &unicode_alternate);
if (prevvalue < 256) {
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) prevvalue, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) prevvalue, &nonbitmap, &unicode_alternate);
}
else {
nonbitmap = add_cp_to_invlist(nonbitmap, prevvalue);
@@ -9676,7 +9676,7 @@ parseit:
else {
for (value = 0; value < 128; value++)
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &nonbitmap, &unicode_alternate);
}
yesno = '+';
what = NULL; /* Doesn't match outside ascii, so
@@ -9688,7 +9688,7 @@ parseit:
else {
for (value = 128; value < 256; value++)
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &nonbitmap, &unicode_alternate);
}
ANYOF_FLAGS(ret) |= ANYOF_UNICODE_ALL;
yesno = '!';
@@ -9701,7 +9701,7 @@ parseit:
/* consecutive digits assumed */
for (value = '0'; value <= '9'; value++)
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate);
}
yesno = '+';
what = POSIX_CC_UNI_NAME("Digit");
@@ -9713,10 +9713,10 @@ parseit:
/* consecutive digits assumed */
for (value = 0; value < '0'; value++)
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate);
for (value = '9' + 1; value < 256; value++)
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) value, &nonbitmap, &unicode_alternate);
}
yesno = '!';
what = POSIX_CC_UNI_NAME("Digit");
@@ -9765,7 +9765,7 @@ parseit:
}
if (!SIZE_ONLY)
stored +=
- set_regclass_bit(pRExC_state, ret, '-', &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, '-', &nonbitmap, &unicode_alternate);
} else
range = 1; /* yeah, it's a range! */
continue; /* but do it the next time */
@@ -9794,20 +9794,20 @@ parseit:
for (i = prevvalue; i <= ceilvalue; i++)
if (isLOWER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap, &unicode_alternate);
}
} else {
for (i = prevvalue; i <= ceilvalue; i++)
if (isUPPER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
stored +=
- set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap);
+ set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap, &unicode_alternate);
}
}
}
else
#endif
for (i = prevvalue; i <= ceilvalue; i++) {
- stored += set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap);
+ stored += set_regclass_bit(pRExC_state, ret, (U8) i, &nonbitmap, &unicode_alternate);
}
}
if (value > 255) {
@@ -10077,7 +10077,7 @@ parseit:
}
if (c < 256 && AT_LEAST_UNI_SEMANTICS) {
- stored += set_regclass_bit(pRExC_state, ret, (U8) c, &nonbitmap);
+ stored += set_regclass_bit(pRExC_state, ret, (U8) c, &nonbitmap, &unicode_alternate);
}
/* It may be that the code point is already
* in this range or already in the bitmap,