Implemented support for very long strings a la spss v13/v14
[pspp-builds.git] / src / data / dictionary.c
index d2d93c3bd2f535d59dac071f0ce4fbe2f57d7772..c8840f302beebc06d8ccc0ec8abc37aeb502550e 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
+
 #include "dictionary.h"
+
 #include <stdlib.h>
 #include <ctype.h>
-#include <libpspp/array.h>
-#include <libpspp/alloc.h>
+
 #include "case.h"
-#include "category.h"
 #include "cat-routines.h"
+#include "category.h"
+#include "settings.h"
+#include "value-labels.h"
+#include "variable.h"
+#include <libpspp/alloc.h>
+#include <libpspp/array.h>
 #include <libpspp/compiler.h>
-#include <libpspp/message.h>
 #include <libpspp/hash.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
-#include "settings.h"
 #include <libpspp/str.h>
-#include "value-labels.h"
-#include "variable.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -49,7 +52,7 @@ struct dictionary
     size_t split_cnt;           /* SPLIT FILE count. */
     struct variable *weight;    /* WEIGHT variable. */
     struct variable *filter;    /* FILTER variable. */
-    int case_limit;             /* Current case limit (N command). */
+    size_t case_limit;          /* Current case limit (N command). */
     char *label;               /* File label. */
     char *documents;           /* Documents, as a string. */
     struct vector **vector;     /* Vectors of variables. */
@@ -267,7 +270,7 @@ dict_create_var (struct dictionary *d, const char *name, int width)
   assert (d != NULL);
   assert (name != NULL);
 
-  assert (width >= 0 && width < 256);
+  assert (width >= 0 && width <= MAX_STRING);
 
   assert (var_is_plausible_name(name,0));
     
@@ -281,9 +284,8 @@ dict_create_var (struct dictionary *d, const char *name, int width)
   v->type = width == 0 ? NUMERIC : ALPHA;
   v->width = width;
   v->fv = d->next_value_idx;
-  v->nv = width == 0 ? 1 : DIV_RND_UP (width, 8);
-  v->init = 1;
-  v->reinit = dict_class_from_id (v->name) != DC_SCRATCH;
+  v->nv = width_to_bytes(width) / MAX_SHORT_STRING ;
+  v->leave = dict_class_from_id (v->name) == DC_SCRATCH;
   v->index = d->var_cnt;
   mv_init (&v->miss, width);
   if (v->type == NUMERIC)
@@ -359,8 +361,7 @@ dict_clone_var (struct dictionary *d, const struct variable *ov,
      short_name[] is intentionally not copied, because there is
      no reason to give a new variable with potentially a new name
      the same short name. */
-  nv->init = 1;
-  nv->reinit = ov->reinit;
+  nv->leave = ov->leave;
   mv_copy (&nv->miss, &ov->miss);
   nv->print = ov->print;
   nv->write = ov->write;
@@ -750,8 +751,8 @@ dict_set_filter (struct dictionary *d, struct variable *v)
 }
 
 /* Returns the case limit for dictionary D, or zero if the number
-   of cases is unlimited (see cmd_n()). */
-int
+   of cases is unlimited. */
+size_t
 dict_get_case_limit (const struct dictionary *d) 
 {
   assert (d != NULL);
@@ -759,13 +760,12 @@ dict_get_case_limit (const struct dictionary *d)
   return d->case_limit;
 }
 
-/* Sets CASE_LIMIT as the case limit for dictionary D.  Zero for
-   CASE_LIMIT indicates no limit. */
+/* Sets CASE_LIMIT as the case limit for dictionary D.  Use
+   0 for CASE_LIMIT to indicate no limit. */
 void
-dict_set_case_limit (struct dictionary *d, int case_limit) 
+dict_set_case_limit (struct dictionary *d, size_t case_limit) 
 {
   assert (d != NULL);
-  assert (case_limit >= 0);
 
   d->case_limit = case_limit;
 }