| Version 1 (modified by xi, 7 years ago) (diff) |
|---|
Syck C API
Stolen from syck/README.ext, syck/lib/syck.h, syck/lib/syck.c, and syck/lib/emitter.c.
SyckParser?
#include <syck.h> SyckParser *p = syck_new_parser(); /* Creates a new Syck parser. */ void *extension; p.bonus = extension; /* Sets the pointer for extension's use. */ syck_parser_implicit_typing(p, 1); /* Toggles implicit typing of builtin YAML types. Default is on. */ syck_parser_taguri_expansion(p, 1); /* Toggles expansion of types in full taguri. Default is on (recommended). */ SYMID node_handler(SyckParser *p, SyckNode *n); syck_parser_handler(p, node_handler); /* Assign a callback function as a node handler. */ void error_handler(SyckParser *p, char *str); syck_parser_error_handler(p, error_handler); /* Assign a callback function as an error handler. */ SyckNode *bad_anchor_handler(SyckParser *p, char *anchor); syck_parser_bad_anchor_handler(p, bad_anchor_handler); /* Assign a callback function as a bad anchor handler. */ syck_parser_str(p, ptr, len, NULL); /* Assigns a string as the IO source with the default handler. */ /* or */ long io_file_read(char *buf, SyckIoFile *str, long max_size, long skip); syck_parser_file(p, file, io_file_read); /* Assigns a file as the IO source with a callback function. */ SYMID document = syck_parse(p); /* Parses a single document from the YAML stream. */ /* or */ while ((document = syck_parse(p))); /* Parses all documents from the YAML stream. */ syck_free_parser(p); /* Frees the parser. */
SyckIoFileRead?
/* * Default FILE IO function */ long syck_io_file_read( char *buf, SyckIoFile *file, long max_size, long skip ) { long len = 0; ASSERT( file != NULL ); max_size -= skip; len = fread( buf + skip, sizeof( char ), max_size, file->ptr ); len += skip; buf[len] = '\0'; return len; }
SyckNodeHandler?
SyckNode *n; /* ... */ char *type_id = n.type_id; char *anchor = n.anchor; switch (n->kind) { case syck_str_kind: /* Loads a scalar node. */ char *ptr = n->data.str->ptr; long len = n->data.str->ptr; /* ... */ break; case syck_seq_kind: /* Loads a sequence node. */ for (long i = 0; i < syck_seq_count(n); i++) { SYMID val = sym_seq_read(n, i); /* ... */ } break; case syck_map_kind: /* Loads a mapping node. */ for (long i = 0; i < syck_map_count(n); i++) { SYMID key = sym_map_read(n, map_key, i); SYMID val = sym_map_read(n, map_value, i); /* ... */ } break; }
SyckEmitter?
#include <syck.h> SyckEmitter *e = syck_new_emitter(); /* Creates a new Syck emitter. */ void *extension; e.bonus = extension; /* Sets the pointer for extension's use. */ e->headless = 0; /* Headerless doc flag. */ e->use_header = 0; /* Force header? */ e->use_version = 0; /* Force version? */ e->sort_keys = 0; /* Sort hash keys -- not used. */ e->anchor_format = "id%03d"; /* Anchor format -- dangerous. */ e->explicit_typing = 0; /* Explicit typing on all collections? */ e->best_width = 80; /* Best width on folded scalars. */ e->style = scalar_none; /* Use literal or folded blocks on all text? -- scalar_fold or any other value. */ e->indent = 2; /* Default indentation. */ void output_handler(SyckEmitter *e, char *ptr, long len); syck_output_handler(e, output_handler); /* Assign a callback as the output handler */ void emitter_handler(SyckEmitter *e, st_data_t node_id); syck_emitter_handler(e, emitter_handler); /* Assign a callback as the emitter handler */ syck_emitter_ignore_id(e, sym_id); /* Not used. */ st_data_t node_id = 0; syck_emitter_mark_node(e, node_id); /* Add a node to the symbol table. Allocate an anchor if it has repeated. */ /* ... */ syck_emit(e, root_node_id); /* Start emitting from the given node. */ syck_emitter_flush(e, 0); /* Flush the internal buffer. */ /* ... */ syck_free_emitter(e); /* Frees the emitter. */
SyckEmitterHandler?
void emitter_handler(SyckEmitter *e, st_data_t node_id) { /* ... */ syck_emit_scalar(e, tag, style, indent, width, chomp, str, len); /* Emit scalar. */ /* ... */ syck_emit_seq(e, tag, style); /* Emit sequence. */ for (/* ... */) { syck_emit_item(e, item_id); } syck_emit_end(e); /* ... */ syck_emit_map(e, tag, style); /* Emit mapping. */ for (/* ... */) { syck_emit_item(e, key_id); syck_emit_item(e, value_id); } syck_emit_end(e); }
