#ifndef YAMLBYTE_H
#define YAMLBYTE_H
#include <stddef.h>
typedef unsigned char yamlbyte_utf8_t;
typedef unsigned short yamlbyte_utf16_t;
#ifdef YAMLBYTE_UTF8
#ifdef YAMLBYTE_UTF16
#error Must only define YAMLBYTE_UTF8 or YAMLBYTE_UTF16
#endif
typedef yamlbyte_utf8_t yamlbyte_char_t;
#else
#ifdef YAMLBYTE_UTF16
typedef yamlbyte_utf16_t yamlbyte_char_t;
#else
#error Must define YAMLBYTE_UTF8 or YAMLBYTE_UTF16
#endif
#endif
#define YAMLBYTE_FINISH ((yamlbyte_char_t) 0)
#define YAMLBYTE_DOCUMENT ((yamlbyte_char_t)'D')
#define YAMLBYTE_DIRECTIVE ((yamlbyte_char_t)'V')
#define YAMLBYTE_PAUSE ((yamlbyte_char_t)'P')
#define YAMLBYTE_MAPPING ((yamlbyte_char_t)'M')
#define YAMLBYTE_SEQUENCE ((yamlbyte_char_t)'Q')
#define YAMLBYTE_END_BRANCH ((yamlbyte_char_t)'E')
#define YAMLBYTE_SCALAR ((yamlbyte_char_t)'S')
#define YAMLBYTE_CONTINUE ((yamlbyte_char_t)'C')
#define YAMLBYTE_NEWLINE ((yamlbyte_char_t)'N')
#define YAMLBYTE_NULLCHAR ((yamlbyte_char_t)'Z')
#define YAMLBYTE_ANCHOR ((yamlbyte_char_t)'A')
#define YAMLBYTE_ALIAS ((yamlbyte_char_t)'R')
#define YAMLBYTE_TRANSFER ((yamlbyte_char_t)'T')
#define YAMLBYTE_COMMENT ((yamlbyte_char_t)'c')
#define YAMLBYTE_INDENT ((yamlbyte_char_t)'i')
#define YAMLBYTE_STYLE ((yamlbyte_char_t)'s')
#define YAMLBYTE_LINE_NUMBER ((yamlbyte_char_t)'#')
#define YAMLBYTE_WHOLE_SCALAR ((yamlbyte_char_t)'<')
#define YAMLBYTE_NOTICE ((yamlbyte_char_t)'!')
#define YAMLBYTE_SPAN ((yamlbyte_char_t)')')
#define YAMLBYTE_ALLOC ((yamlbyte_char_t)'@')
#define YAMLBYTE_FLOW ((yamlbyte_char_t)'>')
#define YAMLBYTE_LITERAL ((yamlbyte_char_t)'|')
#define YAMLBYTE_BLOCK ((yamlbyte_char_t)'b')
#define YAMLBYTE_PLAIN ((yamlbyte_char_t)'p')
#define YAMLBYTE_INLINE_MAPPING ((yamlbyte_char_t)'{')
#define YAMLBYTE_INLINE_SEQUENCE ((yamlbyte_char_t)'[')
#define YAMLBYTE_SINGLE_QUOTED ((yamlbyte_char_t)39)
#define YAMLBYTE_DOUBLE_QUOTED ((yamlbyte_char_t)'"')
typedef void * yamlbyte_consumer_t;
typedef void * yamlbyte_producer_t;
typedef enum {
YAMLBYTE_OK = 0,
YAMLBYTE_E_MEMORY = 'M',
YAMLBYTE_E_READ = 'R',
YAMLBYTE_E_WRITE = 'W',
YAMLBYTE_E_OTHER = '?',
YAMLBYTE_E_PARSE = 'P',
} yamlbyte_result_t;
typedef const yamlbyte_char_t *yamlbyte_buff_t;
typedef struct yaml_instruction {
yamlbyte_char_t bytecode;
yamlbyte_buff_t start;
yamlbyte_buff_t finish;
} *yamlbyte_inst_t;
typedef
yamlbyte_result_t
(*yamlbyte_push_t)(
yamlbyte_consumer_t self,
yamlbyte_inst_t inst
);
typedef
yamlbyte_result_t
(*yamlbyte_pull_t)(
yamlbyte_producer_t self,
yamlbyte_inst_t *inst
);
typedef
yamlbyte_result_t
(*yamlbyte_pushbuff_t)(
yamlbyte_consumer_t self,
yamlbyte_buff_t buff
);
typedef
yamlbyte_result_t
(*yamlbyte_pullbuff_t)(
yamlbyte_producer_t self,
yamlbyte_buff_t *buff
);
#define YAMLBYTE_PULL2PUSH(pull,producer,push,consumer,result) \
do { \
yamlbyte_pullbuff_t _pull = (pull); \
yamlbyte_pushbuff_t _push = (push); \
yamlbyte_result_t _result = YAMLBYTE_OK; \
yamlbyte_producer_t _producer = (producer); \
yamlbyte_consumer_t _consumer = (consumer); \
while(1) { \
yamlbyte_buff_t buff = NULL; \
_result = _pull(_producer,&buff); \
if(YAMLBYTE_OK != result || NULL == buff) \
break; \
_result = _push(_consumer,buff); \
if(YAMLBYTE_OK != result) \
break; \
} \
(result) = _result; \
} while(0)
#endif