X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fsyntax-gen.c;h=93d52c79c05b0fcbf26a940142654ddd1173eb94;hb=bf62643ef9f4f991acd777b26aa747adc7886d8f;hp=fe88e62913d776cbc83331dbda25e6e09a018855;hpb=b54cf7b8d3259f5de57a2e0ca53fa2e2c5185abf;p=pspp diff --git a/src/ui/syntax-gen.c b/src/ui/syntax-gen.c index fe88e62913..93d52c79c0 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 @@ -30,7 +30,9 @@ #include "libpspp/i18n.h" #include "libpspp/message.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. */ @@ -176,7 +178,7 @@ syntax_gen_number (struct string *output, { char s[DBL_BUFSIZE_BOUND]; - dtoastr (s, sizeof s, 0, 0, number); + c_dtoastr (s, sizeof s, 0, 0, number); ds_put_cstr (output, s); } } @@ -231,6 +233,9 @@ 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)); format += copy; @@ -239,7 +244,19 @@ syntax_gen_pspp_valist (struct string *output, const char *format, return; assert (*format == '%'); format++; - switch (*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': { @@ -266,16 +283,23 @@ syntax_gen_pspp_valist (struct string *output, const char *format, break; case 'f': + case 'g': { + char conv[32]; double d = va_arg (args, double); - switch (*format++) + int x = 0; + conv[x++] = '%'; + conv[x] = '\0'; + if (precision != -1) { - case 'p': - ds_put_c_format (output, "%f", d); - break; - default: - NOT_REACHED (); + strcat (conv, "."); + strcat (conv, qualifier); + x += strlen (qualifier) + 1; } + conv[x++] = directive; + conv[x++] = '\0'; + + ds_put_c_format (output, conv, d); break; } @@ -300,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 %.