#include <math.h>
#include <setjmp.h>
#include "alloc.h"
-#include "bool.h"
+#include <stdbool.h>
#include "case.h"
#include "dictionary.h"
#include "file-handle.h"
#include "format.h"
-#include "getline.h"
+#include "getl.h"
#include "hash.h"
#include "magic.h"
#include "misc.h"
#include "value-labels.h"
#include "var.h"
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
#include "debug-print.h"
/* Portable file reader. */
static void
read_version_data (struct pfm_reader *r, struct pfm_read_info *info)
{
- char *date, *time, *product, *subproduct;
+ char *date, *time, *product, *author, *subproduct;
int i;
/* Read file. */
date = read_pool_string (r);
time = read_pool_string (r);
product = match (r, '1') ? read_pool_string (r) : (unsigned char *) "";
+ author = match (r, '2') ? read_pool_string (r) : (unsigned char *) "";
subproduct
= match (r, '3') ? read_pool_string (r) : (unsigned char *) "";
info->creation_time[8] = 0;
/* Product. */
- st_trim_copy (info->product, product, sizeof info->product);
- st_trim_copy (info->subproduct, subproduct, sizeof info->subproduct);
+ str_copy_trunc (info->product, sizeof info->product, product);
+ str_copy_trunc (info->subproduct, sizeof info->subproduct, subproduct);
}
}
read_string (r, name);
for (j = 0; j < 6; j++)
fmt[j] = read_int (r);
-#if 0
- /* Weirdly enough, there is no # character in the SPSS portable
- character set, so we can't check for it. */
- if (strlen (name) > SHORT_NAME_LEN)
- lose ((r, _("position %d: Variable name has %u characters."),
- i, strlen (name)));
- if ((name[0] < 74 /* A */ || name[0] > 125 /* Z */)
- && name[0] != 152 /* @ */)
- lose ((r, _("position %d: Variable name begins with invalid "
- "character."), i));
- if (name[0] >= 100 /* a */ && name[0] <= 125 /* z */)
- {
- corrupt_msg (r, _("position %d: Variable name begins with "
- "lowercase letter %c."),
- i, name[0] - 100 + 'a');
- name[0] -= 26 /* a - A */;
- }
- /* Verify remaining characters of variable name. */
- for (j = 1; j < (int) strlen (name); j++)
- {
- int c = name[j];
-#endif
- if (!var_is_valid_name (name, false) || *name == '#')
- error (r, _("position %d: Invalid variable name `%s'."), name);
- st_uppercase (name);
+ if (!var_is_valid_name (name, false) || *name == '#' || *name == '$')
+ error (r, _("position %d: Invalid variable name `%s'."), i, name);
+ str_uppercase (name);
if (width < 0 || width > 255)
error (r, "Bad width %d for variable %s.", width, name);
convert_format (r, &fmt[3], &v->write, v);
/* Range missing values. */
- if (match (r, 'B'))
- {
- v->miss_type = MISSING_RANGE;
- v->missing[0] = parse_value (r, v);
- v->missing[1] = parse_value (r, v);
- }
+ if (match (r, 'B'))
+ {
+ double x = read_float (r);
+ double y = read_float (r);
+ mv_add_num_range (&v->miss, x, y);
+ }
else if (match (r, 'A'))
- {
- v->miss_type = MISSING_HIGH;
- v->missing[0] = parse_value (r, v);
- }
+ mv_add_num_range (&v->miss, read_float (r), HIGHEST);
else if (match (r, '9'))
- {
- v->miss_type = MISSING_LOW;
- v->missing[0] = parse_value (r, v);
- }
+ mv_add_num_range (&v->miss, LOWEST, read_float (r));
/* Single missing values. */
- while (match (r, '8'))
- {
- static const int map_next[MISSING_COUNT] =
- {
- MISSING_1, MISSING_2, MISSING_3, -1,
- MISSING_RANGE_1, MISSING_LOW_1, MISSING_HIGH_1,
- -1, -1, -1,
- };
-
- static const int map_ofs[MISSING_COUNT] =
- {
- -1, 0, 1, 2, -1, -1, -1, 2, 1, 1,
- };
-
- v->miss_type = map_next[v->miss_type];
- if (v->miss_type == -1)
- error (r, _("Bad missing values for %s."), v->name);
-
- assert (map_ofs[v->miss_type] != -1);
- v->missing[map_ofs[v->miss_type]] = parse_value (r, v);
- }
+ while (match (r, '8'))
+ {
+ union value value = parse_value (r, v);
+ mv_add_value (&v->miss, &value);
+ }
if (match (r, 'C'))
{
{
char string[256];
read_string (r, string);
- st_bare_pad_copy (v.s, string, 8);
+ buf_copy_str_rpad (v.s, 8, string);
}
else
v.f = read_float (r);
{
char string[256];
read_string (r, string);
- st_bare_pad_copy (case_data_rw (c, idx)->s, string, width);
+ buf_copy_str_rpad (case_data_rw (c, idx)->s, width, string);
idx += DIV_RND_UP (width, MAX_SHORT_STRING);
}
}