mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* string.c: New static function rb_str_ascii_casemap; special-casing
:ascii option in rb_str_upcase_bang and rb_str_downcase_bang. * regenc.c: Fix a bug (wrong use of unnecessary slack at end of string). * regenc.h -> include/ruby/oniguruma.h: Move declaration of onigenc_ascii_only_case_map so that it is visible in string.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55329 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
404d6e9f38
commit
f0fc6ec872
5 changed files with 51 additions and 12 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
Wed Jun 8 21:28:36 2016 Martin Duerst <duerst@it.aoyama.ac.jp>
|
||||||
|
|
||||||
|
* string.c: New static function rb_str_ascii_casemap; special-casing
|
||||||
|
:ascii option in rb_str_upcase_bang and rb_str_downcase_bang.
|
||||||
|
|
||||||
|
* regenc.c: Fix a bug (wrong use of unnecessary slack at end of string).
|
||||||
|
|
||||||
|
* regenc.h -> include/ruby/oniguruma.h: Move declaration of
|
||||||
|
onigenc_ascii_only_case_map so that it is visible in string.c.
|
||||||
|
|
||||||
Wed Jun 8 20:33:44 2016 Naohisa Goto <ngotogenome@gmail.com>
|
Wed Jun 8 20:33:44 2016 Naohisa Goto <ngotogenome@gmail.com>
|
||||||
|
|
||||||
* include/ruby/intern.h: Remove excess semicolons in PUREFUNC().
|
* include/ruby/intern.h: Remove excess semicolons in PUREFUNC().
|
||||||
|
|
|
@ -229,6 +229,14 @@ ONIG_EXTERN const OnigEncodingType OnigEncodingASCII;
|
||||||
|
|
||||||
#define ONIG_ENCODING_UNDEF ((OnigEncoding )0)
|
#define ONIG_ENCODING_UNDEF ((OnigEncoding )0)
|
||||||
|
|
||||||
|
#ifdef ONIG_CASE_MAPPING
|
||||||
|
/* this declaration needs to be here because it is used in string.c */
|
||||||
|
ONIG_EXTERN int onigenc_ascii_only_case_map P_((OnigCaseFoldType* flagP,
|
||||||
|
const OnigUChar** pp, const OnigUChar* end,
|
||||||
|
OnigUChar* to, OnigUChar* to_end,
|
||||||
|
const struct OnigEncodingTypeST* enc));
|
||||||
|
#endif /* ONIG_CASE_MAPPING */
|
||||||
|
|
||||||
|
|
||||||
/* work size */
|
/* work size */
|
||||||
#define ONIGENC_CODE_TO_MBC_MAXLEN 7
|
#define ONIGENC_CODE_TO_MBC_MAXLEN 7
|
||||||
|
|
4
regenc.c
4
regenc.c
|
@ -968,9 +968,7 @@ onigenc_ascii_only_case_map (OnigCaseFoldType* flagP, const OnigUChar** pp, cons
|
||||||
OnigCaseFoldType flags = *flagP;
|
OnigCaseFoldType flags = *flagP;
|
||||||
int codepoint_length;
|
int codepoint_length;
|
||||||
|
|
||||||
to_end -= 4; /* longest possible length of a single character */
|
while (*pp<end && to<to_end) {
|
||||||
|
|
||||||
while (*pp<end && to<=to_end) {
|
|
||||||
codepoint_length = ONIGENC_PRECISE_MBC_ENC_LEN(enc, *pp, end);
|
codepoint_length = ONIGENC_PRECISE_MBC_ENC_LEN(enc, *pp, end);
|
||||||
if (codepoint_length < 0)
|
if (codepoint_length < 0)
|
||||||
return codepoint_length; /* encoding invalid */
|
return codepoint_length; /* encoding invalid */
|
||||||
|
|
1
regenc.h
1
regenc.h
|
@ -133,7 +133,6 @@ CONSTFUNC(ONIG_EXTERN int onigenc_not_support_get_ctype_code_range P_((OnigCtype
|
||||||
PUREFUNC(ONIG_EXTERN int onigenc_is_mbc_newline_0x0a P_((const UChar* p, const UChar* end, OnigEncoding enc)));
|
PUREFUNC(ONIG_EXTERN int onigenc_is_mbc_newline_0x0a P_((const UChar* p, const UChar* end, OnigEncoding enc)));
|
||||||
|
|
||||||
#ifdef ONIG_CASE_MAPPING
|
#ifdef ONIG_CASE_MAPPING
|
||||||
ONIG_EXTERN int onigenc_ascii_only_case_map P_((OnigCaseFoldType* flagP, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, OnigUChar* to_end, const struct OnigEncodingTypeST* enc));
|
|
||||||
ONIG_EXTERN int onigenc_single_byte_ascii_only_case_map P_((OnigCaseFoldType* flagP, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, OnigUChar* to_end, const struct OnigEncodingTypeST* enc));
|
ONIG_EXTERN int onigenc_single_byte_ascii_only_case_map P_((OnigCaseFoldType* flagP, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, OnigUChar* to_end, const struct OnigEncodingTypeST* enc));
|
||||||
#endif /* ONIG_CASE_MAPPING */
|
#endif /* ONIG_CASE_MAPPING */
|
||||||
|
|
||||||
|
|
40
string.c
40
string.c
|
@ -5833,6 +5833,29 @@ rb_str_casemap(VALUE source, OnigCaseFoldType *flags, rb_encoding *enc)
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rb_str_ascii_casemap(VALUE source, OnigCaseFoldType *flags, rb_encoding *enc)
|
||||||
|
{
|
||||||
|
OnigUChar *source_current, *source_end;
|
||||||
|
int old_length = RSTRING_LEN(source);
|
||||||
|
int length_or_invalid;
|
||||||
|
|
||||||
|
if (old_length == 0) return;
|
||||||
|
|
||||||
|
source_current = (OnigUChar*)RSTRING_PTR(source);
|
||||||
|
source_end = (OnigUChar*)RSTRING_END(source);
|
||||||
|
|
||||||
|
length_or_invalid = onigenc_ascii_only_case_map(flags,
|
||||||
|
(const OnigUChar**)&source_current, source_end,
|
||||||
|
source_current, source_end, enc);
|
||||||
|
if (length_or_invalid < 0)
|
||||||
|
rb_raise(rb_eArgError, "input string invalid");
|
||||||
|
/* if (length_or_invalid != old_length)
|
||||||
|
printf("problem with rb_str_ascii_casemap; old_length=%d, new_length=%d\n", old_length, length_or_invalid),
|
||||||
|
rb_raise(rb_eArgError, "internal problem with rb_str_ascii_casemap");
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* str.upcase! -> str or nil
|
* str.upcase! -> str or nil
|
||||||
|
@ -5855,7 +5878,8 @@ rb_str_upcase_bang(int argc, VALUE *argv, VALUE str)
|
||||||
str_modify_keep_cr(str);
|
str_modify_keep_cr(str);
|
||||||
enc = STR_ENC_GET(str);
|
enc = STR_ENC_GET(str);
|
||||||
rb_str_check_dummy_enc(enc);
|
rb_str_check_dummy_enc(enc);
|
||||||
if (!(flags&ONIGENC_CASE_FOLD_TURKISH_AZERI) && ENC_CODERANGE(str)==ENC_CODERANGE_7BIT) {
|
if ((flags&ONIGENC_CASE_ASCII_ONLY) && (enc==rb_utf8_encoding() || rb_enc_mbmaxlen(enc)==1)
|
||||||
|
|| (!(flags&ONIGENC_CASE_FOLD_TURKISH_AZERI) && ENC_CODERANGE(str)==ENC_CODERANGE_7BIT)) {
|
||||||
char *s = RSTRING_PTR(str), *send = RSTRING_END(str);
|
char *s = RSTRING_PTR(str), *send = RSTRING_END(str);
|
||||||
|
|
||||||
while (s < send) {
|
while (s < send) {
|
||||||
|
@ -5914,14 +5938,14 @@ static VALUE
|
||||||
rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
|
rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
|
||||||
{
|
{
|
||||||
rb_encoding *enc;
|
rb_encoding *enc;
|
||||||
int modify = 0;
|
|
||||||
OnigCaseFoldType flags = ONIGENC_CASE_DOWNCASE;
|
OnigCaseFoldType flags = ONIGENC_CASE_DOWNCASE;
|
||||||
|
|
||||||
flags = check_case_options(argc, argv, flags);
|
flags = check_case_options(argc, argv, flags);
|
||||||
str_modify_keep_cr(str);
|
str_modify_keep_cr(str);
|
||||||
enc = STR_ENC_GET(str);
|
enc = STR_ENC_GET(str);
|
||||||
rb_str_check_dummy_enc(enc);
|
rb_str_check_dummy_enc(enc);
|
||||||
if (!(flags&ONIGENC_CASE_FOLD_TURKISH_AZERI) && ENC_CODERANGE(str)==ENC_CODERANGE_7BIT) {
|
if ((flags&ONIGENC_CASE_ASCII_ONLY) && (enc==rb_utf8_encoding() || rb_enc_mbmaxlen(enc)==1)
|
||||||
|
|| (!(flags&ONIGENC_CASE_FOLD_TURKISH_AZERI) && ENC_CODERANGE(str)==ENC_CODERANGE_7BIT)) {
|
||||||
char *s = RSTRING_PTR(str), *send = RSTRING_END(str);
|
char *s = RSTRING_PTR(str), *send = RSTRING_END(str);
|
||||||
|
|
||||||
while (s < send) {
|
while (s < send) {
|
||||||
|
@ -5929,17 +5953,17 @@ rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
|
||||||
|
|
||||||
if (rb_enc_isascii(c, enc) && 'A' <= c && c <= 'Z') {
|
if (rb_enc_isascii(c, enc) && 'A' <= c && c <= 'Z') {
|
||||||
*s = 'a' + (c - 'A');
|
*s = 'a' + (c - 'A');
|
||||||
modify = 1;
|
flags |= ONIGENC_CASE_MODIFIED;
|
||||||
}
|
}
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else if (flags&ONIGENC_CASE_ASCII_ONLY)
|
||||||
|
rb_str_ascii_casemap(str, &flags, enc);
|
||||||
|
else
|
||||||
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
|
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
|
||||||
modify = ONIGENC_CASE_MODIFIED & flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modify) return str;
|
if (ONIGENC_CASE_MODIFIED&flags) return str;
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue