crosstabs: Trim unsightly spaces from titles in output.
authorBen Pfaff <blp@gnu.org>
Wed, 3 Jun 2009 04:55:50 +0000 (21:55 -0700)
committerBen Pfaff <blp@gnu.org>
Sun, 7 Jun 2009 04:11:19 +0000 (21:11 -0700)
Unfortunately, none of the tests exercise this code, so it's hard to say
whether it is correct.

src/language/stats/crosstabs.q
src/libpspp/str.c
src/libpspp/str.h

index e296da2d61da1e7307238f76772d8071eb6af2fb..907868c0c264c242af4b780cffebe40086314610 100644 (file)
@@ -1218,10 +1218,17 @@ create_crosstab_table (struct crosstabs_proc *proc, struct pivot_table *pt)
   for (i = 0; i < pt->n_consts; i++)
     {
       const struct variable *var = pt->const_vars[i];
+      size_t ofs;
+
       ds_put_format (&title, ", %s=", var_get_name (var));
+
+      /* Insert the formatted value of the variable, then trim
+         leading spaces in what was just inserted. */
+      ofs = ds_length (&title);
       data_out (&pt->const_values[i], var_get_print_format (var),
                 ds_put_uninit (&title, var_get_width (var)));
-      /* XXX remove any leading space in what was just inserted.  */
+      ds_remove (&title, ofs, ss_cspan (ds_substr (&title, ofs, SIZE_MAX),
+                                        ss_cstr (" ")));
     }
 
   ds_put_cstr (&title, " [");
index 44d325e072df297eb80977d1f03abd45af6bd543..ccd7739c647b87d989b9cbc867810d915839770c 100644 (file)
@@ -1071,6 +1071,34 @@ ds_set_length (struct string *st, size_t new_length, char pad)
     st->ss.length = new_length;
 }
 
+/* Removes N characters from ST starting at offset START. */
+void
+ds_remove (struct string *st, size_t start, size_t n)
+{
+  if (n > 0 && start < st->ss.length)
+    {
+      if (st->ss.length - start <= n)
+        {
+          /* All characters at or beyond START are deleted. */
+          st->ss.length = start;
+        }
+      else
+        {
+          /* Some characters remain and must be shifted into
+             position. */
+          memmove (st->ss.string + st->ss.length,
+                   st->ss.string + st->ss.length + n,
+                   st->ss.length - start - n);
+          st->ss.length -= n;
+        }
+    }
+  else
+    {
+      /* There are no characters to delete or no characters at or
+         beyond START, hence deletion is a no-op. */
+    }
+}
+
 /* Returns true if ST is empty, false otherwise. */
 bool
 ds_is_empty (const struct string *st)
index b057c2bd62028b2a72ba2c9e4e4b019d49a3c7e5..b9be394c59c46a95f1f593e970ac83e4cdb8d7b8 100644 (file)
@@ -177,6 +177,7 @@ bool ds_tokenize (const struct string *src, struct substring delimiters,
                   size_t *save_idx, struct substring *token);
 void ds_rpad (struct string *, size_t length, char pad);
 void ds_set_length (struct string *, size_t new_length, char pad);
+void ds_remove (struct string *, size_t start, size_t n);
 
 /* Extracting substrings. */
 struct substring ds_ss (const struct string *);