Scan the code range of the formatted portion
This commit is contained in:
parent
59da26789f
commit
f34280ec6b
Notes:
git
2022-08-19 03:06:19 +09:00
14
sprintf.c
14
sprintf.c
@ -1153,6 +1153,10 @@ ruby_vsprintf0(VALUE result, char *p, const char *fmt, va_list ap)
|
|||||||
rb_printf_buffer_extra buffer;
|
rb_printf_buffer_extra buffer;
|
||||||
#define f buffer.base
|
#define f buffer.base
|
||||||
VALUE klass = RBASIC(result)->klass;
|
VALUE klass = RBASIC(result)->klass;
|
||||||
|
int coderange = ENC_CODERANGE(result);
|
||||||
|
long scanned = 0;
|
||||||
|
|
||||||
|
if (coderange != ENC_CODERANGE_UNKNOWN) scanned = p - RSTRING_PTR(result);
|
||||||
|
|
||||||
f._flags = __SWR | __SSTR;
|
f._flags = __SWR | __SSTR;
|
||||||
f._bf._size = 0;
|
f._bf._size = 0;
|
||||||
@ -1165,9 +1169,13 @@ ruby_vsprintf0(VALUE result, char *p, const char *fmt, va_list ap)
|
|||||||
buffer.value = 0;
|
buffer.value = 0;
|
||||||
BSD_vfprintf(&f, fmt, ap);
|
BSD_vfprintf(&f, fmt, ap);
|
||||||
RBASIC_SET_CLASS_RAW(result, klass);
|
RBASIC_SET_CLASS_RAW(result, klass);
|
||||||
// vfprintf mutates the string without updating coderange
|
p = RSTRING_PTR(result);
|
||||||
ENC_CODERANGE_CLEAR(result);
|
long blen = (char *)f._p - p;
|
||||||
rb_str_resize(result, (char *)f._p - RSTRING_PTR(result));
|
if (scanned < blen) {
|
||||||
|
rb_str_coderange_scan_restartable(p + scanned, p + blen, rb_enc_get(result), &coderange);
|
||||||
|
ENC_CODERANGE_SET(result, coderange);
|
||||||
|
}
|
||||||
|
rb_str_resize(result, blen);
|
||||||
#undef f
|
#undef f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user