Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
-/* AIX requires this to be the first thing in the file. */
#include <config.h>
-#if __GNUC__
-#define alloca __builtin_alloca
-#else
-#if HAVE_ALLOCA_H
-#include <alloca.h>
-#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 <assert.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h> /* 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
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;
: 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;
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--)
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)));
}
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))
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));
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;
}
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;
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;
*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;