+struct msg_point
+ {
+ int line; /* 1-based line number, or 0 if none. */
+ int column; /* 1-based column number, or 0 if none. */
+ };
+
+struct msg_location
+ {
+ const char *file_name; /* Interned file name, or NULL. */
+ struct lex_source *src;
+ struct msg_point p[2];
+ };
+
+void msg_location_uninit (struct msg_location *);
+void msg_location_destroy (struct msg_location *);
+struct msg_location *msg_location_dup (const struct msg_location *);
+
+void msg_location_merge (struct msg_location **, const struct msg_location *);
+
+bool msg_location_is_empty (const struct msg_location *);
+void msg_location_format (const struct msg_location *, struct string *);
+
+struct msg_stack
+ {
+ struct msg_location *location;
+ char *description;
+ };
+
+void msg_stack_destroy (struct msg_stack *);
+struct msg_stack *msg_stack_dup (const struct msg_stack *);
+