# HG changeset patch # User Roland McGrath # Date 745104398 0 # Node ID fb0a5397e2233c98193563c3f586e66d05a3d611 # Parent bf0f0718636933deb895853db5b9e5365032ee62 (next-error): Handle zero and negative prefix args. diff -r bf0f07186369 -r fb0a5397e223 lisp/progmodes/compile.el --- a/lisp/progmodes/compile.el Wed Aug 11 21:10:44 1993 +0000 +++ b/lisp/progmodes/compile.el Wed Aug 11 21:26:38 1993 +0000 @@ -664,7 +664,7 @@ (next-error 1)) -(defun compilation-buffer-p (buffer) +(defsubst compilation-buffer-p (buffer) (assq 'compilation-error-list (buffer-local-variables buffer))) ;; Return a compilation buffer. @@ -724,7 +724,9 @@ ;; We want to pass a number here only if ;; we got a numeric prefix arg, not just C-u. (and (not (consp argp)) - (1- (prefix-numeric-value argp)))) + (if (< (prefix-numeric-value argp) 1) + 0 + (1- (prefix-numeric-value argp))))) ;; Make ARGP nil if the prefix arg was just C-u, ;; since that means to reparse the errors, which the ;; compile-reinitialize-errors call just did. @@ -735,8 +737,21 @@ (save-excursion (set-buffer compilation-last-buffer) ;; compilation-error-list points to the "current" error. - (setq next-errors (nthcdr (1- (prefix-numeric-value argp)) - compilation-error-list) + (setq next-errors + (if (> (prefix-numeric-value argp) 0) + (nthcdr (1- (prefix-numeric-value argp)) + compilation-error-list) + ;; Zero or negative arg; we need to move back in the list. + (let ((n (1- (prefix-numeric-value argp))) + (i 0) + (e compilation-old-error-list)) + ;; See how many cdrs away the current error is from the start. + (while (not (eq e compilation-error-list)) + (setq i (1+ i) + e (cdr e))) + (if (> (- n) i) + (error "Moved back past first error") + (nthcdr (+ i n) compilation-old-error-list)))) next-error (car next-errors)) (while (progn