#include <njs_sprintf.h>
-typedef uintptr_t njs_index_t;
-typedef struct njs_vm_s njs_vm_t;
-typedef struct njs_mod_s njs_mod_t;
-typedef union njs_value_s njs_value_t;
-typedef struct njs_function_s njs_function_t;
-typedef struct njs_vm_shared_s njs_vm_shared_t;
-typedef struct njs_object_prop_s njs_object_prop_t;
-typedef struct njs_external_s njs_external_t;
+typedef uintptr_t njs_index_t;
+typedef struct njs_vm_s njs_vm_t;
+typedef struct njs_mod_s njs_mod_t;
+typedef union njs_value_s njs_value_t;
+typedef struct njs_function_s njs_function_t;
+typedef struct njs_vm_shared_s njs_vm_shared_t;
+typedef struct njs_object_init_s njs_object_init_t;
+typedef struct njs_object_prop_s njs_object_prop_t;
+typedef struct njs_object_type_init_s njs_object_type_init_t;
+typedef struct njs_external_s njs_external_t;
/*
* njs_opaque_value_t is the external storage type for native njs_value_t type.
{
u_char *dst;
int64_t e, i, p, q, ncaptures, length;
+ ssize_t len;
uint32_t limit;
njs_int_t ret;
njs_bool_t sticky;
end = &s.start[q];
}
- ret = njs_string_split_part_add(vm, array, utf8, start, end - start);
+ len = njs_string_calc_length(utf8, start, end - start);
+
+ ret = njs_array_string_add(vm, array, start, end - start, len);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
start = &s.start[p];
}
- ret = njs_string_split_part_add(vm, array, utf8, start, end - start);
+ len = njs_string_calc_length(utf8, start, end - start);
+
+ ret = njs_array_string_add(vm, array, start, end - start, len);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
+uint32_t
+njs_string_length(njs_value_t *string)
+{
+ uint32_t length, size;
+
+ if (string->short_string.size != NJS_STRING_LONG) {
+ size = string->short_string.size;
+ length = string->short_string.length;
+
+ } else {
+ size = string->long_string.size;
+ length = string->long_string.data->length;
+ }
+
+ return (length == 0) ? size : length;
+}
+
+
+size_t
+njs_string_prop(njs_string_prop_t *string, const njs_value_t *value)
+{
+ size_t size;
+ uintptr_t length;
+
+ size = value->short_string.size;
+
+ if (size != NJS_STRING_LONG) {
+ string->start = (u_char *) value->short_string.start;
+ length = value->short_string.length;
+
+ } else {
+ string->start = (u_char *) value->long_string.data->start;
+ size = value->long_string.size;
+ length = value->long_string.data->length;
+ }
+
+ string->size = size;
+ string->length = length;
+
+ return (length == 0) ? size : length;
+}
+
+
void
njs_string_truncate(njs_value_t *value, uint32_t size, uint32_t length)
{
njs_index_t unused, njs_value_t *retval)
{
size_t size;
+ ssize_t len;
uint32_t limit;
njs_int_t ret;
njs_utf8_t utf8;
size = p - start;
- ret = njs_string_split_part_add(vm, array, utf8, start, size);
+ len = njs_string_calc_length(utf8, start, size);
+
+ ret = njs_array_string_add(vm, array, start, size, len);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
-njs_int_t
-njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array, njs_utf8_t utf8,
- const u_char *start, size_t size)
-{
- ssize_t length;
-
- length = njs_string_calc_length(utf8, start, size);
-
- return njs_array_string_add(vm, array, start, size, length);
-}
-
-
njs_int_t
njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
njs_value_t *string, int64_t pos, njs_value_t *captures, int64_t ncaptures,
} njs_trim_t;
-njs_inline njs_bool_t
-njs_is_byte_string(njs_string_prop_t *string)
-{
- return (string->length == 0 && string->size != 0);
-}
-
-
-njs_inline njs_bool_t
-njs_is_byte_or_ascii_string(njs_string_prop_t *string)
-{
- return (string->length == 0 || string->length == string->size);
-}
-
-
-njs_inline uint32_t
-njs_string_calc_length(njs_utf8_t utf8, const u_char *start, size_t size)
-{
- ssize_t length;
-
- switch (utf8) {
-
- case NJS_STRING_BYTE:
- return 0;
-
- case NJS_STRING_ASCII:
- return size;
-
- case NJS_STRING_UTF8:
- default:
- length = njs_utf8_length(start, size);
-
- return (length >= 0) ? length : 0;
- }
-}
-
-
-njs_inline uint32_t
-njs_string_length(njs_value_t *string)
-{
- uint32_t length, size;
-
- if (string->short_string.size != NJS_STRING_LONG) {
- size = string->short_string.size;
- length = string->short_string.length;
-
- } else {
- size = string->long_string.size;
- length = string->long_string.data->length;
- }
-
- return (length == 0) ? size : length;
-}
-
-
-njs_inline njs_bool_t
-njs_need_escape(const uint32_t *escape, uint32_t byte)
-{
- return ((escape[byte >> 5] & ((uint32_t) 1 << (byte & 0x1f))) != 0);
-}
-
-
-njs_inline u_char *
-njs_string_encode(const uint32_t *escape, size_t size, const u_char *src,
- u_char *dst)
-{
- uint8_t byte;
- static const u_char hex[16] = "0123456789ABCDEF";
-
- do {
- byte = *src++;
-
- if (njs_need_escape(escape, byte)) {
- *dst++ = '%';
- *dst++ = hex[byte >> 4];
- *dst++ = hex[byte & 0xf];
-
- } else {
- *dst++ = byte;
- }
-
- size--;
-
- } while (size != 0);
-
- return dst;
-}
-
-
njs_int_t njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
uint32_t size);
u_char *njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
njs_int_t njs_string_create_chb(njs_vm_t *vm, njs_value_t *value,
njs_chb_t *chain);
+uint32_t njs_string_length(njs_value_t *string);
+size_t njs_string_prop(njs_string_prop_t *string, const njs_value_t *value);
+
void njs_encode_hex(njs_str_t *dst, const njs_str_t *src);
size_t njs_encode_hex_length(const njs_str_t *src, size_t *out_size);
void njs_encode_base64(njs_str_t *dst, const njs_str_t *src);
njs_int_t njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
-njs_int_t njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array,
- njs_utf8_t utf8, const u_char *start, size_t size);
njs_int_t njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
njs_value_t *string, int64_t pos, njs_value_t *captures, int64_t ncaptures,
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)
+njs_inline njs_bool_t
+njs_is_byte_string(njs_string_prop_t *string)
{
- if (njs_is_byte_or_ascii_string(string)) {
- return string->start + index;
+ return (string->length == 0 && string->size != 0);
+}
+
+
+njs_inline njs_bool_t
+njs_is_byte_or_ascii_string(njs_string_prop_t *string)
+{
+ return (string->length == 0 || string->length == string->size);
+}
+
+
+njs_inline uint32_t
+njs_string_calc_length(njs_utf8_t utf8, const u_char *start, size_t size)
+{
+ ssize_t length;
+
+ switch (utf8) {
+
+ case NJS_STRING_BYTE:
+ return 0;
+
+ case NJS_STRING_ASCII:
+ return size;
+
+ case NJS_STRING_UTF8:
+ default:
+ length = njs_utf8_length(start, size);
+
+ return (length >= 0) ? length : 0;
}
+}
- /* UTF-8 string. */
- return njs_string_utf8_offset(string->start, string->start + string->size,
- index);
+njs_inline njs_bool_t
+njs_need_escape(const uint32_t *escape, uint32_t byte)
+{
+ return ((escape[byte >> 5] & ((uint32_t) 1 << (byte & 0x1f))) != 0);
}
-njs_inline size_t
-njs_string_prop(njs_string_prop_t *string, const njs_value_t *value)
+njs_inline u_char *
+njs_string_encode(const uint32_t *escape, size_t size, const u_char *src,
+ u_char *dst)
{
- size_t size;
- uintptr_t length;
+ uint8_t byte;
+ static const u_char hex[16] = "0123456789ABCDEF";
+
+ do {
+ byte = *src++;
+
+ if (njs_need_escape(escape, byte)) {
+ *dst++ = '%';
+ *dst++ = hex[byte >> 4];
+ *dst++ = hex[byte & 0xf];
+
+ } else {
+ *dst++ = byte;
+ }
- size = value->short_string.size;
+ size--;
+
+ } while (size != 0);
- if (size != NJS_STRING_LONG) {
- string->start = (u_char *) value->short_string.start;
- length = value->short_string.length;
+ return dst;
+}
- } else {
- string->start = (u_char *) value->long_string.data->start;
- size = value->long_string.size;
- length = value->long_string.data->length;
+
+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;
}
- string->size = size;
- string->length = length;
+ /* UTF-8 string. */
- return (length == 0) ? size : length;
+ return njs_string_utf8_offset(string->start, string->start + string->size,
+ index);
}