13 const void *sptr,
int ilevel,
16 const char *
const h2c =
"0123456789ABCDEF";
19 char scratch[16 * 3 + 4];
28 if(!st || (!st->
buf && st->
size))
39 for(i = 0; buf < end; buf++, i++) {
40 if(!(i % 16) && (i || st->
size > 16)) {
44 *p++ = h2c[(*buf >> 4) & 0x0F];
45 *p++ = h2c[*buf & 0x0F];
61 #define OSXBT(s) { "\\"s"", sizeof(s) + 1 - 1 }
62 #define OSXUT(s) { "\\u00"s"", sizeof(s) + 4 - 1 }
103 {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
104 {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
105 {0,0},{0,0},{0,0},{0,0},
111 {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
112 {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
113 {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
128 for(i = 0; i < 32 ; i++) {
145 if(control_char >= 0) {
149 st->
buf = (uint8_t *)p;
150 st->
buf[st->
size++] = control_char;
162 const void *sptr,
int ilevel,
169 ssize_t encoded_len = 0;
174 if(!st || (!st->
buf && st->
size))
178 end = buf + st->
size;
180 for(ss = buf; buf < end; buf++) {
181 unsigned int ch = *buf;
190 if(((buf - ss) && cb(ss, buf - ss, app_key) < 0)
193 encoded_len += (buf - ss) + s_len;
198 encoded_len += (buf - ss);
199 if((buf - ss) && cb(ss, buf - ss, app_key) < 0)
218 const char *chunk_stop = (
const char *)chunk_buf;
219 const char *p = chunk_stop;
220 const char *pend = p + chunk_size;
221 unsigned int clv = 0;
226 for (; p < pend; ++p) {
233 for (; pend >= p; --pend) {
237 if (pend - p < 0)
return -1;
238 chunk_size = pend - p;
241 size_t new_size = st->
size + (chunk_size + 1) / 2;
244 st->
buf = (uint8_t *)nptr;
252 for(; p < pend; p++) {
253 int ch = *(
const unsigned char *)p;
256 case 0x0a:
case 0x0c:
case 0x0d:
case 0x20:
258 case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
259 case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
260 clv = (clv << 4) + (ch - 0x30);
262 case 0x41:
case 0x42:
case 0x43:
263 case 0x44:
case 0x45:
case 0x46:
264 clv = (clv << 4) + (ch - 0x41 + 10);
266 case 0x61:
case 0x62:
case 0x63:
267 case 0x64:
case 0x65:
case 0x66:
268 clv = (clv << 4) + (ch - 0x61 + 10);
299 assert(st->
size <= new_size);
302 return (chunk_stop - (
const char *)chunk_buf);
310 const int32_t last_unicode_codepoint = 0x10ffff;
314 for(p = buf; p < end; p++) {
318 case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
319 case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
320 val = val * 16 + (ch - 0x30);
322 case 0x41:
case 0x42:
case 0x43:
323 case 0x44:
case 0x45:
case 0x46:
324 val = val * 16 + (ch - 0x41 + 10);
326 case 0x61:
case 0x62:
case 0x63:
327 case 0x64:
case 0x65:
case 0x66:
328 val = val * 16 + (ch - 0x61 + 10);
335 if(val > last_unicode_codepoint) {
349 size_t chunk_size,
int have_more) {
351 const char *p = (
const char *)chunk_buf;
352 const char *pend = p + chunk_size;
356 for(; p < pend; ++p) {
363 for(; pend >= p; --pend) {
371 size_t new_size = st->
size + (pend - p);
374 st->
buf = (uint8_t *)nptr;
380 for(; p < pend; p++) {
381 int ch = *(
const unsigned char *)p;
392 len = chunk_size - (p - (
const char *)chunk_buf);
393 if(len == 1 )
goto want_more;
400 if(len - 6 < 0)
goto want_more;
408 if(!len)
goto want_more;
409 p += (pval - p) + len - 1;
413 }
else if(val < 0x800) {
414 *buf++ = 0xc0 | ((val >> 6));
415 *buf++ = 0x80 | ((val & 0x3f));
416 }
else if(val < 0x10000) {
417 *buf++ = 0xe0 | ((val >> 12));
418 *buf++ = 0x80 | ((val >> 6) & 0x3f);
419 *buf++ = 0x80 | ((val & 0x3f));
420 }
else if(val < 0x200000) {
421 *buf++ = 0xf0 | ((val >> 18));
422 *buf++ = 0x80 | ((val >> 12) & 0x3f);
423 *buf++ = 0x80 | ((val >> 6) & 0x3f);
424 *buf++ = 0x80 | ((val & 0x3f));
425 }
else if(val < 0x4000000) {
426 *buf++ = 0xf8 | ((val >> 24));
427 *buf++ = 0x80 | ((val >> 18) & 0x3f);
428 *buf++ = 0x80 | ((val >> 12) & 0x3f);
429 *buf++ = 0x80 | ((val >> 6) & 0x3f);
430 *buf++ = 0x80 | ((val & 0x3f));
432 *buf++ = 0xfc | ((val >> 30) & 0x1);
433 *buf++ = 0x80 | ((val >> 24) & 0x3f);
434 *buf++ = 0x80 | ((val >> 18) & 0x3f);
435 *buf++ = 0x80 | ((val >> 12) & 0x3f);
436 *buf++ = 0x80 | ((val >> 6) & 0x3f);
437 *buf++ = 0x80 | ((val & 0x3f));
484 chunk_size = (p - (
const char *)chunk_buf);
490 assert(st->
size <= new_size);
502 void **sptr,
const void *buf_ptr,
size_t size,
503 int (*opt_unexpected_tag_decoder)(
void *struct_ptr,
const void *chunk_buf,
505 ssize_t (*body_receiver)(
void *struct_ptr,
const void *chunk_buf,
506 size_t chunk_size,
int have_more)) {
521 if(!st)
goto sta_failed;
544 opt_unexpected_tag_decoder,
563 const void *buf_ptr,
size_t size) {
576 void **sptr,
const void *buf_ptr,
size_t size) {