X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsfm-write.c;h=fd500f45c00b42062240d2eeb7bdf24813e083b7;hb=ca1feaeed4961242699d0b7ba61def0c58515ddd;hp=0e99013f689126a2ccb6e0da4f7930ee4a599c78;hpb=4944c86a9318bc5b5578ab145a95c116ffd2c9fd;p=pspp-builds.git diff --git a/src/sfm-write.c b/src/sfm-write.c index 0e99013f..fd500f45 100644 --- a/src/sfm-write.c +++ b/src/sfm-write.c @@ -17,24 +17,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* AIX requires this to be the first thing in the file. */ #include -#if __GNUC__ -#define alloca __builtin_alloca -#else -#if HAVE_ALLOCA_H -#include -#else -#ifdef _AIX -#pragma alloca -#else -#ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -#endif -#endif -#endif -#endif - +#include "sfm.h" +#include "sfmP.h" #include #include #include @@ -44,21 +29,17 @@ char *alloca (); #include /* Required by SunOS4. */ #endif #include "alloc.h" -#include "approx.h" -#include "avl.h" #include "error.h" #include "file-handle.h" #include "getline.h" +#include "hash.h" #include "magic.h" #include "misc.h" -#include "sfm.h" -#include "sfmP.h" #include "str.h" +#include "value-labels.h" #include "var.h" #include "version.h" -#undef DEBUGGING -/*#define DEBUGGING 1 */ #include "debug-print.h" /* PORTME: This file may require substantial revision for those @@ -144,13 +125,13 @@ sfm_write_dictionary (struct sfm_write_info *inf) goto lossage; /* Write basic variable info. */ - for (i = 0; i < d->nvar; i++) - write_variable (inf, d->var[i]); + for (i = 0; i < dict_get_var_cnt (d); i++) + write_variable (inf, dict_get_var (d, i)); /* Write out value labels. */ - for (index = i = 0; i < d->nvar; i++) + for (index = i = 0; i < dict_get_var_cnt (d); i++) { - struct variable *v = d->var[i]; + struct variable *v = dict_get_var (d, i); if (!write_value_labels (inf, v, index)) goto lossage; @@ -158,7 +139,7 @@ sfm_write_dictionary (struct sfm_write_info *inf) : DIV_RND_UP (v->width, sizeof (flt64))); } - if (d->documents != NULL && !write_documents (inf)) + if (dict_get_documents (d) != NULL && !write_documents (inf)) goto lossage; if (!write_rec_7_34 (inf)) goto lossage; @@ -228,18 +209,18 @@ write_header (struct sfm_write_info *inf) hdr.layout_code = 2; hdr.case_size = 0; - for (i = 0; i < d->nvar; i++) + for (i = 0; i < dict_get_var_cnt (d); i++) { - struct variable *v = d->var[i]; + struct variable *v = dict_get_var (d, i); hdr.case_size += (v->type == NUMERIC ? 1 : DIV_RND_UP (v->width, sizeof (flt64))); } inf->case_size = hdr.case_size; p = ext->elem_type = xmalloc (inf->case_size); - for (i = 0; i < d->nvar; i++) + for (i = 0; i < dict_get_var_cnt (d); i++) { - struct variable *v = d->var[i]; + struct variable *v = dict_get_var (d, i); int count = (v->type == NUMERIC ? 1 : DIV_RND_UP (v->width, sizeof (flt64))); while (count--) @@ -248,14 +229,18 @@ write_header (struct sfm_write_info *inf) hdr.compressed = inf->compress; - update_weighting (d); - if (d->weight_index != -1) + if (dict_get_weight (d) != NULL) { + struct variable *weight_var; int recalc_weight_index = 1; + int i; - for (i = 0; i < d->weight_index; i++) - { - struct variable *v = d->var[i]; + weight_var = dict_get_weight (d); + for (i = 0; ; i++) + { + struct variable *v = dict_get_var (d, i); + if (v == weight_var) + break; recalc_weight_index += (v->type == NUMERIC ? 1 : DIV_RND_UP (v->width, sizeof (flt64))); } @@ -293,9 +278,15 @@ write_header (struct sfm_write_info *inf) sprintf (buf, "%02d:%02d:%02d", hour - 1, min - 1, sec - 1); memcpy (hdr.creation_time, buf, sizeof hdr.creation_time); } + + { + const char *label = dict_get_label (d); + if (label == NULL) + label = ""; - st_bare_pad_copy (hdr.file_label, d->label ? d->label : "", - sizeof hdr.file_label); + st_bare_pad_copy (hdr.file_label, label, sizeof hdr.file_label); + } + memset (hdr.padding, 0, sizeof hdr.padding); if (!bufwrite (inf->h, &hdr, sizeof hdr)) @@ -446,35 +437,36 @@ write_value_labels (struct sfm_write_info * inf, struct variable *v, int index) int32 vars[1] P; }; - avl_traverser i; + struct val_labs_iterator *i; struct value_label_rec *vlr; struct variable_index_rec vir; - struct value_label *vl; + struct val_lab *vl; size_t vlr_size; flt64 *loc; - avl_traverser_init (i); - if (v->val_lab == NULL || avl_count (v->val_lab) == 0) + if (!val_labs_count (v->val_labs)) return 1; /* Pass 1: Count bytes. */ vlr_size = (sizeof (struct value_label_rec) - + sizeof (flt64) * (avl_count (v->val_lab) - 1)); - while (NULL != (vl = avl_traverse (v->val_lab, &i))) - vlr_size += ROUND_UP (strlen (vl->s) + 1, sizeof (flt64)); + + sizeof (flt64) * (val_labs_count (v->val_labs) - 1)); + for (vl = val_labs_first (v->val_labs, &i); vl != NULL; + vl = val_labs_next (v->val_labs, &i)) + vlr_size += ROUND_UP (strlen (vl->label) + 1, sizeof (flt64)); /* Pass 2: Copy bytes. */ - vlr = local_alloc (vlr_size); + vlr = xmalloc (vlr_size); vlr->rec_type = 3; - vlr->n_labels = avl_count (v->val_lab); + vlr->n_labels = val_labs_count (v->val_labs); loc = vlr->labels; - while (NULL != (vl = avl_traverse (v->val_lab, &i))) + for (vl = val_labs_first_sorted (v->val_labs, &i); vl != NULL; + vl = val_labs_next (v->val_labs, &i)) { - int len = strlen (vl->s); + size_t len = strlen (vl->label); - *loc++ = vl->v.f; + *loc++ = vl->value.f; *(unsigned char *) loc = len; - memcpy (&((unsigned char *) loc)[1], vl->s, len); + memcpy (&((unsigned char *) loc)[1], vl->label, len); memset (&((unsigned char *) loc)[1 + len], ' ', REM_RND_UP (len + 1, sizeof (flt64))); loc += DIV_RND_UP (len + 1, sizeof (flt64)); @@ -482,10 +474,10 @@ write_value_labels (struct sfm_write_info * inf, struct variable *v, int index) if (!bufwrite (inf->h, vlr, vlr_size)) { - local_free (vlr); + free (vlr); return 0; } - local_free (vlr); + free (vlr); vir.rec_type = 4; vir.n_vars = 1; @@ -508,11 +500,17 @@ write_documents (struct sfm_write_info * inf) } rec_6; + const char *documents; + size_t n_lines; + + documents = dict_get_documents (d); + n_lines = strlen (documents) / 80; + rec_6.rec_type = 6; - rec_6.n_lines = d->n_documents; + rec_6.n_lines = n_lines; if (!bufwrite (inf->h, &rec_6, sizeof rec_6)) return 0; - if (!bufwrite (inf->h, d->documents, 80 * d->n_documents)) + if (!bufwrite (inf->h, documents, 80 * n_lines)) return 0; return 1; @@ -563,21 +561,18 @@ write_rec_7_34 (struct sfm_write_info * inf) rec_7.elem_3[3] = -1; /* PORTME: 1=IEEE754, 2=IBM 370, 3=DEC VAX E. */ -#if FPREP==FPREP_IEEE754 +#ifdef FPREP_IEEE754 rec_7.elem_3[4] = 1; -#else -#error Floating-point representation unknown here. #endif rec_7.elem_3[5] = 1; /* PORTME: 1=big-endian, 2=little-endian. */ - if (endian == BIG) - rec_7.elem_3[6] = 1; - else if (endian == LITTLE) - rec_7.elem_3[6] = 2; - else - rec_7.elem_3[6] = 0; +#if WORDS_BIGENDIAN + rec_7.elem_3[6] = 1; +#else + rec_7.elem_3[6] = 2; +#endif /* PORTME: 1=EBCDIC, 2=7-bit ASCII, 3=8-bit ASCII, 4=DEC Kanji. */ rec_7.elem_3[7] = 2; @@ -680,13 +675,13 @@ sfm_write_case (struct file_handle * h, const flt64 *elem, int n_elem) *ext->x++ = 255; continue; } - else + else if (*elem > INT_MIN && *elem < INT_MAX) { - int value = *elem < 0 ? *elem - EPSILON : *elem + EPSILON; + int value = *elem; if (value >= 1 - COMPRESSION_BIAS && value <= 251 - COMPRESSION_BIAS - && approx_eq (value, *elem)) + && value == *elem) { *ext->x++ = value + COMPRESSION_BIAS; continue;