projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Don't try to write very long strings to portable files. The format
[pspp-builds.git]
/
src
/
data
/
por-file-writer.c
diff --git
a/src/data/por-file-writer.c
b/src/data/por-file-writer.c
index 5f91c7e684b21b56d93cbc02e4a1eae06e3a6a2b..be8aba96dc873a7dc079de3539a1669746e167c2 100644
(file)
--- a/
src/data/por-file-writer.c
+++ b/
src/data/por-file-writer.c
@@
-50,6
+50,9
@@
#include "gettext.h"
#define _(msgid) gettext (msgid)
#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
{
/* Portable file writer. */
struct pfm_writer
{
@@
-139,7
+142,7
@@
pfm_open_writer (struct file_handle *fh, struct dictionary *dict,
{
const struct variable *dv = dict_get_var (dict, i);
struct pfm_var *pv = &w->vars[i];
{
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);
}
pv->fv = var_get_case_index (dv);
}
@@
-284,13
+287,17
@@
write_version_data (struct pfm_writer *w)
write_string (w, host_system);
}
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
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 value V for variable VV to file H. */
@@
-301,8
+308,9
@@
write_value (struct pfm_writer *w, union value *v, struct variable *vv)
write_float (w, v->f);
else
{
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);
}
}
}
}
@@
-322,12
+330,13
@@
write_variables (struct pfm_writer *w, struct dictionary *dict)
{
struct variable *v = dict_get_var (dict, i);
struct missing_values mv;
{
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);
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_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));
/* Write missing values. */
mv_copy (&mv, var_get_missing_values (v));