1 /* PSPP - a program for statistical analysis. 2 Copyright (C) 2005, 2009, 2013 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 /* User-missing values. 18 19 struct missing_values is an opaque type that represents a set 20 of user-missing values associated with a variable. Valid sets 21 of missing values depend on variable width: 22 23 - Numeric variables may have up to 3 discrete numeric 24 user-missing values, or a range of numeric values, or a 25 range plus one discrete value. 26 27 - String variables may have up to 3 discrete string 28 user-missing values. (However, for long string 29 variables all bytes after the first MV_MAX_STRING must 30 be spaces.) 31 */ 32 33 #ifndef DATA_MISSING_VALUES_H 34 #define DATA_MISSING_VALUES_H 1 35 36 #include <stdbool.h> 37 #include "data/value.h" 38 39 struct pool; 40 41 /* Missing values for long string variables after the first 42 MV_MAX_STRING bytes must be all spaces. */ 43 #define MV_MAX_STRING 8 44 45 /* Missing values. 46 Opaque--use access functions defined below. */ 47 struct missing_values 48 { 49 int type; /* Types of missing values, one of MVT_*. */ 50 int width; /* 0=numeric, otherwise string width. */ 51 union value values[3]; /* Missing values. [1], [2] are the range. */ 52 }; 53 54 /* Classes of missing values. */ 55 enum mv_class 56 { 57 MV_NEVER = 0, /* Never considered missing. */ 58 MV_USER = 1, /* Missing if value is user-missing. */ 59 MV_SYSTEM = 2, /* Missing if value is system-missing. */ 60 MV_ANY = MV_USER | MV_SYSTEM /* Missing if it is user or system-missing. */ 61 }; 62 63 /* Is a value missing? */ 64 bool mv_is_value_missing (const struct missing_values *, const union value *, 65 enum mv_class); 66 bool mv_is_num_missing (const struct missing_values *, double, enum mv_class); 67 bool mv_is_str_missing (const struct missing_values *, const uint8_t[], 68 enum mv_class); 69 bool mv_is_value_missing_varwidth (const struct missing_values *, 70 const union value *, int value_width, 71 enum mv_class); 72 73 /* Initializing missing value sets. */ 74 void mv_init (struct missing_values *, int width); 75 void mv_init_pool (struct pool *pool, struct missing_values *, int width); 76 void mv_destroy (struct missing_values *); 77 void mv_copy (struct missing_values *, const struct missing_values *); 78 void mv_clear (struct missing_values *); 79 80 /* Changing width of a missing value set. */ 81 bool mv_is_resizable (const struct missing_values *, int width); 82 void mv_resize (struct missing_values *, int width); 83 84 /* Basic property inspection. */ 85 bool mv_is_acceptable (const union value *, int width); 86 bool mv_is_empty (const struct missing_values *); 87 int mv_get_width (const struct missing_values *); 88 89 /* Inspecting discrete values. */ 90 int mv_n_values (const struct missing_values *); 91 bool mv_has_value (const struct missing_values *); 92 const union value *mv_get_value (const struct missing_values *, int idx); 93 94 /* Inspecting ranges. */ 95 bool mv_has_range (const struct missing_values *); 96 void mv_get_range (const struct missing_values *, double *low, double *high); 97 98 /* Adding and modifying discrete values. */ 99 bool mv_add_value (struct missing_values *, const union value *); 100 bool mv_add_str (struct missing_values *, const uint8_t[], size_t len); 101 bool mv_add_num (struct missing_values *, double); 102 void mv_pop_value (struct missing_values *, union value *); 103 bool mv_replace_value (struct missing_values *, const union value *, int idx); 104 105 /* Adding and modifying ranges. */ 106 bool mv_add_range (struct missing_values *, double low, double high); 107 void mv_pop_range (struct missing_values *, double *low, double *high); 108 109 /* Formatting. */ 110 char *mv_to_string (const struct missing_values *, const char *encoding); 111 112 #endif /* data/missing-values.h */ 113