]> git.proxmox.com Git - ceph.git/blob - ceph/src/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug_fixedbuffer.c
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / civetweb / src / third_party / duktape-1.3.0 / src-separate / duk_debug_fixedbuffer.c
1 /*
2 * Fixed buffer helper useful for debugging, requires no allocation
3 * which is critical for debugging.
4 */
5
6 #include "duk_internal.h"
7
8 #ifdef DUK_USE_DEBUG
9
10 DUK_INTERNAL void duk_fb_put_bytes(duk_fixedbuffer *fb, duk_uint8_t *buffer, duk_size_t length) {
11 duk_size_t avail;
12 duk_size_t copylen;
13
14 avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));
15 if (length > avail) {
16 copylen = avail;
17 fb->truncated = 1;
18 } else {
19 copylen = length;
20 }
21 DUK_MEMCPY(fb->buffer + fb->offset, buffer, copylen);
22 fb->offset += copylen;
23 }
24
25 DUK_INTERNAL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x) {
26 duk_fb_put_bytes(fb, &x, 1);
27 }
28
29 DUK_INTERNAL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x) {
30 duk_fb_put_bytes(fb, (duk_uint8_t *) x, (duk_size_t) DUK_STRLEN(x));
31 }
32
33 DUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) {
34 duk_size_t avail;
35 va_list ap;
36
37 va_start(ap, fmt);
38 avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));
39 if (avail > 0) {
40 duk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap);
41 if (res < 0) {
42 /* error */
43 } else if ((duk_size_t) res >= avail) {
44 /* (maybe) truncated */
45 fb->offset += avail;
46 if ((duk_size_t) res > avail) {
47 /* actual chars dropped (not just NUL term) */
48 fb->truncated = 1;
49 }
50 } else {
51 /* normal */
52 fb->offset += res;
53 }
54 }
55 va_end(ap);
56 }
57
58 DUK_INTERNAL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size) {
59 char buf[64+1];
60 duk_debug_format_funcptr(buf, sizeof(buf), fptr, fptr_size);
61 buf[sizeof(buf) - 1] = (char) 0;
62 duk_fb_put_cstring(fb, buf);
63 }
64
65 DUK_INTERNAL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb) {
66 return (fb->offset >= fb->length);
67 }
68
69 #endif /* DUK_USE_DEBUG */