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/stable'
[pspp-builds.git]
/
src
/
data
/
por-file-writer.c
diff --git
a/src/data/por-file-writer.c
b/src/data/por-file-writer.c
index fad89bf7682cbf77a0b7f6a8b270a4ee64c98ede..7b1b25512a89358b966d44416467dfd5e4bf2b10 100644
(file)
--- a/
src/data/por-file-writer.c
+++ b/
src/data/por-file-writer.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006
, 2009
Free Software Foundation, Inc.
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
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
@@
-45,6
+45,7
@@
#include <libpspp/str.h>
#include <libpspp/version.h>
#include <libpspp/str.h>
#include <libpspp/version.h>
+#include "minmax.h"
#include "xalloc.h"
#include "gettext.h"
#include "xalloc.h"
#include "gettext.h"
@@
-77,7
+78,7
@@
struct pfm_var
int fv; /* Starting case index. */
};
int fv; /* Starting case index. */
};
-static struct casewriter_class por_file_casewriter_class;
+static
const
struct casewriter_class por_file_casewriter_class;
static bool close_writer (struct pfm_writer *);
static void buf_write (struct pfm_writer *, const void *, size_t);
static bool close_writer (struct pfm_writer *);
static void buf_write (struct pfm_writer *, const void *, size_t);
@@
-172,7
+173,7
@@
pfm_open_writer (struct file_handle *fh, struct dictionary *dict,
buf_write (w, "F", 1);
if (ferror (w->file))
goto error;
buf_write (w, "F", 1);
if (ferror (w->file))
goto error;
- return casewriter_create (dict_get_
next_value_idx
(dict),
+ return casewriter_create (dict_get_
proto
(dict),
&por_file_casewriter_class, w);
error:
&por_file_casewriter_class, w);
error:
@@
-215,7
+216,8
@@
write_float (struct pfm_writer *w, double d)
char buffer[64];
format_trig_double (d, floor (d) == d ? DBL_DIG : w->digits, buffer);
buf_write (w, buffer, strlen (buffer));
char buffer[64];
format_trig_double (d, floor (d) == d ? DBL_DIG : w->digits, buffer);
buf_write (w, buffer, strlen (buffer));
- buf_write (w, "/", 1);
+ if (d != SYSMIS)
+ buf_write (w, "/", 1);
}
/* Write N to the portable file as an integer field. */
}
/* Write N to the portable file as an integer field. */
@@
-305,17
+307,17
@@
write_format (struct pfm_writer *w, struct fmt_spec f, int width)
write_int (w, f.d);
}
write_int (w, f.d);
}
-/* Write value V
for variable VV
to file H. */
+/* Write value V
with width WIDTH
to file H. */
static void
static void
-write_value (struct pfm_writer *w,
union value *v, struct variable *vv
)
+write_value (struct pfm_writer *w,
const union value *v, int width
)
{
{
- if (
var_is_numeric (vv)
)
+ if (
width == 0
)
write_float (w, v->f);
else
{
write_float (w, v->f);
else
{
-
int width = MIN (var_get_width (vv)
, MAX_POR_WIDTH);
+
width = MIN (width
, MAX_POR_WIDTH);
write_int (w, width);
write_int (w, width);
- buf_write (w, v
->s
, width);
+ buf_write (w, v
alue_str (v, width)
, width);
}
}
}
}
@@
-342,6
+344,7
@@
write_variables (struct pfm_writer *w, struct dictionary *dict)
struct variable *v = dict_get_var (dict, i);
struct missing_values mv;
int width = MIN (var_get_width (v), MAX_POR_WIDTH);
struct variable *v = dict_get_var (dict, i);
struct missing_values mv;
int width = MIN (var_get_width (v), MAX_POR_WIDTH);
+ int j;
buf_write (w, "7", 1);
write_int (w, width);
buf_write (w, "7", 1);
write_int (w, width);
@@
-351,10
+354,12
@@
write_variables (struct pfm_writer *w, struct dictionary *dict)
/* Write missing values. */
mv_copy (&mv, var_get_missing_values (v));
/* Write missing values. */
mv_copy (&mv, var_get_missing_values (v));
- while (mv_has_range (&mv))
+ if (var_get_width (v) > 8)
+ mv_resize (&mv, 8);
+ if (mv_has_range (&mv))
{
double x, y;
{
double x, y;
- mv_
pop
_range (&mv, &x, &y);
+ mv_
get
_range (&mv, &x, &y);
if (x == LOWEST)
{
buf_write (w, "9", 1);
if (x == LOWEST)
{
buf_write (w, "9", 1);
@@
-372,13
+377,12
@@
write_variables (struct pfm_writer *w, struct dictionary *dict)
write_float (w, y);
}
}
write_float (w, y);
}
}
-
while (mv_has_value (&mv)
)
+
for (j = 0; j < mv_n_values (&mv); j++
)
{
{
- union value value;
- mv_pop_value (&mv, &value);
buf_write (w, "8", 1);
buf_write (w, "8", 1);
- write_value (w,
&value, v
);
+ write_value (w,
mv_get_value (&mv, j), mv_get_width (&mv)
);
}
}
+ mv_destroy (&mv);
/* Write variable label. */
if (var_get_label (v) != NULL)
/* Write variable label. */
if (var_get_label (v) != NULL)
@@
-397,12
+401,12
@@
write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
for (i = 0; i < dict_get_var_cnt (dict); i++)
{
for (i = 0; i < dict_get_var_cnt (dict); i++)
{
- struct val_labs_iterator *j;
struct variable *v = dict_get_var (dict, i);
const struct val_labs *val_labs = var_get_value_labels (v);
struct variable *v = dict_get_var (dict, i);
const struct val_labs *val_labs = var_get_value_labels (v);
- struct val_lab *vl;
+ size_t n_labels = val_labs_count (val_labs);
+ const struct val_lab **labels;
- if (
val_labs == NULL
)
+ if (
n_labels == 0
)
continue;
buf_write (w, "D", 1);
continue;
buf_write (w, "D", 1);
@@
-410,12
+414,15
@@
write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
write_string (w, var_get_short_name (v, 0));
write_int (w, val_labs_count (val_labs));
write_string (w, var_get_short_name (v, 0));
write_int (w, val_labs_count (val_labs));
- for (vl = val_labs_first_sorted (val_labs, &j); vl != NULL;
- vl = val_labs_next (val_labs, &j))
+ n_labels = val_labs_count (val_labs);
+ labels = val_labs_sorted (val_labs);
+ for (i = 0; i < n_labels; i++)
{
{
- write_value (w, &vl->value, v);
- write_string (w, vl->label);
+ const struct val_lab *vl = labels[i];
+ write_value (w, val_lab_get_value (vl), var_get_width (v));
+ write_string (w, val_lab_get_label (vl));
}
}
+ free (labels);
}
}
}
}
@@
-463,7
+470,7
@@
por_file_casewriter_write (struct casewriter *writer, void *w_,
else
casewriter_force_error (writer);
else
casewriter_force_error (writer);
- case_
destroy
(c);
+ case_
unref
(c);
}
static void
}
static void
@@
-777,7
+784,7
@@
format_trig_double (long double value, int base_10_precision, char output[])
0...30**6, an invariant of the loop below. */
errno = 0;
base_2_sig = frexp (value, &base_2_exp);
0...30**6, an invariant of the loop below. */
errno = 0;
base_2_sig = frexp (value, &base_2_exp);
- if (errno != 0 || !finite (base_2_sig))
+ if (errno != 0 || !
is
finite (base_2_sig))
goto missing_value;
if (base_2_exp == 0 && base_2_sig == 0.)
goto zero;
goto missing_value;
if (base_2_exp == 0 && base_2_sig == 0.)
goto zero;
@@
-898,7
+905,7
@@
format_trig_double (long double value, int base_10_precision, char output[])
return;
}
\f
return;
}
\f
-static struct casewriter_class por_file_casewriter_class =
+static
const
struct casewriter_class por_file_casewriter_class =
{
por_file_casewriter_write,
por_file_casewriter_destroy,
{
por_file_casewriter_write,
por_file_casewriter_destroy,