projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
format: Optimize fmt_from_io().
[pspp]
/
src
/
data
/
por-file-writer.c
diff --git
a/src/data/por-file-writer.c
b/src/data/por-file-writer.c
index 9ccc8fd713cd032774b8189e959b0e4725d0a7b8..9889cfd95378ed7593c1cfbb2ba9ad187427d06f 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, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009
, 2010
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
@@
-39,7
+39,6
@@
#include <data/value-labels.h>
#include <data/variable.h>
#include <data/value-labels.h>
#include <data/variable.h>
-#include <libpspp/hash.h>
#include <libpspp/message.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
#include <libpspp/message.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
@@
-151,9
+150,9
@@
pfm_open_writer (struct file_handle *fh, struct dictionary *dict,
goto error;
/* Create file. */
goto error;
/* Create file. */
- mode =
S_IRUSR | S_IRGRP | S_IROTH
;
+ mode =
0444
;
if (opts.create_writeable)
if (opts.create_writeable)
- mode |=
S_IWUSR | S_IWGRP | S_IWOTH
;
+ mode |=
0222
;
w->rf = replace_file_start (fh_get_file_name (fh), "w", mode,
&w->file, NULL);
if (w->rf == NULL)
w->rf = replace_file_start (fh_get_file_name (fh), "w", mode,
&w->file, NULL);
if (w->rf == NULL)
@@
-307,15
+306,15
@@
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, const 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);
buf_write (w, value_str (v, width), width);
}
write_int (w, width);
buf_write (w, value_str (v, width), width);
}
@@
-344,6
+343,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);
@@
-353,10
+353,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);
@@
-374,13
+376,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)
@@
-417,7
+418,7
@@
write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
for (i = 0; i < n_labels; i++)
{
const struct val_lab *vl = labels[i];
for (i = 0; i < n_labels; i++)
{
const struct val_lab *vl = labels[i];
- write_value (w, val_lab_get_value (vl), v);
+ write_value (w, val_lab_get_value (vl), v
ar_get_width (v)
);
write_string (w, val_lab_get_label (vl));
}
free (labels);
write_string (w, val_lab_get_label (vl));
}
free (labels);