From: John Darrington Date: Mon, 1 Jan 2007 01:44:33 +0000 (+0000) Subject: Applied patch #5653, which adds callbacks to dataset whenever its dictionary or X-Git-Tag: v0.6.0~595 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecd26ec19e9f8a58079a1c5fa06b39484787ab7e;p=pspp-builds.git Applied patch #5653, which adds callbacks to dataset whenever its dictionary or data source is replaced. --- diff --git a/po/de.po b/po/de.po index 7d348025..63f204a9 100644 --- a/po/de.po +++ b/po/de.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: PSPP 0.4.2\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" -"POT-Creation-Date: 2006-12-28 20:05+0900\n" +"POT-Creation-Date: 2006-12-29 15:57+0900\n" "PO-Revision-Date: 2006-05-26 17:49+0800\n" "Last-Translator: John Darrington \n" "Language-Team: German \n" @@ -176,13 +176,13 @@ msgstr "" msgid "Month number %f is not between 1 and 12." msgstr "" -#: src/data/dictionary.c:709 +#: src/data/dictionary.c:721 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" -#: src/data/dictionary.c:1189 +#: src/data/dictionary.c:1201 msgid "Variable suffix too large." msgstr "" @@ -309,13 +309,13 @@ msgid "%s variables are not compatible with %s format %s." msgstr "" #: src/data/format.c:310 src/data/por-file-reader.c:489 -#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1247 +#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1558 #: src/ui/gui/psppire-var-store.c:482 msgid "String" msgstr "Zeichenkette" #: src/data/format.c:310 src/data/por-file-reader.c:489 -#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1108 +#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1419 #: src/ui/gui/psppire-var-store.c:475 msgid "Numeric" msgstr "Nummer" @@ -4098,28 +4098,28 @@ msgid "" "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" msgstr "" -#: src/ui/gui/customentry.c:337 src/ui/gui/psppire-status-bar.c:252 +#: src/ui/gui/customentry.c:337 msgid "Style of bevel around the custom entry button" msgstr "" -#: src/ui/gui/data-editor.c:369 src/ui/gui/data-editor.glade:531 +#: src/ui/gui/data-editor.c:368 src/ui/gui/data-editor.glade:531 msgid "Open" msgstr "Öffen" -#: src/ui/gui/data-editor.c:377 +#: src/ui/gui/data-editor.c:376 msgid "System Files (*.sav)" msgstr "Systemedatein (*.sav)" -#: src/ui/gui/data-editor.c:383 +#: src/ui/gui/data-editor.c:382 msgid "Portable Files (*.por) " msgstr "Tragbardatein (*.por)" -#: src/ui/gui/data-editor.c:389 src/ui/gui/syntax-editor.c:140 -#: src/ui/gui/syntax-editor.c:541 +#: src/ui/gui/data-editor.c:388 src/ui/gui/syntax-editor.c:140 +#: src/ui/gui/syntax-editor.c:538 msgid "All Files" msgstr "Alle Datei" -#: src/ui/gui/data-editor.c:467 +#: src/ui/gui/data-editor.c:466 msgid "Font Selection" msgstr "Schriftwahlung" @@ -4178,7 +4178,7 @@ msgid "Grid Lines" msgstr "Glitten" #: src/ui/gui/data-editor.glade:278 src/ui/gui/data-editor.glade:831 -#: src/ui/gui/data-editor.glade:1682 src/ui/gui/data-editor.glade:1959 +#: src/ui/gui/data-editor.glade:1993 src/ui/gui/data-editor.glade:2270 msgid "Value Labels" msgstr "Werten" @@ -4201,11 +4201,11 @@ msgid "Insert Cases" msgstr "_Stecken" #: src/ui/gui/data-editor.glade:343 src/ui/gui/data-editor.glade:638 -#: src/ui/gui/data-editor.glade:2524 +#: src/ui/gui/data-editor.glade:2835 msgid "Go To Case" msgstr "" -#: src/ui/gui/data-editor.glade:372 src/ui/gui/data-editor.glade:2635 +#: src/ui/gui/data-editor.glade:372 src/ui/gui/data-editor.glade:2946 msgid "Sort Cases" msgstr "" @@ -4297,107 +4297,136 @@ msgstr "Datenansicht" msgid "Variable View" msgstr "Variableansicht" -#: src/ui/gui/data-editor.glade:1075 +#: src/ui/gui/data-editor.glade:1079 +msgid "Information Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1126 +msgid "Processor Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1169 +msgid "OMS Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1212 +msgid "Case Counter Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1255 +msgid "Filter Use Status Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1298 +msgid "Weight Status Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1341 +#, fuzzy +msgid "Split File Status Area" +msgstr "Alle Datei" + +#: src/ui/gui/data-editor.glade:1386 msgid "Variable Type" msgstr "Variableansicht" -#: src/ui/gui/data-editor.glade:1127 src/ui/gui/psppire-var-store.c:476 +#: src/ui/gui/data-editor.glade:1438 src/ui/gui/psppire-var-store.c:476 msgid "Comma" msgstr "Komma" -#: src/ui/gui/data-editor.glade:1147 src/ui/gui/psppire-var-store.c:477 +#: src/ui/gui/data-editor.glade:1458 src/ui/gui/psppire-var-store.c:477 msgid "Dot" msgstr "Punkt" -#: src/ui/gui/data-editor.glade:1167 +#: src/ui/gui/data-editor.glade:1478 msgid "Scientific notation" msgstr "Wissenschaftlichnotation" -#: src/ui/gui/data-editor.glade:1187 src/ui/gui/psppire-var-store.c:479 +#: src/ui/gui/data-editor.glade:1498 src/ui/gui/psppire-var-store.c:479 msgid "Date" msgstr "Datum" -#: src/ui/gui/data-editor.glade:1207 src/ui/gui/psppire-var-store.c:480 +#: src/ui/gui/data-editor.glade:1518 src/ui/gui/psppire-var-store.c:480 msgid "Dollar" msgstr "Euro" -#: src/ui/gui/data-editor.glade:1227 +#: src/ui/gui/data-editor.glade:1538 msgid "Custom currency" msgstr "Spezialwährung" -#: src/ui/gui/data-editor.glade:1372 +#: src/ui/gui/data-editor.glade:1683 msgid "positive" msgstr "positiv" -#: src/ui/gui/data-editor.glade:1397 +#: src/ui/gui/data-editor.glade:1708 msgid "negative" msgstr "negativ" -#: src/ui/gui/data-editor.glade:1426 +#: src/ui/gui/data-editor.glade:1737 msgid "Sample" msgstr "Muster" -#: src/ui/gui/data-editor.glade:1504 +#: src/ui/gui/data-editor.glade:1815 msgid "Decimal Places:" msgstr "Dezimalstellen:" -#: src/ui/gui/data-editor.glade:1581 +#: src/ui/gui/data-editor.glade:1892 msgid "Width:" msgstr "Große:" -#: src/ui/gui/data-editor.glade:1800 +#: src/ui/gui/data-editor.glade:2111 msgid "Value:" msgstr "Werte:" -#: src/ui/gui/data-editor.glade:1828 +#: src/ui/gui/data-editor.glade:2139 msgid "Value Label:" msgstr "Kennsatz:" -#: src/ui/gui/data-editor.glade:2044 +#: src/ui/gui/data-editor.glade:2355 msgid "Missing Values" msgstr "Lösewerten" -#: src/ui/gui/data-editor.glade:2130 +#: src/ui/gui/data-editor.glade:2441 msgid "_No missing values" msgstr "_Kein Lösewerten" -#: src/ui/gui/data-editor.glade:2155 +#: src/ui/gui/data-editor.glade:2466 msgid "_Discrete missing values" msgstr "_Diskret Lösewerten" -#: src/ui/gui/data-editor.glade:2284 +#: src/ui/gui/data-editor.glade:2595 msgid "_Range plus one optional discrete missing value" msgstr "Wertebereich und ein optional Lösewert" -#: src/ui/gui/data-editor.glade:2321 +#: src/ui/gui/data-editor.glade:2632 msgid "_Low:" msgstr "_Tief:" -#: src/ui/gui/data-editor.glade:2380 +#: src/ui/gui/data-editor.glade:2691 msgid "_High:" msgstr "_Hoch:" -#: src/ui/gui/data-editor.glade:2454 +#: src/ui/gui/data-editor.glade:2765 msgid "Di_screte value:" msgstr "Di_skretwerte" -#: src/ui/gui/data-editor.glade:2580 +#: src/ui/gui/data-editor.glade:2891 msgid "Case Number:" msgstr "" -#: src/ui/gui/data-editor.glade:2752 src/ui/gui/sort-cases-dialog.c:279 +#: src/ui/gui/data-editor.glade:3063 src/ui/gui/sort-cases-dialog.c:279 msgid "Ascending" msgstr "" -#: src/ui/gui/data-editor.glade:2771 src/ui/gui/sort-cases-dialog.c:281 +#: src/ui/gui/data-editor.glade:3082 src/ui/gui/sort-cases-dialog.c:281 msgid "Descending" msgstr "" -#: src/ui/gui/data-editor.glade:2792 +#: src/ui/gui/data-editor.glade:3103 msgid "Sort Order" msgstr "" -#: src/ui/gui/data-editor.glade:2829 +#: src/ui/gui/data-editor.glade:3140 msgid "Sort by:" msgstr "" @@ -4445,11 +4474,11 @@ msgstr "Unpassend Wert für Variable" msgid "Incorrect range specification" msgstr "Falshe Spannweitebeschreibung" -#: src/ui/gui/psppire-data-store.c:745 +#: src/ui/gui/psppire-data-store.c:743 msgid "var" msgstr "" -#: src/ui/gui/psppire-data-store.c:826 src/ui/gui/psppire-var-store.c:552 +#: src/ui/gui/psppire-data-store.c:824 src/ui/gui/psppire-var-store.c:552 #: src/ui/gui/psppire-var-store.c:562 src/ui/gui/psppire-var-store.c:572 #: src/ui/gui/psppire-var-store.c:770 #, c-format @@ -4508,12 +4537,12 @@ msgstr "" msgid "Save Syntax" msgstr "Speichern unter" -#: src/ui/gui/syntax-editor.c:134 src/ui/gui/syntax-editor.c:535 +#: src/ui/gui/syntax-editor.c:134 src/ui/gui/syntax-editor.c:532 #, fuzzy msgid "Syntax Files (*.sps) " msgstr "Systemedatein (*.sav)" -#: src/ui/gui/syntax-editor.c:527 +#: src/ui/gui/syntax-editor.c:524 msgid "Open Syntax" msgstr "" diff --git a/po/pspp.pot b/po/pspp.pot index ccd22e48..b3ef4a6d 100644 --- a/po/pspp.pot +++ b/po/pspp.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n" -"POT-Creation-Date: 2006-12-28 20:05+0900\n" +"POT-Creation-Date: 2006-12-29 15:57+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -175,13 +175,13 @@ msgstr "" msgid "Month number %f is not between 1 and 12." msgstr "" -#: src/data/dictionary.c:709 +#: src/data/dictionary.c:721 msgid "" "At least one case in the data file had a weight value that was user-missing, " "system-missing, zero, or negative. These case(s) were ignored." msgstr "" -#: src/data/dictionary.c:1189 +#: src/data/dictionary.c:1201 msgid "Variable suffix too large." msgstr "" @@ -308,13 +308,13 @@ msgid "%s variables are not compatible with %s format %s." msgstr "" #: src/data/format.c:310 src/data/por-file-reader.c:489 -#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1247 +#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1558 #: src/ui/gui/psppire-var-store.c:482 msgid "String" msgstr "" #: src/data/format.c:310 src/data/por-file-reader.c:489 -#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1108 +#: src/data/sys-file-reader.c:602 src/ui/gui/data-editor.glade:1419 #: src/ui/gui/psppire-var-store.c:475 msgid "Numeric" msgstr "" @@ -4093,28 +4093,28 @@ msgid "" "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n" msgstr "" -#: src/ui/gui/customentry.c:337 src/ui/gui/psppire-status-bar.c:252 +#: src/ui/gui/customentry.c:337 msgid "Style of bevel around the custom entry button" msgstr "" -#: src/ui/gui/data-editor.c:369 src/ui/gui/data-editor.glade:531 +#: src/ui/gui/data-editor.c:368 src/ui/gui/data-editor.glade:531 msgid "Open" msgstr "" -#: src/ui/gui/data-editor.c:377 +#: src/ui/gui/data-editor.c:376 msgid "System Files (*.sav)" msgstr "" -#: src/ui/gui/data-editor.c:383 +#: src/ui/gui/data-editor.c:382 msgid "Portable Files (*.por) " msgstr "" -#: src/ui/gui/data-editor.c:389 src/ui/gui/syntax-editor.c:140 -#: src/ui/gui/syntax-editor.c:541 +#: src/ui/gui/data-editor.c:388 src/ui/gui/syntax-editor.c:140 +#: src/ui/gui/syntax-editor.c:538 msgid "All Files" msgstr "" -#: src/ui/gui/data-editor.c:467 +#: src/ui/gui/data-editor.c:466 msgid "Font Selection" msgstr "" @@ -4170,7 +4170,7 @@ msgid "Grid Lines" msgstr "" #: src/ui/gui/data-editor.glade:278 src/ui/gui/data-editor.glade:831 -#: src/ui/gui/data-editor.glade:1682 src/ui/gui/data-editor.glade:1959 +#: src/ui/gui/data-editor.glade:1993 src/ui/gui/data-editor.glade:2270 msgid "Value Labels" msgstr "" @@ -4191,11 +4191,11 @@ msgid "Insert Cases" msgstr "" #: src/ui/gui/data-editor.glade:343 src/ui/gui/data-editor.glade:638 -#: src/ui/gui/data-editor.glade:2524 +#: src/ui/gui/data-editor.glade:2835 msgid "Go To Case" msgstr "" -#: src/ui/gui/data-editor.glade:372 src/ui/gui/data-editor.glade:2635 +#: src/ui/gui/data-editor.glade:372 src/ui/gui/data-editor.glade:2946 msgid "Sort Cases" msgstr "" @@ -4283,107 +4283,135 @@ msgstr "" msgid "Variable View" msgstr "" -#: src/ui/gui/data-editor.glade:1075 +#: src/ui/gui/data-editor.glade:1079 +msgid "Information Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1126 +msgid "Processor Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1169 +msgid "OMS Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1212 +msgid "Case Counter Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1255 +msgid "Filter Use Status Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1298 +msgid "Weight Status Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1341 +msgid "Split File Status Area" +msgstr "" + +#: src/ui/gui/data-editor.glade:1386 msgid "Variable Type" msgstr "" -#: src/ui/gui/data-editor.glade:1127 src/ui/gui/psppire-var-store.c:476 +#: src/ui/gui/data-editor.glade:1438 src/ui/gui/psppire-var-store.c:476 msgid "Comma" msgstr "" -#: src/ui/gui/data-editor.glade:1147 src/ui/gui/psppire-var-store.c:477 +#: src/ui/gui/data-editor.glade:1458 src/ui/gui/psppire-var-store.c:477 msgid "Dot" msgstr "" -#: src/ui/gui/data-editor.glade:1167 +#: src/ui/gui/data-editor.glade:1478 msgid "Scientific notation" msgstr "" -#: src/ui/gui/data-editor.glade:1187 src/ui/gui/psppire-var-store.c:479 +#: src/ui/gui/data-editor.glade:1498 src/ui/gui/psppire-var-store.c:479 msgid "Date" msgstr "" -#: src/ui/gui/data-editor.glade:1207 src/ui/gui/psppire-var-store.c:480 +#: src/ui/gui/data-editor.glade:1518 src/ui/gui/psppire-var-store.c:480 msgid "Dollar" msgstr "" -#: src/ui/gui/data-editor.glade:1227 +#: src/ui/gui/data-editor.glade:1538 msgid "Custom currency" msgstr "" -#: src/ui/gui/data-editor.glade:1372 +#: src/ui/gui/data-editor.glade:1683 msgid "positive" msgstr "" -#: src/ui/gui/data-editor.glade:1397 +#: src/ui/gui/data-editor.glade:1708 msgid "negative" msgstr "" -#: src/ui/gui/data-editor.glade:1426 +#: src/ui/gui/data-editor.glade:1737 msgid "Sample" msgstr "" -#: src/ui/gui/data-editor.glade:1504 +#: src/ui/gui/data-editor.glade:1815 msgid "Decimal Places:" msgstr "" -#: src/ui/gui/data-editor.glade:1581 +#: src/ui/gui/data-editor.glade:1892 msgid "Width:" msgstr "" -#: src/ui/gui/data-editor.glade:1800 +#: src/ui/gui/data-editor.glade:2111 msgid "Value:" msgstr "" -#: src/ui/gui/data-editor.glade:1828 +#: src/ui/gui/data-editor.glade:2139 msgid "Value Label:" msgstr "" -#: src/ui/gui/data-editor.glade:2044 +#: src/ui/gui/data-editor.glade:2355 msgid "Missing Values" msgstr "" -#: src/ui/gui/data-editor.glade:2130 +#: src/ui/gui/data-editor.glade:2441 msgid "_No missing values" msgstr "" -#: src/ui/gui/data-editor.glade:2155 +#: src/ui/gui/data-editor.glade:2466 msgid "_Discrete missing values" msgstr "" -#: src/ui/gui/data-editor.glade:2284 +#: src/ui/gui/data-editor.glade:2595 msgid "_Range plus one optional discrete missing value" msgstr "" -#: src/ui/gui/data-editor.glade:2321 +#: src/ui/gui/data-editor.glade:2632 msgid "_Low:" msgstr "" -#: src/ui/gui/data-editor.glade:2380 +#: src/ui/gui/data-editor.glade:2691 msgid "_High:" msgstr "" -#: src/ui/gui/data-editor.glade:2454 +#: src/ui/gui/data-editor.glade:2765 msgid "Di_screte value:" msgstr "" -#: src/ui/gui/data-editor.glade:2580 +#: src/ui/gui/data-editor.glade:2891 msgid "Case Number:" msgstr "" -#: src/ui/gui/data-editor.glade:2752 src/ui/gui/sort-cases-dialog.c:279 +#: src/ui/gui/data-editor.glade:3063 src/ui/gui/sort-cases-dialog.c:279 msgid "Ascending" msgstr "" -#: src/ui/gui/data-editor.glade:2771 src/ui/gui/sort-cases-dialog.c:281 +#: src/ui/gui/data-editor.glade:3082 src/ui/gui/sort-cases-dialog.c:281 msgid "Descending" msgstr "" -#: src/ui/gui/data-editor.glade:2792 +#: src/ui/gui/data-editor.glade:3103 msgid "Sort Order" msgstr "" -#: src/ui/gui/data-editor.glade:2829 +#: src/ui/gui/data-editor.glade:3140 msgid "Sort by:" msgstr "" @@ -4431,11 +4459,11 @@ msgstr "" msgid "Incorrect range specification" msgstr "" -#: src/ui/gui/psppire-data-store.c:745 +#: src/ui/gui/psppire-data-store.c:743 msgid "var" msgstr "" -#: src/ui/gui/psppire-data-store.c:826 src/ui/gui/psppire-var-store.c:552 +#: src/ui/gui/psppire-data-store.c:824 src/ui/gui/psppire-var-store.c:552 #: src/ui/gui/psppire-var-store.c:562 src/ui/gui/psppire-var-store.c:572 #: src/ui/gui/psppire-var-store.c:770 #, c-format @@ -4493,11 +4521,11 @@ msgstr "" msgid "Save Syntax" msgstr "" -#: src/ui/gui/syntax-editor.c:134 src/ui/gui/syntax-editor.c:535 +#: src/ui/gui/syntax-editor.c:134 src/ui/gui/syntax-editor.c:532 msgid "Syntax Files (*.sps) " msgstr "" -#: src/ui/gui/syntax-editor.c:527 +#: src/ui/gui/syntax-editor.c:524 msgid "Open Syntax" msgstr "" diff --git a/src/data/ChangeLog b/src/data/ChangeLog index a30f8927..7c254f14 100644 --- a/src/data/ChangeLog +++ b/src/data/ChangeLog @@ -1,3 +1,8 @@ +Mon Jan 1 10:36:26 WST 2007 John Darrington + + * dictionary.c dictionary.h : Added replace_source and replace_dict + callbacks, and functions to deal with them. + Fri Dec 22 13:56:08 2006 Ben Pfaff Simplify missing value handling. diff --git a/src/data/dictionary.c b/src/data/dictionary.c index a7478596..d29939ac 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -82,6 +82,15 @@ dict_set_callbacks (struct dictionary *dict, } +/* Shallow copy the callbacks from SRC to DEST */ +void +dict_copy_callbacks (struct dictionary *dest, + const struct dictionary *src) +{ + dest->callbacks = src->callbacks; + dest->cb_data = src->cb_data; +} + /* Creates and returns a new dictionary. */ struct dictionary * dict_create (void) @@ -166,6 +175,9 @@ dict_clear (struct dictionary *d) for (i = 0; i < d->var_cnt; i++) { + if (d->callbacks && d->callbacks->var_deleted ) + d->callbacks->var_deleted (d, i, d->cb_data); + var_clear_vardict (d->var[i]); var_destroy (d->var[i]); } diff --git a/src/data/dictionary.h b/src/data/dictionary.h index 7a40e0dc..a1b17bb7 100644 --- a/src/data/dictionary.h +++ b/src/data/dictionary.h @@ -39,6 +39,8 @@ struct dictionary *dict_create (void); struct dictionary *dict_clone (const struct dictionary *); void dict_set_callbacks (struct dictionary *, const struct dict_callbacks *, void *); +void dict_copy_callbacks (struct dictionary *, const struct dictionary *); + void dict_clear (struct dictionary *); void dict_clear_aux (struct dictionary *); diff --git a/src/data/procedure.c b/src/data/procedure.c index 29dffbca..2154f689 100644 --- a/src/data/procedure.c +++ b/src/data/procedure.c @@ -43,6 +43,13 @@ struct dataset { /* An abstract factory which creates casefiles */ struct casefile_factory *cf_factory; + /* Callback which occurs when a procedure provides a new source for + the dataset */ + replace_source_callback *replace_source ; + + /* Callback which occurs whenever the DICT is replaced by a new one */ + replace_dictionary_callback *replace_dict; + /* Cases are read from proc_source, pass through permanent_trns_chain (which transforms them into the format described by permanent_dict), @@ -120,10 +127,10 @@ time_of_last_procedure (struct dataset *ds) start the next case from step 1. 2. Write case to replacement active file. - + 3. Execute temporary transformations. If these drop the case, start the next case from step 1. - + 4. Pass case to PROC_FUNC, passing AUX as auxiliary data. Returns true if successful, false if an I/O error occurred. */ @@ -152,17 +159,17 @@ procedure (struct dataset *ds, case_func *cf, void *aux) /* Multipass procedure. */ -struct multipass_aux_data +struct multipass_aux_data { struct casefile *casefile; - + bool (*proc_func) (const struct casefile *, void *aux); void *aux; }; /* Case processing function for multipass_procedure(). */ static bool -multipass_case_func (const struct ccase *c, void *aux_data_, const struct dataset *ds UNUSED) +multipass_case_func (const struct ccase *c, void *aux_data_, const struct dataset *ds UNUSED) { struct multipass_aux_data *aux_data = aux_data_; return casefile_append (aux_data->casefile, c); @@ -170,7 +177,7 @@ multipass_case_func (const struct ccase *c, void *aux_data_, const struct datase /* End-of-file function for multipass_procedure(). */ static bool -multipass_end_func (void *aux_data_, const struct dataset *ds UNUSED) +multipass_end_func (void *aux_data_, const struct dataset *ds UNUSED) { struct multipass_aux_data *aux_data = aux_data_; return (aux_data->proc_func == NULL @@ -181,7 +188,7 @@ multipass_end_func (void *aux_data_, const struct dataset *ds UNUSED) The entire active file is passed to PROC_FUNC, with the given AUX as auxiliary data, as a unit. */ bool -multipass_procedure (struct dataset *ds, casefile_func *proc_func, void *aux) +multipass_procedure (struct dataset *ds, casefile_func *proc_func, void *aux) { struct multipass_aux_data aux_data; bool ok; @@ -201,6 +208,7 @@ multipass_procedure (struct dataset *ds, casefile_func *proc_func, void *aux) return ok; } + /* Procedure implementation. */ /* Executes a procedure. @@ -211,18 +219,27 @@ multipass_procedure (struct dataset *ds, casefile_func *proc_func, void *aux) static bool internal_procedure (struct dataset *ds, case_func *proc, end_func *end, - void *aux) + void *aux) { struct ccase *c; bool ok = true; - + proc_open (ds); while (ok && proc_read (ds, &c)) if (proc != NULL) ok = proc (c, aux, ds) && ok; if (end != NULL) ok = end (aux, ds) && ok; - return proc_close (ds) && ok; + + if ( proc_close (ds) && ok ) + { + if ( ds->replace_source ) + ds->replace_source (ds->proc_source); + + return true; + } + + return false; } /* Opens dataset DS for reading cases with proc_read. @@ -251,13 +268,13 @@ proc_open (struct dataset *ds) Return false at end of file or if a read error occurs. In this case a null pointer is stored in *C. */ bool -proc_read (struct dataset *ds, struct ccase **c) +proc_read (struct dataset *ds, struct ccase **c) { enum trns_result retval = TRNS_DROP_CASE; assert (ds->is_open); *c = NULL; - for (;;) + for (;;) { size_t case_nr; @@ -278,16 +295,16 @@ proc_read (struct dataset *ds, struct ccase **c) &ds->trns_case, &case_nr); if (retval != TRNS_CONTINUE) continue; - + /* Write case to LAG queue. */ if (ds->n_lag) lag_case (ds, &ds->trns_case); /* Write case to replacement active file. */ ds->cases_written++; - if (ds->proc_sink->class->write != NULL) + if (ds->proc_sink->class->write != NULL) { - if (ds->compactor != NULL) + if (ds->compactor != NULL) { dict_compactor_compact (ds->compactor, &ds->sink_case, &ds->trns_case); @@ -296,9 +313,9 @@ proc_read (struct dataset *ds, struct ccase **c) else ds->proc_sink->class->write (ds->proc_sink, &ds->trns_case); } - + /* Execute temporary transformations. */ - if (ds->temporary_trns_chain != NULL) + if (ds->temporary_trns_chain != NULL) { retval = trns_chain_execute (ds->temporary_trns_chain, TRNS_CONTINUE, &ds->trns_case, &ds->cases_written); @@ -307,7 +324,7 @@ proc_read (struct dataset *ds, struct ccase **c) } *c = &ds->trns_case; - return true; + return true; } } @@ -317,17 +334,17 @@ proc_read (struct dataset *ds, struct ccase **c) If DS has not been opened, returns true without doing anything else. */ bool -proc_close (struct dataset *ds) +proc_close (struct dataset *ds) { if (!ds->is_open) return true; /* Drain any remaining cases. */ - while (ds->ok) + while (ds->ok) { struct ccase *c; if (!proc_read (ds, &c)) - break; + break; } ds->ok = free_case_source (ds->proc_source) && ds->ok; ds->proc_source = NULL; @@ -343,7 +360,7 @@ proc_close (struct dataset *ds) /* Updates last_proc_invocation. */ static void -update_last_proc_invocation (struct dataset *ds) +update_last_proc_invocation (struct dataset *ds) { ds->last_proc_invocation = time (NULL); } @@ -358,7 +375,7 @@ create_trns_case (struct ccase *trns_case, struct dictionary *dict) size_t i; case_create (trns_case, dict_get_next_value_idx (dict)); - for (i = 0; i < var_cnt; i++) + for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (dict, i); union value *value = case_data_rw (trns_case, v); @@ -387,7 +404,7 @@ open_active_file (struct dataset *ds) ds->permanent_dict = ds->dict; /* Figure out whether to compact. */ - ds->compactor = + ds->compactor = (dict_compacting_would_shrink (ds->permanent_dict) ? dict_make_compactor (ds->permanent_dict) : NULL); @@ -405,7 +422,7 @@ open_active_file (struct dataset *ds) if (ds->n_lag > 0) { int i; - + ds->lag_count = 0; ds->lag_head = 0; ds->lag_queue = xnmalloc (ds->n_lag, sizeof *ds->lag_queue); @@ -433,17 +450,17 @@ clear_case (const struct dataset *ds, struct ccase *c) { size_t var_cnt = dict_get_var_cnt (ds->dict); size_t i; - - for (i = 0; i < var_cnt; i++) + + for (i = 0; i < var_cnt; i++) { struct variable *v = dict_get_var (ds->dict, i); - if (!var_get_leave (v)) + if (!var_get_leave (v)) { if (var_is_numeric (v)) - case_data_rw (c, v)->f = SYSMIS; + case_data_rw (c, v)->f = SYSMIS; else memset (case_data_rw (c, v)->s, ' ', var_get_width (v)); - } + } } } @@ -455,24 +472,24 @@ close_active_file (struct dataset *ds) if (ds->n_lag > 0) { int i; - + for (i = 0; i < ds->n_lag; i++) case_destroy (&ds->lag_queue[i]); free (ds->lag_queue); ds->n_lag = 0; } - + /* Dictionary from before TEMPORARY becomes permanent. */ proc_cancel_temporary_transformations (ds); /* Finish compacting. */ - if (ds->compactor != NULL) + if (ds->compactor != NULL) { dict_compactor_destroy (ds->compactor); dict_compact_values (ds->dict); ds->compactor = NULL; } - + /* Old data sink becomes new data source. */ if (ds->proc_sink->class->make_source != NULL) ds->proc_source = ds->proc_sink->class->make_source (ds->proc_sink); @@ -506,13 +523,13 @@ lagged_case (const struct dataset *ds, int n_before) /* Procedure that separates the data into SPLIT FILE groups. */ /* Represents auxiliary data for handling SPLIT FILE. */ -struct split_aux_data +struct split_aux_data { struct dataset *dataset; /* The dataset */ struct ccase prev_case; /* Data in previous case. */ /* Callback functions. */ - begin_func *begin; + begin_func *begin; case_func *proc; end_func *end; void *func_aux; @@ -532,19 +549,19 @@ static bool split_procedure_end_func (void *, const struct dataset *); passed to each of the functions as auxiliary data. If the active file is empty, none of BEGIN_FUNC, PROC_FUNC, - and END_FUNC will be called at all. + and END_FUNC will be called at all. If SPLIT FILE is not in effect, then there is one break group (if the active file is nonempty), and BEGIN_FUNC and END_FUNC will be called once. - + Returns true if successful, false if an I/O error occurred. */ bool procedure_with_splits (struct dataset *ds, - begin_func begin, + begin_func begin, case_func *proc, end_func *end, - void *func_aux) + void *func_aux) { struct split_aux_data split_aux; bool ok; @@ -566,7 +583,7 @@ procedure_with_splits (struct dataset *ds, /* Case callback used by procedure_with_splits(). */ static bool -split_procedure_case_func (const struct ccase *c, void *split_aux_, const struct dataset *ds) +split_procedure_case_func (const struct ccase *c, void *split_aux_, const struct dataset *ds) { struct split_aux_data *split_aux = split_aux_; @@ -590,7 +607,7 @@ split_procedure_case_func (const struct ccase *c, void *split_aux_, const struct /* End-of-file callback used by procedure_with_splits(). */ static bool -split_procedure_end_func (void *split_aux_, const struct dataset *ds) +split_procedure_end_func (void *split_aux_, const struct dataset *ds) { struct split_aux_data *split_aux = split_aux_; @@ -602,8 +619,8 @@ split_procedure_end_func (void *split_aux_, const struct dataset *ds) /* Compares the SPLIT FILE variables in cases A and B and returns nonzero only if they differ. */ static int -equal_splits (const struct ccase *a, const struct ccase *b, - const struct dataset *ds) +equal_splits (const struct ccase *a, const struct ccase *b, + const struct dataset *ds) { return case_compare (a, b, dict_get_split_vars (ds->dict), @@ -615,14 +632,14 @@ equal_splits (const struct ccase *a, const struct ccase *b, /* Represents auxiliary data for handling SPLIT FILE in a multipass procedure. */ -struct multipass_split_aux_data +struct multipass_split_aux_data { struct dataset *dataset; /* The dataset of the split */ struct ccase prev_case; /* Data in previous case. */ struct casefile *casefile; /* Accumulates data for a split. */ - split_func *split; /* Function to call with the accumulated + split_func *split; /* Function to call with the accumulated data. */ - void *func_aux; /* Auxiliary data. */ + void *func_aux; /* Auxiliary data. */ }; static bool multipass_split_case_func (const struct ccase *c, void *aux_, const struct dataset *); @@ -631,7 +648,7 @@ static bool multipass_split_output (struct multipass_split_aux_data *, const str /* Returns true if successful, false if an I/O error occurred. */ bool -multipass_procedure_with_splits (struct dataset *ds, +multipass_procedure_with_splits (struct dataset *ds, split_func *split, void *func_aux) { @@ -670,7 +687,7 @@ multipass_split_case_func (const struct ccase *c, void *aux_, const struct datas ok = multipass_split_output (aux, ds); /* Start a new casefile. */ - aux->casefile = + aux->casefile = ds->cf_factory->create_casefile (ds->cf_factory, dict_get_next_value_idx (ds->dict)); } @@ -690,7 +707,7 @@ static bool multipass_split_output (struct multipass_split_aux_data *aux, const struct dataset *ds) { bool ok; - + assert (aux->casefile != NULL); ok = aux->split (&aux->prev_case, aux->casefile, aux->func_aux, ds); casefile_destroy (aux->casefile); @@ -708,9 +725,12 @@ discard_variables (struct dataset *ds) fh_set_default_handle (NULL); ds->n_lag = 0; - + free_case_source (ds->proc_source); ds->proc_source = NULL; + if ( ds->replace_source ) + ds->replace_source (ds->proc_source); + proc_cancel_all_transformations (ds); } @@ -719,10 +739,10 @@ discard_variables (struct dataset *ds) and clears the permanent transformations. For use by INPUT PROGRAM. */ struct trns_chain * -proc_capture_transformations (struct dataset *ds) +proc_capture_transformations (struct dataset *ds) { struct trns_chain *chain; - + assert (ds->temporary_trns_chain == NULL); chain = ds->permanent_trns_chain; ds->cur_trns_chain = ds->permanent_trns_chain = trns_chain_create (); @@ -744,7 +764,7 @@ add_transformation (struct dataset *ds, trns_proc_func *proc, trns_free_func *fr FINALIZE will be called. The functions are passed AUX as auxiliary data. */ void -add_transformation_with_finalizer (struct dataset *ds, +add_transformation_with_finalizer (struct dataset *ds, trns_finalize_func *finalize, trns_proc_func *proc, trns_free_func *free, void *aux) @@ -756,7 +776,7 @@ add_transformation_with_finalizer (struct dataset *ds, This value can be returned by a transformation procedure function to indicate a "jump" to that transformation. */ size_t -next_transformation (const struct dataset *ds) +next_transformation (const struct dataset *ds) { return trns_chain_next (ds->cur_trns_chain); } @@ -765,7 +785,7 @@ next_transformation (const struct dataset *ds) a temporary transformation, false if it will add a permanent transformation. */ bool -proc_in_temporary_transformations (const struct dataset *ds) +proc_in_temporary_transformations (const struct dataset *ds) { return ds->temporary_trns_chain != NULL; } @@ -774,7 +794,7 @@ proc_in_temporary_transformations (const struct dataset *ds) Further calls to add_transformation() will add temporary transformations. */ void -proc_start_temporary_transformations (struct dataset *ds) +proc_start_temporary_transformations (struct dataset *ds) { if (!proc_in_temporary_transformations (ds)) { @@ -791,9 +811,9 @@ proc_start_temporary_transformations (struct dataset *ds) permanent. Returns true if anything changed, false otherwise. */ bool -proc_make_temporary_transformations_permanent (struct dataset *ds) +proc_make_temporary_transformations_permanent (struct dataset *ds) { - if (proc_in_temporary_transformations (ds)) + if (proc_in_temporary_transformations (ds)) { trns_chain_finalize (ds->temporary_trns_chain); trns_chain_splice (ds->permanent_trns_chain, ds->temporary_trns_chain); @@ -812,9 +832,9 @@ proc_make_temporary_transformations_permanent (struct dataset *ds) transformations will be permanent. Returns true if anything changed, false otherwise. */ bool -proc_cancel_temporary_transformations (struct dataset *ds) +proc_cancel_temporary_transformations (struct dataset *ds) { - if (proc_in_temporary_transformations (ds)) + if (proc_in_temporary_transformations (ds)) { dict_destroy (ds->dict); ds->dict = ds->permanent_dict; @@ -844,11 +864,16 @@ proc_cancel_all_transformations (struct dataset *ds) /* Initializes procedure handling. */ struct dataset * -create_dataset (struct casefile_factory *fact) +create_dataset (struct casefile_factory *fact, + replace_source_callback *rps, + replace_dictionary_callback *rds + ) { struct dataset *ds = xzalloc (sizeof(*ds)); ds->dict = dict_create (); ds->cf_factory = fact; + ds->replace_source = rps; + ds->replace_dict = rds; proc_cancel_all_transformations (ds); return ds; } @@ -866,7 +891,7 @@ destroy_dataset (struct dataset *ds) /* Sets SINK as the destination for procedure output from the next procedure. */ void -proc_set_sink (struct dataset *ds, struct case_sink *sink) +proc_set_sink (struct dataset *ds, struct case_sink *sink) { assert (ds->proc_sink == NULL); ds->proc_sink = sink; @@ -875,7 +900,7 @@ proc_set_sink (struct dataset *ds, struct case_sink *sink) /* Sets SOURCE as the source for procedure input for the next procedure. */ void -proc_set_source (struct dataset *ds, struct case_source *source) +proc_set_source (struct dataset *ds, struct case_source *source) { assert (ds->proc_source == NULL); ds->proc_source = source; @@ -884,7 +909,7 @@ proc_set_source (struct dataset *ds, struct case_source *source) /* Returns true if a source for the next procedure has been configured, false otherwise. */ bool -proc_has_source (const struct dataset *ds) +proc_has_source (const struct dataset *ds) { return ds->proc_source != NULL; } @@ -894,7 +919,7 @@ proc_has_source (const struct dataset *ds) The returned casefile is owned by the caller; it will not be automatically used for the next procedure's input. */ struct casefile * -proc_capture_output (struct dataset *ds) +proc_capture_output (struct dataset *ds) { struct casefile *casefile; @@ -917,7 +942,7 @@ static trns_free_func case_limit_trns_free; /* Adds a transformation that limits the number of cases that may pass through, if DS->DICT has a case limit. */ static void -add_case_limit_trns (struct dataset *ds) +add_case_limit_trns (struct dataset *ds) { size_t case_limit = dict_get_case_limit (ds->dict); if (case_limit != 0) @@ -934,10 +959,10 @@ add_case_limit_trns (struct dataset *ds) *CASES_REMAINING. */ static int case_limit_trns_proc (void *cases_remaining_, - struct ccase *c UNUSED, casenumber case_nr UNUSED) + struct ccase *c UNUSED, casenumber case_nr UNUSED) { size_t *cases_remaining = cases_remaining_; - if (*cases_remaining > 0) + if (*cases_remaining > 0) { (*cases_remaining)--; return TRNS_CONTINUE; @@ -948,7 +973,7 @@ case_limit_trns_proc (void *cases_remaining_, /* Frees the data associated with a case limit transformation. */ static bool -case_limit_trns_free (void *cases_remaining_) +case_limit_trns_free (void *cases_remaining_) { size_t *cases_remaining = cases_remaining_; free (cases_remaining); @@ -960,10 +985,10 @@ static trns_proc_func filter_trns_proc; /* Adds a temporary transformation to filter data according to the variable specified on FILTER, if any. */ static void -add_filter_trns (struct dataset *ds) +add_filter_trns (struct dataset *ds) { struct variable *filter_var = dict_get_filter (ds->dict); - if (filter_var != NULL) + if (filter_var != NULL) { proc_start_temporary_transformations (ds); add_transformation (ds, filter_trns_proc, NULL, filter_var); @@ -973,8 +998,8 @@ add_filter_trns (struct dataset *ds) /* FILTER transformation. */ static int filter_trns_proc (void *filter_var_, - struct ccase *c UNUSED, casenumber case_nr UNUSED) - + struct ccase *c UNUSED, casenumber case_nr UNUSED) + { struct variable *filter_var = filter_var_; double f = case_num (c, filter_var); @@ -990,19 +1015,23 @@ dataset_dict (const struct dataset *ds) } -void +void dataset_set_dict (struct dataset *ds, struct dictionary *dict) { + dict_copy_callbacks (dict, ds->dict); ds->dict = dict; + + if ( ds->replace_dict ) + ds->replace_dict (dict); } -int +int dataset_n_lag (const struct dataset *ds) { return ds->n_lag; } -void +void dataset_set_n_lag (struct dataset *ds, int n_lag) { ds->n_lag = n_lag; diff --git a/src/data/procedure.h b/src/data/procedure.h index 4e8fa910..f4d473b9 100644 --- a/src/data/procedure.h +++ b/src/data/procedure.h @@ -58,7 +58,16 @@ bool proc_cancel_temporary_transformations (struct dataset *ds); /* Procedures. */ -struct dataset * create_dataset (struct casefile_factory *); +struct dictionary ; +typedef void replace_source_callback (struct case_source *); +typedef void replace_dictionary_callback (struct dictionary *); + + +struct dataset * create_dataset (struct casefile_factory *fact, + replace_source_callback *, + replace_dictionary_callback * + ); + void destroy_dataset (struct dataset *); struct casefile_factory *dataset_get_casefile_factory (const struct dataset *); diff --git a/src/language/expressions/evaluate.c b/src/language/expressions/evaluate.c index 32f96610..2498b094 100644 --- a/src/language/expressions/evaluate.c +++ b/src/language/expressions/evaluate.c @@ -158,7 +158,7 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) if ( ds == NULL ) { - ds = create_dataset (NULL); + ds = create_dataset (NULL, NULL, NULL); d = dataset_dict (ds); } diff --git a/src/ui/gui/ChangeLog b/src/ui/gui/ChangeLog index a27cd066..470573bb 100644 --- a/src/ui/gui/ChangeLog +++ b/src/ui/gui/ChangeLog @@ -1,3 +1,19 @@ +Mon Jan 1 10:37:07 WST 2007 John Darrington + + * psppire-case-file.c psppire-case-file.h: Changed the backend + semantics. An object is now created without any backend. A new function ( psppire_case_file_replace_flexifile ) sets the backend to use. + + * psppire-data-store.c : Updated callers accordingly. + + * psppire-dict.c psppire-dict.h : New function + (psppire_dict_replace_dictionary) . + + * psppire.c : Updated to use new dataset replace_{source, dictionary} + callbacks. + + * syntax-editor.c : parses in state CMD_STATE_DATA unless there are + no variables in the dictionary. + Mon Dec 25 12:38:24 WST 2006 John Darrington * data-editor.c data-editor.glade: Enabled deleting of variables from diff --git a/src/ui/gui/psppire-case-file.c b/src/ui/gui/psppire-case-file.c index 6e0766b9..ef1edfc2 100644 --- a/src/ui/gui/psppire-case-file.c +++ b/src/ui/gui/psppire-case-file.c @@ -153,33 +153,22 @@ psppire_case_file_init (PsppireCaseFile *cf) * Creates a new #PsppireCaseFile. */ PsppireCaseFile* -psppire_case_file_new (gint val_cnt) +psppire_case_file_new (void) { PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL); - cf->flexifile = flexifile_create (val_cnt); - return cf; } -/** - * psppire_case_file_new_from_flexifile: - * @returns: a new #PsppireCaseFile object - * - * Creates a new #PsppireCaseFile from an existing flexifile - */ -PsppireCaseFile* -psppire_case_file_new_from_flexifile (struct flexifile *ff) +void +psppire_case_file_replace_flexifile (PsppireCaseFile *cf, struct flexifile *ff) { - PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL); - cf->flexifile = (struct casefile *) ff; - - return cf; } + gboolean psppire_case_file_delete_cases (PsppireCaseFile *cf, gint n_cases, gint first) { diff --git a/src/ui/gui/psppire-case-file.h b/src/ui/gui/psppire-case-file.h index 478f935a..fd8af079 100644 --- a/src/ui/gui/psppire-case-file.h +++ b/src/ui/gui/psppire-case-file.h @@ -68,9 +68,7 @@ struct _PsppireCaseFileClass /* -- PsppireCaseFile --- */ GType psppire_case_file_get_type (void); -PsppireCaseFile *psppire_case_file_new (gint var_cnt); -PsppireCaseFile* psppire_case_file_new_from_flexifile (struct flexifile *ff); - +PsppireCaseFile *psppire_case_file_new (void); gboolean psppire_case_file_insert_case (PsppireCaseFile *cf, struct ccase *c, gint row); @@ -103,6 +101,10 @@ void psppire_case_file_sort (PsppireCaseFile *cf, const struct sort_criteria *); gboolean psppire_case_file_get_case (const PsppireCaseFile *cf, gint casenum, struct ccase *c); +void psppire_case_file_replace_flexifile (PsppireCaseFile *, + struct flexifile *); + + G_END_DECLS diff --git a/src/ui/gui/psppire-data-store.c b/src/ui/gui/psppire-data-store.c index 531b5b92..9ed53034 100644 --- a/src/ui/gui/psppire-data-store.c +++ b/src/ui/gui/psppire-data-store.c @@ -384,8 +384,6 @@ psppire_data_store_new (PsppireDict *dict) void psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict) { - gint var_cnt = psppire_dict_get_next_value_idx (dict); - data_store->dict = dict; if ( data_store->case_file) @@ -394,7 +392,7 @@ psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *di data_store->case_file = 0; } - data_store->case_file = psppire_case_file_new (var_cnt); + data_store->case_file = psppire_case_file_new (); g_signal_connect (data_store->case_file, "cases-deleted", G_CALLBACK (delete_cases_callback), @@ -845,3 +843,4 @@ psppire_data_store_sheet_row_init (GSheetRowIface *iface) iface->get_button_label = geometry_get_row_button_label; } + diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index 9637e3cf..bba51501 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -221,6 +221,13 @@ psppire_dict_new_from_dict (struct dictionary *d) } +void +psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d) +{ + dict->dict = d; +} + + /* Returns a valid name for a new variable in DICT. The return value is statically allocated */ static gchar * @@ -339,7 +346,6 @@ psppire_dict_lookup_var (const PsppireDict *d, const gchar *name) return dict_lookup_var (d->dict, name); } - /* Clears the contents of D */ void psppire_dict_clear (PsppireDict *d) @@ -348,14 +354,11 @@ psppire_dict_clear (PsppireDict *d) g_return_if_fail (d->dict); { - const gint n_vars = dict_get_var_cnt (d->dict); - dict_clear (d->dict); } } - /* Return true is NAME would be a valid name of a variable to add to the dictionary. False otherwise. If REPORT is true, then invalid names will be reported as such as errors diff --git a/src/ui/gui/psppire-dict.h b/src/ui/gui/psppire-dict.h index 044cbd25..b6b1bc88 100644 --- a/src/ui/gui/psppire-dict.h +++ b/src/ui/gui/psppire-dict.h @@ -102,6 +102,8 @@ gint psppire_dict_get_next_value_idx (const PsppireDict *dict); void psppire_dict_rename_var (PsppireDict *dict, struct variable *v, const gchar *text); +void psppire_dict_replace_dictionary (PsppireDict *, struct dictionary *); + G_END_DECLS diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c index b0de6cfa..6655a6ad 100644 --- a/src/ui/gui/psppire.c +++ b/src/ui/gui/psppire.c @@ -28,11 +28,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -61,6 +63,26 @@ void create_icon_factory (void); struct source_stream *the_source_stream ; struct dataset * the_dataset = NULL; +static void +replace_dictionary (struct dictionary *d) +{ + psppire_dict_replace_dictionary (the_data_store->dict, + d); +} + + +static void +replace_flexifile (struct case_source *s) +{ + if ( NULL == s ) + psppire_case_file_replace_flexifile (the_data_store->case_file, + (struct flexifile *) flexifile_create (0)); + else + psppire_case_file_replace_flexifile (the_data_store->case_file, + (struct flexifile *) + storage_source_get_casefile (s)); +} + int main (int argc, char *argv[]) @@ -106,14 +128,15 @@ main (int argc, char *argv[]) fn_getenv_default ("STAT_INCLUDE_PATH", include_path) ); - the_dataset = create_dataset (factory); + the_dataset = create_dataset (factory, + replace_flexifile, + replace_dictionary); message_dialog_init (the_source_stream); - dictionary = - psppire_dict_new_from_dict ( - dataset_dict (the_dataset) - ); + dictionary = psppire_dict_new_from_dict ( + dataset_dict (the_dataset) + ); bind_textdomain_codeset (PACKAGE, "UTF-8"); @@ -123,6 +146,10 @@ main (int argc, char *argv[]) the_data_store = psppire_data_store_new (dictionary); + proc_set_source (the_dataset, + storage_source_create (the_data_store->case_file->flexifile) + ); + create_icon_factory (); new_data_window (NULL, NULL); diff --git a/src/ui/gui/syntax-editor.c b/src/ui/gui/syntax-editor.c index 643013a3..a9564cb1 100644 --- a/src/ui/gui/syntax-editor.c +++ b/src/ui/gui/syntax-editor.c @@ -33,6 +33,7 @@ #include "window-manager.h" +#include #include #include #include @@ -214,14 +215,16 @@ static void execute_syntax (const struct syntax_editor *se, GtkTextIter start, GtkTextIter stop) { + g_return_if_fail (proc_has_source (the_dataset)); + getl_append_source (the_source_stream, create_syntax_editor_source (se, start, stop)); for (;;) { + const struct dictionary *dict = dataset_dict (the_dataset); int result = cmd_parse (se->lexer, the_dataset, - proc_has_source (the_dataset) - ? CMD_STATE_DATA : CMD_STATE_INITIAL); - + dict_get_var_cnt (dict) > 0 ? + CMD_STATE_DATA : CMD_STATE_INITIAL); if (result == CMD_EOF || result == CMD_FINISH) break; } diff --git a/src/ui/terminal/main.c b/src/ui/terminal/main.c index 9712fb8b..81b09a1d 100644 --- a/src/ui/terminal/main.c +++ b/src/ui/terminal/main.c @@ -108,7 +108,7 @@ main (int argc, char **argv) factory = fastfile_factory_create (); - the_dataset = create_dataset (factory); + the_dataset = create_dataset (factory, NULL, NULL); if (parse_command_line (argc, argv, the_source_stream)) {