offset = last_index;
} else {
- /* UTF-8 string. */
- offset = njs_string_offset(string.start, string.start + string.size,
- last_index) - string.start;
+ offset = njs_string_utf8_offset(string.start,
+ string.start + string.size, last_index)
+ - string.start;
}
ret = njs_regexp_match(vm, &pattern->regex[type], string.start, offset,
if ((size_t) length != s.size) {
/* UTF-8 string. */
- pos = njs_string_offset(s.start, s.start + s.size, pos) - s.start;
+ pos = njs_string_utf8_offset(s.start, s.start + s.size, pos)
+ - s.start;
}
pos = njs_max(njs_min(pos, (int64_t) s.size), 0);
}
if (utf8 == NJS_STRING_UTF8) {
- start = njs_string_offset(s.start, s.start + s.size, p);
- end = njs_string_offset(s.start, s.start + s.size, q);
+ start = njs_string_utf8_offset(s.start, s.start + s.size, p);
+ end = njs_string_utf8_offset(s.start, s.start + s.size, q);
} else {
start = &s.start[p];
end = &s.start[s.size];
if (utf8 == NJS_STRING_UTF8) {
- start = (p < length) ? njs_string_offset(s.start, s.start + s.size, p)
+ start = (p < length) ? njs_string_utf8_offset(s.start, s.start + s.size,
+ p)
: end;
} else {
/* UTF-8 string. */
end = string.start + string.size;
- s = njs_string_offset(string.start, end, slice.start);
+ s = njs_string_utf8_offset(string.start, end, slice.start);
length = slice.length;
end = start + string->size;
if (slice->start < slice->string_length) {
- start = njs_string_offset(start, end, slice->start);
+ start = njs_string_utf8_offset(start, end, slice->start);
/* Evaluate size of the slice in bytes and adjust length. */
p = start;
} else {
njs_utf8_decode_init(&ctx);
- /* UTF-8 string. */
end = string.start + string.size;
- start = njs_string_offset(string.start, end, index);
+ start = njs_string_utf8_offset(string.start, end, index);
code = njs_utf8_decode(&ctx, &start, end);
}
} else {
/* UTF-8 string. */
- p = njs_string_offset(string->start, end, index);
+ p = njs_string_utf8_offset(string->start, end, index);
end -= search->size - 1;
while (p < end) {
goto done;
}
- p = njs_string_offset(string.start, end, index);
+ p = njs_string_utf8_offset(string.start, end, index);
for (; p >= string.start; p = njs_utf8_prev(p)) {
if ((p + s.size) <= end && memcmp(p, s.start, s.size) == 0) {
if (length - index >= search_length) {
end = string.start + string.size;
-
- if (string.size == (size_t) length) {
- /* Byte or ASCII string. */
- p = string.start + index;
-
- } else {
- /* UTF-8 string. */
- p = njs_string_offset(string.start, end, index);
- }
+ p = njs_string_offset(&string, index);
end -= search.size - 1;
}
end = string.start + string.size;
-
- if (string.size == (size_t) length) {
- /* Byte or ASCII string. */
- p = string.start + index;
-
- } else {
- /* UTF-8 string. */
- p = njs_string_offset(string.start, end, index);
- }
+ p = njs_string_offset(&string, index);
if ((size_t) (end - p) >= search.size
&& memcmp(p, search.start, search.size) == 0)
/*
- * njs_string_offset() assumes that index is correct.
+ * njs_string_utf8_offset() assumes that index is correct.
*/
const u_char *
-njs_string_offset(const u_char *start, const u_char *end, size_t index)
+njs_string_utf8_offset(const u_char *start, const u_char *end, size_t index)
{
uint32_t *map;
njs_uint_t skip;
map = njs_string_map_start(end);
if (map[0] == 0) {
- njs_string_offset_map_init(start, end - start);
+ njs_string_utf8_offset_map_init(start, end - start);
}
start += map[index / NJS_STRING_MAP_STRIDE - 1];
map = njs_string_map_start(end);
if (map[0] == 0) {
- njs_string_offset_map_init(string->start, string->size);
+ njs_string_utf8_offset_map_init(string->start, string->size);
}
while (index + NJS_STRING_MAP_STRIDE < string->length
void
-njs_string_offset_map_init(const u_char *start, size_t size)
+njs_string_utf8_offset_map_init(const u_char *start, size_t size)
{
size_t offset;
uint32_t *map;
if (pad_string.size != (size_t) pad_length) {
/* UTF-8 string. */
end = pad_string.start + pad_string.size;
- end = njs_string_offset(pad_string.start, end, trunc);
+ end = njs_string_utf8_offset(pad_string.start, end, trunc);
trunc = end - pad_string.start;
padding = pad_string.size * n + trunc;
}
}
- if (njs_is_byte_or_ascii_string(&string)) {
- p = string.start + pos;
-
- } else {
- /* UTF-8 string. */
- p = njs_string_offset(string.start, string.start + string.size,
- pos);
- }
+ p = njs_string_offset(&string, pos);
(void) njs_string_prop(&ret_string, &retval);
p = string.start + pos;
} else {
- /* UTF-8 string. */
- p = njs_string_offset(string.start, string.start + string.size,
- pos);
+ p = njs_string_utf8_offset(string.start, string.start + string.size,
+ pos);
}
(void) njs_string_prop(&ret_string, &retval);
const njs_string_prop_t *string, const njs_slice_prop_t *slice);
njs_int_t njs_string_slice(njs_vm_t *vm, njs_value_t *dst,
const njs_string_prop_t *string, const njs_slice_prop_t *slice);
-const u_char *njs_string_offset(const u_char *start, const u_char *end,
+const u_char *njs_string_utf8_offset(const u_char *start, const u_char *end,
size_t index);
uint32_t njs_string_index(njs_string_prop_t *string, uint32_t offset);
-void njs_string_offset_map_init(const u_char *start, size_t size);
+void njs_string_utf8_offset_map_init(const u_char *start, size_t size);
double njs_string_to_index(const njs_value_t *value);
njs_int_t njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t component);
njs_value_t *groups, njs_value_t *replacement, njs_value_t *retval);
+njs_inline const u_char *
+njs_string_offset(njs_string_prop_t *string, int64_t index)
+{
+ if (njs_is_byte_or_ascii_string(string)) {
+ return string->start + index;
+ }
+
+ /* UTF-8 string. */
+
+ return njs_string_utf8_offset(string->start, string->start + string->size,
+ index);
+}
+
+
extern const njs_object_init_t njs_string_instance_init;
extern const njs_object_type_init_t njs_string_type_init;