projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge commit 'origin/master' into charset
[pspp-builds.git]
/
src
/
data
/
procedure.c
diff --git
a/src/data/procedure.c
b/src/data/procedure.c
index 91e185a45a43f3d78802338d6b26536f0a9dc6b0..fbb9a7575cd3eba3a2864e898c85573d388a4cfc 100644
(file)
--- a/
src/data/procedure.c
+++ b/
src/data/procedure.c
@@
-36,6
+36,7
@@
#include <libpspp/misc.h>
#include <libpspp/str.h>
#include <libpspp/taint.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
#include <libpspp/taint.h>
+#include <libpspp/i18n.h>
#include "xalloc.h"
#include "xalloc.h"
@@
-92,6
+93,10
@@
struct dataset {
proc_state;
casenumber cases_written; /* Cases output so far. */
bool ok; /* Error status. */
proc_state;
casenumber cases_written; /* Cases output so far. */
bool ok; /* Error status. */
+
+ void (*callback) (void *); /* Callback for when the dataset changes */
+ void *cb_data;
+
}; /* struct dataset */
}; /* struct dataset */
@@
-99,9
+104,24
@@
static void add_case_limit_trns (struct dataset *ds);
static void add_filter_trns (struct dataset *ds);
static void update_last_proc_invocation (struct dataset *ds);
static void add_filter_trns (struct dataset *ds);
static void update_last_proc_invocation (struct dataset *ds);
+
+static void
+dataset_set_unsaved (const struct dataset *ds)
+{
+ if (ds->callback) ds->callback (ds->cb_data);
+}
+
\f
/* Public functions. */
\f
/* Public functions. */
+void
+dataset_set_callback (struct dataset *ds, void (*cb) (void *), void *cb_data)
+{
+ ds->callback = cb;
+ ds->cb_data = cb_data;
+}
+
+
/* Returns the last time the data was read. */
time_t
time_of_last_procedure (struct dataset *ds)
/* Returns the last time the data was read. */
time_t
time_of_last_procedure (struct dataset *ds)
@@
-293,6
+313,8
@@
proc_commit (struct dataset *ds)
assert (ds->proc_state == PROC_CLOSED);
ds->proc_state = PROC_COMMITTED;
assert (ds->proc_state == PROC_CLOSED);
ds->proc_state = PROC_COMMITTED;
+ dataset_set_unsaved (ds);
+
/* Free memory for lagged cases. */
while (!deque_is_empty (&ds->lag))
case_unref (ds->lag_cases[deque_pop_back (&ds->lag)]);
/* Free memory for lagged cases. */
while (!deque_is_empty (&ds->lag))
case_unref (ds->lag_cases[deque_pop_back (&ds->lag)]);
@@
-510,12
+532,25
@@
proc_cancel_all_transformations (struct dataset *ds)
return ok;
}
\f
return ok;
}
\f
+
+static void
+dict_callback (struct dictionary *d UNUSED, void *ds_)
+{
+ struct dataset *ds = ds_;
+ dataset_set_unsaved (ds);
+}
+
/* Initializes procedure handling. */
struct dataset *
create_dataset (void)
{
struct dataset *ds = xzalloc (sizeof(*ds));
ds->dict = dict_create ();
/* Initializes procedure handling. */
struct dataset *
create_dataset (void)
{
struct dataset *ds = xzalloc (sizeof(*ds));
ds->dict = dict_create ();
+
+ dict_set_change_callback (ds->dict, dict_callback, ds);
+
+ dict_set_encoding (ds->dict, get_default_encoding ());
+
ds->caseinit = caseinit_create ();
proc_cancel_all_transformations (ds);
return ds;
ds->caseinit = caseinit_create ();
proc_cancel_all_transformations (ds);
return ds;
@@
-585,6
+620,7
@@
proc_set_active_file (struct dataset *ds,
dict_destroy (ds->dict);
ds->dict = dict;
dict_destroy (ds->dict);
ds->dict = dict;
+ dict_set_change_callback (ds->dict, dict_callback, ds);
proc_set_active_file_data (ds, source);
}
proc_set_active_file_data (ds, source);
}