X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fsyntax-gen.c;h=dca3bd3c5b3cb778dde442553cebd40c83c23152;hb=20818d7ae4bc4d4256d78683c9eb8d26416acd30;hp=35de44da0dc9dfe71e1ba9cb3ae2a19883b47192;hpb=d8493b3b0617cc447446a70b031a69079bc19002;p=pspp diff --git a/src/ui/syntax-gen.c b/src/ui/syntax-gen.c index 35de44da0d..dca3bd3c5b 100644 --- a/src/ui/syntax-gen.c +++ b/src/ui/syntax-gen.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2010 Free Software Foundation, Inc. + Copyright (C) 2008, 2010, 2011 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 +#include "ui/syntax-gen.h" #include #include @@ -27,8 +27,12 @@ #include "data/value.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" +#include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" +#include "libpspp/misc.h" + +#include "gl/ftoastr.h" /* Appends to OUTPUT a pair of hex digits for each byte in IN. */ static void @@ -154,8 +158,7 @@ syntax_gen_number (struct string *output, s = data_out (&v_in, "FIXME", format); /* FIXME: UTF8 encoded strings will fail here */ - error = data_in (ss_cstr (s), LEGACY_NATIVE, - format->type, &v_out, 0, NULL); + error = data_in (ss_cstr (s), C_ENCODING, format->type, &v_out, 0, NULL); ok = error == NULL; free (error); @@ -172,18 +175,10 @@ syntax_gen_number (struct string *output, ds_put_cstr (output, "SYSMIS"); else { - /* FIXME: This should consistently yield precisely the same - value as NUMBER on input, but its results for values - cannot be exactly represented in decimal are ugly: many - of them will have far more decimal digits than are - needed. The free-format floating point output routine - from Steele and White, "How to Print Floating-Point - Numbers Accurately" is really what we want. The MPFR - library has an implementation of this, or equivalent - functionality, in its mpfr_strtofr routine, but it would - not be nice to make PSPP depend on this. Probably, we - should implement something equivalent to it. */ - ds_put_format (output, "%.*g", DBL_DIG + 1, number); + char s[DBL_BUFSIZE_BOUND]; + + c_dtoastr (s, sizeof s, 0, 0, number); + ds_put_cstr (output, s); } } @@ -237,6 +232,7 @@ syntax_gen_pspp_valist (struct string *output, const char *format, { for (;;) { + char directive; size_t copy = strcspn (format, "%"); ds_put_substring (output, ss_buffer (format, copy)); format += copy; @@ -245,7 +241,8 @@ syntax_gen_pspp_valist (struct string *output, const char *format, return; assert (*format == '%'); format++; - switch (*format++) + directive = *format++; + switch (directive) { case 's': { @@ -272,16 +269,14 @@ syntax_gen_pspp_valist (struct string *output, const char *format, break; case 'f': + case 'g': { + char conv[3]; double d = va_arg (args, double); - switch (*format++) - { - case 'p': - ds_put_format (output, "%f", d); - break; - default: - NOT_REACHED (); - } + conv[0]='%'; + conv[1]=directive; + conv[2]='\0'; + ds_put_c_format (output, conv, d); break; }