From: Ben Pfaff Date: Sat, 3 Jul 2021 18:46:17 +0000 (-0700) Subject: message: Make msg_emit() take full ownership of its argument. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a26ffe4489b411bda630d9e5b87e2d2e4538fdb;p=pspp message: Make msg_emit() take full ownership of its argument. The way it treated the argument before was just confusing. --- diff --git a/src/data/pc+-file-reader.c b/src/data/pc+-file-reader.c index c7c9e3b7f8..8b945788a5 100644 --- a/src/data/pc+-file-reader.c +++ b/src/data/pc+-file-reader.c @@ -1159,12 +1159,13 @@ pcp_msg (struct pcp_reader *r, off_t offset, ds_put_format (&text, _("`%s': "), fh_get_file_name (r->fh)); ds_put_vformat (&text, format, args); - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = msg_class_to_category (class), .severity = msg_class_to_severity (class), - .text = ds_cstr (&text), + .text = ds_steal_cstr (&text), }; - msg_emit (&m); + msg_emit (m); } /* Displays a warning for offset OFFSET in the file. */ diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c index 343615a826..8d008b1dd6 100644 --- a/src/data/por-file-reader.c +++ b/src/data/por-file-reader.c @@ -112,12 +112,13 @@ error (struct pfm_reader *r, const char *msg, ...) ds_put_vformat (&text, msg, args); va_end (args); - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = MSG_C_GENERAL, .severity = MSG_S_ERROR, - .text = ds_cstr (&text), + .text = ds_steal_cstr (&text), }; - msg_emit (&m); + msg_emit (m); r->ok = false; @@ -139,12 +140,13 @@ warning (struct pfm_reader *r, const char *msg, ...) ds_put_vformat (&text, msg, args); va_end (args); - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = MSG_C_GENERAL, .severity = MSG_S_WARNING, - .text = ds_cstr (&text), + .text = ds_steal_cstr (&text), }; - msg_emit (&m); + msg_emit (m); } /* Close and destroy R. diff --git a/src/data/sys-file-reader.c b/src/data/sys-file-reader.c index bc5ff9eeb2..f11480ac8f 100644 --- a/src/data/sys-file-reader.c +++ b/src/data/sys-file-reader.c @@ -3244,12 +3244,13 @@ sys_msg (struct sfm_reader *r, off_t offset, ds_put_format (&text, _("`%s': "), fh_get_file_name (r->fh)); ds_put_vformat (&text, format, args); - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = msg_class_to_category (class), .severity = msg_class_to_severity (class), - .text = ds_cstr (&text), + .text = ds_steal_cstr (&text), }; - msg_emit (&m); + msg_emit (m); } /* Displays a warning for offset OFFSET in the file. */ diff --git a/src/language/data-io/data-parser.c b/src/language/data-io/data-parser.c index 6de88b170d..03c6dbbb0e 100644 --- a/src/language/data-io/data-parser.c +++ b/src/language/data-io/data-parser.c @@ -496,21 +496,23 @@ parse_error (const struct dfm_reader *reader, const struct field *field, int first_column, int last_column, char *error) { int line_number = dfm_get_line_number (reader); - const struct msg_location location = { - .file_name = CONST_CAST (char *, dfm_get_file_name (reader)), + struct msg_location *location = xmalloc (sizeof *location); + *location = (struct msg_location) { + .file_name = xstrdup (dfm_get_file_name (reader)), .first_line = line_number, .last_line = line_number + 1, .first_column = first_column, .last_column = last_column, }; - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = MSG_C_DATA, .severity = MSG_S_WARNING, - .location = CONST_CAST (struct msg_location *, &location), + .location = location, .text = xasprintf (_("Data for variable %s is not valid as format %s: %s"), field->name, fmt_name (field->format.type), error), }; - msg_emit (&m); + msg_emit (m); free (error); } diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 159949e0b0..8eac18066f 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1439,20 +1439,22 @@ lex_source_error_valist (struct lex_source *src, int n0, int n1, if (ds_last (&s) != '.') ds_put_byte (&s, '.'); - struct msg_location location = { - .file_name = src->reader->file_name, + struct msg_location *location = xmalloc (sizeof *location); + *location = (struct msg_location) { + .file_name = xstrdup_if_nonnull (src->reader->file_name), .first_line = lex_source_get_first_line_number (src, n0), .last_line = lex_source_get_last_line_number (src, n1), .first_column = lex_source_get_first_column (src, n0), .last_column = lex_source_get_last_column (src, n1), }; - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = MSG_C_SYNTAX, .severity = MSG_S_ERROR, - .location = &location, + .location = location, .text = ds_steal_cstr (&s), }; - msg_emit (&m); + msg_emit (m); } static void PRINTF_FORMAT (2, 3) diff --git a/src/libpspp/message.c b/src/libpspp/message.c index 7d4f9d8430..bbba1c5506 100644 --- a/src/libpspp/message.c +++ b/src/libpspp/message.c @@ -53,13 +53,13 @@ static int messages_disabled; void vmsg (enum msg_class class, const char *format, va_list args) { - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = msg_class_to_category (class), .severity = msg_class_to_severity (class), .text = xvasprintf (format, args), }; - - msg_emit (&m); + msg_emit (m); } /* Writes error message in CLASS, with text FORMAT, formatted with @@ -80,17 +80,18 @@ msg_error (int errnum, const char *format, ...) { va_list args; va_start (args, format); - char *e = xvasprintf (format, args); + struct string s = DS_EMPTY_INITIALIZER; + ds_put_vformat (&s, format, args); va_end (args); + ds_put_format (&s, ": %s", strerror (errnum)); - struct msg m = { + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { .category = MSG_C_GENERAL, .severity = MSG_S_ERROR, - .text = xasprintf (_("%s: %s"), e, strerror (errnum)), + .text = ds_steal_cstr (&s), }; - msg_emit (&m); - - free (e); + msg_emit (m); } @@ -315,10 +316,10 @@ msg_ui_any_errors (void) static void -ship_message (struct msg *m) +ship_message (const struct msg *m) { enum { MAX_STACK = 4 }; - static struct msg *stack[MAX_STACK]; + static const struct msg *stack[MAX_STACK]; static size_t n; /* If we're recursing on a given message, or recursing deeply, drop it. */ @@ -349,8 +350,6 @@ submit_note (char *s) free (s); } - - static void process_msg (struct msg *m) { @@ -391,16 +390,13 @@ process_msg (struct msg *m) } -/* Emits M as an error message. - Frees allocated data in M. */ +/* Emits M as an error message. Takes ownership of M. */ void msg_emit (struct msg *m) { if (!messages_disabled) - process_msg (m); - - free (m->text); - free (m->command_name); + process_msg (m); + msg_destroy (m); } /* Disables message output until the next call to msg_enable. If