16 yaml_malloc(size_t size);
19 yaml_realloc(void *ptr, size_t size);
24 YAML_DECLARE(yaml_char_t *)
25 yaml_strdup(const yaml_char_t *);
28 * Reader: Ensure that the buffer contains at least `length` characters.
32 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
35 * Scanner: Ensure that the token stack contains at least one token ready.
39 yaml_parser_fetch_more_tokens(yaml_parser_t *parser);
42 * The size of the input raw buffer.
45 #define INPUT_RAW_BUFFER_SIZE 16384
48 * The size of the input buffer.
50 * It should be possible to decode the whole raw buffer.
53 #define INPUT_BUFFER_SIZE (INPUT_RAW_BUFFER_SIZE*3)
56 * The size of the output buffer.
59 #define OUTPUT_BUFFER_SIZE 16384
62 * The size of the output raw buffer.
64 * It should be possible to encode the whole output buffer.
67 #define OUTPUT_RAW_BUFFER_SIZE (OUTPUT_BUFFER_SIZE*2+2)
70 * The size of other stacks and queues.
73 #define INITIAL_STACK_SIZE 16
74 #define INITIAL_QUEUE_SIZE 16
75 #define INITIAL_STRING_SIZE 16
81 #define BUFFER_INIT(context,buffer,size) \
82 (((buffer).start = yaml_malloc(size)) ? \
83 ((buffer).last = (buffer).pointer = (buffer).start, \
84 (buffer).end = (buffer).start+(size), \
86 ((context)->error = YAML_MEMORY_ERROR, \
89 #define BUFFER_DEL(context,buffer) \
90 (yaml_free((buffer).start), \
91 (buffer).start = (buffer).pointer = (buffer).end = 0)
100 yaml_char_t *pointer;
104 yaml_string_extend(yaml_char_t **start,
105 yaml_char_t **pointer, yaml_char_t **end);
109 yaml_char_t **a_start, yaml_char_t **a_pointer, yaml_char_t **a_end,
110 yaml_char_t **b_start, yaml_char_t **b_pointer, yaml_char_t **b_end);
112 #define NULL_STRING { NULL, NULL, NULL }
114 #define STRING_INIT(context,string,size) \
115 (((string).start = yaml_malloc(size)) ? \
116 ((string).pointer = (string).start, \
117 (string).end = (string).start+(size), \
118 memset((string).start, 0, (size)), \
120 ((context)->error = YAML_MEMORY_ERROR, \
123 #define STRING_DEL(context,string) \
124 (yaml_free((string).start), \
125 (string).start = (string).pointer = (string).end = 0)
127 #define STRING_EXTEND(context,string) \
128 (((string).pointer+5 < (string).end) \
129 || yaml_string_extend(&(string).start, \
130 &(string).pointer, &(string).end))
132 #define CLEAR(context,string) \
133 ((string).pointer = (string).start, \
134 memset((string).start, 0, (string).end-(string).start))
136 #define JOIN(context,string_a,string_b) \
137 ((yaml_string_join(&(string_a).start, &(string_a).pointer, \
138 &(string_a).end, &(string_b).start, \
139 &(string_b).pointer, &(string_b).end)) ? \
140 ((string_b).pointer = (string_b).start, \
142 ((context)->error = YAML_MEMORY_ERROR, \
146 * Stack and queue management.
150 yaml_stack_extend(void **start, void **top, void **end);
153 yaml_queue_extend(void **start, void **head, void **tail, void **end);
155 #define STACK_INIT(context,stack,size) \
156 (((stack).start = yaml_malloc((size)*sizeof(*(stack).start))) ? \
157 ((stack).top = (stack).start, \
158 (stack).end = (stack).start+(size), \
160 ((context)->error = YAML_MEMORY_ERROR, \
163 #define STACK_DEL(context,stack) \
164 (yaml_free((stack).start), \
165 (stack).start = (stack).top = (stack).end = 0)
167 #define STACK_EMPTY(context,stack) \
168 ((stack).start == (stack).top)
170 #define PUSH(context,stack,value) \
171 (((stack).top != (stack).end \
172 || yaml_stack_extend((void **)&(stack).start, \
173 (void **)&(stack).top, (void **)&(stack).end)) ? \
174 (*((stack).top++) = value, \
176 ((context)->error = YAML_MEMORY_ERROR, \
179 #define POP(context,stack) \
182 #define QUEUE_INIT(context,queue,size) \
183 (((queue).start = yaml_malloc((size)*sizeof(*(queue).start))) ? \
184 ((queue).head = (queue).tail = (queue).start, \
185 (queue).end = (queue).start+(size), \
187 ((context)->error = YAML_MEMORY_ERROR, \
190 #define QUEUE_DEL(context,queue) \
191 (yaml_free((queue).start), \
192 (queue).start = (queue).head = (queue).tail = (queue).end = 0)
194 #define QUEUE_EMPTY(context,queue) \
195 ((queue).head == (queue).tail)
197 #define ENQUEUE(context,queue,value) \
198 (((queue).tail != (queue).end \
199 || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head, \
200 (void **)&(queue).tail, (void **)&(queue).end)) ? \
201 (*((queue).tail++) = value, \
203 ((context)->error = YAML_MEMORY_ERROR, \
206 #define DEQUEUE(context,queue) \
209 #define QUEUE_INSERT(context,queue,index,value) \
210 (((queue).tail != (queue).end \
211 || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head, \
212 (void **)&(queue).tail, (void **)&(queue).end)) ? \
213 (memmove((queue).head+(index)+1,(queue).head+(index), \
214 ((queue).tail-(queue).head-(index))*sizeof(*(queue).start)), \
215 *((queue).head+(index)) = value, \
218 ((context)->error = YAML_MEMORY_ERROR, \
222 * Token initializers.
225 #define TOKEN_INIT(token,token_type,token_start_mark,token_end_mark) \
226 (memset(&(token), 0, sizeof(yaml_token_t)), \
227 (token).type = (token_type), \
228 (token).start_mark = (token_start_mark), \
229 (token).end_mark = (token_end_mark))
231 #define STREAM_START_TOKEN_INIT(token,token_encoding,start_mark,end_mark) \
232 (TOKEN_INIT((token),YAML_STREAM_START_TOKEN,(start_mark),(end_mark)), \
233 (token).data.stream_start.encoding = (token_encoding))
235 #define STREAM_END_TOKEN_INIT(token,start_mark,end_mark) \
236 (TOKEN_INIT((token),YAML_STREAM_END_TOKEN,(start_mark),(end_mark)))
238 #define ALIAS_TOKEN_INIT(token,token_value,start_mark,end_mark) \
239 (TOKEN_INIT((token),YAML_ALIAS_TOKEN,(start_mark),(end_mark)), \
240 (token).data.alias.value = (token_value))
242 #define ANCHOR_TOKEN_INIT(token,token_value,start_mark,end_mark) \
243 (TOKEN_INIT((token),YAML_ANCHOR_TOKEN,(start_mark),(end_mark)), \
244 (token).data.anchor.value = (token_value))
246 #define TAG_TOKEN_INIT(token,token_handle,token_suffix,start_mark,end_mark) \
247 (TOKEN_INIT((token),YAML_TAG_TOKEN,(start_mark),(end_mark)), \
248 (token).data.tag.handle = (token_handle), \
249 (token).data.tag.suffix = (token_suffix))
251 #define SCALAR_TOKEN_INIT(token,token_value,token_length,token_style,start_mark,end_mark) \
252 (TOKEN_INIT((token),YAML_SCALAR_TOKEN,(start_mark),(end_mark)), \
253 (token).data.scalar.value = (token_value), \
254 (token).data.scalar.length = (token_length), \
255 (token).data.scalar.style = (token_style))
257 #define VERSION_DIRECTIVE_TOKEN_INIT(token,token_major,token_minor,start_mark,end_mark) \
258 (TOKEN_INIT((token),YAML_VERSION_DIRECTIVE_TOKEN,(start_mark),(end_mark)), \
259 (token).data.version_directive.major = (token_major), \
260 (token).data.version_directive.minor = (token_minor))
262 #define TAG_DIRECTIVE_TOKEN_INIT(token,token_handle,token_prefix,start_mark,end_mark) \
263 (TOKEN_INIT((token),YAML_TAG_DIRECTIVE_TOKEN,(start_mark),(end_mark)), \
264 (token).data.tag_directive.handle = (token_handle), \
265 (token).data.tag_directive.prefix = (token_prefix))
268 * Event initializers.
271 #define EVENT_INIT(event,event_type,event_start_mark,event_end_mark) \
272 (memset(&(event), 0, sizeof(yaml_event_t)), \
273 (event).type = (event_type), \
274 (event).start_mark = (event_start_mark), \
275 (event).end_mark = (event_end_mark))
277 #define STREAM_START_EVENT_INIT(event,event_encoding,start_mark,end_mark) \
278 (EVENT_INIT((event),YAML_STREAM_START_EVENT,(start_mark),(end_mark)), \
279 (event).data.stream_start.encoding = (event_encoding))
281 #define STREAM_END_EVENT_INIT(event,start_mark,end_mark) \
282 (EVENT_INIT((event),YAML_STREAM_END_EVENT,(start_mark),(end_mark)))
284 #define DOCUMENT_START_EVENT_INIT(event,event_version_directive, \
285 event_tag_directives_start,event_tag_directives_end,event_implicit,start_mark,end_mark) \
286 (EVENT_INIT((event),YAML_DOCUMENT_START_EVENT,(start_mark),(end_mark)), \
287 (event).data.document_start.version_directive = (event_version_directive), \
288 (event).data.document_start.tag_directives.start = (event_tag_directives_start), \
289 (event).data.document_start.tag_directives.end = (event_tag_directives_end), \
290 (event).data.document_start.implicit = (event_implicit))
292 #define DOCUMENT_END_EVENT_INIT(event,event_implicit,start_mark,end_mark) \
293 (EVENT_INIT((event),YAML_DOCUMENT_END_EVENT,(start_mark),(end_mark)), \
294 (event).data.document_end.implicit = (event_implicit))
296 #define ALIAS_EVENT_INIT(event,event_anchor,start_mark,end_mark) \
297 (EVENT_INIT((event),YAML_ALIAS_EVENT,(start_mark),(end_mark)), \
298 (event).data.alias.anchor = (event_anchor))
300 #define SCALAR_EVENT_INIT(event,event_anchor,event_tag,event_value,event_length, \
301 event_plain_implicit, event_quoted_implicit,event_style,start_mark,end_mark) \
302 (EVENT_INIT((event),YAML_SCALAR_EVENT,(start_mark),(end_mark)), \
303 (event).data.scalar.anchor = (event_anchor), \
304 (event).data.scalar.tag = (event_tag), \
305 (event).data.scalar.value = (event_value), \
306 (event).data.scalar.length = (event_length), \
307 (event).data.scalar.plain_implicit = (event_plain_implicit), \
308 (event).data.scalar.quoted_implicit = (event_quoted_implicit), \
309 (event).data.scalar.style = (event_style))
311 #define SEQUENCE_START_EVENT_INIT(event,event_anchor,event_tag, \
312 event_implicit,event_style,start_mark,end_mark) \
313 (EVENT_INIT((event),YAML_SEQUENCE_START_EVENT,(start_mark),(end_mark)), \
314 (event).data.sequence_start.anchor = (event_anchor), \
315 (event).data.sequence_start.tag = (event_tag), \
316 (event).data.sequence_start.implicit = (event_implicit), \
317 (event).data.sequence_start.style = (event_style))
319 #define SEQUENCE_END_EVENT_INIT(event,start_mark,end_mark) \
320 (EVENT_INIT((event),YAML_SEQUENCE_END_EVENT,(start_mark),(end_mark)))
322 #define MAPPING_START_EVENT_INIT(event,event_anchor,event_tag, \
323 event_implicit,event_style,start_mark,end_mark) \
324 (EVENT_INIT((event),YAML_MAPPING_START_EVENT,(start_mark),(end_mark)), \
325 (event).data.mapping_start.anchor = (event_anchor), \
326 (event).data.mapping_start.tag = (event_tag), \
327 (event).data.mapping_start.implicit = (event_implicit), \
328 (event).data.mapping_start.style = (event_style))
330 #define MAPPING_END_EVENT_INIT(event,start_mark,end_mark) \
331 (EVENT_INIT((event),YAML_MAPPING_END_EVENT,(start_mark),(end_mark)))