]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * Misc support functions | |
3 | */ | |
4 | ||
5 | #include "duk_internal.h" | |
6 | ||
7 | DUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos) { | |
8 | duk_uint32_t boff; | |
9 | const duk_uint8_t *p, *p_start, *p_end; | |
10 | duk_ucodepoint_t cp; | |
11 | ||
12 | /* Caller must check character offset to be inside the string. */ | |
13 | DUK_ASSERT(thr != NULL); | |
14 | DUK_ASSERT(h != NULL); | |
15 | DUK_ASSERT_DISABLE(pos >= 0); /* unsigned */ | |
16 | DUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); | |
17 | ||
18 | boff = duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos); | |
19 | DUK_DDD(DUK_DDDPRINT("charCodeAt: pos=%ld -> boff=%ld, str=%!O", | |
20 | (long) pos, (long) boff, (duk_heaphdr *) h)); | |
21 | DUK_ASSERT_DISABLE(boff >= 0); | |
22 | DUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h)); | |
23 | ||
24 | p_start = DUK_HSTRING_GET_DATA(h); | |
25 | p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); | |
26 | p = p_start + boff; | |
27 | DUK_DDD(DUK_DDDPRINT("p_start=%p, p_end=%p, p=%p", | |
11fdf7f2 TL |
28 | (const void *) p_start, (const void *) p_end, |
29 | (const void *) p)); | |
7c673cae FG |
30 | |
31 | /* This may throw an error though not for valid E5 strings. */ | |
32 | cp = duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); | |
33 | return cp; | |
34 | } | |
11fdf7f2 TL |
35 | |
36 | #if !defined(DUK_USE_HSTRING_CLEN) | |
37 | DUK_INTERNAL duk_size_t duk_hstring_get_charlen(duk_hstring *h) { | |
38 | if (DUK_HSTRING_HAS_ASCII(h)) { | |
39 | /* Most practical strings will go here. */ | |
40 | return DUK_HSTRING_GET_BYTELEN(h); | |
41 | } else { | |
42 | return duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); | |
43 | } | |
44 | } | |
45 | #endif /* !DUK_USE_HSTRING_CLEN */ |