summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/string.c b/string.c
index e48c7fe021..581c300281 100644
--- a/string.c
+++ b/string.c
@@ -29,14 +29,6 @@
#include <unistd.h>
#endif
-#define ENC_REPLICATE(name, orig)
-#define ENC_ALIAS(name, orig)
-#define ENC_DUMMY(name)
-#define ENC_DEFINE(name)
-#define ENC_SET_BASE(name, orig)
-#define ENC_DUMMY_UNICODE(name)
-#include <encdb.h>
-
#define STRING_ENUMERATORS_WANTARRAY 0 /* next major */
#undef rb_str_new_cstr
@@ -4479,14 +4471,16 @@ VALUE
rb_str_inspect(VALUE str)
{
rb_encoding *enc = STR_ENC_GET(str);
- int encidx = rb_enc_to_index(enc);
const char *p, *pend, *prev;
char buf[CHAR_ESC_LEN + 1];
VALUE result = rb_str_buf_new(0);
rb_encoding *resenc = rb_default_internal_encoding();
int unicode_p = rb_enc_unicode_p(enc);
int asciicompat = rb_enc_asciicompat(enc);
+ static rb_encoding *utf16, *utf32;
+ if (!utf16) utf16 = rb_enc_find("UTF-16");
+ if (!utf32) utf32 = rb_enc_find("UTF-32");
if (resenc == NULL) resenc = rb_default_external_encoding();
if (!rb_enc_asciicompat(resenc)) resenc = rb_usascii_encoding();
rb_enc_associate(result, resenc);
@@ -4494,7 +4488,7 @@ rb_str_inspect(VALUE str)
p = RSTRING_PTR(str); pend = RSTRING_END(str);
prev = p;
- if (encidx == ENCIDX_UTF_16) {
+ if (enc == utf16) {
const unsigned char *q = (const unsigned char *)p;
if (q[0] == 0xFE && q[1] == 0xFF)
enc = rb_enc_find("UTF-16BE");
@@ -4503,7 +4497,7 @@ rb_str_inspect(VALUE str)
else
unicode_p = 0;
}
- else if (encidx == ENCIDX_UTF_32) {
+ else if (enc == utf32) {
const unsigned char *q = (const unsigned char *)p;
if (q[0] == 0 && q[1] == 0 && q[2] == 0xFE && q[3] == 0xFF)
enc = rb_enc_find("UTF-32BE");
@@ -7750,7 +7744,6 @@ str_scrub0(int argc, VALUE *argv, VALUE str)
{
int cr = ENC_CODERANGE(str);
rb_encoding *enc;
- int encidx;
VALUE repl;
if (cr == ENC_CODERANGE_7BIT || cr == ENC_CODERANGE_VALID)
@@ -7765,7 +7758,6 @@ str_scrub0(int argc, VALUE *argv, VALUE str)
if (rb_enc_dummy_p(enc)) {
return Qnil;
}
- encidx = rb_enc_to_index(enc);
#define DEFAULT_REPLACE_CHAR(str) do { \
static const char replace[sizeof(str)-1] = str; \
@@ -7790,7 +7782,7 @@ str_scrub0(int argc, VALUE *argv, VALUE str)
replen = RSTRING_LEN(repl);
rep7bit_p = (ENC_CODERANGE(repl) == ENC_CODERANGE_7BIT);
}
- else if (encidx == rb_utf8_encindex()) {
+ else if (enc == rb_utf8_encoding()) {
DEFAULT_REPLACE_CHAR("\xEF\xBF\xBD");
rep7bit_p = FALSE;
}
@@ -7896,20 +7888,30 @@ str_scrub0(int argc, VALUE *argv, VALUE str)
const char *rep;
long replen;
long mbminlen = rb_enc_mbminlen(enc);
+ static rb_encoding *utf16be;
+ static rb_encoding *utf16le;
+ static rb_encoding *utf32be;
+ static rb_encoding *utf32le;
+ if (!utf16be) {
+ utf16be = rb_enc_find("UTF-16BE");
+ utf16le = rb_enc_find("UTF-16LE");
+ utf32be = rb_enc_find("UTF-32BE");
+ utf32le = rb_enc_find("UTF-32LE");
+ }
if (!NIL_P(repl)) {
rep = RSTRING_PTR(repl);
replen = RSTRING_LEN(repl);
}
- else if (encidx == ENCIDX_UTF_16BE) {
+ else if (enc == utf16be) {
DEFAULT_REPLACE_CHAR("\xFF\xFD");
}
- else if (encidx == ENCIDX_UTF_16LE) {
+ else if (enc == utf16le) {
DEFAULT_REPLACE_CHAR("\xFD\xFF");
}
- else if (encidx == ENCIDX_UTF_32BE) {
+ else if (enc == utf32be) {
DEFAULT_REPLACE_CHAR("\x00\x00\xFF\xFD");
}
- else if (encidx == ENCIDX_UTF_32LE) {
+ else if (enc == utf32le) {
DEFAULT_REPLACE_CHAR("\xFD\xFF\x00\x00");
}
else {