projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
i18n: Change some strings to reduce work of translation.
[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 52c0cc8edab5dca9a59b142d83cf9c3466489a3e..461796bf66fee167377740cb35a9f636a2b17d52 100644
(file)
--- a/
src/data/por-file-reader.c
+++ b/
src/data/por-file-reader.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
@@
-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"
@@
-74,8
+75,7
@@
struct pfm_reader
char *trans; /* 256-byte character set translation table. */
int var_cnt; /* Number of variables. */
int weight_index; /* 0-based index of weight variable, or -1. */
char *trans; /* 256-byte character set translation table. */
int var_cnt; /* Number of variables. */
int weight_index; /* 0-based index of weight variable, or -1. */
- int *widths; /* Variable widths, 0 for numeric. */
- size_t value_cnt; /* Number of `value's per case. */
+ struct caseproto *proto; /* Format of output cases. */
bool ok; /* Set false on I/O error. */
};
bool ok; /* Set false on I/O error. */
};
@@
-256,8
+256,7
@@
pfm_open_reader (struct file_handle *fh, struct dictionary **dict,
r->weight_index = -1;
r->trans = NULL;
r->var_cnt = 0;
r->weight_index = -1;
r->trans = NULL;
r->var_cnt = 0;
- r->widths = NULL;
- r->value_cnt = 0;
+ r->proto = NULL;
r->ok = true;
if (setjmp (r->bail_out))
goto error;
r->ok = true;
if (setjmp (r->bail_out))
goto error;
@@
-296,8
+295,8
@@
pfm_open_reader (struct file_handle *fh, struct dictionary **dict,
if (!match (r, 'F'))
error (r, _("Data record expected."));
if (!match (r, 'F'))
error (r, _("Data record expected."));
- r->
value_cnt = dict_get_next_value_idx (*dict
);
- return casereader_create_sequential (NULL, r->
value_cnt
, CASENUMBER_MAX,
+ r->
proto = caseproto_ref_pool (dict_get_proto (*dict), r->pool
);
+ return casereader_create_sequential (NULL, r->
proto
, CASENUMBER_MAX,
&por_file_casereader_class, r);
error:
&por_file_casereader_class, r);
error:
@@
-608,7
+607,7
@@
assign_default:
return fmt_default_for_width (var_get_width (v));
}
return fmt_default_for_width (var_get_width (v));
}
-static
union value parse_value (struct pfm_reader *, struct variabl
e *);
+static
void parse_value (struct pfm_reader *, int width, union valu
e *);
/* Read information on all the variables. */
static void
/* Read information on all the variables. */
static void
@@
-623,7
+622,6
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
r->var_cnt = read_int (r);
if (r->var_cnt <= 0)
error (r, _("Invalid number of variables %d."), r->var_cnt);
r->var_cnt = read_int (r);
if (r->var_cnt <= 0)
error (r, _("Invalid number of variables %d."), r->var_cnt);
- r->widths = pool_nalloc (r->pool, r->var_cnt, sizeof *r->widths);
/* Purpose of this value is unknown. It is typically 161. */
read_int (r);
/* Purpose of this value is unknown. It is typically 161. */
read_int (r);
@@
-652,7
+650,6
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
width = read_int (r);
if (width < 0)
error (r, _("Invalid variable width %d."), width);
width = read_int (r);
if (width < 0)
error (r, _("Invalid variable width %d."), width);
- r->widths[i] = width;
read_string (r, name);
for (j = 0; j < 6; j++)
read_string (r, name);
for (j = 0; j < 6; j++)
@@
-689,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);
@@
-704,11
+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'))
{
- union value value = parse_value (r, v);
+ int mv_width = MIN (width, 8);
+ union value 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, width);
}
var_set_missing_values (v, &miss);
}
var_set_missing_values (v, &miss);
+ mv_destroy (&miss);
if (match (r, 'C'))
{
if (match (r, 'C'))
{
@@
-729,22
+732,19
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
}
}
}
}
-/* Parse a value
for variable VV
into value V. */
-static
union value
-parse_value (struct pfm_reader *r,
struct variable *v
v)
+/* Parse a value
of with WIDTH
into value V. */
+static
void
+parse_value (struct pfm_reader *r,
int width, union value *
v)
{
{
- union value v;
-
- 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 (v.s, 8, string
);
+
value_copy_str_rpad (v, width, string, ' '
);
}
else
}
else
- v.f = read_float (r);
-
- return v;
+ v->f = read_float (r);
}
/* Parse a value label record and return success. */
}
/* Parse a value label record and return success. */
@@
-784,17
+784,14
@@
read_value_label (struct pfm_reader *r, struct dictionary *dict)
char label[256];
int j;
char label[256];
int j;
-
val = parse_value (r, v[0]
);
+
parse_value (r, var_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];
+ var_replace_value_label (v[j], &val, label);
- if (!var_is_long_string (var))
- var_replace_value_label (var, &val, label);
- }
+ value_destroy (&val, var_get_width (v[0]));
}
}
}
}
@@
-814,50
+811,46
@@
read_documents (struct pfm_reader *r, struct dictionary *dict)
}
}
}
}
-/* Reads one case from portable file R into C. */
-static bool
-por_file_casereader_read (struct casereader *reader, void *r_, struct ccase *c)
+/* Reads and returns one case from portable file R. Returns a
+ null pointer on failure. */
+static struct ccase *
+por_file_casereader_read (struct casereader *reader, void *r_)
{
struct pfm_reader *r = r_;
{
struct pfm_reader *r = r_;
+ struct ccase *volatile c;
size_t i;
size_t i;
- size_t idx;
- c
ase_create (c, casereader_get_value_cnt (reader)
);
+ c
= case_create (r->proto
);
setjmp (r->bail_out);
if (!r->ok)
{
casereader_force_error (reader);
setjmp (r->bail_out);
if (!r->ok)
{
casereader_force_error (reader);
- case_
destroy
(c);
- return
false
;
+ case_
unref
(c);
+ return
NULL
;
}
/* Check for end of file. */
if (r->cc == 'Z')
{
}
/* Check for end of file. */
if (r->cc == 'Z')
{
- case_
destroy
(c);
- return
false
;
+ case_
unref
(c);
+ return
NULL
;
}
}
- idx = 0;
for (i = 0; i < r->var_cnt; i++)
{
for (i = 0; i < r->var_cnt; i++)
{
- int width =
r->widths[i]
;
+ int width =
caseproto_get_width (r->proto, i)
;
if (width == 0)
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_data_rw_idx (c, idx)->s, width, string);
- idx += DIV_RND_UP (width, MAX_SHORT_STRING);
+ buf_copy_str_rpad (case_str_rw_idx (c, i), width, string, ' ');
}
}
}
}
- return
true
;
+ return
c
;
}
/* Returns true if FILE is an SPSS portable file,
}
/* Returns true if FILE is an SPSS portable file,