From e588208caf725f595d63a07ddd2116331173e81d Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 24 May 2009 11:26:41 -0700 Subject: [PATCH] New function parse_value() for parsing a value of specified width. Occasionally a value of a given width needs to be parsed from syntax. This commit adds a helper function for doing so and modifies a few pieces of code to use it. Probably there are other places where it would be useful that could not easily be found with "grep". This commit also renames the range-parser code to value-parser and puts the new function in there, as a natural generalization. Suggested by John Darrington. --- src/language/dictionary/missing-values.c | 4 +-- src/language/expressions/evaluate.c | 8 ++---- src/language/lexer/automake.mk | 4 +-- .../lexer/{range-parser.c => value-parser.c} | 28 +++++++++++++++++-- .../lexer/{range-parser.h => value-parser.h} | 10 ++++--- src/language/stats/t-test.q | 26 +---------------- src/language/xforms/count.c | 2 +- src/language/xforms/recode.c | 2 +- 8 files changed, 42 insertions(+), 42 deletions(-) rename src/language/lexer/{range-parser.c => value-parser.c} (84%) rename src/language/lexer/{range-parser.h => value-parser.h} (80%) diff --git a/src/language/dictionary/missing-values.c b/src/language/dictionary/missing-values.c index 950abc15..66e642eb 100644 --- a/src/language/dictionary/missing-values.c +++ b/src/language/dictionary/missing-values.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,8 +26,8 @@ #include #include #include +#include #include -#include #include #include #include diff --git a/src/language/expressions/evaluate.c b/src/language/expressions/evaluate.c index d5f5f387..ad108f5a 100644 --- a/src/language/expressions/evaluate.c +++ b/src/language/expressions/evaluate.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "xalloc.h" @@ -174,11 +175,8 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) else c = case_unshare_and_resize (c, dict_get_proto (d)); - if (lex_is_number (lexer)) - case_data_rw (c, v)->f = lex_tokval (lexer); - else - memcpy (case_str_rw (c, v), ds_data (lex_tokstr (lexer)), - var_get_width (v)); + if (!parse_value (lexer, case_data_rw (c, v), var_get_width (v))) + NOT_REACHED (); lex_get (lexer); if (!lex_force_match (lexer, ')')) diff --git a/src/language/lexer/automake.mk b/src/language/lexer/automake.mk index 0ce371af..aff3f2a2 100644 --- a/src/language/lexer/automake.mk +++ b/src/language/lexer/automake.mk @@ -7,8 +7,8 @@ language_lexer_sources = \ src/language/lexer/subcommand-list.h \ src/language/lexer/format-parser.c \ src/language/lexer/format-parser.h \ - src/language/lexer/range-parser.c \ - src/language/lexer/range-parser.h \ + src/language/lexer/value-parser.c \ + src/language/lexer/value-parser.h \ src/language/lexer/variable-parser.c \ src/language/lexer/variable-parser.h diff --git a/src/language/lexer/range-parser.c b/src/language/lexer/value-parser.c similarity index 84% rename from src/language/lexer/range-parser.c rename to src/language/lexer/value-parser.c index 4cf21cf0..2cf9cf2b 100644 --- a/src/language/lexer/range-parser.c +++ b/src/language/lexer/value-parser.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ along with this program. If not, see . */ #include -#include "range-parser.h" +#include "value-parser.h" #include #include #include @@ -119,3 +119,27 @@ parse_number (struct lexer *lexer, double *x, const enum fmt_type *format) return false; } } + +/* Parses the current token from LEXER into value V, which must + already have been initialized with the specified WIDTH. + Returns true if successful, false otherwise. */ +bool +parse_value (struct lexer *lexer, union value *v, int width) +{ + if (width == 0) + { + if (!lex_force_num (lexer)) + return false; + v->f = lex_tokval (lexer); + } + else + { + if (!lex_force_string (lexer)) + return false; + value_copy_str_rpad (v, width, ds_cstr (lex_tokstr (lexer)), ' '); + } + + lex_get (lexer); + + return true; +} diff --git a/src/language/lexer/range-parser.h b/src/language/lexer/value-parser.h similarity index 80% rename from src/language/lexer/range-parser.h rename to src/language/lexer/value-parser.h index 8cff0e1c..4f9004a3 100644 --- a/src/language/lexer/range-parser.h +++ b/src/language/lexer/value-parser.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,14 +14,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef RANGE_PRS_H -#define RANGE_PRS_H 1 +#ifndef VALUE_PARSER_H +#define VALUE_PARSER_H 1 #include struct lexer; enum fmt_type; +union value; bool parse_num_range (struct lexer *, double *x, double *y, const enum fmt_type *fmt); +bool parse_value (struct lexer *, union value *, int width); -#endif /* range-prs.h */ +#endif /* value-parser.h */ diff --git a/src/language/stats/t-test.q b/src/language/stats/t-test.q index a3f4cf8f..c0a6f477 100644 --- a/src/language/stats/t-test.q +++ b/src/language/stats/t-test.q @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -126,8 +127,6 @@ struct t_test_proc union value g_value[2]; /* CMP_EQ only: Per-group indep var values. */ }; -static int parse_value (struct lexer *, union value *, int width); - /* Statistics Summary Box */ struct ssbox { @@ -421,29 +420,6 @@ tts_custom_pairs (struct lexer *lexer, struct dataset *ds, free (vars2); return 1; } - -/* Parses the current token (numeric or string, depending on type) - value v and returns success. */ -static int -parse_value (struct lexer *lexer, union value *v, int width) -{ - if (width == 0) - { - if (!lex_force_num (lexer)) - return 0; - v->f = lex_tokval (lexer); - } - else - { - if (!lex_force_string (lexer)) - return 0; - value_copy_str_rpad (v, width, ds_cstr (lex_tokstr (lexer)), ' '); - } - - lex_get (lexer); - - return 1; -} /* Implementation of the SSBOX object. */ diff --git a/src/language/xforms/count.c b/src/language/xforms/count.c index 6e234c4b..8ce2d125 100644 --- a/src/language/xforms/count.c +++ b/src/language/xforms/count.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/language/xforms/recode.c b/src/language/xforms/recode.c index 57a742c9..60c8f408 100644 --- a/src/language/xforms/recode.c +++ b/src/language/xforms/recode.c @@ -29,8 +29,8 @@ #include #include #include +#include #include -#include #include #include #include -- 2.30.2