X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Friece-filter.el;h=39edd49a49ecda3d58f237662a810c11577cfdd2;hb=3ba3a3b2c139d12bc1884de0d224dfb5985062c3;hp=5dc9cf6e11537ae7fdd32b7ddbfd12bc4b300e75;hpb=0553123c8e0a3b601cbd311179f65f7f912d1b69;p=riece diff --git a/lisp/riece-filter.el b/lisp/riece-filter.el index 5dc9cf6..39edd49 100644 --- a/lisp/riece-filter.el +++ b/lisp/riece-filter.el @@ -28,6 +28,7 @@ (require 'riece-misc) (require 'riece-server) ;riece-close-server (require 'riece-identity) +(require 'riece-debug) (defun riece-handle-numeric-reply (prefix number name string) (let ((base-number (* (/ number 100) 100)) @@ -40,12 +41,9 @@ (format "riece-handle-default-%03d-message" base-number)))) (if (and function (symbol-function function)) - (condition-case error - (funcall function prefix number name - (riece-decode-coding-string string)) - (error - (if riece-debug - (message "Error in `%S': %S" function error))))))) + (riece-ignore-errors (symbol-name function) + (funcall function prefix number name + (riece-decode-coding-string string)))))) (defun riece-handle-message (prefix message string) (if (and prefix @@ -58,58 +56,50 @@ (let ((function (intern-soft (concat "riece-handle-" message "-message"))) (hook (intern (concat "riece-" message "-hook"))) (after-hook (intern (concat "riece-after-" message "-hook")))) - (unless (condition-case error - (run-hook-with-args-until-success hook prefix string) - (error - (if riece-debug - (message "Error in `%S': %S" hook error)) - nil)) + (unless (riece-ignore-errors (symbol-name hook) + (run-hook-with-args-until-success hook prefix string)) (if function - (condition-case error - (funcall function prefix string) - (error - (if riece-debug - (message "Error in `%S': %S" function error))))) - (condition-case error - (run-hook-with-args-until-success after-hook prefix string) - (error - (if riece-debug - (message "Error in `%S': %S" after-hook error))))))) + (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))))) + +(defsubst riece-chomp-string (string) + (if (string-match "\r\\'" string) + (substring string 0 (match-beginning 0)) + string)) (defun riece-filter (process input) (save-excursion (set-buffer (process-buffer process)) - (goto-char riece-read-point) - (unless riece-debug - (delete-region (riece-line-beginning-position) (point-min)) - (setq riece-read-point (point))) + (goto-char (point-max)) (insert input) - (goto-char (prog1 riece-read-point - (setq riece-read-point (point)))) + (goto-char riece-read-point) (beginning-of-line) - (catch 'contiguous - (while (not (eobp)) - (save-excursion - (if (looking-at - ":\\([^ ]+\\) +\\([0-5][0-9][0-9]\\) +\\([^ ]+\\) +\\(.*\\)\r\n") - (riece-handle-numeric-reply - (match-string 1) ;prefix - (string-to-number (match-string 2)) ;number - (match-string 3) ;name - (match-string 4)) ;reply string - (if (looking-at "\\(:\\([^ ]+\\) +\\)?\\([^ ]+\\) +\\(.*\\)\r\n") - (riece-handle-message - (match-string 2) ;optional prefix - (match-string 3) ;command - (match-string 4)) ;params & trailing - (if (looking-at ".*\r\n") - (if riece-debug - (message "Weird message from server: %s" - (buffer-substring (point) (progn - (end-of-line) - (point))))) - (throw 'contiguous nil))))) - (forward-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)))) (eval-when-compile (autoload 'riece-exit "riece"))