From a1e257ec48911d3ca1aaeda0127061c244f36147 Mon Sep 17 00:00:00 2001 From: why Date: Fri, 11 Jul 2003 22:52:14 +0000 Subject: * ext/syck/emitter.c: new emitter code. * ext/syck/rubyext.c: Emitter class. * lib/yaml.rb: Load Syck emitter, if available. * lib/yaml/stream.rb: ditto. * lib/yaml/baseemitter.rb: underlying class for all emitters. * lib/yaml/rubytypes.rb: use BaseEmitter abstraction. * lib/yaml/emitter.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4066 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/syck/syck.h | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 4 deletions(-) (limited to 'ext/syck/syck.h') diff --git a/ext/syck/syck.h b/ext/syck/syck.h index 20ad18a843..259a4cdfbd 100644 --- a/ext/syck/syck.h +++ b/ext/syck/syck.h @@ -10,6 +10,9 @@ #ifndef SYCK_H #define SYCK_H +#define SYCK_YAML_MAJOR 1 +#define SYCK_YAML_MINOR 0 + #define SYCK_VERSION "0.35" #define YAML_DOMAIN "yaml.org,2002" @@ -43,6 +46,7 @@ extern "C" { #endif #define ALLOC_CT 8 +#define SYCK_BUFFERSIZE 262144 #define S_ALLOC_N(type,n) (type*)malloc(sizeof(type)*(n)) #define S_ALLOC(type) (type*)malloc(sizeof(type)) #define S_REALLOC_N(var,type,n) (var)=(type*)realloc((char*)(var),sizeof(type)*(n)) @@ -66,11 +70,7 @@ extern "C" { */ #define SYMID unsigned long -typedef struct _syck_parser SyckParser; -typedef struct _syck_file SyckIoFile; -typedef struct _syck_str SyckIoStr; typedef struct _syck_node SyckNode; -typedef struct _syck_level SyckLevel; enum syck_kind_tag { syck_map_kind, @@ -83,6 +83,9 @@ enum map_part { map_value }; +/* + * Node metadata struct + */ struct _syck_node { /* Symbol table ID */ SYMID id; @@ -119,6 +122,11 @@ struct _syck_node { /* * Parser definitions */ +typedef struct _syck_parser SyckParser; +typedef struct _syck_file SyckIoFile; +typedef struct _syck_str SyckIoStr; +typedef struct _syck_level SyckLevel; + typedef SYMID (*SyckNodeHandler)(SyckParser *, SyckNode *); typedef void (*SyckErrorHandler)(SyckParser *, char *); typedef SyckNode * (*SyckBadAnchorHandler)(SyckParser *, char *); @@ -142,6 +150,9 @@ enum syck_level_status { syck_lvl_pause }; +/* + * Parser struct + */ struct _syck_parser { /* Root node */ SYMID root, root_on_error; @@ -192,6 +203,82 @@ struct _syck_parser { void *bonus; }; +/* + * Emitter definitions + */ +typedef struct _syck_emitter SyckEmitter; +typedef struct _syck_emitter_node SyckEmitterNode; + +typedef void (*SyckOutputHandler)(SyckEmitter *, char *, long); + +enum doc_stage { + doc_open, + doc_need_header, + doc_processing +}; + +enum block_styles { + block_arbitrary, + block_fold, + block_literal +}; + +/* + * Emitter struct + */ +struct _syck_emitter { + /* Headerless doc flag */ + int headless; + /* Sequence map shortcut flag */ + int seq_map; + /* Force header? */ + int use_header; + /* Force version? */ + int use_version; + /* Sort hash keys */ + int sort_keys; + /* Anchor format */ + char *anchor_format; + /* Explicit typing on all collections? */ + int explicit_typing; + /* Best width on folded scalars */ + int best_width; + /* Use literal[1] or folded[2] blocks on all text? */ + enum block_styles block_style; + /* Stage of written document */ + enum doc_stage stage; + /* Level counter */ + int level; + /* Default indentation */ + int indent; + /* Object ignore ID */ + SYMID ignore_id; + /* Symbol table for anchors */ + st_table *markers, *anchors; + /* Custom buffer size */ + size_t bufsize; + /* Buffer */ + char *buffer, *marker; + /* Absolute position of the buffer */ + long bufpos; + /* Handler for output */ + SyckOutputHandler handler; + /* Pointer for extension's use */ + void *bonus; +}; + +/* + * Emitter node metadata struct + */ +struct _syck_emitter_node { + /* Node buffer position */ + long pos; + /* Current indent */ + long indent; + /* Collection? */ + int is_shortcut; +}; + /* * Handler prototypes */ @@ -215,6 +302,15 @@ char *syck_match_implicit( char *, size_t ); char *syck_strndup( char *, long ); long syck_io_file_read( char *, SyckIoFile *, long, long ); long syck_io_str_read( char *, SyckIoStr *, long, long ); +SyckEmitter *syck_new_emitter(); +void syck_emitter_ignore_id( SyckEmitter *, SYMID ); +void syck_emitter_handler( SyckEmitter *, SyckOutputHandler ); +void syck_free_emitter( SyckEmitter * ); +void syck_emitter_clear( SyckEmitter * ); +void syck_emitter_write( SyckEmitter *, char *, long ); +void syck_emitter_flush( SyckEmitter * ); +char *syck_emitter_start_obj( SyckEmitter *, SYMID ); +void syck_emitter_end_obj( SyckEmitter * ); SyckParser *syck_new_parser(); void syck_free_parser( SyckParser * ); void syck_parser_set_root_on_error( SyckParser *, SYMID ); -- cgit v1.2.1