nxt_uint_t nargs, njs_index_t unused)
{
size_t size, length;
- u_char *p, *start;
+ u_char *p;
+ uint32_t code;
const u_char *s, *end;
njs_string_prop_t string;
(void) njs_string_prop(&string, &args[0]);
- start = njs_string_alloc(vm, &vm->retval, string.size, string.length);
- if (nxt_slow_path(start == NULL)) {
- return NXT_ERROR;
- }
+ if (string.length == 0 || string.length == string.size) {
+ /* Byte or ASCII string. */
- p = start;
- s = string.start;
- size = string.size;
+ p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
+ if (nxt_slow_path(p == NULL)) {
+ return NXT_ERROR;
+ }
- if (string.length == 0 || string.length == size) {
- /* Byte or ASCII string. */
+ s = string.start;
+ size = string.size;
while (size != 0) {
*p++ = nxt_lower_case(*s++);
} else {
/* UTF-8 string. */
- end = s + size;
+ s = string.start;
+ end = s + string.size;
+ length = string.length;
+
+ size = 0;
+
+ while (length != 0) {
+ code = nxt_utf8_lower_case(&s, end);
+ size += nxt_utf8_size(code);
+ length--;
+ }
+
+ p = njs_string_alloc(vm, &vm->retval, size, string.length);
+ if (nxt_slow_path(p == NULL)) {
+ return NXT_ERROR;
+ }
+
+ s = string.start;
length = string.length;
while (length != 0) {
- p = nxt_utf8_encode(p, nxt_utf8_lower_case(&s, end));
+ code = nxt_utf8_lower_case(&s, end);
+ p = nxt_utf8_encode(p, code);
length--;
}
}
nxt_uint_t nargs, njs_index_t unused)
{
size_t size, length;
- u_char *p, *start;
+ u_char *p;
+ uint32_t code;
const u_char *s, *end;
njs_string_prop_t string;
(void) njs_string_prop(&string, &args[0]);
- start = njs_string_alloc(vm, &vm->retval, string.size, string.length);
- if (nxt_slow_path(start == NULL)) {
- return NXT_ERROR;
- }
+ if (string.length == 0 || string.length == string.size) {
+ /* Byte or ASCII string. */
- p = start;
- s = string.start;
- size = string.size;
+ p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
+ if (nxt_slow_path(p == NULL)) {
+ return NXT_ERROR;
+ }
- if (string.length == 0 || string.length == size) {
- /* Byte or ASCII string. */
+ s = string.start;
+ size = string.size;
while (size != 0) {
*p++ = nxt_upper_case(*s++);
} else {
/* UTF-8 string. */
- end = s + size;
+ s = string.start;
+ end = s + string.size;
+ length = string.length;
+
+ size = 0;
+
+ while (length != 0) {
+ code = nxt_utf8_upper_case(&s, end);
+ size += nxt_utf8_size(code);
+ length--;
+ }
+
+ p = njs_string_alloc(vm, &vm->retval, size, string.length);
+ if (nxt_slow_path(p == NULL)) {
+ return NXT_ERROR;
+ }
+
+ s = string.start;
length = string.length;
while (length != 0) {
- p = nxt_utf8_encode(p, nxt_utf8_upper_case(&s, end));
+ code = nxt_utf8_upper_case(&s, end);
+ p = nxt_utf8_encode(p, code);
length--;
}
}
{ nxt_string("'АБВ'.toLowerCase()"),
nxt_string("абв") },
+ { nxt_string("'Ȿ'.repeat(256).toLowerCase() === 'ȿ'.repeat(256)"),
+ nxt_string("true") },
+
{ nxt_string("'abc'.toUpperCase()"),
nxt_string("ABC") },
{ nxt_string("'αβγ'.toUpperCase()"),
nxt_string("ΑΒΓ") },
+ { nxt_string("'ȿ'.repeat(256).toUpperCase() === 'Ȿ'.repeat(256)"),
+ nxt_string("true") },
+
{ nxt_string("'\x00абвгдеёжз'.toUpperCase().length"),
nxt_string("10") },
-#if 0 /* FIXME */
+ { nxt_string("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
+ nxt_string("2,3,3,2") },
+
{ nxt_string("var a = [], code;"
"for (code = 0; code < 65536; code++) {"
" var s = String.fromCharCode(code);"
" a.push(code);"
"} a"),
nxt_string("304,453,456,459,498,1012,7838,8486,8490,8491") },
-#endif
{ nxt_string("'abc'.trim()"),
nxt_string("abc") },