Mercurial > emacs
annotate lisp/emacs-lisp/tq.el @ 34097:0225d8e15f2c
(coordinates_in_window): Handle computations for
positions on the vertical bar and fringes differently for
window-system frames. Consider some pixels near the vertical bar
as on the bar if the frame doesn't have vertical scroll bars.
Associate positions between mode or header lines with the
right window, the left one.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Fri, 01 Dec 2000 20:44:31 +0000 |
parents | b48b8060e70d |
children | d9207f337e2d |
rev | line source |
---|---|
743 | 1 ;;; tq.el --- utility to maintain a transaction queue |
2 | |
841 | 3 ;; Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc. |
4 | |
783
59dc833c4e0c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
743
diff
changeset
|
5 ;; Author: Scott Draves <spot@cs.cmu.edu> |
59dc833c4e0c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
743
diff
changeset
|
6 ;; Adapted-By: ESR |
814
38b2499cb3e9
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
783
diff
changeset
|
7 ;; Keywords: extensions |
783
59dc833c4e0c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
743
diff
changeset
|
8 |
841 | 9 ;; This file is part of GNU Emacs. |
10 | |
11 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
12 ;; it under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation; either version 2, or (at your option) | |
14 ;; any later version. | |
15 | |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
14169 | 22 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
24 ;; Boston, MA 02111-1307, USA. | |
841 | 25 |
26 ;;; Commentary: | |
783
59dc833c4e0c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
743
diff
changeset
|
27 |
743 | 28 ;;; manages receiving a stream asynchronously, |
29 ;;; parsing it into transactions, and then calling | |
30 ;;; handler functions | |
31 | |
32 ;;; Our basic structure is the queue/process/buffer triple. Each entry | |
33 ;;; of the queue is a regexp/closure/function triple. We buffer | |
34 ;;; bytes from the process until we see the regexp at the head of the | |
35 ;;; queue. Then we call the function with the closure and the | |
36 ;;; collected bytes. | |
37 | |
783
59dc833c4e0c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
743
diff
changeset
|
38 ;;; Code: |
743 | 39 |
1187
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
40 ;;;###autoload |
743 | 41 (defun tq-create (process) |
1187
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
42 "Create and return a transaction queue communicating with PROCESS. |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
43 PROCESS should be a subprocess capable of sending and receiving |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
44 streams of bytes. It may be a local process, or it may be connected |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
45 to a tcp server on another machine." |
743 | 46 (let ((tq (cons nil (cons process |
47 (generate-new-buffer | |
48 (concat " tq-temp-" | |
49 (process-name process))))))) | |
50 (set-process-filter process | |
51 (`(lambda (proc string) | |
52 (tq-filter '(, tq) string)))) | |
53 tq)) | |
54 | |
55 ;;; accessors | |
56 (defun tq-queue (tq) (car tq)) | |
57 (defun tq-process (tq) (car (cdr tq))) | |
58 (defun tq-buffer (tq) (cdr (cdr tq))) | |
59 | |
60 (defun tq-queue-add (tq re closure fn) | |
61 (setcar tq (nconc (tq-queue tq) | |
62 (cons (cons re (cons closure fn)) nil))) | |
63 'ok) | |
64 | |
65 (defun tq-queue-head-regexp (tq) (car (car (tq-queue tq)))) | |
66 (defun tq-queue-head-fn (tq) (cdr (cdr (car (tq-queue tq))))) | |
67 (defun tq-queue-head-closure (tq) (car (cdr (car (tq-queue tq))))) | |
68 (defun tq-queue-empty (tq) (not (tq-queue tq))) | |
69 (defun tq-queue-pop (tq) (setcar tq (cdr (car tq))) (null (car tq))) | |
70 | |
71 | |
72 ;;; must add to queue before sending! | |
73 (defun tq-enqueue (tq question regexp closure fn) | |
1187
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
74 "Add a transaction to transaction queue TQ. |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
75 This sends the string QUESTION to the process that TQ communicates with. |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
76 When the corresponding answer comes back, we call FN |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
77 with two arguments: CLOSURE, and the answer to the question. |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
78 REGEXP is a regular expression to match the entire answer; |
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
79 that's how we tell where the answer ends." |
743 | 80 (tq-queue-add tq regexp closure fn) |
81 (process-send-string (tq-process tq) question)) | |
82 | |
83 (defun tq-close (tq) | |
1187
519c04d69cdc
Doc fixes. Make tq-create autoload.
Richard M. Stallman <rms@gnu.org>
parents:
841
diff
changeset
|
84 "Shut down transaction queue TQ, terminating the process." |
743 | 85 (delete-process (tq-process tq)) |
86 (kill-buffer (tq-buffer tq))) | |
87 | |
88 (defun tq-filter (tq string) | |
89 "Append STRING to the TQ's buffer; then process the new data." | |
20693
b48b8060e70d
(tq-filter): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
17216
diff
changeset
|
90 (with-current-buffer (tq-buffer tq) |
b48b8060e70d
(tq-filter): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
17216
diff
changeset
|
91 (goto-char (point-max)) |
b48b8060e70d
(tq-filter): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
17216
diff
changeset
|
92 (insert string) |
b48b8060e70d
(tq-filter): Use with-current-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
17216
diff
changeset
|
93 (tq-process-buffer tq))) |
743 | 94 |
95 (defun tq-process-buffer (tq) | |
96 "Check TQ's buffer for the regexp at the head of the queue." | |
97 (set-buffer (tq-buffer tq)) | |
98 (if (= 0 (buffer-size)) () | |
99 (if (tq-queue-empty tq) | |
100 (let ((buf (generate-new-buffer "*spurious*"))) | |
101 (copy-to-buffer buf (point-min) (point-max)) | |
102 (delete-region (point-min) (point)) | |
103 (pop-to-buffer buf nil) | |
14430
408eeedc18cd
(tq-process-buffer): Fix error format string.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
104 (error "Spurious communication from process %s, see buffer %s" |
408eeedc18cd
(tq-process-buffer): Fix error format string.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
105 (process-name (tq-process tq)) |
408eeedc18cd
(tq-process-buffer): Fix error format string.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
106 (buffer-name buf))) |
743 | 107 (goto-char (point-min)) |
108 (if (re-search-forward (tq-queue-head-regexp tq) nil t) | |
109 (let ((answer (buffer-substring (point-min) (point)))) | |
110 (delete-region (point-min) (point)) | |
17216
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
111 (unwind-protect |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
112 (condition-case nil |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
113 (funcall (tq-queue-head-fn tq) |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
114 (tq-queue-head-closure tq) |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
115 answer) |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
116 (error nil)) |
ef3033d89075
(tq-process-buffer): Catch errors running tq-queue-head-fn.
Richard M. Stallman <rms@gnu.org>
parents:
16235
diff
changeset
|
117 (tq-queue-pop tq)) |
743 | 118 (tq-process-buffer tq)))))) |
119 | |
841 | 120 (provide 'tq) |
121 | |
743 | 122 ;;; tq.el ends here |