/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 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
#include "data/casewriter.h"
#include "data/dictionary.h"
#include "data/file-handle-def.h"
-#include "data/file-name.h"
#include "data/format.h"
#include "data/make-file.h"
#include "data/missing-values.h"
struct pfm_var
{
int width; /* 0=numeric, otherwise string var width. */
- int fv; /* Starting case index. */
+ int case_index; /* Index in case. */
};
static const struct casewriter_class por_file_casewriter_class;
const struct variable *dv = dict_get_var (dict, i);
struct pfm_var *pv = &w->vars[i];
pv->width = MIN (var_get_width (dv), MAX_POR_WIDTH);
- pv->fv = var_get_case_index (dv);
+ pv->case_index = var_get_case_index (dv);
}
w->digits = opts.digits;
mode = 0444;
if (opts.create_writeable)
mode |= 0222;
- w->rf = replace_file_start (fh_get_file_name (fh), "w", mode,
- &w->file, NULL);
+ w->rf = replace_file_start (fh, "w", mode,
+ &w->file);
if (w->rf == NULL)
{
msg (ME, _("Error opening `%s' for writing as a portable file: %s."),
static void
write_version_data (struct pfm_writer *w)
{
- char date_str[9];
- char time_str[7];
time_t t;
struct tm tm;
struct tm *tmp;
else
tmp = localtime (&t);
- sprintf (date_str, "%04d%02d%02d",
- tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday);
- sprintf (time_str, "%02d%02d%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+ char *date_str = xasprintf ("%04d%02d%02d", tmp->tm_year + 1900,
+ tmp->tm_mon + 1, tmp->tm_mday);
+ char *time_str = xasprintf ("%02d%02d%02d",
+ tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
buf_write (w, "A", 1);
write_string (w, date_str);
write_string (w, time_str);
+ free (date_str);
+ free (time_str);
/* Product identification. */
buf_write (w, "1", 1);
{
width = MIN (width, MAX_POR_WIDTH);
write_int (w, width);
- buf_write (w, value_str (v, width), width);
+ buf_write (w, v->s, width);
}
}
short_names_assign (dict);
- if (dict_get_weight (dict) != NULL)
+ if (dict_get_weight (dict) != NULL)
{
buf_write (w, "6", 1);
write_string (w, var_get_short_name (dict_get_weight (dict), 0));
}
-
+
buf_write (w, "4", 1);
write_int (w, dict_get_var_cnt (dict));
- write_int (w, 161);
+
+ buf_write (w, "5", 1);
+ write_int (w, ceil (w->digits * (log (10) / log (30))));
for (i = 0; i < dict_get_var_cnt (dict); i++)
{
const struct val_labs *val_labs = var_get_value_labels (v);
size_t n_labels = val_labs_count (val_labs);
const struct val_lab **labels;
+ int j;
if (n_labels == 0)
continue;
n_labels = val_labs_count (val_labs);
labels = val_labs_sorted (val_labs);
- for (i = 0; i < n_labels; i++)
+ for (j = 0; j < n_labels; j++)
{
- const struct val_lab *vl = labels[i];
+ const struct val_lab *vl = labels[j];
write_value (w, val_lab_get_value (vl), var_get_width (v));
write_string (w, val_lab_get_escaped_label (vl));
}
struct pfm_var *v = &w->vars[i];
if (v->width == 0)
- write_float (w, case_num_idx (c, v->fv));
+ write_float (w, case_num_idx (c, v->case_index));
else
{
write_int (w, v->width);
- buf_write (w, case_str_idx (c, v->fv), v->width);
+ buf_write (w, case_str_idx (c, v->case_index), v->width);
}
}
}
value -= chunk;
/* Append the chunk, in base 30, to trigs[]. */
- for (trigs_left = CHUNK_SIZE; chunk > 0 && trigs_left > 0; )
+ for (trigs_left = CHUNK_SIZE; chunk > 0 && trigs_left > 0;)
{
trigs[trig_cnt + --trigs_left] = chunk % 30;
chunk /= 30;