summaryrefslogtreecommitdiff
path: root/lisp/progmodes
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-02-13 03:05:14 +0000
committerRoland McGrath <roland@gnu.org>1996-02-13 03:05:14 +0000
commit71aafde6f30312c6545d3baff5df1c955179b130 (patch)
treec7d704a5069c957f4744a66a1dcfae43684a291d /lisp/progmodes
parentfff3f171e66350a1170aca1f7b5025462d3831ef (diff)
downloademacs-71aafde6f30312c6545d3baff5df1c955179b130.tar.gz
(compilation-parse-errors): Detect doubled slashes in file names matched
and fix them up in the buffer.
Diffstat (limited to 'lisp/progmodes')
-rw-r--r--lisp/progmodes/compile.el26
1 files changed, 26 insertions, 0 deletions
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 1aa2dbadf92..a3d7c754eb0 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -1388,6 +1388,32 @@ See variable `compilation-parse-errors-function' for the interface it uses."
(setq alist (car alist))
(error "compilation-parse-errors: impossible regexp match!"))
+ ;; Some compilers (e.g. Sun's java compiler, reportedly)
+ ;; produce bogus file names like "./bar//foo.c" for the file
+ ;; "bar/foo.c"; expand-file-name will collapse these into
+ ;; "/foo.c" and fail to find the appropriate file. So we look
+ ;; for doubled slashes in the file name and fix them up in the
+ ;; buffer. It is essential here to save the match-data not
+ ;; only because the `search-forward' overwrites it, but
+ ;; because the internally stored data returned by
+ ;; `match-beginning' and `match-end' is integer locations
+ ;; instead of markers; the deletions we do here make all the
+ ;; later position values incorrect. However, when we extract
+ ;; the positions with (match-data), we get a list of markers
+ ;; that do compensate properly for insertions and deletions
+ ;; automagically.
+ (let* ((data (match-data))
+ ;; We extract from DATA here instead of just using
+ ;; `(match-end (nth 1 alist))' because we need a marker
+ ;; that will track the end of the file name properly
+ ;; after we delete some characters in the middle of it.
+ (end (nth (1+ (* 2 (nth 1 alist))) data)))
+ (save-excursion
+ (goto-char (1+ (nth (* 2 (nth 1 alist)) data)))
+ (while (search-forward "//" end t)
+ (delete-char -1)))
+ (store-match-data data))
+
;; Extract the file name and line number from the error message.
(let ((beginning-of-match (match-beginning 0)) ;looking-at nukes
(filename (buffer-substring (match-beginning (nth 1 alist))