1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-16 02:50:26 -08:00

Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-56

Merge from emacs--devo--0

Patches applied:

 * emacs--devo--0  (patch 204-225)

   - Update from CVS
   - Sync from erc--emacs--0
   - Merge from gnus--rel--5.10
   - Improve tq.el.
   - Update from CVS: src/puresize.h (PURESIZE_RATIO): Reduce to 10/6.

 * gnus--rel--5.10  (patch 81-85)

   - Update from CVS
   - Merge from emacs--devo--0
This commit is contained in:
Miles Bader 2006-04-17 08:41:12 +00:00
commit cfc2051d0e
131 changed files with 7365 additions and 5139 deletions

View file

@ -1650,8 +1650,12 @@ The value is non-nil if there were no errors, nil if errors."
;; If they change the file name, then change it for the output also.
(let ((buffer-file-name filename)
(default-major-mode 'emacs-lisp-mode)
;; Ignore unsafe local variables.
;; We only care about a few of them for our purposes.
(enable-local-variables :safe)
(enable-local-eval nil))
(normal-mode)
;; Arg of t means don't alter enable-local-variables.
(normal-mode t)
(setq filename buffer-file-name))
;; Set the default directory, in case an eval-when-compile uses it.
(setq default-directory (file-name-directory filename)))

View file

@ -258,6 +258,20 @@ Both SYMBOL and SPEC are unevaluated. The SPEC can be 0, t, a symbol
edebug-form-spec
))
;;;###autoload
(defun edebug-basic-spec (spec)
"Return t if SPEC uses only extant spec symbols.
An extant spec symbol is a symbol that is not a function and has a
`edebug-form-spec' property."
(cond ((listp spec)
(catch 'basic
(while spec
(unless (edebug-basic-spec (car spec)) (throw 'basic nil))
(setq spec (cdr spec)))
t))
((symbolp spec)
(unless (functionp spec) (get spec 'edebug-form-spec)))))
;;; Utilities
;; Define edebug-gensym - from old cl.el

View file

@ -64,7 +64,7 @@
(concat
"^\\s-*(\\(def\\(ine-skeleton\\|ine-generic-mode\\|ine-derived-mode\\|\
ine\\(?:-global\\)?-minor-mode\\|ine-compilation-mode\\|un-cvs-mode\\|\
foo\\|[^cfgv]\\w+\\*?\\)\\|easy-mmode-define-[a-z-]+\\|easy-menu-define\\|\
foo\\|[^cfgv]\\(\\w\\|\\s_\\)+\\*?\\)\\|easy-mmode-define-[a-z-]+\\|easy-menu-define\\|\
menu-bar-make-toggle\\)"
find-function-space-re
"\\('\\|\(quote \\)?%s\\(\\s-\\|$\\|\(\\|\)\\)")
@ -228,8 +228,16 @@ The search is done in the source for library LIBRARY."
(with-syntax-table emacs-lisp-mode-syntax-table
(goto-char (point-min))
(if (or (re-search-forward regexp nil t)
;; `regexp' matches definitions using known forms like
;; `defun', or `defvar'. But some functions/variables
;; are defined using special macros (or functions), so
;; if `regexp' can't find the definition, we look for
;; something of the form "(SOMETHING <symbol> ...)".
;; This fails to distinguish function definitions from
;; variable declarations (or even uses thereof), but is
;; a good pragmatic fallback.
(re-search-forward
(concat "^([^ ]+" find-function-space-re "['(]"
(concat "^([^ ]+" find-function-space-re "['(]?"
(regexp-quote (symbol-name symbol))
"\\_>")
nil t))

View file

@ -27,18 +27,56 @@
;;; Commentary:
;; manages receiving a stream asynchronously,
;; parsing it into transactions, and then calling
;; handler functions
;; This file manages receiving a stream asynchronously, parsing it
;; into transactions, and then calling the associated handler function
;; upon the completion of each transaction.
;; Our basic structure is the queue/process/buffer triple. Each entry
;; of the queue is a regexp/closure/function triple. We buffer
;; bytes from the process until we see the regexp at the head of the
;; queue. Then we call the function with the closure and the
;; collected bytes.
;; of the queue part is a list of question, regexp, closure, and
;; function that is consed to the last element.
;; A transaction queue may be created by calling `tq-create'.
;; A request may be added to the queue by calling `tq-enqueue'. If
;; the `delay-question' argument is non-nil, we will wait to send the
;; question to the process until it has finished sending other input.
;; Otherwise, once a request is enqueued, we send the given question
;; immediately to the process.
;; We then buffer bytes from the process until we see the regexp that
;; was provided in the call to `tq-enqueue'. Then we call the
;; provided function with the closure and the collected bytes. If we
;; have indicated that the question from the next transaction was not
;; sent immediately, send it at this point, awaiting the response.
;;; Code:
;;; Accessors
;; This part looks like (queue . (process . buffer))
(defun tq-queue (tq) (car tq))
(defun tq-process (tq) (car (cdr tq)))
(defun tq-buffer (tq) (cdr (cdr tq)))
;; The structure of `queue' is as follows
;; ((question regexp closure . fn)
;; <other queue entries>)
;; question: string to send to the process
(defun tq-queue-head-question (tq) (car (car (tq-queue tq))))
;; regexp: regular expression that matches the end of a response from
;; the process
(defun tq-queue-head-regexp (tq) (car (cdr (car (tq-queue tq)))))
;; closure: additional data to pass to function
(defun tq-queue-head-closure (tq) (car (cdr (cdr (car (tq-queue tq))))))
;; fn: function to call upon receiving a complete response from the
;; process
(defun tq-queue-head-fn (tq) (cdr (cdr (cdr (car (tq-queue tq))))))
;; Determine whether queue is empty
(defun tq-queue-empty (tq) (not (tq-queue tq)))
;;; Core functionality
;;;###autoload
(defun tq-create (process)
"Create and return a transaction queue communicating with PROCESS.
@ -54,33 +92,37 @@ to a tcp server on another machine."
(tq-filter ',tq string)))
tq))
;;; accessors
(defun tq-queue (tq) (car tq))
(defun tq-process (tq) (car (cdr tq)))
(defun tq-buffer (tq) (cdr (cdr tq)))
(defun tq-queue-add (tq re closure fn)
(defun tq-queue-add (tq question re closure fn)
(setcar tq (nconc (tq-queue tq)
(cons (cons re (cons closure fn)) nil)))
(cons (cons question (cons re (cons closure fn))) nil)))
'ok)
(defun tq-queue-head-regexp (tq) (car (car (tq-queue tq))))
(defun tq-queue-head-fn (tq) (cdr (cdr (car (tq-queue tq)))))
(defun tq-queue-head-closure (tq) (car (cdr (car (tq-queue tq)))))
(defun tq-queue-empty (tq) (not (tq-queue tq)))
(defun tq-queue-pop (tq) (setcar tq (cdr (car tq))) (null (car tq)))
(defun tq-queue-pop (tq)
(setcar tq (cdr (car tq)))
(let ((question (tq-queue-head-question tq)))
(when question
(process-send-string (tq-process tq) question)))
(null (car tq)))
;;; must add to queue before sending!
(defun tq-enqueue (tq question regexp closure fn)
(defun tq-enqueue (tq question regexp closure fn &optional delay-question)
"Add a transaction to transaction queue TQ.
This sends the string QUESTION to the process that TQ communicates with.
When the corresponding answer comes back, we call FN
with two arguments: CLOSURE, and the answer to the question.
When the corresponding answer comes back, we call FN with two
arguments: CLOSURE, which may contain additional data that FN
needs, and the answer to the question.
REGEXP is a regular expression to match the entire answer;
that's how we tell where the answer ends."
(tq-queue-add tq regexp closure fn)
(process-send-string (tq-process tq) question))
that's how we tell where the answer ends.
If DELAY-QUESTION is non-nil, delay sending this question until
the process has finished replying to any previous questions.
This produces more reliable results with some processes."
(let ((sendp (or (not delay-question)
(not (tq-queue-head-question tq)))))
(tq-queue-add tq (unless sendp question) regexp closure fn)
(when sendp
(process-send-string (tq-process tq) question))))
(defun tq-close (tq)
"Shut down transaction queue TQ, terminating the process."