X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-atr.c;h=970ce5673f45c0154ae08640b28bcb92171cc99b;hb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;hp=a854033a0831e5ea8dbc2bffab22835724a798da;hpb=4de79b34b329d1da6cdeb145993d3efd911e2967;p=pspp diff --git a/src/vars-atr.c b/src/vars-atr.c index a854033a08..970ce5673f 100644 --- a/src/vars-atr.c +++ b/src/vars-atr.c @@ -22,22 +22,31 @@ #include "error.h" #include #include "alloc.h" -#include "command.h" #include "dictionary.h" -#include "do-ifP.h" -#include "expressions/public.h" -#include "file-handle.h" #include "hash.h" -#include "lexer.h" +#include "lex-def.h" #include "misc.h" #include "str.h" #include "value-labels.h" -#include "vfm.h" #include "gettext.h" #define _(msgid) gettext (msgid) -#include "debug-print.h" +/* Returns an adjective describing the given variable TYPE, + suitable for use in phrases like "numeric variable". */ +const char * +var_type_adj (enum var_type type) +{ + return type == NUMERIC ? _("numeric") : _("string"); +} + +/* Returns a noun describing a value of the given variable TYPE, + suitable for use in phrases like "a number". */ +const char * +var_type_noun (enum var_type type) +{ + return type == NUMERIC ? _("number") : _("string"); +} /* Assign auxiliary data AUX to variable V, which must not already have auxiliary data. Before V's auxiliary data is @@ -114,136 +123,6 @@ hash_value(const union value *v, int width) -/* Discards all the current state in preparation for a data-input - command like DATA LIST or GET. */ -void -discard_variables (void) -{ - dict_clear (default_dict); - default_handle = NULL; - - n_lag = 0; - - if (vfm_source != NULL) - { - free_case_source (vfm_source); - vfm_source = NULL; - } - - cancel_transformations (); - - ctl_stack = NULL; - - expr_free (process_if_expr); - process_if_expr = NULL; - - cancel_temporary (); - - pgm_state = STATE_INIT; -} - -/* Return nonzero only if X is a user-missing value for numeric - variable V. */ -inline int -is_num_user_missing (double x, const struct variable *v) -{ - switch (v->miss_type) - { - case MISSING_NONE: - return 0; - case MISSING_1: - return x == v->missing[0].f; - case MISSING_2: - return x == v->missing[0].f || x == v->missing[1].f; - case MISSING_3: - return (x == v->missing[0].f || x == v->missing[1].f - || x == v->missing[2].f); - case MISSING_RANGE: - return x >= v->missing[0].f && x <= v->missing[1].f; - case MISSING_LOW: - return x <= v->missing[0].f; - case MISSING_HIGH: - return x >= v->missing[0].f; - case MISSING_RANGE_1: - return ((x >= v->missing[0].f && x <= v->missing[1].f) - || x == v->missing[2].f); - case MISSING_LOW_1: - return x <= v->missing[0].f || x == v->missing[1].f; - case MISSING_HIGH_1: - return x >= v->missing[0].f || x == v->missing[1].f; - default: - assert (0); - } - abort (); -} - -/* Return nonzero only if string S is a user-missing variable for - string variable V. */ -inline int -is_str_user_missing (const unsigned char s[], const struct variable *v) -{ - /* FIXME: should these be memcmp()? */ - switch (v->miss_type) - { - case MISSING_NONE: - return 0; - case MISSING_1: - return !strncmp (s, v->missing[0].s, v->width); - case MISSING_2: - return (!strncmp (s, v->missing[0].s, v->width) - || !strncmp (s, v->missing[1].s, v->width)); - case MISSING_3: - return (!strncmp (s, v->missing[0].s, v->width) - || !strncmp (s, v->missing[1].s, v->width) - || !strncmp (s, v->missing[2].s, v->width)); - default: - assert (0); - } - abort (); -} - -/* Return nonzero only if value VAL is system-missing for variable - V. */ -int -is_system_missing (const union value *val, const struct variable *v) -{ - return v->type == NUMERIC && val->f == SYSMIS; -} - -/* Return nonzero only if value VAL is system- or user-missing for - variable V. */ -int -is_missing (const union value *val, const struct variable *v) -{ - switch (v->type) - { - case NUMERIC: - if (val->f == SYSMIS) - return 1; - return is_num_user_missing (val->f, v); - case ALPHA: - return is_str_user_missing (val->s, v); - default: - assert (0); - } - abort (); -} - -/* Return nonzero only if value VAL is user-missing for variable V. */ -int -is_user_missing (const union value *val, const struct variable *v) -{ - switch (v->type) - { - case NUMERIC: - return is_num_user_missing (val->f, v); - case ALPHA: - return is_str_user_missing (val->s, v); - default: - assert (0); - } - abort (); -} /* Returns true if NAME is an acceptable name for a variable, false otherwise. If ISSUE_ERROR is true, issues an @@ -292,7 +171,7 @@ var_is_valid_name (const char *name, bool issue_error) if (lex_id_to_token (name, strlen (name)) != T_ID) { if (issue_error) - msg (SE, _("%s may not be used as a variable name because it " + msg (SE, _("`%s' may not be used as a variable name because it " "is a reserved word."), name); return false; } @@ -401,3 +280,40 @@ var_set_short_name_suffix (struct variable *v, const char *base, int suffix) ofs = strlen (v->short_name); strcpy (v->short_name + ofs, start); } + + +/* Returns the dictionary class corresponding to a variable named + NAME. */ +enum dict_class +dict_class_from_id (const char *name) +{ + assert (name != NULL); + + switch (name[0]) + { + default: + return DC_ORDINARY; + case '$': + return DC_SYSTEM; + case '#': + return DC_SCRATCH; + } +} + +/* Returns the name of dictionary class DICT_CLASS. */ +const char * +dict_class_to_name (enum dict_class dict_class) +{ + switch (dict_class) + { + case DC_ORDINARY: + return _("ordinary"); + case DC_SYSTEM: + return _("system"); + case DC_SCRATCH: + return _("scratch"); + default: + assert (0); + abort (); + } +}