Change many %g format specifiers to %.*g with precision DBL_DIG + 1.
[pspp] / src / ui / gui / select-cases-dialog.c
index 0f50c91a3f96cf8dcbe60049cdfaa4158c74efb1..2b4634808b31f8004707e8b0b844f93183fba83d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2008, 2009, 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
@@ -17,6 +17,7 @@
 #include <config.h>
 
 #include "select-cases-dialog.h"
+#include <float.h>
 #include <gtk/gtk.h>
 #include "executor.h"
 #include "psppire-dialog.h"
 #include "dict-display.h"
 #include "dialog-common.h"
 #include "widget-io.h"
-#include <language/syntax-string-source.h>
+#include "psppire-scanf.h"
+#include "builder-wrapper.h"
 #include "helper.h"
+
 #include <xalloc.h>
 
 
@@ -58,27 +61,6 @@ struct select_cases_dialog
 static gchar * generate_syntax (const struct select_cases_dialog *scd);
 
 
-static void
-set_sensitivity_from_toggle (GtkToggleButton *togglebutton,  gpointer data)
-{
-  GtkWidget *w = data;
-  gboolean active = gtk_toggle_button_get_active (togglebutton);
-
-  gtk_widget_set_sensitive (w, active);
-}
-
-static void
-set_sensitivity_from_toggle_invert (GtkToggleButton *togglebutton,
-                                   gpointer data)
-{
-  GtkWidget *w = data;
-  gboolean active = gtk_toggle_button_get_active (togglebutton);
-
-  gtk_widget_set_sensitive (w, !active);
-}
-
-
-
 static const gchar label1[]=N_("Approximately %3d%% of all cases.");
 static const gchar label2[]=N_("Exactly %3d cases from the first %3d cases.");
 
@@ -104,7 +86,7 @@ sample_subdialog (GtkButton *b, gpointer data)
 
   if ( ! scd->hbox1 )
     {
-      scd->hbox1 = widget_scanf (gettext (label1), &scd->spinbutton);
+      scd->hbox1 = psppire_scanf_new (gettext (label1), &scd->spinbutton);
 
       gtk_widget_show (scd->hbox1);
 
@@ -121,7 +103,7 @@ sample_subdialog (GtkButton *b, gpointer data)
   if ( ! scd->hbox2 )
     {
       scd->hbox2 =
-       widget_scanf (gettext (label2), &scd->spinbutton1, &scd->spinbutton2);
+       psppire_scanf_new (gettext (label2), &scd->spinbutton1, &scd->spinbutton2);
 
       gtk_spin_button_set_range (GTK_SPIN_BUTTON (scd->spinbutton1),
                                 1, case_count);
@@ -348,22 +330,10 @@ select_cases_dialog (PsppireDataWindow *de)
   switch (response)
     {
     case GTK_RESPONSE_OK:
-      {
-       gchar *syntax = generate_syntax (&scd);
-
-       struct getl_interface *sss = create_syntax_string_source (syntax);
-       execute_syntax (sss);
-
-       g_free (syntax);
-      }
+      g_free (execute_syntax_string (de, generate_syntax (&scd)));
       break;
     case PSPPIRE_RESPONSE_PASTE:
-      {
-       gchar *syntax = generate_syntax (&scd);
-        paste_syntax_to_window (syntax);
-
-       g_free (syntax);
-      }
+      g_free (paste_syntax_to_window (generate_syntax (&scd)));
       break;
     default:
       break;
@@ -377,12 +347,14 @@ static gchar *
 generate_syntax_filter (const struct select_cases_dialog *scd)
 {
   gchar *text = NULL;
-  GString *string = g_string_new ("");
+  struct string dss;
 
-  const gchar filter[]="filter_$";
+  const gchar *filter = "filter_$";
   const gchar key[]="case_$";
 
-  if ( gtk_toggle_button_get_active
+  ds_init_empty (&dss);
+
+  if (gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
                                              "radiobutton-range"))))
     {
@@ -394,14 +366,14 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
        GTK_SPIN_BUTTON (get_widget_assert (scd->xml,
                                           "range-dialog-last"));
 
-      g_string_append_printf (string,
+      ds_put_c_format (&dss,
                              "COMPUTE filter_$ = ($CASENUM >= %ld "
                               "AND $CASENUM <= %ld).\n",
                              (long) gtk_spin_button_get_value (first),
                              (long) gtk_spin_button_get_value (last)
                              );
 
-      g_string_append (string, "EXECUTE.\n");
+      ds_put_cstr (&dss, "EXECUTE.\n");
     }
   else if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -416,10 +388,10 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
          const double percentage =
            gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton));
 
-         g_string_append_printf (string,
-                                 "COMPUTE %s = RV.UNIFORM (0,1) < %g.\n",
+         ds_put_c_format (&dss,
+                                 "COMPUTE %s = RV.UNIFORM (0,1) < %.*g.\n",
                                  filter,
-                                 percentage / 100.0 );
+                                  DBL_DIG + 1, percentage / 100.0 );
        }
       else
        {
@@ -431,56 +403,62 @@ generate_syntax_filter (const struct select_cases_dialog *scd)
 
          const gchar ranvar[]="rv_$";
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = $CASENUM.\n", key);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = %s > %d.\n",
                                  filter, key, from_n_cases);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = RV.UNIFORM (0, 1).\n",
                                  ranvar);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "SORT BY %s, %s.\n",
                                  filter, ranvar);
 
-         g_string_append (string, "EXECUTE.\n");
+         ds_put_cstr (&dss, "EXECUTE.\n");
                                  
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = $CASENUM.\n",
                                  filter );
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "COMPUTE %s = %s <= %d\n",
                                  filter,
                                  filter,
                                  n_cases );
 
-         g_string_append (string, "EXECUTE.\n");
+         ds_put_cstr (&dss, "EXECUTE.\n");
 
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "SORT BY %s.\n",
                                  key);
 
-         g_string_append_printf (string,
+         ds_put_c_format (&dss,
                                  "DELETE VARIABLES %s, %s.\n",
                                  key, ranvar);
-
        }
 
-      g_string_append (string, "EXECUTE.\n");
-
+      ds_put_cstr (&dss, "EXECUTE.\n");
     }
+  else
+    {
+      GtkEntry *entry =
+       GTK_ENTRY (get_widget_assert (scd->xml,
+                                     "filter-variable-entry"));
+      filter = gtk_entry_get_text (entry);
+    }
+
+  ds_put_c_format (&dss, "FILTER BY %s.\n", filter);
 
+  text  = ds_steal_cstr (&dss);
 
-  g_string_append_printf  (string, "FILTER BY %s.\n", filter);
+  ds_destroy (&dss);
 
-  text  = string->str;
-  g_string_free (string, FALSE);
   return text;
 }
 
@@ -488,7 +466,7 @@ static gchar *
 generate_syntax_delete (const struct select_cases_dialog *scd)
 {
   gchar *text = NULL;
-  GString *string = NULL;
+  struct string dss;
 
   if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -497,7 +475,7 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
       return xstrdup ("\n");
     }
 
-  string = g_string_new ("");
+  ds_init_empty (&dss);
 
   if ( gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON (get_widget_assert (scd->xml,
@@ -507,13 +485,13 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
       get_widget_assert (scd->xml,
                         "radiobutton-sample-percent");
 
-    g_string_append (string, "SAMPLE ");
+    ds_put_cstr (&dss, "SAMPLE ");
 
     if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (random_sample)))
       {
        const double percentage =
          gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton));
-       g_string_append_printf (string, "%g.", percentage / 100.0);
+       ds_put_c_format (&dss, "%g.", percentage / 100.0);
       }
     else
       {
@@ -522,7 +500,7 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        const gint from_n_cases =
          gtk_spin_button_get_value (GTK_SPIN_BUTTON (scd->spinbutton2));
 
-       g_string_append_printf (string, "%d FROM %d .", n_cases, from_n_cases);
+       ds_put_c_format (&dss, "%d FROM %d .", n_cases, from_n_cases);
       }
 
   }
@@ -538,14 +516,14 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        GTK_SPIN_BUTTON (get_widget_assert (scd->xml,
                                           "range-dialog-last"));
 
-      g_string_append_printf (string,
+      ds_put_c_format (&dss,
                              "COMPUTE filter_$ = ($CASENUM >= %ld "
                               "AND $CASENUM <= %ld).\n",
                              (long) gtk_spin_button_get_value (first),
                              (long) gtk_spin_button_get_value (last)
                              );
-      g_string_append (string, "EXECUTE.\n");
-      g_string_append_printf (string, "SELECT IF filter_$.\n");
+      ds_put_cstr (&dss, "EXECUTE.\n");
+      ds_put_c_format (&dss, "SELECT IF filter_$.\n");
 
     }
   else if ( gtk_toggle_button_get_active
@@ -557,17 +535,17 @@ generate_syntax_delete (const struct select_cases_dialog *scd)
        GTK_ENTRY (get_widget_assert (scd->xml,
                                      "filter-variable-entry"));
 
-      g_string_append_printf (string, "SELECT IF (%s <> 0).",
+      ds_put_c_format (&dss, "SELECT IF (%s <> 0).",
                              gtk_entry_get_text (entry));
     }
 
 
-  g_string_append (string, "\n");
+  ds_put_cstr (&dss, "\n");
 
+  text = ds_steal_cstr (&dss);
 
+  ds_destroy (&dss);
 
-  text  = string->str;
-  g_string_free (string, FALSE);
   return text;
 }