#include "libpspp/cast.h"
#include "libpspp/intern.h"
+#include "language/lexer/lexer.h"
#include "libpspp/str.h"
#include "libpspp/version.h"
#include "data/settings.h"
void
msg_location_uninit (struct msg_location *loc)
{
+ lex_source_unref (loc->src);
intern_unref (loc->file_name);
}
return NULL;
struct msg_location *dst = xmalloc (sizeof *dst);
- *dst = (struct msg_location) {
- .file_name = intern_new_if_nonnull (src->file_name),
- .p[0] = src->p[0],
- .p[1] = src->p[1],
- };
+ *dst = *src;
+ if (src->file_name)
+ dst->file_name = intern_ref (src->file_name);
+ if (src->src)
+ lex_source_ref (dst->src);
return dst;
}
ds_put_cstr (&s, m->text);
+ const struct msg_location *loc = m->location;
+ if (loc->src && loc->p[0].line)
+ {
+ struct substring line = lex_source_get_line (loc->src, m->location->p[0].line);
+ ds_put_format (&s, "\n%5d | %.*s", loc->p[0].line, (int) line.length, line.string);
+ if (loc->p[0].column && loc->p[1].column >= loc->p[0].column)
+ {
+ ds_put_cstr (&s, " | ");
+ ds_put_byte_multiple (&s, ' ', loc->p[0].column - 1);
+ int n = loc->p[1].column - loc->p[0].column + 1;
+ ds_put_byte (&s, '^');
+ if (n > 1)
+ ds_put_byte_multiple (&s, '~', n - 1);
+ }
+ }
+
return ds_cstr (&s);
}
\f