From 0d01f7bd35591882cd13b6352409858ea33d39f7 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 19 Apr 2009 18:05:48 +0800 Subject: [PATCH] Separate the execute_syntax function into its own file. --- src/ui/gui/automake.mk | 2 + src/ui/gui/comments-dialog.c | 2 +- src/ui/gui/compute-dialog.c | 2 +- src/ui/gui/crosstabs-dialog.c | 2 +- src/ui/gui/descriptives-dialog.c | 2 +- src/ui/gui/examine-dialog.c | 2 +- src/ui/gui/executor.c | 110 ++++++++++++++++++ src/ui/gui/executor.h | 28 +++++ src/ui/gui/frequencies-dialog.c | 2 +- src/ui/gui/helper.c | 95 +-------------- src/ui/gui/helper.h | 4 - src/ui/gui/oneway-anova-dialog.c | 2 +- src/ui/gui/psppire-data-editor.c | 2 +- src/ui/gui/psppire-data-window.c | 1 + src/ui/gui/psppire-syntax-window.c | 1 + src/ui/gui/psppire.c | 2 +- src/ui/gui/rank-dialog.c | 2 +- src/ui/gui/recode-dialog.c | 4 +- src/ui/gui/regression-dialog.c | 3 +- src/ui/gui/reliability-dialog.c | 1 + src/ui/gui/select-cases-dialog.c | 2 +- src/ui/gui/sort-cases-dialog.c | 2 +- src/ui/gui/split-file-dialog.c | 2 +- .../gui/t-test-independent-samples-dialog.c | 2 +- src/ui/gui/t-test-one-sample.c | 1 + src/ui/gui/t-test-paired-samples.c | 2 + src/ui/gui/text-data-import-dialog.c | 2 +- src/ui/gui/transpose-dialog.c | 2 +- src/ui/gui/weight-cases-dialog.c | 2 +- 29 files changed, 169 insertions(+), 117 deletions(-) create mode 100644 src/ui/gui/executor.c create mode 100644 src/ui/gui/executor.h diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index ce3d664c..110ef43f 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -124,6 +124,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/dict-display.c \ src/ui/gui/examine-dialog.c \ src/ui/gui/examine-dialog.h \ + src/ui/gui/executor.c \ + src/ui/gui/executor.h \ src/ui/gui/find-dialog.c \ src/ui/gui/find-dialog.h \ src/ui/gui/frequencies-dialog.c \ diff --git a/src/ui/gui/comments-dialog.c b/src/ui/gui/comments-dialog.c index 49d143cb..923953a1 100644 --- a/src/ui/gui/comments-dialog.c +++ b/src/ui/gui/comments-dialog.c @@ -21,7 +21,7 @@ #include "psppire-data-window.h" #include "psppire-data-editor.h" #include -#include "helper.h" +#include "executor.h" #include "psppire-var-store.h" #include diff --git a/src/ui/gui/compute-dialog.c b/src/ui/gui/compute-dialog.c index a42ce4fe..183aa31b 100644 --- a/src/ui/gui/compute-dialog.c +++ b/src/ui/gui/compute-dialog.c @@ -28,7 +28,7 @@ #include #include -#include "helper.h" +#include "executor.h" static void function_list_populate (GtkTreeView *tv); diff --git a/src/ui/gui/crosstabs-dialog.c b/src/ui/gui/crosstabs-dialog.c index 2c71ddef..f5593586 100644 --- a/src/ui/gui/crosstabs-dialog.c +++ b/src/ui/gui/crosstabs-dialog.c @@ -26,7 +26,7 @@ #include #include #include -#include "helper.h" +#include "executor.h" #include #include #include diff --git a/src/ui/gui/descriptives-dialog.c b/src/ui/gui/descriptives-dialog.c index 7b9a9584..a867fe01 100644 --- a/src/ui/gui/descriptives-dialog.c +++ b/src/ui/gui/descriptives-dialog.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include "executor.h" #include "gettext.h" #define _(msgid) gettext (msgid) diff --git a/src/ui/gui/examine-dialog.c b/src/ui/gui/examine-dialog.c index 1d894475..13ef847a 100644 --- a/src/ui/gui/examine-dialog.c +++ b/src/ui/gui/examine-dialog.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include "executor.h" #include "gettext.h" #define _(msgid) gettext (msgid) diff --git a/src/ui/gui/executor.c b/src/ui/gui/executor.c new file mode 100644 index 00000000..711e9563 --- /dev/null +++ b/src/ui/gui/executor.c @@ -0,0 +1,110 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2007, 2009 Free Software Foundation + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "executor.h" +#include "psppire-data-store.h" +#include +#include +#include +#include +#include +#include +#include "psppire-output-window.h" + +extern struct dataset *the_dataset; +extern struct source_stream *the_source_stream; +extern PsppireDataStore *the_data_store; + +/* Lazy casereader callback function used by execute_syntax. */ +static struct casereader * +create_casereader_from_data_store (void *data_store_) +{ + PsppireDataStore *data_store = data_store_; + return psppire_data_store_get_reader (data_store); +} + +gboolean +execute_syntax (struct getl_interface *sss) +{ + struct lexer *lexer; + gboolean retval = TRUE; + + struct casereader *reader; + size_t value_cnt; + casenumber case_cnt; + unsigned long int lazy_serial; + + /* When the user executes a number of snippets of syntax in a + row, none of which read from the active file, the GUI becomes + progressively less responsive. The reason is that each syntax + execution encapsulates the active file data in another + datasheet layer. The cumulative effect of having a number of + layers of datasheets wastes time and space. + + To solve the problem, we use a "lazy casereader", a wrapper + around the casereader obtained from the data store, that + only actually instantiates that casereader when it is + needed. If the data store casereader is never needed, then + it is reused the next time syntax is run, without wrapping + it in another layer. */ + value_cnt = psppire_data_store_get_value_count (the_data_store); + case_cnt = psppire_data_store_get_case_count (the_data_store); + reader = lazy_casereader_create (value_cnt, case_cnt, + create_casereader_from_data_store, + the_data_store, &lazy_serial); + proc_set_active_file_data (the_dataset, reader); + + g_return_val_if_fail (proc_has_active_file (the_dataset), FALSE); + + lexer = lex_create (the_source_stream); + + getl_append_source (the_source_stream, sss, GETL_BATCH, ERRMODE_CONTINUE); + + for (;;) + { + enum cmd_result result = cmd_parse (lexer, the_dataset); + + if ( cmd_result_is_failure (result)) + { + retval = FALSE; + if ( source_stream_current_error_mode (the_source_stream) + == ERRMODE_STOP ) + break; + } + + if ( result == CMD_EOF || result == CMD_FINISH) + break; + } + + getl_abort_noninteractive (the_source_stream); + + lex_destroy (lexer); + + psppire_dict_replace_dictionary (the_data_store->dict, + dataset_dict (the_dataset)); + + reader = proc_extract_active_file_data (the_dataset); + if (!lazy_casereader_destroy (reader, lazy_serial)) + psppire_data_store_set_reader (the_data_store, reader); + + som_flush (); + + psppire_output_window_reload (); + + return retval; +} diff --git a/src/ui/gui/executor.h b/src/ui/gui/executor.h new file mode 100644 index 00000000..40925bee --- /dev/null +++ b/src/ui/gui/executor.h @@ -0,0 +1,28 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2007, 2009 Free Software Foundation + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#ifndef EXECUTOR_H +#define EXECUTOR_H + +#include + +struct getl_interface; + +gboolean execute_syntax (struct getl_interface *sss); + + +#endif diff --git a/src/ui/gui/frequencies-dialog.c b/src/ui/gui/frequencies-dialog.c index c78fa95f..9d9814f1 100644 --- a/src/ui/gui/frequencies-dialog.c +++ b/src/ui/gui/frequencies-dialog.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include "executor.h" #include "gettext.h" #define _(msgid) gettext (msgid) diff --git a/src/ui/gui/helper.c b/src/ui/gui/helper.c index c70f8f7c..a4c07ca4 100644 --- a/src/ui/gui/helper.c +++ b/src/ui/gui/helper.c @@ -20,8 +20,6 @@ */ #include -#include "psppire-syntax-window.h" - #include #include @@ -33,7 +31,7 @@ #include #include #include - +#include "psppire-syntax-window.h" #include #include @@ -42,13 +40,7 @@ #include #include -#include -#include -#include -#include #include "psppire-data-store.h" -#include -#include "psppire-output-window.h" #include "xalloc.h" @@ -244,91 +236,6 @@ reference_manual (GtkMenuItem *menu, gpointer data) } -extern struct dataset *the_dataset; -extern struct source_stream *the_source_stream; -extern PsppireDataStore *the_data_store; - -/* Lazy casereader callback function used by execute_syntax. */ -static struct casereader * -create_casereader_from_data_store (void *data_store_) -{ - PsppireDataStore *data_store = data_store_; - return psppire_data_store_get_reader (data_store); -} - -gboolean -execute_syntax (struct getl_interface *sss) -{ - struct lexer *lexer; - gboolean retval = TRUE; - - struct casereader *reader; - size_t value_cnt; - casenumber case_cnt; - unsigned long int lazy_serial; - - /* When the user executes a number of snippets of syntax in a - row, none of which read from the active file, the GUI becomes - progressively less responsive. The reason is that each syntax - execution encapsulates the active file data in another - datasheet layer. The cumulative effect of having a number of - layers of datasheets wastes time and space. - - To solve the problem, we use a "lazy casereader", a wrapper - around the casereader obtained from the data store, that - only actually instantiates that casereader when it is - needed. If the data store casereader is never needed, then - it is reused the next time syntax is run, without wrapping - it in another layer. */ - value_cnt = psppire_data_store_get_value_count (the_data_store); - case_cnt = psppire_data_store_get_case_count (the_data_store); - reader = lazy_casereader_create (value_cnt, case_cnt, - create_casereader_from_data_store, - the_data_store, &lazy_serial); - proc_set_active_file_data (the_dataset, reader); - - g_return_val_if_fail (proc_has_active_file (the_dataset), FALSE); - - lexer = lex_create (the_source_stream); - - getl_append_source (the_source_stream, sss, GETL_BATCH, ERRMODE_CONTINUE); - - for (;;) - { - enum cmd_result result = cmd_parse (lexer, the_dataset); - - if ( cmd_result_is_failure (result)) - { - retval = FALSE; - if ( source_stream_current_error_mode (the_source_stream) - == ERRMODE_STOP ) - break; - } - - if ( result == CMD_EOF || result == CMD_FINISH) - break; - } - - getl_abort_noninteractive (the_source_stream); - - lex_destroy (lexer); - - psppire_dict_replace_dictionary (the_data_store->dict, - dataset_dict (the_dataset)); - - reader = proc_extract_active_file_data (the_dataset); - if (!lazy_casereader_destroy (reader, lazy_serial)) - psppire_data_store_set_reader (the_data_store, reader); - - som_flush (); - - psppire_output_window_reload (); - - return retval; -} - - - /* Create a deep copy of SRC */ GtkListStore * clone_list_store (const GtkListStore *src) diff --git a/src/ui/gui/helper.h b/src/ui/gui/helper.h index 6bd610e7..a6287dda 100644 --- a/src/ui/gui/helper.h +++ b/src/ui/gui/helper.h @@ -50,10 +50,6 @@ void connect_help (GtkBuilder *); void reference_manual (GtkMenuItem *, gpointer); -struct getl_interface; -gboolean execute_syntax (struct getl_interface *sss); - - #define builder_new(NAME) builder_new_real (relocate (PKGDATADIR "/" NAME)) GtkBuilder *builder_new_real (const gchar *name); diff --git a/src/ui/gui/oneway-anova-dialog.c b/src/ui/gui/oneway-anova-dialog.c index 2fb88268..a17a9397 100644 --- a/src/ui/gui/oneway-anova-dialog.c +++ b/src/ui/gui/oneway-anova-dialog.c @@ -31,7 +31,7 @@ #include -#include "helper.h" +#include "executor.h" #include "gettext.h" diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index 9d15ceb9..d19f9783 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -25,7 +25,7 @@ #include "psppire-data-store.h" #include #include -#include "helper.h" +#include "executor.h" #include #include diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 02b9cc34..c53e2fe0 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -18,6 +18,7 @@ #include #include +#include "executor.h" #include "helper.h" #include "text-data-import-dialog.h" diff --git a/src/ui/gui/psppire-syntax-window.c b/src/ui/gui/psppire-syntax-window.c index 3879e5b4..48a77fc0 100644 --- a/src/ui/gui/psppire-syntax-window.c +++ b/src/ui/gui/psppire-syntax-window.c @@ -18,6 +18,7 @@ #include #include +#include "executor.h" #include "helper.h" #include diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c index c774a23d..017a85f4 100644 --- a/src/ui/gui/psppire.c +++ b/src/ui/gui/psppire.c @@ -49,7 +49,7 @@ #include "psppire-dict.h" #include "psppire-var-store.h" #include "psppire-data-store.h" -#include "helper.h" +#include "executor.h" #include "message-dialog.h" #include diff --git a/src/ui/gui/rank-dialog.c b/src/ui/gui/rank-dialog.c index 2c4d19a0..db5cd4fb 100644 --- a/src/ui/gui/rank-dialog.c +++ b/src/ui/gui/rank-dialog.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include "executor.h" #include "gettext.h" #define _(msgid) gettext (msgid) diff --git a/src/ui/gui/recode-dialog.c b/src/ui/gui/recode-dialog.c index 50d87193..495aefb8 100644 --- a/src/ui/gui/recode-dialog.c +++ b/src/ui/gui/recode-dialog.c @@ -24,6 +24,8 @@ #include "recode-dialog.h" +#include "executor.h" + #include #include @@ -34,7 +36,7 @@ #include #include #include -#include + #include #include "psppire-acr.h" diff --git a/src/ui/gui/regression-dialog.c b/src/ui/gui/regression-dialog.c index b42dffe5..a702ffb7 100644 --- a/src/ui/gui/regression-dialog.c +++ b/src/ui/gui/regression-dialog.c @@ -18,6 +18,7 @@ #include "checkbox-treeview.h" #include "regression-dialog.h" +#include "executor.h" #include #include @@ -29,7 +30,7 @@ #include #include #include -#include + #include "gettext.h" #define _(msgid) gettext (msgid) diff --git a/src/ui/gui/reliability-dialog.c b/src/ui/gui/reliability-dialog.c index 4d01573b..4db99d97 100644 --- a/src/ui/gui/reliability-dialog.c +++ b/src/ui/gui/reliability-dialog.c @@ -25,6 +25,7 @@ #include "psppire-data-window.h" +#include "executor.h" #include "helper.h" #include diff --git a/src/ui/gui/select-cases-dialog.c b/src/ui/gui/select-cases-dialog.c index ffe86188..56b10d2c 100644 --- a/src/ui/gui/select-cases-dialog.c +++ b/src/ui/gui/select-cases-dialog.c @@ -18,7 +18,7 @@ #include "select-cases-dialog.h" #include -#include "helper.h" +#include "executor.h" #include "psppire-dialog.h" #include "psppire-data-window.h" #include "psppire-selector.h" diff --git a/src/ui/gui/sort-cases-dialog.c b/src/ui/gui/sort-cases-dialog.c index b5d1bbaa..a1135610 100644 --- a/src/ui/gui/sort-cases-dialog.c +++ b/src/ui/gui/sort-cases-dialog.c @@ -17,7 +17,7 @@ #include #include #include "sort-cases-dialog.h" -#include "helper.h" +#include "executor.h" #include "psppire-dialog.h" #include "psppire-data-window.h" #include "psppire-var-store.h" diff --git a/src/ui/gui/split-file-dialog.c b/src/ui/gui/split-file-dialog.c index 063f1862..458a3c53 100644 --- a/src/ui/gui/split-file-dialog.c +++ b/src/ui/gui/split-file-dialog.c @@ -19,7 +19,7 @@ #include "split-file-dialog.h" #include "psppire-selector.h" #include "psppire-dialog.h" -#include "helper.h" +#include "executor.h" #include "psppire-data-window.h" #include "dict-display.h" #include diff --git a/src/ui/gui/t-test-independent-samples-dialog.c b/src/ui/gui/t-test-independent-samples-dialog.c index c24e3251..f5df9f36 100644 --- a/src/ui/gui/t-test-independent-samples-dialog.c +++ b/src/ui/gui/t-test-independent-samples-dialog.c @@ -21,7 +21,7 @@ #include "t-test-independent-samples-dialog.h" #include "psppire-dict.h" #include "psppire-var-store.h" -#include "helper.h" +#include "executor.h" #include "psppire-data-window.h" #include "psppire-dialog.h" #include "dialog-common.h" diff --git a/src/ui/gui/t-test-one-sample.c b/src/ui/gui/t-test-one-sample.c index 2c48c5d9..18bdbb5d 100644 --- a/src/ui/gui/t-test-one-sample.c +++ b/src/ui/gui/t-test-one-sample.c @@ -27,6 +27,7 @@ #include "dialog-common.h" #include "dict-display.h" #include "widget-io.h" +#include "executor.h" #include "t-test-options.h" #include diff --git a/src/ui/gui/t-test-paired-samples.c b/src/ui/gui/t-test-paired-samples.c index a239a471..dcc24fad 100644 --- a/src/ui/gui/t-test-paired-samples.c +++ b/src/ui/gui/t-test-paired-samples.c @@ -30,6 +30,8 @@ #include "dialog-common.h" #include "psppire-dialog.h" +#include "executor.h" + #include "helper.h" #include "psppire-var-ptr.h" diff --git a/src/ui/gui/text-data-import-dialog.c b/src/ui/gui/text-data-import-dialog.c index 79f77627..c674f17d 100644 --- a/src/ui/gui/text-data-import-dialog.c +++ b/src/ui/gui/text-data-import-dialog.c @@ -45,7 +45,7 @@ #include #include #include -#include +#include "executor.h" #include "error.h" #include "xalloc.h" diff --git a/src/ui/gui/transpose-dialog.c b/src/ui/gui/transpose-dialog.c index 7ff758b0..beed72d7 100644 --- a/src/ui/gui/transpose-dialog.c +++ b/src/ui/gui/transpose-dialog.c @@ -19,7 +19,7 @@ #include "transpose-dialog.h" #include "psppire-selector.h" #include "psppire-dialog.h" -#include "helper.h" +#include "executor.h" #include "psppire-data-window.h" #include "dict-display.h" #include diff --git a/src/ui/gui/weight-cases-dialog.c b/src/ui/gui/weight-cases-dialog.c index 6fccdfb8..11b528ba 100644 --- a/src/ui/gui/weight-cases-dialog.c +++ b/src/ui/gui/weight-cases-dialog.c @@ -19,7 +19,7 @@ #include "weight-cases-dialog.h" #include "psppire-selector.h" #include "psppire-dialog.h" -#include "helper.h" +#include "executor.h" #include "psppire-data-window.h" #include "dict-display.h" #include -- 2.30.2