Allow RANK grouping variables to be strings. Fixes bug #18533.
[pspp] / src / data / missing-values.c
index d3b872e049f3d9fa9be29eb351d4d5810f290008..ba9ab53b98d58d9545c183695a86123ad14fa421 100644 (file)
@@ -1,6 +1,5 @@
 /* PSPP - computes sample statistics.
    Copyright (C) 2005 Free Software Foundation, Inc.
-   Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -22,6 +21,7 @@
 #include <assert.h>
 #include <stdlib.h>
 #include <libpspp/assertion.h>
+#include "variable.h"
 #include <libpspp/str.h>
 
 
@@ -303,17 +303,20 @@ can_resize_string (const char *s, int old_width, int new_width)
    contains only spaces in the characters that will be
    trimmed. */
 bool
-mv_is_resizable (struct missing_values *mv, int width) 
+mv_is_resizable (const struct missing_values *mv, int width)
 {
-  assert ((width == 0) == (mv->width == 0));
+  if ( var_type_from_width (width) != var_type_from_width (mv->width) )
+    return false;
+
   if (width > MAX_SHORT_STRING && mv->type != MV_NONE)
     return false;
-  else if (width >= mv->width)
+
+  if (width >= mv->width)
     return true;
-  else 
+  else
     {
       int i;
-      
+
       for (i = 0; i < 3; i++)
         if (using_element (mv->type, i)
             && !can_resize_string (mv->values[i].s, mv->width, width))
@@ -328,7 +331,7 @@ void
 mv_resize (struct missing_values *mv, int width) 
 {
   assert (mv_is_resizable (mv, width));
-  if (width > mv->width) 
+  if (width > mv->width && mv->type != MV_NONE
     {
       int i;
       
@@ -437,5 +440,5 @@ bool
 mv_is_value_system_missing (const struct missing_values *mv,
                             const union value *v)
 {
-  return mv->width == 0 ? v->f == SYSMIS : false;
+  return mv->width == 0 && v->f == SYSMIS;
 }