1#ifndef NOTCURSES_EGCPOOL
2#define NOTCURSES_EGCPOOL
16#include "compat/compat.h"
35#define POOL_MINIMUM_ALLOC BUFSIZ
36#define POOL_MAXIMUM_BYTES (1 << 24)
40 memset(p, 0,
sizeof(*p));
46 if(newsize < pool->poolsize){
53 if(newsize * 2 < newsize){
62 char* tmp = (
char*)realloc(pool->
pool, newsize);
77utf8_codepoint_length(
unsigned char c){
101utf8_egc_len(
const char* gcluster,
int* colcount){
106 memset(&mbt, 0,
sizeof(mbt));
107 wchar_t wc, prevw = 0;
110 r = mbrtowc(&wc, gcluster, MB_LEN_MAX, &mbt);
113 logerror(
"invalid UTF8: %s", gcluster);
116 if(prevw && !injoin && uc_is_grapheme_break(prevw, wc)){
120 if(uc_is_property_variation_selector(wc)){
123 }
else if(wc == L
'\u200d' || injoin){
136 logerror(
"prohibited or invalid unicode: 0x%08x", (
unsigned)wc);
156egcpool_alloc_justified(
const egcpool* pool,
int len){
162 if(poolfree >=
len && poolfree * 10 > pool->
poolsize){
187 if(egcpool_alloc_justified(pool,
len) ||
searched){
206 int curpos = pool->poolwrite;
209 if(curpos == pool->poolsize){
212 if(pool->pool[curpos]){
214 }
else if(curpos && pool->pool[curpos - 1]){
216 }
else if(pool->poolsize - curpos <
len){
217 if(pool->poolwrite > curpos){
223 size_t trial = curpos;
225 if(pool->pool[++trial]){
230 memcpy(pool->pool + curpos,
egc,
len - 1);
231 pool->pool[curpos +
len - 1] =
'\0';
232 pool->poolwrite = curpos +
len;
233 pool->poolused +=
len;
238 if(pool->poolwrite > curpos && pool->poolwrite - (
len - need) < curpos){
241 curpos +=
len - need;
243 }
while(curpos != pool->poolwrite);
254egcpool_release(
egcpool* pool,
int offset){
256 while(pool->
pool[offset]){
257 pool->
pool[offset] =
'\0';
260 assert(offset < pool->poolsize);
277static inline uint32_t
284cell_extended_p(
const nccell*
c){
291 return !cell_extended_p(
c);
298 uint32_t
idx = cell_egc_idx(
c);
#define POOL_MAXIMUM_BYTES
#define POOL_MINIMUM_ALLOC
__attribute__((nonnull(1, 2))) static inline int egcpool_stash(egcpool *pool
#define logerror(fmt,...)
API int API int const nccell unsigned len