Check if make-local-hook exists.
[riece] / lisp / riece-filter.el
index 7f739be..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,7 @@
             (format "riece-handle-default-%03d-message" base-number))))
     (if (and function
             (symbol-function function))
-       (riece-funcall-ignore-errors (if (symbolp function)
-                                        (symbol-name function)
-                                      (format "numeric-reply-%d" number))
+       (riece-funcall-ignore-errors (symbol-name function)
                                     function prefix number name
                                     (riece-decode-coding-string string)))))
 
   (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 (if (symbolp hook)
-                                    (symbol-name hook)
-                                  (format "%s-hook" message))
-             (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-funcall-ignore-errors (if (symbolp function)
-                                          (symbol-name function)
-                                        (format "message-%s" message))
+         (riece-funcall-ignore-errors (symbol-name function)
                                       function prefix string))
-      (riece-ignore-errors (if (symbolp after-hook)
-                              (symbol-name after-hook)
-                            (format "%s-after-hook" message))
-       (run-hook-with-args-until-success after-hook 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 (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))))
+    (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"))