1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2014 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "libpspp/compiler.h"
28 /* What kind of message is this? */
31 MSG_C_GENERAL, /* General info. */
32 MSG_C_SYNTAX, /* Messages that relate to syntax files. */
33 MSG_C_DATA, /* Messages that relate to data files. */
37 /* How important a condition is it? */
46 const char *msg_severity_to_string (enum msg_severity);
48 /* Combination of a category and a severity for convenience. */
51 ME, MW, MN, /* General error/warning/note. */
52 SE, SW, SN, /* Script error/warning/note. */
53 DE, DW, DN, /* Data-file error/note. */
57 static inline enum msg_category
58 msg_class_to_category (enum msg_class class)
63 static inline enum msg_severity
64 msg_class_to_severity (enum msg_class class)
69 static inline enum msg_class
70 msg_class_from_category_and_severity (enum msg_category category,
71 enum msg_severity severity)
73 return category * 3 + severity;
76 /* A line number and column number within a source file. Both are 1-based. If
77 only a line number is available, 'column' is zero. If neither is available,
78 'line' and 'column' are zero.
80 Column numbers are measured according to the width of characters as shown in
81 a typical fixed-width font, in which CJK characters have width 2 and
82 combining characters have width 0. */
89 struct msg_point msg_point_advance (struct msg_point, struct substring);
91 /* Location of the cause of an error. */
94 /* Interned file name, or NULL. */
95 const char *file_name;
97 /* Nonnull if this came from a source file. */
98 struct lex_source *src;
100 /* The starting and ending point of the cause. One of:
102 - Both empty, with all their members zero.
104 - A range of lines, with 0 < start.line <= end.line and start.column =
107 - A range of columns spanning one or more lines. If it's on a single
108 line, then start.line = end.line and 0 < start.column <= end.column.
109 If it's across multiple lines, then 0 < start.line < end.line and the
110 column members are both positive.
112 Both 'start' and 'end' are inclusive, line-wise and column-wise.
114 struct msg_point start, end;
117 void msg_location_uninit (struct msg_location *);
118 void msg_location_destroy (struct msg_location *);
119 struct msg_location *msg_location_dup (const struct msg_location *);
121 void msg_location_remove_columns (struct msg_location *);
123 void msg_location_merge (struct msg_location **, const struct msg_location *);
124 struct msg_location *msg_location_merged (const struct msg_location *,
125 const struct msg_location *);
127 bool msg_location_is_empty (const struct msg_location *);
128 void msg_location_format (const struct msg_location *, struct string *);
132 struct msg_location *location;
136 void msg_stack_destroy (struct msg_stack *);
137 struct msg_stack *msg_stack_dup (const struct msg_stack *);
142 enum msg_category category; /* Message category. */
143 enum msg_severity severity; /* Message severity. */
144 struct msg_location *location; /* Code location. */
145 struct msg_stack **stack;
147 char *command_name; /* Name of erroneous command, or NULL. */
148 char *text; /* Error text. */
151 /* Initialization. */
154 void (*output_msg) (const struct msg *, void *aux);
157 struct lex_source *(*lex_source_ref) (const struct lex_source *);
158 void (*lex_source_unref) (struct lex_source *);
159 struct substring (*lex_source_get_line) (const struct lex_source *,
162 void msg_set_handler (const struct msg_handler *);
164 /* Working with messages. */
165 struct msg *msg_dup (const struct msg *);
166 void msg_destroy(struct msg *);
167 char *msg_to_string (const struct msg *);
169 /* Emitting messages. */
170 void vmsg (enum msg_class, const struct msg_location *,
171 const char *format, va_list args)
172 PRINTF_FORMAT (3, 0);
173 void msg (enum msg_class, const char *format, ...)
174 PRINTF_FORMAT (2, 3);
175 void msg_at (enum msg_class, const struct msg_location *,
176 const char *format, ...)
177 PRINTF_FORMAT (3, 4);
178 void msg_emit (struct msg *);
180 void msg_error (int errnum, const char *format, ...)
181 PRINTF_FORMAT (2, 3);
184 /* Enable and disable messages. */
185 void msg_enable (void);
186 void msg_disable (void);
189 bool msg_ui_too_many_errors (void);
190 void msg_ui_reset_counts (void);
191 bool msg_ui_any_errors (void);
192 void msg_ui_disable_warnings (bool);
195 /* Used in panic situations only. */
196 const char * prepare_diagnostic_information (void);
197 const char * prepare_fatal_error_message (void);
198 void request_bug_report (const char *msg);
201 #endif /* message.h */