Fix memory leaks.
[pspp-builds.git] / src / var.h
index f67ef84d6f32e0a7e84ef7e95b8f780a73d39d76..a07772a3887ccde463f1bc1be0d80747d2445522 100644 (file)
--- a/src/var.h
+++ b/src/var.h
 #include <stddef.h>
 #include "format.h"
 #include "t-test.h"
+#include "val.h"
 
-/* Values. */
-
-/* Definition of the max length of a short string value, generally
-   eight characters.  */
-#define MAX_SHORT_STRING ((SIZEOF_DOUBLE)>=8 ? ((SIZEOF_DOUBLE)+1)/2*2 : 8)
-#define MIN_LONG_STRING (MAX_SHORT_STRING+1)
-
-/* FYI: It is a bad situation if sizeof(flt64) < MAX_SHORT_STRING:
-   then short string missing values can be truncated in system files
-   because there's only room for as many characters as can fit in a
-   flt64. */
-#if MAX_SHORT_STRING > 8
-#error MAX_SHORT_STRING must be less than 8.
-#endif
-
-/* Special values. */
-#define SYSMIS (-DBL_MAX)
-#define LOWEST second_lowest_value
-#define HIGHEST DBL_MAX
-
-/* Describes one value, which is either a floating-point number or a
-   short string. */
-union value
-  {
-    /* A numeric value. */
-    double f;
-
-    /* A short-string value. */
-    unsigned char s[MAX_SHORT_STRING];
-
-    /* This member is used by data-in.c to return a string result,
-       since it may need to return a long string.  As currently
-       implemented, it's a pointer to a static internal buffer in
-       data-in.c.
-
-       Also used by evaluate_expression() to return a string result.
-       As currently implemented, it's a pointer to a dynamic buffer in
-       the appropriate expression.
-
-       Also used by the AGGREGATE procedure in handling string
-       values. */
-    unsigned char *c;
-
-    /* Sometimes we insert value's in a hash table. */
-    unsigned long hash[SIZEOF_DOUBLE / SIZEOF_LONG];
-  };
-\f
 /* Frequency tables. */
 
 /* Frequency table entry. */
@@ -161,55 +115,12 @@ struct list_proc
     int vert;                  /* Whether to print the varname vertically. */
   };
 
-/* DESCRIPTIVES private data.  Note that the DESCRIPTIVES procedure also
-   has a transformation, descriptives_trns. */
-enum
-  {
-    /* As these are used as bit indexes, there must be 32 or fewer.
-       Be very careful in adjusting these, see the structure below
-       and the table in descriptives.q. */
-    dsc_mean = 0, dsc_semean, dsc_stddev, dsc_variance, dsc_kurt,
-    dsc_sekurt, dsc_skew, dsc_seskew, dsc_range, dsc_min,
-    dsc_max, dsc_sum, dsc_n_stats
-  };
-
-struct descriptives_proc
-  {
-    /* Miscellaneous. */
-    int dup;                   /* Finds duplicates in list of
-                                  variables. */
-    char zname[10];            /* Name for z-score variable. */
-
-    /* Counts. */
-    double valid, miss;                /* Valid, missing--general. */
-
-    /* Mean, moments about the mean. */
-    double X_bar, M2, M3, M4;
-    double min, max;
-
-    /* Statistics. */
-    double stats[dsc_n_stats]; /* Everything glommed together. */
-  };
-
 /* GET private data. */
 struct get_proc
   {
     int fv, nv;                        /* First, # of values. */
   };
 
-/* Sort order. */
-enum
-  {
-    SRT_ASCEND,                        /* A, B, C, ..., X, Y, Z. */
-    SRT_DESCEND                        /* Z, Y, X, ..., C, B, A. */
-  };
-
-/* SORT CASES private data. */
-struct sort_cases_proc
-  {
-    int order;                 /* SRT_ASCEND or SRT_DESCEND. */
-  };
-
 /* MEANS private data. */
 struct means_proc
   {
@@ -273,21 +184,17 @@ enum
     MISSING_COUNT
   };
 
-/* A variable's dictionary entry.  Note: don't reorder name[] from the
-   first element; a pointer to `variable' should be a pointer to
-   member `name'.*/
+/* A variable's dictionary entry.  */
 struct variable
   {
-    /* Required by parse_variables() to be in this order.  */
     char name[9];              /* As a string. */
     int index;                 /* Index into its dictionary's var[]. */
-    int type;                  /* NUMERIC or ALPHA. */
+    int type;                   /* NUMERIC or ALPHA. */
 
-    /* Also important but parse_variables() doesn't need it.  Still,
-       check before reordering. */
     int width;                 /* Size of string variables in chars. */
     int fv, nv;                        /* Index into `value's, number of values. */
-    int left;                  /* 0=reinitialize each case, 1=don't. */
+    unsigned init : 1;          /* 1=VFM must init and possibly reinit. */
+    unsigned reinit : 1;        /* Cases are: 1=reinitialized; 0=left. */
 
     /* Missing values. */
     int miss_type;             /* One of the MISSING_* constants. */
@@ -307,11 +214,9 @@ struct variable
     union
       {
        struct crosstab_proc crs;
-       struct descriptives_proc dsc;
        struct frequencies_proc frq;
        struct list_proc lst;
        struct means_proc mns;
-       struct sort_cases_proc srt;
        struct matrix_data_proc mxd;
        struct match_files_proc mtf;
        struct t_test_proc t_t;
@@ -342,15 +247,6 @@ struct vector
     int cnt;                   /* Number of variables. */
   };
 \f
-/* Cases. */
-
-/* A single case.  (This doesn't need to be a struct anymore, but it
-   remains so for hysterical raisins.) */
-struct ccase
-  {
-    union value data[1];
-  };
-\f
 /* Dictionary. */ 
 
 /* Complete dictionary state. */
@@ -369,11 +265,15 @@ void dict_get_vars (const struct dictionary *,
 
 struct variable *dict_create_var (struct dictionary *, const char *,
                                   int width);
+struct variable *dict_create_var_assert (struct dictionary *, const char *,
+                                  int width);
 struct variable *dict_clone_var (struct dictionary *, const struct variable *,
                                  const char *);
 void dict_rename_var (struct dictionary *, struct variable *, const char *);
 
 struct variable *dict_lookup_var (const struct dictionary *, const char *);
+struct variable *dict_lookup_var_assert (const struct dictionary *,
+                                         const char *);
 int dict_contains_var (const struct dictionary *, const struct variable *);
 void dict_delete_var (struct dictionary *, struct variable *);
 void dict_delete_vars (struct dictionary *,
@@ -384,8 +284,10 @@ int dict_rename_vars (struct dictionary *,
                       struct variable **, char **new_names,
                       size_t count, char **err_name);
 
+struct ccase;
 struct variable *dict_get_weight (const struct dictionary *);
-double dict_get_case_weight (const struct dictionary *, const struct ccase *);
+double dict_get_case_weight (const struct dictionary *, 
+                            const struct ccase *, int *);
 void dict_set_weight (struct dictionary *, struct variable *);
 
 struct variable *dict_get_filter (const struct dictionary *);
@@ -394,8 +296,12 @@ void dict_set_filter (struct dictionary *, struct variable *);
 int dict_get_case_limit (const struct dictionary *);
 void dict_set_case_limit (struct dictionary *, int);
 
-int dict_get_value_cnt (const struct dictionary *);
+int dict_get_next_value_idx (const struct dictionary *);
+size_t dict_get_case_size (const struct dictionary *);
+
 void dict_compact_values (struct dictionary *);
+size_t dict_get_compacted_value_cnt (const struct dictionary *);
+int *dict_get_compacted_idx_to_fv (const struct dictionary *);
 
 struct variable *const *dict_get_split_vars (const struct dictionary *);
 size_t dict_get_split_cnt (const struct dictionary *);
@@ -455,6 +361,7 @@ void cancel_temporary (void);
 /* Functions. */
 
 void dump_split_vars (const struct ccase *);
+typedef int (* is_missing_func )(const union value *, const struct variable *);
 
 int is_num_user_missing (double, const struct variable *);
 int is_str_user_missing (const unsigned char[], const struct variable *);
@@ -462,34 +369,19 @@ int is_missing (const union value *, const struct variable *);
 int is_system_missing (const union value *, const struct variable *);
 int is_user_missing (const union value *, const struct variable *);
 void copy_missing_values (struct variable *dest, const struct variable *src);
-
-#if GLOBAL_DEBUGGING
-struct variable *force_create_variable (struct dictionary *, const char *name,
-                                       int type, int width);
-struct variable *force_dup_variable (struct dictionary *,
-                                    const struct variable *src,
-                                    const char *name);
-#else
-#define force_create_variable(A, B, C, D)      \
-       create_variable (A, B, C, D)
-#define force_dup_variable(A, B, C)            \
-       dup_variable (A, B, C)
-#endif
-
 \f
 /* Transformations. */
 
+struct trns_header;
+typedef int trns_proc_func (struct trns_header *, struct ccase *, int);
+typedef void trns_free_func (struct trns_header *);
+
 /* Header for all transformations. */
 struct trns_header
   {
-    /* Index into t_trns[]. */
-    int index;
-
-    /* Transformation proc. */
-    int (*proc) (struct trns_header *, struct ccase *);
-
-    /* Garbage collector proc. */
-    void (*free) (struct trns_header *);
+    int index;                  /* Index into t_trns[]. */
+    trns_proc_func *proc;       /* Transformation proc. */
+    trns_free_func *free;       /* Garbage collector proc. */
   };
 
 /* Array of transformations */
@@ -507,14 +399,15 @@ void cancel_transformations (void);
 \f
 struct var_set;
 
-struct var_set *var_set_create_from_dict (struct dictionary *d);
-struct var_set *var_set_create_from_array (struct variable **var, size_t);
+struct var_set *var_set_create_from_dict (const struct dictionary *d);
+struct var_set *var_set_create_from_array (struct variable *const *var,
+                                           size_t);
 
-size_t var_set_get_cnt (struct var_set *vs);
-struct variable *var_set_get_var (struct var_set *vs, size_t idx);
-struct variable *var_set_lookup_var (struct var_set *vs, const char *name);
+size_t var_set_get_cnt (const struct var_set *vs);
+struct variable *var_set_get_var (const struct var_set *vs, size_t idx);
+struct variable *var_set_lookup_var (const struct var_set *vs,
+                                     const char *name);
 void var_set_destroy (struct var_set *vs);
-
 \f
 /* Variable parsers. */
 
@@ -528,14 +421,14 @@ enum
     PV_NUMERIC = 0020,         /* Vars must be numeric. */
     PV_STRING = 0040,          /* Vars must be string. */
     PV_SAME_TYPE = 00100,      /* All vars must be the same type. */
-    PV_NO_SCRATCH = 00200,     /* Disallow scratch variables. */
+    PV_NO_SCRATCH = 00200      /* Disallow scratch variables. */
   };
 
 struct variable *parse_variable (void);
-struct variable *parse_dict_variable (struct dictionary *);
-int parse_variables (struct dictionary *, struct variable ***, int *,
+struct variable *parse_dict_variable (const struct dictionary *);
+int parse_variables (const struct dictionary *, struct variable ***, int *,
                      int opts);
-int parse_var_set_vars (struct var_set *, struct variable ***, int *,
+int parse_var_set_vars (const struct var_set *, struct variable ***, int *,
                         int opts);
 int parse_DATA_LIST_vars (char ***names, int *cnt, int opts);
 int parse_mixed_vars (char ***names, int *cnt, int opts);