VOOZH about

URL: https://apidock.com/ruby/String/dump

⇱ String#dump - APIdock


method

dump

ruby latest stable - Class: String
dump()
public

Produces a version of with all non-printing characters replaced by nnn notation and all special characters escaped.

"hello \n ''".dump #=> "\"hello \\n ''\""
VALUE
rb_str_dump(VALUE str)
{
 int encidx = rb_enc_get_index(str);
 rb_encoding *enc = rb_enc_from_index(encidx);
 long len;
 const char *p, *pend;
 char *q, *qend;
 VALUE result;
 int u8 = (encidx == rb_utf8_encindex());
 static const char nonascii_suffix[] = ".force_encoding(\"%s\")";

 len = 2; /* "" */
 if (!rb_enc_asciicompat(enc)) {
 len += strlen(nonascii_suffix) - rb_strlen_lit("%s");
 len += strlen(enc->name);
 }

 p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
 while (p < pend) {
 int clen;
 unsigned char c = *p++;

 switch (c) {
 case '"': case '\\':
 case '\n': case '\r':
 case '\t': case '\f':
 case '\013': case '\010': case '\007': case '\033':
 clen = 2;
 break;

 case '#':
 clen = IS_EVSTR(p, pend) ? 2 : 1;
 break;

 default:
 if (ISPRINT(c)) {
 clen = 1;
 }
 else {
 if (u8 && c > 0x7F) { /* \u notation */
 int n = rb_enc_precise_mbclen(p-1, pend, enc);
 if (MBCLEN_CHARFOUND_P(n)) {
 unsigned int cc = rb_enc_mbc_to_codepoint(p-1, pend, enc);
 if (cc <= 0xFFFF)
 clen = 6; /* \uXXXX */
 else if (cc <= 0xFFFFF)
 clen = 9; /* \u{XXXXX} */
 else
 clen = 10; /* \u{XXXXXX} */
 p += MBCLEN_CHARFOUND_LEN(n)-1;
 break;
 }
 }
 clen = 4; /* \xNN */
 }
 break;
 }

 if (clen > LONG_MAX - len) {
 rb_raise(rb_eRuntimeError, "string size too big");
 }
 len += clen;
 }

 result = rb_str_new_with_class(str, 0, len);
 p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
 q = RSTRING_PTR(result); qend = q + len + 1;

 *q++ = '"';
 while (p < pend) {
 unsigned char c = *p++;

 if (c == '"' || c == '\\') {
 *q++ = '\\';
 *q++ = c;
 }
 else if (c == '#') {
 if (IS_EVSTR(p, pend)) *q++ = '\\';
 *q++ = '#';
 }
 else if (c == '\n') {
 *q++ = '\\';
 *q++ = 'n';
 }
 else if (c == '\r') {
 *q++ = '\\';
 *q++ = 'r';
 }
 else if (c == '\t') {
 *q++ = '\\';
 *q++ = 't';
 }
 else if (c == '\f') {
 *q++ = '\\';
 *q++ = 'f';
 }
 else if (c == '\013') {
 *q++ = '\\';
 *q++ = 'v';
 }
 else if (c == '\010') {
 *q++ = '\\';
 *q++ = 'b';
 }
 else if (c == '\007') {
 *q++ = '\\';
 *q++ = 'a';
 }
 else if (c == '\033') {
 *q++ = '\\';
 *q++ = 'e';
 }
 else if (ISPRINT(c)) {
 *q++ = c;
 }
 else {
 *q++ = '\\';
 if (u8) {
 int n = rb_enc_precise_mbclen(p-1, pend, enc) - 1;
 if (MBCLEN_CHARFOUND_P(n)) {
 int cc = rb_enc_mbc_to_codepoint(p-1, pend, enc);
 p += n;
 if (cc <= 0xFFFF)
 snprintf(q, qend-q, "u%04X", cc); /* \uXXXX */
 else
 snprintf(q, qend-q, "u{%X}", cc); /* \u{XXXXX} or \u{XXXXXX} */
 q += strlen(q);
 continue;
 }
 }
 snprintf(q, qend-q, "x%02X", c);
 q += 3;
 }
 }
 *q++ = '"';
 *q = '\0';
 if (!rb_enc_asciicompat(enc)) {
 snprintf(q, qend-q, nonascii_suffix, enc->name);
 encidx = rb_ascii8bit_encindex();
 }
 OBJ_INFECT_RAW(result, str);
 /* result from dump is ASCII */
 rb_enc_associate_index(result, encidx);
 ENC_CODERANGE_SET(result, ENC_CODERANGE_7BIT);
 return result;
}

Related methods