psppire-data-editor: Avoid ' modifier with g_string_append_printf(). 20120708001829/pspp
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 7 Jul 2012 18:39:47 +0000 (11:39 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 7 Jul 2012 18:39:47 +0000 (11:39 -0700)
On Windows, g_string_append_printf() does not understand the '
modifier, so use ds_put_format() instead, which does.

Reported by John Darrington.

src/libpspp/str.c
src/libpspp/str.h
src/ui/gui/psppire-data-editor.c

index 79e9ea1e14dae1def667b3f4edd1ea60f4e0ac5d..44e4a1da28ee7183a98eb1e819a755bc55759c0f 100644 (file)
@@ -1548,6 +1548,13 @@ ds_put_byte_multiple (struct string *st, int ch, size_t cnt)
   memset (ds_put_uninit (st, cnt), ch, cnt);
 }
 
+/* Appends Unicode code point UC to ST in UTF-8 encoding. */
+void
+ds_put_unichar (struct string *st, ucs4_t uc)
+{
+  ds_extend (st, ds_length (st) + 6);
+  st->ss.length += u8_uctomb (CHAR_CAST (uint8_t *, ds_end (st)), uc, 6);
+}
 
 /* If relocation has been enabled, replace ST,
    with its relocated version */
index c8ab726797f8fbf82bdea0e336059d1ab1eec895..e017696cf60bdc1efc9dd12a744e3d9b7befeec5 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 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
@@ -223,6 +223,7 @@ bool ds_read_stream (struct string *, size_t size, size_t cnt, FILE *stream);
 /* Append. */
 void ds_put_byte (struct string *, int ch);
 void ds_put_byte_multiple (struct string *, int ch, size_t);
+void ds_put_unichar (struct string *, ucs4_t uc);
 void ds_put_cstr (struct string *, const char *);
 void ds_put_substring (struct string *, struct substring);
 void ds_put_vformat (struct string *st, const char *, va_list)
index b5f22735cf64de54bf440370952b9084cdb43c26..5fb04b7ea109656ddf2149516d6846472a43c716 100644 (file)
@@ -24,6 +24,7 @@
 #include "data/datasheet.h"
 #include "data/value-labels.h"
 #include "libpspp/range-set.h"
+#include "libpspp/str.h"
 #include "ui/gui/helper.h"
 #include "ui/gui/pspp-sheet-selection.h"
 #include "ui/gui/psppire-data-sheet.h"
@@ -427,21 +428,21 @@ refresh_entry (PsppireDataEditor *de)
         }
       else
         {
-          GString *string;
-
-          string = g_string_sized_new (25);
-          g_string_append_printf (string,
-                                  ngettext ("%'d case", "%'d cases", n_cases),
-                                  n_cases);
-          g_string_append_c (string, ' ');
-          g_string_append_unichar (string, 0xd7); /* U+00D7 MULTIPLICATION SIGN */
-          g_string_append_c (string, ' ');
-          g_string_append_printf (string,
-                                  ngettext ("%'d variable", "%'d variables",
-                                            n_vars),
-                                  n_vars);
-          ref_cell_text = string->str;
-          g_string_free (string, FALSE);
+          struct string s;
+
+          /* The glib string library does not understand the ' printf modifier
+             on all platforms, but the "struct string" library does (because
+             Gnulib fixes that problem), so use the latter.  */
+          ds_init_empty (&s);
+          ds_put_format (&s, ngettext ("%'d case", "%'d cases", n_cases),
+                         n_cases);
+          ds_put_byte (&s, ' ');
+          ds_put_unichar (&s, 0xd7); /* U+00D7 MULTIPLICATION SIGN */
+          ds_put_byte (&s, ' ');
+          ds_put_format (&s, ngettext ("%'d variable", "%'d variables",
+                                       n_vars),
+                         n_vars);
+          ref_cell_text = ds_steal_cstr (&s);
         }
 
       psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY (de->datum_entry),