summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-06-18 10:28:44 +0700
committerAdrian Thurston <thurston@colm.net>2018-06-18 10:28:44 +0700
commit15ad961a04bb7ca85f1e9767239283b93414641e (patch)
treeee6d58a0d50b0858d58af12e9514a278bf5698a8 /src
parentd83bedd9144c55d949993f538a50d2a246a8de92 (diff)
downloadcolm-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.cc42
-rw-r--r--src/input.c95
-rw-r--r--src/input.h74
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