/* * escapes strings for XML * The double-quote (") character is translated to """ */ static VALUE fast_xs(VALUE self) { long i; VALUE array; char *c; size_t s_len; VALUE *tmp; VALUE rv; array = rb_rescue(unpack_utf8, self, unpack_uchar, self); for (tmp = RARRAY_PTR(array), s_len = i = RARRAY_LEN(array); --i >= 0; tmp++) { int n = NUM2INT(*tmp); if (likely(n < 128)) { if (unlikely(n == '"')) s_len += (sizeof(""") - 2); if (unlikely(n == '&')) s_len += (sizeof("&") - 2); if (unlikely(n == '>' || n == '<')) s_len += (sizeof(">") - 2); continue; } CP_1252_ESCAPE(n); if (VALID_VALUE(n)) s_len += bytes_for(n) - 1; } rv = rb_str_new(NULL, s_len); c = RSTRING_PTR(rv); for (tmp = RARRAY_PTR(array), i = RARRAY_LEN(array); --i >= 0; tmp++) c += escape(c, NUM2INT(*tmp)); return rv; }