const struct caseproto *proto = casereader_get_proto (casereader0);
struct casewriter *writer;
writer = autopaging_writer_create (proto);
-
+ struct ccase *prev_case = NULL;
double **matrices = NULL;
size_t n_splits = 0;
if (0 == strncasecmp (val, "corr ", ROWTYPE_WIDTH) ||
0 == strncasecmp (val, "cov ", ROWTYPE_WIDTH))
{
+ if (row >= mformat->n_continuous_vars)
+ {
+ msg (SE,
+ _("There are %d variable declared but the data has at least %d matrix rows."),
+ mformat->n_continuous_vars, row + 1);
+ goto error;
+ }
int col;
for (col = c_offset; col < mformat->n_continuous_vars; ++col)
{
if (e == SYSMIS)
continue;
-
+ /* Fill in the lower triangle */
(matrices[n_splits-1])[col + mformat->n_continuous_vars * row] = e;
- (matrices[n_splits-1]) [row + mformat->n_continuous_vars * col] = e;
+
+ if (mformat->triangle != FULL)
+ /* Fill in the upper triangle */
+ (matrices[n_splits-1]) [row + mformat->n_continuous_vars * col] = e;
}
row++;
}
temporary matrix */
const int idx = var_get_dict_index (mformat->varname);
row = 0;
- struct ccase *prev_case = NULL;
+
prev_split_hash = 1;
n_splits = 0;
for (; (c = casereader_read (casereader0)) != NULL; prev_case = c)
if (prev_case)
case_copy (outcase, 0, prev_case, 0, caseproto_get_n_widths (proto));
-
const struct variable *var = dict_get_var (dict, idx + 1 + row);
set_varname_column (outcase, mformat->varname, var_get_name (var));
casewriter_write (writer, outcase);
}
+
if (prev_case)
case_unref (prev_case);
struct casereader *reader1 = casewriter_make_reader (writer);
casereader_destroy (casereader0);
return reader1;
+
+
+error:
+ if (prev_case)
+ case_unref (prev_case);
+
+ for (i = 0 ; i < n_splits; ++i)
+ free (matrices[i]);
+ free (matrices);
+ casereader_destroy (casereader0);
+ return NULL;
}
int