Greatly simplify PSPP configuration.
[pspp] / src / libpspp / message.c
index 622388a1169d9433a367984205dbeafe3574670b..b3025156ef0dd33703068e03b1847316a903eecb 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009 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 <string.h>
 #include <unistd.h>
 
-#include <libpspp/alloc.h>
 #include <libpspp/version.h>
 
 #include "progname.h"
+#include "xalloc.h"
 #include "xvasprintf.h"
 
 /* Current command name as set by msg_set_command_name(). */
@@ -79,19 +79,27 @@ msg_done (void)
 struct msg *
 msg_dup(const struct msg *m)
 {
-  struct msg *new_msg = xmalloc (sizeof *m);
+  struct msg *new_msg;
 
-  *new_msg = *m;
-  new_msg->text = strdup(m->text);
+  new_msg = xmemdup (m, sizeof *m);
+  if (m->where.file_name != NULL)
+    new_msg->where.file_name = xstrdup (m->where.file_name);
+  new_msg->text = xstrdup (m->text);
 
   return new_msg;
 }
 
+/* Frees a message created by msg_dup().
+
+   (Messages not created by msg_dup(), as well as their where.file_name
+   members, are typically not dynamically allocated, so this function should
+   not be used to destroy them.) */
 void
-msg_destroy(struct msg *m)
+msg_destroy (struct msg *m)
 {
-  free(m->text);
-  free(m);
+  free (m->where.file_name);
+  free (m->text);
+  free (m);
 }
 
 /* Emits M as an error message.
@@ -99,9 +107,16 @@ msg_destroy(struct msg *m)
 void
 msg_emit (struct msg *m)
 {
-  get_msg_location (s_stream, &m->where);
+  if ( s_stream )
+    get_msg_location (s_stream, &m->where);
+  else
+    {
+      m->where.file_name = NULL;
+      m->where.line_number = -1;
+    }
+
   if (!messages_disabled)
-    msg_handler (m);
+     msg_handler (m);
   free (m->text);
 }
 
@@ -155,8 +170,6 @@ request_bug_report_and_abort (const char *msg)
   fprintf (stderr, "version:             %s\n", stat_version);
   fprintf (stderr, "host_system:         %s\n", host_system);
   fprintf (stderr, "build_system:        %s\n", build_system);
-  fprintf (stderr, "default_config_path: %s\n", default_config_path);
-  fprintf (stderr, "include_path:        %s\n", include_path);
   fprintf (stderr, "locale_dir:          %s\n", locale_dir);
   fprintf (stderr, "compiler version:    %s\n",
 #ifdef __VERSION__