From: ueno Date: Mon, 7 Feb 2005 03:16:51 +0000 (+0000) Subject: * riece-filter.el (riece-filter-semaphore): New variable. X-Git-Tag: riece-1_0_7b~5 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=cd251c124e2da8216981e4138cae742ccb4379d1;p=elisp%2Friece.git * riece-filter.el (riece-filter-semaphore): New variable. (riece-get-semaphore): New function. (riece-release-semaphore): New function. (riece-filter-with-semaphore): New macro. (riece-filter): Use it. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3a2a008..d742783 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2005-02-07 Daiki Ueno + + * riece-filter.el (riece-filter-semaphore): New variable. + (riece-get-semaphore): New function. + (riece-release-semaphore): New function. + (riece-filter-with-semaphore): New macro. + (riece-filter): Use it. + 2005-02-06 Daiki Ueno * riece-filter.el (riece-filter): Modified regexp. diff --git a/lisp/riece-filter.el b/lisp/riece-filter.el index bb6664b..7fed41d 100644 --- a/lisp/riece-filter.el +++ b/lisp/riece-filter.el @@ -30,6 +30,8 @@ (require 'riece-identity) (require 'riece-debug) +(defvar riece-filter-semaphore '(nil)) + (defun riece-handle-numeric-reply (prefix number name string) (let ((base-number (* (/ number 100) 100)) function) @@ -64,43 +66,64 @@ (riece-ignore-errors (symbol-name after-hook) (run-hook-with-args-until-success after-hook prefix string))))) -(defun riece-chomp-string (string) +;;; stolen (and renamed) from gnus-async.el. +(defun riece-get-semaphore (semaphore) + "Wait until SEMAPHORE is released." + (while (/= (length (nconc (symbol-value semaphore) (list nil))) 2) + (sleep-for 1))) + +(defun riece-release-semaphore (semaphore) + "Release SEMAPHORE." + (setcdr (symbol-value semaphore) nil)) + +(defmacro riece-filter-with-semaphore (&rest forms) + `(unwind-protect + (progn + (riece-get-semaphore 'riece-filter-semaphore) + ,@forms) + (riece-release-semaphore 'riece-filter-semaphore))) + +(put 'riece-filter-with-semaphore 'lisp-indent-function 0) +(put 'riece-filter-with-semaphore 'edebug-form-spec '(body)) + +(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))) - (insert input) - (goto-char (prog1 riece-read-point - (setq riece-read-point (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]\\) +\\([^ ]+\\) +\\(.*\\)\n") - (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 "\\(:\\([^ ]+\\) +\\)?\\([^ ]+\\) +\\(.*\\)\n") - (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)))) + (riece-filter-with-semaphore + (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))) + (insert input) + (goto-char (prog1 riece-read-point + (setq riece-read-point (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]\\) +\\([^ ]+\\) +\\(.*\\)\n") + (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 "\\(:\\([^ ]+\\) +\\)?\\([^ ]+\\) +\\(.*\\)\n") + (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))))) (eval-when-compile (autoload 'riece-exit "riece"))