+2007-07-22 Ben Pfaff <blp@gnu.org>
+
+ Don't try to write very long strings to portable files. The
+ format does not support it.
+
+ * por-file-writer.c (MAX_POR_WIDTH): New macro.
+ (pfm_open_writer): Limit output width to MAX_POR_WIDTH.
+ (write_format): Add arg to take width to resize format to.
+ (write_value): Limit width of value written to MAX_POR_WIDTH.
+ (write_variables): Limit width of variable and its output formats
+ to MAX_POR_WIDTH.
+
2007-07-22 Ben Pfaff <blp@gnu.org>
* sys-file-reader.c (read_variable_to_value_map): Use max_warnings
#include "gettext.h"
#define _(msgid) gettext (msgid)
+/* Maximum width of a variable in a portable file. */
+#define MAX_POR_WIDTH 255
+
/* Portable file writer. */
struct pfm_writer
{
{
const struct variable *dv = dict_get_var (dict, i);
struct pfm_var *pv = &w->vars[i];
- pv->width = var_get_width (dv);
+ pv->width = MIN (var_get_width (dv), MAX_POR_WIDTH);
pv->fv = var_get_case_index (dv);
}
write_string (w, host_system);
}
-/* Write format F to file H. */
+/* Write format F to file H. The format is first resized to fit
+ a value of the given WIDTH, which is handy in case F
+ represents a string longer than 255 bytes and thus WIDTH is
+ truncated to 255 bytes. */
static void
-write_format (struct pfm_writer *w, const struct fmt_spec *f)
+write_format (struct pfm_writer *w, struct fmt_spec f, int width)
{
- write_int (w, fmt_to_io (f->type));
- write_int (w, f->w);
- write_int (w, f->d);
+ fmt_resize (&f, width);
+ write_int (w, fmt_to_io (f.type));
+ write_int (w, f.w);
+ write_int (w, f.d);
}
/* Write value V for variable VV to file H. */
write_float (w, v->f);
else
{
- write_int (w, var_get_width (vv));
- buf_write (w, v->s, var_get_width (vv));
+ int width = MIN (var_get_width (vv), MAX_POR_WIDTH);
+ write_int (w, width);
+ buf_write (w, v->s, width);
}
}
{
struct variable *v = dict_get_var (dict, i);
struct missing_values mv;
+ int width = MIN (var_get_width (v), MAX_POR_WIDTH);
buf_write (w, "7", 1);
- write_int (w, var_get_width (v));
+ write_int (w, width);
write_string (w, var_get_short_name (v, 0));
- write_format (w, var_get_print_format (v));
- write_format (w, var_get_write_format (v));
+ write_format (w, *var_get_print_format (v), width);
+ write_format (w, *var_get_write_format (v), width);
/* Write missing values. */
mv_copy (&mv, var_get_missing_values (v));