X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fmessage.c;h=6b4848a3ef4a135968fb20d91793e32420900cc0;hb=13d91b755ed1045e2c1183874b3752b07489b922;hp=5faee1f1d6c8dc33279e36acc9b3188b56b1f218;hpb=bd17d2af982332ee1791998361b1ac6731fe14fa;p=pspp-builds.git diff --git a/src/libpspp/message.c b/src/libpspp/message.c index 5faee1f1..6b4848a3 100644 --- a/src/libpspp/message.c +++ b/src/libpspp/message.c @@ -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);