2#include "nuklear_internal.h"
9#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR
11nk_str_init_default(
struct nk_str *str)
14 alloc.userdata.ptr = 0;
15 alloc.alloc = nk_malloc;
16 alloc.free = nk_mfree;
17 nk_buffer_init(&str->buffer, &alloc, 32);
25 nk_buffer_init(&str->buffer, alloc, size);
29nk_str_init_fixed(
struct nk_str *str,
void *memory, nk_size size)
31 nk_buffer_init_fixed(&str->buffer, memory, size);
35nk_str_append_text_char(
struct nk_str *s,
const char *str,
int len)
40 if (!s || !str || !len)
return 0;
41 mem = (
char*)nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len *
sizeof(char), 0);
43 NK_MEMCPY(mem, str, (nk_size)len *
sizeof(
char));
44 s->len += nk_utf_len(str, len);
48nk_str_append_str_char(
struct nk_str *s,
const char *str)
50 return nk_str_append_text_char(s, str, nk_strlen(str));
53nk_str_append_text_utf8(
struct nk_str *str,
const char *text,
int len)
58 if (!str || !text || !len)
return 0;
59 for (i = 0; i < len; ++i)
60 byte_len += nk_utf_decode(text+byte_len, &unicode, 4);
61 nk_str_append_text_char(str, text, byte_len);
65nk_str_append_str_utf8(
struct nk_str *str,
const char *text)
71 if (!str || !text)
return 0;
73 glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4);
74 while (unicode !=
'\0' && glyph_len) {
75 glyph_len = nk_utf_decode(text+byte_len, &unicode, 4);
76 byte_len += glyph_len;
79 nk_str_append_text_char(str, text, byte_len);
83nk_str_append_text_runes(
struct nk_str *str,
const nk_rune *text,
int len)
90 if (!str || !text || !len)
return 0;
91 for (i = 0; i < len; ++i) {
92 byte_len = nk_utf_encode(text[i], glyph,
NK_UTF_SIZE);
94 nk_str_append_text_char(str, glyph, byte_len);
99nk_str_append_str_runes(
struct nk_str *str,
const nk_rune *runes)
105 if (!str || !runes)
return 0;
106 while (runes[i] !=
'\0') {
107 byte_len = nk_utf_encode(runes[i], glyph,
NK_UTF_SIZE);
108 nk_str_append_text_char(str, glyph, byte_len);
114nk_str_insert_at_char(
struct nk_str *s,
int pos,
const char *str,
int len)
125 if (!s || !str || !len || (nk_size)pos > s->buffer.
allocated)
return 0;
127 (s->buffer.
type == NK_BUFFER_FIXED))
return 0;
129 copylen = (int)s->buffer.
allocated - pos;
131 nk_str_append_text_char(s, str, len);
134 mem = nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len *
sizeof(
char), 0);
138 NK_ASSERT(((
int)pos + (
int)len + ((
int)copylen - 1)) >= 0);
139 NK_ASSERT(((
int)pos + ((
int)copylen - 1)) >= 0);
140 dst = nk_ptr_add(
char, s->buffer.
memory.ptr, pos + len + (copylen - 1));
141 src = nk_ptr_add(
char, s->buffer.
memory.ptr, pos + (copylen-1));
142 for (i = 0; i < copylen; ++i) *dst-- = *src--;
143 mem = nk_ptr_add(
void, s->buffer.
memory.ptr, pos);
144 NK_MEMCPY(mem, str, (nk_size)len *
sizeof(
char));
145 s->len = nk_utf_len((
char *)s->buffer.
memory.ptr, (
int)s->buffer.
allocated);
149nk_str_insert_at_rune(
struct nk_str *str,
int pos,
const char *cstr,
int len)
159 if (!str || !cstr || !len)
return 0;
160 begin = nk_str_at_rune(str, pos, &unicode, &glyph_len);
162 return nk_str_append_text_char(str, cstr, len);
163 buffer = nk_str_get_const(str);
164 if (!begin)
return 0;
165 return nk_str_insert_at_char(str, (
int)(begin - buffer), cstr, len);
168nk_str_insert_text_char(
struct nk_str *str,
int pos,
const char *text,
int len)
170 return nk_str_insert_text_utf8(str, pos, text, len);
173nk_str_insert_str_char(
struct nk_str *str,
int pos,
const char *text)
175 return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text));
178nk_str_insert_text_utf8(
struct nk_str *str,
int pos,
const char *text,
int len)
186 if (!str || !text || !len)
return 0;
187 for (i = 0; i < len; ++i)
188 byte_len += nk_utf_decode(text+byte_len, &unicode, 4);
189 nk_str_insert_at_rune(str, pos, text, byte_len);
193nk_str_insert_str_utf8(
struct nk_str *str,
int pos,
const char *text)
199 if (!str || !text)
return 0;
201 glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4);
202 while (unicode !=
'\0' && glyph_len) {
203 glyph_len = nk_utf_decode(text+byte_len, &unicode, 4);
204 byte_len += glyph_len;
207 nk_str_insert_at_rune(str, pos, text, byte_len);
211nk_str_insert_text_runes(
struct nk_str *str,
int pos,
const nk_rune *runes,
int len)
218 if (!str || !runes || !len)
return 0;
219 for (i = 0; i < len; ++i) {
220 byte_len = nk_utf_encode(runes[i], glyph,
NK_UTF_SIZE);
221 if (!byte_len)
break;
222 nk_str_insert_at_rune(str, pos+i, glyph, byte_len);
227nk_str_insert_str_runes(
struct nk_str *str,
int pos,
const nk_rune *runes)
233 if (!str || !runes)
return 0;
234 while (runes[i] !=
'\0') {
235 byte_len = nk_utf_encode(runes[i], glyph,
NK_UTF_SIZE);
236 nk_str_insert_at_rune(str, pos+i, glyph, byte_len);
242nk_str_remove_chars(
struct nk_str *s,
int len)
246 if (!s || len < 0 || (nk_size)len > s->buffer.
allocated)
return;
247 NK_ASSERT(((
int)s->buffer.
allocated - (
int)len) >= 0);
249 s->len = nk_utf_len((
char *)s->buffer.
memory.ptr, (
int)s->buffer.
allocated);
252nk_str_remove_runes(
struct nk_str *str,
int len)
261 if (!str || len < 0)
return;
262 if (len >= str->len) {
267 index = str->len - len;
268 begin = nk_str_at_rune(str, index, &unicode, &len);
270 nk_str_remove_chars(str, (
int)(end-begin)+1);
273nk_str_delete_chars(
struct nk_str *s,
int pos,
int len)
276 if (!s || !len || (nk_size)pos > s->buffer.
allocated ||
277 (nk_size)(pos + len) > s->buffer.
allocated)
return;
279 if ((nk_size)(pos + len) < s->buffer.
allocated) {
281 char *dst = nk_ptr_add(
char, s->buffer.
memory.ptr, pos);
282 char *src = nk_ptr_add(
char, s->buffer.
memory.ptr, pos + len);
283 NK_MEMCPY(dst, src, s->buffer.
allocated - (nk_size)(pos + len));
284 NK_ASSERT(((
int)s->buffer.
allocated - (
int)len) >= 0);
286 }
else nk_str_remove_chars(s, len);
287 s->len = nk_utf_len((
char *)s->buffer.
memory.ptr, (
int)s->buffer.
allocated);
290nk_str_delete_runes(
struct nk_str *s,
int pos,
int len)
299 NK_ASSERT(s->len >= pos + len);
300 if (s->len < pos + len)
301 len = NK_CLAMP(0, (s->len - pos), s->len);
304 temp = (
char *)s->buffer.
memory.ptr;
305 begin = nk_str_at_rune(s, pos, &unicode, &unused);
307 s->buffer.
memory.ptr = begin;
308 end = nk_str_at_rune(s, len, &unicode, &unused);
309 s->buffer.
memory.ptr = temp;
311 nk_str_delete_chars(s, (
int)(begin - temp), (
int)(end - begin));
314nk_str_at_char(
struct nk_str *s,
int pos)
317 if (!s || pos > (
int)s->buffer.
allocated)
return 0;
318 return nk_ptr_add(
char, s->buffer.
memory.ptr, pos);
321nk_str_at_rune(
struct nk_str *str,
int pos, nk_rune *unicode,
int *len)
333 if (!str || !unicode || !len)
return 0;
340 text = (
char*)str->buffer.
memory.ptr;
342 glyph_len = nk_utf_decode(text, unicode, text_len);
350 src_len = src_len + glyph_len;
351 glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len);
353 if (i != pos)
return 0;
354 return text + src_len;
357nk_str_at_char_const(
const struct nk_str *s,
int pos)
360 if (!s || pos > (
int)s->buffer.
allocated)
return 0;
361 return nk_ptr_add(
char, s->buffer.
memory.ptr, pos);
364nk_str_at_const(
const struct nk_str *str,
int pos, nk_rune *unicode,
int *len)
376 if (!str || !unicode || !len)
return 0;
383 text = (
char*)str->buffer.
memory.ptr;
385 glyph_len = nk_utf_decode(text, unicode, text_len);
393 src_len = src_len + glyph_len;
394 glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len);
396 if (i != pos)
return 0;
397 return text + src_len;
400nk_str_rune_at(
const struct nk_str *str,
int pos)
404 nk_str_at_const(str, pos, &unicode, &len);
408nk_str_get(
struct nk_str *s)
411 if (!s || !s->len || !s->buffer.
allocated)
return 0;
412 return (
char*)s->buffer.
memory.ptr;
415nk_str_get_const(
const struct nk_str *s)
418 if (!s || !s->len || !s->buffer.
allocated)
return 0;
419 return (
const char*)s->buffer.
memory.ptr;
422nk_str_len(
const struct nk_str *s)
425 if (!s || !s->len || !s->buffer.
allocated)
return 0;
429nk_str_len_char(
const struct nk_str *s)
432 if (!s || !s->len || !s->buffer.
allocated)
return 0;
436nk_str_clear(
struct nk_str *str)
439 nk_buffer_clear(&str->buffer);
443nk_str_free(
struct nk_str *str)
446 nk_buffer_free(&str->buffer);
main API and documentation file
#define NK_UTF_SIZE
describes the number of bytes a glyph consists of
struct nk_memory memory
!< memory management type
enum nk_allocation_type type
!< allocator callback for dynamic buffers
nk_size allocated
!< growing factor for dynamic memory management
==============================================================