Z-YAML-0.1.0.0: cbits/hs_yaml.c
#include "yaml.h"
#include <stdio.h>
yaml_parser_t* hs_init_yaml_parser(){
yaml_parser_t* p = (yaml_parser_t*)malloc(sizeof(yaml_parser_t));
if (p != NULL) {
yaml_parser_initialize(p);
}
return p;
}
void hs_free_yaml_parser(yaml_parser_t* p){
yaml_parser_delete(p);
free(p);
}
typedef struct hs_yaml_buf_s {
unsigned char *buf;
size_t size;
size_t used;
} hs_yaml_buf_t;
int buffer_append(void *ext, unsigned char *str, size_t size)
{
hs_yaml_buf_t *b = ext;
int new_size, new_used;
unsigned char *tmp;
new_used = b->used + size;
for (new_size = b->size ? b->size : 120; new_size < new_used; new_size *= 2);
if (new_size != b->size) {
tmp = realloc(b->buf, new_size);
if (!tmp) return 0;
b->buf = tmp;
b->size = new_size;
}
memcpy(b->buf + b->used, str, size);
b->used = new_used;
return 1;
}
yaml_emitter_t* hs_init_yaml_emitter(int canonical, int indent, int width)
{
yaml_emitter_t* emitter = (yaml_emitter_t*)malloc(sizeof(yaml_emitter_t));
if (!yaml_emitter_initialize(emitter)) return NULL;
hs_yaml_buf_t* buf = (hs_yaml_buf_t*)malloc(sizeof(hs_yaml_buf_t));
if (!buf) {
free(emitter);
return NULL;
} else {
buf->buf = 0;
buf->size = buf->used = 0;
}
yaml_emitter_set_output(emitter, buffer_append, buf);
yaml_emitter_set_encoding(emitter, YAML_UTF8_ENCODING);
yaml_emitter_set_canonical(emitter, canonical);
yaml_emitter_set_width(emitter, width);
yaml_emitter_set_indent(emitter, indent);
return emitter;
}
void hs_free_yaml_emitter(yaml_emitter_t* emitter){
hs_yaml_buf_t *b = (hs_yaml_buf_t*)emitter->write_handler_data;
free(b->buf);
free(b);
yaml_emitter_delete(emitter);
free(emitter);
}
yaml_emitter_t* hs_init_yaml_emitter_file(FILE* f, int canonical, int indent, int width)
{
yaml_emitter_t* emitter = (yaml_emitter_t*)malloc(sizeof(yaml_emitter_t));
if (!yaml_emitter_initialize(emitter)) return NULL;
yaml_emitter_set_output_file(emitter, f);
yaml_emitter_set_encoding(emitter, YAML_UTF8_ENCODING);
yaml_emitter_set_canonical(emitter, canonical);
yaml_emitter_set_width(emitter, width);
yaml_emitter_set_indent(emitter, indent);
return emitter;
}
void hs_free_yaml_emitter_file(yaml_emitter_t* emitter){
yaml_emitter_delete(emitter);
free(emitter);
}
size_t hs_get_yaml_emitter_length(yaml_emitter_t* emitter){
hs_yaml_buf_t *b = (hs_yaml_buf_t*)emitter->write_handler_data;
return b->used;
}
void hs_copy_yaml_emitter_result(yaml_emitter_t* emitter, unsigned char* ptr, size_t len){
hs_yaml_buf_t *b = (hs_yaml_buf_t*)emitter->write_handler_data;
memcpy(ptr, b->buf, len);
}
int hs_yaml_sequence_start_event_initialize(yaml_event_t *event,
const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
yaml_sequence_style_t style) {
if (*anchor == 0) anchor = NULL;
if (*tag == 0) tag = NULL;
return yaml_sequence_start_event_initialize(event, anchor, tag, implicit, style);
}
int hs_yaml_scalar_event_initialize(yaml_event_t *event,
const yaml_char_t *anchor, const yaml_char_t *tag,
const yaml_char_t *value, int off, int length,
int plain_implicit, int quoted_implicit,
yaml_scalar_style_t style){
if (*anchor == 0) anchor = NULL;
if (*tag == 0) tag = NULL;
return yaml_scalar_event_initialize(event, anchor, tag, value+off, length, plain_implicit, quoted_implicit, style);
}
int hs_yaml_mapping_start_event_initialize(yaml_event_t *event,
const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
yaml_mapping_style_t style) {
if (*anchor == 0) anchor = NULL;
if (*tag == 0) tag = NULL;
return yaml_mapping_start_event_initialize(event, anchor, tag, implicit, style);
}
int hs_yaml_document_start(yaml_event_t *e) {
return yaml_document_start_event_initialize
(e,
0,
0,
0,
1);
}