# HG changeset patch # User Stefan Monnier # Date 1036723066 0 # Node ID 22a18a9dae2af887230f8686fc65178198811ed2 # Parent a54c4e29ca9e1b06f3d8a6a5cbb2818b07275a7e (format-decode): Be careful with the order in `format'. diff -r a54c4e29ca9e -r 22a18a9dae2a lisp/format.el --- a/lisp/format.el Thu Nov 07 23:18:45 2002 +0000 +++ b/lisp/format.el Fri Nov 08 02:37:46 2002 +0000 @@ -246,8 +246,8 @@ Second arg LENGTH is the number of characters following point to operate on. If optional third arg VISIT-FLAG is true, set `buffer-file-format' -to the list of formats used, and call any mode functions defined for those -formats. +to the reverted list of formats used, and call any mode functions defined +for those formats. Returns the new length of the decoded region. @@ -269,7 +269,7 @@ (if (and regexp (looking-at regexp) (< (match-end 0) (+ begin length))) (progn - (setq format (cons (car f) format)) + (push (car f) format) ;; Decode it (if (nth 3 f) (setq end (format-decode-run-method (nth 3 f) begin end))) @@ -291,7 +291,9 @@ (setq end (format-decode-run-method (nth 3 f) begin end))) ;; Call visit function if required (if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1)) - (setq do (cdr do))))) + (setq do (cdr do)))) + ;; Encode in the opposite order. + (setq format (reverse format))) (if visit-flag (setq buffer-file-format format))) @@ -613,7 +615,7 @@ (delete-region loc end) (cond ;; Positive annotations are stacked, remembering location - (positive (setq open-ans (cons `(,name ((,loc . nil))) open-ans))) + (positive (push `(,name ((,loc . nil))) open-ans)) ;; It is a negative annotation: ;; Close the top annotation & add its text property. ;; If the file's nesting is messed up, the close might not match @@ -693,7 +695,7 @@ ;; Not a property, but a function. (let ((rtn (apply value start loc params))) - (if rtn (setq todo (cons rtn todo))))) + (if rtn (push rtn todo)))) (t ;; Normal property/value pair (setq todo @@ -758,12 +760,12 @@ (cond ;; The minuend starts after the subtrahend ends; keep it. ((> (car m) (cdr s)) - (setq results (cons m results) - minuend (cdr minuend) + (push m results) + (setq minuend (cdr minuend) m (car minuend))) ;; The minuend extends beyond the end of the subtrahend. Chop it off. ((or (null (cdr m)) (> (cdr m) (cdr s))) - (setq results (cons (cons (1+ (cdr s)) (cdr m)) results)) + (push (cons (1+ (cdr s)) (cdr m)) results) (setcdr m (cdr s))) ;; The subtrahend starts after the minuend ends; throw it away. ((< (cdr m) (car s)) @@ -878,7 +880,7 @@ (while (not (equal (car neg-ans) (car open-ans))) ;; To close anno. N, need to first close ans 1 to N-1, ;; remembering to re-open them later. - (setq pos-ans (cons (car open-ans) pos-ans)) + (push (car open-ans) pos-ans) (setq all-ans (cons (cons loc (funcall format-fn (car open-ans) nil)) all-ans)) @@ -886,17 +888,15 @@ ;; Now remove the one we're really interested in from open list. (setq open-ans (cdr open-ans)) ;; And put the closing annotation here. - (setq all-ans - (cons (cons loc (funcall format-fn (car neg-ans) nil)) - all-ans))) + (push (cons loc (funcall format-fn (car neg-ans) nil)) + all-ans)) (setq neg-ans (cdr neg-ans))) ;; Now deal with positive (opening) annotations (let ((p pos-ans)) (while pos-ans - (setq open-ans (cons (car pos-ans) open-ans)) - (setq all-ans - (cons (cons loc (funcall format-fn (car pos-ans) t)) - all-ans)) + (push (car pos-ans) open-ans) + (push (cons loc (funcall format-fn (car pos-ans) t)) + all-ans) (setq pos-ans (cdr pos-ans)))))) ;; Close any annotations still open @@ -937,17 +937,16 @@ (setq p before-plist) (while p (if (not (memq (car p) props)) - (setq props (cons (car p) props))) + (push (car p) props)) (setq p (cdr (cdr p)))) (setq p after-plist) (while p (if (not (memq (car p) props)) - (setq props (cons (car p) props))) + (push (car p) props)) (setq p (cdr (cdr p)))) (while props - (setq prop (car props) - props (cdr props)) + (setq prop (pop props)) (if (memq prop ignore) nil ; If it's been ignored before, ignore it now. (let ((before (if all nil (car (cdr (memq prop before-plist))))) @@ -957,7 +956,7 @@ (let ((result (format-annotate-single-property-change prop before after translations))) (if (not result) - (setq not-found (cons prop not-found)) + (push prop not-found) (setq negatives (nconc negatives (car result)) positives (nconc positives (cdr result))))))))) (vector negatives positives not-found)))