Greatly simplify PSPP configuration.
[pspp-builds.git] / src / libpspp / message.c
index 5faee1f1d6c8dc33279e36acc9b3188b56b1f218..b3025156ef0dd33703068e03b1847316a903eecb 100644 (file)
@@ -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 = xstrdup(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.
@@ -101,6 +109,11 @@ msg_emit (struct msg *m)
 {
   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);
@@ -157,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__