38
38
39
39
#define YAJL_BUF_INIT_SIZE 2048
40
40
41
+ typedef enum {
42
+ yajl_buf_ok = 0 ,
43
+ yajl_buf_alloc_failed ,
44
+ yajl_buf_overflow
45
+ } yajl_buf_state ;
46
+
41
47
struct yajl_buf_t {
48
+ yajl_buf_state state ;
42
49
unsigned int len ;
43
50
unsigned int used ;
44
51
unsigned char * data ;
45
52
yajl_alloc_funcs * alloc ;
46
53
};
47
54
55
+ #include <stdio.h>
56
+
57
+ static
58
+ yajl_buf_state yajl_buf_set_error (yajl_buf buf , yajl_buf_state err )
59
+ {
60
+ buf -> state = err ;
61
+
62
+ // free and clear all data from the buffer
63
+ YA_FREE (buf -> alloc , buf -> data );
64
+ buf -> len = 0 ;
65
+ buf -> data = 0 ;
66
+ buf -> used = 0 ;
67
+
68
+ return err ;
69
+ }
70
+
48
71
static
49
- void yajl_buf_ensure_available (yajl_buf buf , unsigned int want )
72
+ yajl_buf_state yajl_buf_ensure_available (yajl_buf buf , unsigned int want )
50
73
{
51
74
unsigned int need ;
52
75
53
76
assert (buf != NULL );
54
77
78
+ if (buf -> state != yajl_buf_ok ) {
79
+ return buf -> state ;
80
+ }
81
+
55
82
/* first call */
56
83
if (buf -> data == NULL ) {
57
84
buf -> len = YAJL_BUF_INIT_SIZE ;
58
85
buf -> data = (unsigned char * ) YA_MALLOC (buf -> alloc , buf -> len );
86
+ if (buf -> data == NULL ) {
87
+ return yajl_buf_set_error (buf , yajl_buf_overflow );
88
+ }
89
+
59
90
buf -> data [0 ] = 0 ;
60
91
}
61
92
93
+ if (want == 0 ) {
94
+ return yajl_buf_ok ;
95
+ }
96
+
62
97
need = buf -> len ;
63
98
64
99
while (want >= (need - buf -> used )) need <<= 1 ;
65
100
101
+ // overflow
102
+ if (need == 0 ) {
103
+ return yajl_buf_set_error (buf , yajl_buf_overflow );
104
+ }
105
+
66
106
if (need != buf -> len ) {
67
107
buf -> data = (unsigned char * ) YA_REALLOC (buf -> alloc , buf -> data , need );
108
+
109
+ if (buf -> data == NULL ) {
110
+ return yajl_buf_set_error (buf , yajl_buf_overflow );
111
+ }
112
+
68
113
buf -> len = need ;
69
114
}
115
+
116
+ return yajl_buf_ok ;
70
117
}
71
118
72
119
yajl_buf yajl_buf_alloc (yajl_alloc_funcs * alloc )
@@ -86,7 +133,9 @@ void yajl_buf_free(yajl_buf buf)
86
133
87
134
void yajl_buf_append (yajl_buf buf , const void * data , unsigned int len )
88
135
{
89
- yajl_buf_ensure_available (buf , len );
136
+ if (yajl_buf_ensure_available (buf , len )) {
137
+ return ;
138
+ }
90
139
if (len > 0 ) {
91
140
assert (data != NULL );
92
141
memcpy (buf -> data + buf -> used , data , len );
0 commit comments