1247738Sbapt 2247738Sbapt#if HAVE_CONFIG_H 3247738Sbapt#include <config.h> 4247738Sbapt#endif 5247738Sbapt 6247738Sbapt#include <yaml.h> 7247738Sbapt 8247738Sbapt#include <assert.h> 9247738Sbapt#include <limits.h> 10247738Sbapt 11247738Sbapt/* 12247738Sbapt * Memory management. 13247738Sbapt */ 14247738Sbapt 15247738SbaptYAML_DECLARE(void *) 16247738Sbaptyaml_malloc(size_t size); 17247738Sbapt 18247738SbaptYAML_DECLARE(void *) 19247738Sbaptyaml_realloc(void *ptr, size_t size); 20247738Sbapt 21247738SbaptYAML_DECLARE(void) 22247738Sbaptyaml_free(void *ptr); 23247738Sbapt 24247738SbaptYAML_DECLARE(yaml_char_t *) 25247738Sbaptyaml_strdup(const yaml_char_t *); 26247738Sbapt 27247738Sbapt/* 28247738Sbapt * Reader: Ensure that the buffer contains at least `length` characters. 29247738Sbapt */ 30247738Sbapt 31247738SbaptYAML_DECLARE(int) 32247738Sbaptyaml_parser_update_buffer(yaml_parser_t *parser, size_t length); 33247738Sbapt 34247738Sbapt/* 35247738Sbapt * Scanner: Ensure that the token stack contains at least one token ready. 36247738Sbapt */ 37247738Sbapt 38247738SbaptYAML_DECLARE(int) 39247738Sbaptyaml_parser_fetch_more_tokens(yaml_parser_t *parser); 40247738Sbapt 41247738Sbapt/* 42247738Sbapt * The size of the input raw buffer. 43247738Sbapt */ 44247738Sbapt 45247738Sbapt#define INPUT_RAW_BUFFER_SIZE 16384 46247738Sbapt 47247738Sbapt/* 48247738Sbapt * The size of the input buffer. 49247738Sbapt * 50247738Sbapt * It should be possible to decode the whole raw buffer. 51247738Sbapt */ 52247738Sbapt 53247738Sbapt#define INPUT_BUFFER_SIZE (INPUT_RAW_BUFFER_SIZE*3) 54247738Sbapt 55247738Sbapt/* 56247738Sbapt * The size of the output buffer. 57247738Sbapt */ 58247738Sbapt 59247738Sbapt#define OUTPUT_BUFFER_SIZE 16384 60247738Sbapt 61247738Sbapt/* 62247738Sbapt * The size of the output raw buffer. 63247738Sbapt * 64247738Sbapt * It should be possible to encode the whole output buffer. 65247738Sbapt */ 66247738Sbapt 67247738Sbapt#define OUTPUT_RAW_BUFFER_SIZE (OUTPUT_BUFFER_SIZE*2+2) 68247738Sbapt 69247738Sbapt/* 70247738Sbapt * The size of other stacks and queues. 71247738Sbapt */ 72247738Sbapt 73247738Sbapt#define INITIAL_STACK_SIZE 16 74247738Sbapt#define INITIAL_QUEUE_SIZE 16 75247738Sbapt#define INITIAL_STRING_SIZE 16 76247738Sbapt 77247738Sbapt/* 78247738Sbapt * Buffer management. 79247738Sbapt */ 80247738Sbapt 81247738Sbapt#define BUFFER_INIT(context,buffer,size) \ 82247738Sbapt (((buffer).start = yaml_malloc(size)) ? \ 83247738Sbapt ((buffer).last = (buffer).pointer = (buffer).start, \ 84247738Sbapt (buffer).end = (buffer).start+(size), \ 85247738Sbapt 1) : \ 86247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 87247738Sbapt 0)) 88247738Sbapt 89247738Sbapt#define BUFFER_DEL(context,buffer) \ 90247738Sbapt (yaml_free((buffer).start), \ 91247738Sbapt (buffer).start = (buffer).pointer = (buffer).end = 0) 92247738Sbapt 93247738Sbapt/* 94247738Sbapt * String management. 95247738Sbapt */ 96247738Sbapt 97247738Sbapttypedef struct { 98247738Sbapt yaml_char_t *start; 99247738Sbapt yaml_char_t *end; 100247738Sbapt yaml_char_t *pointer; 101247738Sbapt} yaml_string_t; 102247738Sbapt 103247738SbaptYAML_DECLARE(int) 104247738Sbaptyaml_string_extend(yaml_char_t **start, 105247738Sbapt yaml_char_t **pointer, yaml_char_t **end); 106247738Sbapt 107247738SbaptYAML_DECLARE(int) 108247738Sbaptyaml_string_join( 109247738Sbapt yaml_char_t **a_start, yaml_char_t **a_pointer, yaml_char_t **a_end, 110247738Sbapt yaml_char_t **b_start, yaml_char_t **b_pointer, yaml_char_t **b_end); 111247738Sbapt 112247738Sbapt#define NULL_STRING { NULL, NULL, NULL } 113247738Sbapt 114247738Sbapt#define STRING(string,length) { (string), (string)+(length), (string) } 115247738Sbapt 116247738Sbapt#define STRING_ASSIGN(value,string,length) \ 117247738Sbapt ((value).start = (string), \ 118247738Sbapt (value).end = (string)+(length), \ 119247738Sbapt (value).pointer = (string)) 120247738Sbapt 121247738Sbapt#define STRING_INIT(context,string,size) \ 122247738Sbapt (((string).start = yaml_malloc(size)) ? \ 123247738Sbapt ((string).pointer = (string).start, \ 124247738Sbapt (string).end = (string).start+(size), \ 125247738Sbapt memset((string).start, 0, (size)), \ 126247738Sbapt 1) : \ 127247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 128247738Sbapt 0)) 129247738Sbapt 130247738Sbapt#define STRING_DEL(context,string) \ 131247738Sbapt (yaml_free((string).start), \ 132247738Sbapt (string).start = (string).pointer = (string).end = 0) 133247738Sbapt 134247738Sbapt#define STRING_EXTEND(context,string) \ 135247738Sbapt (((string).pointer+5 < (string).end) \ 136247738Sbapt || yaml_string_extend(&(string).start, \ 137247738Sbapt &(string).pointer, &(string).end)) 138247738Sbapt 139247738Sbapt#define CLEAR(context,string) \ 140247738Sbapt ((string).pointer = (string).start, \ 141247738Sbapt memset((string).start, 0, (string).end-(string).start)) 142247738Sbapt 143247738Sbapt#define JOIN(context,string_a,string_b) \ 144247738Sbapt ((yaml_string_join(&(string_a).start, &(string_a).pointer, \ 145247738Sbapt &(string_a).end, &(string_b).start, \ 146247738Sbapt &(string_b).pointer, &(string_b).end)) ? \ 147247738Sbapt ((string_b).pointer = (string_b).start, \ 148247738Sbapt 1) : \ 149247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 150247738Sbapt 0)) 151247738Sbapt 152247738Sbapt/* 153247738Sbapt * String check operations. 154247738Sbapt */ 155247738Sbapt 156247738Sbapt/* 157247738Sbapt * Check the octet at the specified position. 158247738Sbapt */ 159247738Sbapt 160247738Sbapt#define CHECK_AT(string,octet,offset) \ 161247738Sbapt ((string).pointer[offset] == (yaml_char_t)(octet)) 162247738Sbapt 163247738Sbapt/* 164247738Sbapt * Check the current octet in the buffer. 165247738Sbapt */ 166247738Sbapt 167247738Sbapt#define CHECK(string,octet) CHECK_AT((string),(octet),0) 168247738Sbapt 169247738Sbapt/* 170247738Sbapt * Check if the character at the specified position is an alphabetical 171247738Sbapt * character, a digit, '_', or '-'. 172247738Sbapt */ 173247738Sbapt 174247738Sbapt#define IS_ALPHA_AT(string,offset) \ 175247738Sbapt (((string).pointer[offset] >= (yaml_char_t) '0' && \ 176247738Sbapt (string).pointer[offset] <= (yaml_char_t) '9') || \ 177247738Sbapt ((string).pointer[offset] >= (yaml_char_t) 'A' && \ 178247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'Z') || \ 179247738Sbapt ((string).pointer[offset] >= (yaml_char_t) 'a' && \ 180247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'z') || \ 181247738Sbapt (string).pointer[offset] == '_' || \ 182247738Sbapt (string).pointer[offset] == '-') 183247738Sbapt 184247738Sbapt#define IS_ALPHA(string) IS_ALPHA_AT((string),0) 185247738Sbapt 186247738Sbapt/* 187247738Sbapt * Check if the character at the specified position is a digit. 188247738Sbapt */ 189247738Sbapt 190247738Sbapt#define IS_DIGIT_AT(string,offset) \ 191247738Sbapt (((string).pointer[offset] >= (yaml_char_t) '0' && \ 192247738Sbapt (string).pointer[offset] <= (yaml_char_t) '9')) 193247738Sbapt 194247738Sbapt#define IS_DIGIT(string) IS_DIGIT_AT((string),0) 195247738Sbapt 196247738Sbapt/* 197247738Sbapt * Get the value of a digit. 198247738Sbapt */ 199247738Sbapt 200247738Sbapt#define AS_DIGIT_AT(string,offset) \ 201247738Sbapt ((string).pointer[offset] - (yaml_char_t) '0') 202247738Sbapt 203247738Sbapt#define AS_DIGIT(string) AS_DIGIT_AT((string),0) 204247738Sbapt 205247738Sbapt/* 206247738Sbapt * Check if the character at the specified position is a hex-digit. 207247738Sbapt */ 208247738Sbapt 209247738Sbapt#define IS_HEX_AT(string,offset) \ 210247738Sbapt (((string).pointer[offset] >= (yaml_char_t) '0' && \ 211247738Sbapt (string).pointer[offset] <= (yaml_char_t) '9') || \ 212247738Sbapt ((string).pointer[offset] >= (yaml_char_t) 'A' && \ 213247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'F') || \ 214247738Sbapt ((string).pointer[offset] >= (yaml_char_t) 'a' && \ 215247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'f')) 216247738Sbapt 217247738Sbapt#define IS_HEX(string) IS_HEX_AT((string),0) 218247738Sbapt 219247738Sbapt/* 220247738Sbapt * Get the value of a hex-digit. 221247738Sbapt */ 222247738Sbapt 223247738Sbapt#define AS_HEX_AT(string,offset) \ 224247738Sbapt (((string).pointer[offset] >= (yaml_char_t) 'A' && \ 225247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'F') ? \ 226247738Sbapt ((string).pointer[offset] - (yaml_char_t) 'A' + 10) : \ 227247738Sbapt ((string).pointer[offset] >= (yaml_char_t) 'a' && \ 228247738Sbapt (string).pointer[offset] <= (yaml_char_t) 'f') ? \ 229247738Sbapt ((string).pointer[offset] - (yaml_char_t) 'a' + 10) : \ 230247738Sbapt ((string).pointer[offset] - (yaml_char_t) '0')) 231247738Sbapt 232247738Sbapt#define AS_HEX(string) AS_HEX_AT((string),0) 233247738Sbapt 234247738Sbapt/* 235247738Sbapt * Check if the character is ASCII. 236247738Sbapt */ 237247738Sbapt 238247738Sbapt#define IS_ASCII_AT(string,offset) \ 239247738Sbapt ((string).pointer[offset] <= (yaml_char_t) '\x7F') 240247738Sbapt 241247738Sbapt#define IS_ASCII(string) IS_ASCII_AT((string),0) 242247738Sbapt 243247738Sbapt/* 244247738Sbapt * Check if the character can be printed unescaped. 245247738Sbapt */ 246247738Sbapt 247247738Sbapt#define IS_PRINTABLE_AT(string,offset) \ 248247738Sbapt (((string).pointer[offset] == 0x0A) /* . == #x0A */ \ 249247738Sbapt || ((string).pointer[offset] >= 0x20 /* #x20 <= . <= #x7E */ \ 250247738Sbapt && (string).pointer[offset] <= 0x7E) \ 251247738Sbapt || ((string).pointer[offset] == 0xC2 /* #0xA0 <= . <= #xD7FF */ \ 252247738Sbapt && (string).pointer[offset+1] >= 0xA0) \ 253247738Sbapt || ((string).pointer[offset] > 0xC2 \ 254247738Sbapt && (string).pointer[offset] < 0xED) \ 255247738Sbapt || ((string).pointer[offset] == 0xED \ 256247738Sbapt && (string).pointer[offset+1] < 0xA0) \ 257247738Sbapt || ((string).pointer[offset] == 0xEE) \ 258247738Sbapt || ((string).pointer[offset] == 0xEF /* #xE000 <= . <= #xFFFD */ \ 259247738Sbapt && !((string).pointer[offset+1] == 0xBB /* && . != #xFEFF */ \ 260247738Sbapt && (string).pointer[offset+2] == 0xBF) \ 261247738Sbapt && !((string).pointer[offset+1] == 0xBF \ 262247738Sbapt && ((string).pointer[offset+2] == 0xBE \ 263247738Sbapt || (string).pointer[offset+2] == 0xBF)))) 264247738Sbapt 265247738Sbapt#define IS_PRINTABLE(string) IS_PRINTABLE_AT((string),0) 266247738Sbapt 267247738Sbapt/* 268247738Sbapt * Check if the character at the specified position is NUL. 269247738Sbapt */ 270247738Sbapt 271247738Sbapt#define IS_Z_AT(string,offset) CHECK_AT((string),'\0',(offset)) 272247738Sbapt 273247738Sbapt#define IS_Z(string) IS_Z_AT((string),0) 274247738Sbapt 275247738Sbapt/* 276247738Sbapt * Check if the character at the specified position is BOM. 277247738Sbapt */ 278247738Sbapt 279247738Sbapt#define IS_BOM_AT(string,offset) \ 280247738Sbapt (CHECK_AT((string),'\xEF',(offset)) \ 281247738Sbapt && CHECK_AT((string),'\xBB',(offset)+1) \ 282247738Sbapt && CHECK_AT((string),'\xBF',(offset)+2)) /* BOM (#xFEFF) */ 283247738Sbapt 284247738Sbapt#define IS_BOM(string) IS_BOM_AT(string,0) 285247738Sbapt 286247738Sbapt/* 287247738Sbapt * Check if the character at the specified position is space. 288247738Sbapt */ 289247738Sbapt 290247738Sbapt#define IS_SPACE_AT(string,offset) CHECK_AT((string),' ',(offset)) 291247738Sbapt 292247738Sbapt#define IS_SPACE(string) IS_SPACE_AT((string),0) 293247738Sbapt 294247738Sbapt/* 295247738Sbapt * Check if the character at the specified position is tab. 296247738Sbapt */ 297247738Sbapt 298247738Sbapt#define IS_TAB_AT(string,offset) CHECK_AT((string),'\t',(offset)) 299247738Sbapt 300247738Sbapt#define IS_TAB(string) IS_TAB_AT((string),0) 301247738Sbapt 302247738Sbapt/* 303247738Sbapt * Check if the character at the specified position is blank (space or tab). 304247738Sbapt */ 305247738Sbapt 306247738Sbapt#define IS_BLANK_AT(string,offset) \ 307247738Sbapt (IS_SPACE_AT((string),(offset)) || IS_TAB_AT((string),(offset))) 308247738Sbapt 309247738Sbapt#define IS_BLANK(string) IS_BLANK_AT((string),0) 310247738Sbapt 311247738Sbapt/* 312247738Sbapt * Check if the character at the specified position is a line break. 313247738Sbapt */ 314247738Sbapt 315247738Sbapt#define IS_BREAK_AT(string,offset) \ 316247738Sbapt (CHECK_AT((string),'\r',(offset)) /* CR (#xD)*/ \ 317247738Sbapt || CHECK_AT((string),'\n',(offset)) /* LF (#xA) */ \ 318247738Sbapt || (CHECK_AT((string),'\xC2',(offset)) \ 319247738Sbapt && CHECK_AT((string),'\x85',(offset)+1)) /* NEL (#x85) */ \ 320247738Sbapt || (CHECK_AT((string),'\xE2',(offset)) \ 321247738Sbapt && CHECK_AT((string),'\x80',(offset)+1) \ 322247738Sbapt && CHECK_AT((string),'\xA8',(offset)+2)) /* LS (#x2028) */ \ 323247738Sbapt || (CHECK_AT((string),'\xE2',(offset)) \ 324247738Sbapt && CHECK_AT((string),'\x80',(offset)+1) \ 325247738Sbapt && CHECK_AT((string),'\xA9',(offset)+2))) /* PS (#x2029) */ 326247738Sbapt 327247738Sbapt#define IS_BREAK(string) IS_BREAK_AT((string),0) 328247738Sbapt 329247738Sbapt#define IS_CRLF_AT(string,offset) \ 330247738Sbapt (CHECK_AT((string),'\r',(offset)) && CHECK_AT((string),'\n',(offset)+1)) 331247738Sbapt 332247738Sbapt#define IS_CRLF(string) IS_CRLF_AT((string),0) 333247738Sbapt 334247738Sbapt/* 335247738Sbapt * Check if the character is a line break or NUL. 336247738Sbapt */ 337247738Sbapt 338247738Sbapt#define IS_BREAKZ_AT(string,offset) \ 339247738Sbapt (IS_BREAK_AT((string),(offset)) || IS_Z_AT((string),(offset))) 340247738Sbapt 341247738Sbapt#define IS_BREAKZ(string) IS_BREAKZ_AT((string),0) 342247738Sbapt 343247738Sbapt/* 344247738Sbapt * Check if the character is a line break, space, or NUL. 345247738Sbapt */ 346247738Sbapt 347247738Sbapt#define IS_SPACEZ_AT(string,offset) \ 348247738Sbapt (IS_SPACE_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset))) 349247738Sbapt 350247738Sbapt#define IS_SPACEZ(string) IS_SPACEZ_AT((string),0) 351247738Sbapt 352247738Sbapt/* 353247738Sbapt * Check if the character is a line break, space, tab, or NUL. 354247738Sbapt */ 355247738Sbapt 356247738Sbapt#define IS_BLANKZ_AT(string,offset) \ 357247738Sbapt (IS_BLANK_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset))) 358247738Sbapt 359247738Sbapt#define IS_BLANKZ(string) IS_BLANKZ_AT((string),0) 360247738Sbapt 361247738Sbapt/* 362247738Sbapt * Determine the width of the character. 363247738Sbapt */ 364247738Sbapt 365247738Sbapt#define WIDTH_AT(string,offset) \ 366247738Sbapt (((string).pointer[offset] & 0x80) == 0x00 ? 1 : \ 367247738Sbapt ((string).pointer[offset] & 0xE0) == 0xC0 ? 2 : \ 368247738Sbapt ((string).pointer[offset] & 0xF0) == 0xE0 ? 3 : \ 369247738Sbapt ((string).pointer[offset] & 0xF8) == 0xF0 ? 4 : 0) 370247738Sbapt 371247738Sbapt#define WIDTH(string) WIDTH_AT((string),0) 372247738Sbapt 373247738Sbapt/* 374247738Sbapt * Move the string pointer to the next character. 375247738Sbapt */ 376247738Sbapt 377247738Sbapt#define MOVE(string) ((string).pointer += WIDTH((string))) 378247738Sbapt 379247738Sbapt/* 380247738Sbapt * Copy a character and move the pointers of both strings. 381247738Sbapt */ 382247738Sbapt 383247738Sbapt#define COPY(string_a,string_b) \ 384247738Sbapt ((*(string_b).pointer & 0x80) == 0x00 ? \ 385247738Sbapt (*((string_a).pointer++) = *((string_b).pointer++)) : \ 386247738Sbapt (*(string_b).pointer & 0xE0) == 0xC0 ? \ 387247738Sbapt (*((string_a).pointer++) = *((string_b).pointer++), \ 388247738Sbapt *((string_a).pointer++) = *((string_b).pointer++)) : \ 389247738Sbapt (*(string_b).pointer & 0xF0) == 0xE0 ? \ 390247738Sbapt (*((string_a).pointer++) = *((string_b).pointer++), \ 391247738Sbapt *((string_a).pointer++) = *((string_b).pointer++), \ 392247738Sbapt *((string_a).pointer++) = *((string_b).pointer++)) : \ 393247738Sbapt (*(string_b).pointer & 0xF8) == 0xF0 ? \ 394247738Sbapt (*((string_a).pointer++) = *((string_b).pointer++), \ 395247738Sbapt *((string_a).pointer++) = *((string_b).pointer++), \ 396247738Sbapt *((string_a).pointer++) = *((string_b).pointer++), \ 397247738Sbapt *((string_a).pointer++) = *((string_b).pointer++)) : 0) 398247738Sbapt 399247738Sbapt/* 400247738Sbapt * Stack and queue management. 401247738Sbapt */ 402247738Sbapt 403247738SbaptYAML_DECLARE(int) 404247738Sbaptyaml_stack_extend(void **start, void **top, void **end); 405247738Sbapt 406247738SbaptYAML_DECLARE(int) 407247738Sbaptyaml_queue_extend(void **start, void **head, void **tail, void **end); 408247738Sbapt 409247738Sbapt#define STACK_INIT(context,stack,size) \ 410247738Sbapt (((stack).start = yaml_malloc((size)*sizeof(*(stack).start))) ? \ 411247738Sbapt ((stack).top = (stack).start, \ 412247738Sbapt (stack).end = (stack).start+(size), \ 413247738Sbapt 1) : \ 414247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 415247738Sbapt 0)) 416247738Sbapt 417247738Sbapt#define STACK_DEL(context,stack) \ 418247738Sbapt (yaml_free((stack).start), \ 419247738Sbapt (stack).start = (stack).top = (stack).end = 0) 420247738Sbapt 421247738Sbapt#define STACK_EMPTY(context,stack) \ 422247738Sbapt ((stack).start == (stack).top) 423247738Sbapt 424247738Sbapt#define PUSH(context,stack,value) \ 425247738Sbapt (((stack).top != (stack).end \ 426247738Sbapt || yaml_stack_extend((void **)&(stack).start, \ 427247738Sbapt (void **)&(stack).top, (void **)&(stack).end)) ? \ 428247738Sbapt (*((stack).top++) = value, \ 429247738Sbapt 1) : \ 430247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 431247738Sbapt 0)) 432247738Sbapt 433247738Sbapt#define POP(context,stack) \ 434247738Sbapt (*(--(stack).top)) 435247738Sbapt 436247738Sbapt#define QUEUE_INIT(context,queue,size) \ 437247738Sbapt (((queue).start = yaml_malloc((size)*sizeof(*(queue).start))) ? \ 438247738Sbapt ((queue).head = (queue).tail = (queue).start, \ 439247738Sbapt (queue).end = (queue).start+(size), \ 440247738Sbapt 1) : \ 441247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 442247738Sbapt 0)) 443247738Sbapt 444247738Sbapt#define QUEUE_DEL(context,queue) \ 445247738Sbapt (yaml_free((queue).start), \ 446247738Sbapt (queue).start = (queue).head = (queue).tail = (queue).end = 0) 447247738Sbapt 448247738Sbapt#define QUEUE_EMPTY(context,queue) \ 449247738Sbapt ((queue).head == (queue).tail) 450247738Sbapt 451247738Sbapt#define ENQUEUE(context,queue,value) \ 452247738Sbapt (((queue).tail != (queue).end \ 453247738Sbapt || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head, \ 454247738Sbapt (void **)&(queue).tail, (void **)&(queue).end)) ? \ 455247738Sbapt (*((queue).tail++) = value, \ 456247738Sbapt 1) : \ 457247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 458247738Sbapt 0)) 459247738Sbapt 460247738Sbapt#define DEQUEUE(context,queue) \ 461247738Sbapt (*((queue).head++)) 462247738Sbapt 463247738Sbapt#define QUEUE_INSERT(context,queue,index,value) \ 464247738Sbapt (((queue).tail != (queue).end \ 465247738Sbapt || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head, \ 466247738Sbapt (void **)&(queue).tail, (void **)&(queue).end)) ? \ 467247738Sbapt (memmove((queue).head+(index)+1,(queue).head+(index), \ 468247738Sbapt ((queue).tail-(queue).head-(index))*sizeof(*(queue).start)), \ 469247738Sbapt *((queue).head+(index)) = value, \ 470247738Sbapt (queue).tail++, \ 471247738Sbapt 1) : \ 472247738Sbapt ((context)->error = YAML_MEMORY_ERROR, \ 473247738Sbapt 0)) 474247738Sbapt 475247738Sbapt/* 476247738Sbapt * Token initializers. 477247738Sbapt */ 478247738Sbapt 479247738Sbapt#define TOKEN_INIT(token,token_type,token_start_mark,token_end_mark) \ 480247738Sbapt (memset(&(token), 0, sizeof(yaml_token_t)), \ 481247738Sbapt (token).type = (token_type), \ 482247738Sbapt (token).start_mark = (token_start_mark), \ 483247738Sbapt (token).end_mark = (token_end_mark)) 484247738Sbapt 485247738Sbapt#define STREAM_START_TOKEN_INIT(token,token_encoding,start_mark,end_mark) \ 486247738Sbapt (TOKEN_INIT((token),YAML_STREAM_START_TOKEN,(start_mark),(end_mark)), \ 487247738Sbapt (token).data.stream_start.encoding = (token_encoding)) 488247738Sbapt 489247738Sbapt#define STREAM_END_TOKEN_INIT(token,start_mark,end_mark) \ 490247738Sbapt (TOKEN_INIT((token),YAML_STREAM_END_TOKEN,(start_mark),(end_mark))) 491247738Sbapt 492247738Sbapt#define ALIAS_TOKEN_INIT(token,token_value,start_mark,end_mark) \ 493247738Sbapt (TOKEN_INIT((token),YAML_ALIAS_TOKEN,(start_mark),(end_mark)), \ 494247738Sbapt (token).data.alias.value = (token_value)) 495247738Sbapt 496247738Sbapt#define ANCHOR_TOKEN_INIT(token,token_value,start_mark,end_mark) \ 497247738Sbapt (TOKEN_INIT((token),YAML_ANCHOR_TOKEN,(start_mark),(end_mark)), \ 498247738Sbapt (token).data.anchor.value = (token_value)) 499247738Sbapt 500247738Sbapt#define TAG_TOKEN_INIT(token,token_handle,token_suffix,start_mark,end_mark) \ 501247738Sbapt (TOKEN_INIT((token),YAML_TAG_TOKEN,(start_mark),(end_mark)), \ 502247738Sbapt (token).data.tag.handle = (token_handle), \ 503247738Sbapt (token).data.tag.suffix = (token_suffix)) 504247738Sbapt 505247738Sbapt#define SCALAR_TOKEN_INIT(token,token_value,token_length,token_style,start_mark,end_mark) \ 506247738Sbapt (TOKEN_INIT((token),YAML_SCALAR_TOKEN,(start_mark),(end_mark)), \ 507247738Sbapt (token).data.scalar.value = (token_value), \ 508247738Sbapt (token).data.scalar.length = (token_length), \ 509247738Sbapt (token).data.scalar.style = (token_style)) 510247738Sbapt 511247738Sbapt#define VERSION_DIRECTIVE_TOKEN_INIT(token,token_major,token_minor,start_mark,end_mark) \ 512247738Sbapt (TOKEN_INIT((token),YAML_VERSION_DIRECTIVE_TOKEN,(start_mark),(end_mark)), \ 513247738Sbapt (token).data.version_directive.major = (token_major), \ 514247738Sbapt (token).data.version_directive.minor = (token_minor)) 515247738Sbapt 516247738Sbapt#define TAG_DIRECTIVE_TOKEN_INIT(token,token_handle,token_prefix,start_mark,end_mark) \ 517247738Sbapt (TOKEN_INIT((token),YAML_TAG_DIRECTIVE_TOKEN,(start_mark),(end_mark)), \ 518247738Sbapt (token).data.tag_directive.handle = (token_handle), \ 519247738Sbapt (token).data.tag_directive.prefix = (token_prefix)) 520247738Sbapt 521247738Sbapt/* 522247738Sbapt * Event initializers. 523247738Sbapt */ 524247738Sbapt 525247738Sbapt#define EVENT_INIT(event,event_type,event_start_mark,event_end_mark) \ 526247738Sbapt (memset(&(event), 0, sizeof(yaml_event_t)), \ 527247738Sbapt (event).type = (event_type), \ 528247738Sbapt (event).start_mark = (event_start_mark), \ 529247738Sbapt (event).end_mark = (event_end_mark)) 530247738Sbapt 531247738Sbapt#define STREAM_START_EVENT_INIT(event,event_encoding,start_mark,end_mark) \ 532247738Sbapt (EVENT_INIT((event),YAML_STREAM_START_EVENT,(start_mark),(end_mark)), \ 533247738Sbapt (event).data.stream_start.encoding = (event_encoding)) 534247738Sbapt 535247738Sbapt#define STREAM_END_EVENT_INIT(event,start_mark,end_mark) \ 536247738Sbapt (EVENT_INIT((event),YAML_STREAM_END_EVENT,(start_mark),(end_mark))) 537247738Sbapt 538247738Sbapt#define DOCUMENT_START_EVENT_INIT(event,event_version_directive, \ 539247738Sbapt event_tag_directives_start,event_tag_directives_end,event_implicit,start_mark,end_mark) \ 540247738Sbapt (EVENT_INIT((event),YAML_DOCUMENT_START_EVENT,(start_mark),(end_mark)), \ 541247738Sbapt (event).data.document_start.version_directive = (event_version_directive), \ 542247738Sbapt (event).data.document_start.tag_directives.start = (event_tag_directives_start), \ 543247738Sbapt (event).data.document_start.tag_directives.end = (event_tag_directives_end), \ 544247738Sbapt (event).data.document_start.implicit = (event_implicit)) 545247738Sbapt 546247738Sbapt#define DOCUMENT_END_EVENT_INIT(event,event_implicit,start_mark,end_mark) \ 547247738Sbapt (EVENT_INIT((event),YAML_DOCUMENT_END_EVENT,(start_mark),(end_mark)), \ 548247738Sbapt (event).data.document_end.implicit = (event_implicit)) 549247738Sbapt 550247738Sbapt#define ALIAS_EVENT_INIT(event,event_anchor,start_mark,end_mark) \ 551247738Sbapt (EVENT_INIT((event),YAML_ALIAS_EVENT,(start_mark),(end_mark)), \ 552247738Sbapt (event).data.alias.anchor = (event_anchor)) 553247738Sbapt 554247738Sbapt#define SCALAR_EVENT_INIT(event,event_anchor,event_tag,event_value,event_length, \ 555247738Sbapt event_plain_implicit, event_quoted_implicit,event_style,start_mark,end_mark) \ 556247738Sbapt (EVENT_INIT((event),YAML_SCALAR_EVENT,(start_mark),(end_mark)), \ 557247738Sbapt (event).data.scalar.anchor = (event_anchor), \ 558247738Sbapt (event).data.scalar.tag = (event_tag), \ 559247738Sbapt (event).data.scalar.value = (event_value), \ 560247738Sbapt (event).data.scalar.length = (event_length), \ 561247738Sbapt (event).data.scalar.plain_implicit = (event_plain_implicit), \ 562247738Sbapt (event).data.scalar.quoted_implicit = (event_quoted_implicit), \ 563247738Sbapt (event).data.scalar.style = (event_style)) 564247738Sbapt 565247738Sbapt#define SEQUENCE_START_EVENT_INIT(event,event_anchor,event_tag, \ 566247738Sbapt event_implicit,event_style,start_mark,end_mark) \ 567247738Sbapt (EVENT_INIT((event),YAML_SEQUENCE_START_EVENT,(start_mark),(end_mark)), \ 568247738Sbapt (event).data.sequence_start.anchor = (event_anchor), \ 569247738Sbapt (event).data.sequence_start.tag = (event_tag), \ 570247738Sbapt (event).data.sequence_start.implicit = (event_implicit), \ 571247738Sbapt (event).data.sequence_start.style = (event_style)) 572247738Sbapt 573247738Sbapt#define SEQUENCE_END_EVENT_INIT(event,start_mark,end_mark) \ 574247738Sbapt (EVENT_INIT((event),YAML_SEQUENCE_END_EVENT,(start_mark),(end_mark))) 575247738Sbapt 576247738Sbapt#define MAPPING_START_EVENT_INIT(event,event_anchor,event_tag, \ 577247738Sbapt event_implicit,event_style,start_mark,end_mark) \ 578247738Sbapt (EVENT_INIT((event),YAML_MAPPING_START_EVENT,(start_mark),(end_mark)), \ 579247738Sbapt (event).data.mapping_start.anchor = (event_anchor), \ 580247738Sbapt (event).data.mapping_start.tag = (event_tag), \ 581247738Sbapt (event).data.mapping_start.implicit = (event_implicit), \ 582247738Sbapt (event).data.mapping_start.style = (event_style)) 583247738Sbapt 584247738Sbapt#define MAPPING_END_EVENT_INIT(event,start_mark,end_mark) \ 585247738Sbapt (EVENT_INIT((event),YAML_MAPPING_END_EVENT,(start_mark),(end_mark))) 586247738Sbapt 587247738Sbapt/* 588247738Sbapt * Document initializer. 589247738Sbapt */ 590247738Sbapt 591247738Sbapt#define DOCUMENT_INIT(document,document_nodes_start,document_nodes_end, \ 592247738Sbapt document_version_directive,document_tag_directives_start, \ 593247738Sbapt document_tag_directives_end,document_start_implicit, \ 594247738Sbapt document_end_implicit,document_start_mark,document_end_mark) \ 595247738Sbapt (memset(&(document), 0, sizeof(yaml_document_t)), \ 596247738Sbapt (document).nodes.start = (document_nodes_start), \ 597247738Sbapt (document).nodes.end = (document_nodes_end), \ 598247738Sbapt (document).nodes.top = (document_nodes_start), \ 599247738Sbapt (document).version_directive = (document_version_directive), \ 600247738Sbapt (document).tag_directives.start = (document_tag_directives_start), \ 601247738Sbapt (document).tag_directives.end = (document_tag_directives_end), \ 602247738Sbapt (document).start_implicit = (document_start_implicit), \ 603247738Sbapt (document).end_implicit = (document_end_implicit), \ 604247738Sbapt (document).start_mark = (document_start_mark), \ 605247738Sbapt (document).end_mark = (document_end_mark)) 606247738Sbapt 607247738Sbapt/* 608247738Sbapt * Node initializers. 609247738Sbapt */ 610247738Sbapt 611247738Sbapt#define NODE_INIT(node,node_type,node_tag,node_start_mark,node_end_mark) \ 612247738Sbapt (memset(&(node), 0, sizeof(yaml_node_t)), \ 613247738Sbapt (node).type = (node_type), \ 614247738Sbapt (node).tag = (node_tag), \ 615247738Sbapt (node).start_mark = (node_start_mark), \ 616247738Sbapt (node).end_mark = (node_end_mark)) 617247738Sbapt 618247738Sbapt#define SCALAR_NODE_INIT(node,node_tag,node_value,node_length, \ 619247738Sbapt node_style,start_mark,end_mark) \ 620247738Sbapt (NODE_INIT((node),YAML_SCALAR_NODE,(node_tag),(start_mark),(end_mark)), \ 621247738Sbapt (node).data.scalar.value = (node_value), \ 622247738Sbapt (node).data.scalar.length = (node_length), \ 623247738Sbapt (node).data.scalar.style = (node_style)) 624247738Sbapt 625247738Sbapt#define SEQUENCE_NODE_INIT(node,node_tag,node_items_start,node_items_end, \ 626247738Sbapt node_style,start_mark,end_mark) \ 627247738Sbapt (NODE_INIT((node),YAML_SEQUENCE_NODE,(node_tag),(start_mark),(end_mark)), \ 628247738Sbapt (node).data.sequence.items.start = (node_items_start), \ 629247738Sbapt (node).data.sequence.items.end = (node_items_end), \ 630247738Sbapt (node).data.sequence.items.top = (node_items_start), \ 631247738Sbapt (node).data.sequence.style = (node_style)) 632247738Sbapt 633247738Sbapt#define MAPPING_NODE_INIT(node,node_tag,node_pairs_start,node_pairs_end, \ 634247738Sbapt node_style,start_mark,end_mark) \ 635247738Sbapt (NODE_INIT((node),YAML_MAPPING_NODE,(node_tag),(start_mark),(end_mark)), \ 636247738Sbapt (node).data.mapping.pairs.start = (node_pairs_start), \ 637247738Sbapt (node).data.mapping.pairs.end = (node_pairs_end), \ 638247738Sbapt (node).data.mapping.pairs.top = (node_pairs_start), \ 639247738Sbapt (node).data.mapping.style = (node_style)) 640247738Sbapt 641