message: Add column range to struct msg_locator.
[pspp] / src / libpspp / message.c
index e0f9bf178a202a94e76f93d4a6d3dd8d83bb3185..8bd6af956ddf55153df8cbbf11c4220f24a0c450 100644 (file)
@@ -59,6 +59,8 @@ msg (enum msg_class class, const char *format, ...)
   m.text = xvasprintf (format, args);
   m.where.file_name = NULL;
   m.where.line_number = 0;
+  m.where.first_column = 0;
+  m.where.last_column = 0;
   va_end (args);
 
   msg_emit (&m);
@@ -116,13 +118,25 @@ msg_to_string (const struct msg *m, const char *command_name)
   ds_init_empty (&s);
 
   if (m->category != MSG_C_GENERAL
-      && (m->where.file_name || m->where.line_number != -1))
+      && (m->where.file_name
+          || m->where.line_number > 0
+          || m->where.first_column > 0))
     {
       if (m->where.file_name)
-        ds_put_format (&s, "%s:", m->where.file_name);
+        ds_put_format (&s, "%s", m->where.file_name);
       if (m->where.line_number > 0)
-        ds_put_format (&s, "%d:", m->where.line_number);
-      ds_put_char (&s, ' ');
+        {
+          if (!ds_is_empty (&s))
+            ds_put_char (&s, ':');
+          ds_put_format (&s, "%d", m->where.line_number);
+        }
+      if (m->where.first_column > 0)
+        {
+          ds_put_format (&s, ".%d", m->where.first_column);
+          if (m->where.last_column > m->where.first_column + 1)
+            ds_put_format (&s, "-%d", m->where.last_column - 1);
+        }
+      ds_put_cstr (&s, ": ");
     }
 
   switch (m->severity)
@@ -202,6 +216,8 @@ submit_note (char *s)
   m.severity = MSG_S_NOTE;
   m.where.file_name = NULL;
   m.where.line_number = 0;
+  m.where.first_column = 0;
+  m.where.last_column = 0;
   m.text = s;
   msg_handler (&m);
   free (s);
@@ -256,7 +272,13 @@ void
 msg_emit (struct msg *m)
 {
   if ( s_stream )
-    get_msg_location (s_stream, &m->where);
+    {
+      struct msg_locator loc;
+
+      get_msg_location (s_stream, &loc);
+      m->where.file_name = loc.file_name;
+      m->where.line_number = loc.line_number;
+    }
   else
     {
       m->where.file_name = NULL;