diff options
Diffstat (limited to 'src/civetweb/src/third_party/duktape-1.8.0/src-separate/duk_hstring_misc.c')
-rw-r--r-- | src/civetweb/src/third_party/duktape-1.8.0/src-separate/duk_hstring_misc.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/civetweb/src/third_party/duktape-1.8.0/src-separate/duk_hstring_misc.c b/src/civetweb/src/third_party/duktape-1.8.0/src-separate/duk_hstring_misc.c new file mode 100644 index 000000000..b68514752 --- /dev/null +++ b/src/civetweb/src/third_party/duktape-1.8.0/src-separate/duk_hstring_misc.c @@ -0,0 +1,45 @@ +/* + * Misc support functions + */ + +#include "duk_internal.h" + +DUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos) { + duk_uint32_t boff; + const duk_uint8_t *p, *p_start, *p_end; + duk_ucodepoint_t cp; + + /* Caller must check character offset to be inside the string. */ + DUK_ASSERT(thr != NULL); + DUK_ASSERT(h != NULL); + DUK_ASSERT_DISABLE(pos >= 0); /* unsigned */ + DUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); + + boff = duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos); + DUK_DDD(DUK_DDDPRINT("charCodeAt: pos=%ld -> boff=%ld, str=%!O", + (long) pos, (long) boff, (duk_heaphdr *) h)); + DUK_ASSERT_DISABLE(boff >= 0); + DUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h)); + + p_start = DUK_HSTRING_GET_DATA(h); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); + p = p_start + boff; + DUK_DDD(DUK_DDDPRINT("p_start=%p, p_end=%p, p=%p", + (const void *) p_start, (const void *) p_end, + (const void *) p)); + + /* This may throw an error though not for valid E5 strings. */ + cp = duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); + return cp; +} + +#if !defined(DUK_USE_HSTRING_CLEN) +DUK_INTERNAL duk_size_t duk_hstring_get_charlen(duk_hstring *h) { + if (DUK_HSTRING_HAS_ASCII(h)) { + /* Most practical strings will go here. */ + return DUK_HSTRING_GET_BYTELEN(h); + } else { + return duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); + } +} +#endif /* !DUK_USE_HSTRING_CLEN */ |