diff options
author | Adrian Thurston <thurston@colm.net> | 2018-06-18 10:28:44 +0700 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2018-06-18 10:28:44 +0700 |
commit | 15ad961a04bb7ca85f1e9767239283b93414641e (patch) | |
tree | ee6d58a0d50b0858d58af12e9514a278bf5698a8 /src | |
parent | d83bedd9144c55d949993f538a50d2a246a8de92 (diff) | |
download | colm-15ad961a04bb7ca85f1e9767239283b93414641e.tar.gz |
use a define to declare multiple stream funcs
Using this technique so we don't need to cast individual functions and don't
lose type checking on the signatures.
Diffstat (limited to 'src')
-rw-r--r-- | src/ctinput.cc | 42 | ||||
-rw-r--r-- | src/input.c | 95 | ||||
-rw-r--r-- | src/input.h | 74 |
3 files changed, 102 insertions, 109 deletions
diff --git a/src/ctinput.cc b/src/ctinput.cc index 6aea70ce..d85c5d44 100644 --- a/src/ctinput.cc +++ b/src/ctinput.cc @@ -34,8 +34,10 @@ using std::cerr; using std::endl; -extern stream_funcs patternFuncs; -extern stream_funcs replFuncs; +DEF_STREAM_FUNCS( stream_funcs_ct, stream_impl_ct ); + +extern stream_funcs_ct patternFuncs; +extern stream_funcs_ct replFuncs; struct stream_impl_ct { @@ -65,7 +67,7 @@ struct stream_impl *colm_impl_new_pat( char *name, Pattern *pattern ) memset( ss, 0, sizeof(struct stream_impl_ct) ); ss->pattern = pattern; ss->pat_item = pattern->list->head; - ss->funcs = &patternFuncs; + ss->funcs = (struct stream_funcs*)&patternFuncs; return (struct stream_impl*) ss; } @@ -225,17 +227,17 @@ int inputStreamPatternUndoConsumeData( struct stream_impl_ct *ss, const char *da return length; } -stream_funcs patternFuncs = +stream_funcs_ct patternFuncs = { - (destructor_t) &inputStreamPatternDestructor, - (get_parse_block_t) &inputStreamPatternGetParseBlock, - (get_data_t) &inputStreamPatternGetData, - (consume_data_t) &inputStreamPatternConsumeData, - (undo_consume_data_t) &inputStreamPatternUndoConsumeData, + &inputStreamPatternDestructor, + &inputStreamPatternGetParseBlock, + &inputStreamPatternGetData, + &inputStreamPatternConsumeData, + &inputStreamPatternUndoConsumeData, 0, 0, - (consume_lang_el_t) &inputStreamPatternGetLangEl, - (undo_consume_lang_el_t) &inputStreamPatternUndoConsumeLangEl, + &inputStreamPatternGetLangEl, + &inputStreamPatternUndoConsumeLangEl, }; @@ -249,7 +251,7 @@ struct stream_impl *colm_impl_new_cons( char *name, Constructor *constructor ) memset( ss, 0, sizeof(struct stream_impl_ct) ); ss->constructor = constructor; ss->cons_item = constructor->list->head; - ss->funcs = &replFuncs; + ss->funcs = (struct stream_funcs*)&replFuncs; return (struct stream_impl*)ss; } @@ -435,17 +437,17 @@ int inputStreamConsUndoConsumeData( struct stream_impl_ct *ss, const char *data, return origLen; } -stream_funcs replFuncs = +stream_funcs_ct replFuncs = { - (destructor_t) &inputStreamConsDestructor, - (get_parse_block_t) &inputStreamConsGetParseBlock, - (get_data_t) &inputStreamConsGetData, - (consume_data_t) &inputStreamConsConsumeData, - (undo_consume_data_t) &inputStreamConsUndoConsumeData, + &inputStreamConsDestructor, + &inputStreamConsGetParseBlock, + &inputStreamConsGetData, + &inputStreamConsConsumeData, + &inputStreamConsUndoConsumeData, 0, 0, - (consume_lang_el_t) &inputStreamConsGetLangEl, - (undo_consume_lang_el_t) &inputStreamConsUndoConsumeLangEl, + &inputStreamConsGetLangEl, + &inputStreamConsUndoConsumeLangEl, }; void pushBinding( pda_run *pdaRun, parse_tree_t *parseTree ) diff --git a/src/input.c b/src/input.c index 24e02a40..40052573 100644 --- a/src/input.c +++ b/src/input.c @@ -79,9 +79,12 @@ void init_file_funcs(); void init_pat_funcs(); void init_cons_funcs(); -extern struct stream_funcs stream_funcs; -extern struct stream_funcs file_funcs; -extern struct stream_funcs text_funcs; +DEF_STREAM_FUNCS( stream_funcs_seq, stream_impl_seq ); +DEF_STREAM_FUNCS( stream_funcs_data, stream_impl_data ); + +extern struct stream_funcs_seq stream_funcs; +extern struct stream_funcs_data file_funcs; +extern struct stream_funcs_data text_funcs; static bool loc_set( location_t *loc ) { @@ -1138,59 +1141,59 @@ static tree_t *stream_undo_append_stream( struct stream_impl_seq *is ) return tree; } -struct stream_funcs stream_funcs = +struct stream_funcs_seq stream_funcs = { - (destructor_t) &stream_destructor, - (get_parse_block_t) &stream_get_parse_block, - (get_data_t) &stream_get_data, - (consume_data_t) &stream_consume_data, - (undo_consume_data_t) &stream_undo_consume_data, - (consume_tree_t) &stream_consume_tree, - (undo_consume_tree_t) &stream_undo_consume_tree, - (consume_lang_el_t) &stream_consume_lang_el, - (undo_consume_lang_el_t) &stream_undo_consume_lang_el, + &stream_destructor, + &stream_get_parse_block, + &stream_get_data, + &stream_consume_data, + &stream_undo_consume_data, + &stream_consume_tree, + &stream_undo_consume_tree, + &stream_consume_lang_el, + &stream_undo_consume_lang_el, 0, // source data get, not needed. - (set_eof_t) &stream_set_eof, - (unset_eof_t) &stream_unset_eof, - (prepend_data_t) &stream_prepend_data, - (prepend_tree_t) &stream_prepend_tree, - (prepend_stream_t) &stream_prepend_stream, - (undo_prepend_data_t) &stream_seq_undo_prepend_data, - (undo_prepend_tree_t) &stream_undo_prepend_tree, - (undo_prepend_stream_t) 0, // fixme: _add this. - (append_data_t) &stream_append_data, - (append_tree_t) &stream_append_tree, - (append_stream_t) &stream_append_stream, - (undo_append_data_t) &stream_undo_append_data, - (undo_append_tree_t) &stream_undo_append_tree, - (undo_append_stream_t) &stream_undo_append_stream, + &stream_set_eof, + &stream_unset_eof, + &stream_prepend_data, + &stream_prepend_tree, + &stream_prepend_stream, + &stream_seq_undo_prepend_data, + &stream_undo_prepend_tree, + 0, // fixme: _add this. + &stream_append_data, + &stream_append_tree, + &stream_append_stream, + &stream_undo_append_data, + &stream_undo_append_tree, + &stream_undo_append_stream, }; -struct stream_funcs file_funcs = +struct stream_funcs_data file_funcs = { - .destructor = (destructor_t) &data_destructor, - .get_parse_block = (get_parse_block_t) &data_get_parse_block, - .get_data = (get_data_t) &data_get_data, - .consume_data = (consume_data_t) &data_consume_data, - .undo_consume_data = (undo_consume_data_t) &data_undo_consume_data, - .get_data_source = (get_data_source_t) &file_get_data_source, + .destructor = &data_destructor, + .get_parse_block = &data_get_parse_block, + .get_data = &data_get_data, + .consume_data = &data_consume_data, + .undo_consume_data = &data_undo_consume_data, + .get_data_source = &file_get_data_source, }; -struct stream_funcs text_funcs = +struct stream_funcs_data text_funcs = { - .destructor = (destructor_t) &data_destructor, - .get_parse_block = (get_parse_block_t) &data_get_parse_block, - .get_data = (get_data_t) &data_get_data, - .consume_data = (consume_data_t) &data_consume_data, - .undo_consume_data = (undo_consume_data_t) &data_undo_consume_data, - .get_data_source = (get_data_source_t) &text_get_data_source, + .destructor = &data_destructor, + .get_parse_block = &data_get_parse_block, + .get_data = &data_get_data, + .consume_data = &data_consume_data, + .undo_consume_data = &data_undo_consume_data, + .get_data_source = &text_get_data_source, }; static struct stream_impl *colm_impl_new_file( char *name, FILE *file ) { struct stream_impl_data *ss = (struct stream_impl_data*)malloc(sizeof(struct stream_impl_data)); init_stream_impl_data( ss, name ); - ss->funcs = &file_funcs; + ss->funcs = (struct stream_funcs*)&file_funcs; ss->file = file; return (struct stream_impl*)ss; } @@ -1199,7 +1202,7 @@ static struct stream_impl *colm_impl_new_fd( char *name, long fd ) { struct stream_impl_data *si = (struct stream_impl_data*)malloc(sizeof(struct stream_impl_data)); init_stream_impl_data( si, name ); - si->funcs = &file_funcs; + si->funcs = (struct stream_funcs*)&file_funcs; si->file = fdopen( fd, ( fd == 0 ) ? "r" : "w" ); return (struct stream_impl*)si; } @@ -1208,7 +1211,7 @@ static struct stream_impl *colm_impl_new_text( char *name, const char *data, int { struct stream_impl_data *si = (struct stream_impl_data*)malloc(sizeof(struct stream_impl_data)); init_stream_impl_data( si, name ); - si->funcs = &text_funcs; + si->funcs = (struct stream_funcs*)&text_funcs; char *buf = (char*)malloc( len ); memcpy( buf, data, len ); @@ -1223,7 +1226,7 @@ struct stream_impl *colm_impl_new_generic( char *name ) { struct stream_impl_seq *ss = (struct stream_impl_seq*)malloc(sizeof(struct stream_impl_seq)); init_stream_impl_seq( ss, name ); - ss->funcs = &stream_funcs; + ss->funcs = (struct stream_funcs*)&stream_funcs; return (struct stream_impl*)ss; } @@ -1231,7 +1234,7 @@ struct stream_impl *colm_impl_new_collect( char *name ) { struct stream_impl_seq *ss = (struct stream_impl_seq*)malloc(sizeof(struct stream_impl_seq)); init_stream_impl_seq( ss, name ); - ss->funcs = &stream_funcs; + ss->funcs = (struct stream_funcs*)&stream_funcs; ss->collect = (StrCollect*) malloc( sizeof( StrCollect ) ); init_str_collect( ss->collect ); return (struct stream_impl*)ss; diff --git a/src/input.h b/src/input.h index b3a80614..39c5c7b8 100644 --- a/src/input.h +++ b/src/input.h @@ -75,8 +75,10 @@ struct run_buf struct run_buf *new_run_buf( int sz ); +/* Deleting a stream impl. */ typedef void (*destructor_t)( struct stream_impl *si ); +/* Main get of items. */ typedef int (*get_parse_block_t)( struct stream_impl *si, int skip, char **pdp, int *copied ); /* Probably this should be replaced with get_parse_block calls. */ @@ -122,50 +124,36 @@ typedef struct colm_tree *(*undo_append_data_t)( struct stream_impl *si, int len typedef struct colm_tree *(*undo_append_tree_t)( struct stream_impl *si ); typedef struct colm_tree *(*undo_append_stream_t)( struct stream_impl *si ); -struct stream_funcs -{ - destructor_t destructor; - - int (*get_parse_block)( struct stream_impl *si, int skip, char **pdp, int *copied ); - - int (*get_data)( struct stream_impl *si, char *dest, int length ); - - int (*consume_data)( struct stream_impl *si, int length, struct colm_location *loc ); - int (*undo_consume_data)( struct stream_impl *si, const char *data, int length ); - - struct colm_tree *(*consume_tree)( struct stream_impl *si ); - void (*undo_consume_tree)( struct stream_impl *si, - struct colm_tree *tree, int ignore ); - - /* Language elments (compile-time). */ - struct LangEl *(*consume_lang_el)( struct stream_impl *si, - long *bind_id, char **data, long *length ); - void (*undo_consume_lang_el)( struct stream_impl *si ); - - /* Private implmentation for some shared get data functions. */ - int (*get_data_source)( struct stream_impl *si, char *dest, int length ); - - void (*set_eof)( struct stream_impl *si ); - void (*unset_eof)( struct stream_impl *si ); - - /* Prepending to a stream. */ - void (*prepend_data)( struct stream_impl *si, const char *data, long len ); - void (*prepend_tree)( struct stream_impl *si, struct colm_tree *tree, int ignore ); - void (*prepend_stream)( struct stream_impl *si, struct colm_stream *stream ); - - int (*undo_prepend_data)( struct stream_impl *si, int length ); - struct colm_tree *(*undo_prepend_tree)( struct stream_impl *si ); - struct colm_tree *(*undo_prepend_stream)( struct stream_impl *si ); - - /* Appending to a stream. */ - void (*append_data)( struct stream_impl *si, const char *data, long len ); - void (*append_tree)( struct stream_impl *si, struct colm_tree *tree ); - void (*append_stream)( struct stream_impl *si, struct colm_stream *stream ); +#define DEF_STREAM_FUNCS( stream_funcs, stream_impl ) \ +struct stream_funcs \ +{ \ + void (*destructor)( struct stream_impl *si ); \ + int (*get_parse_block)( struct stream_impl *si, int skip, char **pdp, int *copied ); \ + int (*get_data)( struct stream_impl *si, char *dest, int length ); \ + int (*consume_data)( struct stream_impl *si, int length, struct colm_location *loc ); \ + int (*undo_consume_data)( struct stream_impl *si, const char *data, int length ); \ + struct colm_tree *(*consume_tree)( struct stream_impl *si ); \ + void (*undo_consume_tree)( struct stream_impl *si, struct colm_tree *tree, int ignore ); \ + struct LangEl *(*consume_lang_el)( struct stream_impl *si, long *bind_id, char **data, long *length ); \ + void (*undo_consume_lang_el)( struct stream_impl *si ); \ + int (*get_data_source)( struct stream_impl *si, char *dest, int length ); \ + void (*set_eof)( struct stream_impl *si ); \ + void (*unset_eof)( struct stream_impl *si ); \ + void (*prepend_data)( struct stream_impl *si, const char *data, long len ); \ + void (*prepend_tree)( struct stream_impl *si, struct colm_tree *tree, int ignore ); \ + void (*prepend_stream)( struct stream_impl *si, struct colm_stream *stream ); \ + int (*undo_prepend_data)( struct stream_impl *si, int length ); \ + struct colm_tree *(*undo_prepend_tree)( struct stream_impl *si ); \ + struct colm_tree *(*undo_prepend_stream)( struct stream_impl *si ); \ + void (*append_data)( struct stream_impl *si, const char *data, long len ); \ + void (*append_tree)( struct stream_impl *si, struct colm_tree *tree ); \ + void (*append_stream)( struct stream_impl *si, struct colm_stream *stream ); \ + struct colm_tree *(*undo_append_data)( struct stream_impl *si, int length ); \ + struct colm_tree *(*undo_append_tree)( struct stream_impl *si ); \ + struct colm_tree *(*undo_append_stream)( struct stream_impl *si ); \ +} - struct colm_tree *(*undo_append_data)( struct stream_impl *si, int length ); - struct colm_tree *(*undo_append_tree)( struct stream_impl *si ); - struct colm_tree *(*undo_append_stream)( struct stream_impl *si ); -}; +DEF_STREAM_FUNCS( stream_funcs, stream_impl ); /* List of source streams. Enables streams to be pushed/popped. */ struct stream_impl |