SpreadLevel Plot: Don't try to take the logarithm of a negative
[pspp] / src / output / driver.c
index e6fc0ca9506de146ab8f48d7b5c41a97d01240a5..6204e335ca0185cc902955fd4a00db529e0de7c3 100644 (file)
@@ -32,6 +32,7 @@
 #include "data/settings.h"
 #include "libpspp/array.h"
 #include "libpspp/assertion.h"
+#include "libpspp/i18n.h"
 #include "libpspp/message.h"
 #include "libpspp/llx.h"
 #include "libpspp/string-map.h"
@@ -193,7 +194,11 @@ defer_text (struct output_engine *e, struct output_item *item)
   if (!is_text_item (item))
     return false;
 
-  enum text_item_type type = text_item_get_type (to_text_item (item));
+  struct text_item *text_item = to_text_item (item);
+  if (text_item->markup)        /* XXX */
+    return false;
+
+  enum text_item_type type = text_item_get_type (text_item);
   if (type != TEXT_ITEM_SYNTAX && type != TEXT_ITEM_LOG)
     return false;
 
@@ -205,7 +210,7 @@ defer_text (struct output_engine *e, struct output_item *item)
   if (!ds_is_empty (&e->deferred_text))
     ds_put_byte (&e->deferred_text, '\n');
 
-  const char *text = text_item_get_text (to_text_item (item));
+  const char *text = text_item_get_text (text_item);
   ds_put_cstr (&e->deferred_text, text);
   output_item_unref (item);
 
@@ -273,16 +278,20 @@ output_submit (struct output_item *item)
   output_submit__ (e, item);
 }
 
-const char *
+/* Returns the name of the command currently being parsed, in all uppercase.
+   The caller must free the returned value.
+
+   Returns NULL if no command is being parsed. */
+char *
 output_get_command_name (void)
 {
   struct output_engine *e = engine_stack_top ();
   if (e == NULL)
     return NULL;
 
-  for (size_t i = e->n_groups; i-- > 0; )
+  for (size_t i = e->n_groups; i-- > 0;)
     if (e->groups[i])
-      return e->groups[i];
+      return utf8_to_upper (e->groups[i]);
 
   return NULL;
 }
@@ -426,6 +435,7 @@ extern const struct output_driver_factory list_driver_factory;
 extern const struct output_driver_factory html_driver_factory;
 extern const struct output_driver_factory csv_driver_factory;
 extern const struct output_driver_factory odt_driver_factory;
+extern const struct output_driver_factory spv_driver_factory;
 #ifdef HAVE_CAIRO
 extern const struct output_driver_factory pdf_driver_factory;
 extern const struct output_driver_factory ps_driver_factory;
@@ -439,6 +449,7 @@ static const struct output_driver_factory *factories[] =
     &html_driver_factory,
     &csv_driver_factory,
     &odt_driver_factory,
+    &spv_driver_factory,
 #ifdef HAVE_CAIRO
     &pdf_driver_factory,
     &ps_driver_factory,
@@ -585,7 +596,7 @@ output_driver_substitute_heading_vars (const char *src, int page_number)
   struct output_engine *e = engine_stack_top ();
   struct string dst = DS_EMPTY_INITIALIZER;
   ds_extend (&dst, strlen (src));
-  for (const char *p = src; *p; )
+  for (const char *p = src; *p;)
     {
       if (!strncmp (p, "&[", 6))
         {