Check if make-local-hook exists.
[riece] / lisp / riece-filter.el
index 39edd49..42900e9 100644 (file)
@@ -19,8 +19,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Code:
 
@@ -41,9 +41,9 @@
             (format "riece-handle-default-%03d-message" base-number))))
     (if (and function
             (symbol-function function))
-       (riece-ignore-errors (symbol-name function)
-         (funcall function prefix number name
-                  (riece-decode-coding-string string))))))
+       (riece-funcall-ignore-errors (symbol-name function)
+                                    function prefix number name
+                                    (riece-decode-coding-string string)))))
 
 (defun riece-handle-message (prefix message string)
   (if (and prefix
   (let ((function (intern-soft (concat "riece-handle-" message "-message")))
        (hook (intern (concat "riece-" message "-hook")))
        (after-hook (intern (concat "riece-after-" message "-hook"))))
-    (unless (riece-ignore-errors (symbol-name hook)
-             (run-hook-with-args-until-success hook prefix string))
+    (unless (riece-funcall-ignore-errors (symbol-name hook)
+                                        #'run-hook-with-args-until-success
+                                        hook prefix string)
       (if function
-         (riece-ignore-errors (symbol-name function)
-           (funcall function prefix string)))
-      (riece-ignore-errors (symbol-name after-hook)
-       (run-hook-with-args-until-success after-hook prefix string)))))
+         (riece-funcall-ignore-errors (symbol-name function)
+                                      function prefix string))
+      (riece-funcall-ignore-errors (symbol-name after-hook)
+                                  #'run-hook-with-args-until-success
+                                  after-hook prefix string))))
 
 (defsubst riece-chomp-string (string)
   (if (string-match "\r\\'" string)
     string))
 
 (defun riece-filter (process input)
-  (save-excursion
-    (set-buffer (process-buffer process))
+  (with-current-buffer (process-buffer process)
     (goto-char (point-max))
     (insert input)
-    (goto-char riece-read-point)
-    (beginning-of-line)
-    (while (and (not (eobp))
-               (looking-at ".*\n"))    ;the input line is not finished
-      (save-excursion
-       (if (looking-at
-            ":\\([^ ]+\\) +\\([0-5][0-9][0-9]\\) +\\([^ ]+\\) +\\(.*\\)")
-           (riece-handle-numeric-reply
-            (match-string 1)           ;prefix
-            (string-to-number (match-string 2)) ;number
-            (match-string 3)           ;name
-            (riece-chomp-string (match-string 4))) ;reply string
-         (if (looking-at "\\(:\\([^ ]+\\) +\\)?\\([^ ]+\\) +\\(.*\\)")
-             (riece-handle-message
-              (match-string 2)         ;optional prefix
-              (match-string 3)         ;command
-              (riece-chomp-string (match-string 4))) ;params & trailing
-           (if riece-debug
-               (message "Weird message from server: %s"
-                        (buffer-substring (point) (progn
-                                                    (end-of-line)
-                                                    (point))))))))
-      (forward-line))
-    (unless riece-debug
-      (delete-region (point-min) (point)))
-    (setq riece-read-point (point))))
+    (unless riece-filter-running
+      (unwind-protect
+         (progn
+           (setq riece-filter-running t)
+           (goto-char riece-read-point)
+           (beginning-of-line)
+           (while (looking-at ".*\n")  ;the input line is finished
+             (save-excursion
+               (if (looking-at
+                    ":\\([^ ]+\\) +\\([0-5][0-9][0-9]\\) +\\([^ ]+\\)\
+ +\\(.*\\)")
+                   (riece-handle-numeric-reply
+                    (match-string 1)           ;prefix
+                    (string-to-number (match-string 2)) ;number
+                    (match-string 3)           ;name
+                    (riece-chomp-string (match-string 4))) ;reply string
+                 (if (looking-at "\\(:\\([^ ]+\\) +\\)?\\([^ ]+\\) +\\(.*\\)")
+                     (riece-handle-message
+                      (match-string 2) ;optional prefix
+                      (match-string 3) ;command
+                      (riece-chomp-string (match-string 4))
+                                       ;params & trailing
+                      )
+                   (if riece-debug
+                       (message "Weird message from server: %s"
+                                (buffer-substring (point) (progn
+                                                            (end-of-line)
+                                                            (point))))))))
+             (forward-line))
+           (unless riece-debug
+             (delete-region (point-min) (point)))
+           (setq riece-read-point (point)))
+       (setq riece-filter-running nil)))))
 
 (eval-when-compile
   (autoload 'riece-exit "riece"))
                         riece-server-name)))
       (if riece-debug
          (if (equal server-name "")
-             (message "Connection closed: %s"
-                      (substring status 0 (1- (length status))))
-           (message "Connection to \"%s\" closed: %s"
-                    server-name (substring status 0 (1- (length status)))))
+             (riece-debug (format "Connection closed: %s"
+                                  (substring status 0 (1- (length status)))))
+           (riece-debug (format "Connection to \"%s\" closed: %s"
+                                server-name
+                                (substring status 0 (1- (length status))))))
        (if (equal server-name "")
            (message "Connection closed")
          (message "Connection to \"%s\" closed" server-name)))