X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsfm-write.c;h=e1e103e5005c247dd9477c6dbd3c280a7f7bcef8;hb=4de79b34b329d1da6cdeb145993d3efd911e2967;hp=f09834b342f549010c811e5dfea4eb65b0a19a20;hpb=05e356b2a3087e819ef3b5388e29c822f41502e1;p=pspp diff --git a/src/sfm-write.c b/src/sfm-write.c index f09834b342..e1e103e500 100644 --- a/src/sfm-write.c +++ b/src/sfm-write.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include "sfm-write.h" @@ -33,7 +33,7 @@ #include "dictionary.h" #include "error.h" #include "file-handle.h" -#include "getline.h" +#include "getl.h" #include "hash.h" #include "magic.h" #include "misc.h" @@ -42,6 +42,9 @@ #include "var.h" #include "version.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + #include "debug-print.h" /* Compression bias used by PSPP. Values between (1 - @@ -106,15 +109,16 @@ var_flt64_cnt (const struct variable *v) /* Opens the system file designated by file handle FH for writing cases from dictionary D. If COMPRESS is nonzero, the - system file will be compressed. If OMIT_LONGNAMES is nonzero, the + system file will be compressed. If OMIT_LONG_NAMES is nonzero, the long name table will be omitted. No reference to D is retained, so it may be modified or - destroyed at will after this function returns. */ + destroyed at will after this function returns. D is not + modified by this function, except to assign short names. */ struct sfm_writer * sfm_open_writer (struct file_handle *fh, - const struct dictionary *d, int compress, - short omit_longnames) + struct dictionary *d, int compress, + short omit_long_names) { struct sfm_writer *w = NULL; int idx; @@ -162,6 +166,7 @@ sfm_open_writer (struct file_handle *fh, goto error; /* Write basic variable info. */ + dict_assign_short_names (d); for (i = 0; i < dict_get_var_cnt (d); i++) write_variable (w, dict_get_var (d, i)); @@ -181,19 +186,16 @@ sfm_open_writer (struct file_handle *fh, if (!write_rec_7_34 (w)) goto error; - - /* Write variable display info. */ - if ( !write_variable_display_parameters(w, d)) + if (!write_variable_display_parameters (w, d)) goto error; - - if ( ! omit_longnames ) + if (!omit_long_names) { if (!write_longvar_table (w, d)) goto error; } - /* Write record 999. */ + /* Write end-of-headers record. */ { struct { @@ -334,7 +336,7 @@ write_header (struct sfm_writer *w, const struct dictionary *d) if (label == NULL) label = ""; - st_bare_pad_copy (hdr.file_label, label, sizeof hdr.file_label); + buf_copy_str_rpad (hdr.file_label, sizeof hdr.file_label, label); } memset (hdr.padding, 0, sizeof hdr.padding); @@ -419,8 +421,7 @@ write_variable (struct sfm_writer *w, struct variable *v) sv.n_missing_values = nm; write_format_spec (&v->print, &sv.print); write_format_spec (&v->write, &sv.write); - memcpy (sv.name, v->name, strlen (v->name)); - memset (&sv.name[strlen (v->name)], ' ', SHORT_NAME_LEN - strlen (v->name)); + buf_copy_str_rpad (sv.name, sizeof sv.name, v->short_name); if (!buf_write (w, &sv, sizeof sv)) return 0; @@ -617,39 +618,42 @@ write_variable_display_parameters (struct sfm_writer *w, static int write_longvar_table (struct sfm_writer *w, const struct dictionary *dict) { - char *buf = 0; - int bufsize = 0; - struct - { - int32 rec_type P; - int32 subtype P; - int32 elem_size P; - int32 n_elem P; - } lv_hdr; + { + int32 rec_type P; + int32 subtype P; + int32 elem_size P; + int32 n_elem P; + } + lv_hdr; + + struct string long_name_map; + size_t i; + + ds_init (&long_name_map, 10 * dict_get_var_cnt (dict)); + for (i = 0; i < dict_get_var_cnt (dict); i++) + { + struct variable *v = dict_get_var (dict, i); + + if (i) + ds_putc (&long_name_map, '\t'); + ds_printf (&long_name_map, "%s=%s", v->short_name, v->name); + } lv_hdr.rec_type = 7; lv_hdr.subtype = 13; lv_hdr.elem_size = 1; + lv_hdr.n_elem = ds_length (&long_name_map); - - dict_get_varname_block(dict, &buf, &bufsize); - - if ( bufsize == 0 ) - return 1; - - lv_hdr.n_elem = bufsize ; - - if (!buf_write (w, &lv_hdr, sizeof(lv_hdr) )) - goto error; - - if (!buf_write (w, buf, bufsize)) + if (!buf_write (w, &lv_hdr, sizeof lv_hdr) + || !buf_write (w, ds_data (&long_name_map), ds_length (&long_name_map))) goto error; + ds_destroy (&long_name_map); return 1; error: - free ( buf ) ; + ds_destroy (&long_name_map); return 0; }