/[emacs]/emacs/lisp/progmodes/flymake.el
ViewVC logotype

Diff of /emacs/lisp/progmodes/flymake.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by jet, Mon Nov 1 17:42:31 2004 UTC revision 1.5 by rms, Thu Nov 25 16:33:53 2004 UTC
# Line 32  Line 32 
32    
33  ;;; Code:  ;;; Code:
34    
 ;;;_* Provide  
 (provide 'flymake)  
   
35  ;;;; [[ Overlay compatibility  ;;;; [[ Overlay compatibility
36  (autoload 'make-overlay            "overlay" "Overlay compatibility kit." t)  (autoload 'make-overlay            "overlay" "Overlay compatibility kit." t)
37  (autoload 'overlayp                "overlay" "Overlay compatibility kit." t)  (autoload 'overlayp                "overlay" "Overlay compatibility kit." t)
# Line 91  Line 88 
88                  splitted                  splitted
89      )      )
90  )  )
91    
92  (defun flymake-split-string(str pattern)  (defun flymake-split-string(str pattern)
93      (cond      (cond
94          ((equal flymake-emacs 'xemacs)  (flymake-split-string-remove-empty-edges str pattern))          ((equal flymake-emacs 'xemacs)  (flymake-split-string-remove-empty-edges str pattern))
# Line 101  Line 99 
99  (defun flymake-get-temp-dir()  (defun flymake-get-temp-dir()
100      (cond      (cond
101          ((equal flymake-emacs 'xemacs)  (temp-directory))          ((equal flymake-emacs 'xemacs)  (temp-directory))
102          (t                              temporary-file-directory)          (t                              temporary-file-directory)))
     )  
 )  
103    
104  (defun flymake-line-beginning-position()  (defun flymake-line-beginning-position ()
105      (save-excursion      (save-excursion
106          (beginning-of-line)          (beginning-of-line)
107          (point)          (point)))
     )  
 )  
108    
109  (defun flymake-line-end-position()  (defun flymake-line-end-position ()
110      (save-excursion      (save-excursion
111          (end-of-line)          (end-of-line)
112          (point)          (point)))
     )  
 )  
113    
114  (defun flymake-popup-menu(pos menu-data)  (defun flymake-popup-menu(pos menu-data)
115      (cond      (cond
# Line 130  Line 122 
122                  (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props))                  (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props))
123              )              )
124         )         )
125         (t                              (x-popup-menu pos (flymake-make-emacs-menu menu-data)))         (t (x-popup-menu pos (flymake-make-emacs-menu menu-data)))))
     )  
 )  
126    
127  (defun flymake-make-emacs-menu(menu-data)  (defun flymake-make-emacs-menu(menu-data)
128      (let* ((menu-title     (nth 0 menu-data))      (let* ((menu-title     (nth 0 menu-data))
# Line 142  Line 132 
132          (setq menu-commands (mapcar (lambda (foo)          (setq menu-commands (mapcar (lambda (foo)
133                                        (cons (nth 0 foo) (nth 1 foo)))                                        (cons (nth 0 foo) (nth 1 foo)))
134                                      menu-items))                                      menu-items))
135                  (list menu-title (cons "" menu-commands))                  (list menu-title (cons "" menu-commands))))
     )  
 )  
136    
137  (defun flymake-nop()  (defun flymake-nop ())
 )  
138    
139  (defun flymake-make-xemacs-menu(menu-data)  (defun flymake-make-xemacs-menu (menu-data)
140      (let* ((menu-title     (nth 0 menu-data))      (let* ((menu-title     (nth 0 menu-data))
141             (menu-items     (nth 1 menu-data))             (menu-items     (nth 1 menu-data))
142             (menu-commands  nil))             (menu-commands  nil))
143          (setq menu-commands (mapcar (lambda (foo)          (setq menu-commands (mapcar (lambda (foo)
144                                        (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t))                                        (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t))
145                                      menu-items))                                      menu-items))
146          (cons menu-title menu-commands)          (cons menu-title menu-commands)))
     )  
 )  
147    
148  (defun flymake-xemacs-window-edges(&optional window)  (defun flymake-xemacs-window-edges(&optional window)
149      (let ((edges  (window-pixel-edges window))      (let ((edges  (window-pixel-edges window))
# Line 196  Line 181 
181      "Logging level, only messages with level > flymake-log-level will not be logged      "Logging level, only messages with level > flymake-log-level will not be logged
182  -1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG"  -1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG"
183      :group 'flymake      :group 'flymake
184      :type 'integer      :type 'integer)
 )  
185    
186  (defun flymake-log(level text &rest args)  (defun flymake-log (level text &rest args)
187      "Log a message with optional arguments"      "Log a message with optional arguments."
188      (if (<= level flymake-log-level)      (if (<= level flymake-log-level)
189          (let* ((msg (apply 'format text args)))          (let* ((msg (apply 'format text args)))
190              (message msg)              (message msg)
# Line 209  Line 193 
193              ;   (insert "\n")              ;   (insert "\n")
194              ;   (flymake-save-buffer-in-file (current-buffer) "d:/flymake.log" t)  ; make log file name customizable              ;   (flymake-save-buffer-in-file (current-buffer) "d:/flymake.log" t)  ; make log file name customizable
195              ;)              ;)
196          )          )))
     )  
 )  
197    
198  (defun flymake-ins-after(list pos val)  (defun flymake-ins-after (list pos val)
199      "insert val into list after position pos"      "Insert VAL into LIST after position POS."
200      (let ((tmp (copy-sequence list))) ; (???)      (let ((tmp (copy-sequence list))) ; (???)
201          (setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp)))          (setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp)))
202          tmp          tmp))
     )  
 )  
203    
204  (defun flymake-set-at(list pos val)  (defun flymake-set-at (list pos val)
205      "set val at position pos in list"      "Set VAL at position POS in LIST"
206      (let ((tmp (copy-sequence list))) ; (???)      (let ((tmp (copy-sequence list))) ; (???)
207          (setcar (nthcdr pos tmp) val)          (setcar (nthcdr pos tmp) val)
208          tmp          tmp))
     )  
 )  
209    
210  (defvar flymake-pid-to-names(flymake-makehash)  (defvar flymake-pid-to-names (flymake-makehash)
211      "pid -> source buffer name, output file name mapping"    "pid -> source buffer name, output file name mapping.")
 )  
212    
213  (defun flymake-reg-names(pid source-buffer-name)  (defun flymake-reg-names (pid source-buffer-name)
214      "Save into in pid map"      "Save into in PID map."
215      (unless (stringp source-buffer-name)      (unless (stringp source-buffer-name)
216          (error "invalid buffer name")          (error "Invalid buffer name"))
217      )      (puthash pid (list source-buffer-name) flymake-pid-to-names))
     (puthash pid (list source-buffer-name) flymake-pid-to-names)  
 )  
218    
219  (defun flymake-get-source-buffer-name(pid)  (defun flymake-get-source-buffer-name (pid)
220      "Return buffer name stored in pid map"      "Return buffer name stored in PID map."
221      (nth 0 (gethash pid flymake-pid-to-names))      (nth 0 (gethash pid flymake-pid-to-names)))
222  )  
223    (defun flymake-unreg-names (pid)
224        "Delete PID->buffer name mapping."
225        (remhash pid flymake-pid-to-names))
226    
227  (defun flymake-unreg-names(pid)  (defun flymake-get-buffer-var (buffer var-name)
228      "Delete pid->buffer name mapping"      "Switch to BUFFER if necessary and return local variable VAR-NAME."
     (remhash pid flymake-pid-to-names)  
 )  
   
 (defun flymake-get-buffer-var(buffer var-name)  
     "switch to buffer if necessary and return local variable var"  
229      (unless (bufferp buffer)      (unless (bufferp buffer)
230          (error "invalid buffer")          (error "Invalid buffer"))
     )  
231    
232      (if (eq buffer (current-buffer))      (if (eq buffer (current-buffer))
233          (symbol-value var-name)          (symbol-value var-name)
     ;else  
234          (save-excursion          (save-excursion
235              (set-buffer buffer)              (set-buffer buffer)
236              (symbol-value var-name)              (symbol-value var-name))))
         )  
     )  
 )  
237    
238  (defun flymake-set-buffer-var(buffer var-name var-value)  (defun flymake-set-buffer-var (buffer var-name var-value)
239      "switch to buffer if necessary and set local variable var-name to var-value"      "Switch to BUFFER if necessary and set local variable VAR-NAME to VAR-VALUE."
240      (unless (bufferp buffer)      (unless (bufferp buffer)
241          (error "invalid buffer")          (error "Invalid buffer"))
     )  
242    
243      (if (eq buffer (current-buffer))      (if (eq buffer (current-buffer))
244          (set var-name var-value)          (set var-name var-value)
     ;else  
245          (save-excursion          (save-excursion
246              (set-buffer buffer)              (set-buffer buffer)
247              (set var-name var-value)              (set var-name var-value))))
248          )  
249      )  (defvar flymake-buffer-data (flymake-makehash)
250  )    "Data specific to syntax check tool, in name-value pairs.")
251    
 (defvar flymake-buffer-data(flymake-makehash)  
     "data specific to syntax check tool, in name-value pairs"  
 )  
252  (make-variable-buffer-local 'flymake-buffer-data)  (make-variable-buffer-local 'flymake-buffer-data)
 (defun flymake-get-buffer-data(buffer)  
     (flymake-get-buffer-var buffer 'flymake-buffer-data)  
 )  
 (defun flymake-set-buffer-data(buffer data)  
     (flymake-set-buffer-var buffer 'flymake-buffer-data data)  
 )  
 (defun flymake-get-buffer-value(buffer name)  
     (gethash name (flymake-get-buffer-data buffer))  
 )  
 (defun flymake-set-buffer-value(buffer name value)  
     (puthash name value (flymake-get-buffer-data buffer))  
 )  
253    
254  (defvar flymake-output-residual nil  (defun flymake-get-buffer-data (buffer)
255    ""      (flymake-get-buffer-var buffer 'flymake-buffer-data))
256  )  
257    (defun flymake-set-buffer-data (buffer data)
258        (flymake-set-buffer-var buffer 'flymake-buffer-data data))
259    
260    (defun flymake-get-buffer-value (buffer name)
261        (gethash name (flymake-get-buffer-data buffer)))
262    
263    (defun flymake-set-buffer-value (buffer name value)
264        (puthash name value (flymake-get-buffer-data buffer)))
265    
266    (defvar flymake-output-residual nil "")
267    
268  (make-variable-buffer-local 'flymake-output-residual)  (make-variable-buffer-local 'flymake-output-residual)
269  (defun flymake-get-buffer-output-residual(buffer)  
270      (flymake-get-buffer-var buffer 'flymake-output-residual)  (defun flymake-get-buffer-output-residual (buffer)
271  )      (flymake-get-buffer-var buffer 'flymake-output-residual))
272  (defun flymake-set-buffer-output-residual(buffer residual)  
273      (flymake-set-buffer-var buffer 'flymake-output-residual residual)  (defun flymake-set-buffer-output-residual (buffer residual)
274  )      (flymake-set-buffer-var buffer 'flymake-output-residual residual))
275    
276  (defcustom flymake-allowed-file-name-masks '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)  (defcustom flymake-allowed-file-name-masks '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
277                                               (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)                                               (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
# Line 332  Line 294 
294  ;                                                ("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2 ))  ;                                                ("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2 ))
295  ;                                            (".+\\.tex$" 1)  ;                                            (".+\\.tex$" 1)
296                                               )                                               )
297      "*Files syntax checking is allowed for"      "*Files syntax checking is allowed for."
298      :group 'flymake      :group 'flymake
299      :type '(repeat (string symbol symbol symbol))      :type '(repeat (string symbol symbol symbol)))
 )  
300    
301  (defun flymake-get-file-name-mode-and-masks(file-name)  (defun flymake-get-file-name-mode-and-masks (file-name)
302      "return the corresponding entry from flymake-allowed-file-name-masks"      "Return the corresponding entry from 'flymake-allowed-file-name-masks'."
303      (unless (stringp file-name)      (unless (stringp file-name)
304          (error "invalid file-name")          (error "Invalid file-name"))
     )  
305      (let ((count           (length flymake-allowed-file-name-masks))      (let ((count           (length flymake-allowed-file-name-masks))
306            (idx             0)            (idx             0)
307            (mode-and-masks  nil))            (mode-and-masks  nil))
308          (while (and (not mode-and-masks) (< idx count))          (while (and (not mode-and-masks) (< idx count))
309              (if (string-match (nth 0 (nth idx flymake-allowed-file-name-masks)) file-name)              (if (string-match (nth 0 (nth idx flymake-allowed-file-name-masks)) file-name)
310                  (setq mode-and-masks (cdr (nth idx flymake-allowed-file-name-masks)))                  (setq mode-and-masks (cdr (nth idx flymake-allowed-file-name-masks))))
311              )              (setq idx (1+ idx)))
             (setq idx (1+ idx))  
         )  
312          (flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))          (flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))
313          mode-and-masks          mode-and-masks))
     )  
 )  
314    
315  (defun flymake-can-syntax-check-file(file-name)  (defun flymake-can-syntax-check-file (file-name)
316      "Determine whether we can syntax check file-name: nil if cannot, non-nil if can"      "Determine whether we can syntax check FILE-NAME.
317      (if (flymake-get-init-function file-name)  Return nil if we cannot, non-nil if we can."
318          t      (if (flymake-get-init-function file-name) t nil))
     ;else  
         nil  
     )  
 )  
319    
320  (defun flymake-get-init-function(file-name)  (defun flymake-get-init-function (file-name)
321      "return init function to be used for the file"      "Return init function to be used for the file."
322      (let* ((init-f  (nth 0 (flymake-get-file-name-mode-and-masks file-name))))      (let* ((init-f  (nth 0 (flymake-get-file-name-mode-and-masks file-name))))
323          ;(flymake-log 0 "calling %s" init-f)          ;(flymake-log 0 "calling %s" init-f)
324          ;(funcall init-f (current-buffer))          ;(funcall init-f (current-buffer))
325            init-f            init-f))
     )  
 )  
326    
327  (defun flymake-get-cleanup-function(file-name)  (defun flymake-get-cleanup-function (file-name)
328      "return cleanup function to be used for the file"      "Return cleanup function to be used for the file."
329      (nth 1 (flymake-get-file-name-mode-and-masks file-name))      (nth 1 (flymake-get-file-name-mode-and-masks file-name)))
 )  
330    
331  (defun flymake-get-real-file-name-function(file-name)  (defun flymake-get-real-file-name-function (file-name)
332      ""      (or (nth 2 (flymake-get-file-name-mode-and-masks file-name)) 'flymake-get-real-file-name))
     (or (nth 2 (flymake-get-file-name-mode-and-masks file-name)) 'flymake-get-real-file-name)  
 )  
333    
334  (defcustom flymake-buildfile-dirs '("." ".." "../.." "../../.." "../../../.." "../../../../.." "../../../../../.." "../../../../../../.." "../../../../../../../.." "../../../../../../../../.." "../../../../../../../../../.." "../../../../../../../../../../..")  (defcustom flymake-buildfile-dirs '("." ".." "../.." "../../.." "../../../.." "../../../../.." "../../../../../.." "../../../../../../.." "../../../../../../../.." "../../../../../../../../.." "../../../../../../../../../.." "../../../../../../../../../../..")
335      "dirs to look for buildfile"      "Dirs to look for buildfile."
336      :group 'flymake      :group 'flymake
337      :type '(repeat (string))      :type '(repeat (string)))
 )  
338    
339  (defvar flymake-find-buildfile-cache (flymake-makehash 'equal))  (defvar flymake-find-buildfile-cache (flymake-makehash 'equal))
 (defun flymake-get-buildfile-from-cache(dir-name)  
     (gethash dir-name flymake-find-buildfile-cache)  
 )  
 (defun flymake-add-buildfile-to-cache(dir-name buildfile)  
     (puthash dir-name buildfile flymake-find-buildfile-cache)  
 )  
 (defun flymake-clear-buildfile-cache()  
     (clrhash flymake-find-buildfile-cache)  
 )  
340    
341  (defun flymake-find-buildfile(buildfile-name source-dir-name dirs)  (defun flymake-get-buildfile-from-cache (dir-name)
342      "find buildfile (i.e. Makefile, build.xml, etc.) starting from current directory. Return its path or nil if not found"      (gethash dir-name flymake-find-buildfile-cache))
343    
344    (defun flymake-add-buildfile-to-cache (dir-name buildfile)
345        (puthash dir-name buildfile flymake-find-buildfile-cache))
346    
347    (defun flymake-clear-buildfile-cache ()
348        (clrhash flymake-find-buildfile-cache))
349    
350    (defun flymake-find-buildfile (buildfile-name source-dir-name dirs)
351        "Find buildfile starting from current directory.
352    Buildfile includes Makefile, build.xml etc.
353    Return its path if found, or nil if not found."
354      (if (flymake-get-buildfile-from-cache source-dir-name)      (if (flymake-get-buildfile-from-cache source-dir-name)
355          (progn          (progn
356              (flymake-get-buildfile-from-cache source-dir-name)              (flymake-get-buildfile-from-cache source-dir-name))
         )  
     ;else  
357          (let* ((buildfile-dir          nil)          (let* ((buildfile-dir          nil)
358                 (buildfile              nil)                 (buildfile              nil)
359                 (dir-count              (length dirs))                 (dir-count              (length dirs))
360                 (dir-idx                0)                 (dir-idx                0)
361                 (found                  nil))                 (found                  nil))
   
362              (while (and (not found) (< dir-idx dir-count))              (while (and (not found) (< dir-idx dir-count))
   
363                  (setq buildfile-dir (concat source-dir-name (nth dir-idx dirs)))                  (setq buildfile-dir (concat source-dir-name (nth dir-idx dirs)))
364                  (setq buildfile (concat buildfile-dir "/" buildfile-name))                  (setq buildfile (concat buildfile-dir "/" buildfile-name))
   
365                  (when (file-exists-p buildfile)                  (when (file-exists-p buildfile)
366                      (setq found t)                      (setq found t))
367                  )                  (setq dir-idx (1+ dir-idx)))
   
                 (setq dir-idx (1+ dir-idx))  
             )  
368              (if found              (if found
369                  (progn                  (progn
370                      (flymake-log 3 "found buildfile at %s/%s" buildfile-dir buildfile-name)                      (flymake-log 3 "found buildfile at %s/%s" buildfile-dir buildfile-name)
371                      (flymake-add-buildfile-to-cache source-dir-name buildfile-dir)                      (flymake-add-buildfile-to-cache source-dir-name buildfile-dir)
372                      buildfile-dir                      buildfile-dir)
                 )  
             ;else  
373                  (progn                  (progn
374                      (flymake-log 3 "buildfile for %s not found" source-dir-name)                      (flymake-log 3 "buildfile for %s not found" source-dir-name)
375                      nil                      nil)))))
                 )  
             )  
         )  
     )  
 )  
376    
377  (defun flymake-fix-path-name(name)  (defun flymake-fix-path-name (name)
378      "replace all occurences of '\' with '/'"      "Replace all occurences of '\' with '/'."
379      (when name      (when name
380          (let* ((new-name (flymake-replace-regexp-in-string "[\\]" "/" (expand-file-name name)))          (let* ((new-name (flymake-replace-regexp-in-string "[\\]" "/" (expand-file-name name)))
381                 (last-char (elt new-name (1- (length new-name)))))                 (last-char (elt new-name (1- (length new-name)))))
382              (setq new-name (flymake-replace-regexp-in-string "\\./" "" new-name))              (setq new-name (flymake-replace-regexp-in-string "\\./" "" new-name))
383              (if (equal "/" (char-to-string last-char))              (if (equal "/" (char-to-string last-char))
384                  (setq new-name (substring new-name 0 (1- (length new-name))))                  (setq new-name (substring new-name 0 (1- (length new-name)))))
385              )              new-name)))
             new-name  
         )  
     )  
 )  
386    
387  (defun flymake-same-files(file-name-one file-name-two)  (defun flymake-same-files (file-name-one file-name-two)
388      "t if file-name-one and file-name-two actually point to the same file"      "Check if FILE-NAME-ONE and FILE-NAME-TWO point to same file.
389      (equal (flymake-fix-path-name file-name-one) (flymake-fix-path-name file-name-two))  Return t if so, nil if not."
390  )      (equal (flymake-fix-path-name file-name-one) (flymake-fix-path-name file-name-two)))
391    
392  (defun flymake-ensure-ends-with-slash(path)  (defun flymake-ensure-ends-with-slash (path)
393      (if (not (= (elt path (1- (length path))) (string-to-char "/")))      (if (not (= (elt path (1- (length path))) (string-to-char "/")))
394          (concat path "/")          (concat path "/")
395      ;else          path))
         path  
     )  
 )  
396    
397  (defun flymake-get-common-path-prefix(string-one string-two)  (defun flymake-get-common-path-prefix (string-one string-two)
398      "return common prefix for two paths"      "Return common prefix for two paths STRING-ONE and STRING-TWO."
399      (when (and string-one string-two)      (when (and string-one string-two)
400          (let* ((slash-pos-one  -1)          (let* ((slash-pos-one  -1)
401                 (slash-pos-two  -1)                 (slash-pos-two  -1)
402                 (done           nil)                 (done           nil)
403                 (prefix         nil))                 (prefix         nil))
   
404              (setq string-one (flymake-ensure-ends-with-slash string-one))              (setq string-one (flymake-ensure-ends-with-slash string-one))
405              (setq string-two (flymake-ensure-ends-with-slash string-two))              (setq string-two (flymake-ensure-ends-with-slash string-two))
   
406              (while (not done)              (while (not done)
407                  (setq slash-pos-one (string-match "/" string-one (1+ slash-pos-one)))                  (setq slash-pos-one (string-match "/" string-one (1+ slash-pos-one)))
408                  (setq slash-pos-two (string-match "/" string-two (1+ slash-pos-two)))                  (setq slash-pos-two (string-match "/" string-two (1+ slash-pos-two)))
   
409                  (if (and slash-pos-one slash-pos-two                  (if (and slash-pos-one slash-pos-two
410                           (= slash-pos-one slash-pos-two)                           (= slash-pos-one slash-pos-two)
411                           (string= (substring string-one 0 slash-pos-one) (substring string-two 0 slash-pos-two)))                           (string= (substring string-one 0 slash-pos-one) (substring string-two 0 slash-pos-two)))
412                      (progn                      (progn
413                          (setq prefix (substring string-one 0 (1+ slash-pos-one)))                          (setq prefix (substring string-one 0 (1+ slash-pos-one))))
414                      )                      (setq done t)))
415                  ;else              prefix)))
                     (setq done t)  
                 )  
             )  
             prefix  
         )  
     )  
 )  
416    
417  (defun flymake-build-relative-path(from-dir to-dir)  (defun flymake-build-relative-path (from-dir to-dir)
418      "return rel: from-dir/rel == to-dir"      "Return rel: FROM-DIR/rel == TO-DIR."
419      (if (not (equal (elt from-dir 0) (elt to-dir 0)))      (if (not (equal (elt from-dir 0) (elt to-dir 0)))
420          (error "first chars in paths %s, %s must be equal (same drive)" from-dir to-dir)          (error "First chars in paths %s, %s must be equal (same drive)" from-dir to-dir)
421      ;else      ;else
422          (let* ((from        (flymake-ensure-ends-with-slash (flymake-fix-path-name from-dir)))          (let* ((from        (flymake-ensure-ends-with-slash (flymake-fix-path-name from-dir)))
423                 (to          (flymake-ensure-ends-with-slash (flymake-fix-path-name to-dir)))                 (to          (flymake-ensure-ends-with-slash (flymake-fix-path-name to-dir)))
# Line 511  Line 427 
427                 (to-suffix   (substring to   (length prefix)))                 (to-suffix   (substring to   (length prefix)))
428                 (idx         0)                 (idx         0)
429                 (rel         nil))                 (rel         nil))
430                (if (and (> (length to-suffix) 0) (equal "/" (char-to-string (elt to-suffix 0))))
431                      (if (and (> (length to-suffix) 0) (equal "/" (char-to-string (elt to-suffix 0))))                  (setq to-suffix (substring to-suffix 1)))
                 (setq to-suffix (substring to-suffix 1))  
             )  
432    
433              (while (< idx up-count)              (while (< idx up-count)
434                  (if (> (length rel) 0)                  (if (> (length rel) 0)
435                      (setq rel (concat rel "/"))                      (setq rel (concat rel "/")))
                 )  
436                  (setq rel (concat rel ".."))                  (setq rel (concat rel ".."))
437                  (setq idx (1+ idx))                  (setq idx (1+ idx)))
             )  
438              (if (> (length rel) 0)              (if (> (length rel) 0)
439                  (setq rel (concat rel "/"))                  (setq rel (concat rel "/")))
             )  
440              (if (> (length to-suffix) 0)              (if (> (length to-suffix) 0)
441                 (setq rel (concat rel to-suffix))                 (setq rel (concat rel to-suffix)))
442              )              (or rel "./"))))
   
             (or rel "./")  
         )  
     )  
 )  
443    
444  (defcustom flymake-master-file-dirs '("." "./src" "./UnitTest")  (defcustom flymake-master-file-dirs '("." "./src" "./UnitTest")
445      "dirs where to llok for master files"      "Dirs where to llok for master files."
446      :group 'flymake      :group 'flymake
447      :type '(repeat (string))      :type '(repeat (string)))
 )  
448    
449  (defcustom flymake-master-file-count-limit 32  (defcustom flymake-master-file-count-limit 32
450      "max number of master files to check"      "Max number of master files to check."
451      :group 'flymake      :group 'flymake
452      :type 'integer      :type 'integer)
453  )  
454    (defvar flymake-included-file-name nil " ") ; this is used to pass a parameter to a sort predicate below
455    
456  (defun flymake-find-possible-master-files(file-name master-file-dirs masks)  (defun flymake-find-possible-master-files (file-name master-file-dirs masks)
457      "find (by name and location) all posible master files, which are .cpp and .c for and .h.      "Find (by name and location) all posible master files.
458  Files are searched for starting from the .h directory and max max-level parent dirs.  Mater files are .cpp and .c for and .h. Files are searched for
459    starting from the .h directory and max max-level parent dirs.
460  File contents are not checked."  File contents are not checked."
461      (let* ((dir-idx    0)      (let* ((dir-idx    0)
462            (dir-count  (length master-file-dirs))            (dir-count  (length master-file-dirs))
# Line 572  File contents are not checked." Line 479  File contents are not checked."
479                                  (setq files (cons (nth file-idx dir-files) files))                                  (setq files (cons (nth file-idx dir-files) files))
480                                  (when (>= (length files) flymake-master-file-count-limit)                                  (when (>= (length files) flymake-master-file-count-limit)
481                                      (flymake-log 3 "master file count limit (%d) reached" flymake-master-file-count-limit)                                      (flymake-log 3 "master file count limit (%d) reached" flymake-master-file-count-limit)
482                                      (setq done t)                                      (setq done t)))
483                                  )                              (setq file-idx (1+ file-idx))))
484                              )                      (setq masks-idx (1+ masks-idx))))
485                              (setq file-idx (1+ file-idx))              (setq dir-idx (1+ dir-idx)))
                         )  
                     )  
                     (setq masks-idx (1+ masks-idx))  
                 )  
             )  
             (setq dir-idx (1+ dir-idx))  
         )  
486          (when files          (when files
487              (setq flymake-included-file-name (file-name-nondirectory file-name))              (setq flymake-included-file-name (file-name-nondirectory file-name))
488              (setq files (sort files 'flymake-master-file-compare))              (setq files (sort files 'flymake-master-file-compare))
489              (setq flymake-included-file-name nil)              (setq flymake-included-file-name nil))
         )  
490          (flymake-log 3 "found %d possible master file(s)" (length files))          (flymake-log 3 "found %d possible master file(s)" (length files))
491          files          files))
     )  
 )  
492    
493  (defvar flymake-included-file-name nil ; this is used to pass a parameter to a sort predicate below  (defun flymake-master-file-compare (file-one file-two)
494      ""      "Compare two files speccified by FILE-ONE and FILE-TWO.
495  )  This function is used in sort to move most possible file names
496    to the beginning of the list (File.h -> File.cpp moved to top."
 (defun flymake-master-file-compare(file-one file-two)  
     "used in sort to move most possible file names to the beginning of the list (File.h -> File.cpp moved to top"  
497      (and (equal (file-name-sans-extension flymake-included-file-name)      (and (equal (file-name-sans-extension flymake-included-file-name)
498                  (file-name-sans-extension (file-name-nondirectory file-one)))                  (file-name-sans-extension (file-name-nondirectory file-one)))
499           (not (equal file-one file-two))           (not (equal file-one file-two))))
     )  
 )  
500    
501  (defcustom flymake-check-file-limit 8192  (defcustom flymake-check-file-limit 8192
502      "max number of chars to look at when checking possible master file"      "Max number of chars to look at when checking possible master file."
503      :group 'flymake      :group 'flymake
504      :type 'integer      :type 'integer)
 )  
505    
506  (defun flymake-check-patch-master-file-buffer(master-file-temp-buffer  (defun flymake-check-patch-master-file-buffer (master-file-temp-buffer
507                                              master-file-name patched-master-file-name                                              master-file-name patched-master-file-name
508                                              source-file-name patched-source-file-name                                              source-file-name patched-source-file-name
509                                              include-dirs regexp-list)                                              include-dirs regexp-list)
510      "check whether master-file-name is indeed a master file for source-file-name.      "Check if MASTER-FILE-NAME is a master file for SOURCE-FILE-NAME.
511  For .cpp master file this means it includes source-file-name (.h).  For .cpp master file this means it includes SOURCE-FILE-NAME (.h).
512  If yes, patch a copy of master-file-name to include patched-source-file-name instead of source-file-name.  If yes, patch a copy of MASTER-FILE-NAME to include PATCHED-SOURCE-FILE-NAME
513  Whenether a buffer for master-file-name exists, use it as a source instead of reading master file from disk"  instead of SOURCE-FILE-NAME.
514    Whether a buffer for MATER-FILE-NAME exists, use it as a source
515    instead of reading master file from disk."
516      (let* ((found                     nil)      (let* ((found                     nil)
517             (regexp                    (format (nth 0 regexp-list) ; "[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\""             (regexp                    (format (nth 0 regexp-list) ; "[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\""
518                                                (file-name-nondirectory source-file-name)))                                                (file-name-nondirectory source-file-name)))
# Line 632  Whenether a buffer for master-file-name Line 526  Whenether a buffer for master-file-name
526                  (progn                  (progn
527                      (set-buffer master-file-temp-buffer)                      (set-buffer master-file-temp-buffer)
528                      (when (> search-limit (point-max))                      (when (> search-limit (point-max))
529                          (setq search-limit (point-max))                          (setq search-limit (point-max)))
                     )  
530                      (flymake-log 3 "checking %s against regexp %s" master-file-name regexp)                      (flymake-log 3 "checking %s against regexp %s" master-file-name regexp)
531                      (goto-char (point-min))                      (goto-char (point-min))
532                      (while (and (< (point) search-limit) (re-search-forward regexp search-limit t))                      (while (and (< (point) search-limit) (re-search-forward regexp search-limit t))
# Line 650  Whenether a buffer for master-file-name Line 543  Whenether a buffer for master-file-name
543                                                                          ; replace-match is not used here as it fails in xemacs with                                                                          ; replace-match is not used here as it fails in xemacs with
544                                                                          ; 'last match not a buffer' error as check-includes calls replace-in-string                                                                          ; 'last match not a buffer' error as check-includes calls replace-in-string
545                                                                          (flymake-replace-region (current-buffer) match-beg match-end                                                                          (flymake-replace-region (current-buffer) match-beg match-end
546                                                                                                                          (file-name-nondirectory patched-source-file-name))                                                                                                                          (file-name-nondirectory patched-source-file-name))))
547                                                                  )                                                          (forward-line 1)))
                                                         )  
                                                         (forward-line 1)  
                                                 )  
                     )  
548                      (when found                      (when found
549                          (flymake-save-buffer-in-file (current-buffer) patched-master-file-name)                          (flymake-save-buffer-in-file (current-buffer) patched-master-file-name)))
                     )  
                 )  
550                  ;+(flymake-log 3 "killing buffer %s" (buffer-name master-file-temp-buffer))                  ;+(flymake-log 3 "killing buffer %s" (buffer-name master-file-temp-buffer))
551                  (kill-buffer master-file-temp-buffer)                  (kill-buffer master-file-temp-buffer)))
             )  
         )  
552          ;+(flymake-log 3 "check-patch master file %s: %s" master-file-name found)          ;+(flymake-log 3 "check-patch master file %s: %s" master-file-name found)
553          (when found          (when found
554              (flymake-log 2 "found master file %s" master-file-name)              (flymake-log 2 "found master file %s" master-file-name))
555          )          found))
         found  
     )  
 )  
556    
557  (defun flymake-replace-region(buffer beg end rep)  (defun flymake-replace-region (buffer beg end rep)
558      "replace text in buffer in region (beg; end) with rep"      "Replace text in BUFFER in region (BEG END) with REP."
559      (save-excursion      (save-excursion
560          (delete-region beg end)          (delete-region beg end)
561              (goto-char beg)              (goto-char beg)
562          (insert rep)          (insert rep)))
         )  
 )  
563    
564  (defun flymake-read-file-to-temp-buffer(file-name)  (defun flymake-read-file-to-temp-buffer (file-name)
565      "isert contents of file-name into newly created temp buffer"      "Insert contents of FILE-NAME into newly created temp buffer."
566      (let* ((temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (file-name-nondirectory file-name))))))      (let* ((temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (file-name-nondirectory file-name))))))
567          (save-excursion          (save-excursion
568              (set-buffer temp-buffer)              (set-buffer temp-buffer)
569              (insert-file-contents file-name)              (insert-file-contents file-name))
570          )          temp-buffer))
         temp-buffer  
     )  
 )  
571    
572  (defun flymake-copy-buffer-to-temp-buffer(buffer)  (defun flymake-copy-buffer-to-temp-buffer (buffer)
573      "copy contents of buffer into newly created temp buffer"      "Copy contents of BUFFER into newly created temp buffer."
574      (let ((contents     nil)      (let ((contents     nil)
575            (temp-buffer  nil))            (temp-buffer  nil))
576          (save-excursion          (save-excursion
# Line 702  Whenether a buffer for master-file-name Line 579  Whenether a buffer for master-file-name
579    
580              (setq temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (buffer-name buffer)))))              (setq temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (buffer-name buffer)))))
581              (set-buffer temp-buffer)              (set-buffer temp-buffer)
582              (insert contents)              (insert contents))
583          )          temp-buffer))
         temp-buffer  
     )  
 )  
584    
585  (defun flymake-check-include(source-file-name inc-path inc-name include-dirs)  (defun flymake-check-include (source-file-name inc-path inc-name include-dirs)
586      "t if source-file-name is the one found via include dirs using inc-path and inc-name"      "Check if SOURCE-FILE-NAME can be found in include path.
587    Return t if it can be found via include path using INC-PATH and INC-NAME."
588      (if (file-name-absolute-p inc-path)      (if (file-name-absolute-p inc-path)
589          (flymake-same-files source-file-name (concat inc-path "/" inc-name))          (flymake-same-files source-file-name (concat inc-path "/" inc-name))
     ;else  
590          (let* ((count      (length include-dirs))          (let* ((count      (length include-dirs))
591                 (idx        0)                 (idx        0)
592                 (file-name  nil)                 (file-name  nil)
# Line 720  Whenether a buffer for master-file-name Line 594  Whenether a buffer for master-file-name
594              (while (and (not found) (< idx count))              (while (and (not found) (< idx count))
595                  (setq file-name (concat (file-name-directory source-file-name) "/" (nth idx include-dirs)))                  (setq file-name (concat (file-name-directory source-file-name) "/" (nth idx include-dirs)))
596                  (if (> (length inc-path) 0)                  (if (> (length inc-path) 0)
597                      (setq file-name (concat file-name "/" inc-path))                      (setq file-name (concat file-name "/" inc-path)))
                 )  
598                  (setq file-name (concat file-name "/" inc-name))                  (setq file-name (concat file-name "/" inc-name))
599                  (when (flymake-same-files source-file-name file-name)                  (when (flymake-same-files source-file-name file-name)
600                      (setq found t)                      (setq found t))
601                  )                  (setq idx (1+ idx)))
602                  (setq idx (1+ idx))              found)))
603              )  
604              found  (defun flymake-find-buffer-for-file (file-name)
605          )      "Check if there exists a buffer visiting FILE-NAME.
606      )  Return t if so, nil if not."
 )  
   
 (defun flymake-find-buffer-for-file(file-name)  
     "buffer if there exists a buffer visiting file-name, nil otherwise"  
607      (let ((buffer-name (get-file-buffer file-name)))      (let ((buffer-name (get-file-buffer file-name)))
608          (if buffer-name          (if buffer-name
609              (get-buffer buffer-name)              (get-buffer buffer-name))))
         )  
     )  
 )  
610    
611  (defun flymake-create-master-file(source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp-list)  (defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp-list)
612      "save source-file-name with a different name, find master file, patch it and save it to."      "Save SOURCE-FILE-NAME with a different name.
613    Find master file, patch and save it."
614      (let* ((possible-master-files     (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))      (let* ((possible-master-files     (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))
615             (master-file-count         (length possible-master-files))             (master-file-count         (length possible-master-files))
616             (idx                       0)             (idx                       0)
# Line 757  Whenether a buffer for master-file-name Line 624  Whenether a buffer for master-file-name
624              (setq patched-master-file-name (funcall create-temp-f master-file-name "flymake_master"))              (setq patched-master-file-name (funcall create-temp-f master-file-name "flymake_master"))
625              (if (flymake-find-buffer-for-file master-file-name)              (if (flymake-find-buffer-for-file master-file-name)
626                  (setq temp-buffer (flymake-copy-buffer-to-temp-buffer (flymake-find-buffer-for-file master-file-name)))                  (setq temp-buffer (flymake-copy-buffer-to-temp-buffer (flymake-find-buffer-for-file master-file-name)))
627              ;else                  (setq temp-buffer (flymake-read-file-to-temp-buffer master-file-name)))
                 (setq temp-buffer (flymake-read-file-to-temp-buffer master-file-name))  
             )  
628              (setq found              (setq found
629                    (flymake-check-patch-master-file-buffer                    (flymake-check-patch-master-file-buffer
630                         temp-buffer                         temp-buffer
# Line 769  Whenether a buffer for master-file-name Line 634  Whenether a buffer for master-file-name
634                         patched-source-file-name                         patched-source-file-name
635                         (funcall get-incl-dirs-f (file-name-directory master-file-name))                         (funcall get-incl-dirs-f (file-name-directory master-file-name))
636                         include-regexp-list))                         include-regexp-list))
637              (setq idx (1+ idx))              (setq idx (1+ idx)))
         )  
638          (if found          (if found
639              (list master-file-name patched-master-file-name)              (list master-file-name patched-master-file-name)
         ;else  
640              (progn              (progn
641                  (flymake-log 3 "none of %d master file(s) checked includes %s" master-file-count                  (flymake-log 3 "none of %d master file(s) checked includes %s" master-file-count
642                             (file-name-nondirectory source-file-name))                             (file-name-nondirectory source-file-name))
643                  nil                  nil))))
             )  
         )  
     )  
 )  
644    
645  (defun flymake-save-buffer-in-file(buffer file-name)  (defun flymake-save-buffer-in-file (buffer file-name)
646      (or buffer      (or buffer
647          (error "invalid buffer")          (error "Invalid buffer"))
     )  
648      (save-excursion      (save-excursion
649          (save-restriction          (save-restriction
650              (set-buffer buffer)              (set-buffer buffer)
651              (widen)              (widen)
652              (make-directory (file-name-directory file-name) 1)              (make-directory (file-name-directory file-name) 1)
653              (write-region (point-min) (point-max) file-name nil 566)              (write-region (point-min) (point-max) file-name nil 566)))
654          )      (flymake-log 3 "saved buffer %s in file %s" (buffer-name buffer) file-name))
     )  
     (flymake-log 3 "saved buffer %s in file %s" (buffer-name buffer) file-name)  
 )  
655    
656  (defun flymake-save-string-to-file(file-name data)  (defun flymake-save-string-to-file (file-name data)
657      "save string data to file file-name"      "Save string DATA to file FILE-NAME."
658      (write-region data nil file-name nil 566)      (write-region data nil file-name nil 566))
 )  
659    
660  (defun flymake-read-file-to-string(file-name)  (defun flymake-read-file-to-string (file-name)
661      "read file contents and return them as a string"      "Read contents of file FILE-NAME and return as a string."
662      (with-temp-buffer      (with-temp-buffer
663          (insert-file-contents file-name)          (insert-file-contents file-name)
664          (buffer-substring (point-min) (point-max))          (buffer-substring (point-min) (point-max))))
     )  
 )  
665    
666  (defun flymake-process-filter(process output)  (defun flymake-process-filter (process output)
667      "flymake process filter: parse output, highlight err lines"      "Parse OUTPUT and highlight error lines.
668    It's flymake process filter."
669      (let* ((pid               (process-id process))      (let* ((pid               (process-id process))
670             (source-buffer     (get-buffer (flymake-get-source-buffer-name pid))))             (source-buffer     (get-buffer (flymake-get-source-buffer-name pid))))
671    
672          (flymake-log 3 "received %d byte(s) of output from process %d" (length output) pid)          (flymake-log 3 "received %d byte(s) of output from process %d" (length output) pid)
673          (when source-buffer          (when source-buffer
674              (flymake-parse-output-and-residual source-buffer output)              (flymake-parse-output-and-residual source-buffer output))))
         )  
     )  
 )  
675    
676  (defun flymake-process-sentinel(process event)  (defun flymake-process-sentinel (process event)
677     "Sentinel for syntax check buffers"     "Sentinel for syntax check buffers."
678     (if (memq (process-status process) '(signal exit))     (if (memq (process-status process) '(signal exit))
679         (let*((exit-status       (process-exit-status process))         (let*((exit-status       (process-exit-status process))
680               (command           (process-command process))               (command           (process-command process))
# Line 847  Whenether a buffer for master-file-name Line 697  Whenether a buffer for master-file-name
697    
698                           (flymake-parse-residual source-buffer)                           (flymake-parse-residual source-buffer)
699                           (flymake-post-syntax-check source-buffer exit-status command)                           (flymake-post-syntax-check source-buffer exit-status command)
700                           (flymake-set-buffer-is-running source-buffer nil)                           (flymake-set-buffer-is-running source-buffer nil))))
                    )  
                 )  
             )  
701             (error             (error
702                (let ((err-str (format "Error in process sentinel for buffer %s: %s"                (let ((err-str (format "Error in process sentinel for buffer %s: %s"
703                                      source-buffer (error-message-string err))))                                      source-buffer (error-message-string err))))
704                    (flymake-log 0 err-str)                    (flymake-log 0 err-str)
705                    (flymake-set-buffer-is-running source-buffer nil)                    (flymake-set-buffer-is-running source-buffer nil)))))))
                )  
            )  
          )  
       )  
    )  
 )  
706    
707  (defun flymake-post-syntax-check(source-buffer exit-status command)  (defun flymake-post-syntax-check (source-buffer exit-status command)
     ""  
708     (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer))     (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer))
709     (flymake-set-buffer-new-err-info source-buffer nil)     (flymake-set-buffer-new-err-info source-buffer nil)
710    
# Line 885  Whenether a buffer for master-file-name Line 725  Whenether a buffer for master-file-name
725         (if (and (equal 0 err-count) (equal 0 warn-count))         (if (and (equal 0 err-count) (equal 0 warn-count))
726             (if (equal 0 exit-status)             (if (equal 0 exit-status)
727                 (flymake-report-status source-buffer "" "") ; PASSED                 (flymake-report-status source-buffer "" "") ; PASSED
            ;else  
728                 (if (not (flymake-get-buffer-check-was-interrupted source-buffer))                 (if (not (flymake-get-buffer-check-was-interrupted source-buffer))
729                     (flymake-report-fatal-status (current-buffer) "CFGERR"                     (flymake-report-fatal-status (current-buffer) "CFGERR"
730                         (format "Configuration error has occured while running %s" command))                         (format "Configuration error has occured while running %s" command))
731                 ;else                     (flymake-report-status source-buffer nil ""))) ; "STOPPED"
732                     (flymake-report-status source-buffer nil "") ; "STOPPED"             (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) ""))))
                )  
            )  
        ;else  
            (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) "")  
        )  
    )  
 )  
733    
734  (defun flymake-parse-output-and-residual(source-buffer output)  (defun flymake-parse-output-and-residual (source-buffer output)
735      "split output into lines, merge in residual if necessary"      "Split OUTPUT into lines, merge in residual if necessary."
736      (save-excursion      (save-excursion
737          (set-buffer source-buffer)          (set-buffer source-buffer)
738          (let* ((buffer-residual     (flymake-get-buffer-output-residual source-buffer))          (let* ((buffer-residual     (flymake-get-buffer-output-residual source-buffer))
# Line 912  Whenether a buffer for master-file-name Line 744  Whenether a buffer for master-file-name
744              (flymake-set-buffer-output-residual source-buffer new-residual)              (flymake-set-buffer-output-residual source-buffer new-residual)
745              (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines              (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines
746                                                              (flymake-get-buffer-new-err-info source-buffer)                                                              (flymake-get-buffer-new-err-info source-buffer)
747                                                              source-buffer lines))                                                              source-buffer lines)))))
         )  
     )  
 )  
748    
749  (defun flymake-parse-residual(source-buffer)  (defun flymake-parse-residual (source-buffer)
750      "parse residual if it's non empty"      "Parse residual if it's non empty."
751      (save-excursion      (save-excursion
752          (set-buffer source-buffer)          (set-buffer source-buffer)
753          (when (flymake-get-buffer-output-residual source-buffer)          (when (flymake-get-buffer-output-residual source-buffer)
# Line 926  Whenether a buffer for master-file-name Line 755  Whenether a buffer for master-file-name
755                                                             (flymake-get-buffer-new-err-info source-buffer)                                                             (flymake-get-buffer-new-err-info source-buffer)
756                                                             source-buffer                                                             source-buffer
757                                                             (list (flymake-get-buffer-output-residual source-buffer))))                                                             (list (flymake-get-buffer-output-residual source-buffer))))
758              (flymake-set-buffer-output-residual source-buffer nil)              (flymake-set-buffer-output-residual source-buffer nil))))
         )  
     )  
 )  
759    
760  (defvar flymake-err-info nil  (defvar flymake-err-info nil
761      "sorted list of line numbers and lists of err info in the form (file, err-text)."    "Sorted list of line numbers and lists of err info in the form (file, err-text).")
762  )  
763  (make-variable-buffer-local 'flymake-err-info)  (make-variable-buffer-local 'flymake-err-info)
764  (defun flymake-get-buffer-err-info(buffer)  
765      (flymake-get-buffer-var buffer 'flymake-err-info)  (defun flymake-get-buffer-err-info (buffer)
766  )      (flymake-get-buffer-var buffer 'flymake-err-info))
767  (defun flymake-set-buffer-err-info(buffer err-info)  
768      (flymake-set-buffer-var buffer 'flymake-err-info err-info)  (defun flymake-set-buffer-err-info (buffer err-info)
769  )      (flymake-set-buffer-var buffer 'flymake-err-info err-info))
770  (defun flymake-er-make-er(line-no line-err-info-list)  
771      (list line-no line-err-info-list)  (defun flymake-er-make-er (line-no line-err-info-list)
772  )      (list line-no line-err-info-list))
773  (defun flymake-er-get-line(err-info)  
774      (nth 0 err-info)  (defun flymake-er-get-line (err-info)
775  )      (nth 0 err-info))
776  (defun flymake-er-get-line-err-info-list(err-info)  
777      (nth 1 err-info)  (defun flymake-er-get-line-err-info-list (err-info)
778  )      (nth 1 err-info))
779    
780  (defvar flymake-new-err-info nil  (defvar flymake-new-err-info nil
781      "the same as flymake -err-info, effective when a syntax check is in progress"    "Same as 'flymake-err-info', effective when a syntax check is in progress.")
782  )  
783  (make-variable-buffer-local 'flymake-new-err-info)  (make-variable-buffer-local 'flymake-new-err-info)
784  (defun flymake-get-buffer-new-err-info(buffer)  
785      (flymake-get-buffer-var buffer 'flymake-new-err-info)  (defun flymake-get-buffer-new-err-info (buffer)
786  )      (flymake-get-buffer-var buffer 'flymake-new-err-info))
787  (defun flymake-set-buffer-new-err-info(buffer new-err-info)  
788      (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info)  (defun flymake-set-buffer-new-err-info (buffer new-err-info)
789  )      (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info))
790    
791  ;; getters/setters for line-err-info: (file, line, type, text).  ;; getters/setters for line-err-info: (file, line, type, text).
792  (defun flymake-ler-make-ler(file line type text &optional full-file)  (defun flymake-ler-make-ler (file line type text &optional full-file)
793      (list file line type text full-file)      (list file line type text full-file))
794  )  
795  (defun flymake-ler-get-file(line-err-info)  (defun flymake-ler-get-file (line-err-info)
796      (nth 0 line-err-info)      (nth 0 line-err-info))
797  )  
798  (defun flymake-ler-get-line(line-err-info)  (defun flymake-ler-get-line (line-err-info)
799      (nth 1 line-err-info)      (nth 1 line-err-info))
800  )  
801  (defun flymake-ler-get-type(line-err-info)  (defun flymake-ler-get-type (line-err-info)
802      (nth 2 line-err-info)      (nth 2 line-err-info))
803  )  
804  (defun flymake-ler-get-text(line-err-info)  (defun flymake-ler-get-text (line-err-info)
805      (nth 3 line-err-info)      (nth 3 line-err-info))
806  )  
807  (defun flymake-ler-get-full-file(line-err-info)  (defun flymake-ler-get-full-file (line-err-info)
808      (nth 4 line-err-info)      (nth 4 line-err-info))
809  )  
810  (defun flymake-ler-set-file(line-err-info file)  (defun flymake-ler-set-file (line-err-info file)
811      (flymake-ler-make-ler file      (flymake-ler-make-ler file
812                          (flymake-ler-get-line line-err-info)                          (flymake-ler-get-line line-err-info)
813                          (flymake-ler-get-type line-err-info)                          (flymake-ler-get-type line-err-info)
814                          (flymake-ler-get-text line-err-info)                          (flymake-ler-get-text line-err-info)
815                          (flymake-ler-get-full-file line-err-info))                          (flymake-ler-get-full-file line-err-info)))
816  )  
817  (defun flymake-ler-set-full-file(line-err-info full-file)  (defun flymake-ler-set-full-file (line-err-info full-file)
818      (flymake-ler-make-ler (flymake-ler-get-file line-err-info)      (flymake-ler-make-ler (flymake-ler-get-file line-err-info)
819                          (flymake-ler-get-line line-err-info)                          (flymake-ler-get-line line-err-info)
820                          (flymake-ler-get-type line-err-info)                          (flymake-ler-get-type line-err-info)
821                          (flymake-ler-get-text line-err-info)                          (flymake-ler-get-text line-err-info)
822                          full-file)                          full-file))
823  )  
824  (defun flymake-ler-set-line(line-err-info line)  (defun flymake-ler-set-line (line-err-info line)
825      (flymake-ler-make-ler (flymake-ler-get-file line-err-info)      (flymake-ler-make-ler (flymake-ler-get-file line-err-info)
826                          line                          line
827                          (flymake-ler-get-type line-err-info)                          (flymake-ler-get-type line-err-info)
828                          (flymake-ler-get-text line-err-info)                          (flymake-ler-get-text line-err-info)
829                          (flymake-ler-get-full-file line-err-info))                          (flymake-ler-get-full-file line-err-info)))
 )  
830    
831  (defun flymake-get-line-err-count(line-err-info-list type)  (defun flymake-get-line-err-count (line-err-info-list type)
832      "return number of errors of specified type - e or w"      "Return number of errors of specified TYPE.
833    Value of TYPE is eigher e or w."
834      (let* ((idx        0)      (let* ((idx        0)
835             (count      (length line-err-info-list))             (count      (length line-err-info-list))
836             (err-count  0))             (err-count  0))
837    
838          (while (< idx count)          (while (< idx count)
839              (when (equal type (flymake-ler-get-type (nth idx line-err-info-list)))              (when (equal type (flymake-ler-get-type (nth idx line-err-info-list)))
840                  (setq err-count (1+ err-count))                  (setq err-count (1+ err-count)))
841              )              (setq idx (1+ idx)))
842              (setq idx (1+ idx))          err-count))
         )  
         err-count  
     )  
 )  
843    
844  (defun flymake-get-err-count(err-info-list type)  (defun flymake-get-err-count (err-info-list type)
845      "return number of errors of specified type for the err-info-list"      "Return number of errors of specified TYPE for ERR-INFO-LIST."
846      (let* ((idx        0)      (let* ((idx        0)
847             (count      (length err-info-list))             (count      (length err-info-list))
848             (err-count  0))             (err-count  0))
849          (while (< idx count)          (while (< idx count)
850              (setq err-count (+ err-count (flymake-get-line-err-count (nth 1 (nth idx err-info-list)) type)))              (setq err-count (+ err-count (flymake-get-line-err-count (nth 1 (nth idx err-info-list)) type)))
851              (setq idx (1+ idx))              (setq idx (1+ idx)))
852          )          err-count))
         err-count  
     )  
 )  
853    
854  (defun flymake-fix-line-numbers(err-info-list min-line max-line)  (defun flymake-fix-line-numbers (err-info-list min-line max-line)
855      "replace line-numbers < min-line with min-line and > max-line with max-line - as some compilers might report line number outside the file being compiled"      "Replace line numbers with fixed value.
856    If line-numbers is less than MIN-LINE, set line numbers to MIN-LINE.
857    If line numbers is greater than MAX-LINE, set line numbers to MAX-LINE.
858    The reason for this fix is because some compilers might report
859    line number outside the file being compiled."
860      (let* ((count     (length err-info-list))      (let* ((count     (length err-info-list))
861             (err-info  nil)             (err-info  nil)
862             (line      0))             (line      0))
# Line 1043  Whenether a buffer for master-file-name Line 866  Whenether a buffer for master-file-name
866              (when (or (< line min-line) (> line max-line))              (when (or (< line min-line) (> line max-line))
867                  (setq line (if (< line min-line) min-line max-line))                  (setq line (if (< line min-line) min-line max-line))
868                  (setq err-info-list (flymake-set-at err-info-list (1- count)                  (setq err-info-list (flymake-set-at err-info-list (1- count)
869                                              (flymake-er-make-er line                      (flymake-er-make-er line
870                                                                (flymake-er-get-line-err-info-list err-info))))                          (flymake-er-get-line-err-info-list err-info)))))
871              )              (setq count (1- count))))
872              (setq count (1- count))      err-info-list)
         )  
     )  
     err-info-list  
 )  
873    
874  (defun flymake-highlight-err-lines(buffer err-info-list)  (defun flymake-highlight-err-lines (buffer err-info-list)
875      "highlight err-lines in buffer using info from err-info-list"      "Highlight error lines in BUFFER using info from ERR-INFO-LIST."
876      (save-excursion      (save-excursion
877          (set-buffer buffer)          (set-buffer buffer)
878          (let* ((idx    0)          (let* ((idx    0)
879                 (count  (length err-info-list)))                 (count  (length err-info-list)))
880              (while (< idx count)              (while (< idx count)
881                  (flymake-highlight-line (car (nth idx err-info-list)) (nth 1 (nth idx err-info-list)))                  (flymake-highlight-line (car (nth idx err-info-list)) (nth 1 (nth idx err-info-list)))
882                  (setq idx (1+ idx))                  (setq idx (1+ idx))))))
             )  
         )  
     )  
 )  
883    
884  (defun flymake-overlay-p(ov)  (defun flymake-overlay-p (ov)
885       "Determine whether overlay was created by flymake"       "Determine whether overlay OV was created by flymake."
886       (and (overlayp ov) (overlay-get ov 'flymake-overlay))       (and (overlayp ov) (overlay-get ov 'flymake-overlay)))
 )  
887    
888  (defun flymake-make-overlay(beg end tooltip-text face mouse-face)  (defun flymake-make-overlay (beg end tooltip-text face mouse-face)
889      "Allocate a flymake overlay in range beg end"      "Allocate a flymake overlay in range BEG and END."
890      (when (not (flymake-region-has-flymake-overlays beg end))      (when (not (flymake-region-has-flymake-overlays beg end))
891          (let ((ov (make-overlay beg end nil t t)))          (let ((ov (make-overlay beg end nil t t)))
892              (overlay-put ov 'face           face)              (overlay-put ov 'face           face)
# Line 1081  Whenether a buffer for master-file-name Line 895  Whenether a buffer for master-file-name
895              (overlay-put ov 'flymake-overlay  t)              (overlay-put ov 'flymake-overlay  t)
896              (overlay-put ov 'priority 100)              (overlay-put ov 'priority 100)
897              ;+(flymake-log 3 "created overlay %s" ov)              ;+(flymake-log 3 "created overlay %s" ov)
898              ov              ov)
899          )          (flymake-log 3 "created an overlay at (%d-%d)" beg end)))
         (flymake-log 3 "created an overlay at (%d-%d)" beg end)  
     )  
 )  
900    
901  (defun flymake-delete-own-overlays(buffer)  (defun flymake-delete-own-overlays (buffer)
902      "Delete all flymake overlays in buffer"      "Delete all flymake overlays in BUFFER."
903      (save-excursion      (save-excursion
904          (set-buffer buffer)          (set-buffer buffer)
905          (let ((ov (overlays-in (point-min) (point-max))))          (let ((ov (overlays-in (point-min) (point-max))))
# Line 1097  Whenether a buffer for master-file-name Line 908  Whenether a buffer for master-file-name
908                      (delete-overlay (car ov))                      (delete-overlay (car ov))
909                      ;+(flymake-log 3 "deleted overlay %s" ov)                      ;+(flymake-log 3 "deleted overlay %s" ov)
910                  )                  )
911                  (setq ov (cdr ov))                  (setq ov (cdr ov))))))
             )  
         )  
     )  
 )  
912    
913  (defun flymake-region-has-flymake-overlays(beg end)  (defun flymake-region-has-flymake-overlays (beg end)
914      "t if specified regions has at least one flymake overlay, nil otrherwise"      "Check if region specified by BEG and END has overlay.
915    Return t if it has at least one flymake overlay, nil if no overlay."
916      (let ((ov                  (overlays-in beg end))      (let ((ov                  (overlays-in beg end))
917            (has-flymake-overlays  nil))            (has-flymake-overlays  nil))
918          (while (consp ov)          (while (consp ov)
919              (when (flymake-overlay-p (car ov))              (when (flymake-overlay-p (car ov))
920                  (setq has-flymake-overlays t)                  (setq has-flymake-overlays t))
921              )              (setq ov (cdr ov)))))
             (setq ov (cdr ov))  
         )  
     )  
 )  
922    
923  (defface flymake-errline-face  (defface flymake-errline-face
924  ;+   '((((class color)) (:foreground "OrangeRed" :bold t :underline t))  ;+   '((((class color)) (:foreground "OrangeRed" :bold t :underline t))
925  ;+   '((((class color)) (:underline "OrangeRed"))  ;+   '((((class color)) (:underline "OrangeRed"))
926     '((((class color)) (:background "LightPink"))     '((((class color)) (:background "LightPink"))
927       (t (:bold t)))       (t (:bold t)))
928     "Face used for marking error lines"     "Face used for marking error lines."
929      :group 'flymake      :group 'flymake)
 )  
930    
931  (defface flymake-warnline-face  (defface flymake-warnline-face
932     '((((class color)) (:background "LightBlue2"))     '((((class color)) (:background "LightBlue2"))
933       (t (:bold t)))       (t (:bold t)))
934     "Face used for marking warning lines"     "Face used for marking warning lines."
935      :group 'flymake      :group 'flymake)
 )  
   
936    
937  (defun flymake-highlight-line(line-no line-err-info-list)  (defun flymake-highlight-line (line-no line-err-info-list)
938      "highlight line line-no in current buffer, perhaps use text from line-err-info-list to enhance highlighting"      "Highlight line LINE-NO in current buffer.
939    Perhaps use text from LINE-ERR-INFO-ILST to enhance highlighting."
940      (goto-line line-no)      (goto-line line-no)
941      (let* ((line-beg (flymake-line-beginning-position))      (let* ((line-beg (flymake-line-beginning-position))
942             (line-end (flymake-line-end-position))             (line-end (flymake-line-end-position))
# Line 1145  Whenether a buffer for master-file-name Line 947  Whenether a buffer for master-file-name
947    
948          (goto-char line-beg)          (goto-char line-beg)
949          (while (looking-at "[ \t]")          (while (looking-at "[ \t]")
950              (forward-char)              (forward-char))
         )  
951    
952          (setq beg (point))          (setq beg (point))
953    
954          (goto-char line-end)          (goto-char line-end)
955          (while (and (looking-at "[ \t\r\n]") (> (point) 1))          (while (and (looking-at "[ \t\r\n]") (> (point) 1))
956              (backward-char)              (backward-char))
         )  
957    
958          (setq end (1+ (point)))          (setq end (1+ (point)))
959    
960          (when (<= end beg)          (when (<= end beg)
961              (setq beg line-beg)              (setq beg line-beg)
962              (setq end line-end)              (setq end line-end))
963          )  
964          (when (= end beg)          (when (= end beg)
965              (goto-char end)              (goto-char end)
966              (forward-line)              (forward-line)
967              (setq end (point))              (setq end (point)))
968          )  
969          (if (> (flymake-get-line-err-count line-err-info-list "e") 0)          (if (> (flymake-get-line-err-count line-err-info-list "e") 0)
970              (setq face 'flymake-errline-face)              (setq face 'flymake-errline-face)
971          ;else              (setq face 'flymake-warnline-face))
             (setq face 'flymake-warnline-face)  
         )  
         (flymake-make-overlay beg end tooltip-text face nil)  
     )  
 )  
972    
973  (defun flymake-parse-err-lines(err-info-list source-buffer lines)          (flymake-make-overlay beg end tooltip-text face nil)))
974      "parse err lines, store info in err-info-list"  
975    (defun flymake-parse-err-lines (err-info-list source-buffer lines)
976        "Parse err LINES, store info in ERR-INFO-LIST."
977      (let* ((count              (length lines))      (let* ((count              (length lines))
978             (idx                0)             (idx                0)
979             (line-err-info      nil)             (line-err-info      nil)
# Line 1192  Whenether a buffer for master-file-name Line 989  Whenether a buffer for master-file-name
989    
990                  (if (flymake-same-files real-file-name source-file-name)                  (if (flymake-same-files real-file-name source-file-name)
991                      (setq line-err-info (flymake-ler-set-file line-err-info nil))                      (setq line-err-info (flymake-ler-set-file line-err-info nil))
992                  ;else                      (setq line-err-info (flymake-ler-set-file line-err-info (file-name-nondirectory real-file-name))))
                     (setq line-err-info (flymake-ler-set-file line-err-info (file-name-nondirectory real-file-name)))  
                 )  
993    
994                  (setq err-info-list (flymake-add-err-info err-info-list line-err-info))                  (setq err-info-list (flymake-add-err-info err-info-list line-err-info)))
             )  
995              (flymake-log 3 "parsed '%s', %s line-err-info" (nth idx lines) (if line-err-info "got" "no"))              (flymake-log 3 "parsed '%s', %s line-err-info" (nth idx lines) (if line-err-info "got" "no"))
996              (setq idx (1+ idx))              (setq idx (1+ idx)))
997          )          err-info-list))
         err-info-list  
     )  
 )  
998    
999  (defun flymake-split-output(output)  (defun flymake-split-output (output)
1000      "split output into lines, return last one as residual if it does not end with newline char. Returns ((lines) residual)"      "Split OUTPUT into lines.
1001    Return last one as residual if it does not end with newline char. Returns ((lines) residual)."
1002      (when (and output (> (length output) 0))      (when (and output (> (length output) 0))
1003          (let* ((lines (flymake-split-string output "[\n\r]+"))          (let* ((lines (flymake-split-string output "[\n\r]+"))
1004                 (complete (equal "\n" (char-to-string (aref output (1- (length output))))))                 (complete (equal "\n" (char-to-string (aref output (1- (length output))))))
1005                 (residual nil))                 (residual nil))
1006              (when (not complete)              (when (not complete)
1007                  (setq residual (car (last lines)))                  (setq residual (car (last lines)))
1008                  (setq lines (butlast lines))                  (setq lines (butlast lines)))
1009              )              (list lines residual))))
             (list lines residual)  
         )  
     )  
 )  
1010    
1011  (defun flymake-reformat-err-line-patterns-from-compile-el(original-list)  (defun flymake-reformat-err-line-patterns-from-compile-el (original-list)
1012      "grab error line patterns from original list in compile.el format, convert to flymake internal format"      "Grab error line patterns from ORIGINAL-LIST in compile.el format.
1013    Convert it to flymake internal format."
1014          (let* ((converted-list '()))          (let* ((converted-list '()))
1015          (mapcar          (mapcar
1016              (lambda (item)              (lambda (item)
# Line 1236  Whenether a buffer for master-file-name Line 1025  Whenether a buffer for master-file-name
1025                            (if (consp col)       (setq col (car col)))                            (if (consp col)       (setq col (car col)))
1026    
1027                            (when (not (functionp line))                            (when (not (functionp line))
1028                                    (setq converted-list (cons (list regexp file line col) converted-list))                                    (setq converted-list (cons (list regexp file line col) converted-list)))))
1029                            )                  original-list)
1030                     )          converted-list))
1031                  )  
1032                  original-list  (eval-when-compile
1033          )      (require 'compile))
         converted-list  
    )  
 )  
1034    
 (require 'compile)  
1035  (defvar flymake-err-line-patterns  ; regexp file-idx line-idx col-idx (optional) text-idx(optional), match-end to end of string is error text  (defvar flymake-err-line-patterns  ; regexp file-idx line-idx col-idx (optional) text-idx(optional), match-end to end of string is error text
1036      (append      (append
1037       '(       '(
# Line 1267  Whenether a buffer for master-file-name Line 1052  Whenether a buffer for master-file-name
1052      ; LaTeX warnings (fileless) ("\\(LaTeX \\(Warning\\|Error\\): .*\\) on input line \\([0-9]+\\)" 20 3 nil 1)      ; LaTeX warnings (fileless) ("\\(LaTeX \\(Warning\\|Error\\): .*\\) on input line \\([0-9]+\\)" 20 3 nil 1)
1053      ; ant/javac      ; ant/javac
1054             (" *\\(\\[javac\\]\\)? *\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)\:\\([0-9]+\\)\:[ \t\n]*\\(.+\\)"             (" *\\(\\[javac\\]\\)? *\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)\:\\([0-9]+\\)\:[ \t\n]*\\(.+\\)"
1055          2 4 nil 5)          2 4 nil 5))
       )  
1056           ;; compilation-error-regexp-alist)           ;; compilation-error-regexp-alist)
1057       (flymake-reformat-err-line-patterns-from-compile-el compilation-error-regexp-alist-alist))       (flymake-reformat-err-line-patterns-from-compile-el compilation-error-regexp-alist-alist))
1058      "patterns for matching error/warning lines, (regexp file-idx line-idx err-text-idx). Use flymake-reformat-err-line-patterns-from-compile-el to add patterns from compile.el"      "patterns for matching error/warning lines, (regexp file-idx line-idx err-text-idx). Use flymake-reformat-err-line-patterns-from-compile-el to add patterns from compile.el")
1059  )  
1060  ;(defcustom flymake-err-line-patterns  ;(defcustom flymake-err-line-patterns
1061  ;  '(  ;  '(
1062  ;    ; MS Visual C++ 6.0  ;    ; MS Visual C++ 6.0
# Line 1286  Whenether a buffer for master-file-name Line 1070  Whenether a buffer for master-file-name
1070  ;   :type '(repeat (string number number number))  ;   :type '(repeat (string number number number))
1071  ;)  ;)
1072    
1073  (defun flymake-parse-line(line)  (defun flymake-parse-line (line)
1074      "parse line to see whether it's an error of warning, return it's components or nil for no match"      "Parse LINE to see if it is an error of warning.
1075    Return its components if so, nil if no."
1076      (let ((raw-file-name nil)      (let ((raw-file-name nil)
1077            (line-no 0)            (line-no 0)
1078            (err-type "e")            (err-type "e")
# Line 1311  Whenether a buffer for master-file-name Line 1096  Whenether a buffer for master-file-name
1096                      )                      )
1097                      (flymake-log 3 "parse line: file-idx=%s line-idx=%s file=%s line=%s text=%s" file-idx line-idx                      (flymake-log 3 "parse line: file-idx=%s line-idx=%s file=%s line=%s text=%s" file-idx line-idx
1098                                   raw-file-name line-no err-text)                                   raw-file-name line-no err-text)
1099                      (setq matched t)                      (setq matched t)))
1100                  )              (setq idx (1+ idx)))
             )  
             (setq idx (1+ idx))  
         )  
1101          (if matched          (if matched
1102             (flymake-ler-make-ler raw-file-name line-no err-type err-text)             (flymake-ler-make-ler raw-file-name line-no err-type err-text)
1103          ; else             ())))
            ()  
         )  
     )  
 )  
1104    
1105  (defun flymake-find-err-info(err-info-list line-no)  (defun flymake-find-err-info (err-info-list line-no)
1106      "find (line-err-info-list pos) for specified line-no"      "Find (line-err-info-list pos) for specified LINE-NO."
1107      (if err-info-list      (if err-info-list
1108          (let* ((line-err-info-list  nil)          (let* ((line-err-info-list  nil)
1109                 (pos       0)                 (pos       0)
1110                 (count     (length err-info-list)))                 (count     (length err-info-list)))
1111    
1112              (while (and (< pos count) (< (car (nth pos err-info-list)) line-no))              (while (and (< pos count) (< (car (nth pos err-info-list)) line-no))
1113                  (setq pos (1+ pos))                  (setq pos (1+ pos)))
             )  
1114              (when (and (< pos count) (equal (car (nth pos err-info-list)) line-no))              (when (and (< pos count) (equal (car (nth pos err-info-list)) line-no))
1115                  (setq line-err-info-list (flymake-er-get-line-err-info-list (nth pos err-info-list)))                  (setq line-err-info-list (flymake-er-get-line-err-info-list (nth pos err-info-list))))
1116              )              (list line-err-info-list pos))
1117              (list line-err-info-list pos)          '(nil 0)))
         )  
     ;else  
         '(nil 0)  
     )  
 )  
1118    
1119  (defun flymake-line-err-info-is-less-or-equal(line-one line-two)  (defun flymake-line-err-info-is-less-or-equal (line-one line-two)
1120      (or (string< (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))      (or (string< (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1121          (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))          (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1122               (not (flymake-ler-get-file line-one)) (flymake-ler-get-file line-two)               (not (flymake-ler-get-file line-one)) (flymake-ler-get-file line-two))
         )  
1123          (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))          (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1124               (or (and      (flymake-ler-get-file line-one)       (flymake-ler-get-file line-two))               (or (and      (flymake-ler-get-file line-one)       (flymake-ler-get-file line-two))
1125                   (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))                   (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))))))
              )  
         )  
     )  
 )  
1126    
1127  (defun flymake-add-line-err-info(line-err-info-list line-err-info)  (defun flymake-add-line-err-info (line-err-info-list line-err-info)
1128      "insert new err info favoring sorting: err-type e/w, filename nil/non-nill"      "Insert new err info favoring sorting: err-type e/w, filename nil/non-nil."
1129      (if (not line-err-info-list)      (if (not line-err-info-list)
1130          (list line-err-info)          (list line-err-info)
     ;else  
1131          (let* ((count  (length line-err-info-list))          (let* ((count  (length line-err-info-list))
1132                 (idx    0))                 (idx    0))
1133              (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info))              (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info))
1134                  (setq idx (1+ idx))                  (setq idx (1+ idx)))
             )  
1135              (cond ((equal 0     idx)    (setq line-err-info-list (cons line-err-info line-err-info-list)))              (cond ((equal 0     idx)    (setq line-err-info-list (cons line-err-info line-err-info-list)))
1136                    (t                    (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info)))                    (t                    (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info))))
1137              )              line-err-info-list)))
             line-err-info-list  
         )  
     )  
 )  
1138    
1139  (defun flymake-add-err-info(err-info-list line-err-info)  (defun flymake-add-err-info (err-info-list line-err-info)
1140      "add error info (file line type text) to err info list preserving sort order"      "Add error info (file line type text) to err info list preserving sort order."
1141      (let* ((count               (length err-info-list))      (let* ((count               (length err-info-list))
1142             (line-no             (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))             (line-no             (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))
1143             (info-and-pos        (flymake-find-err-info err-info-list line-no))             (info-and-pos        (flymake-find-err-info err-info-list line-no))
# Line 1386  Whenether a buffer for master-file-name Line 1147  Whenether a buffer for master-file-name
1147             (err-info            nil))             (err-info            nil))
1148    
1149          (if exists          (if exists
1150              (setq line-err-info-list (flymake-er-get-line-err-info-list (car (nthcdr pos err-info-list))))              (setq line-err-info-list (flymake-er-get-line-err-info-list (car (nthcdr pos err-info-list)))))
         )  
1151          (setq line-err-info-list (flymake-add-line-err-info line-err-info-list line-err-info))          (setq line-err-info-list (flymake-add-line-err-info line-err-info-list line-err-info))
1152    
1153          (setq err-info (flymake-er-make-er line-no line-err-info-list))          (setq err-info (flymake-er-make-er line-no line-err-info-list))
1154          (cond (exists             (setq err-info-list (flymake-set-at err-info-list pos err-info)))          (cond (exists             (setq err-info-list (flymake-set-at err-info-list pos err-info)))
1155                ((equal 0 pos)      (setq err-info-list (cons err-info err-info-list)))                ((equal 0 pos)      (setq err-info-list (cons err-info err-info-list)))
1156                (t                  (setq err-info-list (flymake-ins-after err-info-list (1- pos) err-info)))                (t                  (setq err-info-list (flymake-ins-after err-info-list (1- pos) err-info))))
1157          )          err-info-list))
         err-info-list  
     )  
 )  
1158    
1159  (defun flymake-get-project-include-dirs-imp(basedir)  (defun flymake-get-project-include-dirs-imp (basedir)
1160      "include dirs for the project current file belongs to"      "Include dirs for the project current file belongs to."
1161      (if (flymake-get-project-include-dirs-from-cache basedir)      (if (flymake-get-project-include-dirs-from-cache basedir)
1162          (progn          (progn
1163              (flymake-get-project-include-dirs-from-cache basedir)              (flymake-get-project-include-dirs-from-cache basedir))
         )  
1164      ;else      ;else
1165          (let* ((command-line  (concat "make -C\"" basedir "\" DUMPVARS=INCLUDE_DIRS dumpvars"))          (let* ((command-line  (concat "make -C\"" basedir "\" DUMPVARS=INCLUDE_DIRS dumpvars"))
1166                 (output        (shell-command-to-string command-line))                 (output        (shell-command-to-string command-line))
# Line 1413  Whenether a buffer for master-file-name Line 1169  Whenether a buffer for master-file-name
1169                 (idx           0)                 (idx           0)
1170                 (inc-dirs      nil))                 (inc-dirs      nil))
1171              (while (and (< idx count) (not (string-match "^INCLUDE_DIRS=.*" (nth idx lines))))              (while (and (< idx count) (not (string-match "^INCLUDE_DIRS=.*" (nth idx lines))))
1172                 (setq idx (1+ idx))                 (setq idx (1+ idx)))
             )  
1173              (when (< idx count)              (when (< idx count)
1174                  (let* ((inc-lines  (flymake-split-string (nth idx lines) " *-I"))                  (let* ((inc-lines  (flymake-split-string (nth idx lines) " *-I"))
1175                         (inc-count  (length inc-lines)))                         (inc-count  (length inc-lines)))
1176                      (while (> inc-count 0)                      (while (> inc-count 0)
1177                          (when (not (string-match "^INCLUDE_DIRS=.*" (nth (1- inc-count) inc-lines)))                          (when (not (string-match "^INCLUDE_DIRS=.*" (nth (1- inc-count) inc-lines)))
1178                              (setq inc-dirs (cons (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs))                              (setq inc-dirs (cons (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs)))
1179                          )                          (setq inc-count (1- inc-count)))))
                         (setq inc-count (1- inc-count))  
                     )  
                 )  
             )  
1180              (flymake-add-project-include-dirs-to-cache basedir inc-dirs)              (flymake-add-project-include-dirs-to-cache basedir inc-dirs)
1181              inc-dirs              inc-dirs)))
         )  
     )  
 )  
1182    
1183  (defcustom flymake-get-project-include-dirs-function 'flymake-get-project-include-dirs-imp  (defcustom flymake-get-project-include-dirs-function 'flymake-get-project-include-dirs-imp
1184      "function used to get project inc dirs, one paramater: basedir name"      "Function used to get project inc dirs, one paramater: basedir name."
1185      :group 'flymake      :group 'flymake
1186      :type 'function      :type 'function)
 )  
1187    
1188  (defun flymake-get-project-include-dirs(basedir)  (defun flymake-get-project-include-dirs (basedir)
1189      (funcall flymake-get-project-include-dirs-function basedir)      (funcall flymake-get-project-include-dirs-function basedir))
 )  
1190    
1191  (defun flymake-get-system-include-dirs()  (defun flymake-get-system-include-dirs ()
1192      "system include dirs - from the 'INCLUDE' env setting"      "System include dirs - from the 'INCLUDE' env setting."
1193      (let* ((includes (getenv "INCLUDE")))      (let* ((includes (getenv "INCLUDE")))
1194          (if includes (flymake-split-string includes path-separator) nil)          (if includes (flymake-split-string includes path-separator) nil)))
     )  
 )  
1195    
1196  (defvar flymake-project-include-dirs-cache (flymake-makehash 'equal))  (defvar flymake-project-include-dirs-cache (flymake-makehash 'equal))
 (defun flymake-get-project-include-dirs-from-cache(base-dir)  
     (gethash base-dir flymake-project-include-dirs-cache)  
 )  
 (defun flymake-add-project-include-dirs-to-cache(base-dir include-dirs)  
     (puthash base-dir include-dirs flymake-project-include-dirs-cache)  
 )  
 (defun flymake-clear-project-include-dirs-cache()  
     (clrhash flymake-project-include-dirs-cache)  
 )  
1197    
1198  (defun flymake-get-include-dirs(base-dir)  (defun flymake-get-project-include-dirs-from-cache (base-dir)
1199      "dirs to use when resolving local filenames"      (gethash base-dir flymake-project-include-dirs-cache))
1200    
1201    (defun flymake-add-project-include-dirs-to-cache (base-dir include-dirs)
1202        (puthash base-dir include-dirs flymake-project-include-dirs-cache))
1203    
1204    (defun flymake-clear-project-include-dirs-cache ()
1205        (clrhash flymake-project-include-dirs-cache))
1206    
1207    (defun flymake-get-include-dirs (base-dir)
1208        "Get dirs to use when resolving local file names."
1209      (let* ((include-dirs (append '(".") (flymake-get-project-include-dirs base-dir) (flymake-get-system-include-dirs))))      (let* ((include-dirs (append '(".") (flymake-get-project-include-dirs base-dir) (flymake-get-system-include-dirs))))
1210          include-dirs          include-dirs))
     )  
 )  
1211    
1212  (defun flymake-find-file(rel-file-name include-dirs)  (defun flymake-find-file (rel-file-name include-dirs)
1213      "iterate through include-dirs, return first 'include-dir/rel-file-name' that exists, or just rel-file-name if not"      "Iterate through include-dirs to find file REL-FILE-NAME.
1214    Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists,  or just REL-FILE-NAME if not."
1215      (let* ((count          (length include-dirs))      (let* ((count          (length include-dirs))
1216             (idx            0)             (idx            0)
1217             (found          nil)             (found          nil)
# Line 1478  Whenether a buffer for master-file-name Line 1221  Whenether a buffer for master-file-name
1221              (let* ((dir (nth idx include-dirs)))              (let* ((dir (nth idx include-dirs)))
1222                  (setq full-file-name  (concat dir "/" rel-file-name))                  (setq full-file-name  (concat dir "/" rel-file-name))
1223                  (when (file-exists-p full-file-name)                  (when (file-exists-p full-file-name)
1224                      (setq found t)                      (setq found t)))
1225                  )              (setq idx (1+ idx)))
             )  
             (setq idx (1+ idx))  
         )  
1226          (if found          (if found
1227              full-file-name              full-file-name
1228          ;else              rel-file-name)))
             rel-file-name  
         )  
     )  
 )  
1229    
1230  (defun flymake-restore-formatting(source-buffer)  (defun flymake-restore-formatting (source-buffer)
1231      "Remove any formatting made by flymake"      "Remove any formatting made by flymake."
1232  )  )
1233    
1234  (defun flymake-get-program-dir(buffer)  (defun flymake-get-program-dir (buffer)
1235      "dir to start profram in"      "Get dir to start program in."
1236      (unless (bufferp buffer)      (unless (bufferp buffer)
1237          (error "invlid buffer")          (error "Invlid buffer"))
     )  
1238      (save-excursion      (save-excursion
1239          (set-buffer buffer)          (set-buffer buffer)
1240          default-directory          default-directory))
     )  
 )  
1241    
1242  (defun flymake-safe-delete-file(file-name)  (defun flymake-safe-delete-file (file-name)
1243      (when (and file-name (file-exists-p file-name))      (when (and file-name (file-exists-p file-name))
1244          (delete-file file-name)          (delete-file file-name)
1245          (flymake-log 1 "deleted file %s" file-name)          (flymake-log 1 "deleted file %s" file-name)))
     )  
 )  
1246    
1247  (defun flymake-safe-delete-directory(dir-name)  (defun flymake-safe-delete-directory (dir-name)
1248      (condition-case err      (condition-case err
1249          (progn          (progn
1250              (delete-directory dir-name)              (delete-directory dir-name)
1251              (flymake-log 1 "deleted dir %s" dir-name)              (flymake-log 1 "deleted dir %s" dir-name))
         )  
1252          (error          (error
1253              (flymake-log 1 "failed to delete dir %s, error ignored" dir-name)              (flymake-log 1 "Failed to delete dir %s, error ignored" dir-name))))
         )  
     )  
 )  
1254    
1255  (defcustom flymake-compilation-prevents-syntax-check t  (defcustom flymake-compilation-prevents-syntax-check t
1256      "if non-nil, syntax check won't be started in case compilation is running"       "If non-nil, syntax check won't be started in case compilation is running."
1257      :group 'flymake      :group 'flymake
1258      :type 'boolean      :type 'boolean)
 )  
1259    
1260  (defun flymake-start-syntax-check(buffer)  (defun flymake-start-syntax-check (buffer)
1261      "start syntax checking for buffer"      "Start syntax checking for buffer BUFFER."
1262      (unless (bufferp buffer)      (unless (bufferp buffer)
1263          (error "expected a buffer")          (error "Expected a buffer"))
     )  
1264      (save-excursion      (save-excursion
1265          (set-buffer buffer)          (set-buffer buffer)
1266          (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer))          (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer))
# Line 1559  Whenether a buffer for master-file-name Line 1284  Whenether a buffer for master-file-name
1284                      (if (not cmd-and-args)                      (if (not cmd-and-args)
1285                          (progn                          (progn
1286                              (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name)                              (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name)
1287                              (funcall cleanup-f buffer)                              (funcall cleanup-f buffer))
                         )  
                     ;else  
1288                          (progn                          (progn
1289                              (flymake-set-buffer-last-change-time buffer nil)                              (flymake-set-buffer-last-change-time buffer nil)
1290                              (flymake-start-syntax-check-process buffer cmd args dir)                              (flymake-start-syntax-check-process buffer cmd args dir))))))))
                         )  
                     )  
                 )  
             )  
         )  
     )  
 )  
   
 (defun flymake-start-syntax-check-process(buffer cmd args dir)  
     "start syntax check-process"  
1291    
1292    (defun flymake-start-syntax-check-process (buffer cmd args dir)
1293        "Start syntax check process."
1294      (let* ((process nil))      (let* ((process nil))
1295          (condition-case err          (condition-case err
1296              (progn              (progn
1297                              (when dir                  (when dir
1298                                          (let ((default-directory dir))                      (let ((default-directory dir))
1299                                              (flymake-log 3 "starting process on dir %s" default-directory)                            (flymake-log 3 "starting process on dir %s" default-directory)))
1300                                          )                  (setq process (get-process (apply 'start-process "flymake-proc" nil cmd args)))
                                 )  
                                 (setq process (get-process (apply 'start-process "flymake-proc" nil cmd args)))  
1301                  (set-process-sentinel process 'flymake-process-sentinel)                  (set-process-sentinel process 'flymake-process-sentinel)
1302                  (set-process-filter process 'flymake-process-filter)                  (set-process-filter process 'flymake-process-filter)
1303    
# Line 1597  Whenether a buffer for master-file-name Line 1310  Whenether a buffer for master-file-name
1310                  (flymake-report-status buffer nil "*")                  (flymake-report-status buffer nil "*")
1311                  (flymake-log 2 "started process %d, command=%s, dir=%s"                  (flymake-log 2 "started process %d, command=%s, dir=%s"
1312                             (process-id process) (process-command process) default-directory)                             (process-id process) (process-command process) default-directory)
1313                  process                  process)
             )  
1314              (error              (error
1315                  (let* ((err-str (format "Failed to launch syntax check process '%s' with args %s: %s"                  (let* ((err-str (format "Failed to launch syntax check process '%s' with args %s: %s"
1316                               cmd args (error-message-string err)))                               cmd args (error-message-string err)))
# Line 1606  Whenether a buffer for master-file-name Line 1318  Whenether a buffer for master-file-name
1318                        (cleanup-f        (flymake-get-cleanup-function source-file-name)))                        (cleanup-f        (flymake-get-cleanup-function source-file-name)))
1319                      (flymake-log 0 err-str)                      (flymake-log 0 err-str)
1320                      (funcall cleanup-f buffer)                      (funcall cleanup-f buffer)
1321                      (flymake-report-fatal-status buffer "PROCERR" err-str)                      (flymake-report-fatal-status buffer "PROCERR" err-str))))))
                 )  
             )  
         )  
     )  
 )  
1322    
1323  (defun flymake-kill-process(pid &optional rest)  (defun flymake-kill-process (pid &optional rest)
1324      "kill process pid"      "Kill process PID."
1325      (signal-process pid 9)      (signal-process pid 9)
1326      (let* ((buffer-name (flymake-get-source-buffer-name pid)))      (let* ((buffer-name (flymake-get-source-buffer-name pid)))
1327          (when (and buffer-name (get-buffer buffer-name))          (when (and buffer-name (get-buffer buffer-name))
1328              (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t)              (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t)))
1329          )      (flymake-log 1 "killed process %d" pid))
     )  
     (flymake-log 1 "killed process %d" pid)  
 )  
1330    
1331  (defun flymake-stop-all-syntax-checks()  (defun flymake-stop-all-syntax-checks ()
1332      "kill all syntax check processes"      "Kill all syntax check processes."
1333      (interactive)      (interactive)
1334      (let ((pids  (copy-hash-table flymake-pid-to-names)))      (let ((pids  (copy-hash-table flymake-pid-to-names)))
1335          (maphash 'flymake-kill-process pids)          (maphash 'flymake-kill-process pids)))
     )  
 )  
1336    
1337  (defun flymake-compilation-is-running()  (defun flymake-compilation-is-running ()
1338     (and (boundp 'compilation-in-progress)     (and (boundp 'compilation-in-progress)
1339          compilation-in-progress)          compilation-in-progress))
 )  
1340    
1341  (defun flymake-compile()  (defun flymake-compile ()
1342      "kill all flymake syntax checks, start compilation"      "Kill all flymake syntax checks, start compilation."
1343      (interactive)      (interactive)
1344      (flymake-stop-all-syntax-checks)      (flymake-stop-all-syntax-checks)
1345      (call-interactively 'compile)      (call-interactively 'compile))
 )  
1346    
1347  (defvar flymake-is-running nil  (defvar flymake-is-running nil
1348    "t if flymake syntax check process is running for the current buffer"    "If t, flymake syntax check process is running for the current buffer")
1349  )  
1350  (make-variable-buffer-local 'flymake-is-running)  (make-variable-buffer-local 'flymake-is-running)
1351  (defun flymake-get-buffer-is-running(buffer)  
1352      (flymake-get-buffer-var buffer 'flymake-is-running)  (defun flymake-get-buffer-is-running (buffer)
1353  )      (flymake-get-buffer-var buffer 'flymake-is-running))
1354  (defun flymake-set-buffer-is-running(buffer is-running)  
1355      (flymake-set-buffer-var buffer 'flymake-is-running is-running)  (defun flymake-set-buffer-is-running (buffer is-running)
1356  )      (flymake-set-buffer-var buffer 'flymake-is-running is-running))
1357    
1358  (defvar flymake-timer nil  (defvar flymake-timer nil
1359      "timer for starting syntax checks"    "Timer for starting syntax check.")
1360  )  
1361  (make-variable-buffer-local 'flymake-timer)  (make-variable-buffer-local 'flymake-timer)
1362  (defun flymake-get-buffer-timer(buffer)  
1363      (flymake-get-buffer-var buffer 'flymake-timer)  (defun flymake-get-buffer-timer (buffer)
1364  )      (flymake-get-buffer-var buffer 'flymake-timer))
1365  (defun flymake-set-buffer-timer(buffer timer)  
1366      (flymake-set-buffer-var buffer 'flymake-timer timer)  (defun flymake-set-buffer-timer (buffer timer)
1367  )      (flymake-set-buffer-var buffer 'flymake-timer timer))
1368    
1369  (defvar flymake-last-change-time nil  (defvar flymake-last-change-time nil
1370      "time of last buffer change"    "Time of last buffer change.")
1371  )  
1372  (make-variable-buffer-local 'flymake-last-change-time)  (make-variable-buffer-local 'flymake-last-change-time)
1373  (defun flymake-get-buffer-last-change-time(buffer)  
1374      (flymake-get-buffer-var buffer 'flymake-last-change-time)  (defun flymake-get-buffer-last-change-time (buffer)
1375  )      (flymake-get-buffer-var buffer 'flymake-last-change-time))
1376  (defun flymake-set-buffer-last-change-time(buffer change-time)  
1377      (flymake-set-buffer-var buffer 'flymake-last-change-time change-time)  (defun flymake-set-buffer-last-change-time (buffer change-time)
1378  )      (flymake-set-buffer-var buffer 'flymake-last-change-time change-time))
1379    
1380  (defvar flymake-check-start-time nil  (defvar flymake-check-start-time nil
1381      "time at which syntax check was started")    "Time at which syntax check was started.")
1382    
1383  (make-variable-buffer-local 'flymake-check-start-time)  (make-variable-buffer-local 'flymake-check-start-time)
1384  (defun flymake-get-buffer-check-start-time(buffer)  
1385      (flymake-get-buffer-var buffer 'flymake-check-start-time)  (defun flymake-get-buffer-check-start-time (buffer)
1386  )      (flymake-get-buffer-var buffer 'flymake-check-start-time))
1387  (defun flymake-set-buffer-check-start-time(buffer check-start-time)  
1388      (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time)  (defun flymake-set-buffer-check-start-time (buffer check-start-time)
1389  )      (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time))
1390    
1391  (defvar flymake-check-was-interrupted nil  (defvar flymake-check-was-interrupted nil
1392      "t if syntax check was killed by flymake-compile"    "t if syntax check was killed by flymake-compile")
1393  )  
1394  (make-variable-buffer-local 'flymake-check-was-interrupted)  (make-variable-buffer-local 'flymake-check-was-interrupted)
1395  (defun flymake-get-buffer-check-was-interrupted(buffer)  
1396      (flymake-get-buffer-var buffer 'flymake-check-was-interrupted)  (defun flymake-get-buffer-check-was-interrupted (buffer)
1397  )      (flymake-get-buffer-var buffer 'flymake-check-was-interrupted))
1398  (defun flymake-set-buffer-check-was-interrupted(buffer interrupted)  
1399      (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted)  (defun flymake-set-buffer-check-was-interrupted (buffer interrupted)
1400  )      (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted))
1401    
1402  (defcustom flymake-no-changes-timeout 0.5  (defcustom flymake-no-changes-timeout 0.5
1403      "time to wait after last change before starting compilation"      "Time to wait after last change before starting compilation."
1404      :group 'flymake      :group 'flymake
1405      :type 'number      :type 'number)
 )  
1406    
1407  (defun flymake-on-timer-event(buffer)  (defun flymake-on-timer-event (buffer)
1408      "start a syntax check for buffer if necessary"      "Start a syntax check for buffer BUFFER if necessary."
1409      ;+(flymake-log 3 "timer: running=%s, time=%s, cur-time=%s" (flymake-get-buffer-is-running buffer) (flymake-get-buffer-last-change-time buffer) (flymake-float-time))      ;+(flymake-log 3 "timer: running=%s, time=%s, cur-time=%s" (flymake-get-buffer-is-running buffer) (flymake-get-buffer-last-change-time buffer) (flymake-float-time))
   
1410       (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer)))       (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer)))
1411          (save-excursion          (save-excursion
1412              (set-buffer buffer)              (set-buffer buffer)
# Line 1715  Whenether a buffer for master-file-name Line 1414  Whenether a buffer for master-file-name
1414                         (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer))))                         (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer))))
1415                  (flymake-set-buffer-last-change-time buffer nil)                  (flymake-set-buffer-last-change-time buffer nil)
1416                  (flymake-log 3 "starting syntax check as more than 1 second passed since last change")                  (flymake-log 3 "starting syntax check as more than 1 second passed since last change")
1417                  (flymake-start-syntax-check buffer)                  (flymake-start-syntax-check buffer)))))
             )  
         )  
     )  
 )  
1418    
1419  (defun flymake-start-syntax-check-for-current-buffer()  (defun flymake-start-syntax-check-for-current-buffer ()
1420      "run flymake-start-syntax-check for current buffer if it isn't already running"      "Run 'flymake-start-syntax-check' for current buffer if it isn't already running."
1421      (interactive)      (interactive)
1422      (flymake-start-syntax-check (current-buffer))      (flymake-start-syntax-check (current-buffer)))
 )  
1423    
1424  (defun flymake-current-line-no()  (defun flymake-current-line-no ()
1425      "return number of current line in current buffer"      "Return number of current line in current buffer."
1426      (interactive)      (interactive)
1427      (let ((beg  (point-min))      (let ((beg  (point-min))
1428            (end  (if (= (point) (point-max)) (point) (1+ (point)))))            (end  (if (= (point) (point-max)) (point) (1+ (point)))))
1429          (count-lines beg end)          (count-lines beg end)))
     )  
 )  
1430    
1431  (defun flymake-get-line-count(buffer)  (defun flymake-get-line-count (buffer)
1432      "return number of lines in buffer"      "Return number of lines in buffer BUFFER."
1433      (unless (bufferp buffer)      (unless (bufferp buffer)
1434          (error "invalid buffer")          (error "Invalid buffer"))
     )  
1435      (save-excursion      (save-excursion
1436          (set-buffer buffer)          (set-buffer buffer)
1437          (count-lines (point-min) (point-max))          (count-lines (point-min) (point-max))))
     )  
 )  
1438    
1439  (defun flymake-count-lines(buffer)  (defun flymake-count-lines (buffer)
1440      "return number of lines in buffer"      "Return number of lines in buffer BUFFER."
1441      (save-excursion      (save-excursion
1442          (set-buffer buffer)          (set-buffer buffer)
1443          (count-lines (point-min) (point-max))          (count-lines (point-min) (point-max))))
     )  
 )  
1444    
1445  (defun flymake-get-point-pixel-pos()  (defun flymake-get-point-pixel-pos ()
1446      "return point position in pixels: (x, y)"      "Return point position in pixels: (x, y)."
1447      (let ((mouse-pos  (mouse-position))      (let ((mouse-pos  (mouse-position))
1448            (pixel-pos  nil)            (pixel-pos  nil)
1449            (ret        nil))            (ret        nil))
# Line 1765  Whenether a buffer for master-file-name Line 1452  Whenether a buffer for master-file-name
1452                  (set-mouse-position (flymake-selected-frame) (current-column) (flymake-current-row))                  (set-mouse-position (flymake-selected-frame) (current-column) (flymake-current-row))
1453                  (setq pixel-pos (mouse-pixel-position))                  (setq pixel-pos (mouse-pixel-position))
1454                  (set-mouse-position (car mouse-pos) (car (cdr mouse-pos)) (cdr (cdr mouse-pos)))                  (set-mouse-position (car mouse-pos) (car (cdr mouse-pos)) (cdr (cdr mouse-pos)))
1455                  (setq ret (list (car (cdr pixel-pos)) (cdr (cdr pixel-pos))))                  (setq ret (list (car (cdr pixel-pos)) (cdr (cdr pixel-pos)))))
              )  
         ;else  
1456              (progn              (progn
1457                  (setq ret '(0 0))                  (setq ret '(0 0))))
             )  
         )  
1458          (flymake-log 3 "mouse pos is %s" ret)          (flymake-log 3 "mouse pos is %s" ret)
1459          ret          ret))
     )  
 )  
1460    
1461  (defun flymake-display-err-menu-for-current-line()  (defun flymake-display-err-menu-for-current-line ()
1462     "Display a menu with errors/warnings for current line if it has errors and/or warnings"     "Display a menu with errors/warnings for current line if it has errors and/or warnings."
1463     (interactive)     (interactive)
1464     (let* ((line-no             (flymake-current-line-no))     (let* ((line-no             (flymake-current-line-no))
1465            (line-err-info-list  (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no)))            (line-err-info-list  (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no)))
# Line 1792  Whenether a buffer for master-file-name Line 1473  Whenether a buffer for master-file-name
1473                 (setq choice (flymake-popup-menu menu-pos menu-data))                 (setq choice (flymake-popup-menu menu-pos menu-data))
1474                             (flymake-log 3 "choice=%s" choice)                             (flymake-log 3 "choice=%s" choice)
1475                 (when choice                 (when choice
1476                                 (eval choice)                                 (eval choice)))
1477                         )             (flymake-log 1 "no errors for line %d" line-no))))
             )  
        ;else  
            (flymake-log 1 "no errors for line %d" line-no)  
        )  
    )  
 )  
1478    
1479  (defun flymake-make-err-menu-data(line-no line-err-info-list)  (defun flymake-make-err-menu-data (line-no line-err-info-list)
1480     "Make a (menu-title (item-title item-action)*) list with errors/warnings from line-err-info"     "Make a (menu-title (item-title item-action)*) list with errors/warnings from line-err-info."
1481     (let* ((menu-items  nil))     (let* ((menu-items  nil))
1482         (when line-err-info-list         (when line-err-info-list
1483             (let* ((count           (length line-err-info-list))             (let* ((count           (length line-err-info-list))
# Line 1813  Whenether a buffer for master-file-name Line 1488  Whenether a buffer for master-file-name
1488                             (full-file  (flymake-ler-get-full-file (nth (1- count) line-err-info-list)))                             (full-file  (flymake-ler-get-full-file (nth (1- count) line-err-info-list)))
1489                             (line       (flymake-ler-get-line (nth (1- count) line-err-info-list))))                             (line       (flymake-ler-get-line (nth (1- count) line-err-info-list))))
1490                          (if file                          (if file
1491                              (setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")"))                              (setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")")))
                         )  
1492                          (setq menu-items (cons (list menu-item-text                          (setq menu-items (cons (list menu-item-text
1493                                                       (if file (list 'flymake-goto-file-and-line full-file line) nil))                                                       (if file (list 'flymake-goto-file-and-line full-file line) nil))
1494                                                 menu-items))                                                 menu-items)))
1495                      )                      (setq count (1- count)))
1496                      (setq count (1- count))                 (flymake-log 3 "created menu-items with %d item(s)" (length menu-items))))
                )  
                (flymake-log 3 "created menu-items with %d item(s)" (length menu-items))  
            )  
        )  
1497         (if menu-items         (if menu-items
1498             (let* ((menu-title  (format "Line %d: %d error(s), %d warning(s)" line-no             (let* ((menu-title  (format "Line %d: %d error(s), %d warning(s)" line-no
1499                                        (flymake-get-line-err-count line-err-info-list "e")                                        (flymake-get-line-err-count line-err-info-list "e")
1500                                        (flymake-get-line-err-count line-err-info-list "w"))))                                        (flymake-get-line-err-count line-err-info-list "w"))))
1501                 (list menu-title menu-items)                 (list menu-title menu-items))
1502             )             nil)))
        ;else  
            nil  
        )  
    )  
 )  
1503    
1504  (defun flymake-goto-file-and-line(file line)  (defun flymake-goto-file-and-line (file line)
1505      "try to get buffer for file and goto line line in it"      "Try to get buffer for file and goto line line in it"
1506      (if (not (file-exists-p file))      (if (not (file-exists-p file))
1507          (flymake-log 1 "file %s does not exists" file)          (flymake-log 1 "file %s does not exists" file)
     ;else  
1508          (progn          (progn
1509              (find-file file)              (find-file file)
1510              (goto-line line)              (goto-line line))))
         )  
     )  
 )  
 ;; flymake minor mode declarations  
1511    
1512    ;; flymake minor mode declarations
1513  (defvar flymake-mode nil)  (defvar flymake-mode nil)
1514    
1515  (make-variable-buffer-local 'flymake-mode)  (make-variable-buffer-local 'flymake-mode)
1516    
1517  (defvar flymake-mode-line nil  (defvar flymake-mode-line nil
1518      ""    "")
1519  )  
1520  (make-variable-buffer-local 'flymake-mode-line)  (make-variable-buffer-local 'flymake-mode-line)
1521  (defun flymake-get-buffer-mode-line(buffer)  
1522      (flymake-get-buffer-var buffer 'flymake-mode-line)  (defun flymake-get-buffer-mode-line (buffer)
1523  )      (flymake-get-buffer-var buffer 'flymake-mode-line))
1524  (defun flymake-set-buffer-mode-line(buffer mode-line-string)  
1525      (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string)  (defun flymake-set-buffer-mode-line (buffer mode-line-string)
1526  )      (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string))
1527    
1528  (defvar flymake-mode-line-e-w nil)  (defvar flymake-mode-line-e-w nil)
1529    
1530  (make-variable-buffer-local 'flymake-mode-line-e-w)  (make-variable-buffer-local 'flymake-mode-line-e-w)
1531  (defun flymake-get-buffer-mode-line-e-w(buffer)  
1532      (flymake-get-buffer-var buffer 'flymake-mode-line-e-w)  (defun flymake-get-buffer-mode-line-e-w (buffer)
1533  )      (flymake-get-buffer-var buffer 'flymake-mode-line-e-w))
1534  (defun flymake-set-buffer-mode-line-e-w(buffer e-w)  
1535      (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w)  (defun flymake-set-buffer-mode-line-e-w (buffer e-w)
1536  )      (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w))
1537    
1538  (defvar flymake-mode-line-status nil)  (defvar flymake-mode-line-status nil)
1539    
1540  (make-variable-buffer-local 'flymake-mode-line-status)  (make-variable-buffer-local 'flymake-mode-line-status)
 (defun flymake-get-buffer-mode-line-status(buffer)  
     (flymake-get-buffer-var buffer 'flymake-mode-line-status)  
 )  
 (defun flymake-set-buffer-mode-line-status(buffer status)  
     (flymake-set-buffer-var buffer 'flymake-mode-line-status status)  
 )  
1541    
1542  (defun flymake-report-status(buffer e-w &optional status)  (defun flymake-get-buffer-mode-line-status (buffer)
1543      "show status in the mode line"      (flymake-get-buffer-var buffer 'flymake-mode-line-status))
1544    
1545    (defun flymake-set-buffer-mode-line-status (buffer status)
1546        (flymake-set-buffer-var buffer 'flymake-mode-line-status status))
1547    
1548    (defun flymake-report-status (buffer e-w &optional status)
1549        "Show status in mode line."
1550      (when (bufferp buffer)      (when (bufferp buffer)
1551          (save-excursion          (save-excursion
1552              (set-buffer buffer)              (set-buffer buffer)
# Line 1890  Whenether a buffer for master-file-name Line 1554  Whenether a buffer for master-file-name
1554                  (flymake-set-buffer-mode-line-e-w buffer e-w)                  (flymake-set-buffer-mode-line-e-w buffer e-w)
1555              )              )
1556              (when status              (when status
1557                  (flymake-set-buffer-mode-line-status buffer status)                  (flymake-set-buffer-mode-line-status buffer status))
             )  
1558              (let* ((mode-line " Flymake"))              (let* ((mode-line " Flymake"))
1559                  (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0)                  (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0)
1560                      (setq mode-line (concat mode-line ":"  (flymake-get-buffer-mode-line-e-w buffer)))                      (setq mode-line (concat mode-line ":"  (flymake-get-buffer-mode-line-e-w buffer))))
                 )  
1561                  (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer)))                  (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer)))
1562                  (flymake-set-buffer-mode-line buffer mode-line)                  (flymake-set-buffer-mode-line buffer mode-line)
1563                  (force-mode-line-update)                  (force-mode-line-update)))))
             )  
         )  
     )  
 )  
1564    
1565  (defun flymake-display-warning(warning)  (defun flymake-display-warning (warning)
1566      "display a warning to the user"      "Display a warning to user."
1567      (message-box warning)      (message-box warning))
 )  
1568    
1569  (defcustom flymake-gui-warnings-enabled t  (defcustom flymake-gui-warnings-enabled t
1570      "enables/disables gui warnings"      "Enables/disables gui warnings."
1571          :group 'flymake          :group 'flymake
1572          :type 'boolean          :type 'boolean)
 )  
1573    
1574  (defun flymake-report-fatal-status(buffer status warning)  (defun flymake-report-fatal-status (buffer status warning)
1575      "display a warning and switch flymake mode OFF"      "Display a warning and switch flymake mode off."
1576          (when flymake-gui-warnings-enabled          (when flymake-gui-warnings-enabled
1577          (flymake-display-warning (format "Flymake: %s. Flymake will be switched OFF" warning))          (flymake-display-warning (format "Flymake: %s. Flymake will be switched OFF" warning))
1578          )          )
# Line 1924  Whenether a buffer for master-file-name Line 1580  Whenether a buffer for master-file-name
1580          (set-buffer buffer)          (set-buffer buffer)
1581          (flymake-mode 0)          (flymake-mode 0)
1582          (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s"          (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s"
1583                       (buffer-name buffer) status warning)                       (buffer-name buffer) status warning)))
     )  
 )  
1584    
1585  (defun flymake-mode(&optional arg)  (defun flymake-mode (&optional arg)
1586      "toggle flymake-mode"      "Toggle flymake mode on/off."
1587      (interactive)      (interactive)
1588      (let ((old-flymake-mode flymake-mode)      (let ((old-flymake-mode flymake-mode)
1589                    (turn-on nil))                    (turn-on nil))
# Line 1938  Whenether a buffer for master-file-name Line 1592  Whenether a buffer for master-file-name
1592              (if (null arg)              (if (null arg)
1593                  (not flymake-mode)                  (not flymake-mode)
1594              ;else              ;else
1595                  (> (prefix-numeric-value arg) 0))                  (> (prefix-numeric-value arg) 0)))
         )  
1596    
1597          (if turn-on          (if turn-on
1598              (if (flymake-can-syntax-check-file (buffer-file-name))              (if (flymake-can-syntax-check-file (buffer-file-name))
1599                  (flymake-mode-on)                  (flymake-mode-on)
1600              ;else                  (flymake-log 2 "flymake cannot check syntax in buffer %s" (buffer-name)))
1601                  (flymake-log 2 "flymake cannot check syntax in buffer %s" (buffer-name))              (flymake-mode-off))
1602              )          (force-mode-line-update)))
1603          ;else  
1604              (flymake-mode-off)  (defcustom flymake-start-syntax-check-on-find-file t
1605          )      "Start syntax check on find file."
1606          (force-mode-line-update)      :group 'flymake
1607      )      :type 'boolean)
 )  
1608    
1609  ;;;###autoload  ;;;###autoload
1610  (unless (assq 'flymake-mode minor-mode-alist)  (unless (assq 'flymake-mode minor-mode-alist)
1611      (setq minor-mode-alist (cons '(flymake-mode flymake-mode-line) minor-mode-alist))      (setq minor-mode-alist (cons '(flymake-mode flymake-mode-line) minor-mode-alist)))
 )  
1612    
1613  ;;;###autoload  ;;;###autoload
1614  (defun flymake-mode-on()  (defun flymake-mode-on ()
1615      "turn flymake mode on"      "Turn flymake mode on."
1616      (when (not flymake-mode)      (when (not flymake-mode)
1617          (make-local-variable 'after-change-functions)          (make-local-variable 'after-change-functions)
1618          (setq after-change-functions (cons 'flymake-after-change-function after-change-functions))          (setq after-change-functions (cons 'flymake-after-change-function after-change-functions))
# Line 1976  Whenether a buffer for master-file-name Line 1627  Whenether a buffer for master-file-name
1627          (setq flymake-mode t)          (setq flymake-mode t)
1628          (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer)))          (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer)))
1629          (when flymake-start-syntax-check-on-find-file          (when flymake-start-syntax-check-on-find-file
1630              (flymake-start-syntax-check-for-current-buffer) ; will be started by on-load hook              (flymake-start-syntax-check-for-current-buffer)))) ; will be started by on-load hook
         )  
     )  
 )  
1631    
1632  ;;;###autoload  ;;;###autoload
1633  (defun flymake-mode-off()  (defun flymake-mode-off ()
1634      "turn flymake mode off"      "Turn flymake mode off."
1635      (when flymake-mode      (when flymake-mode
1636          (setq after-change-functions (delq 'flymake-after-change-function  after-change-functions))          (setq after-change-functions (delq 'flymake-after-change-function  after-change-functions))
1637          (remove-hook 'after-save-hook (function flymake-after-save-hook) t)          (remove-hook 'after-save-hook (function flymake-after-save-hook) t)
# Line 1994  Whenether a buffer for master-file-name Line 1642  Whenether a buffer for master-file-name
1642    
1643          (when (flymake-get-buffer-timer (current-buffer))          (when (flymake-get-buffer-timer (current-buffer))
1644              (cancel-timer (flymake-get-buffer-timer (current-buffer)))              (cancel-timer (flymake-get-buffer-timer (current-buffer)))
1645              (flymake-set-buffer-timer (current-buffer) nil)              (flymake-set-buffer-timer (current-buffer) nil))
         )  
1646    
1647          (flymake-set-buffer-is-running (current-buffer) nil)          (flymake-set-buffer-is-running (current-buffer) nil)
1648    
1649          (setq flymake-mode nil)          (setq flymake-mode nil)
1650          (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer)))          (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer)))))
     )  
 )  
1651    
1652  (defcustom flymake-start-syntax-check-on-newline t  (defcustom flymake-start-syntax-check-on-newline t
1653      "start syntax check if newline char was added/removed from the buffer"      "Start syntax check if newline char was added/removed from the buffer."
1654      :group 'flymake      :group 'flymake
1655      :type 'boolean      :type 'boolean)
 )  
1656    
1657  (defun flymake-after-change-function(start stop len)  (defun flymake-after-change-function (start stop len)
1658      "Start syntax check for current buffer if it isn't already running"      "Start syntax check for current buffer if it isn't already running"
1659      ;+(flymake-log 0 "setting change time to %s" (flymake-float-time))      ;+(flymake-log 0 "setting change time to %s" (flymake-float-time))
1660      (let((new-text (buffer-substring start stop)))      (let((new-text (buffer-substring start stop)))
1661          (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))          (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))
1662              (flymake-log 3 "starting syntax check as new-line has been seen")              (flymake-log 3 "starting syntax check as new-line has been seen")
1663              (flymake-start-syntax-check-for-current-buffer)              (flymake-start-syntax-check-for-current-buffer))
1664          )          (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time))))
         (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time))  
     )  
 )  
1665    
1666  (defun flymake-after-save-hook()  (defun flymake-after-save-hook ()
1667      (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved?      (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved?
1668          (progn          (progn
1669              (flymake-log 3 "starting syntax check as buffer was saved")              (flymake-log 3 "starting syntax check as buffer was saved")
1670              (flymake-start-syntax-check-for-current-buffer) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???)              (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???)
         )  
     )  
 )  
1671    
1672  (defun flymake-kill-buffer-hook()  (defun flymake-kill-buffer-hook ()
1673      (when (flymake-get-buffer-timer (current-buffer))      (when (flymake-get-buffer-timer (current-buffer))
1674          (cancel-timer (flymake-get-buffer-timer (current-buffer)))          (cancel-timer (flymake-get-buffer-timer (current-buffer)))
1675          (flymake-set-buffer-timer (current-buffer) nil)          (flymake-set-buffer-timer (current-buffer) nil)))
     )  
 )  
   
 (defcustom flymake-start-syntax-check-on-find-file t  
     "statr syntax check on find file"  
     :group 'flymake  
     :type 'boolean  
 )  
1676    
1677  (defun flymake-find-file-hook()  (defun flymake-find-file-hook ()
1678      ;+(when flymake-start-syntax-check-on-find-file      ;+(when flymake-start-syntax-check-on-find-file
1679      ;+    (flymake-log 3 "starting syntax check on file open")      ;+    (flymake-log 3 "starting syntax check on file open")
1680      ;+    (flymake-start-syntax-check-for-current-buffer)      ;+    (flymake-start-syntax-check-for-current-buffer)
# Line 2052  Whenether a buffer for master-file-name Line 1682  Whenether a buffer for master-file-name
1682      (when (and (not (local-variable-p 'flymake-mode (current-buffer)))      (when (and (not (local-variable-p 'flymake-mode (current-buffer)))
1683             (flymake-can-syntax-check-file (buffer-file-name (current-buffer))))             (flymake-can-syntax-check-file (buffer-file-name (current-buffer))))
1684          (flymake-mode)          (flymake-mode)
1685          (flymake-log 3 "automatically turned ON flymake mode")          (flymake-log 3 "automatically turned ON flymake mode")))
     )  
 )  
1686    
1687  (defun flymake-get-first-err-line-no(err-info-list)  (defun flymake-get-first-err-line-no (err-info-list)
1688      "return first line-no with error"      "Return first line with error."
1689      (when err-info-list      (when err-info-list
1690          (flymake-er-get-line (car err-info-list))          (flymake-er-get-line (car err-info-list))))
     )  
 )  
1691    
1692  (defun flymake-get-last-err-line-no(err-info-list)  (defun flymake-get-last-err-line-no (err-info-list)
1693      "return last line-no with error"      "Return last line with error."
1694      (when err-info-list      (when err-info-list
1695          (flymake-er-get-line (nth (1- (length err-info-list)) err-info-list))          (flymake-er-get-line (nth (1- (length err-info-list)) err-info-list))))
     )  
 )  
1696    
1697  (defun flymake-get-next-err-line-no(err-info-list line-no)  (defun flymake-get-next-err-line-no (err-info-list line-no)
1698      "return next line with erroe"      "Return next line with error."
1699      (when err-info-list      (when err-info-list
1700          (let* ((count  (length err-info-list))          (let* ((count  (length err-info-list))
1701                 (idx    0))                 (idx    0))
1702              (while (and (< idx count) (>= line-no (flymake-er-get-line (nth idx err-info-list))))              (while (and (< idx count) (>= line-no (flymake-er-get-line (nth idx err-info-list))))
1703                  (setq idx (1+ idx))                  (setq idx (1+ idx)))
             )  
1704              (if (< idx count)              (if (< idx count)
1705                  (flymake-er-get-line (nth idx err-info-list))                  (flymake-er-get-line (nth idx err-info-list))))))
             )  
         )  
     )  
 )  
1706    
1707  (defun flymake-get-prev-err-line-no(err-info-list line-no)  (defun flymake-get-prev-err-line-no (err-info-list line-no)
1708      "return prev line with error"      "Return prev line with error."
1709      (when err-info-list      (when err-info-list
1710          (let* ((count (length err-info-list)))          (let* ((count (length err-info-list)))
1711              (while (and (> count 0) (<= line-no (flymake-er-get-line (nth (1- count) err-info-list))))              (while (and (> count 0) (<= line-no (flymake-er-get-line (nth (1- count) err-info-list))))
1712                  (setq count (1- count))                  (setq count (1- count)))
             )  
1713              (if (> count 0)              (if (> count 0)
1714                  (flymake-er-get-line (nth (1- count) err-info-list))                  (flymake-er-get-line (nth (1- count) err-info-list))))))
             )  
         )  
     )  
 )  
1715    
1716  (defun flymake-skip-whitespace()  (defun flymake-skip-whitespace ()
1717      "move forward until nonwhitespace is reached"      "Move forward until non-whitespace is reached."
1718      (while (looking-at "[ \t]")      (while (looking-at "[ \t]")
1719          (forward-char)          (forward-char)))
     )  
 )  
1720    
1721  (defun flymake-goto-line(line-no)  (defun flymake-goto-line (line-no)
1722      "goto-line, then skip whitespace"      "goto-line, then skip whitespace"
1723      (goto-line line-no)      (goto-line line-no)
1724      (flymake-skip-whitespace)      (flymake-skip-whitespace))
 )  
1725    
1726  (defun flymake-goto-next-error()  (defun flymake-goto-next-error ()
1727      "go to next error in err ring"      "go to next error in err ring"
1728      (interactive)      (interactive)
1729      (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))      (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))
1730          (when (not line-no)          (when (not line-no)
1731              (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer))))              (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer))))
1732              (flymake-log 1 "passed end of file")              (flymake-log 1 "passed end of file"))
         )  
1733          (if line-no          (if line-no
1734              (flymake-goto-line line-no)              (flymake-goto-line line-no)
1735          ;else              (flymake-log 1 "no errors in current buffer"))))
             (flymake-log 1 "no errors in current buffer")  
         )  
     )  
 )  
1736    
1737  (defun flymake-goto-prev-error()  (defun flymake-goto-prev-error ()
1738      "go to prev error in err ring"      "go to prev error in err ring"
1739      (interactive)      (interactive)
1740      (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))      (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))
1741          (when (not line-no)          (when (not line-no)
1742              (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer))))              (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer))))
1743              (flymake-log 1 "passed beginning of file")              (flymake-log 1 "passed beginning of file"))
         )  
1744          (if line-no          (if line-no
1745              (flymake-goto-line line-no)              (flymake-goto-line line-no)
1746          ;else              (flymake-log 1 "no errors in current buffer"))))
             (flymake-log 1 "no errors in current buffer")  
         )  
     )  
 )  
1747    
1748  (defun flymake-patch-err-text(string)  (defun flymake-patch-err-text (string)
1749      (if (string-match "^[\n\t :0-9]*\\(.*\\)$" string)      (if (string-match "^[\n\t :0-9]*\\(.*\\)$" string)
1750          (match-string 1 string)          (match-string 1 string)
1751      ;else          string))
         string  
     )  
 )  
1752    
1753  ;;;; general init-cleanup and helper routines  ;;;; general init-cleanup and helper routines
1754    (defun flymake-create-temp-inplace (file-name prefix)
 (defun flymake-create-temp-inplace(file-name prefix)  
1755      (unless (stringp file-name)      (unless (stringp file-name)
1756          (error "invalid file-name")          (error "Invalid file-name"))
     )  
1757      (or prefix      (or prefix
1758          (setq prefix "flymake")          (setq prefix "flymake"))
     )  
1759      (let* ((temp-name   (concat (file-name-sans-extension file-name)      (let* ((temp-name   (concat (file-name-sans-extension file-name)
1760                                  "_" prefix                                  "_" prefix
1761                                  (and (file-name-extension file-name)                                  (and (file-name-extension file-name)
1762                                       (concat "." (file-name-extension file-name))))))                                       (concat "." (file-name-extension file-name))))))
1763          (flymake-log 3 "create-temp-inplace: file=%s temp=%s" file-name temp-name)          (flymake-log 3 "create-temp-inplace: file=%s temp=%s" file-name temp-name)
1764          temp-name          temp-name))
     )  
 )  
1765    
1766  (defun flymake-create-temp-with-folder-structure(file-name prefix)  (defun flymake-create-temp-with-folder-structure (file-name prefix)
1767      (unless (stringp file-name)      (unless (stringp file-name)
1768          (error "invalid file-name")          (error "Invalid file-name"))
     )  
1769    
1770      (let* ((dir       (file-name-directory file-name))      (let* ((dir       (file-name-directory file-name))
1771                     (slash-pos (string-match "/" dir))                     (slash-pos (string-match "/" dir))
1772                     (temp-dir  (concat (flymake-ensure-ends-with-slash (flymake-get-temp-dir)) (substring dir (1+ slash-pos)))))                     (temp-dir  (concat (flymake-ensure-ends-with-slash (flymake-get-temp-dir)) (substring dir (1+ slash-pos)))))
1773    
1774              (file-truename (concat (flymake-ensure-ends-with-slash temp-dir)              (file-truename (concat (flymake-ensure-ends-with-slash temp-dir)
1775                                  (file-name-nondirectory file-name)))                                  (file-name-nondirectory file-name)))))
     )  
 )  
1776    
1777  (defun flymake-strrchr(str ch)  (defun flymake-strrchr (str ch)
1778      (let* ((count  (length str))      (let* ((count  (length str))
1779             (pos    nil))             (pos    nil))
1780          (while (and (not pos) (> count 0))          (while (and (not pos) (> count 0))
1781              (if (= ch (elt str (1- count)))              (if (= ch (elt str (1- count)))
1782                  (setq pos (1- count))                  (setq pos (1- count)))
1783              )              (setq count (1- count)))
1784              (setq count (1- count))          pos))
         )  
         pos  
     )  
 )  
1785    
1786  (defun flymake-delete-temp-directory(dir-name)  (defun flymake-delete-temp-directory (dir-name)
1787      "attempt to delete temp dir created by flymake-create-temp-with-folder-structure, do not fail on error"      "attempt to delete temp dir created by flymake-create-temp-with-folder-structure, do not fail on error."
1788      (let* ((temp-dir    (flymake-get-temp-dir))      (let* ((temp-dir    (flymake-get-temp-dir))
1789             (suffix      (substring dir-name (1+ (length temp-dir))))             (suffix      (substring dir-name (1+ (length temp-dir))))
1790             (slash-pos   nil))             (slash-pos   nil))
# Line 2209  Whenether a buffer for master-file-name Line 1795  Whenether a buffer for master-file-name
1795              (setq slash-pos (flymake-strrchr suffix (string-to-char "/")))              (setq slash-pos (flymake-strrchr suffix (string-to-char "/")))
1796              (if slash-pos              (if slash-pos
1797                  (setq suffix (substring suffix 0 slash-pos))                  (setq suffix (substring suffix 0 slash-pos))
1798              ;else                  (setq suffix "")))))
                 (setq suffix "")  
             )  
         )  
     )  
 )  
1799    
1800  (defun flymake-init-create-temp-buffer-copy(buffer create-temp-f)  (defun flymake-init-create-temp-buffer-copy (buffer create-temp-f)
1801      "make a temporary copy of the current buffer, save its name in buffer data and return the name"      "Make a temporary copy of the current buffer, save its name in buffer data and return the name."
1802      (let*  ((source-file-name       (buffer-file-name buffer))      (let*  ((source-file-name       (buffer-file-name buffer))
1803              (temp-source-file-name  (funcall create-temp-f source-file-name "flymake")))              (temp-source-file-name  (funcall create-temp-f source-file-name "flymake")))
1804    
1805          (flymake-save-buffer-in-file buffer temp-source-file-name)          (flymake-save-buffer-in-file buffer temp-source-file-name)
1806          (flymake-set-buffer-value buffer "temp-source-file-name" temp-source-file-name)          (flymake-set-buffer-value buffer "temp-source-file-name" temp-source-file-name)
1807            temp-source-file-name))
1808    
1809          temp-source-file-name  (defun flymake-simple-cleanup (buffer)
1810      )      "Do cleanup after 'flymake-init-create-temp-buffer-copy'.
1811  )  Delete temp file."
   
 (defun flymake-simple-cleanup(buffer)  
     "cleanup after flymake-init-create-temp-buffer-copy -- delete temp file"  
1812      (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))      (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
1813          (flymake-safe-delete-file temp-source-file-name)          (flymake-safe-delete-file temp-source-file-name)
1814          (flymake-set-buffer-last-change-time buffer nil)          (flymake-set-buffer-last-change-time buffer nil)))
     )  
 )  
1815    
1816  (defun flymake-get-real-file-name(buffer file-name-from-err-msg)  (defun flymake-get-real-file-name (buffer file-name-from-err-msg)
1817      "Translate file name from error message to `real' file name. Return full-name. Names are real, not patched"      "Translate file name from error message to `real' file name.
1818    Return full-name. Names are real, not patched."
1819      (let* ((real-name              nil)      (let* ((real-name              nil)
1820             (source-file-name       (buffer-file-name buffer))             (source-file-name       (buffer-file-name buffer))
1821             (master-file-name       (flymake-get-buffer-value buffer "master-file-name"))             (master-file-name       (flymake-get-buffer-value buffer "master-file-name"))
# Line 2252  Whenether a buffer for master-file-name Line 1830  Whenether a buffer for master-file-name
1830                                           (list temp-master-file-name  master-file-name))))                                           (list temp-master-file-name  master-file-name))))
1831    
1832          (when (equal 0 (length file-name-from-err-msg))          (when (equal 0 (length file-name-from-err-msg))
1833              (setq file-name-from-err-msg source-file-name)              (setq file-name-from-err-msg source-file-name))
         )  
1834    
1835          (setq real-name (flymake-get-full-patched-file-name file-name-from-err-msg base-dirs files))          (setq real-name (flymake-get-full-patched-file-name file-name-from-err-msg base-dirs files))
1836          ; if real-name is nil, than file name from err msg is none of the files we've patched          ; if real-name is nil, than file name from err msg is none of the files we've patched
1837          (if (not real-name)          (if (not real-name)
1838              (setq real-name (flymake-get-full-nonpatched-file-name file-name-from-err-msg base-dirs))              (setq real-name (flymake-get-full-nonpatched-file-name file-name-from-err-msg base-dirs)))
         )  
1839          (if (not real-name)          (if (not real-name)
1840              (setq real-name file-name-from-err-msg)              (setq real-name file-name-from-err-msg))
         )  
1841          (setq real-name (flymake-fix-path-name real-name))          (setq real-name (flymake-fix-path-name real-name))
1842          (flymake-log 3 "get-real-file-name: file-name=%s real-name=%s" file-name-from-err-msg real-name)          (flymake-log 3 "get-real-file-name: file-name=%s real-name=%s" file-name-from-err-msg real-name)
1843          real-name          real-name))
     )  
 )  
1844    
1845  (defun flymake-get-full-patched-file-name(file-name-from-err-msg base-dirs files)  (defun flymake-get-full-patched-file-name (file-name-from-err-msg base-dirs files)
1846      (let* ((base-dirs-count  (length base-dirs))      (let* ((base-dirs-count  (length base-dirs))
1847             (file-count       (length files))             (file-count       (length files))
1848             (real-name        nil))             (real-name        nil))
# Line 2284  Whenether a buffer for master-file-name Line 1857  Whenether a buffer for master-file-name
1857                      (when (and this-dir this-file (flymake-same-files                      (when (and this-dir this-file (flymake-same-files
1858                                                     (flymake-get-absolute-file-name-basedir file-name-from-err-msg this-dir)                                                     (flymake-get-absolute-file-name-basedir file-name-from-err-msg this-dir)
1859                                                     this-file))                                                     this-file))
1860                          (setq real-name this-real-name)                          (setq real-name this-real-name)))
1861                      )                  (setq file-count (1- file-count)))
1862                  )              (setq base-dirs-count (1- base-dirs-count)))
1863                  (setq file-count (1- file-count))          real-name))
             )  
             (setq base-dirs-count (1- base-dirs-count))  
         )  
         real-name  
     )  
 )  
1864    
1865  (defun flymake-get-full-nonpatched-file-name(file-name-from-err-msg base-dirs)  (defun flymake-get-full-nonpatched-file-name (file-name-from-err-msg base-dirs)
1866      (let* ((real-name  nil))      (let* ((real-name  nil))
1867          (if (file-name-absolute-p file-name-from-err-msg)          (if (file-name-absolute-p file-name-from-err-msg)
1868              (setq real-name file-name-from-err-msg)              (setq real-name file-name-from-err-msg)
         ;else  
1869              (let* ((base-dirs-count  (length base-dirs)))              (let* ((base-dirs-count  (length base-dirs)))
1870                  (while (and (not real-name) (> base-dirs-count 0))                  (while (and (not real-name) (> base-dirs-count 0))
1871                      (let* ((full-name (flymake-get-absolute-file-name-basedir file-name-from-err-msg                      (let* ((full-name (flymake-get-absolute-file-name-basedir file-name-from-err-msg
1872                                                                                (nth (1- base-dirs-count) base-dirs))))                                                                                (nth (1- base-dirs-count) base-dirs))))
1873                          (if (file-exists-p full-name)                          (if (file-exists-p full-name)
1874                              (setq real-name full-name)                              (setq real-name full-name))
1875                          )                          (setq base-dirs-count (1- base-dirs-count))))))
1876                          (setq base-dirs-count (1- base-dirs-count))          real-name))
                     )  
                 )  
             )  
         )  
         real-name  
     )  
 )  
1877    
1878  (defun flymake-get-absolute-file-name-basedir(file-name dir-name)  (defun flymake-get-absolute-file-name-basedir (file-name dir-name)
1879      (if (file-name-absolute-p file-name)      (if (file-name-absolute-p file-name)
1880          file-name          file-name
1881      ;else          (concat dir-name "/" file-name)))
         (concat dir-name "/" file-name)  
     )  
 )  
1882    
1883  (defun flymake-init-find-buildfile-dir(buffer source-file-name buildfile-name)  (defun flymake-init-find-buildfile-dir (buffer source-file-name buildfile-name)
1884      "find buildfile, store its dir in buffer data and return its dir, if found"      "Find buildfile, store its dir in buffer data and return its dir, if found."
1885      (let* ((buildfile-dir  (flymake-find-buildfile buildfile-name      (let* ((buildfile-dir  (flymake-find-buildfile buildfile-name
1886                                                     (file-name-directory source-file-name)                                                     (file-name-directory source-file-name)
1887                                                     flymake-buildfile-dirs)))                                                     flymake-buildfile-dirs)))
# Line 2334  Whenether a buffer for master-file-name Line 1890  Whenether a buffer for master-file-name
1890                  (flymake-log 1 "no buildfile (%s) for %s" buildfile-name source-file-name)                  (flymake-log 1 "no buildfile (%s) for %s" buildfile-name source-file-name)
1891                  (flymake-report-fatal-status buffer "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name))                  (flymake-report-fatal-status buffer "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name))
1892              )              )
         ;else  
1893              (progn              (progn
1894                  (flymake-set-buffer-value buffer "base-dir" buildfile-dir)                  (flymake-set-buffer-value buffer "base-dir" buildfile-dir)))
1895              )          buildfile-dir))
         )  
         buildfile-dir  
     )  
 )  
1896    
1897  (defun flymake-init-create-temp-source-and-master-buffer-copy(buffer get-incl-dirs-f create-temp-f master-file-masks include-regexp-list)  (defun flymake-init-create-temp-source-and-master-buffer-copy (buffer get-incl-dirs-f create-temp-f master-file-masks include-regexp-list)
1898      "find master file (or buffer), create it's copy along with a copy of the source file"      "Find master file (or buffer), create it's copy along with a copy of the source file."
1899      (let* ((source-file-name       (buffer-file-name buffer))      (let* ((source-file-name       (buffer-file-name buffer))
1900             (temp-source-file-name  (flymake-init-create-temp-buffer-copy buffer create-temp-f))             (temp-source-file-name  (flymake-init-create-temp-buffer-copy buffer create-temp-f))
1901             (master-file-name       nil)             (master-file-name       nil)
# Line 2359  Whenether a buffer for master-file-name Line 1910  Whenether a buffer for master-file-name
1910                  (flymake-log 1 "cannot find master file for %s" source-file-name)                  (flymake-log 1 "cannot find master file for %s" source-file-name)
1911                  (flymake-report-status buffer "!" "") ; NOMASTER                  (flymake-report-status buffer "!" "") ; NOMASTER
1912              )              )
         ;else  
1913              (progn              (progn
1914                  (setq master-file-name       (nth 0 master-and-temp-master))                  (setq master-file-name       (nth 0 master-and-temp-master))
1915                  (setq temp-master-file-name  (nth 1 master-and-temp-master))                  (setq temp-master-file-name  (nth 1 master-and-temp-master))
1916                  (flymake-set-buffer-value buffer "master-file-name"      master-file-name)                  (flymake-set-buffer-value buffer "master-file-name"      master-file-name)
1917                  (flymake-set-buffer-value buffer "temp-master-file-name" temp-master-file-name)                  (flymake-set-buffer-value buffer "temp-master-file-name" temp-master-file-name)
1918              )              ))
1919          )          temp-master-file-name))
         temp-master-file-name  
     )  
 )  
1920    
1921  (defun flymake-master-cleanup(buffer)  (defun flymake-master-cleanup (buffer)
1922      (flymake-simple-cleanup buffer)      (flymake-simple-cleanup buffer)
1923      (flymake-safe-delete-file (flymake-get-buffer-value buffer "temp-master-file-name"))      (flymake-safe-delete-file (flymake-get-buffer-value buffer "temp-master-file-name")))
 )  
1924    
1925  ;;;; make-specific init-cleanup routines  ;;;; make-specific init-cleanup routines
1926    (defun flymake-get-syntax-check-program-args (source-file-name base-dir use-relative-base-dir use-relative-source get-cmd-line-f)
1927  (defun flymake-get-syntax-check-program-args(source-file-name base-dir use-relative-base-dir use-relative-source get-cmd-line-f)      "Create a command line for syntax check using GET-CMD-LINE-F."
     "create a command line for the syntax check command, using get-cmd-line-f"  
1928      (let* ((my-base-dir  base-dir)      (let* ((my-base-dir  base-dir)
1929             (my-source    source-file-name))             (my-source    source-file-name))
1930    
1931          (when use-relative-base-dir          (when use-relative-base-dir
1932              (setq my-base-dir (flymake-build-relative-path (file-name-directory source-file-name) base-dir))              (setq my-base-dir (flymake-build-relative-path (file-name-directory source-file-name) base-dir)))
         )  
1933    
1934          (when use-relative-source          (when use-relative-source
1935              (setq my-source (concat (flymake-build-relative-path base-dir (file-name-directory source-file-name))              (setq my-source (concat (flymake-build-relative-path base-dir (file-name-directory source-file-name))
1936                                      (file-name-nondirectory source-file-name)))                                      (file-name-nondirectory source-file-name))))
1937          )          (funcall get-cmd-line-f my-source my-base-dir)))
1938    
1939          (funcall get-cmd-line-f my-source my-base-dir)  (defun flymake-get-make-cmdline (source base-dir)
     )  
 )  
   
 (defun flymake-get-make-cmdline(source base-dir)  
1940      (list "make"      (list "make"
1941            (list "-s"            (list "-s"
1942                          "-C"                          "-C"
1943                          base-dir                          base-dir
1944                          (concat "CHK_SOURCES=" source)                          (concat "CHK_SOURCES=" source)
1945                          "SYNTAX_CHECK_MODE=1"                          "SYNTAX_CHECK_MODE=1"
1946                          "check-syntax"))                          "check-syntax")))
 )  
1947    
1948  (defun flymake-get-ant-cmdline(source base-dir)  (defun flymake-get-ant-cmdline (source base-dir)
1949      (list "ant"      (list "ant"
1950            (list "-buildfile"            (list "-buildfile"
1951                  (concat base-dir "/" "build.xml")                  (concat base-dir "/" "build.xml")
1952                  (concat "-DCHK_SOURCES=" source)                  (concat "-DCHK_SOURCES=" source)
1953                  "check-syntax"))                  "check-syntax")))
 )  
1954    
1955  (defun flymake-simple-make-init-impl(buffer create-temp-f use-relative-base-dir use-relative-source build-file-name get-cmdline-f)  (defun flymake-simple-make-init-impl (buffer create-temp-f use-relative-base-dir use-relative-source build-file-name get-cmdline-f)
1956      "create syntax check command line for a directly checked source file, use create-temp-f for creating temp copy"      "Create syntax check command line for a directly checked source file.
1957      (let* ((args          nil)  Use CREATE-TEMP-F for creating temp copy."
1958        (let* ((args nil)
1959             (source-file-name   (buffer-file-name buffer))             (source-file-name   (buffer-file-name buffer))
1960             (buildfile-dir      (flymake-init-find-buildfile-dir buffer source-file-name build-file-name)))             (buildfile-dir      (flymake-init-find-buildfile-dir buffer source-file-name build-file-name)))
1961          (if buildfile-dir          (if buildfile-dir
1962              (let* ((temp-source-file-name  (flymake-init-create-temp-buffer-copy buffer create-temp-f)))              (let* ((temp-source-file-name  (flymake-init-create-temp-buffer-copy buffer create-temp-f)))
1963                  (setq args (flymake-get-syntax-check-program-args temp-source-file-name buildfile-dir                  (setq args (flymake-get-syntax-check-program-args temp-source-file-name buildfile-dir
1964                                                                 use-relative-base-dir use-relative-source                                                                 use-relative-base-dir use-relative-source
1965                                                                 get-cmdline-f))                                                                 get-cmdline-f))))
1966              )          args))
         )  
1967    
1968          args  (defun flymake-simple-make-init (buffer)
1969      )      (flymake-simple-make-init-impl buffer 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-cmdline))
 )  
   
 (defun flymake-simple-make-init(buffer)  
     (flymake-simple-make-init-impl buffer 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-cmdline)  
 )  
1970    
1971  (defun flymake-master-make-init(buffer get-incl-dirs-f master-file-masks include-regexp-list)  (defun flymake-master-make-init (buffer get-incl-dirs-f master-file-masks include-regexp-list)
1972      "create make command line for a source file checked via master file compilation"      "create make command line for a source file checked via master file compilation"
1973      (let* ((make-args          nil)      (let* ((make-args nil)
1974             (temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy             (temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
1975                                     buffer get-incl-dirs-f 'flymake-create-temp-inplace                                     buffer get-incl-dirs-f 'flymake-create-temp-inplace
1976                                     master-file-masks include-regexp-list)))                                     master-file-masks include-regexp-list)))
# Line 2445  Whenether a buffer for master-file-name Line 1978  Whenether a buffer for master-file-name
1978              (let* ((buildfile-dir (flymake-init-find-buildfile-dir buffer temp-master-file-name "Makefile")))              (let* ((buildfile-dir (flymake-init-find-buildfile-dir buffer temp-master-file-name "Makefile")))
1979                  (if  buildfile-dir                  (if  buildfile-dir
1980                                      (setq make-args (flymake-get-syntax-check-program-args                                      (setq make-args (flymake-get-syntax-check-program-args
1981                                                                           temp-master-file-name buildfile-dir nil nil 'flymake-get-make-cmdline))                                                                           temp-master-file-name buildfile-dir nil nil 'flymake-get-make-cmdline)))))
1982                  )                  make-args))
             )  
         )  
1983    
1984                  make-args  (defun flymake-find-make-buildfile (source-dir)
1985      )      (flymake-find-buildfile "Makefile" source-dir flymake-buildfile-dirs))
 )  
   
 (defun flymake-find-make-buildfile(source-dir)  
     (flymake-find-buildfile "Makefile" source-dir flymake-buildfile-dirs)  
 )  
1986    
1987  ;;;; .h/make specific  ;;;; .h/make specific
1988  (defun flymake-master-make-header-init(buffer)  (defun flymake-master-make-header-init (buffer)
1989      (flymake-master-make-init buffer      (flymake-master-make-init buffer
1990                                'flymake-get-include-dirs                                'flymake-get-include-dirs
1991                                '(".+\\.cpp$" ".+\\.c$")                                '(".+\\.cpp$" ".+\\.c$")
1992                                '("[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 1 2))                                '("[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 1 2)))
 )  
1993    
1994  ;;;; .java/make specific  ;;;; .java/make specific
1995  (defun flymake-simple-make-java-init(buffer)  (defun flymake-simple-make-java-init (buffer)
1996      (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "Makefile" 'flymake-get-make-cmdline)      (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "Makefile" 'flymake-get-make-cmdline))
 )  
1997    
1998  (defun flymake-simple-ant-java-init(buffer)  (defun flymake-simple-ant-java-init (buffer)
1999      (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "build.xml" 'flymake-get-ant-cmdline)      (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "build.xml" 'flymake-get-ant-cmdline))
 )  
2000    
2001  (defun flymake-simple-java-cleanup(buffer)  (defun flymake-simple-java-cleanup (buffer)
2002      "cleanup after flymake-simple-make-java-init -- delete temp file and dirs"      "cleanup after flymake-simple-make-java-init -- delete temp file and dirs"
2003      (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))      (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
2004          (flymake-safe-delete-file temp-source-file-name)          (flymake-safe-delete-file temp-source-file-name)
2005          (when temp-source-file-name          (when temp-source-file-name
2006              (flymake-delete-temp-directory (file-name-directory temp-source-file-name))              (flymake-delete-temp-directory (file-name-directory temp-source-file-name)))))
         )  
     )  
 )  
2007    
2008  ;;;; perl-specific init-cleanup routines  ;;;; perl-specific init-cleanup routines
2009    (defun flymake-perl-init (buffer)
 (defun flymake-perl-init(buffer)  
2010      (let* ((temp-file   (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))      (let* ((temp-file   (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))
2011                     (local-file  (concat (flymake-build-relative-path (file-name-directory (buffer-file-name (current-buffer)))                     (local-file  (concat (flymake-build-relative-path (file-name-directory (buffer-file-name (current-buffer)))
2012                                                                                                                           (file-name-directory temp-file))                                                                                                                           (file-name-directory temp-file))
2013                                                                  (file-name-nondirectory temp-file))))                                                                  (file-name-nondirectory temp-file))))
2014          (list "perl" (list "-wc " local-file))          (list "perl" (list "-wc " local-file))))
         )  
 )  
2015    
2016  ;;;; tex-specific init-cleanup routines  ;;;; tex-specific init-cleanup routines
2017    (defun flymake-get-tex-args (file-name)
 (defun flymake-get-tex-args(file-name)  
2018      ;(list "latex" (list "-c-style-errors" file-name))      ;(list "latex" (list "-c-style-errors" file-name))
2019      (list "texify" (list "--pdf" "--tex-option=-c-style-errors" file-name))      (list "texify" (list "--pdf" "--tex-option=-c-style-errors" file-name)))
 )  
2020    
2021  (defun flymake-simple-tex-init(buffer)  (defun flymake-simple-tex-init (buffer)
2022      (flymake-get-tex-args (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))      (flymake-get-tex-args (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace)))
 )  
2023    
2024  (defun flymake-master-tex-init(buffer)  (defun flymake-master-tex-init (buffer)
2025      (let* ((temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy      (let* ((temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
2026                                     buffer 'flymake-get-include-dirs-dot 'flymake-create-temp-inplace                                     buffer 'flymake-get-include-dirs-dot 'flymake-create-temp-inplace
2027                                     '(".+\\.tex$")                                     '(".+\\.tex$")
2028                                     '("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2))))                                     '("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2))))
2029          (when temp-master-file-name          (when temp-master-file-name
2030              (flymake-get-tex-args temp-master-file-name)              (flymake-get-tex-args temp-master-file-name))))
         )  
     )  
 )  
2031    
2032  (defun flymake-get-include-dirs-dot(base-dir)  (defun flymake-get-include-dirs-dot (base-dir)
2033      '(".")      '("."))
 )  
2034    
2035  ;;;; xml-specific init-cleanup routines  ;;;; xml-specific init-cleanup routines
   
2036  (defun flymake-xml-init(buffer)  (defun flymake-xml-init(buffer)
2037      (list "xml" (list "val" (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace)))      (list "xml" (list "val" (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))))
2038  )  
2039    (provide 'flymake)
2040    
2041  ;;; arch-tag: 8f0d6090-061d-4cac-8862-7c151c4a02dd  ;;; arch-tag: 8f0d6090-061d-4cac-8862-7c151c4a02dd
2042  ;;; flymake.el ends here  ;;; flymake.el ends here

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26