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 950abc1528..66e642eb97 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 d5f5f38717..ad108f5a60 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 0ce371afb8..aff3f2a287 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 4cf21cf044..2cf9cf2bb9 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 8cff0e1c5e..4f9004a361 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 a3f4cf8f52..c0a6f47715 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 6e234c4b23..8ce2d12576 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 57a742c96c..60c8f40829 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