Merge remote-tracking branch 'origin/master' into sheet
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 7 Apr 2016 11:30:01 +0000 (13:30 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 7 Apr 2016 11:30:01 +0000 (13:30 +0200)
1  2 
configure.ac
src/data/variable.c

diff --combined configure.ac
index b8c84ea33d5354a5e9843286cc2d19f23bd8a0e3,417a6c2e350ea3a713a8ca3f262a629dd25a1dbb..4891c906f03db91dbd54d44556ad22b753d094ef
@@@ -2,7 -2,7 +2,7 @@@ dnl Process this file with autoconf to 
  
  dnl Initialize.
  AC_PREREQ(2.63)
- AC_INIT([GNU PSPP], [0.9.0], [bug-gnu-pspp@gnu.org], [pspp])
+ AC_INIT([GNU PSPP], [0.10.2], [bug-gnu-pspp@gnu.org], [pspp])
  AC_CONFIG_AUX_DIR([build-aux])
  AC_CONFIG_HEADERS([config.h])
  AC_CONFIG_TESTDIR([tests])
@@@ -90,8 -90,8 +90,8 @@@ if test "$with_cairo" != no && test "$w
    PKG_CHECK_MODULES([GTKSOURCEVIEW], [gtksourceview-3.0 >= 3.4.2], [],
      [PSPP_REQUIRED_PREREQ([gtksourceview 3.0 version 3.4.2 or later (or use --without-gui)])])
  
 -  PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.32], [],
 -    [PSPP_REQUIRED_PREREQ([glib 2.0 version 2.32 or later (or use --without-gui)])])
 +  PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.44], [],
 +    [PSPP_REQUIRED_PREREQ([glib 2.0 version 2.44 or later (or use --without-gui)])])
  
    AC_ARG_VAR([GLIB_GENMARSHAL])
    AC_CHECK_PROGS([GLIB_GENMARSHAL], [glib-genmarshal])
diff --combined src/data/variable.c
index 349ea21c7cca1e76e4a0793c75f3b8bfbba8879e,6a00d014a18df32b7a85cb90bd3d6b3871444a7c..42a07ee8bb5d3481bec1a4656f13bba1dd61a393
@@@ -1,5 -1,5 +1,5 @@@
  /* PSPP - a program for statistical analysis.
 -   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
 +   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 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
  
  #include "gettext.h"
  #define _(msgid) gettext (msgid)
 +#define N_(msgid) (msgid)
 +
 +/* This should follow the definition in Gtk */
 +typedef struct
 +{
 +  int value;
 +  const char *name;
 +  const char *label;
 +} GEnumValue;
 +
 +const GEnumValue align[] =
 +  {
 +    {ALIGN_LEFT,   "left", N_("Left")},
 +    {ALIGN_RIGHT,  "right", N_("Right")},
 +    {ALIGN_CENTRE, "center", N_("Center")},
 +    {0,0,0}
 +  };
 +
 +const GEnumValue measure[] =
 +  {
 +    {MEASURE_NOMINAL, "nominal", N_("Nominal")},
 +    {MEASURE_ORDINAL, "ordinal", N_("Ordinal")},
 +    {MEASURE_SCALE,   "scale", N_("Scale")},
 +    {0,0,0}
 +  };
 +
 +const GEnumValue role[] =
 +  {
 +    {ROLE_INPUT,  "input",    N_("Input")},
 +    {ROLE_TARGET, "output",   N_("Output")},
 +    {ROLE_BOTH,   "both",     N_("Both")},
 +    {ROLE_NONE,   "none",     N_("None")},
 +    {ROLE_PARTITION, "partition", N_("Partition")},
 +    {ROLE_SPLIT,  "split",    N_("Split")},
 +    {0,0,0}
 +  };
  
  /* A variable. */
  struct variable
@@@ -807,8 -771,20 +807,8 @@@ measure_is_valid (enum measure m
  const char *
  measure_to_string (enum measure m)
  {
 -  switch (m)
 -    {
 -    case MEASURE_NOMINAL:
 -      return _("Nominal");
 -
 -    case MEASURE_ORDINAL:
 -      return _("Ordinal");
 -
 -    case MEASURE_SCALE:
 -      return _("Scale");
 -
 -    default:
 -      return "Invalid";
 -    }
 +  assert (m == measure[m].value);
 +  return gettext (measure[m].label);
  }
  
  /* Returns a string version of measurement level M, for use in PSPP command
@@@ -890,10 -866,31 +890,10 @@@ var_role_is_valid (enum var_role role
  
  /* Returns a string version of ROLE, for display to a user. */
  const char *
 -var_role_to_string (enum var_role role)
 +var_role_to_string (enum var_role r)
  {
 -  switch (role)
 -    {
 -    case ROLE_INPUT:
 -      return _("Input");
 -
 -    case ROLE_TARGET:
 -      return _("Output");
 -
 -    case ROLE_BOTH:
 -      return _("Both");
 -
 -    case ROLE_NONE:
 -      return _("None");
 -
 -    case ROLE_PARTITION:
 -      return _("Partition");
 -
 -    case ROLE_SPLIT:
 -      return _("Split");
 -
 -    default:
 -      return "Invalid";
 -    }
 +  assert (r == role[r].value);
 +  return gettext (role[r].label);
  }
  
  /* Returns a string version of ROLE, for use in PSPP comamnd syntax. */
@@@ -999,8 -996,20 +999,8 @@@ alignment_is_valid (enum alignment a
  const char *
  alignment_to_string (enum alignment a)
  {
 -  switch (a)
 -    {
 -    case ALIGN_LEFT:
 -      return _("Left");
 -
 -    case ALIGN_RIGHT:
 -      return _("Right");
 -
 -    case ALIGN_CENTRE:
 -      return _("Center");
 -
 -    default:
 -      return "Invalid";
 -    }
 +  assert (a == align[a].value);
 +  return gettext (align[a].label);
  }
  
  /* Returns a string version of alignment A, for use in PSPP command syntax. */
@@@ -1303,3 -1312,29 +1303,29 @@@ var_clear_vardict (struct variable *v
  {
    v->vardict = NULL;
  }
\f
+ /*
+   Returns zero, if W is a missing value for WV or if it is less than zero.
+   Typically used to force a numerical value into a valid weight.
+   
+   As a side effect, this function will emit a warning if the value 
+   WARN_ON_INVALID points to a bool which is TRUE.  That bool will be then
+   set to FALSE.
+  */
+ double
+ var_force_valid_weight (const struct variable *wv, double w, bool *warn_on_invalid)
+ {
+   if (w < 0.0 || (wv && var_is_num_missing (wv, w, MV_ANY)))
+     w = 0.0;
+   
+   if (w == 0.0 && warn_on_invalid != NULL && *warn_on_invalid)
+     {
+       *warn_on_invalid = false;
+       msg (SW, _("At least one case in the data file had a weight value "
+                "that was user-missing, system-missing, zero, or "
+                "negative.  These case(s) were ignored."));
+     }
+   return w;
+ }