projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Recode strings when writing system files.
[pspp-builds.git]
/
src
/
data
/
por-file-reader.c
diff --git
a/src/data/por-file-reader.c
b/src/data/por-file-reader.c
index 00ca4196fd502314b558693e54fea300b8663275..461796bf66fee167377740cb35a9f636a2b17d52 100644
(file)
--- a/
src/data/por-file-reader.c
+++ b/
src/data/por-file-reader.c
@@
-43,6
+43,7
@@
#include <libpspp/pool.h>
#include <libpspp/str.h>
#include <libpspp/pool.h>
#include <libpspp/str.h>
+#include "minmax.h"
#include "xalloc.h"
#include "gettext.h"
#include "xalloc.h"
#include "gettext.h"
@@
-606,8
+607,7
@@
assign_default:
return fmt_default_for_width (var_get_width (v));
}
return fmt_default_for_width (var_get_width (v));
}
-static void parse_value (struct pfm_reader *, struct variable *,
- union value *);
+static void parse_value (struct pfm_reader *, int width, union value *);
/* Read information on all the variables. */
static void
/* Read information on all the variables. */
static void
@@
-686,7
+686,7
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
var_set_write_format (v, &write);
/* Range missing values. */
var_set_write_format (v, &write);
/* Range missing values. */
- mv_init (&miss,
var_get_width (v)
);
+ mv_init (&miss,
width
);
if (match (r, 'B'))
{
double x = read_float (r);
if (match (r, 'B'))
{
double x = read_float (r);
@@
-701,13
+701,17
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
/* Single missing values. */
while (match (r, '8'))
{
/* Single missing values. */
while (match (r, '8'))
{
+ int mv_width = MIN (width, 8);
union value value;
union value value;
- parse_value (r, v, &value);
+
+ parse_value (r, mv_width, &value);
+ value_resize (&value, mv_width, width);
mv_add_value (&miss, &value);
mv_add_value (&miss, &value);
- value_destroy (&value,
var_get_width (v)
);
+ value_destroy (&value,
width
);
}
var_set_missing_values (v, &miss);
}
var_set_missing_values (v, &miss);
+ mv_destroy (&miss);
if (match (r, 'C'))
{
if (match (r, 'C'))
{
@@
-728,16
+732,16
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
}
}
}
}
-/* Parse a value
for variable VV
into value V. */
+/* Parse a value
of with WIDTH
into value V. */
static void
static void
-parse_value (struct pfm_reader *r,
struct variable *vv
, union value *v)
+parse_value (struct pfm_reader *r,
int width
, union value *v)
{
{
- value_init (v,
var_get_width (vv)
);
- if (
var_is_alpha (vv)
)
+ value_init (v,
width
);
+ if (
width > 0
)
{
char string[256];
read_string (r, string);
{
char string[256];
read_string (r, string);
-
buf_copy_str_rpad (value_str_rw (v, 8), 8
, string, ' ');
+
value_copy_str_rpad (v, width
, string, ' ');
}
else
v->f = read_float (r);
}
else
v->f = read_float (r);
@@
-780,17
+784,12
@@
read_value_label (struct pfm_reader *r, struct dictionary *dict)
char label[256];
int j;
char label[256];
int j;
- parse_value (r, v
[0]
, &val);
+ parse_value (r, v
ar_get_width (v[0])
, &val);
read_string (r, label);
/* Assign the value label to each variable. */
for (j = 0; j < nv; j++)
read_string (r, label);
/* Assign the value label to each variable. */
for (j = 0; j < nv; j++)
- {
- struct variable *var = v[j];
-
- if (!var_is_long_string (var))
- var_replace_value_label (var, &val, label);
- }
+ var_replace_value_label (v[j], &val, label);
value_destroy (&val, var_get_width (v[0]));
}
value_destroy (&val, var_get_width (v[0]));
}
@@
-820,7
+819,6
@@
por_file_casereader_read (struct casereader *reader, void *r_)
struct pfm_reader *r = r_;
struct ccase *volatile c;
size_t i;
struct pfm_reader *r = r_;
struct ccase *volatile c;
size_t i;
- size_t idx;
c = case_create (r->proto);
setjmp (r->bail_out);
c = case_create (r->proto);
setjmp (r->bail_out);
@@
-838,22
+836,17
@@
por_file_casereader_read (struct casereader *reader, void *r_)
return NULL;
}
return NULL;
}
- idx = 0;
for (i = 0; i < r->var_cnt; i++)
{
int width = caseproto_get_width (r->proto, i);
if (width == 0)
for (i = 0; i < r->var_cnt; i++)
{
int width = caseproto_get_width (r->proto, i);
if (width == 0)
- {
- case_data_rw_idx (c, idx)->f = read_float (r);
- idx++;
- }
+ case_data_rw_idx (c, i)->f = read_float (r);
else
{
char string[256];
read_string (r, string);
else
{
char string[256];
read_string (r, string);
- buf_copy_str_rpad (case_str_rw_idx (c, idx), width, string, ' ');
- idx += DIV_RND_UP (width, MAX_SHORT_STRING);
+ buf_copy_str_rpad (case_str_rw_idx (c, i), width, string, ' ');
}
}
}
}