X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fgetl.c;h=e2452c548f171ea120b61fae44562482d53e851b;hb=9f553490fb222c0fd4337e3479683776db98fd05;hp=200e07e36972ea5712f947d64836b306b7fe8bb1;hpb=8381768f3394a907c621cb9acbb77b83f5cd4875;p=pspp-builds.git diff --git a/src/libpspp/getl.c b/src/libpspp/getl.c index 200e07e3..e2452c54 100644 --- a/src/libpspp/getl.c +++ b/src/libpspp/getl.c @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -18,7 +17,6 @@ 02110-1301, USA. */ #include - #include #include "getl.h" @@ -28,8 +26,6 @@ #include #include -#include - struct getl_source { struct getl_source *included_from; /* File that this is nested inside. */ @@ -40,66 +36,74 @@ struct getl_source struct getl_interface *interface; }; -/* List of source files. */ -static struct ll_list sources ; +struct source_stream + { + struct ll_list sources ; /* List of source files. */ -static struct string the_include_path; + struct string the_include_path; + }; const char * -getl_include_path (void) +getl_include_path (const struct source_stream *ss) { - return ds_cstr (&the_include_path); + return ds_cstr (&ss->the_include_path); } static struct getl_source * -current_source (struct ll_list *list) +current_source (const struct source_stream *ss) { - const struct ll *ll = ll_head (list); + const struct ll *ll = ll_head (&ss->sources); return ll_data (ll, struct getl_source, ll ); } /* Initialize getl. */ -void -getl_initialize (void) +struct source_stream * +create_source_stream (const char *initial_include_path) { - ll_init (&sources); - ds_init_cstr (&the_include_path, + struct source_stream *ss = xzalloc (sizeof (*ss)); + ll_init (&ss->sources); +#if 0 + ds_init_cstr (&ss->the_include_path, fn_getenv_default ("STAT_INCLUDE_PATH", include_path)); +#endif + ds_init_cstr (&ss->the_include_path, initial_include_path); + + return ss; } /* Delete everything from the include path. */ void -getl_clear_include_path (void) +getl_clear_include_path (struct source_stream *ss) { - ds_clear (&the_include_path); + ds_clear (&ss->the_include_path); } /* Add to the include path. */ void -getl_add_include_dir (const char *path) +getl_add_include_dir (struct source_stream *ss, const char *path) { - if (ds_length (&the_include_path)) - ds_put_char (&the_include_path, ':'); + if (ds_length (&ss->the_include_path)) + ds_put_char (&ss->the_include_path, ':'); - ds_put_cstr (&the_include_path, path); + ds_put_cstr (&ss->the_include_path, path); } /* Appends source S to the list of source files. */ void -getl_append_source (struct getl_interface *i) +getl_append_source (struct source_stream *ss, struct getl_interface *i) { struct getl_source *s = xzalloc (sizeof ( struct getl_source )); s->interface = i ; - ll_push_head (&sources, &s->ll); + ll_push_head (&ss->sources, &s->ll); } /* Nests source S within the current source file. */ void -getl_include_source (struct getl_interface *i) +getl_include_source (struct source_stream *ss, struct getl_interface *i) { - struct getl_source *current = current_source (&sources); + struct getl_source *current = current_source (ss); struct getl_source *s = xzalloc (sizeof ( struct getl_source )); s->interface = i; @@ -108,23 +112,23 @@ getl_include_source (struct getl_interface *i) s->includes = NULL; current->includes = s; - ll_push_head (&sources, &s->ll); + ll_push_head (&ss->sources, &s->ll); } /* Closes the current source, and move the current source to the next file in the chain. */ static void -close_source (void) +close_source (struct source_stream *ss) { - struct getl_source *s = current_source (&sources); + struct getl_source *s = current_source (ss); if ( s->interface->close ) s->interface->close (s->interface); - ll_pop_head (&sources); + ll_pop_head (&ss->sources); if (s->included_from != NULL) - current_source (&sources)->includes = NULL; + current_source (ss)->includes = NULL; free (s); } @@ -132,25 +136,25 @@ close_source (void) /* Closes all sources until an interactive source is encountered. */ void -getl_abort_noninteractive (void) +getl_abort_noninteractive (struct source_stream *ss) { - while ( ! ll_is_empty (&sources)) + while ( ! ll_is_empty (&ss->sources)) { - const struct getl_source *s = current_source (&sources); + const struct getl_source *s = current_source (ss); if ( !s->interface->interactive (s->interface) ) - close_source (); + close_source (ss); } } /* Returns true if the current source is interactive, false otherwise. */ bool -getl_is_interactive (void) +getl_is_interactive (const struct source_stream *ss) { - const struct getl_source *s = current_source (&sources); + const struct getl_source *s = current_source (ss); - if (ll_is_empty (&sources) ) + if (ll_is_empty (&ss->sources) ) return false; return s->interface->interactive (s->interface); @@ -159,11 +163,11 @@ getl_is_interactive (void) /* Returns the name of the current source, or NULL if there is no current source */ const char * -getl_source_name (void) +getl_source_name (const struct source_stream *ss) { - const struct getl_source *s = current_source (&sources); + const struct getl_source *s = current_source (ss); - if ( ll_is_empty (&sources) ) + if ( ll_is_empty (&ss->sources) ) return NULL; if ( ! s->interface->name ) @@ -175,11 +179,11 @@ getl_source_name (void) /* Returns the location within the current source, or -1 if there is no current source */ int -getl_source_location (void) +getl_source_location (const struct source_stream *ss) { - const struct getl_source *s = current_source (&sources); + const struct getl_source *s = current_source (ss); - if ( ll_is_empty (&sources) ) + if ( ll_is_empty (&ss->sources) ) return -1; if ( !s->interface->location ) @@ -191,11 +195,13 @@ getl_source_location (void) /* Close getl. */ void -getl_uninitialize (void) +destroy_source_stream (struct source_stream *ss) { - while ( !ll_is_empty (&sources)) - close_source (); - ds_destroy (&the_include_path); + while ( !ll_is_empty (&ss->sources)) + close_source (ss); + ds_destroy (&ss->the_include_path); + + free (ss); } @@ -203,11 +209,12 @@ getl_uninitialize (void) Returns true when a line has been read, false at end of input. On success, sets *SYNTAX to the style of the syntax read. */ bool -do_read_line (struct string *line, enum getl_syntax *syntax) +getl_read_line (struct source_stream *ss, struct string *line, + enum getl_syntax *syntax) { - while (!ll_is_empty (&sources)) + while (!ll_is_empty (&ss->sources)) { - struct getl_source *s = current_source (&sources); + struct getl_source *s = current_source (ss); ds_clear (line); if (s->interface->read (s->interface, line, syntax)) @@ -218,10 +225,10 @@ do_read_line (struct string *line, enum getl_syntax *syntax) s->interface->filter (s->interface, line, *syntax); s = s->included_from; } - + return true; } - close_source (); + close_source (ss); } return false;