X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fexpressions%2Fevaluate.c;h=7543aed55e7ad29c167c9a5ee47c63b7d48660ec;hb=2f3bca35516d8f3b3df76b3152fd5c77ff1f09cf;hp=fea0e56b933b2838f5cf2deaad469969f0fd17a1;hpb=81579d9e9f994fb2908f50af41c3eb033d216e58;p=pspp diff --git a/src/language/expressions/evaluate.c b/src/language/expressions/evaluate.c index fea0e56b93..7543aed55e 100644 --- a/src/language/expressions/evaluate.c +++ b/src/language/expressions/evaluate.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012 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 @@ -16,7 +16,7 @@ #include -#include "language/expressions/evaluate.h" +#include "evaluate.h" #include @@ -26,6 +26,7 @@ #include "language/expressions/private.h" #include "language/lexer/value-parser.h" #include "libpspp/pool.h" +#include "output/driver.h" #include "xalloc.h" @@ -132,7 +133,6 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) else if (lex_match (lexer, T_LPAREN)) { struct variable *v; - size_t old_value_cnt; int width; if (!lex_force_id (lexer)) @@ -153,13 +153,12 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) goto done; } - if ( ds == NULL ) + if (ds == NULL) { - ds = create_dataset (); + ds = dataset_create (NULL, ""); d = dataset_dict (ds); } - old_value_cnt = dict_get_next_value_idx (d); v = dict_create_var (d, name, width); if (v == NULL) { @@ -174,7 +173,7 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) else c = case_unshare_and_resize (c, dict_get_proto (d)); - if (!parse_value (lexer, case_data_rw (c, v), var_get_width (v))) + if (!parse_value (lexer, case_data_rw (c, v), v)) NOT_REACHED (); if (!lex_force_match (lexer, T_RPAREN)) @@ -183,20 +182,16 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) else break; } - if (lex_token (lexer) != T_SLASH) - { - lex_force_match (lexer, T_SLASH); - goto done; - } - lex_get (lexer); + if (!lex_force_match (lexer, T_SLASH)) + goto done; expr = expr_parse_any (lexer, ds, optimize); if (!expr || lex_end_of_command (lexer) != CMD_SUCCESS) { if (expr != NULL) expr_free (expr); - printf ("error\n"); + output_log ("error"); goto done; } @@ -209,28 +204,25 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) { double d = expr_evaluate_num (expr, c, 0); if (d == SYSMIS) - printf ("sysmis\n"); + output_log ("sysmis"); else - printf ("%.2f\n", d); + output_log ("%.2f", d); } break; case OP_boolean: { double b = expr_evaluate_num (expr, c, 0); - printf ("%s\n", - b == SYSMIS ? "sysmis" : b == 0.0 ? "false" : "true"); + output_log ("%s", + b == SYSMIS ? "sysmis" : b == 0.0 ? "false" : "true"); } break; case OP_string: { - struct substring s; - expr_evaluate (expr, c, 0, &s); - - putchar ('"'); - fwrite (s.string, s.length, 1, stdout); - puts ("\""); + struct substring out; + expr_evaluate (expr, c, 0, &out); + output_log ("\"%.*s\"", (int) out.length, out.string); break; } @@ -242,8 +234,7 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) retval = CMD_SUCCESS; done: - if (ds) - destroy_dataset (ds); + dataset_destroy (ds); case_unref (c); @@ -255,57 +246,58 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED) void expr_debug_print_postfix (const struct expression *e) { - size_t i; + struct string s = DS_EMPTY_INITIALIZER; - for (i = 0; i < e->op_cnt; i++) + for (size_t i = 0; i < e->op_cnt; i++) { union operation_data *op = &e->ops[i]; if (i > 0) - putc (' ', stderr); + ds_put_byte (&s, ' '); switch (e->op_types[i]) { case OP_operation: if (op->operation == OP_return_number) - printf ("return_number"); + ds_put_cstr (&s, "return_number"); else if (op->operation == OP_return_string) - printf ("return_string"); + ds_put_cstr (&s, "return_string"); else if (is_function (op->operation)) - printf ("%s", operations[op->operation].prototype); + ds_put_format (&s, "%s", operations[op->operation].prototype); else if (is_composite (op->operation)) - printf ("%s", operations[op->operation].name); + ds_put_format (&s, "%s", operations[op->operation].name); else - printf ("%s:", operations[op->operation].name); + ds_put_format (&s, "%s:", operations[op->operation].name); break; case OP_number: if (op->number != SYSMIS) - printf ("n<%g>", op->number); + ds_put_format (&s, "n<%g>", op->number); else - printf ("n"); + ds_put_cstr (&s, "n"); break; case OP_string: - printf ("s<%.*s>", - (int) op->string.length, - op->string.string != NULL ? op->string.string : ""); + ds_put_cstr (&s, "s<"); + ds_put_substring (&s, op->string); + ds_put_byte (&s, '>'); break; case OP_format: { char str[FMT_STRING_LEN_MAX + 1]; fmt_to_string (op->format, str); - printf ("f<%s>", str); + ds_put_format (&s, "f<%s>", str); } break; case OP_variable: - printf ("v<%s>", var_get_name (op->variable)); + ds_put_format (&s, "v<%s>", var_get_name (op->variable)); break; case OP_vector: - printf ("vec<%s>", vector_get_name (op->vector)); + ds_put_format (&s, "vec<%s>", vector_get_name (op->vector)); break; case OP_integer: - printf ("i<%d>", op->integer); + ds_put_format (&s, "i<%d>", op->integer); break; default: NOT_REACHED (); } } - printf ("\n"); + output_log ("%s", ds_cstr (&s)); + ds_destroy (&s); }