X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fprocedure.c;fp=src%2Fdata%2Fprocedure.c;h=7a9b432132c09158ce849147801f4a17bc4f64a4;hb=84d8b182e81aea6cd7422611888192bcc1ac6980;hp=ed69420c3e464bd71221bd3bff5ee0ad3e727037;hpb=871f4456a207925fdce3df3150af3f3b263b2776;p=pspp-builds.git diff --git a/src/data/procedure.c b/src/data/procedure.c index ed69420c..7a9b4321 100644 --- a/src/data/procedure.c +++ b/src/data/procedure.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -36,6 +35,7 @@ #include #include #include +#include #include #include @@ -78,7 +78,8 @@ struct dataset { /* Cases just before ("lagging") the current one. */ int n_lag; /* Number of cases to lag. */ - struct casedeque lagged_cases; /* Lagged cases. */ + struct deque lag; /* Deque of lagged cases. */ + struct ccase *lag_cases; /* Lagged cases managed by deque. */ /* Procedure data. */ bool is_open; /* Procedure open? */ @@ -295,9 +296,9 @@ proc_read (struct dataset *ds, struct ccase **c) /* Write case to collection of lagged cases. */ if (ds->n_lag > 0) { - while (casedeque_count (&ds->lagged_cases) >= ds->n_lag) - case_destroy (casedeque_pop_back (&ds->lagged_cases)); - case_clone (casedeque_push_front (&ds->lagged_cases), + while (deque_count (&ds->lag) >= ds->n_lag) + case_destroy (&ds->lag_cases[deque_pop_back (&ds->lag)]); + case_clone (&ds->lag_cases[deque_push_front (&ds->lag)], &ds->trns_case); } @@ -420,7 +421,7 @@ open_active_file (struct dataset *ds) ds->proc_sink->class->open (ds->proc_sink); /* Allocate memory for lagged cases. */ - casedeque_init (&ds->lagged_cases, ds->n_lag); + ds->lag_cases = deque_init (&ds->lag, ds->n_lag, sizeof *ds->lag_cases); } /* Clears the variables in C that need to be cleared between @@ -449,9 +450,9 @@ static bool close_active_file (struct dataset *ds) { /* Free memory for lagged cases. */ - while (!casedeque_is_empty (&ds->lagged_cases)) - case_destroy (casedeque_pop_back (&ds->lagged_cases)); - casedeque_destroy (&ds->lagged_cases); + while (!deque_is_empty (&ds->lag)) + case_destroy (&ds->lag_cases[deque_pop_back (&ds->lag)]); + free (ds->lag_cases); /* Dictionary from before TEMPORARY becomes permanent. */ proc_cancel_temporary_transformations (ds); @@ -483,8 +484,8 @@ lagged_case (const struct dataset *ds, int n_before) assert (n_before >= 1); assert (n_before <= ds->n_lag); - if (n_before <= casedeque_count (&ds->lagged_cases)) - return casedeque_front (&ds->lagged_cases, n_before - 1); + if (n_before <= deque_count (&ds->lag)) + return &ds->lag_cases[deque_front (&ds->lag, n_before - 1)]; else return NULL; }