X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fsyntax-gen.c;h=b338bdf9c4c742dc07dc81d393a37accdc9281ec;hb=76762fd5bcdcdf30f45ef7775f7b2a3cad7cc0e0;hp=dca3bd3c5b3cb778dde442553cebd40c83c23152;hpb=6f3865480503c571963d8a2d1af858a4d72d4e88;p=pspp diff --git a/src/ui/syntax-gen.c b/src/ui/syntax-gen.c index dca3bd3c5b..b338bdf9c4 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, 2011 Free Software Foundation, Inc. + Copyright (C) 2008, 2010, 2011, 2014 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 @@ -29,9 +29,11 @@ #include "libpspp/cast.h" #include "libpspp/i18n.h" #include "libpspp/message.h" +#include "data/settings.h" #include "libpspp/str.h" #include "libpspp/misc.h" +#include "gl/c-ctype.h" #include "gl/ftoastr.h" /* Appends to OUTPUT a pair of hex digits for each byte in IN. */ @@ -155,10 +157,11 @@ syntax_gen_number (struct string *output, bool ok; v_in.f = number; - s = data_out (&v_in, "FIXME", format); + s = data_out (&v_in, "FIXME", format, settings_get_fmt_settings ()); /* FIXME: UTF8 encoded strings will fail here */ - error = data_in (ss_cstr (s), C_ENCODING, format->type, &v_out, 0, NULL); + error = data_in (ss_cstr (s), C_ENCODING, format->type, + settings_get_fmt_settings (), &v_out, 0, NULL); ok = error == NULL; free (error); @@ -195,10 +198,8 @@ syntax_gen_value (struct string *output, const union value *value, int width, if (width == 0) syntax_gen_number (output, value->f, format); else - { - char *s = CHAR_CAST_BUG (char *, value_str (value, width)); - syntax_gen_string (output, ss_buffer (s, width)); - } + syntax_gen_string (output, + ss_buffer (CHAR_CAST (const char *, value->s), width)); } /* Appends THRU to OUTPUT. If LOW is LOWEST, then @@ -232,6 +233,8 @@ syntax_gen_pspp_valist (struct string *output, const char *format, { for (;;) { + char qualifier[16]; + int precision = -1; char directive; size_t copy = strcspn (format, "%"); ds_put_substring (output, ss_buffer (format, copy)); @@ -242,6 +245,17 @@ syntax_gen_pspp_valist (struct string *output, const char *format, assert (*format == '%'); format++; directive = *format++; + if (directive == '.') + { + int x = 0; + while (directive = *format++, c_isdigit (directive)) + { + assert (x < 16); + qualifier[x++] = directive; + } + qualifier[x++] = '\0'; + precision = atoi (qualifier); + } switch (directive) { case 's': @@ -271,12 +285,21 @@ syntax_gen_pspp_valist (struct string *output, const char *format, case 'f': case 'g': { - char conv[3]; + char conv[32]; double d = va_arg (args, double); - conv[0]='%'; - conv[1]=directive; - conv[2]='\0'; - ds_put_c_format (output, conv, d); + int x = 0; + conv[x++] = '%'; + conv[x] = '\0'; + if (precision != -1) + { + strcat (conv, "."); + strcat (conv, qualifier); + x += strlen (qualifier) + 1; + } + conv[x++] = directive; + conv[x++] = '\0'; + + ds_put_c_format (output, conv, d); break; } @@ -301,9 +324,7 @@ syntax_gen_pspp_valist (struct string *output, const char *format, %d: Same as printf's %d. - %fp: The double argument is formatted precisely as a PSPP - number, as if with a call to syntax_gen_number with a - null FORMAT argument. + %f %g: Same as printf. %%: Literal %.