From 56b80656edea14996f8b96abb18f6f276b4f56e9 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Thu, 6 Dec 2007 00:47:08 +0000 Subject: [PATCH 001/172] Merge from gnus--rel--5.10 Revision: emacs@sv.gnu.org/emacs--rel--22--patch-159 --- lisp/gnus/ChangeLog | 4 ++++ lisp/gnus/message.el | 2 +- man/ChangeLog | 9 +++++++++ man/gnus.texi | 12 +++++------- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 41f847cbaca..aa410f541bd 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,7 @@ +2007-12-03 Reiner Steib + + * message.el (message-ignored-supersedes-headers): Add "X-ID". + 2007-11-24 Glenn Morris * message.el (message-tool-bar-retro): Update for rename diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index ae620c975d0..7e760427420 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -271,7 +271,7 @@ included. Organization and User-Agent are optional." :link '(custom-manual "(message)Mail Headers") :type 'regexp) -(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:" +(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-ID:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:" "*Header lines matching this regexp will be deleted before posting. It's best to delete old Path and Date headers before posting to avoid any confusion." diff --git a/man/ChangeLog b/man/ChangeLog index b338c6e55d7..3393712ba0a 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,12 @@ +2007-11-28 Katsumi Yamaoka + + * gnus.texi (Fancy Mail Splitting): Fix description of splitting based + on body. + +2007-11-24 Reiner Steib + + * gnus.texi (Fetching Mail): Remove obsolete `nnmail-spool-file'. + 2007-11-22 Francesco Potort,Al(B * maintaining.texi (Tag Syntax): Revert this change: "Now --members is diff --git a/man/gnus.texi b/man/gnus.texi index 3bce1de77b3..bcced071cc2 100644 --- a/man/gnus.texi +++ b/man/gnus.texi @@ -14123,14 +14123,12 @@ If non-@code{nil}, name of program for fetching new mail. If @subsubsection Fetching Mail @vindex mail-sources -@vindex nnmail-spool-file The way to actually tell Gnus where to get new mail from is to set @code{mail-sources} to a list of mail source specifiers (@pxref{Mail Source Specifiers}). -If this variable (and the obsolescent @code{nnmail-spool-file}) is -@code{nil}, the mail back ends will never attempt to fetch mail by -themselves. +If this variable is @code{nil}, the mail back ends will never attempt to +fetch mail by themselves. If you want to fetch mail both from your local spool as well as a @acronym{POP} mail server, you'd say something like: @@ -14339,9 +14337,9 @@ body of the messages: "string.group")))) @end lisp -The buffer is narrowed to the message in question when @var{function} -is run. That's why @code{(widen)} needs to be called after -@code{save-excursion} and @code{save-restriction} in the example +The buffer is narrowed to the header of the message in question when +@var{function} is run. That's why @code{(widen)} needs to be called +after @code{save-excursion} and @code{save-restriction} in the example above. Also note that with the nnimap backend, message bodies will not be downloaded by default. You need to set @code{nnimap-split-download-body} to @code{t} to do that From b2f2cd56b17426c15d3269ad4ba5e2f9c5798ff4 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Thu, 6 Dec 2007 13:30:14 +0000 Subject: [PATCH 002/172] (describe-function-1): Call ad-get-advice-info only on symbols. --- lisp/ChangeLog | 5 +++++ lisp/help-fns.el | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b410c68015c..85574e28651 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-06 Richard Stallman + + * help-fns.el (describe-function-1): Call ad-get-advice-info + only on symbols. + 2007-12-06 Glenn Morris * progmodes/antlr-mode.el (antlr-keyword, antlr-syntax) diff --git a/lisp/help-fns.el b/lisp/help-fns.el index 5aa8860ae9d..a8350bf0445 100644 --- a/lisp/help-fns.el +++ b/lisp/help-fns.el @@ -252,7 +252,8 @@ face (according to `face-differs-from-default-p')." ;;;###autoload (defun describe-function-1 (function) - (let* ((advised (and (featurep 'advice) (ad-get-advice-info function))) + (let* ((advised (and (symbolp function) (featurep 'advice) + (ad-get-advice-info function))) ;; If the function is advised, use the symbol that has the ;; real definition, if that symbol is already set up. (real-function From 214abdd48de346bf9b9e331fedbcee607605776a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 6 Dec 2007 15:04:29 +0000 Subject: [PATCH 003/172] (doc-view-dvi->pdf-sentinel, doc-view-pdf/ps->png-sentinel) (doc-view-pdf->txt-sentinel, doc-view-ps->pdf-sentinel, doc-view-display): Don't change buffer within a sentinel or timer. (doc-view-display): Don't try to display before the requested page is available, unless told to do so explicitly. (doc-view-pdf/ps->png-sentinel, doc-view-initiate-display): Force display even if the requested page is not available. --- lisp/ChangeLog | 11 +++++++ lisp/doc-view.el | 84 +++++++++++++++++++++++++----------------------- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 85574e28651..cb0d980e0b0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2007-12-06 Stefan Monnier + + * doc-view.el (doc-view-dvi->pdf-sentinel) + (doc-view-pdf/ps->png-sentinel, doc-view-pdf->txt-sentinel) + (doc-view-ps->pdf-sentinel, doc-view-display): Don't change buffer + within a sentinel or timer. + (doc-view-display): Don't try to display before the requested page + is available, unless told to do so explicitly. + (doc-view-pdf/ps->png-sentinel, doc-view-initiate-display): + Force display even if the requested page is not available. + 2007-12-06 Richard Stallman * help-fns.el (describe-function-1): Call ad-get-advice-info diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 0e336b12dd5..9073ce1536a 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -508,14 +508,14 @@ Should be invoked when the cached images aren't up-to-date." "If DVI->PDF conversion was successful, convert the PDF to PNG now." (if (not (string-match "finished" event)) (message "DocView: dvi->pdf process changed status to %s." event) - (set-buffer (process-get proc 'buffer)) - (setq doc-view-current-converter-process nil - mode-line-process nil) - ;; Now go on converting this PDF to a set of PNG files. - (let* ((pdf (process-get proc 'pdf-file)) - (png (expand-file-name "page-%d.png" - (doc-view-current-cache-dir)))) - (doc-view-pdf/ps->png pdf png)))) + (with-current-buffer (process-get proc 'buffer) + (setq doc-view-current-converter-process nil + mode-line-process nil) + ;; Now go on converting this PDF to a set of PNG files. + (let* ((pdf (process-get proc 'pdf-file)) + (png (expand-file-name "page-%d.png" + (doc-view-current-cache-dir)))) + (doc-view-pdf/ps->png pdf png))))) (defun doc-view-dvi->pdf (dvi pdf) "Convert DVI to PDF asynchronously." @@ -533,14 +533,14 @@ Should be invoked when the cached images aren't up-to-date." "If PDF/PS->PNG conversion was successful, update the display." (if (not (string-match "finished" event)) (message "DocView: converter process changed status to %s." event) - (set-buffer (process-get proc 'buffer)) - (setq doc-view-current-converter-process nil - mode-line-process nil) - (when doc-view-current-timer - (cancel-timer doc-view-current-timer) - (setq doc-view-current-timer nil)) - ;; Yippie, finished. Update the display! - (doc-view-display buffer-file-name))) + (with-current-buffer (process-get proc 'buffer) + (setq doc-view-current-converter-process nil + mode-line-process nil) + (when doc-view-current-timer + (cancel-timer doc-view-current-timer) + (setq doc-view-current-timer nil)) + ;; Yippie, finished. Update the display! + (doc-view-display buffer-file-name 'force)))) (defun doc-view-pdf/ps->png (pdf-ps png) "Convert PDF-PS to PNG asynchronously." @@ -568,13 +568,13 @@ Should be invoked when the cached images aren't up-to-date." (message "DocView: converter process changed status to %s." event) (let ((current-buffer (current-buffer)) (proc-buffer (process-get proc 'buffer))) - (set-buffer proc-buffer) - (setq doc-view-current-converter-process nil - mode-line-process nil) - ;; If the user looks at the DocView buffer where the conversion was - ;; performed, search anew. This time it will be queried for a regexp. - (when (eq current-buffer proc-buffer) - (doc-view-search nil))))) + (with-current-buffer proc-buffer + (setq doc-view-current-converter-process nil + mode-line-process nil) + ;; If the user looks at the DocView buffer where the conversion was + ;; performed, search anew. This time it will be queried for a regexp. + (when (eq current-buffer proc-buffer) + (doc-view-search nil)))))) (defun doc-view-pdf->txt (pdf txt) "Convert PDF to TXT asynchronously." @@ -590,13 +590,13 @@ Should be invoked when the cached images aren't up-to-date." (defun doc-view-ps->pdf-sentinel (proc event) (if (not (string-match "finished" event)) (message "DocView: converter process changed status to %s." event) - (set-buffer (process-get proc 'buffer)) - (setq doc-view-current-converter-process nil - mode-line-process nil) - ;; Now we can transform to plain text. - (doc-view-pdf->txt (process-get proc 'pdf-file) - (expand-file-name "doc.txt" - (doc-view-current-cache-dir))))) + (with-current-buffer (process-get proc 'buffer) + (setq doc-view-current-converter-process nil + mode-line-process nil) + ;; Now we can transform to plain text. + (doc-view-pdf->txt (process-get proc 'pdf-file) + (expand-file-name "doc.txt" + (doc-view-current-cache-dir)))))) (defun doc-view-ps->pdf (ps pdf) "Convert PS to PDF asynchronously." @@ -707,15 +707,19 @@ Predicate for sorting `doc-view-current-files'." (and (= (length a) (length b)) (string< a b)))) -(defun doc-view-display (doc) - "Start viewing the document DOC." - (set-buffer (get-file-buffer doc)) - (setq doc-view-current-files - (sort (directory-files (doc-view-current-cache-dir) t - "page-[0-9]+\\.png" t) - 'doc-view-sort)) - (when (> (length doc-view-current-files) 0) - (doc-view-goto-page doc-view-current-page))) +(defun doc-view-display (doc &optional force) + "Start viewing the document DOC. +If FORCE is non-nil, start viewing even if the document does not +have the page we want to view." + (with-current-buffer (get-file-buffer doc) + (setq doc-view-current-files + (sort (directory-files (doc-view-current-cache-dir) t + "page-[0-9]+\\.png" t) + 'doc-view-sort)) + (when (or force + (>= (length doc-view-current-files) + (or doc-view-current-page 1))) + (doc-view-goto-page doc-view-current-page)))) (defun doc-view-buffer-message () ;; Only show this message initially, not when refreshing the buffer (in which @@ -898,7 +902,7 @@ If BACKWARD is non-nil, jump to the previous match." (if (file-exists-p (doc-view-current-cache-dir)) (progn (message "DocView: using cached files!") - (doc-view-display buffer-file-name)) + (doc-view-display buffer-file-name 'force)) (doc-view-convert-current-doc)) (message "%s" From 2e564b0dc50d873996148f653797b46441f0b061 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 16:30:37 +0000 Subject: [PATCH 004/172] Fix buggy call to `error'. --- lisp/erc/ChangeLog | 4 ++++ lisp/erc/erc-match.el | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog index bd20dfbed45..f5d7c83985d 100644 --- a/lisp/erc/ChangeLog +++ b/lisp/erc/ChangeLog @@ -1,3 +1,7 @@ +2007-12-06 D. Goel + + * erc-match.el (erc-add-entry-to-list): Fix buggy call to `error'. + 2007-12-01 Glenn Morris * erc-backend.el (erc-server-send-ping): Move after definition of diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index a4752588ebd..757ef66ea17 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -299,7 +299,7 @@ Completion is performed on the optional alist COMPLETIONS." (lambda (x) (not (erc-member-ignore-case (car x) (symbol-value list))))))) (if (erc-member-ignore-case entry (symbol-value list)) - (error (format "\"%s\" is already on the list" entry)) + (error "\"%s\" is already on the list" entry) (set list (cons entry (symbol-value list)))))) (defun erc-remove-entry-from-list (list prompt) From fd0c71e869db245bf4304373b6dd5ec5160b8642 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 17:18:13 +0000 Subject: [PATCH 005/172] Resolve commit conflict. --- lisp/gnus/ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index bb92d478277..27b3a1586b7 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,9 @@ +2007-12-06 D. Goel + + + * gnus-art.el (article-make-date-line): Fix buggy call to `error'. + * gnus-start.el (gnus-load): Ditto. + 2007-12-05 Katsumi Yamaoka * gnus-art.el (gnus-use-idna) @@ -57,6 +63,7 @@ (rfc2047-encoded-word-regexp-loose): Move forward; add comments explaining what regexp patterns are for. +>>>>>>> 1.607 2007-12-04 Glenn Morris * password.el: Move to ../password-cache.el. From 23f3a1407c9af51d95ee3d6f885be5ae11cf0f35 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 17:19:22 +0000 Subject: [PATCH 006/172] Merge gnus-art.el and gnus-start.el after fixing buggy `error' calls. --- lisp/gnus/gnus-art.el | 2 +- lisp/gnus/gnus-start.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 4bb9ceb97ba..5e23b5313fc 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -3402,7 +3402,7 @@ should replace the \"Date:\" one, or should be added below it." ":" (format "%02d" (nth 1 dtime))))))) (error - (format "Date: %s (from Gnus)" date)))) + "Date: %s (from Gnus)" date))) (defun article-date-local (&optional highlight) "Convert the current article date to the local timezone." diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el index 7d6b91366e6..ca906d2d258 100644 --- a/lisp/gnus/gnus-start.el +++ b/lisp/gnus/gnus-start.el @@ -2392,8 +2392,8 @@ If FORCE is non-nil, the .newsrc file is read." (eval form)) (error (unless (eq (car type) 'end-of-file) - (let ((error (format "Error in %s line %d" file - (count-lines (point-min) (point))))) + (let ((error "Error in %s line %d" file + (count-lines (point-min (point))))) (ding) (unless (gnus-yes-or-no-p (concat error "; continue? ")) (error "%s" error))))))))) From 864da779a612cc75366bee12ab5f6f2859231f18 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 17:25:03 +0000 Subject: [PATCH 007/172] Resolve cvs commit conflict. (Fix buggy calls to error.) --- lisp/ChangeLog | 13 +++++++++++++ lisp/textmodes/org-publish.el | 4 ++-- lisp/textmodes/reftex-parse.el | 2 +- lisp/textmodes/texinfmt.el | 5 ++--- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cb0d980e0b0..4c1132d0184 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ + +2007-12-06 D. Goel + + + * textmodes/org-publish.el (org-publish-file): Fix buggy call(s) to `error'. + (org-publish-current-project): Ditto. + * textmodes/reftex-parse.el (reftex-short-context): Ditto. + (reftex-short-context): Ditto. + * textmodes/texinfmt.el: Ditto. + + + 2007-12-06 Stefan Monnier * doc-view.el (doc-view-dvi->pdf-sentinel) @@ -58,6 +70,7 @@ event of a verification failure. 2007-12-05 Reiner Steib +>>>>>>> 1.12380 * net/tls.el (tls-program): Provide more custom choices from `tls-checktrust'. Refer to `tls-checktrust' in doc string. diff --git a/lisp/textmodes/org-publish.el b/lisp/textmodes/org-publish.el index e98afaf4a6b..807a844c425 100644 --- a/lisp/textmodes/org-publish.el +++ b/lisp/textmodes/org-publish.el @@ -481,7 +481,7 @@ FILENAME is the filename of the file to be published." (plist (org-publish-get-plist-from-filename filename)) (publishing-function (or (plist-get plist :publishing-function) 'org-publish-org-to-html))) (if (not project-name) - (error (format "File %s is not part of any known project." filename))) + (error "File %s is not part of any known project." filename)) (when (org-publish-needed-p filename) (if (listp publishing-function) ;; allow chain of publishing functions @@ -575,7 +575,7 @@ With prefix argument, force publishing all files in project." (let* ((project-name (org-publish-get-project-from-filename (buffer-file-name))) (org-publish-use-timestamps-flag (if force nil t))) (if (not project-name) - (error (format "File %s is not part of any known project." (buffer-file-name)))) + (error "File %s is not part of any known project." (buffer-file-name))) (org-publish project-name)))) diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el index b6b85b8f7d3..c6c4b33d053 100644 --- a/lisp/textmodes/reftex-parse.el +++ b/lisp/textmodes/reftex-parse.el @@ -544,7 +544,7 @@ of master file." (save-excursion (condition-case error-var (funcall parse env) - (error (format "HOOK ERROR: %s" (cdr error-var)))))) + (error "HOOK ERROR: %s" (cdr error-var))))) (t "INVALID VALUE OF PARSE")))) diff --git a/lisp/textmodes/texinfmt.el b/lisp/textmodes/texinfmt.el index 55e7134f87e..812fcca06d6 100644 --- a/lisp/textmodes/texinfmt.el +++ b/lisp/textmodes/texinfmt.el @@ -2061,9 +2061,8 @@ commands that are defined in texinfo.tex for printed output. (apply '+ texinfo-multitable-width-list)))) (if (> desired-columns fill-column) (error - (format - "Multi-column table width, %d chars, is greater than page width, %d chars." - desired-columns fill-column)))) + "Multi-column table width, %d chars, is greater than page width, %d chars." + desired-columns fill-column))) texinfo-multitable-width-list)) ;; @item A1 @tab A2 @tab A3 From 8c16bd8c3566df3b0cbbc28692a23a378604f423 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 17:56:42 +0000 Subject: [PATCH 008/172] Fix buggy calls to `error'. --- lisp/ChangeLog | 22 ++++++++++++++++++++++ lisp/allout.el | 2 +- lisp/bindings.el | 2 +- lisp/dired.el | 2 +- lisp/ediff-init.el | 4 ++-- lisp/ibuffer.el | 2 +- lisp/man.el | 4 ++-- lisp/vc-cvs.el | 2 +- lisp/vc-mcvs.el | 2 +- lisp/vc.el | 4 ++-- lisp/wdired.el | 2 +- lisp/whitespace.el | 4 ++-- 12 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4c1132d0184..1f36c708900 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,25 @@ +2007-12-06 D. Goel + + * whitespace.el (whitespace-write-file-hook): Ditto. + + * wdired.el (wdired-check-kill-buffer): Ditto. + + * vc.el (vc-update): Ditto. + + * vc-mcvs.el (vc-mcvs-checkin): Ditto. + + * vc-cvs.el (vc-cvs-checkin): Ditto. + + * man.el (Man-bgproc-sentinel): Ditto. + (Man-goto-see-also-section): Ditto. + + * ibuffer.el (ibuffer-current-buffer): Ditto. + + * dired.el (dired-move-to-end-of-filename): Ditto. + + * bindings.el (complete-symbol): Ditto. + + * allout.el (allout-write-file-hook-handler): Fix buggy call(s) to `error'. 2007-12-06 D. Goel diff --git a/lisp/allout.el b/lisp/allout.el index 8878c56735f..c0175032bd8 100644 --- a/lisp/allout.el +++ b/lisp/allout.el @@ -1501,7 +1501,7 @@ See `allout-encryption-ciphertext-rejection-regexps' for rejection reasons.") (condition-case failure (setq allout-after-save-decrypt (allout-encrypt-decrypted except-mark)) - (error (progn + (error "%s" (progn (message "allout-write-file-hook-handler suppressing error %s" failure) diff --git a/lisp/bindings.el b/lisp/bindings.el index ca9f03c4c7c..435c935a69c 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -616,7 +616,7 @@ language you are using." (if (fboundp 'complete-tag) (complete-tag) ;; Don't autoload etags if we have no tags table. - (error (substitute-command-keys + (error "%s" (substitute-command-keys "No tags table loaded; use \\[visit-tags-table] to load one"))))) ;; Reduce total amount of space we must allocate during this function diff --git a/lisp/dired.el b/lisp/dired.el index ab56579e718..51067e46001 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -2009,7 +2009,7 @@ Return the position of the beginning of the filename, or nil if none found." (forward-char -1)))) (or no-error (not (eq opoint (point))) - (error (if hidden + (error "%s" (if hidden (substitute-command-keys "File line is hidden, type \\[dired-hide-subdir] to unhide") "No file on this line"))) diff --git a/lisp/ediff-init.el b/lisp/ediff-init.el index b46562b5fde..91c8f41bb13 100644 --- a/lisp/ediff-init.el +++ b/lisp/ediff-init.el @@ -1576,7 +1576,7 @@ This default should work without changes." ) ((ediff-key-press-event-p event) (point)) - (t (error nil)))) + (t (error "Error")))) (defun ediff-event-buffer (event) (cond ((ediff-mouse-event-p event) @@ -1587,7 +1587,7 @@ This default should work without changes." ) ((ediff-key-press-event-p event) (current-buffer)) - (t (error nil)))) + (t (error "Error")))) (defun ediff-event-key (event-or-key) (ediff-cond-compile-for-xemacs-or-emacs diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index b09a3e26979..7ee2c973cfe 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -1392,7 +1392,7 @@ If point is on a group name, this function operates on that group." (when must-be-live (if (bufferp buf) (unless (buffer-live-p buf) - (error (substitute-command-keys "Buffer %s has been killed; use `\\[ibuffer-update]' to update") buf)) + (error "%s" (substitute-command-keys "Buffer %s has been killed; use `\\[ibuffer-update]' to update") buf)) (error "No buffer on this line"))) buf)) diff --git a/lisp/man.el b/lisp/man.el index 41f1d37bb18..c3621be1c97 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -1077,7 +1077,7 @@ manpage command." (Man-notify-when-ready Man-buffer)) (if err-mess - (error err-mess)) + (error "%s" err-mess)) )))) @@ -1338,7 +1338,7 @@ Returns t if section is found, nil otherwise." Actually the section moved to is described by `Man-see-also-regexp'." (interactive) (if (not (Man-find-section Man-see-also-regexp)) - (error (concat "No " Man-see-also-regexp + (error "%s" (concat "No " Man-see-also-regexp " section found in the current manpage")))) (defun Man-possibly-hyphenated-word () diff --git a/lisp/vc-cvs.el b/lisp/vc-cvs.el index c9c50fceba2..6d57a329b0c 100644 --- a/lisp/vc-cvs.el +++ b/lisp/vc-cvs.el @@ -351,7 +351,7 @@ its parents." ((re-search-forward "Up-to-date check failed" nil t) (mapc (lambda (file) (vc-file-setprop file 'vc-state 'needs-merge)) files) - (error (substitute-command-keys + (error "%s" (substitute-command-keys (concat "Up-to-date check failed: " "type \\[vc-next-action] to merge in changes")))) (t diff --git a/lisp/vc-mcvs.el b/lisp/vc-mcvs.el index b5a81866eca..c3b68f8aeaf 100644 --- a/lisp/vc-mcvs.el +++ b/lisp/vc-mcvs.el @@ -294,7 +294,7 @@ This is only possible if Meta-CVS is responsible for FILE's directory.") ((re-search-forward "Up-to-date check failed" nil t) (mapc (lambda (file) (vc-file-setprop file 'vc-state 'needs-merge)) files) - (error (substitute-command-keys + (error "%s" (substitute-command-keys (concat "Up-to-date check failed: " "type \\[vc-next-action] to merge in changes")))) (t diff --git a/lisp/vc.el b/lisp/vc.el index 622c9682fbc..b54373a4e22 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -2619,10 +2619,10 @@ changes from the current branch are merged into the working file." (vc-checkout file nil "") (if (eq (vc-checkout-model file) 'locking) (if (eq (vc-state file) 'edited) - (error + (error "%s" (substitute-command-keys "File is locked--type \\[vc-revert] to discard changes")) - (error + (error "%s" (substitute-command-keys "Unexpected file state (%s)--type \\[vc-next-action] to correct") (vc-state file))) diff --git a/lisp/wdired.el b/lisp/wdired.el index 39d27d57848..2ab9306da43 100644 --- a/lisp/wdired.el +++ b/lisp/wdired.el @@ -492,7 +492,7 @@ Optional arguments are ignored." (if (and (buffer-modified-p) (not (y-or-n-p "Buffer changed. Discard changes and kill buffer? "))) - (error nil))) + (error "Error."))) (defun wdired-next-line (arg) "Move down lines then position at filename or the current column. diff --git a/lisp/whitespace.el b/lisp/whitespace.el index f6c94534a00..896668fd569 100644 --- a/lisp/whitespace.el +++ b/lisp/whitespace.el @@ -789,8 +789,8 @@ This is meant to be added buffer-locally to `write-file-functions'." (whitespace-cleanup-internal) (setq werr (whitespace-buffer))) (if (and whitespace-abort-on-error werr) - (error (concat "Abort write due to whitespaces in " - buffer-file-name)))) + (error "Abort write due to whitespaces in %s" + buffer-file-name))) nil) (defun whitespace-unload-function () From 142ff4de257fb67733273deafcbf0b798bfacdf0 Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Thu, 6 Dec 2007 17:57:38 +0000 Subject: [PATCH 009/172] *** empty log message *** --- lisp/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0a96ba61341..4187788b41f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2007-12-06 Jason Rumney + + * mouse.el (mouse-buffer-menu-alist): Keep buffer names left aligned. + 2007-12-04 Juanma Barranquero * ido.el (ido-save-history): Use emacs-mule coding system From fc1f472bc498ac1e75d4b07a0ed23b53738e7f15 Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Thu, 6 Dec 2007 17:58:08 +0000 Subject: [PATCH 010/172] (mouse-buffer-menu-alist): Keep buffer names left aligned. --- lisp/mouse.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/mouse.el b/lisp/mouse.el index e35bea81748..d01bddfab73 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -1914,7 +1914,7 @@ and selects that window." (cons (cons (format - (format "%%%ds %%s%%s %%s" maxlen) + (format "%%-%ds %%s%%s %%s" maxlen) (buffer-name elt) (if (buffer-modified-p elt) "*" " ") (save-excursion From 26b4a51d1e6ef277c93f0d385d76a0fa9af69e7f Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 18:18:13 +0000 Subject: [PATCH 011/172] Fix buggy calls to `error'. --- lisp/ChangeLog | 6 ++++++ lisp/gnus/ChangeLog | 1 + lisp/gnus/pop3.el | 2 +- lisp/mail/feedmail.el | 2 +- lisp/mail/rmailout.el | 2 +- lisp/mail/uce.el | 2 +- 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1f36c708900..3c3c5b8aa45 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,11 @@ 2007-12-06 D. Goel + * mail/uce.el (uce-reply-to-uce): Ditto. + + * mail/rmailout.el (rmail-output): Ditto. + + * mail/feedmail.el (feedmail-dump-message-to-queue): Ditto. + * whitespace.el (whitespace-write-file-hook): Ditto. * wdired.el (wdired-check-kill-buffer): Ditto. diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 27b3a1586b7..74b01dbe94a 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,5 +1,6 @@ 2007-12-06 D. Goel + * pop3.el (pop3-read-response): Ditto. * gnus-art.el (article-make-date-line): Fix buggy call to `error'. * gnus-start.el (gnus-load): Ditto. diff --git a/lisp/gnus/pop3.el b/lisp/gnus/pop3.el index d152c2480ad..a48e8bc6cfe 100644 --- a/lisp/gnus/pop3.el +++ b/lisp/gnus/pop3.el @@ -314,7 +314,7 @@ Return the response string if optional second argument is non-nil." (setq match-end (point)) (goto-char pop3-read-point) (if (looking-at "-ERR") - (error (buffer-substring (point) (- match-end 2))) + (error "%s" (buffer-substring (point) (- match-end 2))) (if (not (looking-at "+OK")) (progn (setq pop3-read-point match-end) nil) (setq pop3-read-point match-end) diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el index e75387f48ac..7fb40baa7c8 100644 --- a/lisp/mail/feedmail.el +++ b/lisp/mail/feedmail.el @@ -1922,7 +1922,7 @@ mapped to mostly alphanumerics for safety." ;; progn to get nil result no matter what (progn (make-directory queue-directory t) nil) (file-accessible-directory-p queue-directory) - (error (concat "FQM: Message not queued; trouble with directory " queue-directory))) + (error "%s" (concat "FQM: Message not queued; trouble with directory " queue-directory))) (let ((filename) (is-fqm) (is-in-this-dir) diff --git a/lisp/mail/rmailout.el b/lisp/mail/rmailout.el index 1e9f8379b7b..234277320ad 100644 --- a/lisp/mail/rmailout.el +++ b/lisp/mail/rmailout.el @@ -380,7 +380,7 @@ The optional fourth argument FROM-GNUS is set when called from GNUS." (rmail-toggle-header)) (if (and (> count 0) (not next-message-p)) (progn - (error + (error "%s" (save-excursion (set-buffer rmailbuf) (format "Only %d message%s appended" num-appended diff --git a/lisp/mail/uce.el b/lisp/mail/uce.el index 5a4e01ae9fc..54933993068 100644 --- a/lisp/mail/uce.el +++ b/lisp/mail/uce.el @@ -239,7 +239,7 @@ address, and postmaster of the mail relay used." (full-header-p (and (eq uce-mail-reader 'rmail) (not (rmail-msg-is-pruned))))) (or (get-buffer message-buffer) - (error (concat "No buffer " message-buffer ", cannot find UCE"))) + (error "%s" (concat "No buffer " message-buffer ", cannot find UCE"))) (switch-to-buffer message-buffer) ;; We need the message with headers pruned. (if full-header-p From e9e4d61914ede6f19c75d1d6962c2977a1be213b Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 18:22:45 +0000 Subject: [PATCH 012/172] Fix buggy calls to `error' in the net/ directory. --- lisp/ChangeLog | 2 ++ lisp/net/trampver.el | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3c3c5b8aa45..239a7b08af1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2007-12-06 D. Goel + * net/trampver.el (x): Ditto. + * mail/uce.el (uce-reply-to-uce): Ditto. * mail/rmailout.el (rmail-output): Ditto. diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el index 58ae73d8cd3..0639210a1be 100644 --- a/lisp/net/trampver.el +++ b/lisp/net/trampver.el @@ -38,7 +38,7 @@ ;; Check for (X)Emacs version. (let ((x (if (or (< emacs-major-version 21) (and (featurep 'xemacs) (< emacs-minor-version 4))) (format "Tramp 2.1.12-pre is not fit for %s" (when (string-match "^.*$" (emacs-version)) (match-string 0 (emacs-version)))) "ok"))) - (unless (string-match "\\`ok\\'" x) (error x))) + (unless (string-match "\\`ok\\'" x) (error "%s" x))) (provide 'trampver) From 768b14f8a010ac4a86ae9d9d6a80f06d429f4372 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 18:36:46 +0000 Subject: [PATCH 013/172] Fix buggy `error' calls in progmodes/ --- lisp/ChangeLog | 10 ++++++++++ lisp/progmodes/ada-xref.el | 8 ++++---- lisp/progmodes/idlw-shell.el | 4 ++-- lisp/progmodes/vhdl-mode.el | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 239a7b08af1..5ad97fe4571 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,15 @@ 2007-12-06 D. Goel + * progmodes/vhdl-mode.el (vhdl-template-modify): Ditto. + + * progmodes/idlw-shell.el (idlwave-shell-send-command): Ditto. + (idlwave-shell-display-line): Ditto. + + * progmodes/ada-xref.el (ada-find-file): Ditto. + (ada-get-all-references): Ditto. + (ada-xref-find-in-modified-ali): Ditto. + (ada-find-in-src-path): Ditto. + * net/trampver.el (x): Ditto. * mail/uce.el (uce-reply-to-uce): Ditto. diff --git a/lisp/progmodes/ada-xref.el b/lisp/progmodes/ada-xref.el index ddea4c293df..a92705f92fa 100644 --- a/lisp/progmodes/ada-xref.el +++ b/lisp/progmodes/ada-xref.el @@ -564,7 +564,7 @@ Completion is available." (let ((file (ada-find-src-file-in-dir filename))) (if file (find-file file) - (error (concat filename " not found in src_dir"))))) + (error "%s" (concat filename " not found in src_dir"))))) ;; ----- Utilities ------------------------------------------------- @@ -1722,7 +1722,7 @@ Information is extracted from the ali file." ;; No more idea to find the declaration. Give up (progn (kill-buffer ali-buffer) - (error (concat "No declaration of " (ada-name-of identlist) + (error "%s" (concat "No declaration of " (ada-name-of identlist) " found.")) ))) ) @@ -1808,7 +1808,7 @@ This function is disabled for operators, and only works for identifiers." ;; none => error ((= len 0) (kill-buffer (current-buffer)) - (error (concat "No declaration of " + (error "%s" (concat "No declaration of " (ada-name-of identlist) " recorded in .ali file"))) @@ -2011,7 +2011,7 @@ the declaration and documentation of the subprograms one is using." (string-to-number (nth 2 (car list))) identlist other-frame) - (error (concat (caar list) " not found in src_dir"))) + (error "%s" (concat (caar list) " not found in src_dir"))) (message "This is only a (good) guess at the cross-reference.") ) diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el index eebfd377a7e..153b95e65e4 100644 --- a/lisp/progmodes/idlw-shell.el +++ b/lisp/progmodes/idlw-shell.el @@ -1322,7 +1322,7 @@ message, independent of what HIDE is set to." (if (or (not (setq buf (get-buffer (idlwave-shell-buffer)))) (not (setq proc (get-buffer-process buf)))) (if (not idlwave-shell-automatic-start) - (error + (error "%s" (substitute-command-keys "You need to first start an IDL shell with \\[idlwave-shell]")) (idlwave-shell-recenter-shell-window) @@ -2375,7 +2375,7 @@ matter what the settings of that variable." (if (not (idlwave-shell-valid-frame frame)) ;; fixme: errors are dangerous in shell filters. but i think i ;; have never encountered this one. - (error (concat "invalid frame - unable to access file: " (car frame))) + (error "%s" (concat "invalid frame - unable to access file: " (car frame))) ;;; ;;; buffer : the buffer to display a line in. ;;; select-shell: current buffer is the shell. diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el index df315e4f46e..5b14e6a857f 100644 --- a/lisp/progmodes/vhdl-mode.el +++ b/lisp/progmodes/vhdl-mode.el @@ -9095,7 +9095,7 @@ otherwise." (progn (delete-region (point) (progn (end-of-line) (point))) (vhdl-template-insert-date)) (unless noerror - (error (concat "ERROR: Modification date prefix string \"" + (error "%s" (concat "ERROR: Modification date prefix string \"" vhdl-modify-date-prefix-string "\" not found"))))))) (defun vhdl-template-modify-noerror () From 40b0e87a71aa2c0b396f2173b7ddd2708947ce39 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 18:43:43 +0000 Subject: [PATCH 014/172] Fix buggy `error' calls in textmode/ --- lisp/ChangeLog | 6 ++++++ lisp/textmodes/ispell.el | 2 +- lisp/textmodes/org.el | 2 +- lisp/textmodes/reftex.el | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5ad97fe4571..c5e0ebd2512 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,11 @@ 2007-12-06 D. Goel + * textmodes/reftex.el (reftex-TeX-master-file): Ditto. + + * textmodes/org.el (org-paste-subtree): Ditto. + + * textmodes/ispell.el (ispell-process-line): Ditto. + * progmodes/vhdl-mode.el (vhdl-template-modify): Ditto. * progmodes/idlw-shell.el (idlwave-shell-send-command): Ditto. diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el index 7fb6aed139a..b4ee00ae031 100644 --- a/lisp/textmodes/ispell.el +++ b/lisp/textmodes/ispell.el @@ -3063,7 +3063,7 @@ Returns the sum SHIFT due to changes in word replacements." ;; `query-replace' makes multiple corrections on the starting line. (or (ispell-looking-at (car poss)) ;; This occurs due to filter pipe problems - (error (concat "Ispell misalignment: word " + (error "%s" (concat "Ispell misalignment: word " "`%s' point %d; probably incompatible versions") (car poss) (marker-position word-start))) ;; ispell-cmd-loop can go recursive & change buffer diff --git a/lisp/textmodes/org.el b/lisp/textmodes/org.el index 0535f679c40..5e2a9c0148e 100644 --- a/lisp/textmodes/org.el +++ b/lisp/textmodes/org.el @@ -6076,7 +6076,7 @@ If you want to insert the tree as is, just use \\[yank]. If optional TREE is given, use this text instead of the kill ring." (interactive "P") (unless (org-kill-is-subtree-p tree) - (error + (error "%s" (substitute-command-keys "The kill is not a (set of) tree(s) - please use \\[yank] to yank anyway"))) (let* ((txt (or tree (and kill-ring (current-kill 0)))) diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el index 5383d88c386..47482916efb 100644 --- a/lisp/textmodes/reftex.el +++ b/lisp/textmodes/reftex.el @@ -705,7 +705,7 @@ on the menu bar. ((fboundp 'TeX-master-file) ; AUCTeX is loaded. Use its mechanism. (condition-case nil (TeX-master-file t) - (error (buffer-file-name)))) + (error "%s" (buffer-file-name)))) ((fboundp 'tex-main-file) (tex-main-file)) ; Emacs LaTeX mode ((boundp 'TeX-master) ; The variable is defined - lets use it. (cond From 1388485d6b660d1f02fa35e0a64dd4f8fd090750 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 19:48:30 +0000 Subject: [PATCH 015/172] Fix my previous breakages; improve ChangeLog --- lisp/ChangeLog | 24 +++++------------------- lisp/gnus/gnus-start.el | 4 ++-- lisp/ibuffer.el | 2 +- lisp/vc.el | 6 +++--- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c5e0ebd2512..236419d04f6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,49 +1,35 @@ 2007-12-06 D. Goel + * vc.el: Fix breakage. + * ibuffer.el (ibuffer-current-buffer): Ditto. + * gnus/gnus-start.el (gnus-load): Ditto. + + * allout.el (allout-write-file-hook-handler): Fix buggy call(s) to `error'. * textmodes/reftex.el (reftex-TeX-master-file): Ditto. - * textmodes/org.el (org-paste-subtree): Ditto. - * textmodes/ispell.el (ispell-process-line): Ditto. - * progmodes/vhdl-mode.el (vhdl-template-modify): Ditto. - * progmodes/idlw-shell.el (idlwave-shell-send-command): Ditto. (idlwave-shell-display-line): Ditto. - * progmodes/ada-xref.el (ada-find-file): Ditto. (ada-get-all-references): Ditto. (ada-xref-find-in-modified-ali): Ditto. (ada-find-in-src-path): Ditto. - * net/trampver.el (x): Ditto. - * mail/uce.el (uce-reply-to-uce): Ditto. - * mail/rmailout.el (rmail-output): Ditto. - * mail/feedmail.el (feedmail-dump-message-to-queue): Ditto. - * whitespace.el (whitespace-write-file-hook): Ditto. - * wdired.el (wdired-check-kill-buffer): Ditto. - * vc.el (vc-update): Ditto. - * vc-mcvs.el (vc-mcvs-checkin): Ditto. - * vc-cvs.el (vc-cvs-checkin): Ditto. - * man.el (Man-bgproc-sentinel): Ditto. (Man-goto-see-also-section): Ditto. - * ibuffer.el (ibuffer-current-buffer): Ditto. - * dired.el (dired-move-to-end-of-filename): Ditto. - * bindings.el (complete-symbol): Ditto. - * allout.el (allout-write-file-hook-handler): Fix buggy call(s) to `error'. 2007-12-06 D. Goel diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el index ca906d2d258..0b8a9cea67d 100644 --- a/lisp/gnus/gnus-start.el +++ b/lisp/gnus/gnus-start.el @@ -2392,8 +2392,8 @@ If FORCE is non-nil, the .newsrc file is read." (eval form)) (error (unless (eq (car type) 'end-of-file) - (let ((error "Error in %s line %d" file - (count-lines (point-min (point))))) + (let ((error (format "Error in %s line %d" file + (count-lines (point-min (point)))))) (ding) (unless (gnus-yes-or-no-p (concat error "; continue? ")) (error "%s" error))))))))) diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index 7ee2c973cfe..aa436a96971 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -1392,7 +1392,7 @@ If point is on a group name, this function operates on that group." (when must-be-live (if (bufferp buf) (unless (buffer-live-p buf) - (error "%s" (substitute-command-keys "Buffer %s has been killed; use `\\[ibuffer-update]' to update") buf)) + (error "Buffer %s has been killed; %s" buf (substitute-command-keys "use `\\[ibuffer-update]' to update"))) (error "No buffer on this line"))) buf)) diff --git a/lisp/vc.el b/lisp/vc.el index b54373a4e22..6fd6e25bd88 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -2622,10 +2622,10 @@ changes from the current branch are merged into the working file." (error "%s" (substitute-command-keys "File is locked--type \\[vc-revert] to discard changes")) - (error "%s" + (error "Unexpected file state (%s) -- type %s" + (vc-state file) (substitute-command-keys - "Unexpected file state (%s)--type \\[vc-next-action] to correct") - (vc-state file))) + "\\[vc-next-action] to correct")) (if (not (vc-find-backend-function (vc-backend file) 'merge-news)) (error "Sorry, merging news is not implemented for %s" (vc-backend file)) From c6ddcf3a86f9add63cf4b05172edded1dc6dfcbd Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 19:50:42 +0000 Subject: [PATCH 016/172] Commit a more readable changelog. --- lisp/gnus/ChangeLog | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 74b01dbe94a..5a2db800f0a 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,9 +1,8 @@ 2007-12-06 D. Goel - * pop3.el (pop3-read-response): Ditto. - * gnus-art.el (article-make-date-line): Fix buggy call to `error'. * gnus-start.el (gnus-load): Ditto. + * pop3.el (pop3-read-response): Ditto. 2007-12-05 Katsumi Yamaoka From 1f325d92d3a8c0848278c169546d1ca640db051d Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 19:56:41 +0000 Subject: [PATCH 017/172] Fix vc.el breakage. --- lisp/ChangeLog | 3 +-- lisp/gnus/ChangeLog | 1 + lisp/vc.el | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 236419d04f6..a552490c02b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,8 +1,7 @@ 2007-12-06 D. Goel - * vc.el: Fix breakage. + * vc.el (vc-update): Fix breakage. * ibuffer.el (ibuffer-current-buffer): Ditto. - * gnus/gnus-start.el (gnus-load): Ditto. * allout.el (allout-write-file-hook-handler): Fix buggy call(s) to `error'. * textmodes/reftex.el (reftex-TeX-master-file): Ditto. diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 5a2db800f0a..df1865b2767 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,4 +1,5 @@ 2007-12-06 D. Goel + * gnus-start.el (gnus-load): Fix breakage from last change. * gnus-art.el (article-make-date-line): Fix buggy call to `error'. * gnus-start.el (gnus-load): Ditto. diff --git a/lisp/vc.el b/lisp/vc.el index 6fd6e25bd88..995bcc25692 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -2620,12 +2620,12 @@ changes from the current branch are merged into the working file." (if (eq (vc-checkout-model file) 'locking) (if (eq (vc-state file) 'edited) (error "%s" - (substitute-command-keys - "File is locked--type \\[vc-revert] to discard changes")) + (substitute-command-keys + "File is locked--type \\[vc-revert] to discard changes")) (error "Unexpected file state (%s) -- type %s" - (vc-state file) - (substitute-command-keys - "\\[vc-next-action] to correct")) + (vc-state file) + (substitute-command-keys + "\\[vc-next-action] to correct"))) (if (not (vc-find-backend-function (vc-backend file) 'merge-news)) (error "Sorry, merging news is not implemented for %s" (vc-backend file)) From d8c47d3c575ee8561e1e65c7a2366047702ac5d2 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 20:02:02 +0000 Subject: [PATCH 018/172] Improve the last changelog entry. --- lisp/ChangeLog | 51 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a552490c02b..9988d58b66b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,33 +1,30 @@ 2007-12-06 D. Goel - * vc.el (vc-update): Fix breakage. - * ibuffer.el (ibuffer-current-buffer): Ditto. + * vc.el (vc-update) + * ibuffer.el (ibuffer-current-buffer): Fix breakage from the + change below. - * allout.el (allout-write-file-hook-handler): Fix buggy call(s) to `error'. - * textmodes/reftex.el (reftex-TeX-master-file): Ditto. - * textmodes/org.el (org-paste-subtree): Ditto. - * textmodes/ispell.el (ispell-process-line): Ditto. - * progmodes/vhdl-mode.el (vhdl-template-modify): Ditto. - * progmodes/idlw-shell.el (idlwave-shell-send-command): Ditto. - (idlwave-shell-display-line): Ditto. - * progmodes/ada-xref.el (ada-find-file): Ditto. - (ada-get-all-references): Ditto. - (ada-xref-find-in-modified-ali): Ditto. - (ada-find-in-src-path): Ditto. - * net/trampver.el (x): Ditto. - * mail/uce.el (uce-reply-to-uce): Ditto. - * mail/rmailout.el (rmail-output): Ditto. - * mail/feedmail.el (feedmail-dump-message-to-queue): Ditto. - * whitespace.el (whitespace-write-file-hook): Ditto. - * wdired.el (wdired-check-kill-buffer): Ditto. - * vc.el (vc-update): Ditto. - * vc-mcvs.el (vc-mcvs-checkin): Ditto. - * vc-cvs.el (vc-cvs-checkin): Ditto. - * man.el (Man-bgproc-sentinel): Ditto. - (Man-goto-see-also-section): Ditto. - * ibuffer.el (ibuffer-current-buffer): Ditto. - * dired.el (dired-move-to-end-of-filename): Ditto. - * bindings.el (complete-symbol): Ditto. + * allout.el (allout-write-file-hook-handler) + * textmodes/reftex.el (reftex-TeX-master-file) + * textmodes/org.el (org-paste-subtree) + * textmodes/ispell.el (ispell-process-line) + * progmodes/vhdl-mode.el (vhdl-template-modify) + * progmodes/idlw-shell.el (idlwave-shell-send-command, idlwave-shell-display-line) + * progmodes/ada-xref.el (ada-find-file, ada-get-all-references, ada-xref-find-in-modified-ali) + (ada-find-in-src-path) + * net/trampver.el (x) + * mail/uce.el (uce-reply-to-uce) + * mail/rmailout.el (rmail-output) + * mail/feedmail.el (feedmail-dump-message-to-queue) + * whitespace.el (whitespace-write-file-hook) + * wdired.el (wdired-check-kill-buffer) + * vc.el (vc-update) + * vc-mcvs.el (vc-mcvs-checkin) + * vc-cvs.el (vc-cvs-checkin) + * man.el (Man-bgproc-sentinel, Man-goto-see-also-section) + * ibuffer.el (ibuffer-current-buffer) + * dired.el (dired-move-to-end-of-filename) + * bindings.el (complete-symbol): Fix buggy calls to `error'. 2007-12-06 D. Goel From af5370adb4887d65416f7792476ab47cd9ec92e7 Mon Sep 17 00:00:00 2001 From: Reiner Steib Date: Thu, 6 Dec 2007 20:04:55 +0000 Subject: [PATCH 019/172] (gnus-load): Rename local variable to avoid confusion. --- lisp/gnus/ChangeLog | 4 ++++ lisp/gnus/gnus-start.el | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index df1865b2767..afcb487bd1e 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,7 @@ +2007-12-06 Reiner Steib + + * gnus-start.el (gnus-load): Rename local variable to avoid confusion. + 2007-12-06 D. Goel * gnus-start.el (gnus-load): Fix breakage from last change. diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el index 0b8a9cea67d..100c28b9e80 100644 --- a/lisp/gnus/gnus-start.el +++ b/lisp/gnus/gnus-start.el @@ -2392,11 +2392,11 @@ If FORCE is non-nil, the .newsrc file is read." (eval form)) (error (unless (eq (car type) 'end-of-file) - (let ((error (format "Error in %s line %d" file - (count-lines (point-min (point)))))) + (let ((errmsg (format "Error in %s line %d" file + (count-lines (point-min (point)))))) (ding) - (unless (gnus-yes-or-no-p (concat error "; continue? ")) - (error "%s" error))))))))) + (unless (gnus-yes-or-no-p (concat errmsg "; continue? ")) + (error "%s" errmsg))))))))) (defun gnus-read-newsrc-el-file (file) (let ((ding-file (concat file "d"))) From feac787c793552e48bef42499fb264cc44a4a3a1 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 20:06:24 +0000 Subject: [PATCH 020/172] Fix breakage of textmodes/ispell.el from last change. --- lisp/ChangeLog | 1 + lisp/textmodes/ispell.el | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9988d58b66b..6673c25a43c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,6 @@ 2007-12-06 D. Goel + * textmodes/ispell.el (ispell-process-line) * vc.el (vc-update) * ibuffer.el (ibuffer-current-buffer): Fix breakage from the change below. diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el index b4ee00ae031..7fb6aed139a 100644 --- a/lisp/textmodes/ispell.el +++ b/lisp/textmodes/ispell.el @@ -3063,7 +3063,7 @@ Returns the sum SHIFT due to changes in word replacements." ;; `query-replace' makes multiple corrections on the starting line. (or (ispell-looking-at (car poss)) ;; This occurs due to filter pipe problems - (error "%s" (concat "Ispell misalignment: word " + (error (concat "Ispell misalignment: word " "`%s' point %d; probably incompatible versions") (car poss) (marker-position word-start))) ;; ispell-cmd-loop can go recursive & change buffer From 80d0675396769080b73ff01df587984020d7a0f8 Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Thu, 6 Dec 2007 20:25:35 +0000 Subject: [PATCH 021/172] Fix breakage from last change. --- lisp/gnus/ChangeLog | 4 ++++ lisp/gnus/gnus-start.el | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index afcb487bd1e..d448f305cd0 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,7 @@ +2007-12-06 D. Goel + + * gnus-start.el (gnus-load): Fix breakage from last change. + 2007-12-06 Reiner Steib * gnus-start.el (gnus-load): Rename local variable to avoid confusion. diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el index 100c28b9e80..75f9dda7c2b 100644 --- a/lisp/gnus/gnus-start.el +++ b/lisp/gnus/gnus-start.el @@ -2393,7 +2393,7 @@ If FORCE is non-nil, the .newsrc file is read." (error (unless (eq (car type) 'end-of-file) (let ((errmsg (format "Error in %s line %d" file - (count-lines (point-min (point)))))) + (count-lines (point-min) (point))))) (ding) (unless (gnus-yes-or-no-p (concat errmsg "; continue? ")) (error "%s" errmsg))))))))) From cf9ca12455bd6e3e2a73fb03d224078254b2743e Mon Sep 17 00:00:00 2001 From: Juanma Barranquero Date: Thu, 6 Dec 2007 22:05:18 +0000 Subject: [PATCH 022/172] *** empty log message *** --- lisp/ChangeLog | 56 ++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6673c25a43c..9f74b155c97 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,44 +1,42 @@ 2007-12-06 D. Goel - * textmodes/ispell.el (ispell-process-line) - * vc.el (vc-update) - * ibuffer.el (ibuffer-current-buffer): Fix breakage from the - change below. + * textmodes/ispell.el (ispell-process-line): + * vc.el (vc-update): + * ibuffer.el (ibuffer-current-buffer): + Fix breakage from the change below. - * allout.el (allout-write-file-hook-handler) - * textmodes/reftex.el (reftex-TeX-master-file) - * textmodes/org.el (org-paste-subtree) - * textmodes/ispell.el (ispell-process-line) - * progmodes/vhdl-mode.el (vhdl-template-modify) - * progmodes/idlw-shell.el (idlwave-shell-send-command, idlwave-shell-display-line) - * progmodes/ada-xref.el (ada-find-file, ada-get-all-references, ada-xref-find-in-modified-ali) - (ada-find-in-src-path) - * net/trampver.el (x) - * mail/uce.el (uce-reply-to-uce) - * mail/rmailout.el (rmail-output) - * mail/feedmail.el (feedmail-dump-message-to-queue) - * whitespace.el (whitespace-write-file-hook) - * wdired.el (wdired-check-kill-buffer) - * vc.el (vc-update) - * vc-mcvs.el (vc-mcvs-checkin) - * vc-cvs.el (vc-cvs-checkin) - * man.el (Man-bgproc-sentinel, Man-goto-see-also-section) - * ibuffer.el (ibuffer-current-buffer) - * dired.el (dired-move-to-end-of-filename) + * allout.el (allout-write-file-hook-handler): + * textmodes/reftex.el (reftex-TeX-master-file): + * textmodes/org.el (org-paste-subtree): + * textmodes/ispell.el (ispell-process-line): + * progmodes/vhdl-mode.el (vhdl-template-modify): + * progmodes/idlw-shell.el (idlwave-shell-send-command) + (idlwave-shell-display-line) + * progmodes/ada-xref.el (ada-find-file, ada-get-all-references) + (ada-xref-find-in-modified-ali, ada-find-in-src-path): + * net/trampver.el (x): + * mail/uce.el (uce-reply-to-uce): + * mail/rmailout.el (rmail-output): + * mail/feedmail.el (feedmail-dump-message-to-queue): + * whitespace.el (whitespace-write-file-hook): + * wdired.el (wdired-check-kill-buffer): + * vc.el (vc-update): + * vc-mcvs.el (vc-mcvs-checkin): + * vc-cvs.el (vc-cvs-checkin): + * man.el (Man-bgproc-sentinel, Man-goto-see-also-section): + * ibuffer.el (ibuffer-current-buffer): + * dired.el (dired-move-to-end-of-filename): * bindings.el (complete-symbol): Fix buggy calls to `error'. - 2007-12-06 D. Goel - - * textmodes/org-publish.el (org-publish-file): Fix buggy call(s) to `error'. + * textmodes/org-publish.el (org-publish-file): + Fix buggy call(s) to `error'. (org-publish-current-project): Ditto. * textmodes/reftex-parse.el (reftex-short-context): Ditto. (reftex-short-context): Ditto. * textmodes/texinfmt.el: Ditto. - - 2007-12-06 Stefan Monnier * doc-view.el (doc-view-dvi->pdf-sentinel) From 65841dd8bc4abf68664eebeba7c625f118cd54a4 Mon Sep 17 00:00:00 2001 From: Juanma Barranquero Date: Thu, 6 Dec 2007 23:11:11 +0000 Subject: [PATCH 023/172] *** empty log message *** --- lib-src/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 2cc37d49dd4..36929ebc24a 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -17,7 +17,7 @@ 2007-11-22 Francesco Potort,Al(B - * etags.c (default_C_help) [CTAGS]: differentiate the help string, + * etags.c (default_C_help) [CTAGS]: Differentiate the help string, as the defaults in ctags are different from etags. 2007-11-15 Francesco Potort,Al(B From 7e5be5e349ec9f1dfe8c3b86926e0c1b63b047a3 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 04:28:30 +0000 Subject: [PATCH 024/172] Tidying. --- lisp/ChangeLog | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9f74b155c97..0c6e769ba04 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,10 +1,5 @@ 2007-12-06 D. Goel - * textmodes/ispell.el (ispell-process-line): - * vc.el (vc-update): - * ibuffer.el (ibuffer-current-buffer): - Fix breakage from the change below. - * allout.el (allout-write-file-hook-handler): * textmodes/reftex.el (reftex-TeX-master-file): * textmodes/org.el (org-paste-subtree): @@ -26,16 +21,11 @@ * man.el (Man-bgproc-sentinel, Man-goto-see-also-section): * ibuffer.el (ibuffer-current-buffer): * dired.el (dired-move-to-end-of-filename): - * bindings.el (complete-symbol): Fix buggy calls to `error'. - -2007-12-06 D. Goel - + * bindings.el (complete-symbol): * textmodes/org-publish.el (org-publish-file): - Fix buggy call(s) to `error'. - (org-publish-current-project): Ditto. - * textmodes/reftex-parse.el (reftex-short-context): Ditto. - (reftex-short-context): Ditto. - * textmodes/texinfmt.el: Ditto. + (org-publish-current-project): + * textmodes/reftex-parse.el (reftex-short-context): + * textmodes/texinfmt.el: Fix buggy calls to `error'. 2007-12-06 Stefan Monnier From e74d83ee49cac55f1833d8fba8d735a31a99daa4 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 04:33:41 +0000 Subject: [PATCH 025/172] Tidying. --- lisp/ChangeLog | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0c6e769ba04..a18c1835fd2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -6,7 +6,7 @@ * textmodes/ispell.el (ispell-process-line): * progmodes/vhdl-mode.el (vhdl-template-modify): * progmodes/idlw-shell.el (idlwave-shell-send-command) - (idlwave-shell-display-line) + (idlwave-shell-display-line): * progmodes/ada-xref.el (ada-find-file, ada-get-all-references) (ada-xref-find-in-modified-ali, ada-find-in-src-path): * net/trampver.el (x): @@ -87,7 +87,6 @@ event of a verification failure. 2007-12-05 Reiner Steib ->>>>>>> 1.12380 * net/tls.el (tls-program): Provide more custom choices from `tls-checktrust'. Refer to `tls-checktrust' in doc string. From 52da95fa969125d7fe867b48dda8d80f2cc95660 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 7 Dec 2007 04:40:28 +0000 Subject: [PATCH 026/172] * dbusbind.c (Fdbus_get_unique_name, xd_read_message) (Fdbus_register_signal): Use DBUS_MAXIMUM_NAME_LENGTH and DBUS_MAXIMUM_MATCH_RULE_LENGTH for string lengths. (Fdbus_call_method, Fdbus_send_signal, Fdbus_register_signal): Unify argument lists. (xd_read_message, Fdbus_register_signal) Reorder and extend event arguments and hash table keys. Use unique name for service. (Fdbus_unregister_signal): Remove checks. (Vdbus_registered_functions_table): Fix doc string. --- src/ChangeLog | 12 +++++ src/dbusbind.c | 135 ++++++++++++++++++++++++++----------------------- 2 files changed, 85 insertions(+), 62 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index f55e4ac786c..962c95dbdf2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2007-12-07 Michael Albinus + + * dbusbind.c (Fdbus_get_unique_name, xd_read_message) + (Fdbus_register_signal): Use DBUS_MAXIMUM_NAME_LENGTH and + DBUS_MAXIMUM_MATCH_RULE_LENGTH for string lengths. + (Fdbus_call_method, Fdbus_send_signal, Fdbus_register_signal): + Unify argument lists. + (xd_read_message, Fdbus_register_signal) Reorder and extend event + arguments and hash table keys. Use unique name for service. + (Fdbus_unregister_signal): Remove checks. + (Vdbus_registered_functions_table): Fix doc string. + 2007-12-05 Magnus Henoch * process.c (make_process): Initialize pty_flag to 0. diff --git a/src/dbusbind.c b/src/dbusbind.c index 07fc24243d7..73b538cf599 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -241,7 +241,7 @@ DEFUN ("dbus-get-unique-name", Fdbus_get_unique_name, Sdbus_get_unique_name, Lisp_Object bus; { DBusConnection *connection; - char name[1024]; + char name[DBUS_MAXIMUM_NAME_LENGTH]; /* Check parameters. */ CHECK_SYMBOL (bus); @@ -287,8 +287,8 @@ are converted into a list of Lisp objects which correspond to the elements of the D-Bus container. Example: \(dbus-call-method - :session "GetKeyField" "org.gnome.seahorse" - "/org/gnome/seahorse/keys/openpgp" "org.gnome.seahorse.Keys" + :session "org.gnome.seahorse" "/org/gnome/seahorse/keys/openpgp" + "org.gnome.seahorse.Keys" "GetKeyField" "openpgp:657984B8C7A966DD" "simple-name") => (t ("Philip R. Zimmermann")) @@ -297,18 +297,18 @@ If the result of the METHOD call is just one value, the converted Lisp object is returned instead of a list containing this single Lisp object. \(dbus-call-method - :system "GetPropertyString" "org.freedesktop.Hal" - "/org/freedesktop/Hal/devices/computer" "org.freedesktop.Hal.Device" + :system "org.freedesktop.Hal" "/org/freedesktop/Hal/devices/computer" + "org.freedesktop.Hal.Device" "GetPropertyString" "system.kernel.machine") => "i686" -usage: (dbus-call-method BUS METHOD SERVICE PATH INTERFACE &rest ARGS) */) +usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &rest ARGS) */) (nargs, args) int nargs; register Lisp_Object *args; { - Lisp_Object bus, method, service, path, interface; + Lisp_Object bus, service, path, interface, method; Lisp_Object result; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; DBusConnection *connection; @@ -322,23 +322,23 @@ usage: (dbus-call-method BUS METHOD SERVICE PATH INTERFACE &rest ARGS) */) /* Check parameters. */ bus = args[0]; - method = args[1]; - service = args[2]; - path = args[3]; - interface = args[4]; + service = args[1]; + path = args[2]; + interface = args[3]; + method = args[4]; CHECK_SYMBOL (bus); - CHECK_STRING (method); CHECK_STRING (service); CHECK_STRING (path); CHECK_STRING (interface); - GCPRO5 (bus, method, service, path, interface); + CHECK_STRING (method); + GCPRO5 (bus, service, path, interface, method); XD_DEBUG_MESSAGE ("%s %s %s %s", - SDATA (method), SDATA (service), SDATA (path), - SDATA (interface)); + SDATA (interface), + SDATA (method)); /* Open a connection to the bus. */ connection = xd_initialize (bus); @@ -447,14 +447,15 @@ Other Lisp objects are not supported as arguments of SIGNAL. Example: \(dbus-send-signal - :session "Started" "org.gnu.emacs" "/org/gnu/emacs" "org.gnu.emacs"))) + :session "org.gnu.Emacs" "/org/gnu/Emacs" + "org.gnu.Emacs.FileManager" "FileModified" "/home/albinus/.emacs") -usage: (dbus-send-signal BUS SIGNAL SERVICE PATH INTERFACE &rest ARGS) */) +usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */) (nargs, args) int nargs; register Lisp_Object *args; { - Lisp_Object bus, signal, service, path, interface; + Lisp_Object bus, service, path, interface, signal; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; DBusConnection *connection; DBusMessage *dmessage; @@ -464,23 +465,23 @@ usage: (dbus-send-signal BUS SIGNAL SERVICE PATH INTERFACE &rest ARGS) */) /* Check parameters. */ bus = args[0]; - signal = args[1]; - service = args[2]; - path = args[3]; - interface = args[4]; + service = args[1]; + path = args[2]; + interface = args[3]; + signal = args[4]; CHECK_SYMBOL (bus); - CHECK_STRING (signal); CHECK_STRING (service); CHECK_STRING (path); CHECK_STRING (interface); - GCPRO5 (bus, signal, service, path, interface); + CHECK_STRING (signal); + GCPRO5 (bus, service, path, interface, signal); XD_DEBUG_MESSAGE ("%s %s %s %s", - SDATA (signal), SDATA (service), SDATA (path), - SDATA (interface)); + SDATA (interface), + SDATA (signal)); /* Open a connection to the bus. */ connection = xd_initialize (bus); @@ -549,7 +550,10 @@ xd_read_message (bus) DBusMessage *dmessage; DBusMessageIter iter; uint dtype; - char service[1024], path[1024], interface[1024], member[1024]; + char service[DBUS_MAXIMUM_NAME_LENGTH]; + char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */ + char interface[DBUS_MAXIMUM_NAME_LENGTH]; + char member[DBUS_MAXIMUM_NAME_LENGTH]; /* Open a connection to the bus. */ connection = xd_initialize (bus); @@ -590,14 +594,23 @@ xd_read_message (bus) /* The arguments are stored in reverse order. Reorder them. */ event.arg = Fnreverse (event.arg); - /* Read service, object path interface and member from the - message. */ + /* Read service, object path, interface and member from the message. + The service is always the unique name of the sending object. */ strcpy (service, dbus_message_get_sender (dmessage)); strcpy (path, dbus_message_get_path (dmessage)); strcpy (interface, dbus_message_get_interface (dmessage)); strcpy (member, dbus_message_get_member (dmessage)); - /* Add them to the event. */ + /* Add the registered function of the message. */ + key = list5 (bus, + (service == NULL ? Qnil : build_string (service)), + (path == NULL ? Qnil : build_string (path)), + (interface == NULL ? Qnil : build_string (interface)), + (member == NULL ? Qnil : build_string (member))); + event.arg = Fcons (Fgethash (key, Vdbus_registered_functions_table, Qnil), + event.arg); + + /* Add service, path, interface and member to the event. */ event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), event.arg); event.arg = Fcons ((interface == NULL ? Qnil : build_string (interface)), @@ -610,13 +623,6 @@ xd_read_message (bus) /* Add the bus symbol to the event. */ event.arg = Fcons (bus, event.arg); - /* Add the registered function of the message. */ - key = list3 (bus, - (interface == NULL ? Qnil : build_string (interface)), - (member == NULL ? Qnil : build_string (member))); - event.arg = Fcons (Fgethash (key, Vdbus_registered_functions_table, Qnil), - event.arg); - /* Store it into the input event queue. */ kbd_buffer_store_event (&event); @@ -666,31 +672,41 @@ SIGNAL and HANDLER must not be nil. Example: (message "Device %s added" device)) \(dbus-register-signal - :system "DeviceAdded" - (dbus-get-name-owner :system "org.freedesktop.Hal") - "/org/freedesktop/Hal/Manager" "org.freedesktop.Hal.Manager" - 'my-signal-handler) + :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager" + "org.freedesktop.Hal.Manager" "DeviceAdded" 'my-signal-handler) - => (:system "org.freedesktop.Hal.Manager" "DeviceAdded") + => (:system ":1.3" "/org/freedesktop/Hal/Manager" + "org.freedesktop.Hal.Manager" "DeviceAdded") `dbus-register-signal' returns an object, which can be used in `dbus-unregister-signal' for removing the registration. */) - (bus, signal, service, path, interface, handler) - Lisp_Object bus, signal, service, path, interface, handler; + (bus, service, path, interface, signal, handler) + Lisp_Object bus, service, path, interface, signal, handler; { - Lisp_Object key; + Lisp_Object unique_name, key; DBusConnection *connection; - char rule[1024]; + char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; DBusError derror; /* Check parameters. */ CHECK_SYMBOL (bus); - CHECK_STRING (signal); if (!NILP (service)) CHECK_STRING (service); if (!NILP (path)) CHECK_STRING (path); CHECK_STRING (interface); + CHECK_STRING (signal); CHECK_SYMBOL (handler); + /* Retrieve unique name of service. If service is a known name, we + will register for the corresponding unique name, if any. Signals + are sent always with the unique name as sender. Note: the unique + name of "org.freedesktop.DBus" is that string itself. */ + if ((!NILP (service)) && + (strcmp (SDATA (service), DBUS_SERVICE_DBUS) != 0) && + (strncmp (SDATA (service), ":", 1) != 0)) + unique_name = call2 (intern ("dbus-get-name-owner"), bus, service); + else + unique_name = service; + /* Open a connection to the bus. */ connection = xd_initialize (bus); @@ -700,9 +716,9 @@ SIGNAL and HANDLER must not be nil. Example: SDATA (interface), SDATA (signal)); - /* Add service and path to the rule if they are non-nil. */ - if (!NILP (service)) - sprintf (rule, "%s,sender='%s'%", rule, SDATA (service)); + /* Add unique name and path to the rule if they are non-nil. */ + if (!NILP (unique_name)) + sprintf (rule, "%s,sender='%s'%", rule, SDATA (unique_name)); if (!NILP (path)) sprintf (rule, "%s,path='%s'", rule, SDATA (path)); @@ -716,7 +732,7 @@ SIGNAL and HANDLER must not be nil. Example: XD_DEBUG_MESSAGE ("Matching rule \"%s\" created", rule); /* Create a hash table entry. */ - key = list3 (bus, interface, signal); + key = list5 (bus, unique_name, path, interface, signal); Fputhash (key, handler, Vdbus_registered_functions_table); XD_DEBUG_MESSAGE ("\"%s\" registered with handler \"%s\"", SDATA (format2 ("%s", key, Qnil)), @@ -734,13 +750,6 @@ OBJECT must be the result of a preceding `dbus-register-signal' call. */) Lisp_Object object; { - /* Check parameters. */ - CHECK_SYMBOL (object); - - XD_DEBUG_MESSAGE ("\"%s\" unregistered with handler \"%s\"", - SDATA (format2 ("%s", object, Qnil)), - SDATA (format2 ("%s", Fsymbol_function (object), Qnil))); - /* Unintern the signal symbol. */ Fremhash (object, Vdbus_registered_functions_table); @@ -788,10 +797,12 @@ syms_of_dbusbind () DEFVAR_LISP ("dbus-registered-functions-table", &Vdbus_registered_functions_table, doc: /* Hash table of registered functions for D-Bus. -The key in the hash table is the list (BUS INTERFACE MEMBER). BUS is -either the symbol `:system' or the symbol `:session'. INTERFACE is a -string which denotes a D-Bus interface, and MEMBER, also a string, is -either a method or a signal INTERFACE is offering. +The key in the hash table is the list (BUS SERVICE PATH MEMBER INTERFACE). +BUS is either the symbol `:system' or the symbol `:session'. SERVICE +and PATH are the unique name and the object path of the sending object. +INTERFACE is a string which denotes a D-Bus interface, and MEMBER, +also a string, is either a method or a signal INTERFACE is offering. +All arguments but BUS can be nil, which means a wild card then. The value in the hash table a the function to be called when a D-Bus message, which matches the key criteria, arrives. */); From 0ce574ef771abdc3441ca9d50074ad9cb8b5efb7 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 7 Dec 2007 04:42:00 +0000 Subject: [PATCH 027/172] * dbus.texi (Synchronous Methods): Adapt dbus-call-method. (Signals): Adapt dbus-send-signal and dbus-register-signal. (Errors and Events): Adapt dbus-event. --- doc/misc/ChangeLog | 6 ++++++ doc/misc/dbus.texi | 47 ++++++++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 61fd28a0622..89e4974490d 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,9 @@ +2007-12-07 Michael Albinus + + * dbus.texi (Synchronous Methods): Adapt dbus-call-method. + (Signals): Adapt dbus-send-signal and dbus-register-signal. + (Errors and Events): Adapt dbus-event. + 2007-12-03 Lars Magne Ingebrigtsen * gnus.texi (Other Files): Add the yenc command. diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi index 14ceea37d1d..b5c8ce3efb1 100644 --- a/doc/misc/dbus.texi +++ b/doc/misc/dbus.texi @@ -318,7 +318,7 @@ which carries the input parameters to the object owning the method to be called, and a reply message returning the resulting output parameters from the object. -@defun dbus-call-method bus method service path interface &rest args +@defun dbus-call-method bus service path interface method &rest args This function calls @var{method} on the D-Bus @var{bus}. @var{bus} is either the symbol @code{:system} or the symbol @code{:session}. @@ -336,8 +336,8 @@ Lisp objects, according to the type conversion rules described in @example (dbus-call-method - :session "GetKeyField" "org.gnome.seahorse" - "/org/gnome/seahorse/keys/openpgp" "org.gnome.seahorse.Keys" + :session "org.gnome.seahorse" "/org/gnome/seahorse/keys/openpgp" + "org.gnome.seahorse.Keys" "GetKeyField" "openpgp:657984B8C7A966DD" "simple-name") @result{} (t ("Philip R. Zimmermann")) @@ -349,8 +349,9 @@ object. Example: @example (dbus-call-method - :system "GetPropertyString" "org.freedesktop.Hal" - "/org/freedesktop/Hal/devices/computer" "org.freedesktop.Hal.Device" + :system "org.freedesktop.Hal" + "/org/freedesktop/Hal/devices/computer" + "org.freedesktop.Hal.Device" "GetPropertyString" "system.kernel.machine") @result{} "i686" @@ -368,14 +369,14 @@ emulate the @code{lshal} command on GNU/Linux systems: @example (dolist (device (dbus-call-method - :system "GetAllDevices" "org.freedesktop.Hal" + :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager" - "org.freedesktop.Hal.Manager")) + "org.freedesktop.Hal.Manager" "GetAllDevices")) (message "\nudi = %s" device) (dolist (properties (dbus-call-method - :system "GetAllProperties" "org.freedesktop.Hal" - device "org.freedesktop.Hal.Device")) + :system "org.freedesktop.Hal" device + "org.freedesktop.Hal.Device" "GetAllProperties")) (message " %s = %S" (car properties) (or (caar (cdr properties)) "")))) @@ -406,7 +407,7 @@ emulate the @code{lshal} command on GNU/Linux systems: Signals are broadcast messages. They carry input parameters, which are received by all objects which have registered for such a signal. -@defun dbus-send-signal bus signal service path interface &rest args +@defun dbus-send-signal bus service path interface signal &rest args This function is similar to @code{dbus-call-method}. The difference is, that there are no returning output parameters. @@ -425,12 +426,12 @@ Conversion}. Example: @example (dbus-send-signal - :session "FileModified" "org.gnu.Emacs" "/org/gnu/Emacs" - "org.gnu.Emacs.FileManager" "/home/albinus/.emacs") + :session "org.gnu.Emacs" "/org/gnu/Emacs" + "org.gnu.Emacs.FileManager" "FileModified" "/home/albinus/.emacs") @end example @end defun -@defun dbus-register-signal bus signal service path interface handler +@defun dbus-register-signal bus service path interface signal handler With this function, an application registers for @var{signal} on the D-Bus @var{bus}. @@ -461,13 +462,15 @@ received. It must accept as arguments the output parameters (defun my-dbus-signal-handler (device) (message "Device %s added" device)) +@result{} my-dbus-signal-handler + (dbus-register-signal - :system "DeviceAdded" - (dbus-get-name-owner :system "org.freedesktop.Hal") - "/org/freedesktop/Hal/Manager" "org.freedesktop.Hal.Manager" + :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager" + "org.freedesktop.Hal.Manager" "DeviceAdded" 'my-dbus-signal-handler) -@result{} (:system "org.freedesktop.Hal.Manager" "DeviceAdded") +@result{} (:system ":1.3" "/org/freedesktop/Hal/Manager" + "org.freedesktop.Hal.Manager" "DeviceAdded") @end example As we know from the inspection data of interface @@ -503,13 +506,9 @@ Incoming D-Bus messages are handled as Emacs events (see @pxref{Misc Events, , , elisp}). The generated event has this form: @example -(dbus-event @var{handler} @var{bus} @var{service} @var{path} @var{interface} @var{member} &rest @var{args}) +(dbus-event @var{bus} @var{service} @var{path} @var{interface} @var{member} @var{handler} &rest @var{args}) @end example -@var{handler} is the callback function which has been registered for -this signal (see @pxref{Signals}). When a @code{dbus-event} event -arrives, @var{handler} is called with @var{args} as arguments. - @var{bus} identifies the D-Bus the signal is coming from. It is either the symbol @code{:system} or the symbol @code{:session}. @@ -517,6 +516,10 @@ either the symbol @code{:system} or the symbol @code{:session}. of the D-Bus object emitting the signal. @var{interface} and @var{member} denote the signal which has been sent. +@var{handler} is the callback function which has been registered for +this signal (see @pxref{Signals}). When a @code{dbus-event} event +arrives, @var{handler} is called with @var{args} as arguments. + In order to inspect the @code{dbus-event} data, you could extend the definition of the callback function in @ref{Signals}: From ef6ce14cc0b707c9166dcb23d7f9103e9ad738cb Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 7 Dec 2007 04:47:19 +0000 Subject: [PATCH 028/172] * net/dbus.el (dbus-hash-table=): Fix for new hash table key structure. (dbus-list-hash-table, dbus-name-owner-changed-handler): New defuns. (dbus-check-event, dbus-handle-event, dbus-event-bus-name) (dbus-event-service-name, dbus-event-path-name) (dbus-event-interface-name, dbus-event-member-name): Fix for new event structure. (dbus-list-activatable-names, dbus-list-names) (dbus-list-queued-owners, dbus-get-name-owner, dbus-introspect): Reorder `dbus-call-method' arguments. --- lisp/ChangeLog | 14 +++++ lisp/net/dbus.el | 138 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 110 insertions(+), 42 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a18c1835fd2..010b7122079 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,17 @@ +2007-12-07 Michael Albinus + + * net/dbus.el (dbus-hash-table=): Fix for new hash table key + structure. + (dbus-list-hash-table, dbus-name-owner-changed-handler): New + defuns. + (dbus-check-event, dbus-handle-event, dbus-event-bus-name) + (dbus-event-service-name, dbus-event-path-name) + (dbus-event-interface-name, dbus-event-member-name): Fix for new + event structure. + (dbus-list-activatable-names, dbus-list-names) + (dbus-list-queued-owners, dbus-get-name-owner, dbus-introspect): + Reorder `dbus-call-method' arguments. + 2007-12-06 D. Goel * allout.el (allout-write-file-hook-handler): diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el index 9221c52a082..b0f01c24d41 100644 --- a/lisp/net/dbus.el +++ b/lisp/net/dbus.el @@ -53,29 +53,82 @@ "Compares keys X and Y in the hash table of registered functions for D-Bus. See `dbus-registered-functions-table' for a description of the hash table." (and - (listp x) (listp y) ;; Bus symbol, either :system or :session. - (symbolp (car x)) (symbolp (car y)) (equal (car x) (car y)) - ;; Interface. + (equal (car x) (car y)) + ;; Service. (or - (null (cadr x)) (null (cadr y)) ; wildcard - (and - (stringp (cadr x)) (stringp (cadr y)) (string-equal (cadr x) (cadr y)))) + (null (nth 1 x)) (null (nth 1 y)) ; wildcard + (string-equal (nth 1 x) (nth 1 y))) + ;; Path. + (or + (null (nth 2 x)) (null (nth 2 y)) ; wildcard + (string-equal (nth 2 x) (nth 2 y))) ;; Member. (or - (null (caddr x)) (null (caddr y)) ; wildcard - (and - (stringp (caddr x)) (stringp (caddr y)) - (string-equal (caddr x) (caddr y)))))) + (null (nth 3 x)) (null (nth 3 y)) ; wildcard + (string-equal (nth 3 x) (nth 3 y))) + ;; Interface. + (or + (null (nth 4 x)) (null (nth 4 y)) ; wildcard + (string-equal (nth 4 x) (nth 4 y))))) (define-hash-table-test 'dbus-hash-table-test 'dbus-hash-table= 'sxhash) -;; When we assume that interface and and member are always strings in -;; the key, we could use `equal' as test function. But we want to -;; have also `nil' there, being a wildcard. +;; When we assume that service, path, interface and and member are +;; always strings in the key, we could use `equal' as test function. +;; But we want to have also `nil' there, being a wildcard. (setq dbus-registered-functions-table (make-hash-table :test 'dbus-hash-table-test)) +(defun dbus-list-hash-table () + "Returns all registered signal registrations to D-Bus. +The return value is a list, with elements of kind (KEY . VALUE). +See `dbus-registered-functions-table' for a description of the +hash table." + (let (result) + (maphash + '(lambda (key value) (add-to-list 'result (cons key value) 'append)) + dbus-registered-functions-table) + result)) + +(defun dbus-name-owner-changed-handler (service old-owner new-owner) + "Reapplies all signal registrations to D-Bus. +This handler is applied when a \"NameOwnerChanged\" signal has +arrived. SERVICE is the object name for which the name owner has +been changed. OLD-OWNER is the previous owner of SERVICE, or the +empty string if SERVICE was not owned yet. NEW-OWNER is the new +owner of SERVICE, or the empty string if SERVICE looses any name owner." + (save-match-data + ;; Check whether SERVICE is a known name, and OLD-OWNER and + ;; NEW-OWNER are defined. + (when (and (stringp service) (not (string-match "^:" service)) + (not (zerop (length old-owner))) + (not (zerop (length new-owner)))) + (let ((bus (dbus-event-bus-name last-input-event))) + (maphash + '(lambda (key value) + ;; Check for matching bus and service name. + (when (and (equal bus (car key)) + (string-equal old-owner (nth 1 key))) + ;; Remove old key, and add new entry with changed name. + (when dbus-debug (message "Remove rule for %s" key)) + (dbus-unregister-signal key) + (setcar (nthcdr 1 key) new-owner) + (when dbus-debug (message "Add rule for %s" key)) + (apply 'dbus-register-signal (append key (list value))))) + (copy-hash-table dbus-registered-functions-table)))))) + +;; Register the handler. +(condition-case nil + (progn + (dbus-register-signal + :system dbus-service-dbus dbus-path-dbus dbus-interface-dbus + "NameOwnerChanged" 'dbus-name-owner-changed-handler) + (dbus-register-signal + :session dbus-service-dbus dbus-path-dbus dbus-interface-dbus + "NameOwnerChanged" 'dbus-name-owner-changed-handler)) + (dbus-error)) + ;;; D-Bus events. @@ -83,33 +136,34 @@ See `dbus-registered-functions-table' for a description of the hash table." "Checks whether EVENT is a well formed D-Bus event. EVENT is a list which starts with symbol `dbus-event': - (dbus-event HANDLER BUS SERVICE PATH INTERFACE MEMBER &rest ARGS) + (dbus-event BUS SERVICE PATH INTERFACE MEMBER HANDLER &rest ARGS) -HANDLER is the function which has been registered for this -signal. BUS identifies the D-Bus the signal is coming from. It -is either the symbol `:system' or the symbol `:session'. SERVICE -and PATH are the name and the object path of the D-Bus object +BUS identifies the D-Bus the signal is coming from. It is either +the symbol `:system' or the symbol `:session'. SERVICE and PATH +are the unique name and the object path of the D-Bus object emitting the signal. INTERFACE and MEMBER denote the signal -which has been sent. ARGS are the arguments passed to HANDLER, -when it is called during event handling in `dbus-handle-event'. +which has been sent. HANDLER is the function which has been +registered for this signal. ARGS are the arguments passed to +HANDLER, when it is called during event handling in +`dbus-handle-event'. This function raises a `dbus-error' signal in case the event is not well formed." (when dbus-debug (message "DBus-Event %s" event)) (unless (and (listp event) (eq (car event) 'dbus-event) - ;; Handler. - (functionp (nth 1 event)) ;; Bus symbol. - (symbolp (nth 2 event)) + (symbolp (nth 1 event)) ;; Service. - (stringp (nth 3 event)) + (stringp (nth 2 event)) ;; Object path. - (stringp (nth 4 event)) + (stringp (nth 3 event)) ;; Interface. - (stringp (nth 5 event)) + (stringp (nth 4 event)) ;; Member. - (stringp (nth 6 event))) + (stringp (nth 5 event)) + ;; Handler. + (functionp (nth 6 event))) (signal 'dbus-error (list "Not a valid D-Bus event" event)))) ;;;###autoload @@ -123,7 +177,7 @@ part of the event, is called with arguments ARGS." (condition-case nil (progn (dbus-check-event event) - (apply (cadr event) (nthcdr 7 event))) + (apply (nth 6 event) (nthcdr 7 event))) (dbus-error))) (defun dbus-event-bus-name (event) @@ -133,7 +187,7 @@ EVENT is a D-Bus event, see `dbus-check-event'. This function raises a `dbus-error' signal in case the event is not well formed." (dbus-check-event event) - (nth 2 event)) + (nth 1 event)) (defun dbus-event-service-name (event) "Return the name of the D-Bus object the event is coming from. @@ -141,7 +195,7 @@ The result is a string. EVENT is a D-Bus event, see `dbus-check-event'. This function raises a `dbus-error' signal in case the event is not well formed." (dbus-check-event event) - (nth 3 event)) + (nth 2 event)) (defun dbus-event-path-name (event) "Return the object path of the D-Bus object the event is coming from. @@ -149,7 +203,7 @@ The result is a string. EVENT is a D-Bus event, see `dbus-check-event'. This function raises a `dbus-error' signal in case the event is not well formed." (dbus-check-event event) - (nth 4 event)) + (nth 3 event)) (defun dbus-event-interface-name (event) "Return the interface name of the D-Bus object the event is coming from. @@ -157,7 +211,7 @@ The result is a string. EVENT is a D-Bus event, see `dbus-check-event'. This function raises a `dbus-error' signal in case the event is not well formed." (dbus-check-event event) - (nth 5 event)) + (nth 4 event)) (defun dbus-event-member-name (event) "Return the member name the event is coming from. @@ -166,7 +220,7 @@ string. EVENT is a D-Bus event, see `dbus-check-event'. This function raises a `dbus-error' signal in case the event is not well formed." (dbus-check-event event) - (nth 6 event)) + (nth 5 event)) ;;; D-Bus registered names. @@ -177,8 +231,8 @@ The result is a list of strings, which is nil when there are no activatable service names at all." (condition-case nil (dbus-call-method - :system "ListActivatableNames" dbus-service-dbus - dbus-path-dbus dbus-interface-dbus) + :system dbus-service-dbus + dbus-path-dbus dbus-interface-dbus "ListActivatableNames") (dbus-error))) (defun dbus-list-names (bus) @@ -189,7 +243,7 @@ registered service names at all. Well known names are strings like for services." (condition-case nil (dbus-call-method - bus "ListNames" dbus-service-dbus dbus-path-dbus dbus-interface-dbus) + bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus "ListNames") (dbus-error))) (defun dbus-list-known-names (bus) @@ -206,8 +260,8 @@ The result is a list of strings, or nil when there are no queued name owners service names at all." (condition-case nil (dbus-call-method - bus "ListQueuedOwners" dbus-service-dbus - dbus-path-dbus dbus-interface-dbus service) + bus dbus-service-dbus dbus-path-dbus + dbus-interface-dbus "ListQueuedOwners" service) (dbus-error))) (defun dbus-get-name-owner (bus service) @@ -215,8 +269,8 @@ owners service names at all." The result is either a string, or nil if there is no name owner." (condition-case nil (dbus-call-method - bus "GetNameOwner" dbus-service-dbus - dbus-path-dbus dbus-interface-dbus service) + bus dbus-service-dbus dbus-path-dbus + dbus-interface-dbus "GetNameOwner" service) (dbus-error))) (defun dbus-introspect (bus service path) @@ -227,10 +281,10 @@ Example: \(dbus-introspect :system \"org.freedesktop.Hal\" - \"/org/freedesktop/Hal/devices/computer\"))" + \"/org/freedesktop/Hal/devices/computer\")" (condition-case nil (dbus-call-method - bus "Introspect" service path dbus-interface-introspectable) + bus service path dbus-interface-introspectable "Introspect") (dbus-error))) (if nil ;; Must be reworked. Shall we offer D-Bus signatures at all? From d14ceb1592fadef9b381f92eaefa05935d543700 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 05:17:08 +0000 Subject: [PATCH 029/172] (allout-write-file-hook-handler): Revert previous change. --- lisp/allout.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/allout.el b/lisp/allout.el index c0175032bd8..8878c56735f 100644 --- a/lisp/allout.el +++ b/lisp/allout.el @@ -1501,7 +1501,7 @@ See `allout-encryption-ciphertext-rejection-regexps' for rejection reasons.") (condition-case failure (setq allout-after-save-decrypt (allout-encrypt-decrypted except-mark)) - (error "%s" (progn + (error (progn (message "allout-write-file-hook-handler suppressing error %s" failure) From a601fb745a8260e473870a3b31126416353ad377 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 05:20:43 +0000 Subject: [PATCH 030/172] (article-make-date-line): Revert previous change. --- lisp/gnus/ChangeLog | 11 +++++------ lisp/gnus/gnus-art.el | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index d448f305cd0..537fecb3ffd 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,17 +1,16 @@ -2007-12-06 D. Goel +2007-12-07 Glenn Morris - * gnus-start.el (gnus-load): Fix breakage from last change. + * gnus-art.el (article-make-date-line): Revert previous change. 2007-12-06 Reiner Steib * gnus-start.el (gnus-load): Rename local variable to avoid confusion. 2007-12-06 D. Goel - * gnus-start.el (gnus-load): Fix breakage from last change. - * gnus-art.el (article-make-date-line): Fix buggy call to `error'. - * gnus-start.el (gnus-load): Ditto. - * pop3.el (pop3-read-response): Ditto. + * gnus-art.el (article-make-date-line): + * gnus-start.el (gnus-load): + * pop3.el (pop3-read-response): Fix buggy call to `error'. 2007-12-05 Katsumi Yamaoka diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 5e23b5313fc..4bb9ceb97ba 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -3402,7 +3402,7 @@ should replace the \"Date:\" one, or should be added below it." ":" (format "%02d" (nth 1 dtime))))))) (error - "Date: %s (from Gnus)" date))) + (format "Date: %s (from Gnus)" date)))) (defun article-date-local (&optional highlight) "Convert the current article date to the local timezone." From de74083d8b43fac4c058e576f2a7188db4289f04 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 05:22:29 +0000 Subject: [PATCH 031/172] (reftex-TeX-master-file): Revert previous change. --- lisp/textmodes/reftex.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el index 47482916efb..5383d88c386 100644 --- a/lisp/textmodes/reftex.el +++ b/lisp/textmodes/reftex.el @@ -705,7 +705,7 @@ on the menu bar. ((fboundp 'TeX-master-file) ; AUCTeX is loaded. Use its mechanism. (condition-case nil (TeX-master-file t) - (error "%s" (buffer-file-name)))) + (error (buffer-file-name)))) ((fboundp 'tex-main-file) (tex-main-file)) ; Emacs LaTeX mode ((boundp 'TeX-master) ; The variable is defined - lets use it. (cond From 19b6cf18173806a6607726599a4bf6a606f0b7c7 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 05:25:04 +0000 Subject: [PATCH 032/172] (reftex-short-context): Revert previous change. --- lisp/ChangeLog | 7 +++++++ lisp/textmodes/reftex-parse.el | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 010b7122079..b7579cd4c4a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2007-12-07 Glenn Morris + + * allout.el (allout-write-file-hook-handler): + * textmodes/reftex.el (reftex-TeX-master-file): + * textmodes/reftex-parse.el (reftex-short-context): + Revert previous change. + 2007-12-07 Michael Albinus * net/dbus.el (dbus-hash-table=): Fix for new hash table key diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el index c6c4b33d053..b6b85b8f7d3 100644 --- a/lisp/textmodes/reftex-parse.el +++ b/lisp/textmodes/reftex-parse.el @@ -544,7 +544,7 @@ of master file." (save-excursion (condition-case error-var (funcall parse env) - (error "HOOK ERROR: %s" (cdr error-var))))) + (error (format "HOOK ERROR: %s" (cdr error-var)))))) (t "INVALID VALUE OF PARSE")))) From d3968b9a74ace556f5f70b9bb6559f269690860c Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 7 Dec 2007 08:01:28 +0000 Subject: [PATCH 033/172] Remove reverted change. --- lisp/ChangeLog | 1 - 1 file changed, 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b7579cd4c4a..1424867caff 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -24,7 +24,6 @@ * allout.el (allout-write-file-hook-handler): * textmodes/reftex.el (reftex-TeX-master-file): * textmodes/org.el (org-paste-subtree): - * textmodes/ispell.el (ispell-process-line): * progmodes/vhdl-mode.el (vhdl-template-modify): * progmodes/idlw-shell.el (idlwave-shell-send-command) (idlwave-shell-display-line): From 3d587afd35bfdad13523d7b856d8d054e5826a4d Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Fri, 7 Dec 2007 11:05:08 +0000 Subject: [PATCH 034/172] (quail-map-from-table): Allow a tone just after a consonant. --- leim/ChangeLog | 5 +++++ leim/quail/lao.el | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/leim/ChangeLog b/leim/ChangeLog index 69351db078b..1c14d412ec3 100644 --- a/leim/ChangeLog +++ b/leim/ChangeLog @@ -1,3 +1,8 @@ +2007-12-07 Kenichi Handa + + * quail/lao.el (quail-map-from-table): Allow a tone just after a + consonant. + 2007-11-17 Glenn Morris * Makefile.in (check-declare): New target. diff --git a/leim/quail/lao.el b/leim/quail/lao.el index b9a2dd9bf9b..d6e1758b0dc 100644 --- a/leim/quail/lao.el +++ b/leim/quail/lao.el @@ -206,8 +206,9 @@ you need to re-load it to properly re-initialize related alists.") lao-tone-key-alist lao-other-key-alist) (svt-state (lao-semivowel-key-alist . v-state) - (lao-vowel-key-alist . t-state) - lao-voweltone-key-alist) + (lao-vowel-key-alist . t-state) + lao-voweltone-key-alist + lao-tone-key-alist) (v-state (lao-vowel-key-alist . t-state)) (t-state lao-tone-key-alist)))) From a867ead0d05d7809c12f15704f65431ce8a7aaee Mon Sep 17 00:00:00 2001 From: Deepak Goel Date: Sat, 8 Dec 2007 00:57:23 +0000 Subject: [PATCH 035/172] Improves calls to `error', per mail from RMS. --- lisp/ChangeLog | 10 ++++++++++ lisp/mail/feedmail.el | 2 +- lisp/mail/uce.el | 2 +- lisp/progmodes/ada-xref.el | 14 ++++++-------- lisp/progmodes/idlw-shell.el | 2 +- lisp/progmodes/vhdl-mode.el | 5 +++-- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1424867caff..5d2c39d3552 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2007-12-07 D. Goel + + * progmodes/idlw-shell.el (idlwave-shell-display-line) + * progmodes/ada-xref.el (ada-find-file, ada-get-all-references) + (ada-xref-find-in-modified-ali, ada-find-in-src-path) + * mail/uce.el (uce-reply-to-uce) + * progmodes/vhdl-mode.el (vhdl-template-modify) + * mail/feedmail.el (feedmail-dump-message-to-queue): Improve calls + to `error' (as suggested by RMS.) + 2007-12-07 Glenn Morris * allout.el (allout-write-file-hook-handler): diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el index 7fb40baa7c8..ab8611424db 100644 --- a/lisp/mail/feedmail.el +++ b/lisp/mail/feedmail.el @@ -1922,7 +1922,7 @@ mapped to mostly alphanumerics for safety." ;; progn to get nil result no matter what (progn (make-directory queue-directory t) nil) (file-accessible-directory-p queue-directory) - (error "%s" (concat "FQM: Message not queued; trouble with directory " queue-directory))) + (error "FQM: Message not queued; trouble with directory %s" queue-directory)) (let ((filename) (is-fqm) (is-in-this-dir) diff --git a/lisp/mail/uce.el b/lisp/mail/uce.el index 54933993068..094cb03f861 100644 --- a/lisp/mail/uce.el +++ b/lisp/mail/uce.el @@ -239,7 +239,7 @@ address, and postmaster of the mail relay used." (full-header-p (and (eq uce-mail-reader 'rmail) (not (rmail-msg-is-pruned))))) (or (get-buffer message-buffer) - (error "%s" (concat "No buffer " message-buffer ", cannot find UCE"))) + (error "No buffer %s, cannot find UCE" message-buffer)) (switch-to-buffer message-buffer) ;; We need the message with headers pruned. (if full-header-p diff --git a/lisp/progmodes/ada-xref.el b/lisp/progmodes/ada-xref.el index a92705f92fa..00be89553a7 100644 --- a/lisp/progmodes/ada-xref.el +++ b/lisp/progmodes/ada-xref.el @@ -564,7 +564,7 @@ Completion is available." (let ((file (ada-find-src-file-in-dir filename))) (if file (find-file file) - (error "%s" (concat filename " not found in src_dir"))))) + (error "%s not found in src_dir" filename)))) ;; ----- Utilities ------------------------------------------------- @@ -1722,8 +1722,8 @@ Information is extracted from the ali file." ;; No more idea to find the declaration. Give up (progn (kill-buffer ali-buffer) - (error "%s" (concat "No declaration of " (ada-name-of identlist) - " found.")) + + (error "No declaration of %s found." (ada-name-of identlist)) ))) ) @@ -1808,10 +1808,8 @@ This function is disabled for operators, and only works for identifiers." ;; none => error ((= len 0) (kill-buffer (current-buffer)) - (error "%s" (concat "No declaration of " - (ada-name-of identlist) - " recorded in .ali file"))) - + (error "No declaration of %s recorded in .ali file" + (ada-name-of identlist))) ;; one => should be the right one ((= len 1) (goto-line (caar declist))) @@ -2011,7 +2009,7 @@ the declaration and documentation of the subprograms one is using." (string-to-number (nth 2 (car list))) identlist other-frame) - (error "%s" (concat (caar list) " not found in src_dir"))) + (error "%s not found in src_dir" (caar list))) (message "This is only a (good) guess at the cross-reference.") ) diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el index 153b95e65e4..1f184ea157d 100644 --- a/lisp/progmodes/idlw-shell.el +++ b/lisp/progmodes/idlw-shell.el @@ -2375,7 +2375,7 @@ matter what the settings of that variable." (if (not (idlwave-shell-valid-frame frame)) ;; fixme: errors are dangerous in shell filters. but i think i ;; have never encountered this one. - (error "%s" (concat "invalid frame - unable to access file: " (car frame))) + (error "invalid frame - unable to access file: %s" (car frame)) ;;; ;;; buffer : the buffer to display a line in. ;;; select-shell: current buffer is the shell. diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el index 5b14e6a857f..dc9934a593d 100644 --- a/lisp/progmodes/vhdl-mode.el +++ b/lisp/progmodes/vhdl-mode.el @@ -9095,8 +9095,9 @@ otherwise." (progn (delete-region (point) (progn (end-of-line) (point))) (vhdl-template-insert-date)) (unless noerror - (error "%s" (concat "ERROR: Modification date prefix string \"" - vhdl-modify-date-prefix-string "\" not found"))))))) + (error "ERROR: Modification date prefix string \"%s\" not found" + vhdl-modify-date-prefix-string)))))) + (defun vhdl-template-modify-noerror () "Call `vhdl-template-modify' with NOERROR non-nil." From 274f1353e0c442377ba2d2e713c6d670795232f4 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sat, 8 Dec 2007 01:02:29 +0000 Subject: [PATCH 036/172] * erc-stamp.el (erc-echo-timestamp): * erc-lang.el (language): * erc-backend.el (erc-server-connect): Fix buggy call to `message'. * gnus-sum.el (gnus-summary-simplify-subject-query): * ecomplete.el (ecomplete-display-matches): Fix buggy call to `message'. * textmodes/reftex.el (reftex-select-with-char): * textmodes/reftex-toc.el (reftex-toc-do-promote) (reftex-toc-visit-location, reftex-toc-find-section): * textmodes/reftex-index.el (reftex-index-show-entry): * textmodes/org.el (org-cycle-hide-archived-subtrees) (org-table-rotate-recalc-marks, org-mark-ring-push) (org-follow-info-link, org-mhe-get-message-folder-from-index) (org-auto-repeat-maybe, org-store-log-note, org-delete-property) (org-evaluate-time-range, org-edit-agenda-file-list): * textmodes/artist.el (artist-select-next-op-in-list) (artist-select-prev-op-in-list): * term/mac-win.el (mac-service-insert-text): * startup.el (fancy-about-screen): * progmodes/vhdl-mode.el (vhdl-decision-query): * progmodes/idlwave.el (idlwave-template) (idlwave-scroll-completions, idlwave-display-completion-list): * progmodes/ebrowse.el (ebrowse-show-progress): * progmodes/cperl-mode.el (cperl-find-pods-heres): * progmodes/antlr-mode.el (antlr-insert-option-do): * play/mpuz.el (mpuz-close-game): * net/rcirc.el (rcirc-next-active-buffer): * mail/reporter.el (reporter-update-status): * kmacro.el (kmacro-display): * international/ja-dic-cnv.el (skkdic-set-okuri-nasi): * emulation/viper-util.el (viper-save-setting): * emacs-lisp/lisp-mnt.el (lm-verify): * emacs-lisp/edebug.el (edebug-set-mode): * emacs-lisp/checkdoc.el (checkdoc-rogue-spaces, checkdoc-defun): * calendar/calendar.el (calendar-print-day-of-year): * calc/calcalg3.el (calc-curve-fit): * calc/calcalg2.el (math-integral): * calc/calc.el (calc-read-key-sequence, calc-version): * calc/calc-mode.el (calc-set-simplify-mode): * calc/calc-ext.el (calc-fancy-prefix): Fix buggy call to `message'. --- lisp/ChangeLog | 38 ++++++++++++++++++++++++++++++++ lisp/calc/calc-ext.el | 2 +- lisp/calc/calc-mode.el | 2 +- lisp/calc/calc.el | 4 ++-- lisp/calc/calcalg2.el | 4 ++-- lisp/calc/calcalg3.el | 2 +- lisp/calendar/calendar.el | 2 +- lisp/emacs-lisp/checkdoc.el | 8 +++---- lisp/emacs-lisp/edebug.el | 4 ++-- lisp/emacs-lisp/lisp-mnt.el | 2 +- lisp/emulation/viper-util.el | 2 +- lisp/erc/ChangeLog | 6 +++++ lisp/erc/erc-backend.el | 2 +- lisp/erc/erc-lang.el | 2 +- lisp/erc/erc-stamp.el | 4 ++-- lisp/gnus/ChangeLog | 6 +++++ lisp/gnus/ecomplete.el | 2 +- lisp/gnus/gnus-sum.el | 2 +- lisp/international/ja-dic-cnv.el | 2 +- lisp/kmacro.el | 2 +- lisp/mail/reporter.el | 2 +- lisp/net/rcirc.el | 14 ++++++------ lisp/play/mpuz.el | 2 +- lisp/progmodes/antlr-mode.el | 2 +- lisp/progmodes/cperl-mode.el | 2 +- lisp/progmodes/ebrowse.el | 8 +++---- lisp/progmodes/idlwave.el | 6 ++--- lisp/progmodes/vhdl-mode.el | 2 +- lisp/startup.el | 2 +- lisp/term/mac-win.el | 2 +- lisp/textmodes/artist.el | 4 ++-- lisp/textmodes/org.el | 27 ++++++++++++----------- lisp/textmodes/reftex-index.el | 2 +- lisp/textmodes/reftex-toc.el | 6 ++--- lisp/textmodes/reftex.el | 8 +++---- 35 files changed, 119 insertions(+), 68 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5d2c39d3552..30be1ca0886 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,41 @@ +2007-12-08 David Kastrup + + * textmodes/reftex.el (reftex-select-with-char): + * textmodes/reftex-toc.el (reftex-toc-do-promote) + (reftex-toc-visit-location, reftex-toc-find-section): + * textmodes/reftex-index.el (reftex-index-show-entry): + * textmodes/org.el (org-cycle-hide-archived-subtrees) + (org-table-rotate-recalc-marks, org-mark-ring-push) + (org-follow-info-link, org-mhe-get-message-folder-from-index) + (org-auto-repeat-maybe, org-store-log-note, org-delete-property) + (org-evaluate-time-range, org-edit-agenda-file-list): + * textmodes/artist.el (artist-select-next-op-in-list) + (artist-select-prev-op-in-list): + * term/mac-win.el (mac-service-insert-text): + * startup.el (fancy-about-screen): + * progmodes/vhdl-mode.el (vhdl-decision-query): + * progmodes/idlwave.el (idlwave-template) + (idlwave-scroll-completions, idlwave-display-completion-list): + * progmodes/ebrowse.el (ebrowse-show-progress): + * progmodes/cperl-mode.el (cperl-find-pods-heres): + * progmodes/antlr-mode.el (antlr-insert-option-do): + * play/mpuz.el (mpuz-close-game): + * net/rcirc.el (rcirc-next-active-buffer): + * mail/reporter.el (reporter-update-status): + * kmacro.el (kmacro-display): + * international/ja-dic-cnv.el (skkdic-set-okuri-nasi): + * emulation/viper-util.el (viper-save-setting): + * emacs-lisp/lisp-mnt.el (lm-verify): + * emacs-lisp/edebug.el (edebug-set-mode): + * emacs-lisp/checkdoc.el (checkdoc-rogue-spaces, checkdoc-defun): + * calendar/calendar.el (calendar-print-day-of-year): + * calc/calcalg3.el (calc-curve-fit): + * calc/calcalg2.el (math-integral): + * calc/calc.el (calc-read-key-sequence, calc-version): + * calc/calc-mode.el (calc-set-simplify-mode): + * calc/calc-ext.el (calc-fancy-prefix): Fix buggy call to + `message'. + 2007-12-07 D. Goel * progmodes/idlw-shell.el (idlwave-shell-display-line) diff --git a/lisp/calc/calc-ext.el b/lisp/calc/calc-ext.el index 140335a3d02..56b95ef218e 100644 --- a/lisp/calc/calc-ext.el +++ b/lisp/calc/calc-ext.el @@ -1434,7 +1434,7 @@ calc-kill calc-kill-region calc-yank)))) (calc-set-command-flag 'no-align) (setq prefix (set flag (not (symbol-value flag))) prefix-arg n) - (message (if prefix msg ""))) + (message "%s" (if prefix msg ""))) (and prefix (not calc-is-keypad-press) (if (boundp 'overriding-terminal-local-map) diff --git a/lisp/calc/calc-mode.el b/lisp/calc/calc-mode.el index d7daf1bf997..85ae4d7b264 100644 --- a/lisp/calc/calc-mode.el +++ b/lisp/calc/calc-mode.el @@ -505,7 +505,7 @@ mode) (and (not (eq calc-simplify-mode mode)) mode))) - (message (if (eq calc-simplify-mode mode) + (message "%s" (if (eq calc-simplify-mode mode) msg "Default simplifications enabled"))) diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el index 69cacec2220..6e12fbe9f5f 100644 --- a/lisp/calc/calc.el +++ b/lisp/calc/calc.el @@ -1228,7 +1228,7 @@ If nil, selections displayed but ignored.") (let ((prompt2 (format "%s " (key-description (this-command-keys)))) (glob (current-global-map)) (loc (current-local-map))) - (or (input-pending-p) (message prompt)) + (or (input-pending-p) (message "%s" prompt)) (let ((key (calc-read-key t))) (calc-unread-command (cdr key)) (unwind-protect @@ -1244,7 +1244,7 @@ If nil, selections displayed but ignored.") (defun calc-version () "Return version of this version of Calc." (interactive) - (message (concat "Calc version " calc-version))) + (message "Calc version %s" calc-version)) (defun calc-mode () "Calculator major mode. diff --git a/lisp/calc/calcalg2.el b/lisp/calc/calcalg2.el index 4afed43d99c..1259642842a 100644 --- a/lisp/calc/calcalg2.el +++ b/lisp/calc/calcalg2.el @@ -746,7 +746,7 @@ (setq math-integ-msg (format "Working... Integrating %s" (math-format-flat-expr expr 0))) - (message math-integ-msg))) + (message "%s" math-integ-msg))) (if math-cur-record (setcar (cdr math-cur-record) (if same-as-above (vector simp) 'busy)) @@ -773,7 +773,7 @@ "simplification...\n") (setq val (math-integral simp 'no t)))))))) (if (eq calc-display-working-message 'lots) - (message math-integ-msg))) + (message "%s" math-integ-msg))) (setcar (cdr math-cur-record) (or val (if (or math-enable-subst (not math-any-substs)) diff --git a/lisp/calc/calcalg3.el b/lisp/calc/calcalg3.el index 374b0487cfe..77e8b1537f4 100644 --- a/lisp/calc/calcalg3.el +++ b/lisp/calc/calcalg3.el @@ -416,7 +416,7 @@ (calc-record (calc-normalize calc-fit-to-trail) "parm")))) (when plot (if (stringp plot) - (message plot) + (message "%s" plot) (let ((calc-graph-no-auto-view t)) (calc-graph-delete t) (calc-graph-add-curve diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el index d49667d2810..da87a1959fe 100644 --- a/lisp/calendar/calendar.el +++ b/lisp/calendar/calendar.el @@ -3154,7 +3154,7 @@ Defaults to today's date if DATE is not given." (defun calendar-print-day-of-year () "Show day number in year/days remaining in year for date under the cursor." (interactive) - (message (calendar-day-of-year-string (calendar-cursor-to-date t)))) + (message "%s" (calendar-day-of-year-string (calendar-cursor-to-date t)))) (defun calendar-set-mode-line (str) "Set mode line to STR, centered, surrounded by dashes." diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el index 185df6fbe43..742e13412bb 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -978,7 +978,7 @@ Optional argument INTERACT permits more interactive fixing." (if (not (interactive-p)) e (if e - (message (checkdoc-error-text e)) + (message "%s" (checkdoc-error-text e)) (checkdoc-show-diagnostics) (message "Space Check: done."))))) @@ -1038,15 +1038,15 @@ space at the end of each line." (end (save-excursion (end-of-defun) (point))) (msg (checkdoc-this-string-valid))) (if msg (if no-error - (message (checkdoc-error-text msg)) + (message "%s" (checkdoc-error-text msg)) (error "%s" (checkdoc-error-text msg))) (setq msg (checkdoc-message-text-search beg end)) (if msg (if no-error - (message (checkdoc-error-text msg)) + (message "%s" (checkdoc-error-text msg)) (error "%s" (checkdoc-error-text msg))) (setq msg (checkdoc-rogue-space-check-engine beg end)) (if msg (if no-error - (message (checkdoc-error-text msg)) + (message "%s" (checkdoc-error-text msg)) (error "%s" (checkdoc-error-text msg)))))) (if (interactive-p) (message "Checkdoc: done.")))))) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index e3ade01a4a0..4dc7bdb3a73 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -3295,12 +3295,12 @@ With prefix argument, make it a temporary breakpoint." (if (eq (1+ edebug-recursion-depth) (recursion-depth)) (progn (setq edebug-execution-mode mode) - (message shortmsg) + (message "%s" shortmsg) ;; Continue execution (exit-recursive-edit)) ;; This is not terribly useful!! (setq edebug-next-execution-mode mode) - (message msg))) + (message "%s" msg))) (defalias 'edebug-step-through-mode 'edebug-step-mode) diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el index ea6a96c6555..bf7c4147309 100644 --- a/lisp/emacs-lisp/lisp-mnt.el +++ b/lisp/emacs-lisp/lisp-mnt.el @@ -562,7 +562,7 @@ copyright notice is allowed." (t ret))))) (if verbose - (message ret)) + (message "%s" ret)) ret)) (defun lm-synopsis (&optional file showall) diff --git a/lisp/emulation/viper-util.el b/lisp/emulation/viper-util.el index 87bf5235b81..78f54b3d63c 100644 --- a/lisp/emulation/viper-util.el +++ b/lisp/emulation/viper-util.el @@ -636,7 +636,7 @@ (regexp (format "^[^;]*%s[ \t\n]*[a-zA-Z---_']*[ \t\n)]" var-name)) (buf (find-file-noselect (substitute-in-file-name custom-file))) ) - (message message) + (message "%s" (or message "")) (save-excursion (set-buffer buf) (goto-char (point-min)) diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog index f5d7c83985d..d968a5a6ce9 100644 --- a/lisp/erc/ChangeLog +++ b/lisp/erc/ChangeLog @@ -1,3 +1,9 @@ +2007-12-08 David Kastrup + + * erc-stamp.el (erc-echo-timestamp): + * erc-lang.el (language): + * erc-backend.el (erc-server-connect): Fix buggy call to `message'. + 2007-12-06 D. Goel * erc-match.el (erc-add-entry-to-list): Fix buggy call to `error'. diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index c0f4205c012..04ddab1f300 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -515,7 +515,7 @@ We will store server variables in the buffer given by BUFFER." (set-process-filter process 'erc-server-filter-function) (set-process-buffer process buffer))) (erc-log "\n\n\n********************************************\n") - (message (erc-format-message + (message "%s" (erc-format-message 'login ?n (with-current-buffer buffer (erc-current-nick)))) ;; wait with script loading until we receive a confirmation (first diff --git a/lisp/erc/erc-lang.el b/lisp/erc/erc-lang.el index e61156f3d5a..b11721d227f 100644 --- a/lisp/erc/erc-lang.el +++ b/lisp/erc/erc-lang.el @@ -197,7 +197,7 @@ Normungsinstitut (ON), Postfach 130, A-1021 Vienna, Austria.") "Return the language name for the ISO CODE." (interactive (list (completing-read "ISO language code: " iso-638-languages))) - (message (cdr (assoc code iso-638-languages)))) + (message "%s" (cdr (assoc code iso-638-languages)))) (defun erc-cmd-LANG (language) "Display the language name for the language code given by LANGUAGE." diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index 64b04051d91..ae9bb51832a 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -412,8 +412,8 @@ NOW is position of point currently." (when erc-echo-timestamps (let ((stamp (get-text-property now 'timestamp))) (when stamp - (message (format-time-string erc-echo-timestamp-format - stamp)))))) + (message "%s" (format-time-string erc-echo-timestamp-format + stamp)))))) (provide 'erc-stamp) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 537fecb3ffd..fff3a246d8f 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,9 @@ +2007-12-08 David Kastrup + + * gnus-sum.el (gnus-summary-simplify-subject-query): + * ecomplete.el (ecomplete-display-matches): Fix buggy call to + `message'. + 2007-12-07 Glenn Morris * gnus-art.el (article-make-date-line): Revert previous change. diff --git a/lisp/gnus/ecomplete.el b/lisp/gnus/ecomplete.el index 42a75916277..285aca4270a 100644 --- a/lisp/gnus/ecomplete.el +++ b/lisp/gnus/ecomplete.el @@ -119,7 +119,7 @@ nil) (if (not choose) (progn - (message matches) + (message "%s" matches) nil) (setq highlight (ecomplete-highlight-match-line matches line)) (while (not (memq (setq command (read-event highlight)) '(? return))) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index b082a8b152e..826fdd71896 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -4028,7 +4028,7 @@ If NO-DISPLAY, don't generate a summary buffer." "Query where the respool algorithm would put this article." (interactive) (gnus-summary-select-article) - (message (gnus-general-simplify-subject (gnus-summary-article-subject)))) + (message "%s" (gnus-general-simplify-subject (gnus-summary-article-subject)))) (defun gnus-gather-threads-by-subject (threads) "Gather threads by looking at Subject headers." diff --git a/lisp/international/ja-dic-cnv.el b/lisp/international/ja-dic-cnv.el index e7c9b633b3b..d7add6f31c1 100644 --- a/lisp/international/ja-dic-cnv.el +++ b/lisp/international/ja-dic-cnv.el @@ -558,7 +558,7 @@ To get complete usage, invoke: (while l (setq count (1+ count)) (if (= (% count 10000) 0) - (message (format "%d entries" count))) + (message "%d entries" count)) (setq entry (skkdic-extract-conversion-data (car l))) (set-nested-alist (car entry) (cdr entry) map) (setq l (cdr l))) diff --git a/lisp/kmacro.el b/lisp/kmacro.el index 096d35bebbd..ebb3a4a419f 100644 --- a/lisp/kmacro.el +++ b/lisp/kmacro.el @@ -404,7 +404,7 @@ Optional arg EMPTY is message to print if no macros are defined." (format " [%s]" (format kmacro-counter-format-start kmacro-counter))) (if z (substring m 0 (1- x)) m) (if z "..." ""))) - (message (or empty "No keyboard macros defined")))) + (message "%s" (or empty "No keyboard macros defined")))) (defun kmacro-repeat-on-last-key (keys) diff --git a/lisp/mail/reporter.el b/lisp/mail/reporter.el index 24dd9ab0c35..0777c60a2b9 100644 --- a/lisp/mail/reporter.el +++ b/lisp/mail/reporter.el @@ -118,7 +118,7 @@ composed.") "Periodically output a status message." (if (zerop (% reporter-status-count 10)) (progn - (message reporter-status-message) + (message "%s" reporter-status-message) (setq reporter-status-message (concat reporter-status-message ".")))) (setq reporter-status-count (1+ reporter-status-count))) diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el index ef24de44e50..a1a0e0ca8e9 100644 --- a/lisp/net/rcirc.el +++ b/lisp/net/rcirc.el @@ -1708,13 +1708,13 @@ With prefix ARG, go to the next low priority buffer with activity." (recenter -1))) (if (eq major-mode 'rcirc-mode) (switch-to-buffer (rcirc-non-irc-buffer)) - (message (concat - "No IRC activity." - (when lopri - (concat - " Type C-u " - (key-description (this-command-keys)) - " for low priority activity.")))))))) + (message "%s" (concat + "No IRC activity." + (when lopri + (concat + " Type C-u " + (key-description (this-command-keys)) + " for low priority activity.")))))))) (defvar rcirc-activity-hooks nil "Hook to be run when there is channel activity. diff --git a/lisp/play/mpuz.el b/lisp/play/mpuz.el index 4cd3bd673ff..8b40b4187c6 100644 --- a/lisp/play/mpuz.el +++ b/lisp/play/mpuz.el @@ -489,7 +489,7 @@ You may abort a game by typing \\\\[mpuz-offer-abort]." ((< mpuz-nb-errors 10) "bad!") ((< mpuz-nb-errors 15) "awful.") (t "not serious."))))) - (message message) + (message "%s" message) (sit-for 4) (if (y-or-n-p (concat message " Start a new game? ")) (mpuz-start-new-game) diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el index 9f6e70dcce5..d7e2ff3574e 100644 --- a/lisp/progmodes/antlr-mode.el +++ b/lisp/progmodes/antlr-mode.el @@ -1875,7 +1875,7 @@ cell where the two values determine the area inside the braces." (read initial) initial)) (cdr value)))) - (message (cadr value)) + (message "%s" (or (cadr value) "")) (setq value nil))) ;; insert value ---------------------------------------------------------- (if (consp old) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 4a397a9d012..4f10f4f3de3 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -4581,7 +4581,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face', (setq qtag "Can't find })"))) (progn (goto-char (1- e)) - (message qtag)) + (message "%s" qtag)) (cperl-postpone-fontification (1- tag) (1- (point)) 'face font-lock-variable-name-face) diff --git a/lisp/progmodes/ebrowse.el b/lisp/progmodes/ebrowse.el index 5acbe70a074..3fe83d9ead5 100644 --- a/lisp/progmodes/ebrowse.el +++ b/lisp/progmodes/ebrowse.el @@ -896,10 +896,10 @@ this is the first progress message displayed." (let (message-log-max) (when start (setq ebrowse-n-boxes 0)) (setq ebrowse-n-boxes (mod (1+ ebrowse-n-boxes) ebrowse-max-boxes)) - (message (concat title ": " - (propertize (make-string ebrowse-n-boxes - (if (display-color-p) ?\ ?+)) - 'face 'ebrowse-progress))))) + (message "%s: %s" title + (propertize (make-string ebrowse-n-boxes + (if (display-color-p) ?\ ?+)) + 'face 'ebrowse-progress)))) ;;; Reading a tree from disk diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el index 9648494adc4..49e88597665 100644 --- a/lisp/progmodes/idlwave.el +++ b/lisp/progmodes/idlwave.el @@ -3799,7 +3799,7 @@ unless the optional second argument NOINDENT is non-nil." (if (not noindent) (indent-region beg end nil)) (if (stringp prompt) - (message prompt))))) + (message "%s" prompt))))) (defun idlwave-rw-case (string) "Make STRING have the case required by `idlwave-reserved-word-upcase'." @@ -7038,7 +7038,7 @@ sort the list before displaying" (select-window win) (eval idlwave-complete-after-success-form)) (set-window-start cwin (point-min))))) - (and message (message message))) + (and message (message "%s" message))) (select-window win)))) (defun idlwave-display-completion-list (list &optional message beg complete) @@ -7069,7 +7069,7 @@ sort the list before displaying" (run-hooks 'idlwave-completion-setup-hook) ;; Display the message - (message (or message "Making completion list...done"))) + (message "%s" (or message "Making completion list...done"))) (defun idlwave-choose (function &rest args) "Call FUNCTION as a completion chooser and pass ARGS to it." diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el index dc9934a593d..171bb286652 100644 --- a/lisp/progmodes/vhdl-mode.el +++ b/lisp/progmodes/vhdl-mode.el @@ -10433,7 +10433,7 @@ with double-quotes is to be inserted. DEFAULT specifies a default string." "Query a decision from the user." (let ((start (point))) (when string (vhdl-insert-keyword (concat string " "))) - (message prompt) + (message "%s" (or prompt "")) (let ((char (read-char))) (delete-region start (point)) (if (and optional (eq char ?\r)) diff --git a/lisp/startup.el b/lisp/startup.el index 366491fe125..ee06faea022 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1537,7 +1537,7 @@ splash screen in another window." (apply #'fancy-splash-insert text) (insert "\n")) (unless (current-message) - (message fancy-splash-help-echo)) + (message "%s" (or fancy-splash-help-echo ""))) (set-buffer-modified-p nil) (goto-char (point-min)) (force-mode-line-update)) diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el index 1f009394c3c..b6db7a2c6d8 100644 --- a/lisp/term/mac-win.el +++ b/lisp/term/mac-win.el @@ -2178,7 +2178,7 @@ either in the current buffer or in the echo area." (if (not buffer-read-only) (insert text) (kill-new text) - (message + (message "%s" (substitute-command-keys "The text from the Services menu can be accessed with \\[yank]"))))) diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el index f0442904185..63a9e8f615a 100644 --- a/lisp/textmodes/artist.el +++ b/lisp/textmodes/artist.el @@ -1151,14 +1151,14 @@ PREV-OP-ARG are used when invoked recursively during the build-up." (interactive) (let ((next-op (cdr (cdr (assoc artist-curr-go artist-prev-next-op-alist))))) (artist-select-operation next-op) - (message next-op))) + (message "%s" next-op))) (defun artist-select-prev-op-in-list () "Cyclically select previous drawing mode operation." (interactive) (let ((prev-op (car (cdr (assoc artist-curr-go artist-prev-next-op-alist))))) (artist-select-operation prev-op) - (message prev-op))) + (message "%s" prev-op))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/lisp/textmodes/org.el b/lisp/textmodes/org.el index 5e2a9c0148e..ebcf060be65 100644 --- a/lisp/textmodes/org.el +++ b/lisp/textmodes/org.el @@ -7487,7 +7487,7 @@ When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag." (org-hide-archived-subtrees beg end) (goto-char beg) (if (looking-at (concat ".*:" org-archive-tag ":")) - (message (substitute-command-keys + (message "%s" (substitute-command-keys "Subtree is archived and stays closed. Use \\[org-force-cycle-archived] to cycle it anyway."))))))) (defun org-force-cycle-archived () @@ -9366,7 +9366,8 @@ of the new mark." (goto-line l1))) (if (not (= epos (point-at-eol))) (org-table-align)) (goto-line l) - (and (interactive-p) (message (cdr (assoc new org-recalc-marks)))))) + (and (interactive-p) + (message "%s" (or (cdr (assoc new org-recalc-marks)) ""))))) (defun org-table-maybe-recalculate-line () "Recompute the current line if marked for it, and if we haven't just done it." @@ -12347,7 +12348,7 @@ to read." (move-marker (car org-mark-ring) (or pos (point)) (or buffer (current-buffer))) - (message + (message "%s" (substitute-command-keys "Position saved to mark ring, go back with \\[org-mark-ring-goto]."))) @@ -12429,7 +12430,7 @@ onto the ring." (if (match-string 2 name) ; If there isn't a node, choose "Top" (Info-find-node (match-string 1 name) (match-string 2 name)) (Info-find-node (match-string 1 name) "Top"))) - (message (concat "Could not open: " name)))) + (message "Could not open: %s" name))) (defun org-follow-gnus-link (&optional group article) "Follow a Gnus link to GROUP and ARTICLE." @@ -12553,7 +12554,7 @@ sequences, it will now work." (save-excursion (mh-index-previous-folder) (re-search-forward "^\\(+.*\\)$" nil t) - (message (match-string 1)))) + (message "%s" (match-string 1)))) (defun org-mhe-get-message-folder () "Return the name of the current message folder. Be careful if you @@ -13759,7 +13760,7 @@ This function should be run in the `org-after-todo-state-change-hook'." (org-timestamp-change n (cdr (assoc what whata)))) (setq msg (concat msg type org-last-changed-timestamp " "))) (setq org-log-post-message msg) - (message msg)))) + (message "%s" msg)))) (defun org-show-todo-tree (arg) "Make a compact tree which shows all headlines marked with TODO. @@ -13978,7 +13979,7 @@ The auto-repeater uses this.") (with-current-buffer (marker-buffer org-log-note-return-to) (goto-char org-log-note-return-to)) (move-marker org-log-note-return-to nil) - (and org-log-post-message (message org-log-post-message))) + (and org-log-post-message (message "%s" org-log-post-message))) ;; FIXME: what else would be useful? ;; - priority @@ -15216,10 +15217,10 @@ in the current file." (let* ((prop (completing-read "Property: " (org-entry-properties nil 'standard)))) (list prop))) - (message (concat "Property " property - (if (org-entry-delete nil property) - " deleted" - " was not present in the entry")))) + (message "Property %s %s" property + (if (org-entry-delete nil property) + "deleted" + "was not present in the entry"))) (defun org-delete-property-globally (property) "Remove PROPERTY globally, from all entries." @@ -16863,7 +16864,7 @@ days in order to avoid rounding problems." d (floor (+ (/ diff ds) 0.5)) h 0 m 0)) (if (not to-buffer) - (message (org-make-tdiff-string y d h m)) + (message "%s" (org-make-tdiff-string y d h m)) (when (org-at-table-p) (goto-char match-end) (setq align t) @@ -18806,7 +18807,7 @@ the buffer and restores the previous window configuration." (org-install-agenda-files-menu) (message "New agenda file list installed")) nil 'local) - (message (substitute-command-keys + (message "%s" (substitute-command-keys "Edit list and finish with \\[save-buffer]"))) (customize-variable 'org-agenda-files))) diff --git a/lisp/textmodes/reftex-index.el b/lisp/textmodes/reftex-index.el index 73bcf6d6a74..5b2d62c56f6 100644 --- a/lisp/textmodes/reftex-index.el +++ b/lisp/textmodes/reftex-index.el @@ -367,7 +367,7 @@ _ ^ Add/Remove parent key (to make this item a subitem). (goto-char (or pos (point-min))) (or (looking-at re) (reftex-nearest-match re (length literal)))) - (t (message reftex-no-follow-message) nil)))) + (t (message "%s" reftex-no-follow-message) nil)))) (when match (goto-char (match-beginning 0)) (recenter '(4)) diff --git a/lisp/textmodes/reftex-toc.el b/lisp/textmodes/reftex-toc.el index d1d979b3fc0..e3d8b3e4793 100644 --- a/lisp/textmodes/reftex-toc.el +++ b/lisp/textmodes/reftex-toc.el @@ -626,7 +626,7 @@ point." (message "%d section%s %smoted" nsec (if (= 1 nsec) "" "s") pro-or-de) nil)) - (if msg (progn (ding) (message msg))))) + (if msg (progn (ding) (message "%s" msg))))) (defun reftex-toc-restore-region (point-line &optional mark-line) @@ -833,7 +833,7 @@ label prefix determines the wording of a reference." (switch-to-buffer-other-window (reftex-get-file-buffer-force file nil)) (goto-char (if (eq where 'bof) (point-min) (point-max)))) - (message reftex-no-follow-message) nil)))) + (message "%s" reftex-no-follow-message) nil)))) ((stringp (car toc)) ;; a label @@ -900,7 +900,7 @@ label prefix determines the wording of a reference." (reftex-make-regexp-allow-for-ctrl-m literal) len) (reftex-nearest-match (reftex-make-desperate-section-regexp literal) len))))) - (t (message reftex-no-follow-message) nil)))) + (t (message "%s" reftex-no-follow-message) nil)))) (when match (goto-char (match-beginning 0)) (if (not (= (point) (point-max))) (recenter 1)) diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el index 5383d88c386..d6ec29434d1 100644 --- a/lisp/textmodes/reftex.el +++ b/lisp/textmodes/reftex.el @@ -1978,7 +1978,7 @@ Works on both Emacs and XEmacs." (let ((char ?\?)) (save-window-excursion (catch 'exit - (message (concat prompt " (?=Help)")) + (message "%s (?=Help)" prompt) (when (or (sit-for (or delay-time 0)) (= ?\? (setq char (read-char-exclusive)))) (reftex-kill-buffer "*RefTeX Select*") @@ -1994,17 +1994,17 @@ Works on both Emacs and XEmacs." (pos-visible-in-window-p (point-max))) nil (setq prompt (concat prompt (if scroll " (SPC/DEL=Scroll)" "")))) - (message prompt) + (message "%s" prompt) (and (equal char ?\?) (setq char (read-char-exclusive))) (while t (cond ((equal char ?\C-g) (keyboard-quit)) ((equal char ?\?)) ((and scroll (equal char ?\ )) (condition-case nil (scroll-up) (error nil)) - (message prompt)) + (message "%s" prompt)) ((and scroll (equal char ?\C-? )) (condition-case nil (scroll-down) (error nil)) - (message prompt)) + (message "%s" prompt)) (t (message "") (throw 'exit char))) (setq char (read-char-exclusive))))))) From df04db0bcbba5f72ea7da471469d7b44f1d97ea0 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sat, 8 Dec 2007 01:06:12 +0000 Subject: [PATCH 037/172] Remove conflict marker. --- lisp/gnus/ChangeLog | 1 - 1 file changed, 1 deletion(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index fff3a246d8f..3bc43a4c1f5 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -77,7 +77,6 @@ (rfc2047-encoded-word-regexp-loose): Move forward; add comments explaining what regexp patterns are for. ->>>>>>> 1.607 2007-12-04 Glenn Morris * password.el: Move to ../password-cache.el. From e10fe1cbe2436a049fd8744e089432a58efbcf21 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu Date: Sat, 8 Dec 2007 01:39:15 +0000 Subject: [PATCH 038/172] New file. --- etc/ChangeLog | 4 ++++ etc/emacs.desktop | 12 ++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 etc/emacs.desktop diff --git a/etc/ChangeLog b/etc/ChangeLog index 0cd4f718b1a..182b7d1e098 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,7 @@ +2007-12-08 Dan Nicolaescu + + * emacs.desktop: New file. + 2007-11-30 Kentaro Ohkouchi * images/icons/macemacs_16.png, images/icons/macemacs_24.png: diff --git a/etc/emacs.desktop b/etc/emacs.desktop new file mode 100644 index 00000000000..630d3c78834 --- /dev/null +++ b/etc/emacs.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=Emacs +GenericName=Text Editor +Comment=Edit text +MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++; +Exec=emacs %f +Icon=emacs_32.png +Type=Application +Terminal=false +Categories=Application;Development;TextEditor; +Encoding=UTF-8 +StartupWMClass=Emacs From dc56b2ba139f0052c032ff7628ad40c83621740a Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Sat, 8 Dec 2007 09:55:50 +0000 Subject: [PATCH 039/172] (c-mask-paragraph): Avoid invalid search bound error in block comment branch. --- lisp/ChangeLog | 5 +++++ lisp/progmodes/cc-cmds.el | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 30be1ca0886..7608273c9bf 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-08 Martin Rudalics + + * progmodes/cc-cmds.el (c-mask-paragraph): Avoid invalid search + bound error in block comment branch. + 2007-12-08 David Kastrup * textmodes/reftex.el (reftex-select-with-char): diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el index db052c4b8f5..06c0946290b 100644 --- a/lisp/progmodes/cc-cmds.el +++ b/lisp/progmodes/cc-cmds.el @@ -3864,7 +3864,12 @@ command to conveniently insert and align the necessary backslashes." (save-excursion (goto-char (cdr c-lit-limits)) (beginning-of-line) - (and (search-forward-regexp + ;; The following conjunct was added to avoid an + ;; "Invalid search bound (wrong side of point)" + ;; error in the subsequent re-search. Maybe + ;; another fix would be needed (2007-12-08). + (and (> (- (cdr c-lit-limits) 2) (point)) + (search-forward-regexp (concat "\\=[ \t]*\\(" c-current-comment-prefix "\\)") (- (cdr c-lit-limits) 2) t) (not (search-forward-regexp From d0b22d7de60c793079adabbae643002e3ccaa167 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 8 Dec 2007 12:38:46 +0000 Subject: [PATCH 040/172] (latexenc-find-file-coding-system): If both coding-system-for-write and buffer-file-coding-system of latex-main-file are nil, use `undecided'. --- lisp/international/latexenc.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/international/latexenc.el b/lisp/international/latexenc.el index 57013b59538..cc52eb4cbdf 100644 --- a/lisp/international/latexenc.el +++ b/lisp/international/latexenc.el @@ -181,7 +181,8 @@ coding system names is determined from `latex-inputenc-coding-alist'." (find-file-noselect latexenc-main-file t))) (coding-system-base ;Disregard the EOL part of the CS. (with-current-buffer latexenc-main-buffer - (or coding-system-for-write buffer-file-coding-system)))) + (or coding-system-for-write buffer-file-coding-system + 'undecided)))) 'undecided)))) 'undecided)) From be11f56846e908fbb58eb8973aec9da7960d5a32 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 8 Dec 2007 12:40:12 +0000 Subject: [PATCH 041/172] "" --- lisp/ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4187788b41f..2ff7fc670f5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2007-12-08 Eli Zaretskii + + * international/latexenc.el (latexenc-find-file-coding-system): If + both coding-system-for-write and buffer-file-coding-system of + latex-main-file are nil, use `undecided'. + 2007-12-06 Jason Rumney * mouse.el (mouse-buffer-menu-alist): Keep buffer names left aligned. From a31d47c7ddfa55bd49b6cfd4b066cd776da459a9 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 8 Dec 2007 12:53:37 +0000 Subject: [PATCH 042/172] * dbusbind.c (xd_read_message): Generate an event for every registered handler. There might be several handlers registered for the same signal. (Fdbus_register_signal): Don't overwrite a registration for the same signal. Add a new registration if handlers are different. (Vdbus_registered_functions_table): Rework doc string. --- src/ChangeLog | 9 ++++ src/dbusbind.c | 119 +++++++++++++++++++++++++++++-------------------- 2 files changed, 79 insertions(+), 49 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 962c95dbdf2..15873d2550b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2007-12-08 Michael Albinus + + * dbusbind.c (xd_read_message): Generate an event for every + registered handler. There might be several handlers registered + for the same signal. + (Fdbus_register_signal): Don't overwrite a registration for the + same signal. Add a new registration if handlers are different. + (Vdbus_registered_functions_table): Rework doc string. + 2007-12-07 Michael Albinus * dbusbind.c (Fdbus_get_unique_name, xd_read_message) diff --git a/src/dbusbind.c b/src/dbusbind.c index 73b538cf599..29835772dc5 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -543,14 +543,14 @@ Lisp_Object xd_read_message (bus) Lisp_Object bus; { - Lisp_Object key; + Lisp_Object args, key, value; struct gcpro gcpro1; static struct input_event event; DBusConnection *connection; DBusMessage *dmessage; DBusMessageIter iter; uint dtype; - char service[DBUS_MAXIMUM_NAME_LENGTH]; + char uname[DBUS_MAXIMUM_NAME_LENGTH]; char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */ char interface[DBUS_MAXIMUM_NAME_LENGTH]; char member[DBUS_MAXIMUM_NAME_LENGTH]; @@ -566,16 +566,11 @@ xd_read_message (bus) if (dmessage == NULL) return; - /* There is a message in the queue. Construct the D-Bus event. */ XD_DEBUG_MESSAGE ("Event received"); - EVENT_INIT (event); - - event.kind = DBUS_EVENT; - event.frame_or_window = Qnil; /* Collect the parameters. */ - event.arg = Qnil; - GCPRO1 (event.arg); + args = Qnil; + GCPRO1 (args); if (!dbus_message_iter_init (dmessage, &iter)) { @@ -587,44 +582,59 @@ xd_read_message (bus) /* Loop over the resulting parameters. Construct a list. */ while ((dtype = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) { - event.arg = Fcons (xd_retrieve_arg (dtype, &iter), event.arg); + args = Fcons (xd_retrieve_arg (dtype, &iter), args); dbus_message_iter_next (&iter); } /* The arguments are stored in reverse order. Reorder them. */ - event.arg = Fnreverse (event.arg); + args = Fnreverse (args); - /* Read service, object path, interface and member from the message. - The service is always the unique name of the sending object. */ - strcpy (service, dbus_message_get_sender (dmessage)); + /* Read unique name, object path, interface and member from the + message. */ + strcpy (uname, dbus_message_get_sender (dmessage)); strcpy (path, dbus_message_get_path (dmessage)); strcpy (interface, dbus_message_get_interface (dmessage)); strcpy (member, dbus_message_get_member (dmessage)); - /* Add the registered function of the message. */ - key = list5 (bus, - (service == NULL ? Qnil : build_string (service)), - (path == NULL ? Qnil : build_string (path)), - (interface == NULL ? Qnil : build_string (interface)), - (member == NULL ? Qnil : build_string (member))); - event.arg = Fcons (Fgethash (key, Vdbus_registered_functions_table, Qnil), - event.arg); + /* Search for a registered function of the message. */ + key = list3 (bus, build_string (interface), build_string (member)); + value = Fgethash (key, Vdbus_registered_functions_table, Qnil); - /* Add service, path, interface and member to the event. */ - event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), - event.arg); - event.arg = Fcons ((interface == NULL ? Qnil : build_string (interface)), - event.arg); - event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), - event.arg); - event.arg = Fcons ((service == NULL ? Qnil : build_string (service)), - event.arg); + /* Loop over the registered functions. Construct an event. */ + while (!NILP (value)) + { + key = XCAR (value); + /* key has the structure (SERVICE UNAME PATH HANDLER). */ + if (((uname == NULL) || (NILP (XCAR (XCDR (key)))) || + (strcmp (uname, SDATA (XCAR (XCDR (key)))) == 0)) && + ((path == NULL) || (NILP (XCAR (XCDR (XCDR (key))))) || + (strcmp (path, SDATA (XCAR (XCDR (XCDR (key))))) == 0)) && + (!NILP (XCAR (XCDR (XCDR (XCDR (key))))))) + { + EVENT_INIT (event); + event.kind = DBUS_EVENT; + event.frame_or_window = Qnil; + event.arg = Fcons (XCAR (XCDR (XCDR (XCDR (key)))), args); - /* Add the bus symbol to the event. */ - event.arg = Fcons (bus, event.arg); + /* Add uname, path, interface and member to the event. */ + event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), + event.arg); + event.arg = Fcons ((interface == NULL + ? Qnil : build_string (interface)), + event.arg); + event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), + event.arg); + event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)), + event.arg); - /* Store it into the input event queue. */ - kbd_buffer_store_event (&event); + /* Add the bus symbol to the event. */ + event.arg = Fcons (bus, event.arg); + + /* Store it into the input event queue. */ + kbd_buffer_store_event (&event); + } + value = XCDR (value); + } /* Cleanup. */ dbus_message_unref (dmessage); @@ -683,7 +693,7 @@ SIGNAL and HANDLER must not be nil. Example: (bus, service, path, interface, signal, handler) Lisp_Object bus, service, path, interface, signal, handler; { - Lisp_Object unique_name, key; + Lisp_Object unique_name, key, value; DBusConnection *connection; char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; DBusError derror; @@ -701,6 +711,7 @@ SIGNAL and HANDLER must not be nil. Example: are sent always with the unique name as sender. Note: the unique name of "org.freedesktop.DBus" is that string itself. */ if ((!NILP (service)) && + (strlen (SDATA (service)) > 0) && (strcmp (SDATA (service), DBUS_SERVICE_DBUS) != 0) && (strncmp (SDATA (service), ":", 1) != 0)) unique_name = call2 (intern ("dbus-get-name-owner"), bus, service); @@ -732,16 +743,22 @@ SIGNAL and HANDLER must not be nil. Example: XD_DEBUG_MESSAGE ("Matching rule \"%s\" created", rule); /* Create a hash table entry. */ - key = list5 (bus, unique_name, path, interface, signal); - Fputhash (key, handler, Vdbus_registered_functions_table); - XD_DEBUG_MESSAGE ("\"%s\" registered with handler \"%s\"", - SDATA (format2 ("%s", key, Qnil)), - SDATA (format2 ("%s", handler, Qnil))); + key = list3 (bus, interface, signal); + value = Fgethash (key, Vdbus_registered_functions_table, Qnil); + + if (NILP (Fmember (list4 (service, unique_name, path, handler), value))) + Fputhash (key, + Fcons (list4 (service, unique_name, path, handler), value), + Vdbus_registered_functions_table); /* Return key. */ return key; } +/* The current implementation removes ALL registered functions for a + given signal. Shouldn't be a problem in general, but there might + be cases it is not desired. Maybe we can refine the + implementation. */ DEFUN ("dbus-unregister-signal", Fdbus_unregister_signal, Sdbus_unregister_signal, 1, 1, 0, doc: /* Unregister OBJECT from the D-Bus. @@ -797,15 +814,19 @@ syms_of_dbusbind () DEFVAR_LISP ("dbus-registered-functions-table", &Vdbus_registered_functions_table, doc: /* Hash table of registered functions for D-Bus. -The key in the hash table is the list (BUS SERVICE PATH MEMBER INTERFACE). -BUS is either the symbol `:system' or the symbol `:session'. SERVICE -and PATH are the unique name and the object path of the sending object. -INTERFACE is a string which denotes a D-Bus interface, and MEMBER, -also a string, is either a method or a signal INTERFACE is offering. -All arguments but BUS can be nil, which means a wild card then. +The key in the hash table is the list (BUS MEMBER INTERFACE). BUS is +either the symbol `:system' or the symbol `:session'. INTERFACE is a +string which denotes a D-Bus interface, and MEMBER, also a string, is +either a method or a signal INTERFACE is offering. All arguments but +BUS must not be nil. -The value in the hash table a the function to be called when a D-Bus -message, which matches the key criteria, arrives. */); +The value in the hash table is a list of triple lists +\((SERVICE UNAME PATH HANDLER) (SERVICE UNAME PATH HANDLER) ...). +SERVICE is the service name as registered, UNAME is the corresponding +unique name. PATH is the object path of the sending object. All of +them be nil, which means a wildcard then. HANDLER is the function to +be called when a D-Bus message, which matches the key criteria, +arrives. */); /* We initialize Vdbus_registered_functions_table in dbus.el, because we need to define a hash table function first. */ Vdbus_registered_functions_table = Qnil; From 79945ac143dcf3e16076d9a4a669f987c58f6db1 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 8 Dec 2007 12:56:59 +0000 Subject: [PATCH 043/172] * net/dbus.el (dbus-hash-table=): Remove function. We cannot apply wildcards in a hash table key; there is no usable hash code then. (dbus-registered-functions-table): Use `equal' as test function. (dbus-name-owner-changed-handler): Rewrite due to new hash table structure. --- lisp/ChangeLog | 9 +++++++ lisp/net/dbus.el | 70 +++++++++++++++++------------------------------- 2 files changed, 33 insertions(+), 46 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7608273c9bf..c3b59a1db8f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2007-12-08 Michael Albinus + + * net/dbus.el (dbus-hash-table=): Remove function. We cannot + apply wildcards in a hash table key; there is no usable hash code + then. + (dbus-registered-functions-table): Use `equal' as test function. + (dbus-name-owner-changed-handler): Rewrite due to new hash table + structure. + 2007-12-08 Martin Rudalics * progmodes/cc-cmds.el (c-mask-paragraph): Avoid invalid search diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el index b0f01c24d41..83d0f7fa3ec 100644 --- a/lisp/net/dbus.el +++ b/lisp/net/dbus.el @@ -49,36 +49,9 @@ ;;; Hash table of registered functions. -(defun dbus-hash-table= (x y) - "Compares keys X and Y in the hash table of registered functions for D-Bus. -See `dbus-registered-functions-table' for a description of the hash table." - (and - ;; Bus symbol, either :system or :session. - (equal (car x) (car y)) - ;; Service. - (or - (null (nth 1 x)) (null (nth 1 y)) ; wildcard - (string-equal (nth 1 x) (nth 1 y))) - ;; Path. - (or - (null (nth 2 x)) (null (nth 2 y)) ; wildcard - (string-equal (nth 2 x) (nth 2 y))) - ;; Member. - (or - (null (nth 3 x)) (null (nth 3 y)) ; wildcard - (string-equal (nth 3 x) (nth 3 y))) - ;; Interface. - (or - (null (nth 4 x)) (null (nth 4 y)) ; wildcard - (string-equal (nth 4 x) (nth 4 y))))) - -(define-hash-table-test 'dbus-hash-table-test 'dbus-hash-table= 'sxhash) - -;; When we assume that service, path, interface and and member are -;; always strings in the key, we could use `equal' as test function. -;; But we want to have also `nil' there, being a wildcard. -(setq dbus-registered-functions-table - (make-hash-table :test 'dbus-hash-table-test)) +;; We create it here. So we have a simple test in dbusbind.c, whether +;; the Lisp code has been loaded. +(setq dbus-registered-functions-table (make-hash-table :test 'equal)) (defun dbus-list-hash-table () "Returns all registered signal registrations to D-Bus. @@ -99,24 +72,29 @@ been changed. OLD-OWNER is the previous owner of SERVICE, or the empty string if SERVICE was not owned yet. NEW-OWNER is the new owner of SERVICE, or the empty string if SERVICE looses any name owner." (save-match-data - ;; Check whether SERVICE is a known name, and OLD-OWNER and - ;; NEW-OWNER are defined. + ;; Check whether SERVICE is a known name. (when (and (stringp service) (not (string-match "^:" service)) - (not (zerop (length old-owner))) - (not (zerop (length new-owner)))) - (let ((bus (dbus-event-bus-name last-input-event))) - (maphash - '(lambda (key value) - ;; Check for matching bus and service name. - (when (and (equal bus (car key)) - (string-equal old-owner (nth 1 key))) + (stringp old-owner) (stringp new-owner)) + (maphash + '(lambda (key value) + (dolist (elt value) + ;; key has the structure (BUS INTERFACE SIGNAL). + ;; elt has the structure (SERVICE UNAME PATH HANDLER). + (when (string-equal old-owner (cadr elt)) ;; Remove old key, and add new entry with changed name. - (when dbus-debug (message "Remove rule for %s" key)) - (dbus-unregister-signal key) - (setcar (nthcdr 1 key) new-owner) - (when dbus-debug (message "Add rule for %s" key)) - (apply 'dbus-register-signal (append key (list value))))) - (copy-hash-table dbus-registered-functions-table)))))) + (when dbus-debug (message "Remove rule for %s %s" key elt)) + ;(dbus-unregister-signal key) + (setcar (cdr elt) new-owner) + (when dbus-debug (message "Add rule for %s %s" key elt)) + ;; Maybe we could arrange the lists a little bit better + ;; that we don't need to extract every single element? + (when (not (zerop (length new-owner))) + (dbus-register-signal + ;; BUS SERVICE PATH + (nth 0 key) (nth 0 elt) (nth 2 elt) + ;; INTERFACE SIGNAL HANDLER + (nth 1 key) (nth 2 key) (nth 3 elt)))))) + (copy-hash-table dbus-registered-functions-table))))) ;; Register the handler. (condition-case nil From f8747b72fa825025a603c089fe9456e23a8e3b2c Mon Sep 17 00:00:00 2001 From: Reiner Steib Date: Sat, 8 Dec 2007 14:27:44 +0000 Subject: [PATCH 044/172] Remove "window-system in face definition" [of gnus-treat-emphasize]. Remove "Gnus archive groups". Add comment on gnus-dired.el. --- admin/ChangeLog | 6 ++++++ admin/FOR-RELEASE | 8 ++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/admin/ChangeLog b/admin/ChangeLog index c3252d3ff70..db8795f3aaa 100644 --- a/admin/ChangeLog +++ b/admin/ChangeLog @@ -1,3 +1,9 @@ +2007-12-08 Reiner Steib + + * FOR-RELEASE: Remove "window-system in face definition" [of + gnus-treat-emphasize]. Remove "Gnus archive groups". Add comment + on gnus-dired.el. + 2007-12-05 Glenn Morris * admin.el (set-version): Handle configure.in. Adapt for doc/ diff --git a/admin/FOR-RELEASE b/admin/FOR-RELEASE index 3ab61ba577c..0e4a195e97d 100644 --- a/admin/FOR-RELEASE +++ b/admin/FOR-RELEASE @@ -91,12 +91,8 @@ http://lists.gnu.org/archive/html/emacs-devel/2007-05/msg01339.html ** rms: gnus-dired.el is a mistake. Those features should not be part of Gnus. They should be moved to some other part of Emacs. - -** sdl.web@gmail.com, 28 Oct: window-system in face definition - -** Gnus archive groups are not shown at all if they are not at the default level. -Fixed in Gnus CVS, but the patch has not been synched to Emacs yet: -http://thread.gmane.org/gmane.emacs.gnus.general/65622/focus=65757 +rsteib: Gnus dependencies in `gnus-dired.el' (and `mailcap.el') have been +minimized. I don't know what is left to do here. ** Extra question asked when doing a reply in Gnus Fixed in Gnus CVS, but the patch has not been synched to Emacs yet: From cf944fa4ed344c5ad732b7e1218e399c8a173490 Mon Sep 17 00:00:00 2001 From: Reiner Steib Date: Sat, 8 Dec 2007 14:29:18 +0000 Subject: [PATCH 045/172] Add minimal Gnus item. --- etc/ChangeLog | 4 ++++ etc/NEWS | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/etc/ChangeLog b/etc/ChangeLog index 182b7d1e098..a0a3707ed06 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,7 @@ +2007-12-08 Reiner Steib + + * NEWS: Add minimal Gnus item. + 2007-12-08 Dan Nicolaescu * emacs.desktop: New file. diff --git a/etc/NEWS b/etc/NEWS index 5af239c8f4c..ba5b86e6727 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -347,6 +347,14 @@ rather than fortran-indent-comment. +++ *** (The increasingly misnamed) F90 mode supports Fortran 2003 syntax. +** Gnus package + +*** The Gnus package has been updated + +*** There are many news features, bug fixes and improvements. + +See the file GNUS-NEWS or the node "No Gnus" in the Gnus manual for details. + ** Miscellaneous *** comint-mode uses `start-file-process' now (see Lisp Changes). From 5f33ef98e1ba8307bc12dbb739236df34056bf93 Mon Sep 17 00:00:00 2001 From: Reiner Steib Date: Sat, 8 Dec 2007 14:32:28 +0000 Subject: [PATCH 046/172] (etc-sudoers-generic-mode): New mode. (generic-unix-modes): Add it. --- lisp/ChangeLog | 5 +++++ lisp/generic-x.el | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c3b59a1db8f..31ed800f678 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-08 Reiner Steib + + * generic-x.el (etc-sudoers-generic-mode): New mode. + (generic-unix-modes): Add it. + 2007-12-08 Michael Albinus * net/dbus.el (dbus-hash-table=): Remove function. We cannot diff --git a/lisp/generic-x.el b/lisp/generic-x.el index f400b299b9e..f9f3b923f26 100644 --- a/lisp/generic-x.el +++ b/lisp/generic-x.el @@ -221,6 +221,7 @@ This hook will be installed if the variable etc-modules-conf-generic-mode etc-passwd-generic-mode etc-services-generic-mode + etc-sudoers-generic-mode fvwm-generic-mode inetd-conf-generic-mode mailagent-rules-generic-mode @@ -1736,6 +1737,21 @@ like an INI file. You can add this hook to `find-file-hook'." (setq imenu-generic-expression '((nil "^\\([^# \t]+\\)\\s-+" 1)))))))) +;; /etc/sudoers +(when (memq 'etc-sudoers-generic-mode generic-extras-enable-list) + +(define-generic-mode etc-sudoers-generic-mode + '(?#) + '("User_Alias" "Runas_Alias" "Host_Alias" "Cmnd_Alias" + "NOPASSWD" "PASSWD" "NOEXEC" "EXEC" + "ALL") + '(("\\<\\(root\\|su\\)\\>" 1 font-lock-warning-face) + ("\\(\\*\\)" 1 font-lock-warning-face) + ("\\<\\(%[A-Za-z0-9_]+\\)\\>" 1 font-lock-variable-name-face)) + '("/etc/sudoers\\'") + nil + "Generic mode for sudoers configuration files.")) + ;; From Jacques Duthen (when (memq 'show-tabs-generic-mode generic-extras-enable-list) From 44b275c456335d5959035aadfdcf729432ecd278 Mon Sep 17 00:00:00 2001 From: Reiner Steib Date: Sat, 8 Dec 2007 14:33:53 +0000 Subject: [PATCH 047/172] (tab-stop-list): Mark as safe-local-variable. --- lisp/ChangeLog | 2 ++ lisp/indent.el | 1 + 2 files changed, 3 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 31ed800f678..15fc156ded6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2007-12-08 Reiner Steib + * indent.el (tab-stop-list): Mark as safe-local-variable. + * generic-x.el (etc-sudoers-generic-mode): New mode. (generic-unix-modes): Add it. diff --git a/lisp/indent.el b/lisp/indent.el index 30ba4ec2b88..225395dcc80 100644 --- a/lisp/indent.el +++ b/lisp/indent.el @@ -454,6 +454,7 @@ See also `indent-relative-maybe'." This should be a list of integers, ordered from smallest to largest." :group 'indent :type '(repeat integer)) +(put 'tab-stop-list 'safe-local-variable 'listp) (defvar edit-tab-stops-map (let ((map (make-sparse-keymap))) From 8b9a562392a4756e5846aa1a032af61183e3e18c Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 8 Dec 2007 17:06:06 +0000 Subject: [PATCH 048/172] (check-declare): New target. (BYTE_COMPILE_EXTRA_FLAGS): New variable. (.el.elc, compile-CMD, compile-SH, compile-always-CMD) (compile-always-SH, compile-calc-CMD, compile-calc-SH) ($(lisp)/progmodes/cc-mode.elc): Use it. ($(lisp)/progmodes/cc-mode.elc): New rule. --- lisp/ChangeLog | 11 +++++++++++ lisp/makefile.w32-in | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 15fc156ded6..638fdbae06b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2007-12-08 Eli Zaretskii + + Sync makefile.w32-in with Makefile.in. + + * makefile.w32-in (check-declare): New target. + (BYTE_COMPILE_EXTRA_FLAGS): New variable. + (.el.elc, compile-CMD, compile-SH, compile-always-CMD) + (compile-always-SH, compile-calc-CMD, compile-calc-SH) + ($(lisp)/progmodes/cc-mode.elc): Use it. + ($(lisp)/progmodes/cc-mode.elc): New rule. + 2007-12-08 Reiner Steib * indent.el (tab-stop-list): Mark as safe-local-variable. diff --git a/lisp/makefile.w32-in b/lisp/makefile.w32-in index c955671d0ed..4b4d732e811 100644 --- a/lisp/makefile.w32-in +++ b/lisp/makefile.w32-in @@ -40,6 +40,12 @@ EMACS = $(THISDIR)/../bin/emacs.exe EMACSOPT = -batch --no-init-file --no-site-file --multibyte +# Extra flags to pass to the byte compiler +BYTE_COMPILE_EXTRA_FLAGS = +# For example to not display the undefined function warnings you can use this: +# BYTE_COMPILE_EXTRA_FLAGS = --eval '(setq byte-compile-warnings (quote (not unresolved)))' +# The example above is just for developers, it should not be used by default. + # Set EMACSLOADPATH correctly (already defined in environment). EMACSLOADPATH=$(lisp) @@ -198,7 +204,7 @@ TAGS-LISP: $(lisptagsfiles1) $(lisptagsfiles2) .SUFFIXES: .elc .el .el.elc: - -$(emacs) -f batch-byte-compile $< + -$(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $< # Compile all Lisp files, but don't recompile those that are up to # date. Some files don't actually get compiled because they set the @@ -218,22 +224,22 @@ compile: $(lisp)/subdirs.el mh-autoloads compile-$(SHELLTYPE) doit compile-CMD: # -for %%f in ($(lisp) $(WINS)) do for %%g in (%%f\*.elc) do @attrib -r %%g for %%f in ($(COMPILE_FIRST)) do \ - $(emacs) -l loaddefs -f batch-byte-compile-if-not-done %%f + $(emacs) -l loaddefs $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile-if-not-done %%f for %%f in (. $(WINS)) do for %%g in (%%f/*.el) do \ - $(emacs) -l loaddefs -f batch-byte-compile-if-not-done %%f/%%g + $(emacs) -l loaddefs $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile-if-not-done %%f/%%g compile-SH: # for elc in $(lisp)/*.elc $(lisp)/*/*.elc; do attrib -r $$elc; done for el in $(COMPILE_FIRST); do \ echo Compiling $$el; \ - $(emacs) -l loaddefs -f batch-byte-compile-if-not-done $$el; \ + $(emacs) -l loaddefs $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile-if-not-done $$el; \ done for dir in $(lisp) $(WINS); do \ for el in $$dir/*.el; do \ if test -f $$el; \ then \ echo Compiling $$el; \ - $(emacs) -l loaddefs -f batch-byte-compile-if-not-done $$el; \ + $(emacs) -l loaddefs $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile-if-not-done $$el; \ fi \ done; \ done @@ -246,31 +252,31 @@ compile-always: $(lisp)/subdirs.el compile-always-$(SHELLTYPE) doit compile-always-CMD: # -for %%f in ($(lisp) $(WINS)) do for %%g in (%%f\*.elc) do @attrib -r %%g - for %%f in ($(COMPILE_FIRST)) do $(emacs) -f batch-byte-compile %%f - for %%f in (. $(WINS)) do for %%g in (%%f/*.el) do $(emacs) -f batch-byte-compile %%f/%%g + for %%f in ($(COMPILE_FIRST)) do $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile %%f + for %%f in (. $(WINS)) do for %%g in (%%f/*.el) do $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile %%f/%%g compile-always-SH: # for elc in $(lisp)/*.elc $(lisp)/*/*.elc; do attrib -r $$elc; done for el in $(COMPILE_FIRST); do \ echo Compiling $$el; \ - $(emacs) -f batch-byte-compile $$el || exit 1; \ + $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $$el || exit 1; \ done for dir in $(lisp) $(WINS); do \ for el in $$dir/*.el; do \ echo Compiling $$el; \ - $(emacs) -f batch-byte-compile $$el || exit 1; \ + $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $$el || exit 1; \ done; \ done compile-calc: compile-calc-$(SHELLTYPE) compile-calc-CMD: - for %%f in ($(lisp)/calc/*.el) do $(emacs) -f batch-byte-compile %%f + for %%f in ($(lisp)/calc/*.el) do $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile %%f compile-calc-SH: for el in $(lisp)/calc/*.el; do \ echo Compiling $$el; \ - $(emacs) -f batch-byte-compile $$el || exit 1; \ + $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $$el || exit 1; \ done # Backup compiled Lisp files in elc.tar.gz. If that file already @@ -292,6 +298,15 @@ compile-after-backup: backup-compiled-files compile-always recompile: mh-autoloads doit $(lisp)/progmodes/cc-mode.elc $(emacs) --eval $(ARGQUOTE)(batch-byte-recompile-directory 0)$(ARGQUOTE) $(lisp) +# CC Mode uses a compile time macro system which causes a compile time +# dependency in cc-mode.elc on the macros in cc-langs.el and the +# version string in cc-defs.el. +$(lisp)/progmodes/cc-mode.elc: \ + $(lisp)/progmodes/cc-mode.el \ + $(lisp)/progmodes/cc-langs.el \ + $(lisp)/progmodes/cc-defs.el + $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $(lisp)/progmodes/cc-mode.el + # Update MH-E internal autoloads. These are not to be confused with # the autoloads for the MH-E entry points, which are already in # loaddefs.el. @@ -440,6 +455,11 @@ install-lisp-CMD: for %%f in ($(WINS)) do cp -f %%f/*.el "$(INSTALL_DIR)/lisp/%%f" for %%f in (. $(WINS)) do cp -f %%f/*.elc "$(INSTALL_DIR)/lisp/%%f" +# WARNING: Do NOT split the part inside $(ARGQUOTE)s into multiple lines as +# this can break with GNU Make 3.81 and later if sh.exe is used. +check-declare: + $(emacs) -l $(lisp)/emacs-lisp/check-declare --eval $(ARGQUOTE)(check-declare-directory $(DQUOTE)$(lisp)$(DQUOTE))$(ARGQUOTE) + # # Maintenance # From 6341f357553e35a165f08e0e75eed4b2bc91c48f Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu Date: Sat, 8 Dec 2007 17:58:56 +0000 Subject: [PATCH 049/172] New file. --- etc/NEWS | 2 + lisp/ChangeLog | 5 + lisp/progmodes/verilog-mode.el | 10335 +++++++++++++++++++++++++++++++ 3 files changed, 10342 insertions(+) create mode 100644 lisp/progmodes/verilog-mode.el diff --git a/etc/NEWS b/etc/NEWS index bc5ae9a68e8..d850556e9d6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -88,6 +88,8 @@ that the desktop being saved is not an update of the one on disk. ** The new package vera-mode.el provides a major mode for editing Vera files. +** The new package verilog-mode.el provides a major mode for editing Verilog files. + ** The new package socks.el implements the SOCKS v5 protocol. ** VC diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2ff7fc670f5..42bc35bb7ca 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-08 Michael McNamara + Wilson Snyder + + * progmodes/verilog-mode.el: New file. + 2007-12-08 Eli Zaretskii * international/latexenc.el (latexenc-find-file-coding-system): If diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el new file mode 100644 index 00000000000..672ec981838 --- /dev/null +++ b/lisp/progmodes/verilog-mode.el @@ -0,0 +1,10335 @@ +;; verilog-mode.el --- major mode for editing verilog source in Emacs +;; +;; $Id: verilog-mode.el 377 2007-12-07 17:21:25Z wsnyder $ + +;; Copyright (C) 1996-2007 Free Software Foundation, Inc. + +;; Author: Michael McNamara (mac@verilog.com) +;; http://www.verilog.com +;; +;; AUTO features, signal, modsig; by: Wilson Snyder +;; (wsnyder@wsnyder.org) +;; http://www.veripool.com +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; This mode borrows heavily from the Pascal-mode and the cc-mode of emacs + +;; USAGE +;; ===== + +;; A major mode for editing Verilog HDL source code. When you have +;; entered Verilog mode, you may get more info by pressing C-h m. You +;; may also get online help describing various functions by: C-h f +;; + +;; KNOWN BUGS / BUG REPORTS +;; ======================= + +;; Verilog is a rapidly evolving language, and hence this mode is +;; under continuous development. Hence this is beta code, and likely +;; has bugs. Please report any and all bugs to me at mac@verilog.com. +;; Please use verilog-submit-bug-report to submit a report; type C-c +;; C-b to invoke this and as a result I will have a much easier time +;; of reproducing the bug you find, and hence fixing it. + +;; INSTALLING THE MODE +;; =================== + +;; An older version of this mode may be already installed as a part of +;; your environment, and one method of updating would be to update +;; your emacs environment. Sometimes this is difficult for local +;; political/control reasons, and hence you can always install a +;; private copy (or even a shared copy) which overrides the system +;; default. + +;; You can get step by step help in installing this file by going to +;; + +;; The short list of installation instructions are: To set up +;; automatic verilog mode, put this file in your load path, and put +;; the following in code (please un comment it first!) in your +;; .emacs, or in your site's site-load.el + +; (autoload 'verilog-mode "verilog-mode" "Verilog mode" t ) +; (setq auto-mode-alist (cons '("\\.v\\'" . verilog-mode) auto-mode-alist)) +; (setq auto-mode-alist (cons '("\\.dv\\'" . verilog-mode) auto-mode-alist)) + +;; If you want to customize Verilog mode to fit your needs better, +;; you may add these lines (the values of the variables presented +;; here are the defaults). Note also that if you use an emacs that +;; supports custom, it's probably better to use the custom menu to +;; edit these. +;; +;; Be sure to examine at the help for verilog-auto, and the other +;; verilog-auto-* functions for some major coding time savers. +;; +; ;; User customization for Verilog mode +; (setq verilog-indent-level 3 +; verilog-indent-level-module 3 +; verilog-indent-level-declaration 3 +; verilog-indent-level-behavioral 3 +; verilog-indent-level-directive 1 +; verilog-case-indent 2 +; verilog-auto-newline t +; verilog-auto-indent-on-newline t +; verilog-tab-always-indent t +; verilog-auto-endcomments t +; verilog-minimum-comment-distance 40 +; verilog-indent-begin-after-if t +; verilog-auto-lineup '(all) +; verilog-highlight-p1800-keywords nil +; verilog-linter "my_lint_shell_command" +; ) + +;; + +;;; History: +;; +;; +;;; Code: + +(provide 'verilog-mode) + +;; This variable will always hold the version number of the mode +(defconst verilog-mode-version (substring "$$Revision: 377 $$" 12 -3) + "Version of this verilog mode.") +(defconst verilog-mode-release-date (substring "$$Date: 2007-12-07 12:21:25 -0500 (Fri, 07 Dec 2007) $$" 8 -3) + "Version of this verilog mode.") + +(defun verilog-version () + "Inform caller of the version of this file." + (interactive) + (message (concat "Using verilog-mode version " verilog-mode-version) )) + +;; Insure we have certain packages, and deal with it if we don't +(if (fboundp 'eval-when-compile) + (eval-when-compile + (require 'verilog-mode) + (condition-case nil + (require 'imenu) + (error nil)) + (condition-case nil + (require 'reporter) + (error nil)) + (condition-case nil + (require 'easymenu) + (error nil)) + (condition-case nil + (require 'regexp-opt) + (error nil)) + (condition-case nil + (load "skeleton") ;; bug in 19.28 through 19.30 skeleton.el, not provided. + (error nil)) + (condition-case nil + (require 'vc) + (error nil)) + (condition-case nil + (if (fboundp 'when) + nil ;; fab + (defmacro when (var &rest body) + (` (cond ( (, var) (,@ body)))))) + (error nil)) + (condition-case nil + (if (fboundp 'unless) + nil ;; fab + (defmacro unless (var &rest body) + (` (if (, var) nil (,@ body))))) + (error nil)) + (condition-case nil + (if (fboundp 'store-match-data) + nil ;; fab + (defmacro store-match-data (&rest args) nil)) + (error nil)) + (condition-case nil + (if (boundp 'current-menubar) + nil ;; great + (progn + (defmacro set-buffer-menubar (&rest args) nil) + (defmacro add-submenu (&rest args) nil)) + ) + (error nil)) + (condition-case nil + (if (fboundp 'zmacs-activate-region) + nil ;; great + (defmacro zmacs-activate-region (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'char-before) + nil ;; great + (defmacro char-before (&rest body) + (` (char-after (1- (point)))))) + (error nil)) + ;; Requires to define variables that would be "free" warnings + (condition-case nil + (require 'font-lock) + (error nil)) + (condition-case nil + (require 'compile) + (error nil)) + (condition-case nil + (require 'custom) + (error nil)) + (condition-case nil + (require 'dinotrace) + (error nil)) + (condition-case nil + (if (fboundp 'dinotrace-unannotate-all) + nil ;; great + (defun dinotrace-unannotate-all (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'customize-apropos) + nil ;; great + (defun customize-apropos (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'match-string-no-properties) + nil ;; great + (defsubst match-string-no-properties (num &optional string) + "Return string of text matched by last search, without text properties. +NUM specifies which parenthesized expression in the last regexp. + Value is nil if NUMth pair didn't match, or there were less than NUM pairs. +Zero means the entire text matched by the whole regexp or whole string. +STRING should be given if the last search was by `string-match' on STRING." + (if (match-beginning num) + (if string + (let ((result + (substring string (match-beginning num) (match-end num)))) + (set-text-properties 0 (length result) nil result) + result) + (buffer-substring-no-properties (match-beginning num) + (match-end num) + (current-buffer) + ))))) + (error nil)) + (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) + nil ;; We've got what we needed + ;; We have the old custom-library, hack around it! + (defmacro defgroup (&rest args) nil) + (defmacro customize (&rest args) + (message "Sorry, Customize is not available with this version of emacs")) + (defmacro defcustom (var value doc &rest args) + (` (defvar (, var) (, value) (, doc)))) + ) + (if (fboundp 'defface) + nil ; great! + (defmacro defface (var value doc &rest args) + (` (make-face (, var)))) + ) + + (if (and (featurep 'custom) (fboundp 'customize-group)) + nil ;; We've got what we needed + ;; We have an intermediate custom-library, hack around it! + (defmacro customize-group (var &rest args) + (`(customize (, var) ))) + ) + + )) +;; Provide a regular expression optimization routine, using regexp-opt +;; if provided by the user's elisp libraries +(eval-and-compile + (if (fboundp 'regexp-opt) + ;; regexp-opt is defined, does it take 3 or 2 arguments? + (if (fboundp 'function-max-args) + (case (function-max-args `regexp-opt) + ( 3 ;; It takes 3 + (condition-case nil ; Hide this defun from emacses + ;with just a two input regexp + (defun verilog-regexp-opt (a b) + "Deal with differing number of required arguments for `regexp-opt'. + Call 'regexp-opt' on A and B." + (regexp-opt a b 't) + ) + (error nil)) + ) + ( 2 ;; It takes 2 + (defun verilog-regexp-opt (a b) + "Call 'regexp-opt' on A and B." + (regexp-opt a b)) + ) + ( t nil)) + ;; We can't tell; assume it takes 2 + (defun verilog-regexp-opt (a b) + "Call 'regexp-opt' on A and B." + (regexp-opt a b)) + ) + ;; There is no regexp-opt, provide our own + (defun verilog-regexp-opt (strings &optional paren shy) + (let ((open (if paren "\\(" "")) (close (if paren "\\)" ""))) + (concat open (mapconcat 'regexp-quote strings "\\|") close))) + )) + +(eval-when-compile + (defun verilog-regexp-words (a) + "Call 'regexp-opt' with word delimiters." + (concat "\\<" (verilog-regexp-opt a t) "\\>"))) + +(defun verilog-regexp-words (a) + "Call 'regexp-opt' with word delimiters for the words A." + (concat "\\<" (verilog-regexp-opt a t) "\\>")) + +(defun verilog-customize () + "Link to customize screen for Verilog." + (interactive) + (customize-group 'verilog-mode)) + +(defun verilog-font-customize () + "Link to customize fonts used for Verilog." + (interactive) + (customize-apropos "font-lock-*" 'faces)) + +(defgroup verilog-mode nil + "Facilitates easy editing of Verilog source text" + :group 'languages) + +; (defgroup verilog-mode-fonts nil +; "Facilitates easy customization fonts used in Verilog source text" +; :link '(customize-apropos "font-lock-*" 'faces) +; :group 'verilog-mode) + +(defgroup verilog-mode-indent nil + "Customize indentation and highlighting of verilog source text" + :group 'verilog-mode) + +(defgroup verilog-mode-actions nil + "Customize actions on verilog source text" + :group 'verilog-mode) + +(defgroup verilog-mode-auto nil + "Customize AUTO actions when expanding verilog source text" + :group 'verilog-mode) + +(defcustom verilog-linter + "echo 'No verilog-linter set, see \"M-x describe-variable verilog-linter\"'" + "*Unix program and arguments to call to run a lint checker on verilog source. +Depending on the `verilog-set-compile-command', this may be invoked when +you type \\[compile]. When the compile completes, \\[next-error] will take +you to the next lint error." + :type 'string + :group 'verilog-mode-actions) + +(defcustom verilog-coverage + "echo 'No verilog-coverage set, see \"M-x describe-variable verilog-coverage\"'" + "*Program and arguments to use to annotate for coverage verilog source. +Depending on the `verilog-set-compile-command', this may be invoked when +you type \\[compile]. When the compile completes, \\[next-error] will take +you to the next lint error." + :type 'string + :group 'verilog-mode-actions) + +(defcustom verilog-simulator + "echo 'No verilog-simulator set, see \"M-x describe-variable verilog-simulator\"'" + "*Program and arguments to use to interpret verilog source. +Depending on the `verilog-set-compile-command', this may be invoked when +you type \\[compile]. When the compile completes, \\[next-error] will take +you to the next lint error." + :type 'string + :group 'verilog-mode-actions) + +(defcustom verilog-compiler + "echo 'No verilog-compiler set, see \"M-x describe-variable verilog-compiler\"'" + "*Program and arguments to use to compile verilog source. +Depending on the `verilog-set-compile-command', this may be invoked when +you type \\[compile]. When the compile completes, \\[next-error] will take +you to the next lint error." + :type 'string + :group 'verilog-mode-actions) + +(defvar verilog-tool 'verilog-linter + "Which tool to use for building compiler-command. +Either nil, `verilog-linter, `verilog-coverage, `verilog-simulator, or +`verilog-compiler. Alternatively use the \"Choose Compilation Action\" +menu. See `verilog-set-compile-command' for more information.") + +(defcustom verilog-highlight-translate-off nil + "*Non-nil means background-highlight code excluded from translation. +That is, all code between \"// synopsys translate_off\" and +\"// synopsys translate_on\" is highlighted using a different background color +\(face `verilog-font-lock-translate-off-face'). + +Note: This will slow down on-the-fly fontification (and thus editing). + +Note: Activate the new setting in a Verilog buffer by re-fontifying it (menu +entry \"Fontify Buffer\"). XEmacs: turn off and on font locking." + :type 'boolean + :group 'verilog-mode-indent) + +(defcustom verilog-indent-level 3 + "*Indentation of Verilog statements with respect to containing block." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-indent-level-module 3 + "*Indentation of Module level Verilog statements. (eg always, initial) +Set to 0 to get initial and always statements lined up on the left side of +your screen." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-indent-level-declaration 3 + "*Indentation of declarations with respect to containing block. +Set to 0 to get them list right under containing block." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-indent-declaration-macros nil + "*How to treat macro expansions in a declaration. +If nil, indent as: + input [31:0] a; + input `CP; + output c; +If non nil, treat as: + input [31:0] a; + input `CP ; + output c;" + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-indent-lists t + "*How to treat indenting items in a list. +If t (the default), indent as: + always @( posedge a or + reset ) begin + +If nil, treat as: + always @( posedge a or + reset ) begin" + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-indent-level-behavioral 3 + "*Absolute indentation of first begin in a task or function block. +Set to 0 to get such code to start at the left side of the screen." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-indent-level-directive 1 + "*Indentation to add to each level of `ifdef declarations. +Set to 0 to have all directives start at the left side of the screen." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-cexp-indent 2 + "*Indentation of Verilog statements split across lines." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-case-indent 2 + "*Indentation for case statements." + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-auto-newline t + "*True means automatically newline after semicolons." + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-auto-indent-on-newline t + "*True means automatically indent line after newline." + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-tab-always-indent t + "*True means TAB should always re-indent the current line. +Nil means TAB will only reindent when at the beginning of the line." + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-tab-to-comment nil + "*True means TAB moves to the right hand column in preparation for a comment." + :group 'verilog-mode-actions + :type 'boolean) + +(defcustom verilog-indent-begin-after-if t + "*If true, indent begin statements following if, else, while, for and repeat. +Otherwise, line them up." + :group 'verilog-mode-indent + :type 'boolean ) + + +(defcustom verilog-align-ifelse nil + "*If true, align `else' under matching `if'. +Otherwise else is lined up with first character on line holding matching if." + :group 'verilog-mode-indent + :type 'boolean ) + +(defcustom verilog-minimum-comment-distance 10 + "*Minimum distance (in lines) between begin and end required before a comment. +Setting this variable to zero results in every end acquiring a comment; the +default avoids too many redundant comments in tight quarters" + :group 'verilog-mode-indent + :type 'integer) + +(defcustom verilog-auto-lineup '(declaration) + "*Algorithm for lining up statements on multiple lines. + +If this list contains the symbol 'all', then all line ups described below +are done. + +If this list contains the symbol 'declaration', then declarations are lined up +with any preceding declarations, taking into account widths and the like, so +for example the code: + reg [31:0] a; + reg b; +would become + reg [31:0] a; + reg b; + +If this list contains the symbol 'assignment', then assignments are lined up +with any preceding assignments, so for example the code + a_long_variable = b + c; + d = e + f; +would become + a_long_variable = b + c; + d = e + f;" + +;; The following is not implemented: +;If this list contains the symbol 'case', then case items are lined up +;with any preceding case items, so for example the code +; case (a) begin +; a_long_state : a = 3; +; b: a = 4; +; endcase +;would become +; case (a) begin +; a_long_state : a = 3; +; b : a = 4; +; endcase +; + + :group 'verilog-mode-indent + :type 'list ) + +(defcustom verilog-highlight-p1800-keywords nil + "*If true highlight words newly reserved by IEEE-1800 in +verilog-font-lock-p1800-face in order to gently suggest changing where +these words are used as variables to something else. Nil means highlight +these words as appropriate for the SystemVerilog IEEE-1800 standard. Note +that changing this will require restarting emacs to see the effect as font +color choices are cached by emacs" + :group 'verilog-mode-indent + :type 'boolean) + +(defcustom verilog-auto-endcomments t + "*True means insert a comment /* ... */ after 'end's. +The name of the function or case will be set between the braces." + :group 'verilog-mode-actions + :type 'boolean ) + +(defcustom verilog-auto-read-includes nil + "*True means to automatically read includes before AUTOs. +This will do a `verilog-read-defines' and `verilog-read-includes' before +each AUTO expansion. This makes it easier to embed defines and includes, +but can result in very slow reading times if there are many or large +include files." + :group 'verilog-mode-actions + :type 'boolean ) + +(defcustom verilog-auto-save-policy nil + "*Non-nil indicates action to take when saving a Verilog buffer with AUTOs. +A value of `force' will always do a \\[verilog-auto] automatically if +needed on every save. A value of `detect' will do \\[verilog-auto] +automatically when it thinks necessary. A value of `ask' will query the +user when it thinks updating is needed. + +You should not rely on the 'ask or 'detect policies, they are safeguards +only. They do not detect when AUTOINSTs need to be updated because a +sub-module's port list has changed." + :group 'verilog-mode-actions + :type '(choice (const nil) (const ask) (const detect) (const force))) + +(defcustom verilog-auto-star-expand t + "*Non-nil indicates to expand a SystemVerilog .* instance ports. +They will be expanded in the same way as if there was a AUTOINST in the +instantiation. See also `verilog-auto-star' and `verilog-auto-star-save'." + :group 'verilog-mode-actions + :type 'boolean) + +(defcustom verilog-auto-star-save nil + "*Non-nil indicates to save to disk SystemVerilog .* instance expansions. +Nil indicates direct connections will be removed before saving. Only +meaningful to those created due to `verilog-auto-star-expand' being set. + +Instead of setting this, you may want to use /*AUTOINST*/, which will +always be saved." + :group 'verilog-mode-actions + :type 'boolean) + +(defvar verilog-auto-update-tick nil + "Modification tick at which autos were last performed.") + +(defvar verilog-auto-last-file-locals nil + "Text from file-local-variables during last evaluation.") + +(defvar verilog-error-regexp-add-didit nil) +(defvar verilog-error-regexp nil) +(setq verilog-error-regexp-add-didit nil + verilog-error-regexp + '( + ; SureLint +;; ("[^\n]*\\[\\([^:]+\\):\\([0-9]+\\)\\]" 1 2) + ; Most SureFire tools + ("\\(WARNING\\|ERROR\\|INFO\\)[^:]*: \\([^,]+\\), \\(line \\|\\)\\([0-9]+\\):" 2 4 ) + ("\ +\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\ +:\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5) + ; xsim + ; Error! in file /homes/mac/Axis/Xsim/test.v at line 13 [OBJ_NOT_DECLARED] + ("\\(Error\\|Warning\\).*in file (\\([^ \t]+\\) at line *\\([0-9]+\\))" 2 3) + ; vcs + ("\\(Error\\|Warning\\):[^(]*(\\([^ \t]+\\) line *\\([0-9]+\\))" 2 3) + ("Warning:.*(port.*(\\([^ \t]+\\) line \\([0-9]+\\))" 1 2) + ("\\(Error\\|Warning\\):[\n.]*\\([^ \t]+\\) *\\([0-9]+\\):" 2 3) + ("syntax error:.*\n\\([^ \t]+\\) *\\([0-9]+\\):" 1 2) + ; Verilator + ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4) + ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4) + ; vxl + ("\\(Error\\|Warning\\)!.*\n?.*\"\\([^\"]+\\)\", \\([0-9]+\\)" 2 3) + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+\\([0-9]+\\):.*$" 1 2) ; vxl + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+line[ \t]+\\([0-9]+\\):.*$" 1 2) + ; nc-verilog + (".*\\*[WE],[0-9A-Z]+ (\\([^ \t,]+\\),\\([0-9]+\\)|" 1 2) + ; Leda + ("In file \\([^ \t]+\\)[ \t]+line[ \t]+\\([0-9]+\\):\n[^\n]*\n[^\n]*\n\\[\\(Warning\\|Error\\|Failure\\)\\][^\n]*" 1 2) + ) +; "*List of regexps for verilog compilers, like verilint. See compilation-error-regexp-alist for the formatting." +) + +(defvar verilog-error-font-lock-keywords + '( + ("[^\n]*\\[\\([^:]+\\):\\([0-9]+\\)\\]" 1 bold t) + ("[^\n]*\\[\\([^:]+\\):\\([0-9]+\\)\\]" 2 bold t) + + ("\\(WARNING\\|ERROR\\|INFO\\): \\([^,]+\\), line \\([0-9]+\\):" 2 bold t) + ("\\(WARNING\\|ERROR\\|INFO\\): \\([^,]+\\), line \\([0-9]+\\):" 3 bold t) + + ("\ +\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\ +:\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 bold t) + ("\ +\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\ +:\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 bold t) + + ("\\(Error\\|Warning\\):[^(]*(\\([^ \t]+\\) line *\\([0-9]+\\))" 2 bold t) + ("\\(Error\\|Warning\\):[^(]*(\\([^ \t]+\\) line *\\([0-9]+\\))" 3 bold t) + + ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 bold t) + ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 4 bold t) + + ("Warning:.*(port.*(\\([^ \t]+\\) line \\([0-9]+\\))" 1 bold t) + ("Warning:.*(port.*(\\([^ \t]+\\) line \\([0-9]+\\))" 1 bold t) + + ("\\(Error\\|Warning\\):[\n.]*\\([^ \t]+\\) *\\([0-9]+\\):" 2 bold t) + ("\\(Error\\|Warning\\):[\n.]*\\([^ \t]+\\) *\\([0-9]+\\):" 3 bold t) + + ("syntax error:.*\n\\([^ \t]+\\) *\\([0-9]+\\):" 1 bold t) + ("syntax error:.*\n\\([^ \t]+\\) *\\([0-9]+\\):" 2 bold t) + ; vxl + ("\\(Error\\|Warning\\)!.*\n?.*\"\\([^\"]+\\)\", \\([0-9]+\\)" 2 bold t) + ("\\(Error\\|Warning\\)!.*\n?.*\"\\([^\"]+\\)\", \\([0-9]+\\)" 2 bold t) + + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+\\([0-9]+\\):.*$" 1 bold t) + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+\\([0-9]+\\):.*$" 2 bold t) + + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+line[ \t]+\\([0-9]+\\):.*$" 1 bold t) + ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+line[ \t]+\\([0-9]+\\):.*$" 2 bold t) + ; nc-verilog + (".*[WE],[0-9A-Z]+ (\\([^ \t,]+\\),\\([0-9]+\\)|" 1 bold t) + (".*[WE],[0-9A-Z]+ (\\([^ \t,]+\\),\\([0-9]+\\)|" 2 bold t) + ; Leda + ("In file \\([^ \t]+\\)[ \t]+line[ \t]+\\([0-9]+\\):\n[^\n]*\n[^\n]*\n\\[\\(Warning\\|Error\\|Failure\\)\\][^\n]*" 1 bold t) + ("In file \\([^ \t]+\\)[ \t]+line[ \t]+\\([0-9]+\\):\n[^\n]*\n[^\n]*\n\\[\\(Warning\\|Error\\|Failure\\)\\][^\n]*" 2 bold t) + ) + "*Keywords to also highlight in Verilog *compilation* buffers." + ) + +(defcustom verilog-library-flags '("") + "*List of standard Verilog arguments to use for /*AUTOINST*/. +These arguments are used to find files for `verilog-auto', and match +the flags accepted by a standard Verilog-XL simulator. + + -f filename Reads more `verilog-library-flags' from the filename. + +incdir+dir Adds the directory to `verilog-library-directories'. + -Idir Adds the directory to `verilog-library-directories'. + -y dir Adds the directory to `verilog-library-directories'. + +libext+.v Adds the extensions to `verilog-library-extensions'. + -v filename Adds the filename to `verilog-library-files'. + + filename Adds the filename to `verilog-library-files'. + This is not recommended, -v is a better choice. + +You might want these defined in each file; put at the *END* of your file +something like: + + // Local Variables: + // verilog-library-flags:(\"-y dir -y otherdir\") + // End: + +Verilog-mode attempts to detect changes to this local variable, but they +are only insured to be correct when the file is first visited. Thus if you +have problems, use \\[find-alternate-file] RET to have these take effect. + +See also the variables mentioned above." + :group 'verilog-mode-auto + :type '(repeat string)) + +(defcustom verilog-library-directories '(".") + "*List of directories when looking for files for /*AUTOINST*/. +The directory may be relative to the current file, or absolute. +Environment variables are also expanded in the directory names. +Having at least the current directory is a good idea. + +You might want these defined in each file; put at the *END* of your file +something like: + + // Local Variables: + // verilog-library-directories:(\".\" \"subdir\" \"subdir2\") + // End: + +Verilog-mode attempts to detect changes to this local variable, but they +are only insured to be correct when the file is first visited. Thus if you +have problems, use \\[find-alternate-file] RET to have these take effect. + +See also `verilog-library-flags', `verilog-library-files' +and `verilog-library-extensions'." + :group 'verilog-mode-auto + :type '(repeat file)) + +(defcustom verilog-library-files '() + "*List of files to search for modules when looking for AUTOINST files. +This is a complete path, usually to a technology file with many standard +cells defined in it. + +You might want these defined in each file; put at the *END* of your file +something like: + + // Local Variables: + // verilog-library-files:(\"/some/path/technology.v\" \"/some/path/tech2.v\") + // End: + +Verilog-mode attempts to detect changes to this local variable, but they +are only insured to be correct when the file is first visited. Thus if you +have problems, use \\[find-alternate-file] RET to have these take effect. + +See also `verilog-library-flags', `verilog-library-directories'." + :group 'verilog-mode-auto + :type '(repeat directory)) + +(defcustom verilog-library-extensions '(".v") + "*List of extensions to use when looking for files for /*AUTOINST*/. +See also `verilog-library-flags', `verilog-library-directories'." + :type '(repeat string) + :group 'verilog-mode-auto) + +(defcustom verilog-active-low-regexp nil + "*If set, treat signals matching this regexp as active low. +This is used for AUTORESET and AUTOTIEOFF. For proper behavior, +you will probably also need `verilog-auto-reset-widths' set." + :group 'verilog-mode-auto + :type 'string) + +(defcustom verilog-auto-sense-include-inputs nil + "*If true, AUTOSENSE should include all inputs. +If nil, only inputs that are NOT output signals in the same block are +included." + :type 'boolean + :group 'verilog-mode-auto) + +(defcustom verilog-auto-sense-defines-constant nil + "*If true, AUTOSENSE should assume all defines represent constants. +When true, the defines will not be included in sensitivity lists. To +maintain compatibility with other sites, this should be set at the bottom +of each verilog file that requires it, rather than being set globally." + :type 'boolean + :group 'verilog-mode-auto) + +(defcustom verilog-auto-reset-widths t + "*If true, AUTORESET should determine the width of signals. +This is then used to set the width of the zero (32'h0 for example). This +is required by some lint tools that aren't smart enough to ignore widths of +the constant zero. This may result in ugly code when parameters determine +the MSB or LSB of a signal inside a AUTORESET." + :type 'boolean + :group 'verilog-mode-auto) + +(defcustom verilog-assignment-delay "" + "*Text used for delays in delayed assignments. Add a trailing space if set." + :type 'string + :group 'verilog-mode-auto) + +(defcustom verilog-auto-inst-vector t + "*If true, when creating default ports with AUTOINST, use bus subscripts. +If nil, skip the subscript when it matches the entire bus as declared in +the module (AUTOWIRE signals always are subscripted, you must manually +declare the wire to have the subscripts removed.) Nil may speed up some +simulators, but is less general and harder to read, so avoid." + :group 'verilog-mode-auto + :type 'boolean ) + +(defcustom verilog-auto-inst-template-numbers nil + "*If true, when creating templated ports with AUTOINST, add a comment. +The comment will add the line number of the template that was used for that +port declaration. Setting this aids in debugging, but nil is suggested for +regular use to prevent large numbers of merge conflicts." + :group 'verilog-mode-auto + :type 'boolean ) + +(defvar verilog-auto-inst-column 40 + "Column number for first part of auto-inst.") + +(defcustom verilog-auto-input-ignore-regexp nil + "*If set, when creating AUTOINPUT list, ignore signals matching this regexp. +See the \\[verilog-faq] for examples on using this." + :group 'verilog-mode-auto + :type 'string ) + +(defcustom verilog-auto-inout-ignore-regexp nil + "*If set, when creating AUTOINOUT list, ignore signals matching this regexp. +See the \\[verilog-faq] for examples on using this." + :group 'verilog-mode-auto + :type 'string ) + +(defcustom verilog-auto-output-ignore-regexp nil + "*If set, when creating AUTOOUTPUT list, ignore signals matching this regexp. +See the \\[verilog-faq] for examples on using this." + :group 'verilog-mode-auto + :type 'string ) + +(defcustom verilog-auto-unused-ignore-regexp nil + "*If set, when creating AUTOUNUSED list, ignore signals matching this regexp. +See the \\[verilog-faq] for examples on using this." + :group 'verilog-mode-auto + :type 'string ) + +(defcustom verilog-typedef-regexp nil + "*If non-nil, regular expression that matches Verilog-2001 typedef names. +For example, \"_t$\" matches typedefs named with _t, as in the C language." + :group 'verilog-mode-auto + :type 'string ) + +(defcustom verilog-mode-hook 'verilog-set-compile-command + "*Hook (List of functions) run after verilog mode is loaded." + :type 'hook + :group 'verilog-mode) + +(defcustom verilog-auto-hook nil + "*Hook run after `verilog-mode' updates AUTOs." + :type 'hook + :group 'verilog-mode-auto) + +(defcustom verilog-before-auto-hook nil + "*Hook run before `verilog-mode' updates AUTOs." + :type 'hook + :group 'verilog-mode-auto) + +(defcustom verilog-delete-auto-hook nil + "*Hook run after `verilog-mode' deletes AUTOs." + :type 'hook + :group 'verilog-mode-auto) + +(defcustom verilog-before-delete-auto-hook nil + "*Hook run before `verilog-mode' deletes AUTOs." + :type 'hook + :group 'verilog-mode-auto) + +(defcustom verilog-getopt-flags-hook nil + "*Hook run after `verilog-getopt-flags' determines the Verilog option lists." + :type 'hook + :group 'verilog-mode-auto) + +(defcustom verilog-before-getopt-flags-hook nil + "*Hook run before `verilog-getopt-flags' determines the Verilog option lists." + :type 'hook + :group 'verilog-mode-auto) + +(defvar verilog-imenu-generic-expression + '((nil "^\\s-*\\(\\(m\\(odule\\|acromodule\\)\\)\\|primitive\\)\\s-+\\([a-zA-Z0-9_.:]+\\)" 4) + ("*Vars*" "^\\s-*\\(reg\\|wire\\)\\s-+\\(\\|\\[[^]]+\\]\\s-+\\)\\([A-Za-z0-9_]+\\)" 3)) + "Imenu expression for Verilog-mode. See `imenu-generic-expression'.") + +;; +;; provide a verilog-header function. +;; Customization variables: +;; +(defvar verilog-date-scientific-format nil + "*If non-nil, dates are written in scientific format (e.g. 1997/09/17). +If nil, in European format (e.g. 17.09.1997). The brain-dead American +format (e.g. 09/17/1997) is not supported.") + +(defvar verilog-company nil + "*Default name of Company for verilog header. +If set will become buffer local.") + +(defvar verilog-project nil + "*Default name of Project for verilog header. +If set will become buffer local.") + +(define-abbrev-table 'verilog-mode-abbrev-table ()) + +(defvar verilog-mode-map () + "Keymap used in Verilog mode.") +(if verilog-mode-map + () + (setq verilog-mode-map (make-sparse-keymap)) + (define-key verilog-mode-map ";" 'electric-verilog-semi) + (define-key verilog-mode-map [(control 59)] 'electric-verilog-semi-with-comment) + (define-key verilog-mode-map ":" 'electric-verilog-colon) + ;;(define-key verilog-mode-map "=" 'electric-verilog-equal) + (define-key verilog-mode-map "\`" 'electric-verilog-tick) + (define-key verilog-mode-map "\t" 'electric-verilog-tab) + (define-key verilog-mode-map "\r" 'electric-verilog-terminate-line) + ;; backspace/delete key bindings + (define-key verilog-mode-map [backspace] 'backward-delete-char-untabify) + (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable + (define-key verilog-mode-map [delete] 'delete-char) + (define-key verilog-mode-map [(meta delete)] 'kill-word)) + (define-key verilog-mode-map "\M-\C-b" 'electric-verilog-backward-sexp) + (define-key verilog-mode-map "\M-\C-f" 'electric-verilog-forward-sexp) + (define-key verilog-mode-map "\M-\r" `electric-verilog-terminate-and-indent) + (define-key verilog-mode-map "\M-\t" 'verilog-complete-word) + (define-key verilog-mode-map "\M-?" 'verilog-show-completions) + (define-key verilog-mode-map [(meta control h)] 'verilog-mark-defun) + (define-key verilog-mode-map "\C-c\`" 'verilog-lint-off) + (define-key verilog-mode-map "\C-c\*" 'verilog-delete-auto-star-implicit) + (define-key verilog-mode-map "\C-c\C-r" 'verilog-label-be) + (define-key verilog-mode-map "\C-c\C-i" 'verilog-pretty-declarations) + (define-key verilog-mode-map "\C-c=" 'verilog-pretty-expr) + (define-key verilog-mode-map "\C-c\C-b" 'verilog-submit-bug-report) + (define-key verilog-mode-map "\M-*" 'verilog-star-comment) + (define-key verilog-mode-map "\C-c\C-c" 'verilog-comment-region) + (define-key verilog-mode-map "\C-c\C-u" 'verilog-uncomment-region) + (define-key verilog-mode-map "\M-\C-a" 'verilog-beg-of-defun) + (define-key verilog-mode-map "\M-\C-e" 'verilog-end-of-defun) + (define-key verilog-mode-map "\C-c\C-d" 'verilog-goto-defun) + (define-key verilog-mode-map "\C-c\C-k" 'verilog-delete-auto) + (define-key verilog-mode-map "\C-c\C-a" 'verilog-auto) + (define-key verilog-mode-map "\C-c\C-s" 'verilog-auto-save-compile) + (define-key verilog-mode-map "\C-c\C-z" 'verilog-inject-auto) + (define-key verilog-mode-map "\C-c\C-e" 'verilog-expand-vector) + (define-key verilog-mode-map "\C-c\C-h" 'verilog-header) + ) + +;; menus +(defvar verilog-xemacs-menu + '("Verilog" + ("Choose Compilation Action" + ["None" + (progn + (setq verilog-tool nil) + (verilog-set-compile-command)) + :style radio + :selected (equal verilog-tool nil)] + ["Lint" + (progn + (setq verilog-tool 'verilog-linter) + (verilog-set-compile-command)) + :style radio + :selected (equal verilog-tool `verilog-linter)] + ["Coverage" + (progn + (setq verilog-tool 'verilog-coverage) + (verilog-set-compile-command)) + :style radio + :selected (equal verilog-tool `verilog-coverage)] + ["Simulator" + (progn + (setq verilog-tool 'verilog-simulator) + (verilog-set-compile-command)) + :style radio + :selected (equal verilog-tool `verilog-simulator)] + ["Compiler" + (progn + (setq verilog-tool 'verilog-compiler) + (verilog-set-compile-command)) + :style radio + :selected (equal verilog-tool `verilog-compiler)] + ) + ("Move" + ["Beginning of function" verilog-beg-of-defun t] + ["End of function" verilog-end-of-defun t] + ["Mark function" verilog-mark-defun t] + ["Goto function/module" verilog-goto-defun t] + ["Move to beginning of block" electric-verilog-backward-sexp t] + ["Move to end of block" electric-verilog-forward-sexp t] + ) + ("Comments" + ["Comment Region" verilog-comment-region t] + ["UnComment Region" verilog-uncomment-region t] + ["Multi-line comment insert" verilog-star-comment t] + ["Lint error to comment" verilog-lint-off t] + ) + "----" + ["Compile" compile t] + ["AUTO, Save, Compile" verilog-auto-save-compile t] + ["Next Compile Error" next-error t] + ["Ignore Lint Warning at point" verilog-lint-off t] + "----" + ["Line up declarations around point" verilog-pretty-declarations t] + ["Line up equations around point" verilog-pretty-expr t] + ["Redo/insert comments on every end" verilog-label-be t] + ["Expand [x:y] vector line" verilog-expand-vector t] + ["Insert begin-end block" verilog-insert-block t] + ["Complete word" verilog-complete-word t] + "----" + ["Recompute AUTOs" verilog-auto t] + ["Kill AUTOs" verilog-delete-auto t] + ["Inject AUTOs" verilog-inject-auto t] + ("AUTO Help..." + ["AUTO General" (describe-function 'verilog-auto) t] + ["AUTO Library Flags" (describe-variable 'verilog-library-flags) t] + ["AUTO Library Path" (describe-variable 'verilog-library-directories) t] + ["AUTO Library Files" (describe-variable 'verilog-library-files) t] + ["AUTO Library Extensions" (describe-variable 'verilog-library-extensions) t] + ["AUTO `define Reading" (describe-function 'verilog-read-defines) t] + ["AUTO `include Reading" (describe-function 'verilog-read-includes) t] + ["AUTOARG" (describe-function 'verilog-auto-arg) t] + ["AUTOASCIIENUM" (describe-function 'verilog-auto-ascii-enum) t] + ["AUTOINOUTMODULE" (describe-function 'verilog-auto-inout-module) t] + ["AUTOINOUT" (describe-function 'verilog-auto-inout) t] + ["AUTOINPUT" (describe-function 'verilog-auto-input) t] + ["AUTOINST" (describe-function 'verilog-auto-inst) t] + ["AUTOINST (.*)" (describe-function 'verilog-auto-star) t] + ["AUTOINSTPARAM" (describe-function 'verilog-auto-inst-param) t] + ["AUTOOUTPUT" (describe-function 'verilog-auto-output) t] + ["AUTOOUTPUTEVERY" (describe-function 'verilog-auto-output-every) t] + ["AUTOREG" (describe-function 'verilog-auto-reg) t] + ["AUTOREGINPUT" (describe-function 'verilog-auto-reg-input) t] + ["AUTORESET" (describe-function 'verilog-auto-reset) t] + ["AUTOSENSE" (describe-function 'verilog-auto-sense) t] + ["AUTOTIEOFF" (describe-function 'verilog-auto-tieoff) t] + ["AUTOUNUSED" (describe-function 'verilog-auto-unused) t] + ["AUTOWIRE" (describe-function 'verilog-auto-wire) t] + ) + "----" + ["Submit bug report" verilog-submit-bug-report t] + ["Version and FAQ" verilog-faq t] + ["Customize Verilog Mode..." verilog-customize t] + ["Customize Verilog Fonts & Colors" verilog-font-customize t] + ) + "Emacs menu for VERILOG mode." + ) +(defvar verilog-statement-menu + '("Statements" + ["Header" verilog-sk-header t] + ["Comment" verilog-sk-comment t] + "----" + ["Module" verilog-sk-module t] + ["Primitive" verilog-sk-primitive t] + "----" + ["Input" verilog-sk-input t] + ["Output" verilog-sk-output t] + ["Inout" verilog-sk-inout t] + ["Wire" verilog-sk-wire t] + ["Reg" verilog-sk-reg t] + ["Define thing under point as a register" verilog-sk-define-signal t] + "----" + ["Initial" verilog-sk-initial t] + ["Always" verilog-sk-always t] + ["Function" verilog-sk-function t] + ["Task" verilog-sk-task t] + ["Specify" verilog-sk-specify t] + ["Generate" verilog-sk-generate t] + "----" + ["Begin" verilog-sk-begin t] + ["If" verilog-sk-if t] + ["(if) else" verilog-sk-else-if t] + ["For" verilog-sk-for t] + ["While" verilog-sk-while t] + ["Fork" verilog-sk-fork t] + ["Repeat" verilog-sk-repeat t] + ["Case" verilog-sk-case t] + ["Casex" verilog-sk-casex t] + ["Casez" verilog-sk-casez t] + ) + "Menu for statement templates in Verilog." + ) + +(easy-menu-define verilog-menu verilog-mode-map "Menu for Verilog mode" + verilog-xemacs-menu) +(easy-menu-define verilog-stmt-menu verilog-mode-map "Menu for statement templates in Verilog." + verilog-statement-menu) + +(defvar verilog-mode-abbrev-table nil + "Abbrev table in use in Verilog-mode buffers.") + +(define-abbrev-table 'verilog-mode-abbrev-table ()) + +;; compilation program +(defun verilog-set-compile-command () + "Function to compute shell command to compile verilog. + +This reads `verilog-tool' and sets `compile-command'. This specifies the +program that executes when you type \\[compile] or +\\[verilog-auto-save-compile]. + +By default `verilog-tool' uses a Makefile if one exists in the current +directory. If not, it is set to the `verilog-linter', `verilog-coverage', +`verilog-simulator', or `verilog-compiler' variables, as selected with the +Verilog -> \"Choose Compilation Action\" menu. + +You should set `verilog-tool' or the other variables to the path and +arguments for your Verilog simulator. For example: + \"vcs -p123 -O\" +or a string like: + \"(cd /tmp; surecov %s)\". + +In the former case, the path to the current buffer is concat'ed to the +value of `verilog-tool'; in the later, the path to the current buffer is +substituted for the %s. + +Where __FILE__ appears in the string, the buffer-file-name of the current +buffer, without the directory portion, will be substituted." + (interactive) + (cond + ((or (file-exists-p "makefile") ;If there is a makefile, use it + (file-exists-p "Makefile")) + (make-local-variable 'compile-command) + (setq compile-command "make ")) + (t + (make-local-variable 'compile-command) + (setq compile-command + (if verilog-tool + (if (string-match "%s" (eval verilog-tool)) + (format (eval verilog-tool) (or buffer-file-name "")) + (concat (eval verilog-tool) " " (or buffer-file-name ""))) + "")))) + (verilog-modify-compile-command)) + +(defun verilog-modify-compile-command () + "Replace meta-information in `compile-command'. +Where __FILE__ appears in the string, the current buffer's file-name, +without the directory portion, will be substituted." + (when (and + (stringp compile-command) + (string-match "\\b__FILE__\\b" compile-command)) + (make-local-variable 'compile-command) + (setq compile-command + (verilog-string-replace-matches + "\\b__FILE__\\b" (file-name-nondirectory (buffer-file-name)) + t t compile-command)))) + +(defun verilog-error-regexp-add () + "Add the messages to the `compilation-error-regexp-alist'. +Called by `compilation-mode-hook'. This allows \\[next-error] to find the errors." + (if (not verilog-error-regexp-add-didit) + (progn + (setq verilog-error-regexp-add-didit t) + (setq-default compilation-error-regexp-alist + (append verilog-error-regexp + (default-value 'compilation-error-regexp-alist))) + ;; Could be buffer local at this point; maybe also in let; change all three + (setq compilation-error-regexp-alist (default-value 'compilation-error-regexp-alist)) + (set (make-local-variable 'compilation-error-regexp-alist) + (default-value 'compilation-error-regexp-alist)) + ))) + +(add-hook 'compilation-mode-hook 'verilog-error-regexp-add) + +(defconst verilog-directive-re + ;; "`case" "`default" "`define" "`define" "`else" "`endfor" "`endif" + ;; "`endprotect" "`endswitch" "`endwhile" "`for" "`format" "`if" "`ifdef" + ;; "`ifndef" "`include" "`let" "`protect" "`switch" "`timescale" + ;; "`time_scale" "`undef" "`while" + "\\<`\\(case\\|def\\(ault\\|ine\\(\\)?\\)\\|e\\(lse\\|nd\\(for\\|if\\|protect\\|switch\\|while\\)\\)\\|for\\(mat\\)?\\|i\\(f\\(def\\|ndef\\)?\\|nclude\\)\\|let\\|protect\\|switch\\|time\\(_scale\\|scale\\)\\|undef\\|while\\)\\>") + +(defconst verilog-directive-begin + "\\<`\\(for\\|i\\(f\\|fdef\\|fndef\\)\\|switch\\|while\\)\\>") + +(defconst verilog-directive-middle + "\\<`\\(else\\|default\\|case\\)\\>") + +(defconst verilog-directive-end + "`\\(endfor\\|endif\\|endswitch\\|endwhile\\)\\>") + +(defconst verilog-directive-re-1 + (concat "[ \t]*" verilog-directive-re)) + +;; +;; Regular expressions used to calculate indent, etc. +;; +(defconst verilog-symbol-re "\\<[a-zA-Z_][a-zA-Z_0-9.]*\\>") +(defconst verilog-case-re "\\(\\\\|\\\\)") +;; Want to match +;; aa : +;; aa,bb : +;; a[34:32] : +;; a, +;; b : + +(defconst verilog-no-indent-begin-re + "\\<\\(if\\|else\\|while\\|for\\|repeat\\|always\\|always_comb\\|always_ff\\|always_latch\\)\\>") + +(defconst verilog-ends-re + ;; Parenthesis indicate type of keyword found + (concat + "\\(\\\\)\\|" ; 1 + "\\(\\\\)\\|" ; 2 + "\\(\\\\)\\|" ; 3 + "\\(\\\\)\\|" ; 4 + "\\(\\\\)\\|" ; 5 + "\\(\\\\)\\|" ; 6 + "\\(\\\\)\\|" ; 7 + "\\(\\\\)\\|" ; 8 + "\\(\\\\)\\|" ; 9 + "\\(\\\\)\\|" ; 10 + "\\(\\\\)\\|" ; 11 + "\\(\\\\)" ; 12 + )) + +(defconst verilog-auto-end-comment-lines-re + ;; Matches to names in this list cause auto-end-commentation + (concat "\\(" + verilog-directive-re "\\)\\|\\(" + (eval-when-compile + (verilog-regexp-words + `( "begin" + "else" + "end" + "endcase" + "endclass" + "endclocking" + "endgroup" + "endfunction" + "endmodule" + "endprogram" + "endprimitive" + "endinterface" + "endpackage" + "endsequence" + "endspecify" + "endtable" + "endtask" + "join" + "join_any" + "join_none" + "module" + "macromodule" + "primitive" + "interface" + "package"))) + "\\)")) + +;;; NOTE: verilog-leap-to-head expects that verilog-end-block-re and +;;; verilog-end-block-ordered-re matches exactly the same strings. +(defconst verilog-end-block-ordered-re + ;; Parenthesis indicate type of keyword found + (concat "\\(\\\\)\\|" ; 1 + "\\(\\\\)\\|" ; 2 + "\\(\\\\)")) +(defconst verilog-end-block-re + (eval-when-compile + (verilog-regexp-words + + `("end" ;; closes begin + "endcase" ;; closes any of case, casex casez or randcase + "join" "join_any" "join_none" ;; closes fork + "endclass" + "endtable" + "endspecify" + "endfunction" + "endgenerate" + "endtask" + "endgroup" + "endproperty" + "endinterface" + "endpackage" + "endprogram" + "endsequence" + "endclocking" + ) + ))) + + +(defconst verilog-endcomment-reason-re + ;; Parenthesis indicate type of keyword found + (concat + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\.*\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\(\[ \t\]*@\\)?\\)\\|" + "\\(\\\\(\[ \t\]*@\\)?\\)\\|" + "\\(\\\\(\[ \t\]*@\\)?\\)\\|" + "\\(\\\\(\[ \t\]*@\\)?\\)\\|" + "\\(@\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|\\(\\\\)\\|" + "#")) + +(defconst verilog-named-block-re "begin[ \t]*:") + +;; These words begin a block which can occur inside a module which should be indented, +;; and closed with the respective word from the end-block list + +(defconst verilog-beg-block-re + (eval-when-compile + (verilog-regexp-words + `("begin" + "case" "casex" "casez" "randcase" + "clocking" + "generate" + "fork" + "function" + "property" + "specify" + "table" + "task" + )))) +;; These are the same words, in a specific order in the regular +;; expression so that matching will work nicely for +;; verilog-forward-sexp and verilog-calc-indent + +(defconst verilog-beg-block-re-ordered + ( concat "\\<" + "\\(begin\\)" ;1 + "\\|\\(randcase\\|\\(unique\\s-+\\|priority\\s-+\\)?case[xz]?\\)" ; 2 +;; "\\|\\(randcase\\|case[xz]?\\)" ; 2 + "\\|\\(fork\\)" ;3 + "\\|\\(class\\)" ;4 + "\\|\\(table\\)" ;5 + "\\|\\(specify\\)" ;6 + "\\|\\(function\\)" ;7 + "\\|\\(task\\)" ;8 + "\\|\\(generate\\)" ;9 + "\\|\\(covergroup\\)" ;10 + "\\|\\(property\\)" ;11 + "\\|\\(\\(rand\\)?sequence\\)" ;12 + "\\|\\(clocking\\)" ;13 + "\\>")) + +(defconst verilog-end-block-ordered-rry + [ "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)" + "\\(\\\\|\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\\\)" + "\\(\\\\)\\|\\(\\\\)" + ] ) + +(defconst verilog-nameable-item-re + (eval-when-compile + (verilog-regexp-words + `("begin" + "fork" + "join" "join_any" "join_none" + "end" + "endcase" + "endconfig" + "endclass" + "endclocking" + "endfunction" + "endgenerate" + "endmodule" + "endprimative" + "endinterface" + "endpackage" + "endspecify" + "endtable" + "endtask" ) + ))) + +(defconst verilog-declaration-opener + (eval-when-compile + (verilog-regexp-words + `("module" "begin" "task" "function")))) + +(defconst verilog-declaration-prefix-re + (eval-when-compile + (verilog-regexp-words + `( + ;; port direction + "inout" "input" "output" "ref" + ;; changeableness + "const" "static" "protected" "local" + ;; parameters + "localparam" "parameter" "var" + ;; type creation + "typedef" + )))) +(defconst verilog-declaration-core-re + (eval-when-compile + (verilog-regexp-words + `( + ;; integer_atom_type + "byte" "shortint" "int" "longint" "integer" "time" + ;; integer_vector_type + "bit" "logic" "reg" + ;; non_integer_type + "shortreal" "real" "realtime" + ;; net_type + "supply0" "supply1" "tri" "triand" "trior" "trireg" "tri0" "tri1" "uwire" "wire" "wand" "wor" + ;; misc + "string" "event" "chandle" "virtual" "enum" "genvar" + "struct" "union" + ;; builtin classes + "mailbox" "semaphore" + )))) +(defconst verilog-declaration-re + (concat "\\(" verilog-declaration-prefix-re "\\s-*\\)?" verilog-declaration-core-re)) +(defconst verilog-range-re "\\(\\[[^]]*\\]\\s-*\\)+") +(defconst verilog-optional-signed-re "\\s-*\\(signed\\)?") +(defconst verilog-optional-signed-range-re + (concat + "\\s-*\\(\\<\\(reg\\|wire\\)\\>\\s-*\\)?\\(\\\\s-*\\)?\\(" verilog-range-re "\\)?")) +(defconst verilog-macroexp-re "`\\sw+") + +(defconst verilog-delay-re "#\\s-*\\(\\([0-9_]+\\('s?[hdxbo][0-9a-fA-F_xz]+\\)?\\)\\|\\(([^()]*)\\)\\|\\(\\sw+\\)\\)") +(defconst verilog-declaration-re-2-no-macro + (concat "\\s-*" verilog-declaration-re + "\\s-*\\(\\(" verilog-optional-signed-range-re "\\)\\|\\(" verilog-delay-re "\\)" + "\\)?")) +(defconst verilog-declaration-re-2-macro + (concat "\\s-*" verilog-declaration-re + "\\s-*\\(\\(" verilog-optional-signed-range-re "\\)\\|\\(" verilog-delay-re "\\)" + "\\|\\(" verilog-macroexp-re "\\)" + "\\)?")) +(defconst verilog-declaration-re-1-macro + (concat "^" verilog-declaration-re-2-macro)) + +(defconst verilog-declaration-re-1-no-macro (concat "^" verilog-declaration-re-2-no-macro)) + +(defconst verilog-defun-re + (eval-when-compile (verilog-regexp-words `("macromodule" "module" "class" "program" "interface" "package" "primitive" "config")))) +(defconst verilog-end-defun-re + (eval-when-compile (verilog-regexp-words `("endmodule" "endclass" "endprogram" "endinterface" "endpackage" "endprimitive" "endconfig")))) +(defconst verilog-zero-indent-re + (concat verilog-defun-re "\\|" verilog-end-defun-re)) + +(defconst verilog-behavioral-block-beg-re + (concat "\\(\\\\|\\\\|\\\\|\\\\|\\\\|" + "\\\\|\\\\|\\\\)")) + +(defconst verilog-indent-re + (eval-when-compile + (verilog-regexp-words + `( + "{" + "always" "always_latch" "always_ff" "always_comb" + "begin" "end" +; "unique" "priority" + "case" "casex" "casez" "randcase" "endcase" + "class" "endclass" + "clocking" "endclocking" + "config" "endconfig" + "covergroup" "endgroup" + "fork" "join" "join_any" "join_none" + "function" "endfunction" + "final" + "generate" "endgenerate" + "initial" + "interface" "endinterface" + "module" "macromodule" "endmodule" + "package" "endpackage" + "primitive" "endprimative" + "program" "endprogram" + "property" "endproperty" + "sequence" "randsequence" "endsequence" + "specify" "endspecify" + "table" "endtable" + "task" "endtask" + "`case" + "`default" + "`define" "`undef" + "`if" "`ifdef" "`ifndef" "`else" "`endif" + "`while" "`endwhile" + "`for" "`endfor" + "`format" + "`include" + "`let" + "`protect" "`endprotect" + "`switch" "`endswitch" + "`timescale" + "`time_scale" + )))) + +(defconst verilog-defun-level-re + (eval-when-compile + (verilog-regexp-words + `( + "module" "macromodule" "primitive" "class" "program" "initial" "final" "always" "always_comb" + "always_ff" "always_latch" "endtask" "endfunction" "interface" "package" + "config")))) + +(defconst verilog-defun-level-not-generate-re + (eval-when-compile + (verilog-regexp-words + `( + "module" "macromodule" "primitive" "class" "program" "interface" "package" "config")))) + +(defconst verilog-cpp-level-re + (eval-when-compile + (verilog-regexp-words + `( + "endmodule" "endprimitive" "endinterface" "endpackage" "endprogram" "endclass" + )))) +(defconst verilog-extended-case-re "\\(unique\\s-+\\|priority\\s-+\\)?case[xz]?") +(defconst verilog-extended-complete-re + (concat "\\(\\\\|\\\\)" + "\\|\\(\\\\s-+\\)*\\(\\\\|\\\\|\\\\)" + "\\|" verilog-extended-case-re )) +(defconst verilog-basic-complete-re + (eval-when-compile + (verilog-regexp-words + `( + "always" "assign" "always_latch" "always_ff" "always_comb" "constraint" + "import" "initial" "final" "module" "macromodule" "repeat" "randcase" "while" + "if" "for" "forever" "foreach" "else" "parameter" "do" + )))) +(defconst verilog-complete-reg + (concat + verilog-extended-complete-re + "\\|" + verilog-basic-complete-re)) + +(defconst verilog-end-statement-re + (concat "\\(" verilog-beg-block-re "\\)\\|\\(" + verilog-end-block-re "\\)")) + +(defconst verilog-endcase-re + (concat verilog-case-re "\\|" + "\\(endcase\\)\\|" + verilog-defun-re + )) + +(defconst verilog-exclude-str-start "/* -----\\/----- EXCLUDED -----\\/-----" + "String used to mark beginning of excluded text.") +(defconst verilog-exclude-str-end " -----/\\----- EXCLUDED -----/\\----- */" + "String used to mark end of excluded text.") +(defconst verilog-preprocessor-re + (eval-when-compile + (verilog-regexp-words + `( + "`define" "`include" "`ifdef" "`ifndef" "`if" "`endif" "`else" + )))) + +(defconst verilog-keywords + '( "`case" "`default" "`define" "`else" "`endfor" "`endif" + "`endprotect" "`endswitch" "`endwhile" "`for" "`format" "`if" "`ifdef" + "`ifndef" "`include" "`let" "`protect" "`switch" "`timescale" + "`time_scale" "`undef" "`while" + + "after" "alias" "always" "always_comb" "always_ff" "always_latch" "and" + "assert" "assign" "assume" "automatic" "before" "begin" "bind" + "bins" "binsof" "bit" "break" "buf" "bufif0" "bufif1" "byte" + "case" "casex" "casez" "cell" "chandle" "class" "clocking" "cmos" + "config" "const" "constraint" "context" "continue" "cover" + "covergroup" "coverpoint" "cross" "deassign" "default" "defparam" + "design" "disable" "dist" "do" "edge" "else" "end" "endcase" + "endclass" "endclocking" "endconfig" "endfunction" "endgenerate" + "endgroup" "endinterface" "endmodule" "endpackage" "endprimitive" + "endprogram" "endproperty" "endspecify" "endsequence" "endtable" + "endtask" "enum" "event" "expect" "export" "extends" "extern" + "final" "first_match" "for" "force" "foreach" "forever" "fork" + "forkjoin" "function" "generate" "genvar" "highz0" "highz1" "if" + "iff" "ifnone" "ignore_bins" "illegal_bins" "import" "incdir" + "include" "initial" "inout" "input" "inside" "instance" "int" + "integer" "interface" "intersect" "join" "join_any" "join_none" + "large" "liblist" "library" "local" "localparam" "logic" + "longint" "macromodule" "mailbox" "matches" "medium" "modport" "module" + "nand" "negedge" "new" "nmos" "nor" "noshowcancelled" "not" + "notif0" "notif1" "null" "or" "output" "package" "packed" + "parameter" "pmos" "posedge" "primitive" "priority" "program" + "property" "protected" "pull0" "pull1" "pulldown" "pullup" + "pulsestyle_onevent" "pulsestyle_ondetect" "pure" "rand" "randc" + "randcase" "randsequence" "rcmos" "real" "realtime" "ref" "reg" + "release" "repeat" "return" "rnmos" "rpmos" "rtran" "rtranif0" + "rtranif1" "scalared" "semaphore" "sequence" "shortint" "shortreal" + "showcancelled" "signed" "small" "solve" "specify" "specparam" + "static" "string" "strong0" "strong1" "struct" "super" "supply0" + "supply1" "table" "tagged" "task" "this" "throughout" "time" + "timeprecision" "timeunit" "tran" "tranif0" "tranif1" "tri" + "tri0" "tri1" "triand" "trior" "trireg" "type" "typedef" "union" + "unique" "unsigned" "use" "uwire" "var" "vectored" "virtual" "void" + "wait" "wait_order" "wand" "weak0" "weak1" "while" "wildcard" + "wire" "with" "within" "wor" "xnor" "xor" + ) + "List of Verilog keywords.") + + +(defconst verilog-emacs-features + ;; Documentation at the bottom + (let ((major (and (boundp 'emacs-major-version) + emacs-major-version)) + (minor (and (boundp 'emacs-minor-version) + emacs-minor-version)) + flavor comments flock-syntax) + ;; figure out version numbers if not already discovered + (and (or (not major) (not minor)) + (string-match "\\([0-9]+\\).\\([0-9]+\\)" emacs-version) + (setq major (string-to-int (substring emacs-version + (match-beginning 1) + (match-end 1))) + minor (string-to-int (substring emacs-version + (match-beginning 2) + (match-end 2))))) + (if (not (and major minor)) + (error "Cannot figure out the major and minor version numbers")) + ;; calculate the major version + (cond + ((= major 4) (setq major 'v18)) ;Epoch 4 + ((= major 18) (setq major 'v18)) ;Emacs 18 + ((= major 19) (setq major 'v19 ;Emacs 19 + flavor (if (or (string-match "Lucid" emacs-version) + (string-match "XEmacs" emacs-version)) + 'XEmacs 'FSF))) + ((> major 19) (setq major 'v20 + flavor (if (or (string-match "Lucid" emacs-version) + (string-match "XEmacs" emacs-version)) + 'XEmacs 'FSF))) + ;; I don't know + (t (error "Cannot recognize major version number: %s" major))) + ;; XEmacs 19 uses 8-bit modify-syntax-entry flags, as do all + ;; patched Emacs 19, Emacs 18, Epoch 4's. Only Emacs 19 uses a + ;; 1-bit flag. Let's be as smart as we can about figuring this + ;; out. + (if (or (eq major 'v20) (eq major 'v19)) + (let ((table (copy-syntax-table))) + (modify-syntax-entry ?a ". 12345678" table) + (cond + ;; XEmacs pre 20 and Emacs pre 19.30 use vectors for syntax tables. + ((vectorp table) + (if (= (logand (lsh (aref table ?a) -16) 255) 255) + (setq comments '8-bit) + (setq comments '1-bit))) + ;; XEmacs 20 is known to be 8-bit + ((eq flavor 'XEmacs) (setq comments '8-bit)) + ;; Emacs 19.30 and beyond are known to be 1-bit + ((eq flavor 'FSF) (setq comments '1-bit)) + ;; Don't know what this is + (t (error "Couldn't figure out syntax table format")) + )) + ;; Emacs 18 has no support for dual comments + (setq comments 'no-dual-comments)) + ;; determine whether to use old or new font lock syntax + ;; We can assume 8-bit syntax table emacsen support new syntax, otherwise + ;; look for version > 19.30 + (setq flock-syntax + (if (or (equal comments '8-bit) + (equal major 'v20) + (and (equal major 'v19) (> minor 30))) + 'flock-syntax-after-1930 + 'flock-syntax-before-1930)) + ;; lets do some minimal sanity checking. + (if (or + ;; Emacs before 19.6 had bugs + (and (eq major 'v19) (eq flavor 'XEmacs) (< minor 6)) + ;; Emacs 19 before 19.21 has known bugs + (and (eq major 'v19) (eq flavor 'FSF) (< minor 21)) + ) + (with-output-to-temp-buffer "*verilog-mode warnings*" + (print (format + "The version of Emacs that you are running, %s, +has known bugs in its syntax parsing routines which will affect the +performance of verilog-mode. You should strongly consider upgrading to the +latest available version. verilog-mode may continue to work, after a +fashion, but strange indentation errors could be encountered." + emacs-version)))) + ;; Emacs 18, with no patch is not too good + (if (and (eq major 'v18) (eq comments 'no-dual-comments)) + (with-output-to-temp-buffer "*verilog-mode warnings*" + (print (format + "The version of Emacs 18 you are running, %s, +has known deficiencies in its ability to handle the dual verilog +(and C++) comments, (e.g. the // and /* */ comments). This will +not be much of a problem for you if you only use the /* */ comments, +but you really should strongly consider upgrading to one of the latest +Emacs 19's. In Emacs 18, you may also experience performance degradations. +Emacs 19 has some new built-in routines which will speed things up for you. +Because of these inherent problems, verilog-mode is not supported +on emacs-18." + emacs-version)))) + ;; Emacs 18 with the syntax patches are no longer supported + (if (and (eq major 'v18) (not (eq comments 'no-dual-comments))) + (with-output-to-temp-buffer "*verilog-mode warnings*" + (print (format + "You are running a syntax patched Emacs 18 variant. While this should +work for you, you may want to consider upgrading to Emacs 19. +The syntax patches are no longer supported either for verilog-mode.")))) + (list major comments flock-syntax)) + "A list of features extant in the Emacs you are using. +There are many flavors of Emacs out there, each with different +features supporting those needed by `verilog-mode'. Here's the current +supported list, along with the values for this variable: + + Vanilla Emacs 18/Epoch 4: (v18 no-dual-comments flock-syntax-before-1930) + Emacs 18/Epoch 4 (patch2): (v18 8-bit flock-syntax-after-1930) + XEmacs (formerly Lucid) 19: (v19 8-bit flock-syntax-after-1930) + XEmacs 20: (v20 8-bit flock-syntax-after-1930) + Emacs 19.1-19.30: (v19 8-bit flock-syntax-before-1930) + Emacs 19.31-19.xx: (v19 8-bit flock-syntax-after-1930) + Emacs20 : (v20 1-bit flock-syntax-after-1930).") + +(defconst verilog-comment-start-regexp "//\\|/\\*" + "Dual comment value for `comment-start-regexp'.") + +(defun verilog-populate-syntax-table (table) + "Populate the syntax TABLE." + (modify-syntax-entry ?\\ "\\" table) + (modify-syntax-entry ?+ "." table) + (modify-syntax-entry ?- "." table) + (modify-syntax-entry ?= "." table) + (modify-syntax-entry ?% "." table) + (modify-syntax-entry ?< "." table) + (modify-syntax-entry ?> "." table) + (modify-syntax-entry ?& "." table) + (modify-syntax-entry ?| "." table) + (modify-syntax-entry ?` "w" table) + (modify-syntax-entry ?_ "w" table) + (modify-syntax-entry ?\' "." table) +) + +(defun verilog-setup-dual-comments (table) + "Set up TABLE to handle block and line style comments." + (cond + ((memq '8-bit verilog-emacs-features) + ;; XEmacs (formerly Lucid) has the best implementation + (modify-syntax-entry ?/ ". 1456" table) + (modify-syntax-entry ?* ". 23" table) + (modify-syntax-entry ?\n "> b" table) + ) + ((memq '1-bit verilog-emacs-features) + ;; Emacs 19 does things differently, but we can work with it + (modify-syntax-entry ?/ ". 124b" table) + (modify-syntax-entry ?* ". 23" table) + (modify-syntax-entry ?\n "> b" table) + ) + )) + +(defvar verilog-mode-syntax-table nil + "Syntax table used in `verilog-mode' buffers.") + +(defconst verilog-font-lock-keywords nil + "Default highlighting for Verilog mode.") + +(defconst verilog-font-lock-keywords-1 nil + "Subdued level highlighting for Verilog mode.") + +(defconst verilog-font-lock-keywords-2 nil + "Medium level highlighting for Verilog mode. +See also `verilog-font-lock-extra-types'.") + +(defconst verilog-font-lock-keywords-3 nil + "Gaudy level highlighting for Verilog mode. +See also `verilog-font-lock-extra-types'.") +(defvar verilog-font-lock-translate-off-face + 'verilog-font-lock-translate-off-face + "Font to use for translated off regions.") +(defface verilog-font-lock-translate-off-face + '((((class color) + (background light)) + (:background "gray90" :italic t )) + (((class color) + (background dark)) + (:background "gray10" :italic t )) + (((class grayscale) (background light)) + (:foreground "DimGray" :italic t)) + (((class grayscale) (background dark)) + (:foreground "LightGray" :italic t)) + (t (:italis t))) + "Font lock mode face used to background highlight translate-off regions." + :group 'font-lock-highlighting-faces) + +(defvar verilog-font-lock-p1800-face + 'verilog-font-lock-p1800-face + "Font to use for p1800 keywords.") +(defface verilog-font-lock-p1800-face + '((((class color) + (background light)) + (:foreground "DarkOrange3" :bold t )) + (((class color) + (background dark)) + (:foreground "orange1" :bold t )) + (t (:italic t))) + "Font lock mode face used to highlight P1800 keywords." + :group 'font-lock-highlighting-faces) + +(defvar verilog-font-lock-ams-face + 'verilog-font-lock-ams-face + "Font to use for Analog/Mixed Signal keywords.") +(defface verilog-font-lock-ams-face + '((((class color) + (background light)) + (:foreground "Purple" :bold t )) + (((class color) + (background dark)) + (:foreground "orange1" :bold t )) + (t (:italic t))) + "Font lock mode face used to highlight AMS keywords." + :group 'font-lock-highlighting-faces) + +(let* ((verilog-type-font-keywords + (eval-when-compile + (verilog-regexp-opt + '( + "and" "bit" "buf" "bufif0" "bufif1" "cmos" "defparam" + "event" "genvar" "inout" "input" "integer" "localparam" + "logic" "mailbox" "nand" "nmos" "not" "notif0" "notif1" "or" + "output" "parameter" "pmos" "pull0" "pull1" "pullup" + "rcmos" "real" "realtime" "reg" "rnmos" "rpmos" "rtran" + "rtranif0" "rtranif1" "semaphore" "signed" "struct" "supply" + "supply0" "supply1" "time" "tran" "tranif0" "tranif1" + "tri" "tri0" "tri1" "triand" "trior" "trireg" "typedef" + "uwire" "vectored" "wand" "wire" "wor" "xnor" "xor" + ) nil ))) + + (verilog-pragma-keywords + (eval-when-compile + (verilog-regexp-opt + '("surefire" "synopsys" "rtl_synthesis" "verilint" ) nil + ))) + + (verilog-p1800-keywords + (eval-when-compile + (verilog-regexp-opt + '("alias" "assert" "assume" "automatic" "before" "bind" + "bins" "binsof" "break" "byte" "cell" "chandle" "class" + "clocking" "config" "const" "constraint" "context" "continue" + "cover" "covergroup" "coverpoint" "cross" "deassign" "design" + "dist" "do" "edge" "endclass" "endclocking" "endconfig" + "endgroup" "endprogram" "endproperty" "endsequence" "enum" + "expect" "export" "extends" "extern" "first_match" "foreach" + "forkjoin" "genvar" "highz0" "highz1" "ifnone" "ignore_bins" + "illegal_bins" "import" "incdir" "include" "inside" "instance" + "int" "intersect" "large" "liblist" "library" "local" "longint" + "matches" "medium" "modport" "new" "noshowcancelled" "null" + "packed" "program" "property" "protected" "pull0" "pull1" + "pulsestyle_onevent" "pulsestyle_ondetect" "pure" "rand" "randc" + "randcase" "randsequence" "ref" "release" "return" "scalared" + "sequence" "shortint" "shortreal" "showcancelled" "small" "solve" + "specparam" "static" "string" "strong0" "strong1" "struct" + "super" "tagged" "this" "throughout" "timeprecision" "timeunit" + "type" "union" "unsigned" "use" "var" "virtual" "void" + "wait_order" "weak0" "weak1" "wildcard" "with" "within" + ) nil ))) + + (verilog-ams-keywords + (eval-when-compile + (verilog-regexp-opt + '("above" "abs" "absdelay" "acos" "acosh" "ac_stim" + "aliasparam" "analog" "analysis" "asin" "asinh" "atan" "atan2" "atanh" + "branch" "ceil" "connectmodule" "connectrules" "cos" "cosh" "ddt" + "ddx" "discipline" "driver_update" "enddiscipline" "endconnectrules" + "endnature" "endparamset" "exclude" "exp" "final_step" "flicker_noise" + "floor" "flow" "from" "ground" "hypot" "idt" "idtmod" "inf" + "initial_step" "laplace_nd" "laplace_np" "laplace_zd" "laplace_zp" + "last_crossing" "limexp" "ln" "log" "max" "min" "nature" + "net_resolution" "noise_table" "paramset" "potential" "pow" "sin" + "sinh" "slew" "sqrt" "tan" "tanh" "timer" "transition" "white_noise" + "wreal" "zi_nd" "zi_np" "zi_zd" ) nil ))) + + (verilog-font-keywords + (eval-when-compile + (verilog-regexp-opt + '( + "assign" "begin" "case" "casex" "casez" "randcase" "deassign" + "default" "disable" "else" "end" "endcase" "endfunction" + "endgenerate" "endinterface" "endmodule" "endprimitive" + "endspecify" "endtable" "endtask" "final" "for" "force" "return" "break" + "continue" "forever" "fork" "function" "generate" "if" "iff" "initial" + "interface" "join" "join_any" "join_none" "macromodule" "module" "negedge" + "package" "endpackage" "always" "always_comb" "always_ff" + "always_latch" "posedge" "primitive" "priority" "release" + "repeat" "specify" "table" "task" "unique" "wait" "while" + "class" "program" "endclass" "endprogram" + ) nil )))) + + (setq verilog-font-lock-keywords + (list + ;; Fontify all builtin keywords + (concat "\\<\\(" verilog-font-keywords "\\|" + ;; And user/system tasks and functions + "\\$[a-zA-Z][a-zA-Z0-9_\\$]*" + "\\)\\>") + ;; Fontify all types + (cons (concat "\\<\\(" verilog-type-font-keywords "\\)\\>") + 'font-lock-type-face) + ;; Fontify IEEE-P1800 keywords appropriately + (if verilog-highlight-p1800-keywords + (cons (concat "\\<\\(" verilog-p1800-keywords "\\)\\>") + 'verilog-font-lock-p1800-face) + (cons (concat "\\<\\(" verilog-p1800-keywords "\\)\\>") + 'font-lock-type-face)) + ;; Fontify Verilog-AMS keywords + (cons (concat "\\<\\(" verilog-ams-keywords "\\)\\>") + 'verilog-font-lock-ams-face) + )) + + (setq verilog-font-lock-keywords-1 + (append verilog-font-lock-keywords + (list + ;; Fontify module definitions + (list + "\\<\\(\\(macro\\)?module\\|primitive\\|class\\|program\\|interface\\|package\\|task\\)\\>\\s-*\\(\\sw+\\)" + '(1 font-lock-keyword-face) + '(3 font-lock-function-name-face 'prepend)) + ;; Fontify function definitions + (list + (concat "\\\\s-+\\(integer\\|real\\(time\\)?\\|time\\)\\s-+\\(\\sw+\\)" ) + '(1 font-lock-keyword-face) + '(3 font-lock-reference-face prepend) + ) + '("\\\\s-+\\(\\[[^]]+\\]\\)\\s-+\\(\\sw+\\)" + (1 font-lock-keyword-face) + (2 font-lock-reference-face append) + ) + '("\\\\s-+\\(\\sw+\\)" + 1 'font-lock-reference-face append) + ))) + + (setq verilog-font-lock-keywords-2 + (append verilog-font-lock-keywords-1 + (list + ;; Fontify pragmas + (concat "\\(//\\s-*" verilog-pragma-keywords "\\s-.*\\)") + ;; Fontify escaped names + '("\\(\\\\\\S-*\\s-\\)" 0 font-lock-function-name-face) + ;; Fontify macro definitions/ uses + '("`\\s-*[A-Za-z][A-Za-z0-9_]*" 0 (if (boundp 'font-lock-preprocessor-face) + 'font-lock-preprocessor-face + 'font-lock-type-face)) + ;; Fontify delays/numbers + '("\\(@\\)\\|\\(#\\s-*\\(\\(\[0-9_.\]+\\('s?[hdxbo][0-9a-fA-F_xz]*\\)?\\)\\|\\(([^()]+)\\|\\sw+\\)\\)\\)" + 0 font-lock-type-face append) + ;; Fontify instantiation names + '("\\([A-Za-z][A-Za-z0-9_]+\\)\\s-*(" 1 font-lock-function-name-face) + + ))) + + (setq verilog-font-lock-keywords-3 + (append verilog-font-lock-keywords-2 + (when verilog-highlight-translate-off + (list + ;; Fontify things in translate off regions + '(verilog-match-translate-off (0 'verilog-font-lock-translate-off-face prepend)) + ))) + ) + ) + + + +(defun verilog-inside-comment-p () + "Check if point inside a nested comment." + (save-excursion + (let ((st-point (point)) hitbeg) + (or (search-backward "//" (verilog-get-beg-of-line) t) + (if (progn + ;; This is for tricky case //*, we keep searching if /* is proceeded by // on same line + (while (and (setq hitbeg (search-backward "/*" nil t)) + (progn (forward-char 1) (search-backward "//" (verilog-get-beg-of-line) t)))) + hitbeg) + (not (search-forward "*/" st-point t))))))) + +(defun verilog-declaration-end () + (search-forward ";")) + +(defun verilog-point-text (&optional pointnum) + "Return text describing where POINTNUM or current point is (for errors). +Use filename, if current buffer being edited shorten to just buffer name." + (concat (or (and (equal (window-buffer (selected-window)) (current-buffer)) + (buffer-name)) + buffer-file-name + (buffer-name)) + ":" (int-to-string (count-lines (point-min) (or pointnum (point)))))) + +(defun electric-verilog-backward-sexp () + "Move backward over a sexp." + (interactive) + ;; before that see if we are in a comment + (verilog-backward-sexp) +) +(defun electric-verilog-forward-sexp () + "Move backward over a sexp." + (interactive) + ;; before that see if we are in a comment + (verilog-forward-sexp) +) +;;;used by hs-minor-mode +(defun verilog-forward-sexp-function (arg) + (if (< arg 0) + (verilog-backward-sexp) + (verilog-forward-sexp))) + + +(defun verilog-backward-sexp () + (let ((reg) + (elsec 1) + (found nil) + (st (point)) + ) + (if (not (looking-at "\\<")) + (forward-word -1)) + (cond + ((verilog-skip-backward-comment-or-string) + ) + ((looking-at "\\") + (setq reg (concat + verilog-end-block-re + "\\|\\(\\\\)" + "\\|\\(\\\\)" + )) + (while (and (not found) + (verilog-re-search-backward reg nil 'move)) + (cond + ((match-end 1) ; matched verilog-end-block-re + ; try to leap back to matching outward block by striding across + ; indent level changing tokens then immediately + ; previous line governs indentation. + (verilog-leap-to-head)) + ((match-end 2) ; else, we're in deep + (setq elsec (1+ elsec))) + ((match-end 3) ; found it + (setq elsec (1- elsec)) + (if (= 0 elsec) + ;; Now previous line describes syntax + (setq found 't) + )) + ) + ) + ) + ((looking-at verilog-end-block-re) + (verilog-leap-to-head)) + ((looking-at "\\(endmodule\\>\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)") + (cond + ((match-end 1) + (verilog-re-search-backward "\\<\\(macro\\)?module\\>" nil 'move)) + ((match-end 2) + (verilog-re-search-backward "\\" nil 'move)) + ((match-end 3) + (verilog-re-search-backward "\\" nil 'move)) + ((match-end 4) + (verilog-re-search-backward "\\" nil 'move)) + ((match-end 5) + (verilog-re-search-backward "\\" nil 'move)) + ((match-end 6) + (verilog-re-search-backward "\\" nil 'move)) + (t + (goto-char st) + (backward-sexp 1)))) + (t + (goto-char st) + (backward-sexp)) + ) ;; cond + )) + +(defun verilog-forward-sexp () + (let ((reg) + (md 2) + (st (point))) + (if (not (looking-at "\\<")) + (forward-word -1)) + (cond + ((verilog-skip-forward-comment-or-string) + (verilog-forward-syntactic-ws) + ) + ((looking-at verilog-beg-block-re-ordered);; begin|case|fork|class|table|specify|function|task|generate|covergroup|property|sequence|clocking + (cond + ((match-end 1) ; end + ;; Search forward for matching begin + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 2) ; endcase + ;; Search forward for matching case + (setq reg "\\(\\\\|\\(\\\\s-+\\|\\\\s-+\\)?\\[^:]\\)\\|\\(\\\\)" ) + ) + ((match-end 3) ; join + ;; Search forward for matching fork + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 4) ; endclass + ;; Search forward for matching class + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 5) ; endtable + ;; Search forward for matching table + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 6) ; endspecify + ;; Search forward for matching specify + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 7) ; endfunction + ;; Search forward for matching function + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 8) ; endtask + ;; Search forward for matching task + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 9) ; endgenerate + ;; Search forward for matching generate + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 10) ; endgroup + ;; Search forward for matching covergroup + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 11) ; endproperty + ;; Search forward for matching property + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 12) ; endsequence + ;; Search forward for matching sequence + (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\\\)" ) + (setq md 3) ; 3 to get to endsequence in the reg above + ) + ((match-end 13) ; endclocking + ;; Search forward for matching clocking + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ) + (if (forward-word 1) + (catch 'skip + (let ((nest 1)) + (while (verilog-re-search-forward reg nil 'move) + (cond + ((match-end md) ; the closer in reg, so we are climbing out + (setq nest (1- nest)) + (if (= 0 nest) ; we are out! + (throw 'skip 1))) + ((match-end 1) ; the opener in reg, so we are deeper now + (setq nest (1+ nest))))) + ))) + ) + ((looking-at (concat + "\\(\\<\\(macro\\)?module\\>\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)\\|" + "\\(\\\\)")) + (cond + ((match-end 1) + (verilog-re-search-forward "\\" nil 'move)) + ((match-end 2) + (verilog-re-search-forward "\\" nil 'move)) + ((match-end 3) + (verilog-re-search-forward "\\" nil 'move)) + ((match-end 4) + (verilog-re-search-forward "\\" nil 'move)) + ((match-end 5) + (verilog-re-search-forward "\\" nil 'move)) + ((match-end 6) + (verilog-re-search-forward "\\" nil 'move)) + (t + (goto-char st) + (if (= (following-char) ?\) ) + (forward-char 1) + (forward-sexp 1))))) + (t + (goto-char st) + (if (= (following-char) ?\) ) + (forward-char 1) + (forward-sexp 1))) + ) ;; cond + )) + +(defun verilog-declaration-beg () + (verilog-re-search-backward verilog-declaration-re (bobp) t)) + +;; +;; Macros +;; + +(defsubst verilog-string-replace-matches (from-string to-string fixedcase literal string) + "Replace occurrences of FROM-STRING with TO-STRING. +FIXEDCASE and LITERAL as in `replace-match`. STRING is what to replace. +The case (verilog-string-replace-matches \"o\" \"oo\" nil nil \"foobar\") +will break, as the o's continuously replace. xa -> x works ok though." + ;; Hopefully soon to a emacs built-in + (let ((start 0)) + (while (string-match from-string string start) + (setq string (replace-match to-string fixedcase literal string) + start (min (length string) (match-end 0)))) + string)) + +(defsubst verilog-string-remove-spaces (string) + "Remove spaces surrounding STRING." + (save-match-data + (setq string (verilog-string-replace-matches "^\\s-+" "" nil nil string)) + (setq string (verilog-string-replace-matches "\\s-+$" "" nil nil string)) + string)) + +(defsubst verilog-re-search-forward (REGEXP BOUND NOERROR) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `re-search-forward', but skips over match in comments or strings." + (store-match-data '(nil nil)) + (while (and + (re-search-forward REGEXP BOUND NOERROR) + (and (verilog-skip-forward-comment-or-string) + (progn + (store-match-data '(nil nil)) + (if BOUND + (< (point) BOUND) + t) + )))) + (match-end 0)) + +(defsubst verilog-re-search-backward (REGEXP BOUND NOERROR) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `re-search-backward', but skips over match in comments or strings." + (store-match-data '(nil nil)) + (while (and + (re-search-backward REGEXP BOUND NOERROR) + (and (verilog-skip-backward-comment-or-string) + (progn + (store-match-data '(nil nil)) + (if BOUND + (> (point) BOUND) + t) + )))) + (match-end 0)) + +(defsubst verilog-re-search-forward-quick (regexp bound noerror) + "Like `verilog-re-search-forward', including use of REGEXP BOUND and NOERROR, +but trashes match data and is faster for REGEXP that doesn't match often. +This may at some point use text properties to ignore comments, +so there may be a large up front penalty for the first search." + (let (pt) + (while (and (not pt) + (re-search-forward regexp bound noerror)) + (if (not (verilog-inside-comment-p)) + (setq pt (match-end 0)))) + pt)) + +(defsubst verilog-re-search-backward-quick (regexp bound noerror) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `verilog-re-search-backward', including use of REGEXP BOUND and NOERROR, +but trashes match data and is faster for REGEXP that doesn't match often. +This may at some point use text properties to ignore comments, +so there may be a large up front penalty for the first search." + (let (pt) + (while (and (not pt) + (re-search-backward regexp bound noerror)) + (if (not (verilog-inside-comment-p)) + (setq pt (match-end 0)))) + pt)) + +(defsubst verilog-get-beg-of-line (&optional arg) + (save-excursion + (beginning-of-line arg) + (point))) + +(defsubst verilog-get-end-of-line (&optional arg) + (save-excursion + (end-of-line arg) + (point))) + +(defsubst verilog-within-string () + (save-excursion + (nth 3 (parse-partial-sexp (verilog-get-beg-of-line) (point))))) + +(require 'font-lock) +(defvar verilog-need-fld 1) +(defvar font-lock-defaults-alist nil) ;In case we are XEmacs + +(defun verilog-font-lock-init () + "Initialize fontification." + ;; highlight keywords and standardized types, attributes, enumeration + ;; values, and subprograms + (setq verilog-font-lock-keywords-3 + (append verilog-font-lock-keywords-2 + (when verilog-highlight-translate-off + (list + ;; Fontify things in translate off regions + '(verilog-match-translate-off (0 'verilog-font-lock-translate-off-face prepend)) + )) + ) + ) + (put 'verilog-mode 'font-lock-defaults + '((verilog-font-lock-keywords + verilog-font-lock-keywords-1 + verilog-font-lock-keywords-2 + verilog-font-lock-keywords-3 + ) + nil ;; nil means highlight strings & comments as well as keywords + nil ;; nil means keywords must match case + nil ;; syntax table handled elsewhere + verilog-beg-of-defun ;; function to move to beginning of reasonable region to highlight + )) + (if verilog-need-fld + (let ((verilog-mode-defaults + '((verilog-font-lock-keywords + verilog-font-lock-keywords-1 + verilog-font-lock-keywords-2 + verilog-font-lock-keywords-3 + ) + nil ;; nil means highlight strings & comments as well as keywords + nil ;; nil means keywords must match case + nil ;; syntax table handled elsewhere + verilog-beg-of-defun ;; function to move to beginning of reasonable region to highlight + ))) + (setq font-lock-defaults-alist + (append + font-lock-defaults-alist + (list (cons 'verilog-mode verilog-mode-defaults)))) + (setq verilog-need-fld 0)))) + +;; initialize fontification for Verilog Mode +(verilog-font-lock-init) +;; start up message +(defconst verilog-startup-message-lines + '("Please use \\[verilog-submit-bug-report] to report bugs." + "Visit http://www.verilog.com to check for updates" + )) +(defconst verilog-startup-message-displayed t) +(defun verilog-display-startup-message () + (if (not verilog-startup-message-displayed) + (if (sit-for 5) + (let ((lines verilog-startup-message-lines)) + (message "verilog-mode version %s, released %s; type \\[describe-mode] for help" + verilog-mode-version verilog-mode-release-date) + (setq verilog-startup-message-displayed t) + (while (and (sit-for 4) lines) + (message (substitute-command-keys (car lines))) + (setq lines (cdr lines))))) + (message ""))) +;; +;; +;; Mode +;; +(defvar verilog-which-tool 1) +;;###autoload +(defun verilog-mode () + "Major mode for editing Verilog code. +\\ +See \\[describe-function] verilog-auto (\\[verilog-auto]) for details on how +AUTOs can improve coding efficiency. + +Use \\[verilog-faq] for a pointer to frequently asked questions. + +NEWLINE, TAB indents for Verilog code. +Delete converts tabs to spaces as it moves back. + +Supports highlighting. + +Turning on Verilog mode calls the value of the variable `verilog-mode-hook' +with no args, if that value is non-nil. + +Variables controlling indentation/edit style: + + variable `verilog-indent-level' (default 3) + Indentation of Verilog statements with respect to containing block. + `verilog-indent-level-module' (default 3) + Absolute indentation of Module level Verilog statements. + Set to 0 to get initial and always statements lined up + on the left side of your screen. + `verilog-indent-level-declaration' (default 3) + Indentation of declarations with respect to containing block. + Set to 0 to get them list right under containing block. + `verilog-indent-level-behavioral' (default 3) + Indentation of first begin in a task or function block + Set to 0 to get such code to lined up underneath the task or function keyword + `verilog-indent-level-directive' (default 1) + Indentation of `ifdef/`endif blocks + `verilog-cexp-indent' (default 1) + Indentation of Verilog statements broken across lines i.e.: + if (a) + begin + `verilog-case-indent' (default 2) + Indentation for case statements. + `verilog-auto-newline' (default nil) + Non-nil means automatically newline after semicolons and the punctuation + mark after an end. + `verilog-auto-indent-on-newline' (default t) + Non-nil means automatically indent line after newline + `verilog-tab-always-indent' (default t) + Non-nil means TAB in Verilog mode should always reindent the current line, + regardless of where in the line point is when the TAB command is used. + `verilog-indent-begin-after-if' (default t) + Non-nil means to indent begin statements following a preceding + if, else, while, for and repeat statements, if any. otherwise, + the begin is lined up with the preceding token. If t, you get: + if (a) + begin // amount of indent based on `verilog-cexp-indent' + otherwise you get: + if (a) + begin + `verilog-auto-endcomments' (default t) + Non-nil means a comment /* ... */ is set after the ends which ends + cases, tasks, functions and modules. + The type and name of the object will be set between the braces. + `verilog-minimum-comment-distance' (default 10) + Minimum distance (in lines) between begin and end required before a comment + will be inserted. Setting this variable to zero results in every + end acquiring a comment; the default avoids too many redundant + comments in tight quarters. + `verilog-auto-lineup' (default `(all)) + List of contexts where auto lineup of code should be done. + +Variables controlling other actions: + + `verilog-linter' (default surelint) + Unix program to call to run the lint checker. This is the default + command for \\[compile-command] and \\[verilog-auto-save-compile]. + +See \\[customize] for the complete list of variables. + +AUTO expansion functions are, in part: + + \\[verilog-auto] Expand AUTO statements. + \\[verilog-delete-auto] Remove the AUTOs. + \\[verilog-inject-auto] Insert AUTOs for the first time. + +Some other functions are: + + \\[verilog-complete-word] Complete word with appropriate possibilities. + \\[verilog-mark-defun] Mark function. + \\[verilog-beg-of-defun] Move to beginning of current function. + \\[verilog-end-of-defun] Move to end of current function. + \\[verilog-label-be] Label matching begin ... end, fork ... join, etc statements. + + \\[verilog-comment-region] Put marked area in a comment. + \\[verilog-uncomment-region] Uncomment an area commented with \\[verilog-comment-region]. + \\[verilog-insert-block] Insert begin ... end;. + \\[verilog-star-comment] Insert /* ... */. + + \\[verilog-sk-always] Insert a always @(AS) begin .. end block. + \\[verilog-sk-begin] Insert a begin .. end block. + \\[verilog-sk-case] Insert a case block, prompting for details. + \\[verilog-sk-for] Insert a for (...) begin .. end block, prompting for details. + \\[verilog-sk-generate] Insert a generate .. endgenerate block. + \\[verilog-sk-header] Insert a nice header block at the top of file. + \\[verilog-sk-initial] Insert an initial begin .. end block. + \\[verilog-sk-fork] Insert a fork begin .. end .. join block. + \\[verilog-sk-module] Insert a module .. (/*AUTOARG*/);.. endmodule block. + \\[verilog-sk-primitive] Insert a primitive .. (.. );.. endprimitive block. + \\[verilog-sk-repeat] Insert a repeat (..) begin .. end block. + \\[verilog-sk-specify] Insert a specify .. endspecify block. + \\[verilog-sk-task] Insert a task .. begin .. end endtask block. + \\[verilog-sk-while] Insert a while (...) begin .. end block, prompting for details. + \\[verilog-sk-casex] Insert a casex (...) item: begin.. end endcase block, prompting for details. + \\[verilog-sk-casez] Insert a casez (...) item: begin.. end endcase block, prompting for details. + \\[verilog-sk-if] Insert an if (..) begin .. end block. + \\[verilog-sk-else-if] Insert an else if (..) begin .. end block. + \\[verilog-sk-comment] Insert a comment block. + \\[verilog-sk-assign] Insert an assign .. = ..; statement. + \\[verilog-sk-function] Insert a function .. begin .. end endfunction block. + \\[verilog-sk-input] Insert an input declaration, prompting for details. + \\[verilog-sk-output] Insert an output declaration, prompting for details. + \\[verilog-sk-state-machine] Insert a state machine definition, prompting for details. + \\[verilog-sk-inout] Insert an inout declaration, prompting for details. + \\[verilog-sk-wire] Insert a wire declaration, prompting for details. + \\[verilog-sk-reg] Insert a register declaration, prompting for details. + \\[verilog-sk-define-signal] Define signal under point as a register at the top of the module. + +All key bindings can be seen in a Verilog-buffer with \\[describe-bindings]. +Key bindings specific to `verilog-mode-map' are: + +\\{verilog-mode-map}" + (interactive) + (kill-all-local-variables) + (use-local-map verilog-mode-map) + (setq major-mode 'verilog-mode) + (setq mode-name "Verilog") + (setq local-abbrev-table verilog-mode-abbrev-table) + (setq verilog-mode-syntax-table (make-syntax-table)) + (verilog-populate-syntax-table verilog-mode-syntax-table) + ;; add extra comment syntax + (verilog-setup-dual-comments verilog-mode-syntax-table) + (set-syntax-table verilog-mode-syntax-table) + (make-local-variable 'indent-line-function) + (setq indent-line-function 'verilog-indent-line-relative) + (setq comment-indent-function 'verilog-comment-indent) + (make-local-variable 'parse-sexp-ignore-comments) + (setq parse-sexp-ignore-comments nil) + (make-local-variable 'comment-start) + (make-local-variable 'comment-end) + (make-local-variable 'comment-multi-line) + (make-local-variable 'comment-start-skip) + (setq comment-start "// " + comment-end "" + comment-start-skip "/\\*+ *\\|// *" + comment-multi-line nil) + ;; Set up for compilation + (setq verilog-which-tool 1) + (setq verilog-tool 'verilog-linter) + (verilog-set-compile-command) + (when (boundp 'hack-local-variables-hook) ;; Also modify any file-local-variables + (add-hook 'hack-local-variables-hook 'verilog-modify-compile-command t)) + + ;; Setting up menus + (if (featurep 'xemacs) + (progn + (if (and current-menubar + (not (assoc "Verilog" current-menubar))) + (progn + ;; (set-buffer-menubar (copy-sequence current-menubar)) + (add-submenu nil verilog-xemacs-menu) + (add-submenu nil verilog-stmt-menu) + ) + ) + )) + ;; Stuff for GNU emacs + (make-local-variable 'font-lock-defaults) + ;;------------------------------------------------------------ + ;; now hook in 'verilog-colorize-include-files (eldo-mode.el&spice-mode.el) + ;; all buffer local: + (make-local-hook 'font-lock-mode-hook) + (make-local-hook 'font-lock-after-fontify-buffer-hook); doesn't exist in emacs 20 + (add-hook 'font-lock-mode-hook 'verilog-colorize-include-files-buffer t t) + (add-hook 'font-lock-after-fontify-buffer-hook 'verilog-colorize-include-files-buffer t t) ; not in emacs 20 + (make-local-hook 'after-change-functions) + (add-hook 'after-change-functions 'verilog-colorize-include-files t t) + + ;; Tell imenu how to handle verilog. + (make-local-variable 'imenu-generic-expression) + (setq imenu-generic-expression verilog-imenu-generic-expression) + ;; hideshow support + (unless (assq 'verilog-mode hs-special-modes-alist) + (setq hs-special-modes-alist + (cons '(verilog-mode-mode "\\" "\\" nil + verilog-forward-sexp-function) + hs-special-modes-alist))) + ;; Display version splash information. + (verilog-display-startup-message) + + ;; Stuff for autos + (add-hook 'write-contents-hooks 'verilog-auto-save-check) ; already local +;; (verilog-auto-reeval-locals t) ; Save locals in case user changes them +;; (verilog-getopt-flags) + (run-hooks 'verilog-mode-hook)) + + +;; +;; Electric functions +;; +(defun electric-verilog-terminate-line (&optional arg) + "Terminate line and indent next line. +With optional ARG, remove existing end of line comments." + (interactive) + ;; before that see if we are in a comment + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 7 state) ; Inside // comment + (if (eolp) + (progn + (delete-horizontal-space) + (newline)) + (progn + (newline) + (insert-string "// ") + (beginning-of-line))) + (verilog-indent-line)) + ((nth 4 state) ; Inside any comment (hence /**/) + (newline) + (verilog-more-comment)) + ((eolp) + ;; First, check if current line should be indented + (if (save-excursion + (delete-horizontal-space) + (beginning-of-line) + (skip-chars-forward " \t") + (if (looking-at verilog-auto-end-comment-lines-re) + (let ((indent-str (verilog-indent-line))) + ;; Maybe we should set some endcomments + (if verilog-auto-endcomments + (verilog-set-auto-endcomments indent-str arg)) + (end-of-line) + (delete-horizontal-space) + (if arg + () + (newline)) + nil) + (progn + (end-of-line) + (delete-horizontal-space) + 't + ) + ) + ) + ;; see if we should line up assignments + (progn + (if (or (memq 'all verilog-auto-lineup) + (memq 'assignments verilog-auto-lineup)) + (verilog-pretty-expr) + ) + (newline) + ) + (forward-line 1) + ) + ;; Indent next line + (if verilog-auto-indent-on-newline + (verilog-indent-line)) + ) + (t + (newline)) + ))) + +(defun electric-verilog-terminate-and-indent () + "Insert a newline and indent for the next statement." + (interactive) + (electric-verilog-terminate-line 1)) + +(defun electric-verilog-semi () + "Insert `;' character and reindent the line." + (interactive) + (insert last-command-char) + + (if (or (verilog-in-comment-or-string-p) + (verilog-in-escaped-name-p)) + () + (save-excursion + (beginning-of-line) + (verilog-forward-ws&directives) + (verilog-indent-line) + ) + (if (and verilog-auto-newline + (not (verilog-parenthesis-depth))) + (electric-verilog-terminate-line)))) + +(defun electric-verilog-semi-with-comment () + "Insert `;' character, reindent the line and indent for comment." + (interactive) + (insert "\;") + (save-excursion + (beginning-of-line) + (verilog-indent-line)) + (indent-for-comment)) + +(defun electric-verilog-colon () + "Insert `:' and do all indentations except line indent on this line." + (interactive) + (insert last-command-char) + ;; Do nothing if within string. + (if (or + (verilog-within-string) + (not (verilog-in-case-region-p))) + () + (save-excursion + (let ((p (point)) + (lim (progn (verilog-beg-of-statement) (point)))) + (goto-char p) + (verilog-backward-case-item lim) + (verilog-indent-line))) +;; (let ((verilog-tab-always-indent nil)) +;; (verilog-indent-line)) + )) + +;;(defun electric-verilog-equal () +;; "Insert `=', and do indentation if within block." +;; (interactive) +;; (insert last-command-char) +;; Could auto line up expressions, but not yet +;; (if (eq (car (verilog-calculate-indent)) 'block) +;; (let ((verilog-tab-always-indent nil)) +;; (verilog-indent-command))) +;; ) + +(defun electric-verilog-tick () + "Insert back-tick, and indent to column 0 if this is a CPP directive." + (interactive) + (insert last-command-char) + (save-excursion + (if (progn + (beginning-of-line) + (looking-at verilog-directive-re-1)) + (verilog-indent-line)))) + +(defun electric-verilog-tab () + "Function called when TAB is pressed in Verilog mode." + (interactive) + ;; If verilog-tab-always-indent, indent the beginning of the line. + (if (or verilog-tab-always-indent + (save-excursion + (skip-chars-backward " \t") + (bolp))) + (let* ((oldpnt (point)) + (boi-point + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (verilog-indent-line) + (back-to-indentation) + (point)))) + (if (< (point) boi-point) + (back-to-indentation) + (cond ((not verilog-tab-to-comment)) + ((not (eolp)) + (end-of-line)) + (t + (indent-for-comment) + (when (and (eolp) (= oldpnt (point))) + ; kill existing comment + (beginning-of-line) + (re-search-forward comment-start-skip oldpnt 'move) + (goto-char (match-beginning 0)) + (skip-chars-backward " \t") + (kill-region (point) oldpnt) + )))) + ) + (progn (insert "\t")))) + + + +;; +;; Interactive functions +;; + +(defun verilog-indent-buffer () + "Indent-region the entire buffer as Verilog code. +To call this from the command line, see \\[verilog-batch-indent]." + (interactive) + (verilog-mode) + (indent-region (point-min) (point-max) nil)) + +(defun verilog-insert-block () + "Insert Verilog begin ... end; block in the code with right indentation." + (interactive) + (verilog-indent-line) + (insert "begin") + (electric-verilog-terminate-line) + (save-excursion + (electric-verilog-terminate-line) + (insert "end") + (beginning-of-line) + (verilog-indent-line))) + +(defun verilog-star-comment () + "Insert Verilog star comment at point." + (interactive) + (verilog-indent-line) + (insert "/*") + (save-excursion + (newline) + (insert " */")) + (newline) + (insert " * ")) + +(defun verilog-insert-indices (MAX) + "Insert a set of indices at into the rectangle. +The upper left corner is defined by the current point. Indices always +begin with 0 and extend to the MAX - 1. If no prefix arg is given, the +user is prompted for a value. The indices are surrounded by square brackets +[]. For example, the following code with the point located after the first +'a' gives: + + a = b a[ 0] = b + a = b a[ 1] = b + a = b a[ 2] = b + a = b a[ 3] = b + a = b ==> insert-indices ==> a[ 4] = b + a = b a[ 5] = b + a = b a[ 6] = b + a = b a[ 7] = b + a = b a[ 8] = b" + + (interactive "NMAX?") + (save-excursion + (let ((n 0)) + (while (< n MAX) + (save-excursion + (insert (format "[%3d]" n))) + (next-line 1) + (setq n (1+ n)))))) + + +(defun verilog-generate-numbers (MAX) + "Insert a set of generated numbers into a rectangle. +The upper left corner is defined by point. The numbers are padded to three +digits, starting with 000 and extending to (MAX - 1). If no prefix argument +is supplied, then the user is prompted for the MAX number. consider the +following code fragment: + + buf buf buf buf000 + buf buf buf buf001 + buf buf buf buf002 + buf buf buf buf003 + buf buf ==> insert-indices ==> buf buf004 + buf buf buf buf005 + buf buf buf buf006 + buf buf buf buf007 + buf buf buf buf008" + + (interactive "NMAX?") + (save-excursion + (let ((n 0)) + (while (< n MAX) + (save-excursion + (insert (format "%3.3d" n))) + (next-line 1) + (setq n (1+ n)))))) + +(defun verilog-mark-defun () + "Mark the current verilog function (or procedure). +This puts the mark at the end, and point at the beginning." + (interactive) + (push-mark (point)) + (verilog-end-of-defun) + (push-mark (point)) + (verilog-beg-of-defun) + (zmacs-activate-region)) + +(defun verilog-comment-region (start end) + ; checkdoc-params: (start end) + "Put the region into a Verilog comment. +The comments that are in this area are \"deformed\": +`*)' becomes `!(*' and `}' becomes `!{'. +These deformed comments are returned to normal if you use +\\[verilog-uncomment-region] to undo the commenting. + +The commented area starts with `verilog-exclude-str-start', and ends with +`verilog-exclude-str-end'. But if you change these variables, +\\[verilog-uncomment-region] won't recognize the comments." + (interactive "r") + (save-excursion + ;; Insert start and endcomments + (goto-char end) + (if (and (save-excursion (skip-chars-forward " \t") (eolp)) + (not (save-excursion (skip-chars-backward " \t") (bolp)))) + (forward-line 1) + (beginning-of-line)) + (insert verilog-exclude-str-end) + (setq end (point)) + (newline) + (goto-char start) + (beginning-of-line) + (insert verilog-exclude-str-start) + (newline) + ;; Replace end-comments within commented area + (goto-char end) + (save-excursion + (while (re-search-backward "\\*/" start t) + (replace-match "*-/" t t))) + (save-excursion + (let ((s+1 (1+ start))) + (while (re-search-backward "/\\*" s+1 t) + (replace-match "/-*" t t)))) + )) + +(defun verilog-uncomment-region () + "Uncomment a commented area; change deformed comments back to normal. +This command does nothing if the pointer is not in a commented +area. See also `verilog-comment-region'." + (interactive) + (save-excursion + (let ((start (point)) + (end (point))) + ;; Find the boundaries of the comment + (save-excursion + (setq start (progn (search-backward verilog-exclude-str-start nil t) + (point))) + (setq end (progn (search-forward verilog-exclude-str-end nil t) + (point)))) + ;; Check if we're really inside a comment + (if (or (equal start (point)) (<= end (point))) + (message "Not standing within commented area.") + (progn + ;; Remove endcomment + (goto-char end) + (beginning-of-line) + (let ((pos (point))) + (end-of-line) + (delete-region pos (1+ (point)))) + ;; Change comments back to normal + (save-excursion + (while (re-search-backward "\\*-/" start t) + (replace-match "*/" t t))) + (save-excursion + (while (re-search-backward "/-\\*" start t) + (replace-match "/*" t t))) + ;; Remove start comment + (goto-char start) + (beginning-of-line) + (let ((pos (point))) + (end-of-line) + (delete-region pos (1+ (point))))))))) + +(defun verilog-beg-of-defun () + "Move backward to the beginning of the current function or procedure." + (interactive) + (verilog-re-search-backward verilog-defun-re nil 'move)) + +(defun verilog-end-of-defun () + "Move forward to the end of the current function or procedure." + (interactive) + (verilog-re-search-forward verilog-end-defun-re nil 'move)) + +(defun verilog-get-beg-of-defun (&optional warn) + (save-excursion + (cond ((verilog-re-search-forward-quick verilog-defun-re nil t) + (point)) + (t + (error "%s: Can't find module beginning" (verilog-point-text)) + (point-max))))) +(defun verilog-get-end-of-defun (&optional warn) + (save-excursion + (cond ((verilog-re-search-forward-quick verilog-end-defun-re nil t) + (point)) + (t + (error "%s: Can't find endmodule" (verilog-point-text)) + (point-max))))) + +(defun verilog-label-be (&optional arg) + "Label matching begin ... end, fork ... join and case ... endcase statements. +With ARG, first kill any existing labels." + (interactive) + (let ((cnt 0) + (oldpos (point)) + (b (progn + (verilog-beg-of-defun) + (point-marker))) + (e (progn + (verilog-end-of-defun) + (point-marker))) + ) + (goto-char (marker-position b)) + (if (> (- e b) 200) + (message "Relabeling module...")) + (while (and + (> (marker-position e) (point)) + (verilog-re-search-forward + (concat + "\\" + "\\|\\(`endif\\)\\|\\(`else\\)") + nil 'move)) + (goto-char (match-beginning 0)) + (let ((indent-str (verilog-indent-line))) + (verilog-set-auto-endcomments indent-str 't) + (end-of-line) + (delete-horizontal-space) + ) + (setq cnt (1+ cnt)) + (if (= 9 (% cnt 10)) + (message "%d..." cnt)) + ) + (goto-char oldpos) + (if (or + (> (- e b) 200) + (> cnt 20)) + (message "%d lines auto commented" cnt)) + )) + +(defun verilog-beg-of-statement () + "Move backward to beginning of statement." + (interactive) + ;; Move back token by token until we see the end + ;; of some ealier line. + (while + ;; If the current point does not begin a new + ;; statement, as in the character ahead of us is a ';', or SOF + ;; or the string after us unambiguosly starts a statement, + ;; or the token before us unambiguously ends a statement, + ;; then move back a token and test again. + (not (or + (bolp) + (= (preceding-char) ?\;) + (not (or + (looking-at "\\<") + (forward-word -1))) + (and + (looking-at verilog-extended-complete-re) + (not (save-excursion + (verilog-backward-token) + (looking-at verilog-extended-complete-re))) + ) + (looking-at verilog-basic-complete-re) + (save-excursion + (verilog-backward-token) + (or + (looking-at verilog-end-block-re) + (looking-at verilog-preprocessor-re))) + )) + (verilog-backward-syntactic-ws) + (verilog-backward-token)) + ;; Now point is where the previous line ended. + (verilog-forward-syntactic-ws)) + +(defun verilog-beg-of-statement-1 () + "Move backward to beginning of statement." + (interactive) + (let ((pt (point))) + + (while (and (not (looking-at verilog-complete-reg)) + (setq pt (point)) + (verilog-backward-token) + (not (looking-at verilog-complete-reg)) + (verilog-backward-syntactic-ws) + (setq pt (point)) + (not (bolp)) + (not (= (preceding-char) ?\;)))) + (goto-char pt) + (verilog-forward-ws&directives))) + +(defun verilog-end-of-statement () + "Move forward to end of current statement." + (interactive) + (let ((nest 0) pos) + (or (looking-at verilog-beg-block-re) + ;; Skip to end of statement + (setq pos (catch 'found + (while t + (forward-sexp 1) + (verilog-skip-forward-comment-or-string) + (cond ((looking-at "[ \t]*;") + (skip-chars-forward "^;") + (forward-char 1) + (throw 'found (point))) + ((save-excursion + (forward-sexp -1) + (looking-at verilog-beg-block-re)) + (goto-char (match-beginning 0)) + (throw 'found nil)) + ((looking-at "[ \t]*)") + (throw 'found (point))) + ((eobp) + (throw 'found (point)))))))) + (if (not pos) + ;; Skip a whole block + (catch 'found + (while t + (verilog-re-search-forward verilog-end-statement-re nil 'move) + (setq nest (if (match-end 1) + (1+ nest) + (1- nest))) + (cond ((eobp) + (throw 'found (point))) + ((= 0 nest) + (throw 'found (verilog-end-of-statement)))))) + pos))) + +(defun verilog-in-case-region-p () + "Return TRUE if in a case region; +more specifically, point @ in the line foo : @ begin" + (interactive) + (save-excursion + (if (and + (progn (verilog-forward-syntactic-ws) + (looking-at "\\")) + (progn (verilog-backward-syntactic-ws) + (= (preceding-char) ?\:))) + (catch 'found + (let ((nest 1)) + (while t + (verilog-re-search-backward + (concat "\\(\\\\)\\|\\(\\\\|\\[^:]\\)\\|" + "\\(\\\\)\\>") + nil 'move) + (cond + ((match-end 3) + (setq nest (1+ nest))) + ((match-end 2) + (if (= nest 1) + (throw 'found 1)) + (setq nest (1- nest))) + (t + (throw 'found (= nest 0))) + )))) + nil))) +(defun verilog-in-struct-region-p () + "Return TRUE if in a struct region; +more specifically, in a list after a struct|union keyword" + (interactive) + (save-excursion + (let* ((state (parse-partial-sexp (point-min) (point))) + (depth (nth 0 state))) + (if depth + (progn (backward-up-list depth) + (verilog-beg-of-statement) + (looking-at "\\?\\s-*\\") + ) + ) + ) + ) + ) + +(defun verilog-in-generate-region-p () + "Return TRUE if in a generate region; +more specifically, after a generate and before an endgenerate" + (interactive) + (let ((lim (save-excursion (verilog-beg-of-defun) (point))) + (nest 1) + ) + (save-excursion + (while (and + (/= nest 0) + (verilog-re-search-backward "\\<\\(generate\\)\\|\\(endgenerate\\)\\>" lim 'move) + (cond + ((match-end 1) ; generate + (setq nest (1- nest))) + ((match-end 2) ; endgenerate + (setq nest (1+ nest))) + )) + )) + (= nest 0) )) ; return nest + +(defun verilog-in-fork-region-p () + "Return true if between a fork and join." + (interactive) + (let ((lim (save-excursion (verilog-beg-of-defun) (point))) + (nest 1) + ) + (save-excursion + (while (and + (/= nest 0) + (verilog-re-search-backward "\\<\\(fork\\)\\|\\(join\\(_any\\|_none\\)?\\)\\>" lim 'move) + (cond + ((match-end 1) ; fork + (setq nest (1- nest))) + ((match-end 2) ; join + (setq nest (1+ nest))) + )) + )) + (= nest 0) )) ; return nest + +(defun verilog-backward-case-item (lim) + "Skip backward to nearest enclosing case item. +Limit search to point LIM." + (interactive) + (let ((str 'nil) + (lim1 + (progn + (save-excursion + (verilog-re-search-backward verilog-endcomment-reason-re + lim 'move) + (point))))) + ;; Try to find the real : + (if (save-excursion (search-backward ":" lim1 t)) + (let ((colon 0) + b e ) + (while + (and + (< colon 1) + (verilog-re-search-backward "\\(\\[\\)\\|\\(\\]\\)\\|\\(:\\)" + lim1 'move)) + (cond + ((match-end 1) ;; [ + (setq colon (1+ colon)) + (if (>= colon 0) + (error "%s: unbalanced [" (verilog-point-text)))) + ((match-end 2) ;; ] + (setq colon (1- colon))) + + ((match-end 3) ;; : + (setq colon (1+ colon))) + )) + ;; Skip back to beginning of case item + (skip-chars-backward "\t ") + (verilog-skip-backward-comment-or-string) + (setq e (point)) + (setq b + (progn + (if + (verilog-re-search-backward + "\\<\\(case[zx]?\\)\\>\\|;\\|\\" nil 'move) + (progn + (cond + ((match-end 1) + (goto-char (match-end 1)) + (verilog-forward-ws&directives) + (if (looking-at "(") + (progn + (forward-sexp) + (verilog-forward-ws&directives))) + (point)) + (t + (goto-char (match-end 0)) + (verilog-forward-ws&directives) + (point)) + )) + (error "Malformed case item") + ))) + (setq str (buffer-substring b e)) + (if + (setq e + (string-match + "[ \t]*\\(\\(\n\\)\\|\\(//\\)\\|\\(/\\*\\)\\)" str)) + (setq str (concat (substring str 0 e) "..."))) + str) + 'nil))) + + +;; +;; Other functions +;; + +(defun kill-existing-comment () + "Kill auto comment on this line." + (save-excursion + (let* ( + (e (progn + (end-of-line) + (point))) + (b (progn + (beginning-of-line) + (search-forward "//" e t)))) + (if b + (delete-region (- b 2) e))))) + +(defconst verilog-directive-nest-re + (concat "\\(`else\\>\\)\\|" + "\\(`endif\\>\\)\\|" + "\\(`if\\>\\)\\|" + "\\(`ifdef\\>\\)\\|" + "\\(`ifndef\\>\\)")) +(defun verilog-set-auto-endcomments (indent-str kill-existing-comment) + "Add ending comment with given INDENT-STR. +With KILL-EXISTING-COMMENT, remove what was there before. +Insert `// case: 7 ' or `// NAME ' on this line if appropriate. +Insert `// case expr ' if this line ends a case block. +Insert `// ifdef FOO ' if this line ends code conditional on FOO. +Insert `// NAME ' if this line ends a function, task, module, primitive or interface named NAME." + (save-excursion + (cond + (; Comment close preprocessor directives + (and + (looking-at "\\(`endif\\)\\|\\(`else\\)") + (or kill-existing-comment + (not (save-excursion + (end-of-line) + (search-backward "//" (verilog-get-beg-of-line) t))))) + (let ((nest 1) b e + m + (else (if (match-end 2) "!" " ")) + ) + (end-of-line) + (if kill-existing-comment + (kill-existing-comment)) + (delete-horizontal-space) + (save-excursion + (backward-sexp 1) + (while (and (/= nest 0) + (verilog-re-search-backward verilog-directive-nest-re nil 'move)) + (cond + ((match-end 1) ; `else + (if (= nest 1) + (setq else "!"))) + ((match-end 2) ; `endif + (setq nest (1+ nest))) + ((match-end 3) ; `if + (setq nest (1- nest))) + ((match-end 4) ; `ifdef + (setq nest (1- nest))) + ((match-end 5) ; `ifndef + (setq nest (1- nest))) + )) + (if (match-end 0) + (setq + m (buffer-substring + (match-beginning 0) + (match-end 0)) + b (progn + (skip-chars-forward "^ \t") + (verilog-forward-syntactic-ws) + (point)) + e (progn + (skip-chars-forward "a-zA-Z0-9_") + (point) + )))) + (if b + (if (> (count-lines (point) b) verilog-minimum-comment-distance) + (insert (concat " // " else m " " (buffer-substring b e)))) + (progn + (insert " // unmatched `else or `endif") + (ding 't)) + ))) + + (; Comment close case/class/function/task/module and named block + (and (looking-at "\\") + (setq str "randcase") + (setq err nil) + ) + ((match-end 0) + (goto-char (match-end 1)) + (if nil + (let (s f) + (setq s (match-beginning 1)) + (setq f (progn (end-of-line) + (point))) + (setq str (buffer-substring s f))) + (setq err nil)) + (setq str (concat (buffer-substring (match-beginning 1) (match-end 1)) + " " + (verilog-get-expr)))))) + (end-of-line) + (if kill-existing-comment + (kill-existing-comment)) + (delete-horizontal-space) + (insert (concat " // " str )) + (if err (ding 't)) + )) + + (;- This is a begin..end block + (match-end 2) ;; of verilog-end-block-ordered-re + (let ((str " // UNMATCHED !!") + (err 't) + (here (point)) + there + cntx + ) + (save-excursion + (verilog-leap-to-head) + (setq there (point)) + (if (not (match-end 0)) + (progn + (goto-char here) + (end-of-line) + (if kill-existing-comment + (kill-existing-comment)) + (delete-horizontal-space) + (insert str) + (ding 't) + ) + (let ((lim + (save-excursion (verilog-beg-of-defun) (point))) + (here (point)) + ) + (cond + (;-- handle named block differently + (looking-at verilog-named-block-re) + (search-forward ":") + (setq there (point)) + (setq str (verilog-get-expr)) + (setq err nil) + (setq str (concat " // block: " str ))) + + ((verilog-in-case-region-p) ;-- handle case item differently + (goto-char here) + (setq str (verilog-backward-case-item lim)) + (setq there (point)) + (setq err nil) + (setq str (concat " // case: " str ))) + + (;- try to find "reason" for this begin + (cond + (; + (eq here (progn + (verilog-backward-token) + (verilog-beg-of-statement-1) + (point))) + (setq err nil) + (setq str "")) + ((looking-at verilog-endcomment-reason-re) + (setq there (match-end 0)) + (setq cntx (concat + (buffer-substring (match-beginning 0) (match-end 0)) " ")) + (cond + (;- begin + (match-end 2) + (setq err nil) + (save-excursion + (if (and (verilog-continued-line) + (looking-at "\\\\|\\\\|\\")) + (progn + (goto-char (match-end 0)) + (setq there (point)) + (setq str + (concat " // " + (buffer-substring (match-beginning 0) (match-end 0)) " " + (verilog-get-expr)))) + (setq str "")))) + + (;- else + (match-end 4) + (let ((nest 0) + ( reg "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)") + ) + (catch 'skip + (while (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 1) ; begin + (setq nest (1- nest))) + ((match-end 2) ; end + (setq nest (1+ nest))) + ((match-end 3) + (if (= 0 nest) + (progn + (goto-char (match-end 0)) + (setq there (point)) + (setq err nil) + (setq str (verilog-get-expr)) + (setq str (concat " // else: !if" str )) + (throw 'skip 1)) + ))) + )))) + + (;- end else + (match-end 5) + (goto-char there) + (let ((nest 0) + ( reg "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)") + ) + (catch 'skip + (while (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 1) ; begin + (setq nest (1- nest))) + ((match-end 2) ; end + (setq nest (1+ nest))) + ((match-end 3) + (if (= 0 nest) + (progn + (goto-char (match-end 0)) + (setq there (point)) + (setq err nil) + (setq str (verilog-get-expr)) + (setq str (concat " // else: !if" str )) + (throw 'skip 1)) + ))) + )))) + + (;- task/function/initial et cetera + t + (match-end 0) + (goto-char (match-end 0)) + (setq there (point)) + (setq err nil) + (setq str (verilog-get-expr)) + (setq str (concat " // " cntx str ))) + + (;-- otherwise... + (setq str " // auto-endcomment confused ")) + )) + + ((and + (verilog-in-case-region-p) ;-- handle case item differently + (progn + (setq there (point)) + (goto-char here) + (setq str (verilog-backward-case-item lim)))) + (setq err nil) + (setq str (concat " // case: " str ))) + + ((verilog-in-fork-region-p) + (setq err nil) + (setq str " // fork branch" )) + + ((looking-at "\\") + ;; HERE + (forward-word 1) + (verilog-forward-syntactic-ws) + (setq err nil) + (setq str (verilog-get-expr)) + (setq str (concat " // " cntx str ))) + + )))) + (goto-char here) + (end-of-line) + (if kill-existing-comment + (kill-existing-comment)) + (delete-horizontal-space) + (if (or err + (> (count-lines here there) verilog-minimum-comment-distance)) + (insert str)) + (if err (ding 't)) + )))) + (;- this is endclass, which can be nested + (match-end 11) ;; of verilog-end-block-ordered-re + ;;(goto-char there) + (let ((nest 0) + ( reg "\\<\\(class\\)\\|\\(endclass\\)\\|\\(package\\|primitive\\|\\(macro\\)?module\\)\\>") + string + ) + (save-excursion + (catch 'skip + (while (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 3) ; endclass + (ding 't) + (setq string "unmatched endclass") + (throw 'skip 1)) + + ((match-end 2) ; endclass + (setq nest (1+ nest))) + + ((match-end 1) ; class + (setq nest (1- nest)) + (if (< nest 0) + (progn + (goto-char (match-end 0)) + (let (b e) + (setq b (progn + (skip-chars-forward "^ \t") + (verilog-forward-ws&directives) + (point)) + e (progn + (skip-chars-forward "a-zA-Z0-9_") + (point))) + (setq string (buffer-substring b e))) + (throw 'skip 1)))) + )))) + (end-of-line) + (insert (concat " // " string ))) + ) + + (;- this is end{function,generate,task,module,primitive,table,generate} + ;- which can not be nested. + t + (let (string reg (width nil)) + (end-of-line) + (if kill-existing-comment + (save-match-data + (kill-existing-comment))) + (delete-horizontal-space) + (backward-sexp) + (cond + ((match-end 5) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endfunction\\|task\\|\\(macro\\)?module\\|primitive\\)\\>\\)") + (setq width "\\(\\s-*\\(\\[[^]]*\\]\\)\\|\\(real\\(time\\)?\\)\\|\\(integer\\)\\|\\(time\\)\\)?") + ) + ((match-end 6) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endtask\\|function\\|\\(macro\\)?module\\|primitive\\)\\>\\)")) + ((match-end 7) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\<\\(macro\\)?module\\>\\)\\|\\")) + ((match-end 8) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endprimitive\\|package\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 9) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endinterface\\|package\\|primitive\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 10) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endpackage\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 11) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endclass\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 12) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endcovergroup\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 13) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\(\\<\\(endprogram\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 14) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\<\\(endsequence\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) + ((match-end 15) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\")) + + (t (error "Problem in verilog-set-auto-endcomments")) + ) + (let (b e) + (save-excursion + (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 1) + (setq b (progn + (skip-chars-forward "^ \t") + (verilog-forward-ws&directives) + (if (and width (looking-at width)) + (progn + (goto-char (match-end 0)) + (verilog-forward-ws&directives) + )) + (point)) + e (progn + (skip-chars-forward "a-zA-Z0-9_") + (point))) + (setq string (buffer-substring b e))) + (t + (ding 't) + (setq string "unmatched end(function|task|module|primitive|interface|package|class|clocking)"))))) + (end-of-line) + (insert (concat " // " string ))) + )))))))))) + +(defun verilog-get-expr() + "Grab expression at point, e.g, case ( a | b & (c ^d))" + (let* ((b (progn + (verilog-forward-syntactic-ws) + (skip-chars-forward " \t") + (point))) + (e (let ((par 1)) + (cond + ((looking-at "@") + (forward-char 1) + (verilog-forward-syntactic-ws) + (if (looking-at "(") + (progn + (forward-char 1) + (while (and (/= par 0) + (verilog-re-search-forward "\\((\\)\\|\\()\\)" nil 'move)) + (cond + ((match-end 1) + (setq par (1+ par))) + ((match-end 2) + (setq par (1- par))))))) + (point)) + ((looking-at "(") + (forward-char 1) + (while (and (/= par 0) + (verilog-re-search-forward "\\((\\)\\|\\()\\)" nil 'move)) + (cond + ((match-end 1) + (setq par (1+ par))) + ((match-end 2) + (setq par (1- par))))) + (point)) + ((looking-at "\\[") + (forward-char 1) + (while (and (/= par 0) + (verilog-re-search-forward "\\(\\[\\)\\|\\(\\]\\)" nil 'move)) + (cond + ((match-end 1) + (setq par (1+ par))) + ((match-end 2) + (setq par (1- par))))) + (verilog-forward-syntactic-ws) + (skip-chars-forward "^ \t\n\f") + (point)) + ((looking-at "/[/\\*]") + b) + ('t + (skip-chars-forward "^: \t\n\f") + (point) + )))) + (str (buffer-substring b e))) + (if (setq e (string-match "[ \t]*\\(\\(\n\\)\\|\\(//\\)\\|\\(/\\*\\)\\)" str)) + (setq str (concat (substring str 0 e) "..."))) + str)) + +(defun verilog-expand-vector () + "Take a signal vector on the current line and expand it to multiple lines. +Useful for creating tri's and other expanded fields." + (interactive) + (verilog-expand-vector-internal "[" "]")) + +(defun verilog-expand-vector-internal (bra ket) + "Given BRA, the start brace and KET, the end brace, expand one line into many lines." + (save-excursion + (forward-line 0) + (let ((signal-string (buffer-substring (point) + (progn + (end-of-line) (point))))) + (if (string-match (concat "\\(.*\\)" + (regexp-quote bra) + "\\([0-9]*\\)\\(:[0-9]*\\|\\)\\(::[0-9---]*\\|\\)" + (regexp-quote ket) + "\\(.*\\)$") signal-string) + (let* ((sig-head (match-string 1 signal-string)) + (vec-start (string-to-int (match-string 2 signal-string))) + (vec-end (if (= (match-beginning 3) (match-end 3)) + vec-start + (string-to-int (substring signal-string (1+ (match-beginning 3)) (match-end 3))))) + (vec-range (if (= (match-beginning 4) (match-end 4)) + 1 + (string-to-int (substring signal-string (+ 2 (match-beginning 4)) (match-end 4))))) + (sig-tail (match-string 5 signal-string)) + vec) + ;; Decode vectors + (setq vec nil) + (if (< vec-range 0) + (let ((tmp vec-start)) + (setq vec-start vec-end + vec-end tmp + vec-range (- vec-range)))) + (if (< vec-end vec-start) + (while (<= vec-end vec-start) + (setq vec (append vec (list vec-start))) + (setq vec-start (- vec-start vec-range))) + (while (<= vec-start vec-end) + (setq vec (append vec (list vec-start))) + (setq vec-start (+ vec-start vec-range)))) + ;; + ;; Delete current line + (delete-region (point) (progn (forward-line 0) (point))) + ;; + ;; Expand vector + (while vec + (insert (concat sig-head bra (int-to-string (car vec)) ket sig-tail "\n")) + (setq vec (cdr vec))) + (delete-char -1) + ;; + ))))) + +(defun verilog-strip-comments () + "Strip all comments from the verilog code." + (interactive) + (goto-char (point-min)) + (while (re-search-forward "//" nil t) + (if (verilog-within-string) + (re-search-forward "\"" nil t) + (if (verilog-in-star-comment-p) + (re-search-forward "\*/" nil t) + (let ((bpt (- (point) 2))) + (end-of-line) + (delete-region bpt (point)))))) + ;; + (goto-char (point-min)) + (while (re-search-forward "/\\*" nil t) + (if (verilog-within-string) + (re-search-forward "\"" nil t) + (let ((bpt (- (point) 2))) + (re-search-forward "\\*/") + (delete-region bpt (point)))))) + +(defun verilog-one-line () + "Convert structural verilog instances to occupy one line." + (interactive) + (goto-char (point-min)) + (while (re-search-forward "\\([^;]\\)[ \t]*\n[ \t]*" nil t) + (replace-match "\\1 " nil nil))) + +(defun verilog-linter-name () + "Return name of linter, either surelint or verilint." + (let ((compile-word1 (verilog-string-replace-matches "\\s .*$" "" nil nil + compile-command)) + (lint-word1 (verilog-string-replace-matches "\\s .*$" "" nil nil + verilog-linter))) + (cond ((equal compile-word1 "surelint") `surelint) + ((equal compile-word1 "verilint") `verilint) + ((equal lint-word1 "surelint") `surelint) + ((equal lint-word1 "verilint") `verilint) + (t `surelint)))) ;; back compatibility + +(defun verilog-lint-off () + "Convert a Verilog linter warning line into a disable statement. +For example: + pci_bfm_null.v, line 46: Unused input: pci_rst_ +becomes a comment for the appropriate tool. + +The first word of the `compile-command' or `verilog-linter' +variables are used to determine which product is being used. + +See \\[verilog-surelint-off] and \\[verilog-verilint-off]." + (interactive) + (let ((linter (verilog-linter-name))) + (cond ((equal linter `surelint) + (verilog-surelint-off)) + ((equal linter `verilint) + (verilog-verilint-off)) + (t (error "Linter name not set"))))) + +(defun verilog-surelint-off () + "Convert a SureLint warning line into a disable statement. +Run from Verilog source window; assumes there is a *compile* buffer +with point set appropriately. + +For example: + WARNING [STD-UDDONX]: xx.v, line 8: output out is never assigned. +becomes: + // surefire lint_line_off UDDONX" + (interactive) + (save-excursion + (switch-to-buffer compilation-last-buffer) + (beginning-of-line) + (when + (looking-at "\\(INFO\\|WARNING\\|ERROR\\) \\[[^-]+-\\([^]]+\\)\\]: \\([^,]+\\), line \\([0-9]+\\): \\(.*\\)$") + (let* ((code (match-string 2)) + (file (match-string 3)) + (line (match-string 4)) + (buffer (get-file-buffer file)) + dir filename) + (unless buffer + (progn + (setq buffer + (and (file-exists-p file) + (find-file-noselect file))) + (or buffer + (let* ((pop-up-windows t)) + (let ((name (expand-file-name + (read-file-name + (format "Find this error in: (default %s) " + file) + dir file t)))) + (if (file-directory-p name) + (setq name (expand-file-name filename name))) + (setq buffer + (and (file-exists-p name) + (find-file-noselect name)))))))) + (switch-to-buffer buffer) + (goto-line (string-to-number line)) + (end-of-line) + (catch 'already + (cond + ((verilog-in-slash-comment-p) + (re-search-backward "//") + (cond + ((looking-at "// surefire lint_off_line ") + (goto-char (match-end 0)) + (let ((lim (save-excursion (end-of-line) (point)))) + (if (re-search-forward code lim 'move) + (throw 'already t) + (insert-string (concat " " code))))) + (t + ))) + ((verilog-in-star-comment-p) + (re-search-backward "/\*") + (insert-string (format " // surefire lint_off_line %6s" code )) + ) + (t + (insert-string (format " // surefire lint_off_line %6s" code )) + ))))))) + +(defun verilog-verilint-off () + "Convert a Verilint warning line into a disable statement. + +For example: + (W240) pci_bfm_null.v, line 46: Unused input: pci_rst_ +becomes: + //Verilint 240 off // WARNING: Unused input" + (interactive) + (save-excursion + (beginning-of-line) + (when (looking-at "\\(.*\\)([WE]\\([0-9A-Z]+\\)).*,\\s +line\\s +[0-9]+:\\s +\\([^:\n]+\\):?.*$") + (replace-match (format + ;; %3s makes numbers 1-999 line up nicely + "\\1//Verilint %3s off // WARNING: \\3" + (match-string 2))) + (beginning-of-line) + (verilog-indent-line)))) + +(defun verilog-auto-save-compile () + "Update automatics with \\[verilog-auto], save the buffer, and compile." + (interactive) + (verilog-auto) ; Always do it for safety + (save-buffer) + (compile compile-command)) + + + +;; +;; Batch +;; + +(defmacro verilog-batch-error-wrapper (&rest body) + "Execute BODY and add error prefix to any errors found. +This lets programs calling batch mode to easily extract error messages." + (` (condition-case err + (progn (,@ body)) + (error + (error "%%Error: %s%s" (error-message-string err) + (if (featurep 'xemacs) "\n" "")))))) ;; xemacs forgets to add a newline + +(defun verilog-batch-execute-func (funref) + "Internal processing of a batch command, running FUNREF on all command arguments." + (verilog-batch-error-wrapper + ;; General globals needed + (setq make-backup-files nil) + (setq-default make-backup-files nil) + (setq enable-local-variables t) + (setq enable-local-eval t) + ;; Make sure any sub-files we read get proper mode + (setq default-major-mode `verilog-mode) + ;; Ditto files already read in + (mapcar '(lambda (buf) + (when (buffer-file-name buf) + (save-excursion + (set-buffer buf) + (verilog-mode)))) + (buffer-list)) + ;; Process the files + (mapcar '(lambda (buf) + (when (buffer-file-name buf) + (save-excursion + (if (not (file-exists-p (buffer-file-name buf))) + (error (concat "File not found: " (buffer-file-name buf)))) + (message (concat "Processing " (buffer-file-name buf))) + (set-buffer buf) + (funcall funref) + (save-buffer)))) + (buffer-list)))) + +(defun verilog-batch-auto () + "For use with --batch, perform automatic expansions as a stand-alone tool. +This sets up the appropriate Verilog-Mode environment, updates automatics +with \\[verilog-auto] on all command-line files, and saves the buffers. +For proper results, multiple filenames need to be passed on the command +line in bottom-up order." + (unless noninteractive + (error "Use verilog-batch-auto only with --batch")) ;; Otherwise we'd mess up buffer modes + (verilog-batch-execute-func `verilog-auto)) + +(defun verilog-batch-delete-auto () + "For use with --batch, perform automatic deletion as a stand-alone tool. +This sets up the appropriate Verilog-Mode environment, deletes automatics +with \\[verilog-delete-auto] on all command-line files, and saves the buffers." + (unless noninteractive + (error "Use verilog-batch-delete-auto only with --batch")) ;; Otherwise we'd mess up buffer modes + (verilog-batch-execute-func `verilog-delete-auto)) + +(defun verilog-batch-inject-auto () + "For use with --batch, perform automatic injection as a stand-alone tool. +This sets up the appropriate Verilog-Mode environment, injects new automatics +with \\[verilog-inject-auto] on all command-line files, and saves the buffers. +For proper results, multiple filenames need to be passed on the command +line in bottom-up order." + (unless noninteractive + (error "Use verilog-batch-inject-auto only with --batch")) ;; Otherwise we'd mess up buffer modes + (verilog-batch-execute-func `verilog-inject-auto)) + +(defun verilog-batch-indent () + "For use with --batch, reindent an a entire file as a stand-alone tool. +This sets up the appropriate Verilog-Mode environment, calls +\\[verilog-indent-buffer] on all command-line files, and saves the buffers." + (unless noninteractive + (error "Use verilog-batch-indent only with --batch")) ;; Otherwise we'd mess up buffer modes + (verilog-batch-execute-func `verilog-indent-buffer)) + + +;; +;; Indentation +;; +(defconst verilog-indent-alist + '((block . (+ ind verilog-indent-level)) + (case . (+ ind verilog-case-indent)) + (cparenexp . (+ ind verilog-indent-level)) + (cexp . (+ ind verilog-cexp-indent)) + (defun . verilog-indent-level-module) + (declaration . verilog-indent-level-declaration) + (directive . (verilog-calculate-indent-directive)) + (tf . verilog-indent-level) + (behavioral . (+ verilog-indent-level-behavioral verilog-indent-level-module)) + (statement . ind) + (cpp . 0) + (comment . (verilog-comment-indent)) + (unknown . 3) + (string . 0))) + +(defun verilog-continued-line-1 (lim) + "Return true if this is a continued line. +Set point to where line starts. Limit search to point LIM." + (let ((continued 't)) + (if (eq 0 (forward-line -1)) + (progn + (end-of-line) + (verilog-backward-ws&directives lim) + (if (bobp) + (setq continued nil) + (setq continued (verilog-backward-token)))) + (setq continued nil)) + continued)) + +(defun verilog-calculate-indent () + "Calculate the indent of the current Verilog line. +Examine previous lines. Once a line is found that is definitive as to the +type of the current line, return that lines' indent level and its +type. Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)." + (save-excursion + (let* ((starting_position (point)) + (par 0) + (begin (looking-at "[ \t]*begin\\>")) + (lim (save-excursion (verilog-re-search-backward "\\(\\\\)\\|\\(\\\\)" nil t))) + (type (catch 'nesting + ;; Keep working backwards until we can figure out + ;; what type of statement this is. + ;; Basically we need to figure out + ;; 1) if this is a continuation of the previous line; + ;; 2) are we in a block scope (begin..end) + + ;; if we are in a comment, done. + (if (verilog-in-star-comment-p) + (throw 'nesting 'comment)) + + ;; if we have a directive, done. + (if (save-excursion (beginning-of-line) (looking-at verilog-directive-re-1)) + (throw 'nesting 'directive)) + + ;; unless we are in the newfangled coverpoint or constraint blocks + ;; if we are in a parenthesized list, and the user likes to indent these, return. + (if (and + verilog-indent-lists + (not (verilog-in-coverage)) + (verilog-in-paren)) + (progn (setq par 1) + (throw 'nesting 'block)) + ) + + ;; See if we are continuing a previous line + (while t + ;; trap out if we crawl off the top of the buffer + (if (bobp) (throw 'nesting 'cpp)) + + (if (verilog-continued-line-1 lim) + (let ((sp (point))) + (if (and + (not (looking-at verilog-complete-reg)) + (verilog-continued-line-1 lim)) + (progn (goto-char sp) + (throw 'nesting 'cexp)) + + (goto-char sp)) + + (if (and begin + (not verilog-indent-begin-after-if) + (looking-at verilog-no-indent-begin-re)) + (progn + (beginning-of-line) + (skip-chars-forward " \t") + (throw 'nesting 'statement)) + (progn + (throw 'nesting 'cexp)))) + ;; not a continued line + (goto-char starting_position)) + + (if (looking-at "\\") + ;; search back for governing if, striding across begin..end pairs + ;; appropriately + (let ((elsec 1)) + (while (verilog-re-search-backward verilog-ends-re nil 'move) + (cond + ((match-end 1) ; else, we're in deep + (setq elsec (1+ elsec))) + ((match-end 2) ; if + (setq elsec (1- elsec)) + (if (= 0 elsec) + (if verilog-align-ifelse + (throw 'nesting 'statement) + (progn ;; back up to first word on this line + (beginning-of-line) + (verilog-forward-syntactic-ws) + (throw 'nesting 'statement))))) + (t ; endblock + ; try to leap back to matching outward block by striding across + ; indent level changing tokens then immediately + ; previous line governs indentation. + (let (( reg) (nest 1)) +;; verilog-ends => else|if|end|join(_any|_none|)|endcase|endclass|endtable|endspecify|endfunction|endtask|endgenerate|endgroup + (cond + ((match-end 3) ; end + ;; Search back for matching begin + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 4) ; endcase + ;; Search back for matching case + (setq reg "\\(\\\\|\\[^:]\\)\\|\\(\\\\)" )) + ((match-end 5) ; endfunction + ;; Search back for matching function + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 6) ; endtask + ;; Search back for matching task + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 7) ; endspecify + ;; Search back for matching specify + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 8) ; endtable + ;; Search back for matching table + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 9) ; endgenerate + ;; Search back for matching generate + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 10) ; joins + ;; Search back for matching fork + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 11) ; class + ;; Search back for matching class + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((match-end 12) ; covergroup + ;; Search back for matching covergroup + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ) + (catch 'skip + (while (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 1) ; begin + (setq nest (1- nest)) + (if (= 0 nest) + (throw 'skip 1))) + ((match-end 2) ; end + (setq nest (1+ nest))))) + ) + )) + )))) + (throw 'nesting (verilog-calc-1)) + ) + );; catch nesting + );; type + ) + ;; Return type of block and indent level. + (if (not type) + (setq type 'cpp)) + (if (> par 0) ; Unclosed Parenthesis + (list 'cparenexp par) + (cond + ((eq type 'case) + (list type (verilog-case-indent-level))) + ((eq type 'statement) + (list type (current-column))) + ((eq type 'defun) + (list type 0)) + (t + (list type (verilog-current-indent-level))))) + ))) +(defun verilog-wai () + "Show matching nesting block for debugging." + (interactive) + (save-excursion + (let ((nesting (verilog-calc-1))) + (message "You are at nesting %s" nesting)))) + +(defun verilog-calc-1 () + (catch 'nesting + (while (verilog-re-search-backward (concat "\\({\\|}\\|" verilog-indent-re "\\)") nil 'move) + (cond + ((equal (char-after) ?\{) + (if (verilog-at-constraint-p) + (throw 'nesting 'block) + )) + ((equal (char-after) ?\}) + + (let ((there (verilog-at-close-constraint-p))) + (if there (goto-char there)))) + + ((looking-at verilog-beg-block-re-ordered) + (cond + ((match-end 2) ; *sigh* could be "unique case" or "priority casex" + (let ((here (point))) + (verilog-beg-of-statement) + (if (looking-at verilog-extended-case-re) + (throw 'nesting 'case) + (goto-char here))) + (throw 'nesting 'case)) + + ;; need to consider typedef struct here... + ((looking-at "\\") + ; *sigh* These words have an optional prefix: + ; extern {virtual|protected}? function a(); + ; assert property (p_1); + ; typedef class foo; + ; and we don't want to confuse this with + ; function a(); + ; property + ; ... + ; endfunction + (let ((here (point))) + (save-excursion + (verilog-beg-of-statement) + (if (= (point) here) + (throw 'nesting 'block)) + ))) + (t (throw 'nesting 'block)))) + + ((looking-at verilog-end-block-re) + (verilog-leap-to-head) + (if (verilog-in-case-region-p) + (progn + (verilog-leap-to-case-head) + (if (looking-at verilog-case-re) + (throw 'nesting 'case))))) + + ((looking-at (if (verilog-in-generate-region-p) + verilog-defun-level-not-generate-re + verilog-defun-level-re)) + (throw 'nesting 'defun)) + + ((looking-at verilog-cpp-level-re) + (throw 'nesting 'cpp)) + + ((bobp) + (throw 'nesting 'cpp)) + )) + (throw 'nesting 'cpp) + ) + ) + +(defun verilog-calculate-indent-directive () + "Return indentation level for directive. +For speed, the searcher looks at the last directive, not the indent +of the appropriate enclosing block." + (let ((base -1) ;; Indent of the line that determines our indentation + (ind 0) ;; Relative offset caused by other directives (like `endif on same line as `else) + ) + ;; Start at current location, scan back for another directive + + (save-excursion + (beginning-of-line) + (while (and (< base 0) + (verilog-re-search-backward verilog-directive-re nil t)) + (cond ((save-excursion (skip-chars-backward " \t") (bolp)) + (setq base (current-indentation)) + )) + (cond ((and (looking-at verilog-directive-end) (< base 0)) ;; Only matters when not at BOL + (setq ind (- ind verilog-indent-level-directive))) + ((and (looking-at verilog-directive-middle) (>= base 0)) ;; Only matters when at BOL + (setq ind (+ ind verilog-indent-level-directive))) + ((looking-at verilog-directive-begin) + (setq ind (+ ind verilog-indent-level-directive))))) + ;; Adjust indent to starting indent of critical line + (setq ind (max 0 (+ ind base)))) + + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (cond ((or (looking-at verilog-directive-middle) + (looking-at verilog-directive-end)) + (setq ind (max 0 (- ind verilog-indent-level-directive)))))) + ind)) + +(defun verilog-leap-to-case-head () + (let ((nest 1)) + (while (/= 0 nest) + (verilog-re-search-backward "\\(\\\\|\\[^:]\\)\\|\\(\\\\)" nil 'move) + (cond + ((match-end 1) + (setq nest (1- nest))) + ((match-end 2) + (setq nest (1+ nest))) + ((bobp) + (ding 't) + (setq nest 0)))))) + +(defun verilog-leap-to-head () + "Move point to the head of this block; jump from end to matching begin, +from endcase to matching case, and so on." + (let ((reg nil) + snest + (nest 1)) + (cond + ((looking-at "\\") + ;; 1: Search back for matching begin + (setq reg (concat "\\(\\\\)\\|\\(\\\\)\\|" + "\\(\\\\)\\|\\(\\\\)" ))) + ((looking-at "\\") + ;; 2: Search back for matching case + (setq reg "\\(\\\\|\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 3: Search back for matching fork + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 4: Search back for matching class + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 5: Search back for matching table + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 6: Search back for matching specify + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 7: Search back for matching function + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 8: Search back for matching generate + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 9: Search back for matching task + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 10: Search back for matching covergroup + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 11: Search back for matching property + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 12: Search back for matching interface + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 12: Search back for matching sequence + (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\\\)" )) + ((looking-at "\\") + ;; 12: Search back for matching clocking + (setq reg "\\(\\\\)" )) + ) + (if reg + (catch 'skip + (let (sreg) + (while (verilog-re-search-backward reg nil 'move) + (cond + ((match-end 1) ; begin + (setq nest (1- nest)) + (if (= 0 nest) + ;; Now previous line describes syntax + (throw 'skip 1)) + (if (and snest + (= snest nest)) + (setq reg sreg))) + ((match-end 2) ; end + (setq nest (1+ nest))) + ((match-end 3) + ;; endcase, jump to case + (setq snest nest) + (setq nest (1+ nest)) + (setq sreg reg) + (setq reg "\\(\\\\|\\[^:]\\)\\|\\(\\\\)" )) + ((match-end 4) + ;; join, jump to fork + (setq snest nest) + (setq nest (1+ nest)) + (setq sreg reg) + (setq reg "\\(\\\\)\\|\\(\\\\)" )) + ))))))) + +(defun verilog-continued-line () + "Return true if this is a continued line. +Set point to where line starts" + (let ((continued 't)) + (if (eq 0 (forward-line -1)) + (progn + (end-of-line) + (verilog-backward-ws&directives) + (if (bobp) + (setq continued nil) + (while (and continued + (save-excursion + (skip-chars-backward " \t") + (not (bolp)))) + (setq continued (verilog-backward-token)) + ) ;; while + )) + (setq continued nil)) + continued)) + +(defun verilog-backward-token () + "Step backward token, returning true if we are now at an end of line token." + (interactive) + (verilog-backward-syntactic-ws) + (cond + ((bolp) + nil) + (;-- Anything ending in a ; is complete + (= (preceding-char) ?\;) + nil) + (; If a "}" is prefixed by a ";", then this is a complete statement + ; i.e.: constraint foo { a = b; } + (= (preceding-char) ?\}) + (progn + (backward-char) + (verilog-at-close-constraint-p)) + ) + (;-- constraint foo { a = b } + ; is a complete statement. *sigh* + (= (preceding-char) ?\{) + (progn + (backward-char) + (not (verilog-at-constraint-p))) + ) + (;-- Could be 'case (foo)' or 'always @(bar)' which is complete + ; also could be simply '@(foo)' + ; or foo u1 #(a=8) + ; (b, ... which ISN'T complete + ;;;; Do we need this??? + (= (preceding-char) ?\)) + (progn + (backward-char) + (backward-up-list 1) + (verilog-backward-syntactic-ws) + (let ((back (point))) + (forward-word -1) + (cond + ((looking-at "\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\|case\\(\\|[xz]\\)\\|for\\(\\|each\\|ever\\)\\|i\\(f\\|nitial\\)\\|repeat\\|while\\)\\>") + (not (looking-at "\\\\|\\[^:]"))) + (t + (goto-char back) + (cond + ((= (preceding-char) ?\@) + (backward-char) + (save-excursion + (verilog-backward-token) + (not (looking-at "\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\|initial\\|while\\)\\>")))) + ((= (preceding-char) ?\#) + (backward-char) + ) + (t t)) + ))))) + + (;-- any of begin|initial|while are complete statements; 'begin : foo' is also complete + t + (forward-word -1) + (cond + ((looking-at "\\") + t) + ((looking-at verilog-indent-re) + nil) + (t + (let + ((back (point))) + (verilog-backward-syntactic-ws) + (cond + ((= (preceding-char) ?\:) + (backward-char) + (verilog-backward-syntactic-ws) + (backward-sexp) + (if (looking-at verilog-nameable-item-re ) + nil + t) + ) + ((= (preceding-char) ?\#) + (backward-char) + t) + ((= (preceding-char) ?\`) + (backward-char) + t) + + (t + (goto-char back) + t) + ))))))) + +(defun verilog-backward-syntactic-ws (&optional bound) + "Backward skip over syntactic whitespace for Emacs 19. +Optional BOUND limits search." + (save-restriction + (let* ((bound (or bound (point-min))) (here bound) ) + (if (< bound (point)) + (progn + (narrow-to-region bound (point)) + (while (/= here (point)) + (setq here (point)) + (verilog-skip-backward-comments) + ))) + )) + t) + +(defun verilog-forward-syntactic-ws (&optional bound) + "Forward skip over syntactic whitespace for Emacs 19. +Optional BOUND limits search." + (save-restriction + (let* ((bound (or bound (point-max))) + (here bound) + ) + (if (> bound (point)) + (progn + (narrow-to-region (point) bound) + (while (/= here (point)) + (setq here (point)) + (forward-comment (buffer-size)) + ))) + ))) + +(defun verilog-backward-ws&directives (&optional bound) + "Backward skip over syntactic whitespace and compiler directives for Emacs 19. +Optional BOUND limits search." + (save-restriction + (let* ((bound (or bound (point-min))) + (here bound) + (p nil) ) + (if (< bound (point)) + (progn + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 7 state) ;; in // comment + (verilog-re-search-backward "//" nil 'move) + (skip-chars-backward "/")) + ((nth 4 state) ;; in /* */ comment + (verilog-re-search-backward "/\*" nil 'move)))) + (narrow-to-region bound (point)) + (while (/= here (point)) + (setq here (point)) + (verilog-skip-backward-comments) + (setq p + (save-excursion + (beginning-of-line) + (cond + ((verilog-within-translate-off) + (verilog-back-to-start-translate-off (point-min))) + ((looking-at verilog-directive-re-1) + (point)) + (t + nil)))) + (if p (goto-char p)) + ))) + ))) + +(defun verilog-forward-ws&directives (&optional bound) + "Forward skip over syntactic whitespace and compiler directives for Emacs 19. +Optional BOUND limits search." + (save-restriction + (let* ((bound (or bound (point-max))) + (here bound) + jump + ) + (if (> bound (point)) + (progn + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 7 state) ;; in // comment + (verilog-re-search-forward "//" nil 'move)) + ((nth 4 state) ;; in /* */ comment + (verilog-re-search-forward "/\*" nil 'move)))) + (narrow-to-region (point) bound) + (while (/= here (point)) + (setq here (point) + jump nil) + (forward-comment (buffer-size)) + (save-excursion + (beginning-of-line) + (if (looking-at verilog-directive-re-1) + (setq jump t))) + (if jump + (beginning-of-line 2)) + ))) + ))) + +(defun verilog-in-comment-p () + "Return true if in a star or // comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (or (nth 4 state) (nth 7 state)))) + +(defun verilog-in-star-comment-p () + "Return true if in a star comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (and + (nth 4 state) ; t if in a comment of style a // or b /**/ + (not + (nth 7 state) ; t if in a comment of style b /**/ + )))) + +(defun verilog-in-slash-comment-p () + "Return true if in a slash comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (nth 7 state))) + +(defun verilog-in-comment-or-string-p () + "Return true if in a string or comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (or (nth 3 state) (nth 4 state) (nth 7 state)))) ; Inside string or comment) + +(defun verilog-in-escaped-name-p () + "Return true if in an escaped name." + (save-excursion + (backward-char) + (skip-chars-backward "^ \t\n\f") + (if (equal (char-after (point) ) ?\\ ) + t + nil))) + +(defun verilog-in-paren () + "Return true if in a parenthetical expression." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (> (nth 0 state) 0 ))) + +(defun verilog-in-coverage () + "Return true if in a constraint or coverpoint expression." + (interactive) + (save-excursion + (if (verilog-in-paren) + (progn + (backward-up-list 1) + (verilog-at-constraint-p) + ) + nil))) +(defun verilog-at-close-constraint-p () + "If at the } that closes a constraint or covergroup, return true." + (if (and + (equal (char-after) ?\}) + (verilog-in-paren)) + + (save-excursion + (verilog-backward-ws&directives) + (if (equal (char-before) ?\;) + (point) + nil)))) + +(defun verilog-at-constraint-p () + "If at the { of a constraint or coverpoint definition, return true, moving point to constraint." + (if (save-excursion + (and + (equal (char-after) ?\{) + (forward-list) + (progn (backward-char 1) + (verilog-backward-ws&directives) + (equal (char-before) ?\;)) + )) + ;; maybe + (verilog-re-search-backward "\\" nil 'move) + ;; not + nil + ) + ) + +(defun verilog-parenthesis-depth () + "Return non zero if in parenthetical-expression." + (save-excursion + (nth 1 (parse-partial-sexp (point-min) (point))))) + + +(defun verilog-skip-forward-comment-or-string () + "Return true if in a string or comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 3 state) ;Inside string + (goto-char (nth 3 state)) + t) + ((nth 7 state) ;Inside // comment + (forward-line 1) + t) + ((nth 4 state) ;Inside any comment (hence /**/) + (search-forward "*/")) + (t + nil)))) + +(defun verilog-skip-backward-comment-or-string () + "Return true if in a string or comment." + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 3 state) ;Inside string + (search-backward "\"") + t) + ((nth 7 state) ;Inside // comment + (search-backward "//") + (skip-chars-backward "/") + t) + ((nth 4 state) ;Inside /* */ comment + (search-backward "/*") + t) + (t + nil)))) + +(defun verilog-skip-backward-comments () + "Return true if a comment was skipped." + (let ((more t)) + (while more + (setq more + (let ((state + (save-excursion + (parse-partial-sexp (point-min) (point))))) + (cond + ((nth 7 state) ;Inside // comment + (search-backward "//") + (skip-chars-backward "/") + (skip-chars-backward " \t\n\f") + t) + ((nth 4 state) ;Inside /* */ comment + (search-backward "/*") + (skip-chars-backward " \t\n\f") + t) + ((and (not (bobp)) + (= (char-before) ?\/) + (= (char-before (1- (point))) ?\*) + ) + (goto-char (- (point) 2)) + t) + (t + (skip-chars-backward " \t\n\f") + nil))))))) + +(defun verilog-skip-forward-comment-p () + "If in comment, move to end and return true." + (let (state) + (progn + (setq state + (save-excursion + (parse-partial-sexp (point-min) (point)))) + (cond + ((nth 3 state) + t) + ((nth 7 state) ;Inside // comment + (end-of-line) + (forward-char 1) + t) + ((nth 4 state) ;Inside any comment + t) + (t + nil))))) + +(defun verilog-indent-line-relative () + "Cheap version of indent line. +Only look at a few lines to determine indent level." + (interactive) + (let ((indent-str) + (sp (point))) + (if (looking-at "^[ \t]*$") + (cond ;- A blank line; No need to be too smart. + ((bobp) + (setq indent-str (list 'cpp 0))) + ((verilog-continued-line) + (let ((sp1 (point))) + (if (verilog-continued-line) + (progn (goto-char sp) + (setq indent-str (list 'statement (verilog-current-indent-level)))) + (goto-char sp1) + (setq indent-str (list 'block (verilog-current-indent-level))))) + (goto-char sp)) + ((goto-char sp) + (setq indent-str (verilog-calculate-indent)))) + (progn (skip-chars-forward " \t") + (setq indent-str (verilog-calculate-indent)))) + (verilog-do-indent indent-str))) + +(defun verilog-indent-line () + "Indent for special part of code." + (verilog-do-indent (verilog-calculate-indent))) + +(defun verilog-do-indent (indent-str) + (let ((type (car indent-str)) + (ind (car (cdr indent-str)))) + (cond + (; handle continued exp + (eq type 'cexp) + (let ((here (point))) + (verilog-backward-syntactic-ws) + (cond + ((or + (= (preceding-char) ?\,) + (= (preceding-char) ?\]) + (save-excursion + (verilog-beg-of-statement-1) + (looking-at verilog-declaration-re))) + (let* ( fst + (val + (save-excursion + (backward-char 1) + (verilog-beg-of-statement-1) + (setq fst (point)) + (if (looking-at verilog-declaration-re) + (progn ;; we have multiple words + (goto-char (match-end 0)) + (skip-chars-forward " \t") + (cond + ((and verilog-indent-declaration-macros + (= (following-char) ?\`)) + (progn + (forward-char 1) + (forward-word 1) + (skip-chars-forward " \t"))) + ((= (following-char) ?\[) + (progn + (forward-char 1) + (backward-up-list -1) + (skip-chars-forward " \t"))) + ) + (current-column)) + (progn + (goto-char fst) + (+ (current-column) verilog-cexp-indent)) + )))) + (goto-char here) + (indent-line-to val)) + ) + ((= (preceding-char) ?\) ) + (goto-char here) + (let ((val (eval (cdr (assoc type verilog-indent-alist))))) + (indent-line-to val))) + (t + (goto-char here) + (let ((val)) + (verilog-beg-of-statement-1) + (if (and (< (point) here) + (verilog-re-search-forward "=[ \\t]*" here 'move)) + (setq val (current-column)) + (setq val (eval (cdr (assoc type verilog-indent-alist))))) + (goto-char here) + (indent-line-to val))) + ))) + + (; handle inside parenthetical expressions + (eq type 'cparenexp) + (let ((val (save-excursion + (backward-up-list 1) + (forward-char 1) + (skip-chars-forward " \t") + (current-column)))) + (indent-line-to val) + (if (and (not (verilog-in-struct-region-p)) + (looking-at verilog-declaration-re)) + (verilog-indent-declaration ind)) + )) + + (;-- Handle the ends + (or + (looking-at verilog-end-block-re ) + (verilog-at-close-constraint-p)) + (let ((val (if (eq type 'statement) + (- ind verilog-indent-level) + ind))) + (indent-line-to val))) + + (;-- Case -- maybe line 'em up + (and (eq type 'case) (not (looking-at "^[ \t]*$"))) + (progn + (cond + ((looking-at "\\") + (indent-line-to ind)) + (t + (let ((val (eval (cdr (assoc type verilog-indent-alist))))) + (indent-line-to val)))))) + + (;-- defun + (and (eq type 'defun) + (looking-at verilog-zero-indent-re)) + (indent-line-to 0)) + + (;-- declaration + (and (or + (eq type 'defun) + (eq type 'block)) + (looking-at verilog-declaration-re)) + (verilog-indent-declaration ind)) + + (;-- Everything else + t + (let ((val (eval (cdr (assoc type verilog-indent-alist))))) + (indent-line-to val))) + ) + (if (looking-at "[ \t]+$") + (skip-chars-forward " \t")) + indent-str ; Return indent data + )) + +(defun verilog-current-indent-level () + "Return the indent-level the current statement has." + (save-excursion + (let (par-pos) + (beginning-of-line) + (setq par-pos (verilog-parenthesis-depth)) + (while par-pos + (goto-char par-pos) + (beginning-of-line) + (setq par-pos (verilog-parenthesis-depth))) + (skip-chars-forward " \t") + (current-column)))) + +(defun verilog-case-indent-level () + "Return the indent-level the current statement has. +Do not count named blocks or case-statements." + (save-excursion + (skip-chars-forward " \t") + (cond + ((looking-at verilog-named-block-re) + (current-column)) + ((and (not (looking-at verilog-case-re)) + (looking-at "^[^:;]+[ \t]*:")) + (verilog-re-search-forward ":" nil t) + (skip-chars-forward " \t") + (current-column)) + (t + (current-column))))) + +(defun verilog-indent-comment () + "Indent current line as comment." + (let* ((stcol + (cond + ((verilog-in-star-comment-p) + (save-excursion + (re-search-backward "/\\*" nil t) + (1+(current-column)))) + (comment-column + comment-column ) + (t + (save-excursion + (re-search-backward "//" nil t) + (current-column))) + ))) + (indent-line-to stcol) + stcol)) + +(defun verilog-more-comment () + "Make more comment lines like the previous." + (let* ((star 0) + (stcol + (cond + ((verilog-in-star-comment-p) + (save-excursion + (setq star 1) + (re-search-backward "/\\*" nil t) + (1+(current-column)))) + (comment-column + comment-column ) + (t + (save-excursion + (re-search-backward "//" nil t) + (current-column))) + ))) + (progn + (indent-to stcol) + (if (and star + (save-excursion + (forward-line -1) + (skip-chars-forward " \t") + (looking-at "\*"))) + (insert "* "))))) + +(defun verilog-comment-indent (&optional arg) + "Return the column number the line should be indented to. +ARG is ignored, for `comment-indent-function' compatibility." + (cond + ((verilog-in-star-comment-p) + (save-excursion + (re-search-backward "/\\*" nil t) + (1+(current-column)))) + ( comment-column + comment-column ) + (t + (save-excursion + (re-search-backward "//" nil t) + (current-column))))) + +;; + +(defun verilog-pretty-declarations () + "Line up declarations around point." + (interactive) + (save-excursion + (if (progn + (verilog-beg-of-statement-1) + (looking-at verilog-declaration-re)) + (let* ((m1 (make-marker)) + (e) (r) + (here (point)) + ;; Start of declaration range + (start + (progn + (verilog-beg-of-statement-1) + (while (looking-at verilog-declaration-re) + (beginning-of-line) + (setq e (point)) + (verilog-backward-syntactic-ws) + (backward-char) + (verilog-beg-of-statement-1)) ;Ack, need to grok `define + e)) + ;; End of declaration range + (end + (progn + (goto-char here) + (verilog-end-of-statement) + (setq e (point)) ;Might be on last line + (verilog-forward-syntactic-ws) + (while (looking-at verilog-declaration-re) + (beginning-of-line) + (verilog-end-of-statement) + (setq e (point)) + (verilog-forward-syntactic-ws)) + e)) + (edpos (set-marker (make-marker) end)) + (ind) + (base-ind + (progn + (goto-char start) + (verilog-do-indent (verilog-calculate-indent)) + (verilog-forward-ws&directives) + (current-column))) + ) + (goto-char end) + (goto-char start) + (if (> (- end start) 100) + (message "Lining up declarations..(please stand by)")) + ;; Get the beginning of line indent first + (while (progn (setq e (marker-position edpos)) + (< (point) e)) + (cond + ( (save-excursion (skip-chars-backward " \t") + (bolp)) + (verilog-forward-ws&directives) + (indent-line-to base-ind) + (verilog-forward-ws&directives) + (verilog-re-search-forward "[ \t\n\f]" e 'move) + ) + (t + (just-one-space) + (verilog-re-search-forward "[ \t\n\f]" e 'move) + ) + ) + ) + ;;(forward-line)) + ;; Now find biggest prefix + (setq ind (verilog-get-lineup-indent start edpos)) + ;; Now indent each line. + (goto-char start) + (while (progn (setq e (marker-position edpos)) + (setq r (- e (point))) + (> r 0)) + (setq e (point)) + (message "%d" r) + (cond + ((or (and verilog-indent-declaration-macros + (looking-at verilog-declaration-re-1-macro)) + (looking-at verilog-declaration-re-1-no-macro)) + (let ((p (match-end 0))) + (set-marker m1 p) + (if (verilog-re-search-forward "[[#`]" p 'move) + (progn + (forward-char -1) + (just-one-space) + (goto-char (marker-position m1)) + (just-one-space) + (indent-to ind)) + (progn + (just-one-space) + (indent-to ind)) + ))) + ((verilog-continued-line-1 start) + (goto-char e) + (indent-line-to ind)) + (t ; Must be comment or white space + (goto-char e) + (verilog-forward-ws&directives) + (forward-line -1)) + ) + (forward-line 1)) + (message ""))))) + +(defun verilog-pretty-expr (&optional myre) + "Line up expressions around point." + (interactive "sRegular Expression: ((<|:)?=) ") + (save-excursion + (if (or (eq myre nil) + (string-equal myre "")) + (setq myre "\\(<\\|:\\)?=")) +; (setq myre (concat "\\(^[^;" myre "]*\\)\\([" myre "]\\)")) + (setq myre (concat "\\(^[^;#:?=]*\\)\\([" myre "]\\)")) + (beginning-of-line) + (if (and (not (looking-at (concat "^\\s-*" verilog-complete-reg))) + (looking-at myre)) + (let* ((here (point)) + (e) (r) + (start + (progn + (beginning-of-line) + (setq e (point)) + (verilog-backward-syntactic-ws) + (beginning-of-line) + (while (and (not (looking-at (concat "^\\s-*" verilog-complete-reg))) + (looking-at myre) + (not (bobp)) + ) + (setq e (point)) + (verilog-backward-syntactic-ws) + (beginning-of-line) + ) ;Ack, need to grok `define + e)) + (end + (progn + (goto-char here) + (end-of-line) + (setq e (point)) ;Might be on last line + (verilog-forward-syntactic-ws) + (beginning-of-line) + (while (and (not(looking-at (concat "^\\s-*" verilog-complete-reg))) + (looking-at myre)) + (end-of-line) + (setq e (point)) + (verilog-forward-syntactic-ws) + (beginning-of-line) + ) + e)) + (edpos (set-marker (make-marker) end)) + (ind) + ) + (goto-char start) + (verilog-do-indent (verilog-calculate-indent)) + (if (> (- end start) 100) + (message "Lining up expressions..(please stand by)")) + + ;; Set indent to minimum throughout region + (while (< (point) (marker-position edpos)) + (beginning-of-line) + (verilog-just-one-space myre) + (end-of-line) + (verilog-forward-syntactic-ws) + ) + + ;; Now find biggest prefix + (setq ind (verilog-get-lineup-indent-2 myre start edpos)) + + ;; Now indent each line. + (goto-char start) + (while (progn (setq e (marker-position edpos)) + (setq r (- e (point))) + (> r 0)) + (setq e (point)) + (message "%d" r) + (cond + ((looking-at myre) + (goto-char (match-end 1)) + (if (eq (char-after) ?=) + (indent-to (1+ ind)) ; line up the = of the <= with surrounding = + (indent-to ind) + ) + ) + ((verilog-continued-line-1 start) + (goto-char e) + (indent-line-to ind)) + (t ; Must be comment or white space + (goto-char e) + (verilog-forward-ws&directives) + (forward-line -1)) + ) + (forward-line 1)) + (message "") + )))) + +(defun verilog-just-one-space (myre) + "Remove extra spaces around regular expression MYRE." + (interactive) + (if (and (not(looking-at verilog-complete-reg)) + (looking-at myre)) + (let ((p1 (match-end 1)) + (p2 (match-end 2))) + (progn + (goto-char p2) + (if (looking-at "\\s-") (just-one-space) ) + (goto-char p1) + (forward-char -1) + (if (looking-at "\\s-") (just-one-space)) + ) + )) + (message "")) + +(defun verilog-indent-declaration (baseind) + "Indent current lines as declaration. +Line up the variable names based on previous declaration's indentation. +BASEIND is the base indent to offset everything." + (interactive) + (let ((pos (point-marker)) + (lim (save-excursion + ;; (verilog-re-search-backward verilog-declaration-opener nil 'move) + (verilog-re-search-backward "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)" nil 'move) + (point))) + (ind) + (val) + (m1 (make-marker)) + ) + (setq val (+ baseind (eval (cdr (assoc 'declaration verilog-indent-alist))))) + (indent-line-to val) + + ;; Use previous declaration (in this module) as template. + (if (or (memq 'all verilog-auto-lineup) + (memq 'declaration verilog-auto-lineup)) + (if (verilog-re-search-backward + (or (and verilog-indent-declaration-macros + verilog-declaration-re-1-macro) + verilog-declaration-re-1-no-macro) lim t) + (progn + (goto-char (match-end 0)) + (skip-chars-forward " \t") + (setq ind (current-column)) + (goto-char pos) + (setq val (+ baseind (eval (cdr (assoc 'declaration verilog-indent-alist))))) + (indent-line-to val) + (if (and verilog-indent-declaration-macros + (looking-at verilog-declaration-re-2-macro)) + (let ((p (match-end 0))) + (set-marker m1 p) + (if (verilog-re-search-forward "[[#`]" p 'move) + (progn + (forward-char -1) + (just-one-space) + (goto-char (marker-position m1)) + (just-one-space) + (indent-to ind) + ) + (if (/= (current-column) ind) + (progn + (just-one-space) + (indent-to ind)) + ))) + (if (looking-at verilog-declaration-re-2-no-macro) + (let ((p (match-end 0))) + (set-marker m1 p) + (if (verilog-re-search-forward "[[`#]" p 'move) + (progn + (forward-char -1) + (just-one-space) + (goto-char (marker-position m1)) + (just-one-space) + (indent-to ind)) + (if (/= (current-column) ind) + (progn + (just-one-space) + (indent-to ind)) + ))) + ))) + ) + ) + (goto-char pos) + ) + ) + +(defun verilog-get-lineup-indent (b edpos) + "Return the indent level that will line up several lines within the region. +Region is defined by B and EDPOS." + (save-excursion + (let ((ind 0) e) + (goto-char b) + ;; Get rightmost position + (while (progn (setq e (marker-position edpos)) + (< (point) e)) + (if (verilog-re-search-forward + (or (and verilog-indent-declaration-macros + verilog-declaration-re-1-macro) + verilog-declaration-re-1-no-macro) e 'move) + (progn + (goto-char (match-end 0)) + (verilog-backward-syntactic-ws) + (if (> (current-column) ind) + (setq ind (current-column))) + (goto-char (match-end 0))))) + (if (> ind 0) + (1+ ind) + ;; No lineup-string found + (goto-char b) + (end-of-line) + (skip-chars-backward " \t") + (1+ (current-column)))))) + +(defun verilog-get-lineup-indent-2 (myre b edpos) + "Return the indent level that will line up several lines within the region." + (save-excursion + (let ((ind 0) e) + (goto-char b) + ;; Get rightmost position + (while (progn (setq e (marker-position edpos)) + (< (point) e)) + (if (verilog-re-search-forward myre e 'move) + (progn + (goto-char (match-end 0)) + (verilog-backward-syntactic-ws) + (if (> (current-column) ind) + (setq ind (current-column))) + (goto-char (match-end 0))))) + (if (> ind 0) + (1+ ind) + ;; No lineup-string found + (goto-char b) + (end-of-line) + (skip-chars-backward " \t") + (1+ (current-column)))))) + +(defun verilog-comment-depth (type val) + "A useful mode debugging aide. TYPE and VAL are comments for insertion." + (save-excursion + (let + ((b (prog2 + (beginning-of-line) + (point-marker) + (end-of-line))) + (e (point-marker))) + (if (re-search-backward " /\\* \[#-\]# \[a-zA-Z\]+ \[0-9\]+ ## \\*/" b t) + (progn + (replace-match " /* -# ## */") + (end-of-line)) + (progn + (end-of-line) + (insert " /* ## ## */")))) + (backward-char 6) + (insert + (format "%s %d" type val)))) + +;; +;; +;; Completion +;; +(defvar verilog-str nil) +(defvar verilog-all nil) +(defvar verilog-pred nil) +(defvar verilog-buffer-to-use nil) +(defvar verilog-flag nil) +(defvar verilog-toggle-completions nil + "*True means \\\\[verilog-complete-word] should try all possible completions one by one. +Repeated use of \\[verilog-complete-word] will show you all of them. +Normally, when there is more than one possible completion, +it displays a list of all possible completions.") + + +(defvar verilog-type-keywords + '( + "and" "buf" "bufif0" "bufif1" "cmos" "defparam" "inout" "input" + "integer" "localparam" "logic" "mailbox" "nand" "nmos" "nor" "not" "notif0" + "notif1" "or" "output" "parameter" "pmos" "pull0" "pull1" "pullup" + "rcmos" "real" "realtime" "reg" "rnmos" "rpmos" "rtran" "rtranif0" + "rtranif1" "semaphore" "time" "tran" "tranif0" "tranif1" "tri" "tri0" "tri1" + "triand" "trior" "trireg" "wand" "wire" "wor" "xnor" "xor" + ) + "*Keywords for types used when completing a word in a declaration or parmlist. +\(eg. integer, real, reg...)") + +(defvar verilog-cpp-keywords + '("module" "macromodule" "primitive" "timescale" "define" "ifdef" "ifndef" "else" + "endif") + "*Keywords to complete when at first word of a line in declarative scope. +\(eg. initial, always, begin, assign.) +The procedures and variables defined within the Verilog program +will be completed runtime and should not be added to this list.") + +(defvar verilog-defun-keywords + (append + '( + "always" "always_comb" "always_ff" "always_latch" "assign" + "begin" "end" "generate" "endgenerate" "module" "endmodule" + "specify" "endspecify" "function" "endfunction" "initial" "final" + "task" "endtask" "primitive" "endprimitive" + ) + verilog-type-keywords) + "*Keywords to complete when at first word of a line in declarative scope. +\(eg. initial, always, begin, assign.) +The procedures and variables defined within the Verilog program +will be completed runtime and should not be added to this list.") + +(defvar verilog-block-keywords + '( + "begin" "break" "case" "continue" "else" "end" "endfunction" + "endgenerate" "endinterface" "endpackage" "endspecify" "endtask" + "for" "fork" "if" "join" "join_any" "join_none" "repeat" "return" + "while") + "*Keywords to complete when at first word of a line in behavioral scope. +\(eg. begin, if, then, else, for, fork.) +The procedures and variables defined within the Verilog program +will be completed runtime and should not be added to this list.") + +(defvar verilog-tf-keywords + '("begin" "break" "fork" "join" "join_any" "join_none" "case" "end" "endtask" "endfunction" "if" "else" "for" "while" "repeat") + "*Keywords to complete when at first word of a line in a task or function. +\(eg. begin, if, then, else, for, fork.) +The procedures and variables defined within the Verilog program +will be completed runtime and should not be added to this list.") + +(defvar verilog-case-keywords + '("begin" "fork" "join" "join_any" "join_none" "case" "end" "endcase" "if" "else" "for" "repeat") + "*Keywords to complete when at first word of a line in case scope. +\(eg. begin, if, then, else, for, fork.) +The procedures and variables defined within the Verilog program +will be completed runtime and should not be added to this list.") + +(defvar verilog-separator-keywords + '("else" "then" "begin") + "*Keywords to complete when NOT standing at the first word of a statement. +\(eg. else, then.) +Variables and function names defined within the +Verilog program are completed runtime and should not be added to this list.") + +(defun verilog-string-diff (str1 str2) + "Return index of first letter where STR1 and STR2 differs." + (catch 'done + (let ((diff 0)) + (while t + (if (or (> (1+ diff) (length str1)) + (> (1+ diff) (length str2))) + (throw 'done diff)) + (or (equal (aref str1 diff) (aref str2 diff)) + (throw 'done diff)) + (setq diff (1+ diff)))))) + +;; Calculate all possible completions for functions if argument is `function', +;; completions for procedures if argument is `procedure' or both functions and +;; procedures otherwise. + +(defun verilog-func-completion (type) + "Build regular expression for module/task/function names. +TYPE is 'module, 'tf for task or function, or t if unknown." + (if (string= verilog-str "") + (setq verilog-str "[a-zA-Z_]")) + (let ((verilog-str (concat (cond + ((eq type 'module) "\\<\\(module\\)\\s +") + ((eq type 'tf) "\\<\\(task\\|function\\)\\s +") + (t "\\<\\(task\\|function\\|module\\)\\s +")) + "\\<\\(" verilog-str "[a-zA-Z0-9_.]*\\)\\>")) + match) + + (if (not (looking-at verilog-defun-re)) + (verilog-re-search-backward verilog-defun-re nil t)) + (forward-char 1) + + ;; Search through all reachable functions + (goto-char (point-min)) + (while (verilog-re-search-forward verilog-str (point-max) t) + (progn (setq match (buffer-substring (match-beginning 2) + (match-end 2))) + (if (or (null verilog-pred) + (funcall verilog-pred match)) + (setq verilog-all (cons match verilog-all))))) + (if (match-beginning 0) + (goto-char (match-beginning 0))))) + +(defun verilog-get-completion-decl (end) + "Macro for searching through current declaration (var, type or const) +for matches of `str' and adding the occurrence tp `all' through point END." + (let ((re (or (and verilog-indent-declaration-macros + verilog-declaration-re-2-macro) + verilog-declaration-re-2-no-macro)) + decl-end match) + ;; Traverse lines + (while (and (< (point) end) + (verilog-re-search-forward re end t)) + ;; Traverse current line + (setq decl-end (save-excursion (verilog-declaration-end))) + (while (and (verilog-re-search-forward verilog-symbol-re decl-end t) + (not (match-end 1))) + (setq match (buffer-substring (match-beginning 0) (match-end 0))) + (if (string-match (concat "\\<" verilog-str) match) + (if (or (null verilog-pred) + (funcall verilog-pred match)) + (setq verilog-all (cons match verilog-all))))) + (forward-line 1) + ) + ) + verilog-all + ) + +(defun verilog-type-completion () + "Calculate all possible completions for types." + (let ((start (point)) + goon) + ;; Search for all reachable type declarations + (while (or (verilog-beg-of-defun) + (setq goon (not goon))) + (save-excursion + (if (and (< start (prog1 (save-excursion (verilog-end-of-defun) + (point)) + (forward-char 1))) + (verilog-re-search-forward + "\\\\|\\<\\(begin\\|function\\|procedure\\)\\>" + start t) + (not (match-end 1))) + ;; Check current type declaration + (verilog-get-completion-decl start)))))) + +(defun verilog-var-completion () + "Calculate all possible completions for variables (or constants)." + (let ((start (point))) + ;; Search for all reachable var declarations + (verilog-beg-of-defun) + (save-excursion + ;; Check var declarations + (verilog-get-completion-decl start)))) + +(defun verilog-keyword-completion (keyword-list) + "Give list of all possible completions of keywords in KEYWORD-LIST." + (mapcar '(lambda (s) + (if (string-match (concat "\\<" verilog-str) s) + (if (or (null verilog-pred) + (funcall verilog-pred s)) + (setq verilog-all (cons s verilog-all))))) + keyword-list)) + + +(defun verilog-completion (verilog-str verilog-pred verilog-flag) + "Function passed to `completing-read', `try-completion' or `all-completions'. +Called to get completion on VERILOG-STR. If VERILOG-PRED is non-nil, it +must be a function to be called for every match to check if this should +really be a match. If VERILOG-FLAG is t, the function returns a list of all +possible completions. If VERILOG-FLAG is nil it returns a string, the +longest possible completion, or t if STR is an exact match. If VERILOG-FLAG +is 'lambda, the function returns t if STR is an exact match, nil +otherwise." + (save-excursion + (let ((verilog-all nil)) + ;; Set buffer to use for searching labels. This should be set + ;; within functions which use verilog-completions + (set-buffer verilog-buffer-to-use) + + ;; Determine what should be completed + (let ((state (car (verilog-calculate-indent)))) + (cond ((eq state 'defun) + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'module) + (verilog-keyword-completion verilog-defun-keywords)) + + ((eq state 'behavioral) + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'module) + (verilog-keyword-completion verilog-defun-keywords)) + + ((eq state 'block) + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'tf) + (verilog-keyword-completion verilog-block-keywords)) + + ((eq state 'case) + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'tf) + (verilog-keyword-completion verilog-case-keywords)) + + ((eq state 'tf) + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'tf) + (verilog-keyword-completion verilog-tf-keywords)) + + ((eq state 'cpp) + (save-excursion (verilog-var-completion)) + (verilog-keyword-completion verilog-cpp-keywords)) + + ((eq state 'cparenexp) + (save-excursion (verilog-var-completion))) + + (t;--Anywhere else + (save-excursion (verilog-var-completion)) + (verilog-func-completion 'both) + (verilog-keyword-completion verilog-separator-keywords)))) + + ;; Now we have built a list of all matches. Give response to caller + (verilog-completion-response)))) + +(defun verilog-completion-response () + (cond ((or (equal verilog-flag 'lambda) (null verilog-flag)) + ;; This was not called by all-completions + (if (null verilog-all) + ;; Return nil if there was no matching label + nil + ;; Get longest string common in the labels + (let* ((elm (cdr verilog-all)) + (match (car verilog-all)) + (min (length match)) + tmp) + (if (string= match verilog-str) + ;; Return t if first match was an exact match + (setq match t) + (while (not (null elm)) + ;; Find longest common string + (if (< (setq tmp (verilog-string-diff match (car elm))) min) + (progn + (setq min tmp) + (setq match (substring match 0 min)))) + ;; Terminate with match=t if this is an exact match + (if (string= (car elm) verilog-str) + (progn + (setq match t) + (setq elm nil)) + (setq elm (cdr elm))))) + ;; If this is a test just for exact match, return nil ot t + (if (and (equal verilog-flag 'lambda) (not (equal match 't))) + nil + match)))) + ;; If flag is t, this was called by all-completions. Return + ;; list of all possible completions + (verilog-flag + verilog-all))) + +(defvar verilog-last-word-numb 0) +(defvar verilog-last-word-shown nil) +(defvar verilog-last-completions nil) + +(defun verilog-complete-word () + "Complete word at current point. +\(See also `verilog-toggle-completions', `verilog-type-keywords', +and `verilog-separator-keywords'.)" + (interactive) + (let* ((b (save-excursion (skip-chars-backward "a-zA-Z0-9_") (point))) + (e (save-excursion (skip-chars-forward "a-zA-Z0-9_") (point))) + (verilog-str (buffer-substring b e)) + ;; The following variable is used in verilog-completion + (verilog-buffer-to-use (current-buffer)) + (allcomp (if (and verilog-toggle-completions + (string= verilog-last-word-shown verilog-str)) + verilog-last-completions + (all-completions verilog-str 'verilog-completion))) + (match (if verilog-toggle-completions + "" (try-completion + verilog-str (mapcar '(lambda (elm) + (cons elm 0)) allcomp))))) + ;; Delete old string + (delete-region b e) + + ;; Toggle-completions inserts whole labels + (if verilog-toggle-completions + (progn + ;; Update entry number in list + (setq verilog-last-completions allcomp + verilog-last-word-numb + (if (>= verilog-last-word-numb (1- (length allcomp))) + 0 + (1+ verilog-last-word-numb))) + (setq verilog-last-word-shown (elt allcomp verilog-last-word-numb)) + ;; Display next match or same string if no match was found + (if (not (null allcomp)) + (insert "" verilog-last-word-shown) + (insert "" verilog-str) + (message "(No match)"))) + ;; The other form of completion does not necessarily do that. + + ;; Insert match if found, or the original string if no match + (if (or (null match) (equal match 't)) + (progn (insert "" verilog-str) + (message "(No match)")) + (insert "" match)) + ;; Give message about current status of completion + (cond ((equal match 't) + (if (not (null (cdr allcomp))) + (message "(Complete but not unique)") + (message "(Sole completion)"))) + ;; Display buffer if the current completion didn't help + ;; on completing the label. + ((and (not (null (cdr allcomp))) (= (length verilog-str) + (length match))) + (with-output-to-temp-buffer "*Completions*" + (display-completion-list allcomp)) + ;; Wait for a key press. Then delete *Completion* window + (momentary-string-display "" (point)) + (delete-window (get-buffer-window (get-buffer "*Completions*"))) + ))))) + +(defun verilog-show-completions () + "Show all possible completions at current point." + (interactive) + (let* ((b (save-excursion (skip-chars-backward "a-zA-Z0-9_") (point))) + (e (save-excursion (skip-chars-forward "a-zA-Z0-9_") (point))) + (verilog-str (buffer-substring b e)) + ;; The following variable is used in verilog-completion + (verilog-buffer-to-use (current-buffer)) + (allcomp (if (and verilog-toggle-completions + (string= verilog-last-word-shown verilog-str)) + verilog-last-completions + (all-completions verilog-str 'verilog-completion)))) + ;; Show possible completions in a temporary buffer. + (with-output-to-temp-buffer "*Completions*" + (display-completion-list allcomp)) + ;; Wait for a key press. Then delete *Completion* window + (momentary-string-display "" (point)) + (delete-window (get-buffer-window (get-buffer "*Completions*"))))) + + +(defun verilog-get-default-symbol () + "Return symbol around current point as a string." + (save-excursion + (buffer-substring (progn + (skip-chars-backward " \t") + (skip-chars-backward "a-zA-Z0-9_") + (point)) + (progn + (skip-chars-forward "a-zA-Z0-9_") + (point))))) + +(defun verilog-build-defun-re (str &optional arg) + "Return function/task/module starting with STR as regular expression. +With optional second ARG non-nil, STR is the complete name of the instruction." + (if arg + (concat "^\\(function\\|task\\|module\\)[ \t]+\\(" str "\\)\\>") + (concat "^\\(function\\|task\\|module\\)[ \t]+\\(" str "[a-zA-Z0-9_]*\\)\\>"))) + +(defun verilog-comp-defun (verilog-str verilog-pred verilog-flag) + "Function passed to `completing-read', `try-completion' or `all-completions'. +Returns a completion on any function name based on VERILOG-STR prefix. If +VERILOG-PRED is non-nil, it must be a function to be called for every match +to check if this should really be a match. If VERILOG-FLAG is t, the +function returns a list of all possible completions. If it is nil it +returns a string, the longest possible completion, or t if VERILOG-STR is +an exact match. If VERILOG-FLAG is 'lambda, the function returns t if +VERILOG-STR is an exact match, nil otherwise." + (save-excursion + (let ((verilog-all nil) + match) + + ;; Set buffer to use for searching labels. This should be set + ;; within functions which use verilog-completions + (set-buffer verilog-buffer-to-use) + + (let ((verilog-str verilog-str)) + ;; Build regular expression for functions + (if (string= verilog-str "") + (setq verilog-str (verilog-build-defun-re "[a-zA-Z_]")) + (setq verilog-str (verilog-build-defun-re verilog-str))) + (goto-char (point-min)) + + ;; Build a list of all possible completions + (while (verilog-re-search-forward verilog-str nil t) + (setq match (buffer-substring (match-beginning 2) (match-end 2))) + (if (or (null verilog-pred) + (funcall verilog-pred match)) + (setq verilog-all (cons match verilog-all))))) + + ;; Now we have built a list of all matches. Give response to caller + (verilog-completion-response)))) + +(defun verilog-goto-defun () + "Move to specified Verilog module/task/function. +The default is a name found in the buffer around point. +If search fails, other files are checked based on +`verilog-library-flags'." + (interactive) + (let* ((default (verilog-get-default-symbol)) + ;; The following variable is used in verilog-comp-function + (verilog-buffer-to-use (current-buffer)) + (label (if (not (string= default "")) + ;; Do completion with default + (completing-read (concat "Label: (default " default ") ") + 'verilog-comp-defun nil nil "") + ;; There is no default value. Complete without it + (completing-read "Label: " + 'verilog-comp-defun nil nil ""))) + pt) + ;; If there was no response on prompt, use default value + (if (string= label "") + (setq label default)) + ;; Goto right place in buffer if label is not an empty string + (or (string= label "") + (progn + (save-excursion + (goto-char (point-min)) + (setq pt (re-search-forward (verilog-build-defun-re label t) nil t))) + (when pt + (goto-char pt) + (beginning-of-line)) + pt) + (verilog-goto-defun-file label) + ))) + +;; Eliminate compile warning +(eval-when-compile + (if (not (boundp 'occur-pos-list)) + (defvar occur-pos-list nil "Backward compatibility occur positions."))) + +(defun verilog-showscopes () + "List all scopes in this module." + (interactive) + (let ((buffer (current-buffer)) + (linenum 1) + (nlines 0) + (first 1) + (prevpos (point-min)) + (final-context-start (make-marker)) + (regexp "\\(module\\s-+\\w+\\s-*(\\)\\|\\(\\w+\\s-+\\w+\\s-*(\\)") + ) + (with-output-to-temp-buffer "*Occur*" + (save-excursion + (message (format "Searching for %s ..." regexp)) + ;; Find next match, but give up if prev match was at end of buffer. + (while (and (not (= prevpos (point-max))) + (verilog-re-search-forward regexp nil t)) + (goto-char (match-beginning 0)) + (beginning-of-line) + (save-match-data + (setq linenum (+ linenum (count-lines prevpos (point))))) + (setq prevpos (point)) + (goto-char (match-end 0)) + (let* ((start (save-excursion + (goto-char (match-beginning 0)) + (forward-line (if (< nlines 0) nlines (- nlines))) + (point))) + (end (save-excursion + (goto-char (match-end 0)) + (if (> nlines 0) + (forward-line (1+ nlines)) + (forward-line 1)) + (point))) + (tag (format "%3d" linenum)) + (empty (make-string (length tag) ?\ )) + tem) + (save-excursion + (setq tem (make-marker)) + (set-marker tem (point)) + (set-buffer standard-output) + (setq occur-pos-list (cons tem occur-pos-list)) + (or first (zerop nlines) + (insert "--------\n")) + (setq first nil) + (insert-buffer-substring buffer start end) + (backward-char (- end start)) + (setq tem (if (< nlines 0) (- nlines) nlines)) + (while (> tem 0) + (insert empty ?:) + (forward-line 1) + (setq tem (1- tem))) + (let ((this-linenum linenum)) + (set-marker final-context-start + (+ (point) (- (match-end 0) (match-beginning 0)))) + (while (< (point) final-context-start) + (if (null tag) + (setq tag (format "%3d" this-linenum))) + (insert tag ?:))))))) + (set-buffer-modified-p nil)))) + + +;; Highlight helper functions +(defconst verilog-directive-regexp "\\(translate\\|coverage\\|lint\\)_") +(defun verilog-within-translate-off () + "Return point if within translate-off region, else nil." + (and (save-excursion + (re-search-backward + (concat "//\\s-*.*\\s-*" verilog-directive-regexp "\\(on\\|off\\)\\>") + nil t)) + (equal "off" (match-string 2)) + (point))) + +(defun verilog-start-translate-off (limit) + "Return point before translate-off directive if before LIMIT, else nil." + (when (re-search-forward + (concat "//\\s-*.*\\s-*" verilog-directive-regexp "off\\>") + limit t) + (match-beginning 0))) + +(defun verilog-back-to-start-translate-off (limit) + "Return point before translate-off directive if before LIMIT, else nil." + (when (re-search-backward + (concat "//\\s-*.*\\s-*" verilog-directive-regexp "off\\>") + limit t) + (match-beginning 0))) + +(defun verilog-end-translate-off (limit) + "Return point after translate-on directive if before LIMIT, else nil." + + (re-search-forward (concat + "//\\s-*.*\\s-*" verilog-directive-regexp "on\\>") limit t)) + +(defun verilog-match-translate-off (limit) + "Match a translate-off block, setting `match-data' and returning t, else nil. +Bound search by LIMIT." + (when (< (point) limit) + (let ((start (or (verilog-within-translate-off) + (verilog-start-translate-off limit))) + (case-fold-search t)) + (when start + (let ((end (or (verilog-end-translate-off limit) limit))) + (set-match-data (list start end)) + (goto-char end)))))) + +(defun verilog-font-lock-match-item (limit) + "Match, and move over, any declaration item after point. +Bound search by LIMIT. Adapted from +`font-lock-match-c-style-declaration-item-and-skip-to-next'." + (condition-case nil + (save-restriction + (narrow-to-region (point-min) limit) + ;; match item + (when (looking-at "\\s-*\\([a-zA-Z]\\w*\\)") + (save-match-data + (goto-char (match-end 1)) + ;; move to next item + (if (looking-at "\\(\\s-*,\\)") + (goto-char (match-end 1)) + (end-of-line) t)))) + (error nil))) + + +;; Added by Subbu Meiyappan for Header + +(defun verilog-header () + "Insert a standard Verilog file header." + (interactive) + (let ((start (point))) + (insert "\ +//----------------------------------------------------------------------------- +// Title : +// Project : <project> +//----------------------------------------------------------------------------- +// File : <filename> +// Author : <author> +// Created : <credate> +// Last modified : <moddate> +//----------------------------------------------------------------------------- +// Description : +// <description> +//----------------------------------------------------------------------------- +// Copyright (c) <copydate> by <company> This model is the confidential and +// proprietary property of <company> and the possession or use of this +// file requires a written license from <company>. +//------------------------------------------------------------------------------ +// Modification history : +// <modhist> +//----------------------------------------------------------------------------- + +") + (goto-char start) + (search-forward "<filename>") + (replace-match (buffer-name) t t) + (search-forward "<author>") (replace-match "" t t) + (insert (user-full-name)) + (insert " <" (user-login-name) "@" (system-name) ">") + (search-forward "<credate>") (replace-match "" t t) + (insert-date) + (search-forward "<moddate>") (replace-match "" t t) + (insert-date) + (search-forward "<copydate>") (replace-match "" t t) + (insert-year) + (search-forward "<modhist>") (replace-match "" t t) + (insert-date) + (insert " : created") + (goto-char start) + (let (string) + (setq string (read-string "title: ")) + (search-forward "<title>") + (replace-match string t t) + (setq string (read-string "project: " verilog-project)) + (make-variable-buffer-local 'verilog-project) + (setq verilog-project string) + (search-forward "<project>") + (replace-match string t t) + (setq string (read-string "Company: " verilog-company)) + (make-variable-buffer-local 'verilog-company) + (setq verilog-company string) + (search-forward "<company>") + (replace-match string t t) + (search-forward "<company>") + (replace-match string t t) + (search-forward "<company>") + (replace-match string t t) + (search-backward "<description>") + (replace-match "" t t) + ))) + +;; verilog-header Uses the insert-date function + +(defun insert-date () + "Insert date from the system." + (interactive) + (let ((timpos)) + (setq timpos (point)) + (if verilog-date-scientific-format + (shell-command "date \"+@%Y/%m/%d\"" t) + (shell-command "date \"+@%d.%m.%Y\"" t)) + (search-forward "@") + (delete-region timpos (point)) + (end-of-line)) + (delete-char 1)) + +(defun insert-year () + "Insert year from the system." + (interactive) + (let ((timpos)) + (setq timpos (point)) + (shell-command "date \"+@%Y\"" t) + (search-forward "@") + (delete-region timpos (point)) + (end-of-line)) + (delete-char 1)) + + +;; +;; Signal list parsing +;; + +;; Elements of a signal list +(defsubst verilog-sig-name (sig) + (car sig)) +(defsubst verilog-sig-bits (sig) + (nth 1 sig)) +(defsubst verilog-sig-comment (sig) + (nth 2 sig)) +(defsubst verilog-sig-memory (sig) + (nth 3 sig)) +(defsubst verilog-sig-enum (sig) + (nth 4 sig)) +(defsubst verilog-sig-signed (sig) + (nth 5 sig)) +(defsubst verilog-sig-type (sig) + (nth 6 sig)) +(defsubst verilog-sig-multidim (sig) + (nth 7 sig)) +(defsubst verilog-sig-multidim-string (sig) + (if (verilog-sig-multidim sig) + (let ((str "") (args (verilog-sig-multidim sig))) + (while args + (setq str (concat str (car args))) + (setq args (cdr args))) + str))) +(defsubst verilog-sig-width (sig) + (verilog-make-width-expression (verilog-sig-bits sig))) + +(defsubst verilog-alw-get-inputs (sigs) + (nth 2 sigs)) +(defsubst verilog-alw-get-outputs (sigs) + (nth 0 sigs)) +(defsubst verilog-alw-get-uses-delayed (sigs) + (nth 3 sigs)) + +(defun verilog-signals-not-in (in-list not-list) + "Return list of signals in IN-LIST that aren't also in NOT-LIST, +and also remove any duplicates in IN-LIST. +Signals must be in standard (base vector) form." + (let (out-list) + (while in-list + (if (not (or (assoc (car (car in-list)) not-list) + (assoc (car (car in-list)) out-list))) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + (nreverse out-list))) +;;(verilog-signals-not-in '(("A" "") ("B" "") ("DEL" "[2:3]")) '(("DEL" "") ("EXT" ""))) + +(defun verilog-signals-in (in-list other-list) + "Return list of signals in IN-LIST that are also in OTHER-LIST. +Signals must be in standard (base vector) form." + (let (out-list) + (while in-list + (if (assoc (car (car in-list)) other-list) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + (nreverse out-list))) +;;(verilog-signals-in '(("A" "") ("B" "") ("DEL" "[2:3]")) '(("DEL" "") ("EXT" ""))) + +(defun verilog-signals-memory (in-list) + "Return list of signals in IN-LIST that are memoried (multidimensional)." + (let (out-list) + (while in-list + (if (nth 3 (car in-list)) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + out-list)) +;;(verilog-signals-memory '(("A" nil nil "[3:0]")) '(("B" nil nil nil))) + +(defun verilog-signals-sort-compare (a b) + "Compare signal A and B for sorting." + (string< (car a) (car b))) + +(defun verilog-signals-not-params (in-list) + "Return list of signals in IN-LIST that aren't parameters or numeric constants." + (let (out-list) + (while in-list + (unless (boundp (intern (concat "vh-" (car (car in-list))))) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + (nreverse out-list))) + +(defun verilog-signals-combine-bus (in-list) + "Return a list of signals in IN-LIST, with busses combined. +Duplicate signals are also removed. For example A[2] and A[1] become A[2:1]." + (let (combo buswarn + out-list + sig highbit lowbit ; Temp information about current signal + sv-name sv-highbit sv-lowbit ; Details about signal we are forming + sv-comment sv-memory sv-enum sv-signed sv-type sv-multidim sv-busstring + bus) + ;; Shove signals so duplicated signals will be adjacent + (setq in-list (sort in-list `verilog-signals-sort-compare)) + (while in-list + (setq sig (car in-list)) + ;; No current signal; form from existing details + (unless sv-name + (setq sv-name (verilog-sig-name sig) + sv-highbit nil + sv-busstring nil + sv-comment (verilog-sig-comment sig) + sv-memory (verilog-sig-memory sig) + sv-enum (verilog-sig-enum sig) + sv-signed (verilog-sig-signed sig) + sv-type (verilog-sig-type sig) + sv-multidim (verilog-sig-multidim sig) + combo "" + buswarn "" + )) + ;; Extract bus details + (setq bus (verilog-sig-bits sig)) + (cond ((and bus + (or (and (string-match "\\[\\([0-9]+\\):\\([0-9]+\\)\\]" bus) + (setq highbit (string-to-int (match-string 1 bus)) + lowbit (string-to-int (match-string 2 bus)))) + (and (string-match "\\[\\([0-9]+\\)\\]" bus) + (setq highbit (string-to-int (match-string 1 bus)) + lowbit highbit)))) + ;; Combine bits in bus + (if sv-highbit + (setq sv-highbit (max highbit sv-highbit) + sv-lowbit (min lowbit sv-lowbit)) + (setq sv-highbit highbit + sv-lowbit lowbit))) + (bus + ;; String, probably something like `preproc:0 + (setq sv-busstring bus))) + ;; Peek ahead to next signal + (setq in-list (cdr in-list)) + (setq sig (car in-list)) + (cond ((and sig (equal sv-name (verilog-sig-name sig))) + ;; Combine with this signal + (when (and sv-busstring (not (equal sv-busstring (verilog-sig-bits sig)))) + (when nil ;; Debugging + (message (concat "Warning, can't merge into single bus " + sv-name bus + ", the AUTOs may be wrong"))) + (setq buswarn ", Couldn't Merge")) + (if (verilog-sig-comment sig) (setq combo ", ...")) + (setq sv-memory (or sv-memory (verilog-sig-memory sig)) + sv-enum (or sv-enum (verilog-sig-enum sig)) + sv-signed (or sv-signed (verilog-sig-signed sig)) + sv-type (or sv-type (verilog-sig-type sig)) + sv-multidim (or sv-multidim (verilog-sig-multidim sig)))) + ;; Doesn't match next signal, add to queue, zero in prep for next + ;; Note sig may also be nil for the last signal in the list + (t + (setq out-list + (cons (list sv-name + (or sv-busstring + (if sv-highbit + (concat "[" (int-to-string sv-highbit) ":" (int-to-string sv-lowbit) "]"))) + (concat sv-comment combo buswarn) + sv-memory sv-enum sv-signed sv-type sv-multidim) + out-list) + sv-name nil))) + ) + ;; + out-list)) + +(defun verilog-sig-tieoff (sig &optional no-width) + "Return tieoff expression for given SIGNAL, with appropriate width. +Ignore width if optional NO-WIDTH is set." + (let* ((width (if no-width nil (verilog-sig-width sig)))) + (concat + (if (and verilog-active-low-regexp + (string-match verilog-active-low-regexp (verilog-sig-name sig))) + "~" "") + (cond ((not width) + "0") + ((string-match "^[0-9]+$" width) + (concat width (if (verilog-sig-signed sig) "'sh0" "'h0"))) + (t + (concat "{" width "{1'b0}}")))))) + +;; +;; Port/Wire/Etc Reading +;; + +(defun verilog-read-inst-backward-name () + "Internal. Move point back to beginning of inst-name." + (verilog-backward-open-paren) + (let (done) + (while (not done) + (verilog-re-search-backward-quick "\\()\\|\\b[a-zA-Z0-9`_\$]\\|\\]\\)" nil nil) ; ] isn't word boundary + (cond ((looking-at ")") + (verilog-backward-open-paren)) + (t (setq done t))))) + (while (looking-at "\\]") + (verilog-backward-open-bracket) + (verilog-re-search-backward-quick "\\(\\b[a-zA-Z0-9`_\$]\\|\\]\\)" nil nil)) + (skip-chars-backward "a-zA-Z0-9`_$")) + +(defun verilog-read-inst-module () + "Return module_name when point is inside instantiation." + (save-excursion + (verilog-read-inst-backward-name) + ;; Skip over instantiation name + (verilog-re-search-backward-quick "\\(\\b[a-zA-Z0-9`_\$]\\|)\\)" nil nil) ; ) isn't word boundary + ;; Check for parameterized instantiations + (when (looking-at ")") + (verilog-backward-open-paren) + (verilog-re-search-backward-quick "\\b[a-zA-Z0-9`_\$]" nil nil)) + (skip-chars-backward "a-zA-Z0-9'_$") + (looking-at "[a-zA-Z0-9`_\$]+") + ;; Important: don't use match string, this must work with emacs 19 font-lock on + (buffer-substring-no-properties (match-beginning 0) (match-end 0)))) + +(defun verilog-read-inst-name () + "Return instance_name when point is inside instantiation." + (save-excursion + (verilog-read-inst-backward-name) + (looking-at "[a-zA-Z0-9`_\$]+") + ;; Important: don't use match string, this must work with emacs 19 font-lock on + (buffer-substring-no-properties (match-beginning 0) (match-end 0)))) + +(defun verilog-read-module-name () + "Return module name when after its ( or ;." + (save-excursion + (re-search-backward "[(;]") + (verilog-re-search-backward-quick "\\b[a-zA-Z0-9`_\$]" nil nil) + (skip-chars-backward "a-zA-Z0-9`_$") + (looking-at "[a-zA-Z0-9`_\$]+") + ;; Important: don't use match string, this must work with emacs 19 font-lock on + (buffer-substring-no-properties (match-beginning 0) (match-end 0)))) + +(defun verilog-read-auto-params (num-param &optional max-param) + "Return parameter list inside auto. +Optional NUM-PARAM and MAX-PARAM check for a specific number of parameters." + (let ((olist)) + (save-excursion + ;; /*AUTOPUNT("parameter", "parameter")*/ + (search-backward "(") + (while (looking-at "(?\\s *\"\\([^\"]*\\)\"\\s *,?") + (setq olist (cons (match-string 1) olist)) + (goto-char (match-end 0)))) + (or (eq nil num-param) + (<= num-param (length olist)) + (error "%s: Expected %d parameters" (verilog-point-text) num-param)) + (if (eq max-param nil) (setq max-param num-param)) + (or (eq nil max-param) + (>= max-param (length olist)) + (error "%s: Expected <= %d parameters" (verilog-point-text) max-param)) + (nreverse olist))) + +(defun verilog-read-decls () + "Compute signal declaration information for the current module at point. +Return a array of [outputs inouts inputs wire reg assign const]." + (let ((end-mod-point (or (verilog-get-end-of-defun t) (point-max))) + (functask 0) (paren 0) (sig-paren 0) + sigs-in sigs-out sigs-inout sigs-wire sigs-reg sigs-assign sigs-const sigs-gparam + vec expect-signal keywd newsig rvalue enum io signed typedefed multidim) + (save-excursion + (verilog-beg-of-defun) + (setq sigs-const (verilog-read-auto-constants (point) end-mod-point)) + (while (< (point) end-mod-point) + ;;(if dbg (setq dbg (cons (format "Pt %s Vec %s Kwd'%s'\n" (point) vec keywd) dbg))) + (cond + ((looking-at "//") + (if (looking-at "[^\n]*synopsys\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") + (setq enum (match-string 1))) + (search-forward "\n")) + ((looking-at "/\\*") + (forward-char 2) + (if (looking-at "[^*]*synopsys\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") + (setq enum (match-string 1))) + (or (search-forward "*/") + (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point)))) + ((looking-at "(\\*") + (forward-char 2) + (or (looking-at "\\s-*)") ; It's a "always @ (*)" + (search-forward "*)") + (error "%s: Unmatched (* *), at char %d" (verilog-point-text) (point)))) + ((eq ?\" (following-char)) + (or (re-search-forward "[^\\]\"" nil t) ;; don't forward-char first, since we look for a non backslash first + (error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point)))) + ((eq ?\; (following-char)) + (setq vec nil io nil expect-signal nil newsig nil paren 0 rvalue nil) + (forward-char 1)) + ((eq ?= (following-char)) + (setq rvalue t newsig nil) + (forward-char 1)) + ((and (or rvalue sig-paren) + (cond ((and (eq ?, (following-char)) + (eq paren sig-paren)) + (setq rvalue nil) + (forward-char 1) + t) + ;; ,'s can occur inside {} & funcs + ((looking-at "[{(]") + (setq paren (1+ paren)) + (forward-char 1) + t) + ((looking-at "[})]") + (setq paren (1- paren)) + (forward-char 1) + (when (< paren sig-paren) + (setq expect-signal nil)) ; ) that ends variables inside v2k arg list + t) + ))) + ((looking-at "\\s-*\\(\\[[^]]+\\]\\)") + (goto-char (match-end 0)) + (cond (newsig ; Memory, not just width. Patch last signal added's memory (nth 3) + (setcar (cdr (cdr (cdr newsig))) (match-string 1))) + (vec ;; Multidimensional + (setq multidim (cons vec multidim)) + (setq vec (verilog-string-replace-matches + "\\s-+" "" nil nil (match-string 1)))) + (t ;; Bit width + (setq vec (verilog-string-replace-matches + "\\s-+" "" nil nil (match-string 1)))))) + ;; Normal or escaped identifier -- note we remember the \ if escaped + ((looking-at "\\s-*\\([a-zA-Z0-9`_$]+\\|\\\\[^ \t\n\f]+\\)") + (goto-char (match-end 0)) + (setq keywd (match-string 1)) + (when (string-match "^\\\\" keywd) + (setq keywd (concat keywd " "))) ;; Escaped ID needs space at end + (cond ((equal keywd "input") + (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-in io t)) + ((equal keywd "output") + (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-out io t)) + ((equal keywd "inout") + (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-inout io t)) + ((or (equal keywd "wire") + (equal keywd "tri") + (equal keywd "tri0") + (equal keywd "tri1")) + (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-wire))) + ((or (equal keywd "reg") + (equal keywd "trireg")) + (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-reg))) + ((equal keywd "assign") + (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-assign)) + ((or (equal keywd "supply0") + (equal keywd "supply1") + (equal keywd "supply") + (equal keywd "localparam")) + (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-const))) + ((or (equal keywd "parameter")) + (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren + expect-signal 'sigs-gparam))) + ((equal keywd "signed") + (setq signed "signed")) + ((or (equal keywd "function") + (equal keywd "task")) + (setq functask (1+ functask))) + ((or (equal keywd "endfunction") + (equal keywd "endtask")) + (setq functask (1- functask))) + ((or (equal keywd "`ifdef") + (equal keywd "`ifndef")) + (setq rvalue t)) + ((verilog-typedef-name-p keywd) + (setq typedefed keywd)) + ((and expect-signal + (eq functask 0) + (not rvalue) + (eq paren sig-paren) + (not (member keywd verilog-keywords))) + ;; Add new signal to expect-signal's variable + (setq newsig (list keywd vec nil nil enum signed typedefed multidim)) + (set expect-signal (cons newsig + (symbol-value expect-signal)))))) + (t + (forward-char 1))) + (skip-syntax-forward " ")) + ;; Return arguments + (vector (nreverse sigs-out) + (nreverse sigs-inout) + (nreverse sigs-in) + (nreverse sigs-wire) + (nreverse sigs-reg) + (nreverse sigs-assign) + (nreverse sigs-const) + (nreverse sigs-gparam) + )))) + +(defvar sigs-in nil) ; Prevent compile warning +(defvar sigs-inout nil) ; Prevent compile warning +(defvar sigs-out nil) ; Prevent compile warning + +(defun verilog-read-sub-decls-sig (submodi comment port sig vec multidim) + "For verilog-read-sub-decls-line, add a signal." + (let (portdata) + (when sig + (setq port (verilog-symbol-detick-denumber port)) + (setq sig (verilog-symbol-detick-denumber sig)) + (if sig (setq sig (verilog-string-replace-matches "^[---+~!|&]+" "" nil nil sig))) + (if vec (setq vec (verilog-symbol-detick-denumber vec))) + (if multidim (setq multidim (mapcar `verilog-symbol-detick-denumber multidim))) + (unless (or (not sig) + (equal sig "")) ;; Ignore .foo(1'b1) assignments + (cond ((setq portdata (assoc port (verilog-modi-get-inouts submodi))) + (setq sigs-inout (cons (list sig vec (concat "To/From " comment) nil nil + (verilog-sig-signed portdata) + (verilog-sig-type portdata) + multidim) + sigs-inout))) + ((setq portdata (assoc port (verilog-modi-get-outputs submodi))) + (setq sigs-out (cons (list sig vec (concat "From " comment) nil nil + (verilog-sig-signed portdata) + (verilog-sig-type portdata) + multidim) + sigs-out))) + ((setq portdata (assoc port (verilog-modi-get-inputs submodi))) + (setq sigs-in (cons (list sig vec (concat "To " comment) nil nil + (verilog-sig-signed portdata) + (verilog-sig-type portdata) + multidim) + sigs-in))) + ;; (t -- warning pin isn't defined.) ; Leave for lint tool + ))))) + +(defun verilog-read-sub-decls-line (submodi comment) + "For read-sub-decls, read lines of port defs until none match anymore. +Return the list of signals found, using submodi to look up each port." + (let (done port sig vec multidim) + (save-excursion + (forward-line 1) + (while (not done) + ;; Get port name + (cond ((looking-at "\\s-*\\.\\s-*\\([a-zA-Z0-9`_$]*\\)\\s-*(\\s-*") + (setq port (match-string 1)) + (goto-char (match-end 0))) + ((looking-at "\\s-*\\.\\s-*\\(\\\\[^ \t\n\f]*\\)\\s-*(\\s-*") + (setq port (concat (match-string 1) " ")) ;; escaped id's need trailing space + (goto-char (match-end 0))) + ((looking-at "\\s-*\\.[^(]*(") + (setq port nil) ;; skip this line + (goto-char (match-end 0))) + (t + (setq port nil done t))) ;; Unknown, ignore rest of line + ;; Get signal name + (when port + (setq multidim nil) + (cond ((looking-at "\\(\\\\[^ \t\n\f]*\\)\\s-*)") + (setq sig (concat (match-string 1) " ") ;; escaped id's need trailing space + vec nil)) + ; We intentionally ignore (non-escaped) signals with .s in them + ; this prevents AUTOWIRE etc from noticing hierarchical sigs. + ((looking-at "\\([^[({).]*\\)\\s-*)") + (setq sig (verilog-string-remove-spaces (match-string 1)) + vec nil)) + ((looking-at "\\([^[({).]*\\)\\s-*\\(\\[[^]]+\\]\\)\\s-*)") + (setq sig (verilog-string-remove-spaces (match-string 1)) + vec (match-string 2))) + ((looking-at "\\([^[({).]*\\)\\s-*/\\*\\(\\[[^*]+\\]\\)\\*/\\s-*)") + (setq sig (verilog-string-remove-spaces (match-string 1)) + vec nil) + (let ((parse (match-string 2))) + (while (string-match "^\\(\\[[^]]+\\]\\)\\(.*\\)$" parse) + (when vec (setq multidim (cons vec multidim))) + (setq vec (match-string 1 parse)) + (setq parse (match-string 2 parse))))) + ((looking-at "{\\(.*\\)}.*\\s-*)") + (let ((mlst (split-string (match-string 1) ",")) + mstr) + (while (setq mstr (pop mlst)) + ;;(unless noninteractive (message "sig: %s " mstr)) + (cond + ((string-match "\\(['`a-zA-Z0-9_$]+\\)\\s-*$" mstr) + (setq sig (verilog-string-remove-spaces (match-string 1 mstr)) + vec nil) + ;;(unless noninteractive (message "concat sig1: %s %s" mstr (match-string 1 mstr))) + ) + ((string-match "\\([^[({).]+\\)\\s-*\\(\\[[^]]+\\]\\)\\s-*" mstr) + (setq sig (verilog-string-remove-spaces (match-string 1 mstr)) + vec (match-string 2 mstr)) + ;;(unless noninteractive (message "concat sig2: '%s' '%s' '%s'" mstr (match-string 1 mstr) (match-string 2 mstr))) + ) + (t + (setq sig nil))) + ;; Process signals + (verilog-read-sub-decls-sig submodi comment port sig vec multidim)))) + (t + (setq sig nil))) + ;; Process signals + (verilog-read-sub-decls-sig submodi comment port sig vec multidim)) + ;; + (forward-line 1))))) + +(defun verilog-read-sub-decls () + "Internally parse signals going to modules under this module. +Return a array of [ outputs inouts inputs ] signals for modules that are +instantiated in this module. For example if declare A A (.B(SIG)) and SIG +is a output, then SIG will be included in the list. + +This only works on instantiations created with /*AUTOINST*/ converted by +\\[verilog-auto-inst]. Otherwise, it would have to read in the whole +component library to determine connectivity of the design. + +One work around for this problem is to manually create // Inputs and // +Outputs comments above subcell signals, for example: + + module1 instance1x ( + // Outputs + .out (out), + // Inputs + .in (in));" + (save-excursion + (let ((end-mod-point (verilog-get-end-of-defun t)) + st-point end-inst-point + ;; below 3 modified by verilog-read-sub-decls-line + sigs-out sigs-inout sigs-in) + (verilog-beg-of-defun) + (while (re-search-forward "\\(/\\*AUTOINST\\*/\\|\\.\\*\\)" end-mod-point t) + (save-excursion + (goto-char (match-beginning 0)) + (unless (verilog-inside-comment-p) + ;; Attempt to snarf a comment + (let* ((submod (verilog-read-inst-module)) + (inst (verilog-read-inst-name)) + (comment (concat inst " of " submod ".v")) submodi) + (when (setq submodi (verilog-modi-lookup submod t)) + ;; This could have used a list created by verilog-auto-inst + ;; However I want it to be runnable even on user's manually added signals + (verilog-backward-open-paren) + (setq end-inst-point (save-excursion (forward-sexp 1) (point)) + st-point (point)) + (while (re-search-forward "\\s *(?\\s *// Outputs" end-inst-point t) + (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-out + (goto-char st-point) + (while (re-search-forward "\\s *// Inouts" end-inst-point t) + (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-inout + (goto-char st-point) + (while (re-search-forward "\\s *// Inputs" end-inst-point t) + (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-in + ))))) + ;; Combine duplicate bits + ;;(setq rr (vector sigs-out sigs-inout sigs-in)) + (vector (verilog-signals-combine-bus (nreverse sigs-out)) + (verilog-signals-combine-bus (nreverse sigs-inout)) + (verilog-signals-combine-bus (nreverse sigs-in)))))) + +(defun verilog-read-inst-pins () + "Return a array of [ pins ] for the current instantiation at point. +For example if declare A A (.B(SIG)) then B will be included in the list." + (save-excursion + (let ((end-mod-point (point)) ;; presume at /*AUTOINST*/ point + pins pin) + (verilog-backward-open-paren) + (while (re-search-forward "\\.\\([^(,) \t\n\f]*\\)\\s-*" end-mod-point t) + (setq pin (match-string 1)) + (unless (verilog-inside-comment-p) + (setq pins (cons (list pin) pins)) + (when (looking-at "(") + (forward-sexp 1)))) + (vector pins)))) + +(defun verilog-read-arg-pins () + "Return a array of [ pins ] for the current argument declaration at point." + (save-excursion + (let ((end-mod-point (point)) ;; presume at /*AUTOARG*/ point + pins pin) + (verilog-backward-open-paren) + (while (re-search-forward "\\([a-zA-Z0-9$_.%`]+\\)" end-mod-point t) + (setq pin (match-string 1)) + (unless (verilog-inside-comment-p) + (setq pins (cons (list pin) pins)))) + (vector pins)))) + +(defun verilog-read-auto-constants (beg end-mod-point) + "Return a list of AUTO_CONSTANTs used in the region from BEG to END-MOD-POINT." + ;; Insert new + (save-excursion + (let (sig-list tpl-end-pt) + (goto-char beg) + (while (re-search-forward "\\<AUTO_CONSTANT" end-mod-point t) + (if (not (looking-at "\\s *(")) + (error "%s: Missing () after AUTO_CONSTANT" (verilog-point-text))) + (search-forward "(" end-mod-point) + (setq tpl-end-pt (save-excursion + (backward-char 1) + (forward-sexp 1) ;; Moves to paren that closes argdecl's + (backward-char 1) + (point))) + (while (re-search-forward "\\s-*\\([\"a-zA-Z0-9$_.%`]+\\)\\s-*,*" tpl-end-pt t) + (setq sig-list (cons (list (match-string 1) nil nil) sig-list)))) + sig-list))) + +(defun verilog-read-auto-lisp (start end) + "Look for and evaluate a AUTO_LISP between START and END." + (save-excursion + (goto-char start) + (while (re-search-forward "\\<AUTO_LISP(" end t) + (backward-char) + (let* ((beg-pt (prog1 (point) + (forward-sexp 1))) ;; Closing paren + (end-pt (point))) + (eval-region beg-pt end-pt nil))))) + +(eval-when-compile + ;; These are passed in a let, not global + (if (not (boundp 'sigs-in)) + (defvar sigs-in nil) (defvar sigs-out nil) + (defvar got-sig nil) (defvar got-rvalue nil) (defvar uses-delayed nil))) + +(defun verilog-read-always-signals-recurse + (exit-keywd rvalue ignore-next) + "Recursive routine for parentheses/bracket matching. +EXIT-KEYWD is expression to stop at, nil if top level. +RVALUE is true if at right hand side of equal. +IGNORE-NEXT is true to ignore next token, fake from inside case statement." + (let* ((semi-rvalue (equal "endcase" exit-keywd)) ;; true if after a ; we are looking for rvalue + keywd last-keywd sig-tolk sig-last-tolk gotend got-sig got-rvalue end-else-check) + ;;(if dbg (setq dbg (concat dbg (format "Recursion %S %S %S\n" exit-keywd rvalue ignore-next)))) + (while (not (or (eobp) gotend)) + (cond + ((looking-at "//") + (search-forward "\n")) + ((looking-at "/\\*") + (or (search-forward "*/") + (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point)))) + ((looking-at "(\\*") + (or (looking-at "(\\*\\s-*)") ; It's a "always @ (*)" + (search-forward "*)") + (error "%s: Unmatched (* *), at char %d" (verilog-point-text) (point)))) + (t (setq keywd (buffer-substring-no-properties + (point) + (save-excursion (when (eq 0 (skip-chars-forward "a-zA-Z0-9$_.%`")) + (forward-char 1)) + (point))) + sig-last-tolk sig-tolk + sig-tolk nil) + ;;(if dbg (setq dbg (concat dbg (format "\tPt=%S %S\trv=%S in=%S ee=%S\n" (point) keywd rvalue ignore-next end-else-check)))) + (cond + ((equal keywd "\"") + (or (re-search-forward "[^\\]\"" nil t) + (error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point)))) + ;; else at top level loop, keep parsing + ((and end-else-check (equal keywd "else")) + ;;(if dbg (setq dbg (concat dbg (format "\tif-check-else %s\n" keywd)))) + ;; no forward movement, want to see else in lower loop + (setq end-else-check nil)) + ;; End at top level loop + ((and end-else-check (looking-at "[^ \t\n\f]")) + ;;(if dbg (setq dbg (concat dbg (format "\tif-check-else-other %s\n" keywd)))) + (setq gotend t)) + ;; Final statement? + ((and exit-keywd (equal keywd exit-keywd)) + (setq gotend t) + (forward-char (length keywd))) + ;; Standard tokens... + ((equal keywd ";") + (setq ignore-next nil rvalue semi-rvalue) + ;; Final statement at top level loop? + (when (not exit-keywd) + ;;(if dbg (setq dbg (concat dbg (format "\ttop-end-check %s\n" keywd)))) + (setq end-else-check t)) + (forward-char 1)) + ((equal keywd "'") + (if (looking-at "'s?[hdxbo][0-9a-fA-F_xz? \t]*") + (goto-char (match-end 0)) + (forward-char 1))) + ((equal keywd ":") ;; Case statement, begin/end label, x?y:z + (cond ((equal "endcase" exit-keywd) ;; case x: y=z; statement next + (setq ignore-next nil rvalue nil)) + ((equal "?" exit-keywd) ;; x?y:z rvalue + ) ;; NOP + (got-sig ;; label: statement + (setq ignore-next nil rvalue semi-rvalue got-sig nil)) + ((not rvalue) ;; begin label + (setq ignore-next t rvalue nil))) + (forward-char 1)) + ((equal keywd "=") + (if (eq (char-before) ?< ) + (setq uses-delayed 1)) + (setq ignore-next nil rvalue t) + (forward-char 1)) + ((equal keywd "?") + (forward-char 1) + (verilog-read-always-signals-recurse ":" rvalue nil)) + ((equal keywd "[") + (forward-char 1) + (verilog-read-always-signals-recurse "]" t nil)) + ((equal keywd "(") + (forward-char 1) + (cond (sig-last-tolk ;; Function call; zap last signal + (setq got-sig nil))) + (cond ((equal last-keywd "for") + (verilog-read-always-signals-recurse ";" nil nil) + (verilog-read-always-signals-recurse ";" t nil) + (verilog-read-always-signals-recurse ")" nil nil)) + (t (verilog-read-always-signals-recurse ")" t nil)))) + ((equal keywd "begin") + (skip-syntax-forward "w_") + (verilog-read-always-signals-recurse "end" nil nil) + ;;(if dbg (setq dbg (concat dbg (format "\tgot-end %s\n" exit-keywd)))) + (setq ignore-next nil rvalue semi-rvalue) + (if (not exit-keywd) (setq end-else-check t))) + ((or (equal keywd "case") + (equal keywd "casex") + (equal keywd "casez")) + (skip-syntax-forward "w_") + (verilog-read-always-signals-recurse "endcase" t nil) + (setq ignore-next nil rvalue semi-rvalue) + (if (not exit-keywd) (setq gotend t))) ;; top level begin/end + ((string-match "^[$`a-zA-Z_]" keywd) ;; not exactly word constituent + (cond ((or (equal keywd "`ifdef") + (equal keywd "`ifndef")) + (setq ignore-next t)) + ((or ignore-next + (member keywd verilog-keywords) + (string-match "^\\$" keywd)) ;; PLI task + (setq ignore-next nil)) + (t + (setq keywd (verilog-symbol-detick-denumber keywd)) + (when got-sig + (if got-rvalue (setq sigs-in (cons got-sig sigs-in)) + (setq sigs-out (cons got-sig sigs-out))) + ;;(if dbg (setq dbg (concat dbg (format "\t\tgot-sig=%S rv=%S\n" got-sig got-rvalue)))) + ) + (setq got-rvalue rvalue + got-sig (if (or (not keywd) + (assoc keywd (if got-rvalue sigs-in sigs-out))) + nil (list keywd nil nil)) + sig-tolk t))) + (skip-chars-forward "a-zA-Z0-9$_.%`")) + (t + (forward-char 1))) + ;; End of non-comment token + (setq last-keywd keywd) + )) + (skip-syntax-forward " ")) + ;; Append the final pending signal + (when got-sig + (if got-rvalue (setq sigs-in (cons got-sig sigs-in)) + (setq sigs-out (cons got-sig sigs-out))) + ;;(if dbg (setq dbg (concat dbg (format "\t\tgot-sig=%S rv=%S\n" got-sig got-rvalue)))) + (setq got-sig nil)) + ;;(if dbg (setq dbg (concat dbg (format "ENDRecursion %s\n" exit-keywd)))) + )) + +(defun verilog-read-always-signals () + "Parse always block at point and return list of (outputs inout inputs)." + ;; Insert new + (save-excursion + (let* (;;(dbg "") + sigs-in sigs-out + uses-delayed) ;; Found signal/rvalue; push if not function + (search-forward ")") + (verilog-read-always-signals-recurse nil nil nil) + ;;(if dbg (save-excursion (set-buffer (get-buffer-create "*vl-dbg*")) (delete-region (point-min) (point-max)) (insert dbg) (setq dbg ""))) + ;; Return what was found + (list sigs-out nil sigs-in uses-delayed)))) + +(defun verilog-read-instants () + "Parse module at point and return list of ( ( file instance ) ... )." + (verilog-beg-of-defun) + (let* ((end-mod-point (verilog-get-end-of-defun t)) + (state nil) + (instants-list nil)) + (save-excursion + (while (< (point) end-mod-point) + ;; Stay at level 0, no comments + (while (progn + (setq state (parse-partial-sexp (point) end-mod-point 0 t nil)) + (or (> (car state) 0) ; in parens + (nth 5 state) ; comment + )) + (forward-line 1)) + (beginning-of-line) + (if (looking-at "^\\s-*\\([a-zA-Z0-9`_$]+\\)\\s-+\\([a-zA-Z0-9`_$]+\\)\\s-*(") + ;;(if (looking-at "^\\(.+\\)$") + (let ((module (match-string 1)) + (instant (match-string 2))) + (if (not (member module verilog-keywords)) + (setq instants-list (cons (list module instant) instants-list))))) + (forward-line 1) + )) + instants-list)) + + +(defun verilog-read-auto-template (module) + "Look for a auto_template for the instantiation of the given MODULE. +If found returns the signal name connections. Return REGEXP and +list of ( (signal_name connection_name)... )" + (save-excursion + ;; Find beginning + (let ((tpl-regexp "\\([0-9]+\\)") + (lineno 0) + (templateno 0) + tpl-sig-list tpl-wild-list tpl-end-pt rep) + (cond ((or + (re-search-backward (concat "^\\s-*/?\\*?\\s-*" module "\\s-+AUTO_TEMPLATE") nil t) + (progn + (goto-char (point-min)) + (re-search-forward (concat "^\\s-*/?\\*?\\s-*" module "\\s-+AUTO_TEMPLATE") nil t))) + (goto-char (match-end 0)) + ;; Parse "REGEXP" + ;; We reserve @"..." for future lisp expressions that evaluate once-per-AUTOINST + (when (looking-at "\\s-*\"\\([^\"]*)\\)\"") + (setq tpl-regexp (match-string 1)) + (goto-char (match-end 0))) + (search-forward "(") + ;; Parse lines in the template + (when verilog-auto-inst-template-numbers + (save-excursion + (goto-char (point-min)) + (while (search-forward "AUTO_TEMPLATE" nil t) + (setq templateno (1+ templateno))))) + (setq tpl-end-pt (save-excursion + (backward-char 1) + (forward-sexp 1) ;; Moves to paren that closes argdecl's + (backward-char 1) + (point))) + ;; + (while (< (point) tpl-end-pt) + (cond ((looking-at "\\s-*\\.\\([a-zA-Z0-9`_$]+\\)\\s-*(\\(.*\\))\\s-*\\(,\\|)\\s-*;\\)") + (setq tpl-sig-list (cons (list + (match-string-no-properties 1) + (match-string-no-properties 2) + templateno lineno) + tpl-sig-list)) + (goto-char (match-end 0))) + ;; Regexp form?? + ((looking-at + ;; Regexp bug in xemacs disallows ][ inside [], and wants + last + "\\s-*\\.\\(\\([a-zA-Z0-9`_$+@^.*?|---]+\\|[][]\\|\\\\[()|]\\)+\\)\\s-*(\\(.*\\))\\s-*\\(,\\|)\\s-*;\\)") + (setq rep (match-string-no-properties 3)) + (goto-char (match-end 0)) + (setq tpl-wild-list + (cons (list + (concat "^" + (verilog-string-replace-matches "@" "\\\\([0-9]+\\\\)" nil nil + (match-string 1)) + "$") + rep + templateno lineno) + tpl-wild-list))) + ((looking-at "[ \t\f]+") + (goto-char (match-end 0))) + ((looking-at "\n") + (setq lineno (1+ lineno)) + (goto-char (match-end 0))) + ((looking-at "//") + (search-forward "\n")) + ((looking-at "/\\*") + (forward-char 2) + (or (search-forward "*/") + (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point)))) + (t + (error "%s: AUTO_TEMPLATE parsing error: %s" + (verilog-point-text) + (progn (looking-at ".*$") (match-string 0)))) + )) + ;; Return + (vector tpl-regexp + (list tpl-sig-list tpl-wild-list))) + ;; If no template found + (t (vector tpl-regexp nil)))))) +;;(progn (find-file "auto-template.v") (verilog-read-auto-template "ptl_entry")) + +(defun verilog-set-define (defname defvalue &optional buffer enumname) + "Set the definition DEFNAME to the DEFVALUE in the given BUFFER. +Optionally associate it with the specified enumeration ENUMNAME." + (save-excursion + (set-buffer (or buffer (current-buffer))) + (let ((mac (intern (concat "vh-" defname)))) + ;;(message "Define %s=%s" defname defvalue) (sleep-for 1) + ;; Need to define to a constant if no value given + (set (make-variable-buffer-local mac) + (if (equal defvalue "") "1" defvalue))) + (if enumname + (let ((enumvar (intern (concat "venum-" enumname)))) + ;;(message "Define %s=%s" defname defvalue) (sleep-for 1) + (make-variable-buffer-local enumvar) + (add-to-list enumvar defname))) + )) + +(defun verilog-read-defines (&optional filename recurse subcall) + "Read `defines and parameters for the current file, or optional FILENAME. +If the filename is provided, `verilog-library-flags' will be used to +resolve it. If optional RECURSE is non-nil, recurse through `includes. + +Parameters must be simple assignments to constants, or have their own +\"parameter\" label rather than a list of parameters. Thus: + + parameter X = 5, Y = 10; // Ok + parameter X = {1'b1, 2'h2}; // Ok + parameter X = {1'b1, 2'h2}, Y = 10; // Bad, make into 2 parameter lines + +Defines must be simple text substitutions, one on a line, starting +at the beginning of the line. Any ifdefs or multiline comments around the +define are ignored. + +Defines are stored inside Emacs variables using the name vh-{definename}. + +This function is useful for setting vh-* variables. The file variables +feature can be used to set defines that `verilog-mode' can see; put at the +*END* of your file something like: + + // Local Variables: + // vh-macro:\"macro_definition\" + // End: + +If macros are defined earlier in the same file and you want their values, +you can read them automatically (provided `enable-local-eval' is on): + + // Local Variables: + // eval:(verilog-read-defines) + // eval:(verilog-read-defines \"group_standard_includes.v\") + // End: + +Note these are only read when the file is first visited, you must use +\\[find-alternate-file] RET to have these take effect after editing them! + +If you want to disable the \"Process `eval' or hook local variables\" +warning message, you need to add to your .emacs file: + + (setq enable-local-eval t)" + (let ((origbuf (current-buffer))) + (save-excursion + (unless subcall (verilog-getopt-flags)) + (when filename + (let ((fns (verilog-library-filenames filename (buffer-file-name)))) + (if fns + (set-buffer (find-file-noselect (car fns))) + (error (concat (verilog-point-text) + ": Can't find verilog-read-defines file: " filename))))) + (when recurse + (goto-char (point-min)) + (while (re-search-forward "^\\s-*`include\\s-+\\([^ \t\n\f]+\\)" nil t) + (let ((inc (verilog-string-replace-matches "\"" "" nil nil (match-string-no-properties 1)))) + (unless (verilog-inside-comment-p) + (verilog-read-defines inc recurse t))))) + ;; Read `defines + ;; note we don't use verilog-re... it's faster this way, and that + ;; function has problems when comments are at the end of the define + (goto-char (point-min)) + (while (re-search-forward "^\\s-*`define\\s-+\\([a-zA-Z0-9_$]+\\)\\s-+\\(.*\\)$" nil t) + (let ((defname (match-string-no-properties 1)) + (defvalue (match-string-no-properties 2))) + (setq defvalue (verilog-string-replace-matches "\\s-*/[/*].*$" "" nil nil defvalue)) + (verilog-set-define defname defvalue origbuf))) + ;; Hack: Read parameters + (goto-char (point-min)) + (while (re-search-forward + "^\\s-*\\(parameter\\|localparam\\)\\(\\(\\s-*\\[[^]]*\\]\\|\\)\\s-+\\([a-zA-Z0-9_$]+\\)\\s-*=\\s-*\\([^;,]*\\),?\\|\\)\\s-*" nil t) + (let ((var (match-string-no-properties 4)) + (val (match-string-no-properties 5)) + enumname) + ;; The primary way of getting defines is verilog-read-decls + ;; However, that isn't called yet for included files, so we'll add another scheme + (if (looking-at "[^\n]*synopsys\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") + (setq enumname (match-string-no-properties 1))) + (if var + (verilog-set-define var val origbuf enumname)) + (forward-comment 999) + (while (looking-at "\\s-*,?\\s-*\\([a-zA-Z0-9_$]+\\)\\s-*=\\s-*\\([^;,]*\\),?\\s-*") + (verilog-set-define (match-string-no-properties 1) (match-string-no-properties 2) origbuf enumname) + (goto-char (match-end 0)) + (forward-comment 999)))) + ))) + +(defun verilog-read-includes () + "Read `includes for the current file. +This will find all of the `includes which are at the beginning of lines, +ignoring any ifdefs or multiline comments around them. +`verilog-read-defines' is then performed on the current and each included +file. + +It is often useful put at the *END* of your file something like: + + // Local Variables: + // eval:(verilog-read-defines) + // eval:(verilog-read-includes) + // End: + +Note includes are only read when the file is first visited, you must use +\\[find-alternate-file] RET to have these take effect after editing them! + +It is good to get in the habit of including all needed files in each .v +file that needs it, rather than waiting for compile time. This will aid +this process, Verilint, and readability. To prevent defining the same +variable over and over when many modules are compiled together, put a test +around the inside each include file: + +foo.v (a include): + `ifdef _FOO_V // include if not already included + `else + `define _FOO_V + ... contents of file + `endif // _FOO_V" +;;slow: (verilog-read-defines nil t)) + (save-excursion + (verilog-getopt-flags) + (goto-char (point-min)) + (while (re-search-forward "^\\s-*`include\\s-+\\([^ \t\n\f]+\\)" nil t) + (let ((inc (verilog-string-replace-matches "\"" "" nil nil (match-string 1)))) + (verilog-read-defines inc nil t))))) + +(defun verilog-read-signals (&optional start end) + "Return a simple list of all possible signals in the file. +Bounded by optional region from START to END. Overly aggressive but fast. +Some macros and such are also found and included. For dinotrace.el" + (let (sigs-all keywd) + (progn;save-excursion + (goto-char (or start (point-min))) + (setq end (or end (point-max))) + (while (re-search-forward "[\"/a-zA-Z_.%`]" end t) + (forward-char -1) + (cond + ((looking-at "//") + (search-forward "\n")) + ((looking-at "/\\*") + (search-forward "*/")) + ((looking-at "(\\*") + (or (looking-at "(\\*\\s-*)") ; It's a "always @ (*)" + (search-forward "*)"))) + ((eq ?\" (following-char)) + (re-search-forward "[^\\]\"")) ;; don't forward-char first, since we look for a non backslash first + ((looking-at "\\s-*\\([a-zA-Z0-9$_.%`]+\\)") + (goto-char (match-end 0)) + (setq keywd (match-string-no-properties 1)) + (or (member keywd verilog-keywords) + (member keywd sigs-all) + (setq sigs-all (cons keywd sigs-all)))) + (t (forward-char 1))) + ) + ;; Return list + sigs-all))) + +;; +;; Argument file parsing +;; + +(defun verilog-getopt (arglist) + "Parse -f, -v etc arguments in ARGLIST list or string." + (unless (listp arglist) (setq arglist (list arglist))) + (let ((space-args '()) + arg next-param) + ;; Split on spaces, so users can pass whole command lines + (while arglist + (setq arg (car arglist) + arglist (cdr arglist)) + (while (string-match "^\\([^ \t\n\f]+\\)[ \t\n\f]*\\(.*$\\)" arg) + (setq space-args (append space-args + (list (match-string-no-properties 1 arg)))) + (setq arg (match-string 2 arg)))) + ;; Parse arguments + (while space-args + (setq arg (car space-args) + space-args (cdr space-args)) + (cond + ;; Need another arg + ((equal arg "-f") + (setq next-param arg)) + ((equal arg "-v") + (setq next-param arg)) + ((equal arg "-y") + (setq next-param arg)) + ;; +libext+(ext1)+(ext2)... + ((string-match "^\\+libext\\+\\(.*\\)" arg) + (setq arg (match-string 1 arg)) + (while (string-match "\\([^+]+\\)\\+?\\(.*\\)" arg) + (verilog-add-list-unique `verilog-library-extensions + (match-string 1 arg)) + (setq arg (match-string 2 arg)))) + ;; + ((or (string-match "^-D\\([^+=]*\\)[+=]\\(.*\\)" arg) ;; -Ddefine=val + (string-match "^-D\\([^+=]*\\)\\(\\)" arg) ;; -Ddefine + (string-match "^\\+define\\([^+=]*\\)[+=]\\(.*\\)" arg) ;; +define+val + (string-match "^\\+define\\([^+=]*\\)\\(\\)" arg)) ;; +define+define + (verilog-set-define (match-string 1 arg) (match-string 2 arg))) + ;; + ((or (string-match "^\\+incdir\\+\\(.*\\)" arg) ;; +incdir+dir + (string-match "^-I\\(.*\\)" arg)) ;; -Idir + (verilog-add-list-unique `verilog-library-directories + (match-string 1 arg))) + ;; Ignore + ((equal "+librescan" arg)) + ((string-match "^-U\\(.*\\)" arg)) ;; -Udefine + ;; Second parameters + ((equal next-param "-f") + (setq next-param nil) + (verilog-getopt-file arg)) + ((equal next-param "-v") + (setq next-param nil) + (verilog-add-list-unique `verilog-library-files arg)) + ((equal next-param "-y") + (setq next-param nil) + (verilog-add-list-unique `verilog-library-directories arg)) + ;; Filename + ((string-match "^[^-+]" arg) + (verilog-add-list-unique `verilog-library-files arg)) + ;; Default - ignore; no warning + ) + ) + ) + ) +;;(verilog-getopt (list "+libext+.a+.b" "+incdir+foodir" "+define+a+aval" "-f" "otherf" "-v" "library" "-y" "dir")) + +(defun verilog-getopt-file (filename) + "Read verilog options from the specified FILENAME." + (save-excursion + (let ((fns (verilog-library-filenames filename (buffer-file-name))) + (orig-buffer (current-buffer)) + line) + (if fns + (set-buffer (find-file-noselect (car fns))) + (error (concat (verilog-point-text) + "Can't find verilog-getopt-file -f file: " filename))) + (goto-char (point-min)) + (while (not (eobp)) + (setq line (buffer-substring (point) + (save-excursion (end-of-line) (point)))) + (forward-line 1) + (when (string-match "//" line) + (setq line (substring line 0 (match-beginning 0)))) + (save-excursion + (set-buffer orig-buffer) ; Variables are buffer-local, so need right context. + (verilog-getopt line)))))) + +(defun verilog-getopt-flags () + "Convert `verilog-library-flags' into standard library variables." + ;; If the flags are local, then all the outputs should be local also + (when (local-variable-p `verilog-library-flags (current-buffer)) + (make-variable-buffer-local 'verilog-library-extensions) + (make-variable-buffer-local 'verilog-library-directories) + (make-variable-buffer-local 'verilog-library-files) + (make-variable-buffer-local 'verilog-library-flags)) + ;; Allow user to customize + (run-hooks 'verilog-before-getopt-flags-hook) + ;; Process arguments + (verilog-getopt verilog-library-flags) + ;; Allow user to customize + (run-hooks 'verilog-getopt-flags-hook)) + +(defun verilog-add-list-unique (varref object) + "Append to VARREF list the given OBJECT, +unless it is already a member of the variable's list" + (unless (member object (symbol-value varref)) + (set varref (append (symbol-value varref) (list object)))) + varref) +;;(progn (setq l '()) (verilog-add-list-unique `l "a") (verilog-add-list-unique `l "a") l) + + +;; +;; Module name lookup +;; + +(defun verilog-module-inside-filename-p (module filename) + "Return point if MODULE is specified inside FILENAME, else nil. +Allows version control to check out the file if need be." + (and (or (file-exists-p filename) + (and + (condition-case nil + (fboundp 'vc-backend) + (error nil)) + (vc-backend filename))) + (let (pt) + (save-excursion + (set-buffer (find-file-noselect filename)) + (goto-char (point-min)) + (while (and + ;; It may be tempting to look for verilog-defun-re, don't, it slows things down a lot! + (verilog-re-search-forward-quick "\\<module\\>" nil t) + (verilog-re-search-forward-quick "[(;]" nil t)) + (if (equal module (verilog-read-module-name)) + (setq pt (point)))) + pt)))) + +(defun verilog-is-number (symbol) + "Return true if SYMBOL is number-like." + (or (string-match "^[0-9 \t:]+$" symbol) + (string-match "^[---]*[0-9]+$" symbol) + (string-match "^[0-9 \t]+'s?[hdxbo][0-9a-fA-F_xz? \t]*$" symbol) + )) + +(defun verilog-symbol-detick (symbol wing-it) + "Return a expanded SYMBOL name without any defines. +If the variable vh-{symbol} is defined, return that value. +If undefined, and WING-IT, return just SYMBOL without the tick, else nil." + (while (and symbol (string-match "^`" symbol)) + (setq symbol (substring symbol 1)) + (setq symbol + (if (boundp (intern (concat "vh-" symbol))) + ;; Emacs has a bug where boundp on a buffer-local + ;; variable in only one buffer returns t in another. + ;; This can confuse, so check for nil. + (let ((val (eval (intern (concat "vh-" symbol))))) + (if (eq val nil) + (if wing-it symbol nil) + val)) + (if wing-it symbol nil)))) + symbol) +;;(verilog-symbol-detick "`mod" nil) + +(defun verilog-symbol-detick-denumber (symbol) + "Return SYMBOL with defines converted and any numbers dropped to nil." + (when (string-match "^`" symbol) + ;; This only will work if the define is a simple signal, not + ;; something like a[b]. Sorry, it should be substituted into the parser + (setq symbol + (verilog-string-replace-matches + "\[[^0-9: \t]+\]" "" nil nil + (or (verilog-symbol-detick symbol nil) + (if verilog-auto-sense-defines-constant + "0" + symbol))))) + (if (verilog-is-number symbol) + nil + symbol)) + +(defun verilog-symbol-detick-text (text) + "Return TEXT with any without any known defines. +If the variable vh-{symbol} is defined, substitute that value." + (let ((ok t) symbol val) + (while (and ok (string-match "`\\([a-zA-Z0-9_]+\\)" text)) + (setq symbol (match-string 1 text)) + (message symbol) + (cond ((and + (boundp (intern (concat "vh-" symbol))) + ;; Emacs has a bug where boundp on a buffer-local + ;; variable in only one buffer returns t in another. + ;; This can confuse, so check for nil. + (setq val (eval (intern (concat "vh-" symbol))))) + (setq text (replace-match val nil nil text))) + (t (setq ok nil))))) + text) +;;(progn (setq vh-mod "`foo" vh-foo "bar") (verilog-symbol-detick-text "bar `mod `undefed")) + +(defun verilog-expand-dirnames (&optional dirnames) + "Return a list of existing directories given a list of wildcarded DIRNAMES. +Or, just the existing dirnames themselves if there are no wildcards." + (interactive) + (unless dirnames (error "`verilog-library-directories' should include at least '.'")) + (setq dirnames (reverse dirnames)) ; not nreverse + (let ((dirlist nil) + pattern dirfile dirfiles dirname root filename rest) + (while dirnames + (setq dirname (substitute-in-file-name (car dirnames)) + dirnames (cdr dirnames)) + (cond ((string-match (concat "^\\(\\|[/\\]*[^*?]*[/\\]\\)" ;; root + "\\([^/\\]*[*?][^/\\]*\\)" ;; filename with *? + "\\(.*\\)") ;; rest + dirname) + (setq root (match-string 1 dirname) + filename (match-string 2 dirname) + rest (match-string 3 dirname) + pattern filename) + ;; now replace those * and ? with .+ and . + ;; use ^ and /> to get only whole file names + ;;verilog-string-replace-matches + (setq pattern (verilog-string-replace-matches "[*]" ".+" nil nil pattern) + pattern (verilog-string-replace-matches "[?]" "." nil nil pattern) + + ;; Unfortunately allows abc/*/rtl to match abc/rtl + ;; because abc/.. shows up in dirfiles. Solutions welcome. + dirfiles (if (file-directory-p root) ; Ignore version control external + (directory-files root t pattern nil))) + (while dirfiles + (setq dirfile (expand-file-name (concat (car dirfiles) rest)) + dirfiles (cdr dirfiles)) + (if (file-directory-p dirfile) + (setq dirlist (cons dirfile dirlist)))) + ) + ;; Defaults + (t + (if (file-directory-p dirname) + (setq dirlist (cons dirname dirlist)))) + )) + dirlist)) +;;(verilog-expand-dirnames (list "." ".." "nonexist" "../*" "/home/wsnyder/*/v")) + +(defun verilog-library-filenames (filename current &optional check-ext) + "Return a search path to find the given FILENAME name. +Uses the CURRENT filename, `verilog-library-directories' and +`verilog-library-extensions' variables to build the path. +With optional CHECK-EXT also check `verilog-library-extensions'." + (let ((ckdir (verilog-expand-dirnames verilog-library-directories)) + fn outlist) + (while ckdir + (let ((ckext (if check-ext verilog-library-extensions `("")))) + (while ckext + (setq fn (expand-file-name + (concat filename (car ckext)) + (expand-file-name (car ckdir) (file-name-directory current)))) + (if (file-exists-p fn) + (setq outlist (cons fn outlist))) + (setq ckext (cdr ckext)))) + (setq ckdir (cdr ckdir))) + (nreverse outlist))) + +(defun verilog-module-filenames (module current) + "Return a search path to find the given MODULE name. +Uses the CURRENT filename, `verilog-library-extensions', +`verilog-library-directories' and `verilog-library-files' +variables to build the path." + ;; Return search locations for it + (append (list current) ; first, current buffer + (verilog-library-filenames module current t) + verilog-library-files)) ; finally, any libraries + +;; +;; Module Information +;; +;; Many of these functions work on "modi" a module information structure +;; A modi is: [module-name-string file-name begin-point] + +(defvar verilog-cache-enabled t + "If true, enable caching of signals, etc. Set to nil for debugging to make things SLOW!") + +(defvar verilog-modi-cache-list nil + "Cache of ((Module Function) Buf-Tick Buf-Modtime Func-Returns)... +For speeding up verilog-modi-get-* commands. +Buffer-local.") + +(defvar verilog-modi-cache-preserve-tick nil + "Modification tick after which the cache is still considered valid. +Use verilog-preserve-cache's to set") +(defvar verilog-modi-cache-preserve-buffer nil + "Modification tick after which the cache is still considered valid. +Use verilog-preserve-cache's to set") + +(defun verilog-modi-current () + "Return the modi structure for the module currently at point." + (let* (name pt) + ;; read current module's name + (save-excursion + (verilog-re-search-backward-quick verilog-defun-re nil nil) + (verilog-re-search-forward-quick "(" nil nil) + (setq name (verilog-read-module-name)) + (setq pt (point))) + ;; return + (vector name (or (buffer-file-name) (current-buffer)) pt))) + +(defvar verilog-modi-lookup-last-mod nil "Cache of last module looked up.") +(defvar verilog-modi-lookup-last-modi nil "Cache of last modi returned.") +(defvar verilog-modi-lookup-last-current nil "Cache of last `current-buffer' looked up.") +(defvar verilog-modi-lookup-last-tick nil "Cache of last `buffer-modified-tick' looked up.") + +(defun verilog-modi-lookup (module allow-cache &optional ignore-error) + "Find the file and point at which MODULE is defined. +If ALLOW-CACHE is set, check and remember cache of previous lookups. +Return modi if successful, else print message unless IGNORE-ERROR is true." + (let* ((current (or (buffer-file-name) (current-buffer)))) + (cond ((and verilog-modi-lookup-last-modi + verilog-cache-enabled + allow-cache + (equal verilog-modi-lookup-last-mod module) + (equal verilog-modi-lookup-last-current current) + (equal verilog-modi-lookup-last-tick (buffer-modified-tick))) + ;; ok as is + ) + (t (let* ((realmod (verilog-symbol-detick module t)) + (orig-filenames (verilog-module-filenames realmod current)) + (filenames orig-filenames) + pt) + (while (and filenames (not pt)) + (if (not (setq pt (verilog-module-inside-filename-p realmod (car filenames)))) + (setq filenames (cdr filenames)))) + (cond (pt (setq verilog-modi-lookup-last-modi + (vector realmod (car filenames) pt))) + (t (setq verilog-modi-lookup-last-modi nil) + (or ignore-error + (error (concat (verilog-point-text) + ": Can't locate " module " module definition" + (if (not (equal module realmod)) + (concat " (Expanded macro to " realmod ")") + "") + "\n Check the verilog-library-directories variable." + "\n I looked in (if not listed, doesn't exist):\n\t" + (mapconcat 'concat orig-filenames "\n\t"))))) + ) + (setq verilog-modi-lookup-last-mod module + verilog-modi-lookup-last-current current + verilog-modi-lookup-last-tick (buffer-modified-tick))))) + verilog-modi-lookup-last-modi + )) + +(defsubst verilog-modi-name (modi) + (aref modi 0)) +(defsubst verilog-modi-file-or-buffer (modi) + (aref modi 1)) +(defsubst verilog-modi-point (modi) + (aref modi 2)) + +(defun verilog-modi-filename (modi) + "Filename of MODI, or name of buffer if its never been saved." + (if (bufferp (verilog-modi-file-or-buffer modi)) + (or (buffer-file-name (verilog-modi-file-or-buffer modi)) + (buffer-name (verilog-modi-file-or-buffer modi))) + (verilog-modi-file-or-buffer modi))) + +(defun verilog-modi-goto (modi) + "Move point/buffer to specified MODI." + (or modi (error "Passed unfound modi to goto, check earlier")) + (set-buffer (if (bufferp (verilog-modi-file-or-buffer modi)) + (verilog-modi-file-or-buffer modi) + (find-file-noselect (verilog-modi-file-or-buffer modi)))) + (or (equal major-mode `verilog-mode) ;; Put into verilog mode to get syntax + (verilog-mode)) + (goto-char (verilog-modi-point modi))) + +(defun verilog-goto-defun-file (module) + "Move point to the file at which a given MODULE is defined." + (interactive "sGoto File for Module: ") + (let* ((modi (verilog-modi-lookup module nil))) + (when modi + (verilog-modi-goto modi) + (switch-to-buffer (current-buffer))))) + +(defun verilog-modi-cache-results (modi function) + "Run on MODI the given FUNCTION. Locate the module in a file. +Cache the output of function so next call may have faster access." + (let (func-returns fass) + (save-excursion + (verilog-modi-goto modi) + (if (and (setq fass (assoc (list (verilog-modi-name modi) function) + verilog-modi-cache-list)) + ;; Destroy caching when incorrect; Modified or file changed + (not (and verilog-cache-enabled + (or (equal (buffer-modified-tick) (nth 1 fass)) + (and verilog-modi-cache-preserve-tick + (<= verilog-modi-cache-preserve-tick (nth 1 fass)) + (equal verilog-modi-cache-preserve-buffer (current-buffer)))) + (equal (visited-file-modtime) (nth 2 fass))))) + (setq verilog-modi-cache-list nil + fass nil)) + (cond (fass + ;; Found + (setq func-returns (nth 3 fass))) + (t + ;; Read from file + ;; Clear then restore any hilighting to make emacs19 happy + (let ((fontlocked (when (and (boundp 'font-lock-mode) + font-lock-mode) + (font-lock-mode nil) + t))) + (setq func-returns (funcall function)) + (when fontlocked (font-lock-mode t))) + ;; Cache for next time + (make-variable-buffer-local 'verilog-modi-cache-list) + (setq verilog-modi-cache-list + (cons (list (list (verilog-modi-name modi) function) + (buffer-modified-tick) + (visited-file-modtime) + func-returns) + verilog-modi-cache-list))) + )) + ;; + func-returns)) + +(defun verilog-modi-cache-add (modi function element sig-list) + "Add function return results to the module cache. +Update MODI's cache for given FUNCTION so that the return ELEMENT of that +function now contains the additional SIG-LIST parameters." + (let (fass) + (save-excursion + (verilog-modi-goto modi) + (if (setq fass (assoc (list (verilog-modi-name modi) function) + verilog-modi-cache-list)) + (let ((func-returns (nth 3 fass))) + (aset func-returns element + (append sig-list (aref func-returns element)))))))) + +(defmacro verilog-preserve-cache (&rest body) + "Execute the BODY forms, allowing cache preservation within BODY. +This means that changes to the buffer will not result in the cache being +flushed. If the changes affect the modsig state, they must call the +modsig-cache-add-* function, else the results of later calls may be +incorrect. Without this, changes are assumed to be adding/removing signals +and invalidating the cache." + `(let ((verilog-modi-cache-preserve-tick (buffer-modified-tick)) + (verilog-modi-cache-preserve-buffer (current-buffer))) + (progn ,@body))) + +(defsubst verilog-modi-get-decls (modi) + (verilog-modi-cache-results modi 'verilog-read-decls)) + +(defsubst verilog-modi-get-sub-decls (modi) + (verilog-modi-cache-results modi 'verilog-read-sub-decls)) + +;; Signal reading for given module +;; Note these all take modi's - as returned from the verilog-modi-current function +(defsubst verilog-modi-get-outputs (modi) + (aref (verilog-modi-get-decls modi) 0)) +(defsubst verilog-modi-get-inouts (modi) + (aref (verilog-modi-get-decls modi) 1)) +(defsubst verilog-modi-get-inputs (modi) + (aref (verilog-modi-get-decls modi) 2)) +(defsubst verilog-modi-get-wires (modi) + (aref (verilog-modi-get-decls modi) 3)) +(defsubst verilog-modi-get-regs (modi) + (aref (verilog-modi-get-decls modi) 4)) +(defsubst verilog-modi-get-assigns (modi) + (aref (verilog-modi-get-decls modi) 5)) +(defsubst verilog-modi-get-consts (modi) + (aref (verilog-modi-get-decls modi) 6)) +(defsubst verilog-modi-get-gparams (modi) + (aref (verilog-modi-get-decls modi) 7)) +(defsubst verilog-modi-get-sub-outputs (modi) + (aref (verilog-modi-get-sub-decls modi) 0)) +(defsubst verilog-modi-get-sub-inouts (modi) + (aref (verilog-modi-get-sub-decls modi) 1)) +(defsubst verilog-modi-get-sub-inputs (modi) + (aref (verilog-modi-get-sub-decls modi) 2)) + + +(defun verilog-signals-matching-enum (in-list enum) + "Return all signals in IN-LIST matching the given ENUM." + (let (out-list) + (while in-list + (if (equal (verilog-sig-enum (car in-list)) enum) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + ;; New scheme + (let* ((enumvar (intern (concat "venum-" enum))) + (enumlist (and (boundp enumvar) (eval enumvar)))) + (while enumlist + (add-to-list 'out-list (list (car enumlist))) + (setq enumlist (cdr enumlist)))) + (nreverse out-list))) + +(defun verilog-signals-not-matching-regexp (in-list regexp) + "Return all signals in IN-LIST not matching the given REGEXP, if non-nil." + (if (not regexp) + in-list + (let (out-list) + (while in-list + (if (not (string-match regexp (verilog-sig-name (car in-list)))) + (setq out-list (cons (car in-list) out-list))) + (setq in-list (cdr in-list))) + (nreverse out-list)))) + +;; Combined +(defun verilog-modi-get-signals (modi) + (append + (verilog-modi-get-outputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-inputs modi) + (verilog-modi-get-wires modi) + (verilog-modi-get-regs modi) + (verilog-modi-get-assigns modi) + (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi))) + +(defun verilog-modi-get-ports (modi) + (append + (verilog-modi-get-outputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-inputs modi))) + +(defsubst verilog-modi-cache-add-outputs (modi sig-list) + (verilog-modi-cache-add modi 'verilog-read-decls 0 sig-list)) +(defsubst verilog-modi-cache-add-inouts (modi sig-list) + (verilog-modi-cache-add modi 'verilog-read-decls 1 sig-list)) +(defsubst verilog-modi-cache-add-inputs (modi sig-list) + (verilog-modi-cache-add modi 'verilog-read-decls 2 sig-list)) +(defsubst verilog-modi-cache-add-wires (modi sig-list) + (verilog-modi-cache-add modi 'verilog-read-decls 3 sig-list)) +(defsubst verilog-modi-cache-add-regs (modi sig-list) + (verilog-modi-cache-add modi 'verilog-read-decls 4 sig-list)) + +(defun verilog-signals-from-signame (signame-list) + "Return signals in standard form from SIGNAME-LIST, a simple list of signal names." + (mapcar (function (lambda (name) (list name nil nil))) + signame-list)) + +;; +;; Auto creation utilities +;; + +(defun verilog-auto-search-do (search-for func) + "Search for the given auto text SEARCH-FOR, and perform FUNC where it occurs." + (goto-char (point-min)) + (while (search-forward search-for nil t) + (if (not (save-excursion + (goto-char (match-beginning 0)) + (verilog-inside-comment-p))) + (funcall func)))) + +(defun verilog-auto-re-search-do (search-for func) + "Search for the given auto text SEARCH-FOR, and perform FUNC where it occurs." + (goto-char (point-min)) + (while (re-search-forward search-for nil t) + (if (not (save-excursion + (goto-char (match-beginning 0)) + (verilog-inside-comment-p))) + (funcall func)))) + +(defun verilog-insert-one-definition (sig type indent-pt) + "Print out a definition for SIGNAL of the given TYPE, +with appropriate INDENT-PT indentation." + (indent-to indent-pt) + (insert type) + (when (verilog-sig-signed sig) + (insert " " (verilog-sig-signed sig))) + (when (verilog-sig-multidim sig) + (insert " " (verilog-sig-multidim-string sig))) + (when (verilog-sig-bits sig) + (insert " " (verilog-sig-bits sig))) + (indent-to (max 24 (+ indent-pt 16))) + (unless (= (char-syntax (preceding-char)) ?\ ) + (insert " ")) ; Need space between "]name" if indent-to did nothing + (insert (verilog-sig-name sig))) + +(defun verilog-insert-definition (sigs direction indent-pt v2k &optional dont-sort) + "Print out a definition for a list of SIGS of the given DIRECTION, +with appropriate INDENT-PT indentation. If V2K, use Verilog 2001 I/O +format. Sort unless DONT-SORT. DIRECTION is normally wire/reg/output." + (or dont-sort + (setq sigs (sort (copy-alist sigs) `verilog-signals-sort-compare))) + (while sigs + (let ((sig (car sigs))) + (verilog-insert-one-definition + sig + ;; Want "type x" or "output type x", not "wire type x" + (cond ((verilog-sig-type sig) + (concat + (if (not (equal direction "wire")) + (concat direction " ")) + (verilog-sig-type sig))) + (t direction)) + indent-pt) + (insert (if v2k "," ";")) + (if (or (not (verilog-sig-comment sig)) + (equal "" (verilog-sig-comment sig))) + (insert "\n") + (indent-to (max 48 (+ indent-pt 40))) + (insert (concat "// " (verilog-sig-comment sig) "\n"))) + (setq sigs (cdr sigs))))) + +(eval-when-compile + (if (not (boundp 'indent-pt)) + (defvar indent-pt nil "Local used by insert-indent"))) + +(defun verilog-insert-indent (&rest stuff) + "Indent to position stored in local `indent-pt' variable, then insert STUFF. +Presumes that any newlines end a list element." + (let ((need-indent t)) + (while stuff + (if need-indent (indent-to indent-pt)) + (setq need-indent nil) + (insert (car stuff)) + (setq need-indent (string-match "\n$" (car stuff)) + stuff (cdr stuff))))) +;;(let ((indent-pt 10)) (verilog-insert-indent "hello\n" "addon" "there\n")) + +(defun verilog-repair-open-comma () + "If backwards-from-point is other than a open parenthesis insert comma." + (save-excursion + (verilog-backward-syntactic-ws) + (when (save-excursion + (backward-char 1) + (and (not (looking-at "[(,]")) + (progn + (verilog-re-search-backward "[(`]" nil t) + (looking-at "(")))) + (insert ",")))) + +(defun verilog-repair-close-comma () + "If point is at a comma followed by a close parenthesis, fix it. +This repairs those mis-inserted by a AUTOARG." + ;; It would be much nicer if Verilog allowed extra commas like Perl does! + (save-excursion + (verilog-forward-close-paren) + (backward-char 1) + (verilog-backward-syntactic-ws) + (backward-char 1) + (when (looking-at ",") + (delete-char 1)))) + +(defun verilog-get-list (start end) + "Return the elements of a comma separated list between START and END." + (interactive) + (let ((my-list (list)) + my-string) + (save-excursion + (while (< (point) end) + (when (re-search-forward "\\([^,{]+\\)" end t) + (setq my-string (verilog-string-remove-spaces (match-string 1))) + (setq my-list (nconc my-list (list my-string) )) + (goto-char (match-end 0)))) + my-list))) + +(defun verilog-make-width-expression (range-exp) + "Return an expression calculating the length of a range [x:y] in RANGE-EXP." + ;; strip off the [] + (cond ((not range-exp) + "1") + (t + (if (string-match "^\\[\\(.*\\)\\]$" range-exp) + (setq range-exp (match-string 1 range-exp))) + (cond ((not range-exp) + "1") + ((string-match "^\\s *\\([0-9]+\\)\\s *:\\s *\\([0-9]+\\)\\s *$" range-exp) + (int-to-string (1+ (abs (- (string-to-int (match-string 1 range-exp)) + (string-to-int (match-string 2 range-exp))))))) + ((string-match "^\\(.*\\)\\s *:\\s *\\(.*\\)\\s *$" range-exp) + (concat "(1+(" (match-string 1 range-exp) + ")" + (if (equal "0" (match-string 2 range-exp)) ;; Don't bother with -(0) + "" + (concat "-(" (match-string 2 range-exp) ")")) + ")")) + (t nil))))) +;;(verilog-make-width-expression "`A:`B") + +(defun verilog-typedef-name-p (variable-name) + "Return true if the VARIABLE-NAME is a type definition." + (when verilog-typedef-regexp + (string-match verilog-typedef-regexp variable-name))) + +;; +;; Auto deletion +;; + +(defun verilog-delete-autos-lined () + "Delete autos that occupy multiple lines, between begin and end comments." + (let ((pt (point))) + (forward-line 1) + (when (and + (looking-at "\\s-*// Beginning") + (search-forward "// End of automatic" nil t)) + ;; End exists + (end-of-line) + (delete-region pt (point)) + (forward-line 1)) + )) + +(defun verilog-forward-close-paren () + "Find the close parenthesis that match the current point, +ignore other close parenthesis with matching open parens" + (let ((parens 1)) + (while (> parens 0) + (unless (verilog-re-search-forward-quick "[()]" nil t) + (error "%s: Mismatching ()" (verilog-point-text))) + (cond ((= (preceding-char) ?\( ) + (setq parens (1+ parens))) + ((= (preceding-char) ?\) ) + (setq parens (1- parens))))))) + +(defun verilog-backward-open-paren () + "Find the open parenthesis that match the current point, +ignore other open parenthesis with matching close parens" + (let ((parens 1)) + (while (> parens 0) + (unless (verilog-re-search-backward-quick "[()]" nil t) + (error "%s: Mismatching ()" (verilog-point-text))) + (cond ((= (following-char) ?\) ) + (setq parens (1+ parens))) + ((= (following-char) ?\( ) + (setq parens (1- parens))))))) + +(defun verilog-backward-open-bracket () + "Find the open bracket that match the current point, +ignore other open bracket with matching close bracket" + (let ((parens 1)) + (while (> parens 0) + (unless (verilog-re-search-backward-quick "[][]" nil t) + (error "%s: Mismatching []" (verilog-point-text))) + (cond ((= (following-char) ?\] ) + (setq parens (1+ parens))) + ((= (following-char) ?\[ ) + (setq parens (1- parens))))))) + +(defun verilog-delete-to-paren () + "Delete the automatic inst/sense/arg created by autos. +Deletion stops at the matching end parenthesis." + (delete-region (point) + (save-excursion + (verilog-backward-open-paren) + (forward-sexp 1) ;; Moves to paren that closes argdecl's + (backward-char 1) + (point)))) + +(defun verilog-auto-star-safe () + "Return if a .* AUTOINST is safe to delete or expand. +It was created by the AUTOS themselves, or by the user." + (and verilog-auto-star-expand + (looking-at "[ \t\n\f,]*\\([)]\\|// \\(Outputs\\|Inouts\\|Inputs\\)\\)"))) + +(defun verilog-delete-auto-star-all () + "Delete a .* AUTOINST, if it is safe." + (when (verilog-auto-star-safe) + (verilog-delete-to-paren))) + +(defun verilog-delete-auto-star-implicit () + "Delete all .* implicit connections created by `verilog-auto-star'. +This function will be called automatically at save unless +`verilog-auto-star-save' is set, any non-templated expanded pins will be +removed." + (interactive) + (let (paren-pt indent have-close-paren) + (save-excursion + (goto-char (point-min)) + ;; We need to match these even outside of comments. + ;; For reasonable performance, we don't check if inside comments, sorry. + (while (re-search-forward "// Implicit \\.\\*" nil t) + (setq paren-pt (point)) + (beginning-of-line) + (setq have-close-paren + (save-excursion + (when (search-forward ");" paren-pt t) + (setq indent (current-indentation)) + t))) + (delete-region (point) (+ 1 paren-pt)) ; Nuke line incl CR + (when have-close-paren + ;; Delete extra commentary + (save-excursion + (while (progn + (forward-line -1) + (looking-at "\\s *//\\s *\\(Outputs\\|Inouts\\|Inputs\\)\n")) + (delete-region (match-beginning 0) (match-end 0)))) + ;; If it is simple, we can put the ); on the same line as the last text + (let ((rtn-pt (point))) + (save-excursion + (while (progn (backward-char 1) + (looking-at "[ \t\n\f]"))) + (when (looking-at ",") + (delete-region (+ 1 (point)) rtn-pt)))) + (when (bolp) + (indent-to indent)) + (insert ");\n") + ;; Still need to kill final comma - always is one as we put one after the .* + (re-search-backward ",") + (delete-char 1)))))) + +(defun verilog-delete-auto () + "Delete the automatic outputs, regs, and wires created by \\[verilog-auto]. +Use \\[verilog-auto] to re-insert the updated AUTOs. + +The hooks `verilog-before-delete-auto-hook' and `verilog-delete-auto-hook' are +called before and after this function, respectively." + (interactive) + (save-excursion + (if (buffer-file-name) + (find-file-noselect (buffer-file-name))) ;; To check we have latest version + ;; Allow user to customize + (run-hooks 'verilog-before-delete-auto-hook) + + ;; Remove those that have multi-line insertions + (verilog-auto-re-search-do "/\\*AUTO\\(OUTPUTEVERY\\|CONCATCOMMENT\\|WIRE\\|REG\\|DEFINEVALUE\\|REGINPUT\\|INPUT\\|OUTPUT\\|INOUT\\|RESET\\|TIEOFF\\|UNUSED\\)\\*/" + 'verilog-delete-autos-lined) + ;; Remove those that have multi-line insertions with parameters + (verilog-auto-re-search-do "/\\*AUTO\\(INOUTMODULE\\|ASCIIENUM\\)([^)]*)\\*/" + 'verilog-delete-autos-lined) + ;; Remove those that are in parenthesis + (verilog-auto-re-search-do "/\\*\\(AS\\|AUTO\\(ARG\\|CONCATWIDTH\\|INST\\|INSTPARAM\\|SENSE\\)\\)\\*/" + 'verilog-delete-to-paren) + ;; Do .* instantiations, but avoid removing any user pins by looking for our magic comments + (verilog-auto-re-search-do "\\.\\*" + 'verilog-delete-auto-star-all) + ;; Remove template comments ... anywhere in case was pasted after AUTOINST removed + (goto-char (point-min)) + (while (re-search-forward "\\s-*// \\(Templated\\|Implicit \\.\\*\\)[ \tLT0-9]*$" nil t) + (replace-match "")) + + ;; Final customize + (run-hooks 'verilog-delete-auto-hook))) + +;; +;; Auto inject +;; + +(defun verilog-inject-auto () + "Examine legacy non-AUTO code and insert AUTOs in appropriate places. + +Any always @ blocks with sensitivity lists that match computed lists will +be replaced with /*AS*/ comments. + +Any cells will get /*AUTOINST*/ added to the end of the pin list. Pins with +have identical names will be deleted. + +Argument lists will not be deleted, /*AUTOARG*/ will only be inserted to +support adding new ports. You may wish to delete older ports yourself. + +For example: + + module ex_inject (i, o); + input i; + input j; + output o; + always @ (i or j) + o = i | j; + cell cell (.foobar(baz), + .j(j)); + endmodule + +Typing \\[verilog-inject-auto] will make this into: + + module ex_inject (i, o/*AUTOARG*/ + // Inputs + j); + input i; + output o; + always @ (/*AS*/i or j) + o = i | j; + cell cell (.foobar(baz), + /*AUTOINST*/ + // Outputs + .j(j)); + endmodule" + (interactive) + (verilog-auto t)) + +(defun verilog-inject-arg () + "Inject AUTOARG into new code. See `verilog-inject-auto'." + ;; Presume one module per file. + (save-excursion + (goto-char (point-min)) + (while (verilog-re-search-forward-quick "\\<module\\>" nil t) + (let ((endmodp (save-excursion + (verilog-re-search-forward-quick "\\<endmodule\\>" nil t) + (point)))) + ;; See if there's already a comment .. inside a comment so not verilog-re-search + (when (not (re-search-forward "/\\*AUTOARG\\*/" endmodp t)) + (verilog-re-search-forward-quick ";" nil t) + (backward-char 1) + (verilog-backward-syntactic-ws) + (backward-char 1) ; Moves to paren that closes argdecl's + (when (looking-at ")") + (insert "/*AUTOARG*/"))))))) + +(defun verilog-inject-sense () + "Inject AUTOSENSE into new code. See `verilog-inject-auto'." + (save-excursion + (goto-char (point-min)) + (while (verilog-re-search-forward-quick "\\<always\\s *@\\s *(" nil t) + (let ((start-pt (point)) + (modi (verilog-modi-current)) + pre-sigs + got-sigs) + (backward-char 1) + (forward-sexp 1) + (backward-char 1) ;; End ) + (when (not (verilog-re-search-backward "/\\*\\(AUTOSENSE\\|AS\\)\\*/" start-pt t)) + (setq pre-sigs (verilog-signals-from-signame + (verilog-read-signals start-pt (point))) + got-sigs (verilog-auto-sense-sigs modi nil)) + (when (not (or (verilog-signals-not-in pre-sigs got-sigs) ; Both are equal? + (verilog-signals-not-in got-sigs pre-sigs))) + (delete-region start-pt (point)) + (insert "/*AS*/"))))))) + +(defun verilog-inject-inst () + "Inject AUTOINST into new code. See `verilog-inject-auto'." + (save-excursion + (goto-char (point-min)) + ;; It's hard to distinguish modules; we'll instead search for pins. + (while (verilog-re-search-forward-quick "\\.\\s *[a-zA-Z0-9`_\$]+\\s *(\\s *[a-zA-Z0-9`_\$]+\\s *)" nil t) + (verilog-backward-open-paren) ;; Inst start + (cond + ((= (preceding-char) ?\#) ;; #(...) parameter section, not pin. Skip. + (forward-char 1) + (verilog-forward-close-paren)) ;; Parameters done + (t + (forward-char 1) + (let ((indent-pt (+ (current-column))) + (end-pt (save-excursion (verilog-forward-close-paren) (point)))) + (cond ((verilog-re-search-forward "\\(/\\*AUTOINST\\*/\\|\\.\\*\\)" end-pt t) + (goto-char end-pt)) ;; Already there, continue search with next instance + (t + ;; Delete identical interconnect + (let ((case-fold-search nil)) ;; So we don't convert upper-to-lower, etc + (while (verilog-re-search-forward "\\.\\s *\\([a-zA-Z0-9`_\$]+\\)*\\s *(\\s *\\1\\s *)\\s *" end-pt t) + (delete-region (match-beginning 0) (match-end 0)) + (setq end-pt (- end-pt (- (match-end 0) (match-beginning 0)))) ;; Keep it correct + (while (or (looking-at "[ \t\n\f,]+") + (looking-at "//[^\n]*")) + (delete-region (match-beginning 0) (match-end 0)) + (setq end-pt (- end-pt (- (match-end 0) (match-beginning 0))))))) + (verilog-forward-close-paren) + (backward-char 1) + ;; Not verilog-re-search, as we don't want to strip comments + (while (re-search-backward "[ \t\n\f]+" (- (point) 1) t) + (delete-region (match-beginning 0) (match-end 0))) + (insert "\n") + (indent-to indent-pt) + (insert "/*AUTOINST*/"))))))))) + +;; +;; Auto save +;; + +(defun verilog-auto-save-check () + "On saving see if we need auto update." + (cond ((not verilog-auto-save-policy)) ; disabled + ((not (save-excursion + (save-match-data + (let ((case-fold-search nil)) + (goto-char (point-min)) + (re-search-forward "AUTO" nil t)))))) + ((eq verilog-auto-save-policy 'force) + (verilog-auto)) + ((not (buffer-modified-p))) + ((eq verilog-auto-update-tick (buffer-modified-tick))) ; up-to-date + ((eq verilog-auto-save-policy 'detect) + (verilog-auto)) + (t + (when (yes-or-no-p "AUTO statements not recomputed, do it now? ") + (verilog-auto)) + ;; Don't ask again if didn't update + (set (make-local-variable 'verilog-auto-update-tick) (buffer-modified-tick)) + )) + (when (not verilog-auto-star-save) + (verilog-delete-auto-star-implicit)) + nil) ;; Always return nil -- we don't write the file ourselves + +(defun verilog-auto-read-locals () + "Return file local variable segment at bottom of file." + (save-excursion + (goto-char (point-max)) + (if (re-search-backward "Local Variables:" nil t) + (buffer-substring-no-properties (point) (point-max)) + ""))) + +(defun verilog-auto-reeval-locals (&optional force) + "Read file local variable segment at bottom of file if it has changed. +If FORCE, always reread it." + (make-variable-buffer-local 'verilog-auto-last-file-locals) + (let ((curlocal (verilog-auto-read-locals))) + (when (or force (not (equal verilog-auto-last-file-locals curlocal))) + (setq verilog-auto-last-file-locals curlocal) + ;; Note this may cause this function to be recursively invoked. + ;; The above when statement will prevent it from recursing forever. + (hack-local-variables) + t))) + +;; +;; Auto creation +;; + +(defun verilog-auto-arg-ports (sigs message indent-pt) + "Print a list of ports for a AUTOINST. +Takes SIGS list, adds MESSAGE to front and inserts each at INDENT-PT." + (when sigs + (insert "\n") + (indent-to indent-pt) + (insert message) + (insert "\n") + (let ((space "")) + (indent-to indent-pt) + (while sigs + (cond ((> (+ 2 (current-column) (length (verilog-sig-name (car sigs)))) fill-column) + (insert "\n") + (indent-to indent-pt)) + (t (insert space))) + (insert (verilog-sig-name (car sigs)) ",") + (setq sigs (cdr sigs) + space " "))))) + +(defun verilog-auto-arg () + "Expand AUTOARG statements. +Replace the argument declarations at the beginning of the +module with ones automatically derived from input and output +statements. This can be dangerous if the module is instantiated +using position-based connections, so use only name-based when +instantiating the resulting module. Long lines are split based +on the `fill-column', see \\[set-fill-column]. + +Limitations: + Concatenation and outputting partial busses is not supported. + + Typedefs must match `verilog-typedef-regexp', which is disabled by default. + +For example: + + module ex_arg (/*AUTOARG*/); + input i; + output o; + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_arg (/*AUTOARG*/ + // Outputs + o, + // Inputs + i + ); + input i; + output o; + endmodule + +Any ports declared between the ( and /*AUTOARG*/ are presumed to be +predeclared and are not redeclared by AUTOARG. AUTOARG will make a +conservative guess on adding a comma for the first signal, if you have any +ifdefs or complicated expressions before the AUTOARG you will need to +choose the comma yourself. + +Avoid declaring ports manually, as it makes code harder to maintain." + (save-excursion + (let ((modi (verilog-modi-current)) + (skip-pins (aref (verilog-read-arg-pins) 0))) + (verilog-repair-open-comma) + (verilog-auto-arg-ports (verilog-signals-not-in + (verilog-modi-get-outputs modi) + skip-pins) + "// Outputs" + verilog-indent-level-declaration) + (verilog-auto-arg-ports (verilog-signals-not-in + (verilog-modi-get-inouts modi) + skip-pins) + "// Inouts" + verilog-indent-level-declaration) + (verilog-auto-arg-ports (verilog-signals-not-in + (verilog-modi-get-inputs modi) + skip-pins) + "// Inputs" + verilog-indent-level-declaration) + (verilog-repair-close-comma) + (unless (eq (char-before) ?/ ) + (insert "\n")) + (indent-to verilog-indent-level-declaration) + ))) + +(defun verilog-auto-inst-port-map (port-st) + nil) + +(defvar vector-skip-list nil) ; Prevent compile warning +(defvar vl-cell-type nil "See `verilog-auto-inst'.") ; Prevent compile warning +(defvar vl-cell-name nil "See `verilog-auto-inst'.") ; Prevent compile warning +(defvar vl-name nil "See `verilog-auto-inst'.") ; Prevent compile warning +(defvar vl-width nil "See `verilog-auto-inst'.") ; Prevent compile warning +(defvar vl-dir nil "See `verilog-auto-inst'.") ; Prevent compile warning + +(defun verilog-auto-inst-port (port-st indent-pt tpl-list tpl-num for-star) + "Print out a instantiation connection for this PORT-ST. +Insert to INDENT-PT, use template TPL-LIST. +@ are instantiation numbers, replaced with TPL-NUM. +@\"(expression @)\" are evaluated, with @ as a variable." + (let* ((port (verilog-sig-name port-st)) + (tpl-ass (or (assoc port (car tpl-list)) + (verilog-auto-inst-port-map port-st))) + ;; vl-* are documented for user use + (vl-name (verilog-sig-name port-st)) + (vl-width (verilog-sig-width port-st)) + (vl-bits (if (or verilog-auto-inst-vector + (not (assoc port vector-skip-list)) + (not (equal (verilog-sig-bits port-st) + (verilog-sig-bits (assoc port vector-skip-list))))) + (or (verilog-sig-bits port-st) "") + "")) + ;; Default if not found + (tpl-net (if (verilog-sig-multidim port-st) + (concat port "/*" (verilog-sig-multidim-string port-st) + vl-bits "*/") + (concat port vl-bits))) + (case-fold-search nil)) + ;; Find template + (cond (tpl-ass ; Template of exact port name + (setq tpl-net (nth 1 tpl-ass))) + ((nth 1 tpl-list) ; Wildcards in template, search them + (let ((wildcards (nth 1 tpl-list))) + (while wildcards + (when (string-match (nth 0 (car wildcards)) port) + (setq tpl-ass (car wildcards) ; so allow @ parsing + tpl-net (replace-match (nth 1 (car wildcards)) + t nil port))) + (setq wildcards (cdr wildcards)))))) + ;; Parse Templated variable + (when tpl-ass + ;; Evaluate @"(lispcode)" + (when (string-match "@\".*[^\\]\"" tpl-net) + (while (string-match "@\"\\(\\([^\\\"]*\\(\\\\.\\)*\\)*\\)\"" tpl-net) + (setq tpl-net + (concat + (substring tpl-net 0 (match-beginning 0)) + (save-match-data + (let* ((expr (match-string 1 tpl-net)) + (value + (progn + (setq expr (verilog-string-replace-matches "\\\\\"" "\"" nil nil expr)) + (setq expr (verilog-string-replace-matches "@" tpl-num nil nil expr)) + (prin1 (eval (car (read-from-string expr))) + (lambda (ch) ()))))) + (if (numberp value) (setq value (number-to-string value))) + value + )) + (substring tpl-net (match-end 0)))))) + ;; Replace @ and [] magic variables in final output + (setq tpl-net (verilog-string-replace-matches "@" tpl-num nil nil tpl-net)) + (setq tpl-net (verilog-string-replace-matches "\\[\\]" vl-bits nil nil tpl-net)) + ) + (indent-to indent-pt) + (insert "." port) + (indent-to verilog-auto-inst-column) + (insert "(" tpl-net "),") + (cond (tpl-ass + (indent-to (+ (if (< verilog-auto-inst-column 48) 24 16) + verilog-auto-inst-column)) + (insert " // Templated") + (when verilog-auto-inst-template-numbers + (insert " T" (int-to-string (nth 2 tpl-ass)) + " L" (int-to-string (nth 3 tpl-ass))))) + (for-star + (indent-to (+ (if (< verilog-auto-inst-column 48) 24 16) + verilog-auto-inst-column)) + (insert " // Implicit .\*"))) ;For some reason the . or * must be escaped... + (insert "\n"))) +;;(verilog-auto-inst-port (list "foo" "[5:0]") 10 (list (list "foo" "a@\"(% (+ @ 1) 4)\"a")) "3") +;;(x "incom[@\"(+ (* 8 @) 7)\":@\"(* 8 @)\"]") +;;(x ".out (outgo[@\"(concat (+ (* 8 @) 7) \\\":\\\" ( * 8 @))\"]));") + +(defun verilog-auto-inst-first () + "Insert , etc before first ever port in this instant, as part of \\[verilog-auto-inst]." + ;; Do we need a trailing comma? + ;; There maybe a ifdef or something similar before us. What a mess. Thus + ;; to avoid trouble we only insert on preceeding ) or *. + ;; Insert first port on new line + (insert "\n") ;; Must insert before search, so point will move forward if insert comma + (save-excursion + (verilog-re-search-backward "[^ \t\n\f]" nil nil) + (when (looking-at ")\\|\\*") ;; Generally don't insert, unless we are fairly sure + (forward-char 1) + (insert ",")))) + +(defun verilog-auto-star () + "Expand SystemVerilog .* pins, as part of \\[verilog-auto]. + +If `verilog-auto-star-expand' is set, .* pins are treated if they were +AUTOINST statements, otherwise they are ignored. For safety, Verilog-Mode +will also ignore any .* that are not last in your pin list (this prevents +it from deleting pins following the .* when it expands the AUTOINST.) + +On writing your file, unless `verilog-auto-star-save' is set, any +non-templated expanded pins will be removed. You may do this at any time +with \\[verilog-delete-auto-star-implicit]. + +If you are converting a module to use .* for the first time, you may wish +to use \\[verilog-inject-auto] and then replace the created AUTOINST with .*. + +See `verilog-auto-inst' for examples, templates, and more information." + (when (verilog-auto-star-safe) + (verilog-auto-inst))) + +(defun verilog-auto-inst () + "Expand AUTOINST statements, as part of \\[verilog-auto]. +Replace the pin connections to an instantiation with ones +automatically derived from the module header of the instantiated netlist. + +If `verilog-auto-star-expand' is set, also expand SystemVerilog .* ports, +and delete them before saving unless `verilog-auto-star-save' is set. +See `verilog-auto-star' for more information. + +Limitations: + Module names must be resolvable to filenames by adding a + `verilog-library-extensions', and being found in the same directory, or + by changing the variable `verilog-library-flags' or + `verilog-library-directories'. Macros `modname are translated through the + vh-{name} Emacs variable, if that is not found, it just ignores the `. + + In templates you must have one signal per line, ending in a ), or ));, + and have proper () nesting, including a final ); to end the template. + + Typedefs must match `verilog-typedef-regexp', which is disabled by default. + + SystemVerilog multidimmensional input/output has only experimental support. + +For example, first take the submodule inst.v: + + module inst (o,i) + output [31:0] o; + input i; + wire [31:0] o = {32{i}}; + endmodule + +This is then used in a upper level module: + + module ex_inst (o,i) + output o; + input i; + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_inst (o,i) + output o; + input i; + inst inst (/*AUTOINST*/ + // Outputs + .ov (ov[31:0]), + // Inputs + .i (i)); + endmodule + +Where the list of inputs and outputs came from the inst module. + +Exceptions: + + Unless you are instantiating a module multiple times, or the module is + something trivial like a adder, DO NOT CHANGE SIGNAL NAMES ACROSS HIERARCHY. + It just makes for unmaintainable code. To sanitize signal names, try + vrename from http://www.veripool.com + + When you need to violate this suggestion there are two ways to list + exceptions, placing them before the AUTOINST, or using templates. + + Any ports defined before the /*AUTOINST*/ are not included in the list of + automatics. This is similar to making a template as described below, but + is restricted to simple connections just like you normally make. Also note + that any signals before the AUTOINST will only be picked up by AUTOWIRE if + you have the appropriate // Input or // Output comment, and exactly the + same line formatting as AUTOINST itself uses. + + inst inst (// Inputs + .i (my_i_dont_mess_with_it), + /*AUTOINST*/ + // Outputs + .ov (ov[31:0])); + + +Templates: + + For multiple instantiations based upon a single template, create a + commented out template: + + /* instantiating_module_name AUTO_TEMPLATE ( + .sig3 (sigz[]), + ); + */ + + Templates go ABOVE the instantiation(s). When a instantiation is + expanded `verilog-mode' simply searches up for the closest template. + Thus you can have multiple templates for the same module, just alternate + between the template for a instantiation and the instantiation itself. + + The module name must be the same as the name of the module in the + instantiation name, and the code \"AUTO_TEMPLATE\" must be in these exact + words and capitalized. Only signals that must be different for each + instantiation need to be listed. + + Inside a template, a [] in a connection name (with nothing else inside + the brackets) will be replaced by the same bus subscript as it is being + connected to, or the [] will be removed if it is a single bit signal. + Generally it is a good idea to do this for all connections in a template, + as then they will work for any width signal, and with AUTOWIRE. See + PTL_BUS becoming PTL_BUSNEW below. + + If you have a complicated template, set `verilog-auto-inst-template-numbers' + to see which regexps are matching. Don't leave that mode set after + debugging is completed though, it will result in lots of extra differences + and merge conflicts. + + For example: + + /* psm_mas AUTO_TEMPLATE ( + .ptl_bus (ptl_busnew[]), + ); + */ + psm_mas ms2m (/*AUTOINST*/); + + Typing \\[verilog-auto] will make this into: + + psm_mas ms2m (/*AUTOINST*/ + // Outputs + .NotInTemplate (NotInTemplate), + .ptl_bus (ptl_busnew[3:0]), // Templated + .... + +@ Templates: + + It is common to instantiate a cell multiple times, so templates make it + trivial to substitute part of the cell name into the connection name. + + /* cell_type AUTO_TEMPLATE <optional \"REGEXP\"> ( + .sig1 (sigx[@]), + .sig2 (sigy[@\"(% (+ 1 @) 4)\"]), + ); + */ + + If no regular expression is provided immediately after the AUTO_TEMPLATE + keyword, then the @ character in any connection names will be replaced + with the instantiation number; the first digits found in the cell's + instantiation name. + + If a regular expression is provided, the @ character will be replaced + with the first \(\) grouping that matches against the cell name. Using a + regexp of \"\\([0-9]+\\)\" provides identical values for @ as when no + regexp is provided. If you use multiple layers of parenthesis, + \"test\\([^0-9]+\\)_\\([0-9]+\\)\" would replace @ with non-number + characters after test and before _, whereas + \"\\(test\\([a-z]+\\)_\\([0-9]+\\)\\)\" would replace @ with the entire + match. + + For example: + + /* psm_mas AUTO_TEMPLATE ( + .ptl_mapvalidx (ptl_mapvalid[@]), + .ptl_mapvalidp1x (ptl_mapvalid[@\"(% (+ 1 @) 4)\"]), + ); + */ + psm_mas ms2m (/*AUTOINST*/); + + Typing \\[verilog-auto] will make this into: + + psm_mas ms2m (/*AUTOINST*/ + // Outputs + .ptl_mapvalidx (ptl_mapvalid[2]), + .ptl_mapvalidp1x (ptl_mapvalid[3])); + + Note the @ character was replaced with the 2 from \"ms2m\". + + Alternatively, using a regular expression for @: + + /* psm_mas AUTO_TEMPLATE \"_\\([a-z]+\\)\" ( + .ptl_mapvalidx (@_ptl_mapvalid), + .ptl_mapvalidp1x (ptl_mapvalid_@), + ); + */ + psm_mas ms2_FOO (/*AUTOINST*/); + psm_mas ms2_BAR (/*AUTOINST*/); + + Typing \\[verilog-auto] will make this into: + + psm_mas ms2_FOO (/*AUTOINST*/ + // Outputs + .ptl_mapvalidx (FOO_ptl_mapvalid), + .ptl_mapvalidp1x (ptl_mapvalid_FOO)); + psm_mas ms2_BAR (/*AUTOINST*/ + // Outputs + .ptl_mapvalidx (BAR_ptl_mapvalid), + .ptl_mapvalidp1x (ptl_mapvalid_BAR)); + + +Regexp Templates: + + A template entry of the form + + .pci_req\\([0-9]+\\)_l (pci_req_jtag_[\\1]), + + will apply a Emacs style regular expression search for any port beginning + in pci_req followed by numbers and ending in _l and connecting that to + the pci_req_jtag_[] net, with the bus subscript coming from what matches + inside the first set of \\( \\). Thus pci_req2_l becomes pci_req_jtag_[2]. + + Since \\([0-9]+\\) is so common and ugly to read, a @ in the port name + does the same thing. (Note a @ in the connection/replacement text is + completely different -- still use \\1 there!) Thus this is the same as + the above template: + + .pci_req@_l (pci_req_jtag_[\\1]), + + Here's another example to remove the _l, useful when naming conventions + specify _ alone to mean active low. Note the use of [] to keep the bus + subscript: + + .\\(.*\\)_l (\\1_[]), + +Lisp Templates: + + First any regular expression template is expanded. + + If the syntax @\"( ... )\" is found in a connection, the expression in + quotes will be evaluated as a Lisp expression, with @ replaced by the + instantiation number. The MAPVALIDP1X example above would put @+1 modulo + 4 into the brackets. Quote all double-quotes inside the expression with + a leading backslash (\\\"). There are special variables defined that are + useful in these Lisp functions: + + vl-name Name portion of the input/output port + vl-bits Bus bits portion of the input/output port ('[2:0]') + vl-width Width of the input/output port ('3' for [2:0]) + May be a (...) expression if bits isn't a constant. + vl-dir Direction of the pin input/output/inout. + vl-cell-type Module name/type of the cell ('psm_mas') + vl-cell-name Instance name of the cell ('ms2m') + + Normal Lisp variables may be used in expressions. See + `verilog-read-defines' which can set vh-{definename} variables for use + here. Also, any comments of the form: + + /*AUTO_LISP(setq foo 1)*/ + + will evaluate any Lisp expression inside the parenthesis between the + beginning of the buffer and the point of the AUTOINST. This allows + functions to be defined or variables to be changed between instantiations. + + Note that when using lisp expressions errors may occur when @ is not a + number, you may need to use the standard Emacs Lisp functions + `number-to-string' and `string-to-number'. + + After the evaluation is completed, @ substitution and [] substitution + occur." + (save-excursion + ;; Find beginning + (let* ((pt (point)) + (for-star (save-excursion (backward-char 2) (looking-at "\\.\\*"))) + (indent-pt (save-excursion (verilog-backward-open-paren) + (1+ (current-column)))) + (verilog-auto-inst-column (max verilog-auto-inst-column + (+ 16 (* 8 (/ (+ indent-pt 7) 8))))) + (modi (verilog-modi-current)) + (vector-skip-list (unless verilog-auto-inst-vector + (verilog-modi-get-signals modi))) + submod submodi inst skip-pins tpl-list tpl-num did-first) + ;; Find module name that is instantiated + (setq submod (verilog-read-inst-module) + inst (verilog-read-inst-name) + vl-cell-type submod + vl-cell-name inst + skip-pins (aref (verilog-read-inst-pins) 0)) + + ;; Parse any AUTO_LISP() before here + (verilog-read-auto-lisp (point-min) pt) + + ;; Lookup position, etc of submodule + ;; Note this may raise an error + (when (setq submodi (verilog-modi-lookup submod t)) + ;; If there's a number in the instantiation, it may be a argument to the + ;; automatic variable instantiation program. + (let* ((tpl-info (verilog-read-auto-template submod)) + (tpl-regexp (aref tpl-info 0))) + (setq tpl-num (if (string-match tpl-regexp inst) + (match-string 1 inst) + "") + tpl-list (aref tpl-info 1))) + ;; Find submodule's signals and dump + (let ((sig-list (verilog-signals-not-in + (verilog-modi-get-outputs submodi) + skip-pins)) + (vl-dir "output")) + (when sig-list + (when (not did-first) (verilog-auto-inst-first) (setq did-first t)) + (indent-to indent-pt) + (insert "// Outputs\n") ;; Note these are searched for in verilog-read-sub-decls + (mapcar (function (lambda (port) + (verilog-auto-inst-port port indent-pt tpl-list tpl-num for-star))) + sig-list))) + (let ((sig-list (verilog-signals-not-in + (verilog-modi-get-inouts submodi) + skip-pins)) + (vl-dir "inout")) + (when sig-list + (when (not did-first) (verilog-auto-inst-first) (setq did-first t)) + (indent-to indent-pt) + (insert "// Inouts\n") + (mapcar (function (lambda (port) + (verilog-auto-inst-port port indent-pt tpl-list tpl-num for-star))) + sig-list))) + (let ((sig-list (verilog-signals-not-in + (verilog-modi-get-inputs submodi) + skip-pins)) + (vl-dir "input")) + (when sig-list + (when (not did-first) (verilog-auto-inst-first) (setq did-first t)) + (indent-to indent-pt) + (insert "// Inputs\n") + (mapcar (function (lambda (port) + (verilog-auto-inst-port port indent-pt tpl-list tpl-num for-star))) + sig-list))) + ;; Kill extra semi + (save-excursion + (cond (did-first + (re-search-backward "," pt t) + (delete-char 1) + (insert ");") + (search-forward "\n") ;; Added by inst-port + (delete-backward-char 1) + (if (search-forward ")" nil t) ;; From user, moved up a line + (delete-backward-char 1)) + (if (search-forward ";" nil t) ;; Don't error if user had syntax error and forgot it + (delete-backward-char 1)) + ))) + )))) + +(defun verilog-auto-inst-param () + "Expand AUTOINSTPARAM statements, as part of \\[verilog-auto]. +Replace the parameter connections to an instantiation with ones +automatically derived from the module header of the instantiated netlist. + +See \\[verilog-auto-inst] for limitations, and templates to customize the +output. + +For example, first take the submodule inst.v: + + module inst (o,i) + parameter PAR; + endmodule + +This is then used in a upper level module: + + module ex_inst (o,i) + parameter PAR; + inst #(/*AUTOINSTPARAM*/) + inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_inst (o,i) + output o; + input i; + inst (/*AUTOINSTPARAM*/ + // Parameters + .PAR (PAR)); + inst (/*AUTOINST*/); + endmodule + +Where the list of parameter connections come from the inst module. + +Templates: + + You can customize the parameter connections using AUTO_TEMPLATEs, + just as you would with \\[verilog-auto-inst]." + (save-excursion + ;; Find beginning + (let* ((pt (point)) + (indent-pt (save-excursion (verilog-backward-open-paren) + (1+ (current-column)))) + (verilog-auto-inst-column (max verilog-auto-inst-column + (+ 16 (* 8 (/ (+ indent-pt 7) 8))))) + (modi (verilog-modi-current)) + (vector-skip-list (unless verilog-auto-inst-vector + (verilog-modi-get-signals modi))) + submod submodi inst skip-pins tpl-list tpl-num did-first) + ;; Find module name that is instantiated + (setq submod (save-excursion + ;; Get to the point where AUTOINST normally is to read the module + (verilog-re-search-forward-quick "[(;]" nil nil) + (verilog-read-inst-module)) + inst (save-excursion + ;; Get to the point where AUTOINST normally is to read the module + (verilog-re-search-forward-quick "[(;]" nil nil) + (verilog-read-inst-name)) + vl-cell-type submod + vl-cell-name inst + skip-pins (aref (verilog-read-inst-pins) 0)) + + ;; Parse any AUTO_LISP() before here + (verilog-read-auto-lisp (point-min) pt) + + ;; Lookup position, etc of submodule + ;; Note this may raise an error + (when (setq submodi (verilog-modi-lookup submod t)) + ;; If there's a number in the instantiation, it may be a argument to the + ;; automatic variable instantiation program. + (let* ((tpl-info (verilog-read-auto-template submod)) + (tpl-regexp (aref tpl-info 0))) + (setq tpl-num (if (string-match tpl-regexp inst) + (match-string 1 inst) + "") + tpl-list (aref tpl-info 1))) + ;; Find submodule's signals and dump + (let ((sig-list (verilog-signals-not-in + (verilog-modi-get-gparams submodi) + skip-pins)) + (vl-dir "parameter")) + (when sig-list + (when (not did-first) (verilog-auto-inst-first) (setq did-first t)) + (indent-to indent-pt) + (insert "// Parameters\n") ;; Note these are searched for in verilog-read-sub-decls + (mapcar (function (lambda (port) + (verilog-auto-inst-port port indent-pt tpl-list tpl-num nil))) + sig-list))) + ;; Kill extra semi + (save-excursion + (cond (did-first + (re-search-backward "," pt t) + (delete-char 1) + (insert ")") + (search-forward "\n") ;; Added by inst-port + (delete-backward-char 1) + (if (search-forward ")" nil t) ;; From user, moved up a line + (delete-backward-char 1)) + ))) + )))) + +(defun verilog-auto-reg () + "Expand AUTOREG statements, as part of \\[verilog-auto]. +Make reg statements for any output that isn't already declared, +and isn't a wire output from a block. + +Limitations: + This ONLY detects outputs of AUTOINSTants (see `verilog-read-sub-decls'). + + This does NOT work on memories, declare those yourself. + +An example: + + module ex_reg (o,i) + output o; + input i; + /*AUTOREG*/ + always o = i; + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_reg (o,i) + output o; + input i; + /*AUTOREG*/ + // Beginning of automatic regs (for this module's undeclared outputs) + reg o; + // End of automatics + always o = i; + endmodule" + (save-excursion + ;; Point must be at insertion point. + (let* ((indent-pt (current-indentation)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (verilog-modi-get-outputs modi) + (append (verilog-modi-get-wires modi) + (verilog-modi-get-regs modi) + (verilog-modi-get-assigns modi) + (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi) + (verilog-modi-get-sub-outputs modi) + (verilog-modi-get-sub-inouts modi) + )))) + (forward-line 1) + (when sig-list + (verilog-insert-indent "// Beginning of automatic regs (for this module's undeclared outputs)\n") + (verilog-insert-definition sig-list "reg" indent-pt nil) + (verilog-modi-cache-add-regs modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + ))) + +(defun verilog-auto-reg-input () + "Expand AUTOREGINPUT statements, as part of \\[verilog-auto]. +Make reg statements instantiation inputs that aren't already declared. +This is useful for making a top level shell for testing the module that is +to be instantiated. + +Limitations: + This ONLY detects inputs of AUTOINSTants (see `verilog-read-sub-decls'). + + This does NOT work on memories, declare those yourself. + +An example (see `verilog-auto-inst' for what else is going on here): + + module ex_reg_input (o,i) + output o; + input i; + /*AUTOREGINPUT*/ + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_reg_input (o,i) + output o; + input i; + /*AUTOREGINPUT*/ + // Beginning of automatic reg inputs (for undeclared ... + reg [31:0] iv; // From inst of inst.v + // End of automatics + inst inst (/*AUTOINST*/ + // Outputs + .o (o[31:0]), + // Inputs + .iv (iv)); + endmodule" + (save-excursion + ;; Point must be at insertion point. + (let* ((indent-pt (current-indentation)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-combine-bus + (verilog-signals-not-in + (append (verilog-modi-get-sub-inputs modi) + (verilog-modi-get-sub-inouts modi)) + (verilog-modi-get-signals modi) + )))) + (forward-line 1) + (when sig-list + (verilog-insert-indent "// Beginning of automatic reg inputs (for undeclared instantiated-module inputs)\n") + (verilog-insert-definition sig-list "reg" indent-pt nil) + (verilog-modi-cache-add-regs modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + ))) + +(defun verilog-auto-wire () + "Expand AUTOWIRE statements, as part of \\[verilog-auto]. +Make wire statements for instantiations outputs that aren't +already declared. + +Limitations: + This ONLY detects outputs of AUTOINSTants (see `verilog-read-sub-decls'), + and all busses must have widths, such as those from AUTOINST, or using [] + in AUTO_TEMPLATEs. + + This does NOT work on memories or SystemVerilog .name connections, + declare those yourself. + + Verilog-mode will add \"Couldn't Merge\" comments to signals it cannot + determine how to bus together. This occurs when you have ports with + non-numeric or non-sequential bus subscripts. If Verilog-Mode + mis-guessed, you'll have to declare them yourself. + +An example (see `verilog-auto-inst' for what else is going on here): + + module ex_wire (o,i) + output o; + input i; + /*AUTOWIRE*/ + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_wire (o,i) + output o; + input i; + /*AUTOWIRE*/ + // Beginning of automatic wires + wire [31:0] ov; // From inst of inst.v + // End of automatics + inst inst (/*AUTOINST*/ + // Outputs + .ov (ov[31:0]), + // Inputs + .i (i)); + wire o = | ov; + endmodule" + (save-excursion + ;; Point must be at insertion point. + (let* ((indent-pt (current-indentation)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-combine-bus + (verilog-signals-not-in + (append (verilog-modi-get-sub-outputs modi) + (verilog-modi-get-sub-inouts modi)) + (verilog-modi-get-signals modi) + )))) + (forward-line 1) + (when sig-list + (verilog-insert-indent "// Beginning of automatic wires (for undeclared instantiated-module outputs)\n") + (verilog-insert-definition sig-list "wire" indent-pt nil) + (verilog-modi-cache-add-wires modi sig-list) + (verilog-insert-indent "// End of automatics\n") + (when nil ;; Too slow on huge modules, plus makes everyone's module change + (beginning-of-line) + (setq pnt (point)) + (verilog-pretty-declarations) + (goto-char pnt) + (verilog-pretty-expr "//"))) + ))) + +(defun verilog-auto-output () + "Expand AUTOOUTPUT statements, as part of \\[verilog-auto]. +Make output statements for any output signal from an /*AUTOINST*/ that +isn't a input to another AUTOINST. This is useful for modules which +only instantiate other modules. + +Limitations: + This ONLY detects outputs of AUTOINSTants (see `verilog-read-sub-decls'). + + If placed inside the parenthesis of a module declaration, it creates + Verilog 2001 style, else uses Verilog 1995 style. + + If any concatenation, or bit-subscripts are missing in the AUTOINSTant's + instantiation, all bets are off. (For example due to a AUTO_TEMPLATE). + + Typedefs must match `verilog-typedef-regexp', which is disabled by default. + + Signals matching `verilog-auto-output-ignore-regexp' are not included. + +An example (see `verilog-auto-inst' for what else is going on here): + + module ex_output (ov,i) + input i; + /*AUTOOUTPUT*/ + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_output (ov,i) + input i; + /*AUTOOUTPUT*/ + // Beginning of automatic outputs (from unused autoinst outputs) + output [31:0] ov; // From inst of inst.v + // End of automatics + inst inst (/*AUTOINST*/ + // Outputs + .ov (ov[31:0]), + // Inputs + .i (i)); + endmodule" + (save-excursion + ;; Point must be at insertion point. + (let* ((indent-pt (current-indentation)) + (v2k (verilog-in-paren)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (verilog-modi-get-sub-outputs modi) + (append (verilog-modi-get-outputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-sub-inputs modi) + (verilog-modi-get-sub-inouts modi) + )))) + (setq sig-list (verilog-signals-not-matching-regexp + sig-list verilog-auto-output-ignore-regexp)) + (forward-line 1) + (when v2k (verilog-repair-open-comma)) + (when sig-list + (verilog-insert-indent "// Beginning of automatic outputs (from unused autoinst outputs)\n") + (verilog-insert-definition sig-list "output" indent-pt v2k) + (verilog-modi-cache-add-outputs modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + (when v2k (verilog-repair-close-comma)) + ))) + +(defun verilog-auto-output-every () + "Expand AUTOOUTPUTEVERY statements, as part of \\[verilog-auto]. +Make output statements for any signals that aren't primary inputs or +outputs already. This makes every signal in the design a output. This is +useful to get Synopsys to preserve every signal in the design, since it +won't optimize away the outputs. + +An example: + + module ex_output_every (o,i,tempa,tempb) + output o; + input i; + /*AUTOOUTPUTEVERY*/ + wire tempa = i; + wire tempb = tempa; + wire o = tempb; + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_output_every (o,i,tempa,tempb) + output o; + input i; + /*AUTOOUTPUTEVERY*/ + // Beginning of automatic outputs (every signal) + output tempb; + output tempa; + // End of automatics + wire tempa = i; + wire tempb = tempa; + wire o = tempb; + endmodule" + (save-excursion + ;;Point must be at insertion point + (let* ((indent-pt (current-indentation)) + (v2k (verilog-in-paren)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-combine-bus + (verilog-signals-not-in + (verilog-modi-get-signals modi) + (verilog-modi-get-ports modi) + )))) + (forward-line 1) + (when v2k (verilog-repair-open-comma)) + (when sig-list + (verilog-insert-indent "// Beginning of automatic outputs (every signal)\n") + (verilog-insert-definition sig-list "output" indent-pt v2k) + (verilog-modi-cache-add-outputs modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + (when v2k (verilog-repair-close-comma)) + ))) + +(defun verilog-auto-input () + "Expand AUTOINPUT statements, as part of \\[verilog-auto]. +Make input statements for any input signal into an /*AUTOINST*/ that +isn't declared elsewhere inside the module. This is useful for modules which +only instantiate other modules. + +Limitations: + This ONLY detects outputs of AUTOINSTants (see `verilog-read-sub-decls'). + + If placed inside the parenthesis of a module declaration, it creates + Verilog 2001 style, else uses Verilog 1995 style. + + If any concatenation, or bit-subscripts are missing in the AUTOINSTant's + instantiation, all bets are off. (For example due to a AUTO_TEMPLATE). + + Typedefs must match `verilog-typedef-regexp', which is disabled by default. + + Signals matching `verilog-auto-input-ignore-regexp' are not included. + +An example (see `verilog-auto-inst' for what else is going on here): + + module ex_input (ov,i) + output [31:0] ov; + /*AUTOINPUT*/ + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_input (ov,i) + output [31:0] ov; + /*AUTOINPUT*/ + // Beginning of automatic inputs (from unused autoinst inputs) + input i; // From inst of inst.v + // End of automatics + inst inst (/*AUTOINST*/ + // Outputs + .ov (ov[31:0]), + // Inputs + .i (i)); + endmodule" + (save-excursion + (let* ((indent-pt (current-indentation)) + (v2k (verilog-in-paren)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (verilog-modi-get-sub-inputs modi) + (append (verilog-modi-get-inputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-wires modi) + (verilog-modi-get-regs modi) + (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi) + (verilog-modi-get-sub-outputs modi) + (verilog-modi-get-sub-inouts modi) + )))) + (setq sig-list (verilog-signals-not-matching-regexp + sig-list verilog-auto-input-ignore-regexp)) + (forward-line 1) + (when v2k (verilog-repair-open-comma)) + (when sig-list + (verilog-insert-indent "// Beginning of automatic inputs (from unused autoinst inputs)\n") + (verilog-insert-definition sig-list "input" indent-pt v2k) + (verilog-modi-cache-add-inputs modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + (when v2k (verilog-repair-close-comma)) + ))) + +(defun verilog-auto-inout () + "Expand AUTOINOUT statements, as part of \\[verilog-auto]. +Make inout statements for any inout signal in an /*AUTOINST*/ that +isn't declared elsewhere inside the module. + +Limitations: + This ONLY detects outputs of AUTOINSTants (see `verilog-read-sub-decls'). + + If placed inside the parenthesis of a module declaration, it creates + Verilog 2001 style, else uses Verilog 1995 style. + + If any concatenation, or bit-subscripts are missing in the AUTOINSTant's + instantiation, all bets are off. (For example due to a AUTO_TEMPLATE). + + Typedefs must match `verilog-typedef-regexp', which is disabled by default. + + Signals matching `verilog-auto-inout-ignore-regexp' are not included. + +An example (see `verilog-auto-inst' for what else is going on here): + + module ex_inout (ov,i) + input i; + /*AUTOINOUT*/ + inst inst (/*AUTOINST*/); + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_inout (ov,i) + input i; + /*AUTOINOUT*/ + // Beginning of automatic inouts (from unused autoinst inouts) + inout [31:0] ov; // From inst of inst.v + // End of automatics + inst inst (/*AUTOINST*/ + // Inouts + .ov (ov[31:0]), + // Inputs + .i (i)); + endmodule" + (save-excursion + ;; Point must be at insertion point. + (let* ((indent-pt (current-indentation)) + (v2k (verilog-in-paren)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (verilog-modi-get-sub-inouts modi) + (append (verilog-modi-get-outputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-inputs modi) + (verilog-modi-get-sub-inputs modi) + (verilog-modi-get-sub-outputs modi) + )))) + (setq sig-list (verilog-signals-not-matching-regexp + sig-list verilog-auto-inout-ignore-regexp)) + (forward-line 1) + (when v2k (verilog-repair-open-comma)) + (when sig-list + (verilog-insert-indent "// Beginning of automatic inouts (from unused autoinst inouts)\n") + (verilog-insert-definition sig-list "inout" indent-pt v2k) + (verilog-modi-cache-add-inouts modi sig-list) + (verilog-insert-indent "// End of automatics\n")) + (when v2k (verilog-repair-close-comma)) + ))) + +(defun verilog-auto-inout-module () + "Expand AUTOINOUTMODULE statements, as part of \\[verilog-auto]. +Take input/output/inout statements from the specified module and insert +into the current module. This is useful for making null templates and +shell modules which need to have identical I/O with another module. Any +I/O which are already defined in this module will not be redefined. + +Limitations: + If placed inside the parenthesis of a module declaration, it creates + Verilog 2001 style, else uses Verilog 1995 style. + + Concatenation and outputting partial busses is not supported. + + Module names must be resolvable to filenames. See `verilog-auto-inst'. + + Signals are not inserted in the same order as in the original module, + though they will appear to be in the same order to a AUTOINST + instantiating either module. + +An example: + + module ex_shell (/*AUTOARG*/) + /*AUTOINOUTMODULE(\"ex_main\")*/ + endmodule + + module ex_main (i,o,io) + input i; + output o; + inout io; + endmodule + +Typing \\[verilog-auto] will make this into: + + module ex_shell (/*AUTOARG*/i,o,io) + /*AUTOINOUTMODULE(\"ex_main\")*/ + // Beginning of automatic in/out/inouts (from specific module) + input i; + output o; + inout io; + // End of automatics + endmodule" + (save-excursion + (let* ((submod (car (verilog-read-auto-params 1))) submodi) + ;; Lookup position, etc of co-module + ;; Note this may raise an error + (when (setq submodi (verilog-modi-lookup submod t)) + (let* ((indent-pt (current-indentation)) + (v2k (verilog-in-paren)) + (modi (verilog-modi-current)) + (sig-list-i (verilog-signals-not-in + (verilog-modi-get-inputs submodi) + (append (verilog-modi-get-inputs modi)))) + (sig-list-o (verilog-signals-not-in + (verilog-modi-get-outputs submodi) + (append (verilog-modi-get-outputs modi)))) + (sig-list-io (verilog-signals-not-in + (verilog-modi-get-inouts submodi) + (append (verilog-modi-get-inouts modi))))) + (forward-line 1) + (when v2k (verilog-repair-open-comma)) + (when (or sig-list-i sig-list-o sig-list-io) + (verilog-insert-indent "// Beginning of automatic in/out/inouts (from specific module)\n") + ;; Don't sort them so a upper AUTOINST will match the main module + (verilog-insert-definition sig-list-o "output" indent-pt v2k t) + (verilog-insert-definition sig-list-io "inout" indent-pt v2k t) + (verilog-insert-definition sig-list-i "input" indent-pt v2k t) + (verilog-modi-cache-add-inputs modi sig-list-i) + (verilog-modi-cache-add-outputs modi sig-list-o) + (verilog-modi-cache-add-inouts modi sig-list-io) + (verilog-insert-indent "// End of automatics\n")) + (when v2k (verilog-repair-close-comma)) + ))))) + +(defun verilog-auto-sense-sigs (modi presense-sigs) + "Return list of signals for current AUTOSENSE block." + (let* ((sigss (verilog-read-always-signals)) + (sig-list (verilog-signals-not-params + (verilog-signals-not-in (verilog-alw-get-inputs sigss) + (append (and (not verilog-auto-sense-include-inputs) + (verilog-alw-get-outputs sigss)) + (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi) + presense-sigs))))) + sig-list)) + +(defun verilog-auto-sense () + "Expand AUTOSENSE statements, as part of \\[verilog-auto]. +Replace the always (/*AUTOSENSE*/) sensitivity list (/*AS*/ for short) +with one automatically derived from all inputs declared in the always +statement. Signals that are generated within the same always block are NOT +placed into the sensitivity list (see `verilog-auto-sense-include-inputs'). +Long lines are split based on the `fill-column', see \\[set-fill-column]. + +Limitations: + Verilog does not allow memories (multidimensional arrays) in sensitivity + lists. AUTOSENSE will thus exclude them, and add a /*memory or*/ comment. + +Constant signals: + AUTOSENSE cannot always determine if a `define is a constant or a signal + (it could be in a include file for example). If a `define or other signal + is put into the AUTOSENSE list and is not desired, use the AUTO_CONSTANT + declaration anywhere in the module (parenthesis are required): + + /* AUTO_CONSTANT ( `this_is_really_constant_dont_autosense_it ) */ + + Better yet, use a parameter, which will be understood to be constant + automatically. + +OOps! + If AUTOSENSE makes a mistake, please report it. (First try putting + a begin/end after your always!) As a workaround, if a signal that + shouldn't be in the sensitivity list was, use the AUTO_CONSTANT above. + If a signal should be in the sensitivity list wasn't, placing it before + the /*AUTOSENSE*/ comment will prevent it from being deleted when the + autos are updated (or added if it occurs there already). + +An example: + + always @ (/*AUTOSENSE*/) begin + /* AUTO_CONSTANT (`constant) */ + outin = ina | inb | `constant; + out = outin; + end + +Typing \\[verilog-auto] will make this into: + + always @ (/*AUTOSENSE*/ina or inb) begin + /* AUTO_CONSTANT (`constant) */ + outin = ina | inb | `constant; + out = outin; + end" + (save-excursion + ;; Find beginning + (let* ((start-pt (save-excursion + (verilog-re-search-backward "(" nil t) + (point))) + (indent-pt (save-excursion + (or (and (goto-char start-pt) (1+ (current-column))) + (current-indentation)))) + (modi (verilog-modi-current)) + (sig-memories (verilog-signals-memory + (append + (verilog-modi-get-regs modi) + (verilog-modi-get-wires modi)))) + sig-list not-first presense-sigs) + ;; Read signals in always, eliminate outputs from sense list + (setq presense-sigs (verilog-signals-from-signame + (save-excursion + (verilog-read-signals start-pt (point))))) + (setq sig-list (verilog-auto-sense-sigs modi presense-sigs)) + (when sig-memories + (let ((tlen (length sig-list))) + (setq sig-list (verilog-signals-not-in sig-list sig-memories)) + (if (not (eq tlen (length sig-list))) (insert " /*memory or*/ ")))) + (if (and presense-sigs ;; Add a "or" if not "(.... or /*AUTOSENSE*/" + (save-excursion (goto-char (point)) + (verilog-re-search-backward "[a-zA-Z0-9$_.%`]+" start-pt t) + (verilog-re-search-backward "\\s-" start-pt t) + (while (looking-at "\\s-`endif") + (verilog-re-search-backward "[a-zA-Z0-9$_.%`]+" start-pt t) + (verilog-re-search-backward "\\s-" start-pt t)) + (not (looking-at "\\s-or\\b")))) + (setq not-first t)) + (setq sig-list (sort sig-list `verilog-signals-sort-compare)) + (while sig-list + (cond ((> (+ 4 (current-column) (length (verilog-sig-name (car sig-list)))) fill-column) ;+4 for width of or + (insert "\n") + (indent-to indent-pt) + (if not-first (insert "or "))) + (not-first (insert " or "))) + (insert (verilog-sig-name (car sig-list))) + (setq sig-list (cdr sig-list) + not-first t)) + ))) + +(defun verilog-auto-reset () + "Expand AUTORESET statements, as part of \\[verilog-auto]. +Replace the /*AUTORESET*/ comment with code to initialize all +registers set elsewhere in the always block. + +Limitations: + AUTORESET will not clear memories. + + AUTORESET uses <= if there are any <= in the block, else it uses =. + +/*AUTORESET*/ presumes that any signals mentioned between the previous +begin/case/if statement and the AUTORESET comment are being reset manually +and should not be automatically reset. This includes omitting any signals +used on the right hand side of assignments. + +By default, AUTORESET will include the width of the signal in the autos, +this is a recent change. To control this behavior, see +`verilog-auto-reset-widths'. + +AUTORESET ties signals to deasserted, which is presumed to be zero. +Signals that match `verilog-active-low-regexp' will be deasserted by tieing +them to a one. + +An example: + + always @(posedge clk or negedge reset_l) begin + if (!reset_l) begin + c <= 1; + /*AUTORESET*/ + end + else begin + a <= in_a; + b <= in_b; + c <= in_c; + end + end + +Typing \\[verilog-auto] will make this into: + + always @(posedge core_clk or negedge reset_l) begin + if (!reset_l) begin + c <= 1; + /*AUTORESET*/ + // Beginning of autoreset for uninitialized flops + a <= 0; + b <= 0; + // End of automatics + end + else begin + a <= in_a; + b <= in_b; + c <= in_c; + end + end" + + (interactive) + (save-excursion + ;; Find beginning + (let* ((indent-pt (current-indentation)) + (modi (verilog-modi-current)) + (all-list (verilog-modi-get-signals modi)) + sigss sig-list prereset-sigs assignment-str) + ;; Read signals in always, eliminate outputs from reset list + (setq prereset-sigs (verilog-signals-from-signame + (save-excursion + (verilog-read-signals + (save-excursion + (verilog-re-search-backward "\\(@\\|\\<begin\\>\\|\\<if\\>\\|\\<case\\>\\)" nil t) + (point)) + (point))))) + (save-excursion + (verilog-re-search-backward "@" nil t) + (setq sigss (verilog-read-always-signals))) + (setq assignment-str (if (verilog-alw-get-uses-delayed sigss) + (concat " <= " verilog-assignment-delay) + " = ")) + (setq sig-list (verilog-signals-not-in (verilog-alw-get-outputs sigss) + prereset-sigs)) + (setq sig-list (sort sig-list `verilog-signals-sort-compare)) + (when sig-list + (insert "\n"); + (indent-to indent-pt) + (insert "// Beginning of autoreset for uninitialized flops\n"); + (indent-to indent-pt) + (while sig-list + (let ((sig (or (assoc (verilog-sig-name (car sig-list)) all-list) ;; As sig-list has no widths + (car sig-list)))) + (insert (verilog-sig-name sig) + assignment-str + (verilog-sig-tieoff sig (not verilog-auto-reset-widths)) + ";\n") + (indent-to indent-pt) + (setq sig-list (cdr sig-list)))) + (insert "// End of automatics")) + ))) + +(defun verilog-auto-tieoff () + "Expand AUTOTIEOFF statements, as part of \\[verilog-auto]. +Replace the /*AUTOTIEOFF*/ comment with code to wire-tie all unused output +signals to deasserted. + +/*AUTOTIEOFF*/ is used to make stub modules; modules that have the same +input/output list as another module, but no internals. Specifically, it +finds all outputs in the module, and if that input is not otherwise declared +as a register or wire, creates a tieoff. + +AUTORESET ties signals to deasserted, which is presumed to be zero. +Signals that match `verilog-active-low-regexp' will be deasserted by tieing +them to a one. + +An example of making a stub for another module: + + module FooStub (/*AUTOINST*/); + /*AUTOINOUTMODULE(\"Foo\")*/ + /*AUTOTIEOFF*/ + // verilator lint_off UNUSED + wire _unused_ok = &{1'b0, + /*AUTOUNUSED*/ + 1'b0}; + // verilator lint_on UNUSED + endmodule + +Typing \\[verilog-auto] will make this into: + + module FooStub (/*AUTOINST*/...); + /*AUTOINOUTMODULE(\"Foo\")*/ + // Beginning of autotieoff + output [2:0] foo; + // End of automatics + + /*AUTOTIEOFF*/ + // Beginning of autotieoff + wire [2:0] foo = 3'b0; + // End of automatics + ... + endmodule" + (interactive) + (save-excursion + ;; Find beginning + (let* ((indent-pt (current-indentation)) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (verilog-modi-get-outputs modi) + (append (verilog-modi-get-wires modi) + (verilog-modi-get-regs modi) + (verilog-modi-get-assigns modi) + (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi) + (verilog-modi-get-sub-outputs modi) + (verilog-modi-get-sub-inouts modi) + )))) + (when sig-list + (forward-line 1) + (verilog-insert-indent "// Beginning of automatic tieoffs (for this module's unterminated outputs)\n") + (setq sig-list (sort (copy-alist sig-list) `verilog-signals-sort-compare)) + (verilog-modi-cache-add-wires modi sig-list) ; Before we trash list + (while sig-list + (let ((sig (car sig-list))) + (verilog-insert-one-definition sig "wire" indent-pt) + (indent-to (max 48 (+ indent-pt 40))) + (insert "= " (verilog-sig-tieoff sig) + ";\n") + (setq sig-list (cdr sig-list)))) + (verilog-insert-indent "// End of automatics\n") + )))) + +(defun verilog-auto-unused () + "Expand AUTOUNUSED statements, as part of \\[verilog-auto]. +Replace the /*AUTOUNUSED*/ comment with a comma separated list of all unused +input and inout signals. + +/*AUTOUNUSED*/ is used to make stub modules; modules that have the same +input/output list as another module, but no internals. Specifically, it +finds all inputs and inouts in the module, and if that input is not otherwise +used, adds it to a comma separated list. + +The comma separated list is intended to be used to create a _unused_ok +signal. Using the exact name \"_unused_ok\" for name of the temporary +signal is recommended as it will insure maximum forward compatibility, it +also makes lint warnings easy to understand; ignore any unused warnings +with \"unused\" in the signal name. + +To reduce simulation time, the _unused_ok signal should be forced to a +constant to prevent wiggling. The easiest thing to do is use a +reduction-and with 1'b0 as shown. + +This way all unused signals are in one place, making it convenient to add +your tool's specific pragmas around the assignment to disable any unused +warnings. + +You can add signals you do not want included in AUTOUNUSED with +`verilog-auto-unused-ignore-regexp'. + +An example of making a stub for another module: + + module FooStub (/*AUTOINST*/); + /*AUTOINOUTMODULE(\"Foo\")*/ + /*AUTOTIEOFF*/ + // verilator lint_off UNUSED + wire _unused_ok = &{1'b0, + /*AUTOUNUSED*/ + 1'b0}; + // verilator lint_on UNUSED + endmodule + +Typing \\[verilog-auto] will make this into: + + ... + // verilator lint_off UNUSED + wire _unused_ok = &{1'b0, + /*AUTOUNUSED*/ + // Beginning of automatics + unused_input_a, + unused_input_b, + unused_input_c, + // End of automatics + 1'b0}; + // verilator lint_on UNUSED + endmodule" + (interactive) + (save-excursion + ;; Find beginning + (let* ((indent-pt (progn (search-backward "/*") (current-column))) + (modi (verilog-modi-current)) + (sig-list (verilog-signals-not-in + (append (verilog-modi-get-inputs modi) + (verilog-modi-get-inouts modi)) + (append (verilog-modi-get-sub-inputs modi) + (verilog-modi-get-sub-inouts modi) + )))) + (setq sig-list (verilog-signals-not-matching-regexp + sig-list verilog-auto-unused-ignore-regexp)) + (when sig-list + (forward-line 1) + (verilog-insert-indent "// Beginning of automatic unused inputs\n") + (setq sig-list (sort (copy-alist sig-list) `verilog-signals-sort-compare)) + (while sig-list + (let ((sig (car sig-list))) + (indent-to indent-pt) + (insert (verilog-sig-name sig) ",\n") + (setq sig-list (cdr sig-list)))) + (verilog-insert-indent "// End of automatics\n") + )))) + +(defun verilog-enum-ascii (signm elim-regexp) + "Convert a enum name SIGNM to a ascii string for insertion. +Remove user provided prefix ELIM-REGEXP." + (or elim-regexp (setq elim-regexp "_ DONT MATCH IT_")) + (let ((case-fold-search t)) + ;; All upper becomes all lower for readability + (downcase (verilog-string-replace-matches elim-regexp "" nil nil signm)))) + +(defun verilog-auto-ascii-enum () + "Expand AUTOASCIIENUM statements, as part of \\[verilog-auto]. +Create a register to contain the ASCII decode of a enumerated signal type. +This will allow trace viewers to show the ASCII name of states. + +First, parameters are built into a enumeration using the synopsys enum +comment. The comment must be between the keyword and the symbol. +(Annoying, but that's what Synopsys's dc_shell FSM reader requires.) + +Next, registers which that enum applies to are also tagged with the same +enum. Synopsys also suggests labeling state vectors, but `verilog-mode' +doesn't care. + +Finally, a AUTOASCIIENUM command is used. + + The first parameter is the name of the signal to be decoded. + + The second parameter is the name to store the ASCII code into. For the + signal foo, I suggest the name _foo__ascii, where the leading _ indicates + a signal that is just for simulation, and the magic characters _ascii + tell viewers like Dinotrace to display in ASCII format. + + The final optional parameter is a string which will be removed from the + state names. + +An example: + + //== State enumeration + parameter [2:0] // synopsys enum state_info + SM_IDLE = 3'b000, + SM_SEND = 3'b001, + SM_WAIT1 = 3'b010; + //== State variables + reg [2:0] /* synopsys enum state_info */ + state_r; /* synopsys state_vector state_r */ + reg [2:0] /* synopsys enum state_info */ + state_e1; + + //== ASCII state decoding + + /*AUTOASCIIENUM(\"state_r\", \"state_ascii_r\", \"SM_\")*/ + +Typing \\[verilog-auto] will make this into: + + ... same front matter ... + + /*AUTOASCIIENUM(\"state_r\", \"state_ascii_r\", \"SM_\")*/ + // Beginning of automatic ASCII enum decoding + reg [39:0] state_ascii_r; // Decode of state_r + always @(state_r) begin + case ({state_r}) + SM_IDLE: state_ascii_r = \"idle \"; + SM_SEND: state_ascii_r = \"send \"; + SM_WAIT1: state_ascii_r = \"wait1\"; + default: state_ascii_r = \"%Erro\"; + endcase + end + // End of automatics" + (save-excursion + (let* ((params (verilog-read-auto-params 2 3)) + (undecode-name (nth 0 params)) + (ascii-name (nth 1 params)) + (elim-regexp (nth 2 params)) + ;; + (indent-pt (current-indentation)) + (modi (verilog-modi-current)) + ;; + (sig-list-consts (append (verilog-modi-get-consts modi) + (verilog-modi-get-gparams modi))) + (sig-list-all (append (verilog-modi-get-regs modi) + (verilog-modi-get-outputs modi) + (verilog-modi-get-inouts modi) + (verilog-modi-get-inputs modi) + (verilog-modi-get-wires modi))) + ;; + (undecode-sig (or (assoc undecode-name sig-list-all) + (error "%s: Signal %s not found in design" (verilog-point-text) undecode-name))) + (undecode-enum (or (verilog-sig-enum undecode-sig) + (error "%s: Signal %s does not have a enum tag" (verilog-point-text) undecode-name))) + ;; + (enum-sigs (or (verilog-signals-matching-enum sig-list-consts undecode-enum) + (error "%s: No state definitions for %s" (verilog-point-text) undecode-enum))) + ;; + (enum-chars 0) + (ascii-chars 0)) + ;; + ;; Find number of ascii chars needed + (let ((tmp-sigs enum-sigs)) + (while tmp-sigs + (setq enum-chars (max enum-chars (length (verilog-sig-name (car tmp-sigs)))) + ascii-chars (max ascii-chars (length (verilog-enum-ascii + (verilog-sig-name (car tmp-sigs)) + elim-regexp))) + tmp-sigs (cdr tmp-sigs)))) + ;; + (forward-line 1) + (verilog-insert-indent "// Beginning of automatic ASCII enum decoding\n") + (let ((decode-sig-list (list (list ascii-name (format "[%d:0]" (- (* ascii-chars 8) 1)) + (concat "Decode of " undecode-name) nil nil)))) + (verilog-insert-definition decode-sig-list "reg" indent-pt nil) + (verilog-modi-cache-add-regs modi decode-sig-list)) + ;; + (verilog-insert-indent "always @(" undecode-name ") begin\n") + (setq indent-pt (+ indent-pt verilog-indent-level)) + (indent-to indent-pt) + (insert "case ({" undecode-name "})\n") + (setq indent-pt (+ indent-pt verilog-case-indent)) + ;; + (let ((tmp-sigs enum-sigs) + (chrfmt (format "%%-%ds %s = \"%%-%ds\";\n" (1+ (max 8 enum-chars)) + ascii-name ascii-chars)) + (errname (substring "%Error" 0 (min 6 ascii-chars)))) + (while tmp-sigs + (verilog-insert-indent + (format chrfmt (concat (verilog-sig-name (car tmp-sigs)) ":") + (verilog-enum-ascii (verilog-sig-name (car tmp-sigs)) + elim-regexp))) + (setq tmp-sigs (cdr tmp-sigs))) + (verilog-insert-indent (format chrfmt "default:" errname))) + ;; + (setq indent-pt (- indent-pt verilog-case-indent)) + (verilog-insert-indent "endcase\n") + (setq indent-pt (- indent-pt verilog-indent-level)) + (verilog-insert-indent "end\n" + "// End of automatics\n") + ))) + +(defun verilog-auto-templated-rel () + "Replace Templated relative line numbers with absolute line numbers. +Internal use only. This hacks around the line numbers in AUTOINST Templates +being different from the final output's line numbering." + (let ((templateno 0) (template-line (list 0))) + ;; Find line number each template is on + (goto-char (point-min)) + (while (search-forward "AUTO_TEMPLATE" nil t) + (setq templateno (1+ templateno)) + (setq template-line (cons (count-lines (point-min) (point)) template-line))) + (setq template-line (nreverse template-line)) + ;; Replace T# L# with absolute line number + (goto-char (point-min)) + (while (re-search-forward " Templated T\\([0-9]+\\) L\\([0-9]+\\)" nil t) + (replace-match (concat " Templated " + (int-to-string (+ (nth (string-to-int (match-string 1)) + template-line) + (string-to-int (match-string 2))))) + t t)))) + + +;; +;; Auto top level +;; + +(defun verilog-auto (&optional inject) ; Use verilog-inject-auto instead of passing a arg + "Expand AUTO statements. +Look for any /*AUTO...*/ commands in the code, as used in +instantiations or argument headers. Update the list of signals +following the /*AUTO...*/ command. + +Use \\[verilog-delete-auto] to remove the AUTOs. + +Use \\[verilog-inject-auto] to insert AUTOs for the first time. + +Use \\[verilog-faq] for a pointer to frequently asked questions. + +The hooks `verilog-before-auto-hook' and `verilog-auto-hook' are +called before and after this function, respectively. + +For example: + module (/*AUTOARG*/) + /*AUTOINPUT*/ + /*AUTOOUTPUT*/ + /*AUTOWIRE*/ + /*AUTOREG*/ + somesub sub #(/*AUTOINSTPARAM*/) (/*AUTOINST*/); + +You can also update the AUTOs from the shell using: + emacs --batch <filenames.v> -f verilog-batch-auto +Or fix indentation with: + emacs --batch <filenames.v> -f verilog-batch-indent +Likewise, you can delete or inject AUTOs with: + emacs --batch <filenames.v> -f verilog-batch-delete-auto + emacs --batch <filenames.v> -f verilog-batch-inject-auto + +Using \\[describe-function], see also: + `verilog-auto-arg' for AUTOARG module instantiations + `verilog-auto-ascii-enum' for AUTOASCIIENUM enumeration decoding + `verilog-auto-inout-module' for AUTOINOUTMODULE copying i/o from elsewhere + `verilog-auto-inout' for AUTOINOUT making hierarchy inouts + `verilog-auto-input' for AUTOINPUT making hierarchy inputs + `verilog-auto-inst' for AUTOINST instantiation pins + `verilog-auto-star' for AUTOINST .* SystemVerilog pins + `verilog-auto-inst-param' for AUTOINSTPARAM instantiation params + `verilog-auto-output' for AUTOOUTPUT making hierarchy outputs + `verilog-auto-output-every' for AUTOOUTPUTEVERY making all outputs + `verilog-auto-reg' for AUTOREG registers + `verilog-auto-reg-input' for AUTOREGINPUT instantiation registers + `verilog-auto-reset' for AUTORESET flop resets + `verilog-auto-sense' for AUTOSENSE always sensitivity lists + `verilog-auto-tieoff' for AUTOTIEOFF output tieoffs + `verilog-auto-unused' for AUTOUNUSED unused inputs/inouts + `verilog-auto-wire' for AUTOWIRE instantiation wires + + `verilog-read-defines' for reading `define values + `verilog-read-includes' for reading `includes + +If you have bugs with these autos, try contacting the AUTOAUTHOR +Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com." + (interactive) + (unless noninteractive (message "Updating AUTOs...")) + (if (featurep 'dinotrace) + (dinotrace-unannotate-all)) + (let ((oldbuf (if (not (buffer-modified-p)) + (buffer-string))) + ;; Before version 20, match-string with font-lock returns a + ;; vector that is not equal to the string. IE if on "input" + ;; nil==(equal "input" (progn (looking-at "input") (match-string 0))) + (fontlocked (when (and (boundp 'font-lock-mode) + font-lock-mode) + (font-lock-mode nil) + t))) + (unwind-protect + (save-excursion + ;; If we're not in verilog-mode, change syntax table so parsing works right + (unless (eq major-mode `verilog-mode) (verilog-mode)) + ;; Allow user to customize + (run-hooks 'verilog-before-auto-hook) + ;; Try to save the user from needing to revert-file to reread file local-variables + (verilog-auto-reeval-locals) + (verilog-read-auto-lisp (point-min) (point-max)) + (verilog-getopt-flags) + ;; These two may seem obvious to do always, but on large includes it can be way too slow + (when verilog-auto-read-includes + (verilog-read-includes) + (verilog-read-defines nil nil t)) + ;; This particular ordering is important + ;; INST: Lower modules correct, no internal dependencies, FIRST + (verilog-preserve-cache + ;; Clear existing autos else we'll be screwed by existing ones + (verilog-delete-auto) + ;; Injection if appropriate + (when inject + (verilog-inject-inst) + (verilog-inject-sense) + (verilog-inject-arg)) + ;; + (verilog-auto-search-do "/*AUTOINSTPARAM*/" 'verilog-auto-inst-param) + (verilog-auto-search-do "/*AUTOINST*/" 'verilog-auto-inst) + (verilog-auto-search-do ".*" 'verilog-auto-star) + ;; Doesn't matter when done, but combine it with a common changer + (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense) + (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset) + ;; Must be done before autoin/out as creates a reg + (verilog-auto-re-search-do "/\\*AUTOASCIIENUM([^)]*)\\*/" 'verilog-auto-ascii-enum) + ;; + ;; first in/outs from other files + (verilog-auto-re-search-do "/\\*AUTOINOUTMODULE([^)]*)\\*/" 'verilog-auto-inout-module) + ;; next in/outs which need previous sucked inputs first + (verilog-auto-search-do "/*AUTOOUTPUT*/" 'verilog-auto-output) + (verilog-auto-search-do "/*AUTOINPUT*/" 'verilog-auto-input) + (verilog-auto-search-do "/*AUTOINOUT*/" 'verilog-auto-inout) + ;; Then tie off those in/outs + (verilog-auto-search-do "/*AUTOTIEOFF*/" 'verilog-auto-tieoff) + ;; Wires/regs must be after inputs/outputs + (verilog-auto-search-do "/*AUTOWIRE*/" 'verilog-auto-wire) + (verilog-auto-search-do "/*AUTOREG*/" 'verilog-auto-reg) + (verilog-auto-search-do "/*AUTOREGINPUT*/" 'verilog-auto-reg-input) + ;; outputevery needs AUTOOUTPUTs done first + (verilog-auto-search-do "/*AUTOOUTPUTEVERY*/" 'verilog-auto-output-every) + ;; After we've created all new variables + (verilog-auto-search-do "/*AUTOUNUSED*/" 'verilog-auto-unused) + ;; Must be after all inputs outputs are generated + (verilog-auto-search-do "/*AUTOARG*/" 'verilog-auto-arg) + ;; Fix line numbers (comments only) + (verilog-auto-templated-rel) + ) + ;; + (run-hooks 'verilog-auto-hook) + ;; + (set (make-local-variable 'verilog-auto-update-tick) (buffer-modified-tick)) + ;; + ;; If end result is same as when started, clear modified flag + (cond ((and oldbuf (equal oldbuf (buffer-string))) + (set-buffer-modified-p nil) + (unless noninteractive (message "Updating AUTOs...done (no changes)"))) + (t (unless noninteractive (message "Updating AUTOs...done"))))) + ;; Unwind forms + (progn + ;; Restore font-lock + (when fontlocked (font-lock-mode t))) + ))) + + +;; +;; Skeleton based code insertion +;; +(defvar verilog-template-map nil + "Keymap used in Verilog mode for smart template operations.") + +(let ((verilog-mp (make-sparse-keymap))) + (define-key verilog-mp "a" 'verilog-sk-always) + (define-key verilog-mp "b" 'verilog-sk-begin) + (define-key verilog-mp "c" 'verilog-sk-case) + (define-key verilog-mp "f" 'verilog-sk-for) + (define-key verilog-mp "g" 'verilog-sk-generate) + (define-key verilog-mp "h" 'verilog-sk-header) + (define-key verilog-mp "i" 'verilog-sk-initial) + (define-key verilog-mp "j" 'verilog-sk-fork) + (define-key verilog-mp "m" 'verilog-sk-module) + (define-key verilog-mp "p" 'verilog-sk-primitive) + (define-key verilog-mp "r" 'verilog-sk-repeat) + (define-key verilog-mp "s" 'verilog-sk-specify) + (define-key verilog-mp "t" 'verilog-sk-task) + (define-key verilog-mp "w" 'verilog-sk-while) + (define-key verilog-mp "x" 'verilog-sk-casex) + (define-key verilog-mp "z" 'verilog-sk-casez) + (define-key verilog-mp "?" 'verilog-sk-if) + (define-key verilog-mp ":" 'verilog-sk-else-if) + (define-key verilog-mp "/" 'verilog-sk-comment) + (define-key verilog-mp "A" 'verilog-sk-assign) + (define-key verilog-mp "F" 'verilog-sk-function) + (define-key verilog-mp "I" 'verilog-sk-input) + (define-key verilog-mp "O" 'verilog-sk-output) + (define-key verilog-mp "S" 'verilog-sk-state-machine) + (define-key verilog-mp "=" 'verilog-sk-inout) + (define-key verilog-mp "W" 'verilog-sk-wire) + (define-key verilog-mp "R" 'verilog-sk-reg) + (define-key verilog-mp "D" 'verilog-sk-define-signal) + (setq verilog-template-map verilog-mp)) + +;; +;; Place the templates into Verilog Mode. They may be inserted under any key. +;; C-c C-t will be the default. If you use templates a lot, you +;; may want to consider moving the binding to another key in your .emacs +;; file. +;; +;(define-key verilog-mode-map "\C-ct" verilog-template-map) +(define-key verilog-mode-map "\C-c\C-t" verilog-template-map) + +;;; ---- statement skeletons ------------------------------------------ + +(define-skeleton verilog-sk-prompt-condition + "Prompt for the loop condition." + "[condition]: " str ) + +(define-skeleton verilog-sk-prompt-init + "Prompt for the loop init statement." + "[initial statement]: " str ) + +(define-skeleton verilog-sk-prompt-inc + "Prompt for the loop increment statement." + "[increment statement]: " str ) + +(define-skeleton verilog-sk-prompt-name + "Prompt for the name of something." + "[name]: " str) + +(define-skeleton verilog-sk-prompt-clock + "Prompt for the name of something." + "name and edge of clock(s): " str) + +(defvar verilog-sk-reset nil) +(defun verilog-sk-prompt-reset () + "Prompt for the name of a state machine reset." + (setq verilog-sk-reset (read-input "name of reset: " "rst"))) + + +(define-skeleton verilog-sk-prompt-state-selector + "Prompt for the name of a state machine selector." + "name of selector (eg {a,b,c,d}): " str ) + +(define-skeleton verilog-sk-prompt-output + "Prompt for the name of something." + "output: " str) + +(define-skeleton verilog-sk-prompt-msb + "Prompt for least significant bit specification." + "msb:" str & ?: & (verilog-sk-prompt-lsb) | -1 ) + +(define-skeleton verilog-sk-prompt-lsb + "Prompt for least significant bit specification." + "lsb:" str ) + +(defvar verilog-sk-p nil) +(define-skeleton verilog-sk-prompt-width + "Prompt for a width specification." + () + (progn + (setq verilog-sk-p (point)) + (verilog-sk-prompt-msb) + (if (> (point) verilog-sk-p) "] " " "))) + +(defun verilog-sk-header () + "Insert a descriptive header at the top of the file." + (interactive "*") + (save-excursion + (goto-char (point-min)) + (verilog-sk-header-tmpl))) + +(define-skeleton verilog-sk-header-tmpl + "Insert a comment block containing the module title, author, etc." + "[Description]: " + "// -*- Mode: Verilog -*-" + "\n// Filename : " (buffer-name) + "\n// Description : " str + "\n// Author : " (user-full-name) + "\n// Created On : " (current-time-string) + "\n// Last Modified By: ." + "\n// Last Modified On: ." + "\n// Update Count : 0" + "\n// Status : Unknown, Use with caution!" + "\n") + +(define-skeleton verilog-sk-module + "Insert a module definition." + () + > "module " (verilog-sk-prompt-name) " (/*AUTOARG*/ ) ;" \n + > _ \n + > (- verilog-indent-level-behavioral) "endmodule" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-primitive + "Insert a task definition." + () + > "primitive " (verilog-sk-prompt-name) " ( " (verilog-sk-prompt-output) ("input:" ", " str ) " );"\n + > _ \n + > (- verilog-indent-level-behavioral) "endprimitive" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-task + "Insert a task definition." + () + > "task " (verilog-sk-prompt-name) & ?; \n + > _ \n + > "begin" \n + > \n + > (- verilog-indent-level-behavioral) "end" \n + > (- verilog-indent-level-behavioral) "endtask" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-function + "Insert a function definition." + () + > "function [" (verilog-sk-prompt-width) | -1 (verilog-sk-prompt-name) ?; \n + > _ \n + > "begin" \n + > \n + > (- verilog-indent-level-behavioral) "end" \n + > (- verilog-indent-level-behavioral) "endfunction" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-always + "Insert always block. Uses the minibuffer to prompt +for sensitivity list." + () + > "always @ ( /*AUTOSENSE*/ ) begin\n" + > _ \n + > (- verilog-indent-level-behavioral) "end" \n > + ) + +(define-skeleton verilog-sk-initial + "Insert an initial block." + () + > "initial begin\n" + > _ \n + > (- verilog-indent-level-behavioral) "end" \n > ) + +(define-skeleton verilog-sk-specify + "Insert specify block. " + () + > "specify\n" + > _ \n + > (- verilog-indent-level-behavioral) "endspecify" \n > ) + +(define-skeleton verilog-sk-generate + "Insert generate block. " + () + > "generate\n" + > _ \n + > (- verilog-indent-level-behavioral) "endgenerate" \n > ) + +(define-skeleton verilog-sk-begin + "Insert begin end block. Uses the minibuffer to prompt for name" + () + > "begin" (verilog-sk-prompt-name) \n + > _ \n + > (- verilog-indent-level-behavioral) "end" +) + +(define-skeleton verilog-sk-fork + "Insert an fork join block." + () + > "fork\n" + > "begin" \n + > _ \n + > (- verilog-indent-level-behavioral) "end" \n + > "begin" \n + > \n + > (- verilog-indent-level-behavioral) "end" \n + > (- verilog-indent-level-behavioral) "join" \n + > ) + + +(define-skeleton verilog-sk-case + "Build skeleton case statement, prompting for the selector expression, +and the case items." + "[selector expression]: " + > "case (" str ") " \n + > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) + resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-casex + "Build skeleton casex statement, prompting for the selector expression, +and the case items." + "[selector expression]: " + > "casex (" str ") " \n + > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) + resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-casez + "Build skeleton casez statement, prompting for the selector expression, +and the case items." + "[selector expression]: " + > "casez (" str ") " \n + > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) + resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-if + "Insert a skeleton if statement." + > "if (" (verilog-sk-prompt-condition) & ")" " begin" \n + > _ \n + > (- verilog-indent-level-behavioral) "end " \n ) + +(define-skeleton verilog-sk-else-if + "Insert a skeleton else if statement." + > (verilog-indent-line) "else if (" + (progn (setq verilog-sk-p (point)) nil) (verilog-sk-prompt-condition) (if (> (point) verilog-sk-p) ") " -1 ) & " begin" \n + > _ \n + > "end" (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-datadef + "Common routine to get data definition" + () + (verilog-sk-prompt-width) | -1 ("name (RET to end):" str ", ") -2 ";" \n) + +(define-skeleton verilog-sk-input + "Insert an input definition." + () + > "input [" (verilog-sk-datadef)) + +(define-skeleton verilog-sk-output + "Insert an output definition." + () + > "output [" (verilog-sk-datadef)) + +(define-skeleton verilog-sk-inout + "Insert an inout definition." + () + > "inout [" (verilog-sk-datadef)) + +(defvar verilog-sk-signal nil) +(define-skeleton verilog-sk-def-reg + "Insert a reg definition." + () + > "reg [" (verilog-sk-prompt-width) | -1 verilog-sk-signal ";" \n (verilog-pretty-declarations) ) + +(defun verilog-sk-define-signal () + "Insert a definition of signal under point at top of module." + (interactive "*") + (let* ( + (sig-re "[a-zA-Z0-9_]*") + (v1 (buffer-substring + (save-excursion + (skip-chars-backward sig-re) + (point)) + (save-excursion + (skip-chars-forward sig-re) + (point)))) + ) + (if (not (member v1 verilog-keywords)) + (save-excursion + (setq verilog-sk-signal v1) + (verilog-beg-of-defun) + (verilog-end-of-statement) + (verilog-forward-syntactic-ws) + (verilog-sk-def-reg) + (message "signal at point is %s" v1)) + (message "object at point (%s) is a keyword" v1)) + ) + ) + + +(define-skeleton verilog-sk-wire + "Insert a wire definition." + () + > "wire [" (verilog-sk-datadef)) + +(define-skeleton verilog-sk-reg + "Insert a reg definition." + () + > "reg [" (verilog-sk-datadef)) + +(define-skeleton verilog-sk-assign + "Insert a skeleton assign statement." + () + > "assign " (verilog-sk-prompt-name) " = " _ ";" \n) + +(define-skeleton verilog-sk-while + "Insert a skeleton while loop statement." + () + > "while (" (verilog-sk-prompt-condition) ") begin" \n + > _ \n + > (- verilog-indent-level-behavioral) "end " (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-repeat + "Insert a skeleton repeat loop statement." + () + > "repeat (" (verilog-sk-prompt-condition) ") begin" \n + > _ \n + > (- verilog-indent-level-behavioral) "end " (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-for + "Insert a skeleton while loop statement." + () + > "for (" + (verilog-sk-prompt-init) "; " + (verilog-sk-prompt-condition) "; " + (verilog-sk-prompt-inc) + ") begin" \n + > _ \n + > (- verilog-indent-level-behavioral) "end " (progn (electric-verilog-terminate-line) nil)) + +(define-skeleton verilog-sk-comment + "Inserts three comment lines, making a display comment." + () + > "/*\n" + > "* " _ \n + > "*/") + +(define-skeleton verilog-sk-state-machine + "Insert a state machine definition." + "Name of state variable: " + '(setq input "state") + > "// State registers for " str | -23 \n + '(setq verilog-sk-state str) + > "reg [" (verilog-sk-prompt-width) | -1 verilog-sk-state ", next_" verilog-sk-state ?; \n + '(setq input nil) + > \n + > "// State FF for " verilog-sk-state \n + > "always @ ( " (read-string "clock:" "posedge clk") " or " (verilog-sk-prompt-reset) " ) begin" \n + > "if ( " verilog-sk-reset " ) " verilog-sk-state " = 0; else" \n + > verilog-sk-state " = next_" verilog-sk-state ?; \n + > (- verilog-indent-level-behavioral) "end" (progn (electric-verilog-terminate-line) nil) + > \n + > "// Next State Logic for " verilog-sk-state \n + > "always @ ( /*AUTOSENSE*/ ) begin\n" + > "case (" (verilog-sk-prompt-state-selector) ") " \n + > ("case selector: " str ": begin" \n > "next_" verilog-sk-state " = " _ ";" \n > (- verilog-indent-level-behavioral) "end" \n ) + resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil) + > (- verilog-indent-level-behavioral) "end" (progn (electric-verilog-terminate-line) nil)) + +;; Eliminate compile warning +(eval-when-compile + (if (not (boundp 'mode-popup-menu)) + (defvar mode-popup-menu nil "Compatibility with XEmacs."))) + +;; ---- add menu 'Statements' in Verilog mode (MH) +(defun verilog-add-statement-menu () + "Add the menu 'Statements' to the menu bar in Verilog mode." + (if (featurep 'xemacs) + (progn + (easy-menu-add verilog-stmt-menu) + (easy-menu-add verilog-menu) + (setq mode-popup-menu (cons "Verilog Mode" verilog-stmt-menu))))) + +(add-hook 'verilog-mode-hook 'verilog-add-statement-menu) + + + +;; +;; Include file loading with mouse/return event +;; +;; idea & first impl.: M. Rouat (eldo-mode.el) +;; second (emacs/xemacs) impl.: G. Van der Plas (spice-mode.el) + +(if (featurep 'xemacs) + (require 'overlay) + (require 'lucid)) ;; what else can we do ?? + +(defconst verilog-include-file-regexp + "^`include\\s-+\"\\([^\n\"]*\\)\"" + "Regexp that matches the include file.") + +(defvar verilog-mode-mouse-map nil + "Map containing mouse bindings for `verilog-mode'.") + +(if verilog-mode-mouse-map + () + (let ((map (make-sparse-keymap))) ; as described in info pages, make a map + (set-keymap-parent map verilog-mode-map) + ;; mouse button bindings + (define-key map "\r" 'verilog-load-file-at-point) + (if (featurep 'xemacs) + (define-key map 'button2 'verilog-load-file-at-mouse);ffap-at-mouse ? + (define-key map [mouse-2] 'verilog-load-file-at-mouse)) + (if (featurep 'xemacs) + (define-key map 'Sh-button2 'mouse-yank) ; you wanna paste don't you ? + (define-key map [S-mouse-2] 'mouse-yank-at-click)) + (setq verilog-mode-mouse-map map))) ;; copy complete map now + +;; create set-extent-keymap procedure when it does not exist +(eval-and-compile + (unless (fboundp 'set-extent-keymap) + (defun set-extent-keymap (extent keymap) + "fallback version of set-extent-keymap (for emacs 2[01])" + (set-extent-property extent 'local-map keymap)))) + +(defun verilog-colorize-include-files (beg end old-len) + "This function colorizes included files when the mouse passes over them. +Clicking on the middle-mouse button loads them in a buffer (as in dired)." + (save-excursion + (save-match-data + (let (end-point) + (goto-char end) + (setq end-point (verilog-get-end-of-line)) + (goto-char beg) + (beginning-of-line) ; scan entire line ! + ;; delete overlays existing on this line + (let ((overlays (overlays-in (point) end-point))) + (while overlays + (if (and + (overlay-get (car overlays) 'detachable) + (overlay-get (car overlays) 'verilog-include-file)) + (delete-overlay (car overlays))) + (setq overlays (cdr overlays)))) ; let + ;; make new ones, could reuse deleted one ? + (while (search-forward-regexp verilog-include-file-regexp end-point t) + (let (extent) + (goto-char (match-beginning 1)) + (or (extent-at (point) (buffer-name) 'mouse-face) ;; not yet extended + (progn + (setq extent (make-extent (match-beginning 1) (match-end 1))) + (set-extent-property extent 'start-closed 't) + (set-extent-property extent 'end-closed 't) + (set-extent-property extent 'detachable 't) + (set-extent-property extent 'verilog-include-file 't) + (set-extent-property extent 'mouse-face 'highlight) + (set-extent-keymap extent verilog-mode-mouse-map))))))))) + + +(defun verilog-colorize-include-files-buffer () + "Colorize a include file." + (interactive) + ;; delete overlays + (let ((overlays (overlays-in (point-min) (point-max)))) + (while overlays + (if (and + (overlay-get (car overlays) 'detachable) + (overlay-get (car overlays) 'verilog-include-file)) + (delete-overlay (car overlays))) + (setq overlays (cdr overlays)))) ; let + ;; remake overlays + (verilog-colorize-include-files (point-min) (point-max) nil)) + +;; ffap-at-mouse isn't useful for verilog mode. It uses library paths. +;; so define this function to do more or less the same as ffap-at-mouse +;; but first resolve filename... +(defun verilog-load-file-at-mouse (event) + "Load file under button 2 click's EVENT. +Files are checked based on `verilog-library-directories'." + (interactive "@e") + (save-excursion ;; implement a verilog specific ffap-at-mouse + (mouse-set-point event) + (beginning-of-line) + (if (looking-at verilog-include-file-regexp) + (if (and (car (verilog-library-filenames + (match-string 1) (buffer-file-name))) + (file-readable-p (car (verilog-library-filenames + (match-string 1) (buffer-file-name))))) + (find-file (car (verilog-library-filenames + (match-string 1) (buffer-file-name)))) + (progn + (message + "File '%s' isn't readable, use shift-mouse2 to paste in this field" + (match-string 1)))) + ))) + +;; ffap isn't useable for verilog mode. It uses library paths. +;; so define this function to do more or less the same as ffap +;; but first resolve filename... +(defun verilog-load-file-at-point () + "Load file under point. +Files are checked based on `verilog-library-directories'." + (interactive) + (save-excursion ;; implement a verilog specific ffap + (beginning-of-line) + (if (looking-at verilog-include-file-regexp) + (if (and + (car (verilog-library-filenames + (match-string 1) (buffer-file-name))) + (file-readable-p (car (verilog-library-filenames + (match-string 1) (buffer-file-name))))) + (find-file (car (verilog-library-filenames + (match-string 1) (buffer-file-name)))))) + )) + + +;; +;; Bug reporting +;; + +(defun verilog-faq () + "Tell the user their current version, and where to get the FAQ etc." + (interactive) + (with-output-to-temp-buffer "*verilog-mode help*" + (princ (format "You are using verilog-mode %s\n" verilog-mode-version)) + (princ "\n") + (princ "For new releases, see http://www.verilog.com\n") + (princ "\n") + (princ "For frequently asked questions, see http://www.veripool.com/verilog-mode-faq.html\n") + (princ "\n") + (princ "To submit a bug, use M-x verilog-submit-bug-report\n") + (princ "\n"))) + +(defun verilog-submit-bug-report () + "Submit via mail a bug report on verilog-mode.el." + (interactive) + (let ((reporter-prompt-for-summary-p t)) + (reporter-submit-bug-report + "mac@verilog.com" + (concat "verilog-mode v" verilog-mode-version) + '( + verilog-align-ifelse + verilog-auto-endcomments + verilog-auto-hook + verilog-auto-indent-on-newline + verilog-auto-inst-vector + verilog-auto-inst-template-numbers + verilog-auto-lineup + verilog-auto-newline + verilog-auto-save-policy + verilog-auto-sense-defines-constant + verilog-auto-sense-include-inputs + verilog-before-auto-hook + verilog-case-indent + verilog-cexp-indent + verilog-compiler + verilog-coverage + verilog-highlight-translate-off + verilog-indent-begin-after-if + verilog-indent-declaration-macros + verilog-indent-level + verilog-indent-level-behavioral + verilog-indent-level-declaration + verilog-indent-level-directive + verilog-indent-level-module + verilog-indent-lists + verilog-library-flags + verilog-library-directories + verilog-library-extensions + verilog-library-files + verilog-linter + verilog-minimum-comment-distance + verilog-mode-hook + verilog-simulator + verilog-tab-always-indent + verilog-tab-to-comment + ) + nil nil + (concat "Hi Mac, + +I want to report a bug. I've read the `Bugs' section of `Info' on +Emacs, so I know how to make a clear and unambiguous report. To get +to that Info section, I typed + +M-x info RET m " invocation-name " RET m bugs RET + +Before I go further, I want to say that Verilog mode has changed my life. +I save so much time, my files are colored nicely, my co workers respect +my coding ability... until now. I'd really appreciate anything you +could do to help me out with this minor deficiency in the product. + +If you have bugs with the AUTO functions, please CC the AUTOAUTHOR Wilson +Snyder (wsnyder@wsnyder.org) and/or see http://www.veripool.com. +You may also want to look at the Verilog-Mode FAQ, see +http://www.veripool.com/verilog-mode-faq.html. + +To reproduce the bug, start a fresh Emacs via " invocation-name " +-no-init-file -no-site-file'. In a new buffer, in verilog mode, type +the code included below. + +Given those lines, I expected [[Fill in here]] to happen; +but instead, [[Fill in here]] happens!. + +== The code: ==")))) + +;; Local Variables: +;; checkdoc-permit-comma-termination-flag:t +;; checkdoc-force-docstrings-flag:nil +;; End: + +;;; verilog-mode.el ends here From c30584007943a2fc3cae497764dbb415c12cab5e Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 18:25:08 +0000 Subject: [PATCH 050/172] Remove item, fixed by the latest gnus merge. --- admin/FOR-RELEASE | 4 ---- 1 file changed, 4 deletions(-) diff --git a/admin/FOR-RELEASE b/admin/FOR-RELEASE index 0e4a195e97d..b0965a01ba2 100644 --- a/admin/FOR-RELEASE +++ b/admin/FOR-RELEASE @@ -94,10 +94,6 @@ be part of Gnus. They should be moved to some other part of Emacs. rsteib: Gnus dependencies in `gnus-dired.el' (and `mailcap.el') have been minimized. I don't know what is left to do here. -** Extra question asked when doing a reply in Gnus -Fixed in Gnus CVS, but the patch has not been synched to Emacs yet: -http://thread.gmane.org/gmane.emacs.gnus.general/65627/65768 - ** sdl.web@gmail.com, 30 Oct: ps-lpr-switches has no effect ** Stephen.Berman@gmx.net: minibuffer and current-local-map From 6edb57162c2967832c85e0f931569715904d7117 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 18:43:17 +0000 Subject: [PATCH 051/172] (verilog-mode-version) (verilog-mode-release-date): Don't use expanding keywords. (provide): Move to the end of file. (fboundp): Don't check if eval-when-compile is bound, it is used later in the file without checking. (when, unless): Copy definitions from subr.el. (char-before, defcustom, defface, customize-group) (verilog-batch-error-wrapper): Don't use old style backquotes. (verilog-regexp-opt): Avoid using the cl function case. (verilog-regexp-words): Remove duplicated definition. (verilog-mode-abbrev-table): Remove, duplicate. (verilog-mode-map, verilog-template-map, verilog-mode-mouse-map): Declare and initialize in one step. (verilog-declaration-prefix-re, verilog-declaration-re) (verilog-end-of-statement, verilog-indent-declaration) (verilog-get-lineup-indent): Remove trailing whitespace. (verilog-mode): Fix autoload cookie. Set beginning-of-defun-function and end-of-defun-function. Use when instead of if. (verilog-emacs-features, verilog-auto-ascii-enum) (verilog-insert-indices): Escape braces in doc strings. --- lisp/ChangeLog | 24 ++ lisp/progmodes/verilog-mode.el | 460 ++++++++++++++++----------------- 2 files changed, 246 insertions(+), 238 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 42bc35bb7ca..4fa2d6de0c6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,27 @@ +2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> + + * progmodes/verilog-mode.el (verilog-mode-version) + (verilog-mode-release-date): Don't use expanding keywords. + (provide): Move to the end of file. + (fboundp): Don't check if eval-when-compile is bound, it is used + later in the file without checking. + (when, unless): Copy definitions from subr.el. + (char-before, defcustom, defface, customize-group) + (verilog-batch-error-wrapper): Don't use old style backquotes. + (verilog-regexp-opt): Avoid using the cl function case. + (verilog-regexp-words): Remove duplicated definition. + (verilog-mode-abbrev-table): Remove, duplicate. + (verilog-mode-map, verilog-template-map, verilog-mode-mouse-map): + Declare and initialize in one step. + (verilog-declaration-prefix-re, verilog-declaration-re) + (verilog-end-of-statement, verilog-indent-declaration) + (verilog-get-lineup-indent): Remove trailing whitespace. + (verilog-mode): Fix autoload cookie. Set + beginning-of-defun-function and end-of-defun-function. Use when + instead of if. + (verilog-emacs-features, verilog-auto-ascii-enum) + (verilog-insert-indices): Escape braces in doc strings. + 2007-12-08 Michael McNamara <mac@verilog.com> Wilson Snyder <wsnyder@wsnyder.org> diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 672ec981838..baec1ec3f9f 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -1,6 +1,5 @@ ;; verilog-mode.el --- major mode for editing verilog source in Emacs ;; -;; $Id: verilog-mode.el 377 2007-12-07 17:21:25Z wsnyder $ ;; Copyright (C) 1996-2007 Free Software Foundation, Inc. @@ -104,12 +103,10 @@ ;; ;;; Code: -(provide 'verilog-mode) - ;; This variable will always hold the version number of the mode -(defconst verilog-mode-version (substring "$$Revision: 377 $$" 12 -3) +(defconst verilog-mode-version "377" "Version of this verilog mode.") -(defconst verilog-mode-release-date (substring "$$Date: 2007-12-07 12:21:25 -0500 (Fri, 07 Dec 2007) $$" 8 -3) +(defconst verilog-mode-release-date "2007-12-07" "Version of this verilog mode.") (defun verilog-version () @@ -118,137 +115,136 @@ (message (concat "Using verilog-mode version " verilog-mode-version) )) ;; Insure we have certain packages, and deal with it if we don't -(if (fboundp 'eval-when-compile) - (eval-when-compile - (require 'verilog-mode) - (condition-case nil - (require 'imenu) - (error nil)) - (condition-case nil - (require 'reporter) - (error nil)) - (condition-case nil - (require 'easymenu) - (error nil)) - (condition-case nil - (require 'regexp-opt) - (error nil)) - (condition-case nil - (load "skeleton") ;; bug in 19.28 through 19.30 skeleton.el, not provided. - (error nil)) - (condition-case nil - (require 'vc) - (error nil)) - (condition-case nil - (if (fboundp 'when) - nil ;; fab - (defmacro when (var &rest body) - (` (cond ( (, var) (,@ body)))))) - (error nil)) - (condition-case nil - (if (fboundp 'unless) - nil ;; fab - (defmacro unless (var &rest body) - (` (if (, var) nil (,@ body))))) - (error nil)) - (condition-case nil - (if (fboundp 'store-match-data) - nil ;; fab - (defmacro store-match-data (&rest args) nil)) - (error nil)) - (condition-case nil - (if (boundp 'current-menubar) - nil ;; great - (progn - (defmacro set-buffer-menubar (&rest args) nil) - (defmacro add-submenu (&rest args) nil)) - ) - (error nil)) - (condition-case nil - (if (fboundp 'zmacs-activate-region) - nil ;; great - (defmacro zmacs-activate-region (&rest args) nil)) - (error nil)) - (condition-case nil - (if (fboundp 'char-before) - nil ;; great - (defmacro char-before (&rest body) - (` (char-after (1- (point)))))) - (error nil)) - ;; Requires to define variables that would be "free" warnings - (condition-case nil - (require 'font-lock) - (error nil)) - (condition-case nil - (require 'compile) - (error nil)) - (condition-case nil - (require 'custom) - (error nil)) - (condition-case nil - (require 'dinotrace) - (error nil)) - (condition-case nil - (if (fboundp 'dinotrace-unannotate-all) - nil ;; great - (defun dinotrace-unannotate-all (&rest args) nil)) - (error nil)) - (condition-case nil - (if (fboundp 'customize-apropos) - nil ;; great - (defun customize-apropos (&rest args) nil)) - (error nil)) - (condition-case nil - (if (fboundp 'match-string-no-properties) - nil ;; great - (defsubst match-string-no-properties (num &optional string) - "Return string of text matched by last search, without text properties. +(eval-when-compile + (condition-case nil + (require 'imenu) + (error nil)) + (condition-case nil + (require 'reporter) + (error nil)) + (condition-case nil + (require 'easymenu) + (error nil)) + (condition-case nil + (require 'regexp-opt) + (error nil)) + (condition-case nil + (load "skeleton") ;; bug in 19.28 through 19.30 skeleton.el, not provided. + (error nil)) + (condition-case nil + (require 'vc) + (error nil)) + (condition-case nil + (if (fboundp 'when) + nil ;; fab + (defmacro when (cond &rest body) + (list 'if cond (cons 'progn body)))) + (error nil)) + (condition-case nil + (if (fboundp 'unless) + nil ;; fab + (defmacro unless (cond &rest body) + (cons 'if (cons cond (cons nil body))))) + (error nil)) + (condition-case nil + (if (fboundp 'store-match-data) + nil ;; fab + (defmacro store-match-data (&rest args) nil)) + (error nil)) + (condition-case nil + (if (boundp 'current-menubar) + nil ;; great + (progn + (defmacro set-buffer-menubar (&rest args) nil) + (defmacro add-submenu (&rest args) nil)) + ) + (error nil)) + (condition-case nil + (if (fboundp 'zmacs-activate-region) + nil ;; great + (defmacro zmacs-activate-region (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'char-before) + nil ;; great + (defmacro char-before (&rest body) + (char-after (1- (point))))) + (error nil)) + ;; Requires to define variables that would be "free" warnings + (condition-case nil + (require 'font-lock) + (error nil)) + (condition-case nil + (require 'compile) + (error nil)) + (condition-case nil + (require 'custom) + (error nil)) + (condition-case nil + (require 'dinotrace) + (error nil)) + (condition-case nil + (if (fboundp 'dinotrace-unannotate-all) + nil ;; great + (defun dinotrace-unannotate-all (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'customize-apropos) + nil ;; great + (defun customize-apropos (&rest args) nil)) + (error nil)) + (condition-case nil + (if (fboundp 'match-string-no-properties) + nil ;; great + (defsubst match-string-no-properties (num &optional string) + "Return string of text matched by last search, without text properties. NUM specifies which parenthesized expression in the last regexp. Value is nil if NUMth pair didn't match, or there were less than NUM pairs. Zero means the entire text matched by the whole regexp or whole string. STRING should be given if the last search was by `string-match' on STRING." - (if (match-beginning num) - (if string - (let ((result - (substring string (match-beginning num) (match-end num)))) - (set-text-properties 0 (length result) nil result) - result) - (buffer-substring-no-properties (match-beginning num) - (match-end num) - (current-buffer) - ))))) - (error nil)) - (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) - nil ;; We've got what we needed - ;; We have the old custom-library, hack around it! - (defmacro defgroup (&rest args) nil) - (defmacro customize (&rest args) - (message "Sorry, Customize is not available with this version of emacs")) - (defmacro defcustom (var value doc &rest args) - (` (defvar (, var) (, value) (, doc)))) - ) - (if (fboundp 'defface) - nil ; great! - (defmacro defface (var value doc &rest args) - (` (make-face (, var)))) - ) + (if (match-beginning num) + (if string + (let ((result + (substring string (match-beginning num) (match-end num)))) + (set-text-properties 0 (length result) nil result) + result) + (buffer-substring-no-properties (match-beginning num) + (match-end num) + (current-buffer) + ))))) + (error nil)) + (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) + nil ;; We've got what we needed + ;; We have the old custom-library, hack around it! + (defmacro defgroup (&rest args) nil) + (defmacro customize (&rest args) + (message "Sorry, Customize is not available with this version of emacs")) + (defmacro defcustom (var value doc &rest args) + `(defvar ,var ,value ,doc)) + ) + (if (fboundp 'defface) + nil ; great! + (defmacro defface (var values doc &rest args) + `(make-face ,var)) + ) - (if (and (featurep 'custom) (fboundp 'customize-group)) - nil ;; We've got what we needed - ;; We have an intermediate custom-library, hack around it! - (defmacro customize-group (var &rest args) - (`(customize (, var) ))) - ) + (if (and (featurep 'custom) (fboundp 'customize-group)) + nil ;; We've got what we needed + ;; We have an intermediate custom-library, hack around it! + (defmacro customize-group (var &rest args) + `(customize ,var)) + ) - )) + ) ;; Provide a regular expression optimization routine, using regexp-opt ;; if provided by the user's elisp libraries (eval-and-compile (if (fboundp 'regexp-opt) ;; regexp-opt is defined, does it take 3 or 2 arguments? (if (fboundp 'function-max-args) - (case (function-max-args `regexp-opt) - ( 3 ;; It takes 3 + (let ((args (function-max-args `regexp-opt))) + (cond + ((eq args 3) ;; It takes 3 (condition-case nil ; Hide this defun from emacses ;with just a two input regexp (defun verilog-regexp-opt (a b) @@ -258,12 +254,12 @@ STRING should be given if the last search was by `string-match' on STRING." ) (error nil)) ) - ( 2 ;; It takes 2 + ((eq args 2) ;; It takes 2 (defun verilog-regexp-opt (a b) "Call 'regexp-opt' on A and B." (regexp-opt a b)) ) - ( t nil)) + (t nil))) ;; We can't tell; assume it takes 2 (defun verilog-regexp-opt (a b) "Call 'regexp-opt' on A and B." @@ -275,11 +271,6 @@ STRING should be given if the last search was by `string-match' on STRING." (concat open (mapconcat 'regexp-quote strings "\\|") close))) )) -(eval-when-compile - (defun verilog-regexp-words (a) - "Call 'regexp-opt' with word delimiters." - (concat "\\<" (verilog-regexp-opt a t) "\\>"))) - (defun verilog-regexp-words (a) "Call 'regexp-opt' with word delimiters for the words A." (concat "\\<" (verilog-regexp-opt a t) "\\>")) @@ -881,50 +872,45 @@ If set will become buffer local.") "*Default name of Project for verilog header. If set will become buffer local.") -(define-abbrev-table 'verilog-mode-abbrev-table ()) - (defvar verilog-mode-map () + (let ((map (make-sparse-keymap))) + (define-key map ";" 'electric-verilog-semi) + (define-key map [(control 59)] 'electric-verilog-semi-with-comment) + (define-key map ":" 'electric-verilog-colon) + ;;(define-key map "=" 'electric-verilog-equal) + (define-key map "\`" 'electric-verilog-tick) + (define-key map "\t" 'electric-verilog-tab) + (define-key map "\r" 'electric-verilog-terminate-line) + ;; backspace/delete key bindings + (define-key map [backspace] 'backward-delete-char-untabify) + (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable + (define-key map [delete] 'delete-char) + (define-key map [(meta delete)] 'kill-word)) + (define-key map "\M-\C-b" 'electric-verilog-backward-sexp) + (define-key map "\M-\C-f" 'electric-verilog-forward-sexp) + (define-key map "\M-\r" `electric-verilog-terminate-and-indent) + (define-key map "\M-\t" 'verilog-complete-word) + (define-key map "\M-?" 'verilog-show-completions) + (define-key map [(meta control h)] 'verilog-mark-defun) + (define-key map "\C-c\`" 'verilog-lint-off) + (define-key map "\C-c\*" 'verilog-delete-auto-star-implicit) + (define-key map "\C-c\C-r" 'verilog-label-be) + (define-key map "\C-c\C-i" 'verilog-pretty-declarations) + (define-key map "\C-c=" 'verilog-pretty-expr) + (define-key map "\C-c\C-b" 'verilog-submit-bug-report) + (define-key map "\M-*" 'verilog-star-comment) + (define-key map "\C-c\C-c" 'verilog-comment-region) + (define-key map "\C-c\C-u" 'verilog-uncomment-region) + (define-key map "\M-\C-a" 'verilog-beg-of-defun) + (define-key map "\M-\C-e" 'verilog-end-of-defun) + (define-key map "\C-c\C-d" 'verilog-goto-defun) + (define-key map "\C-c\C-k" 'verilog-delete-auto) + (define-key map "\C-c\C-a" 'verilog-auto) + (define-key map "\C-c\C-s" 'verilog-auto-save-compile) + (define-key map "\C-c\C-z" 'verilog-inject-auto) + (define-key map "\C-c\C-e" 'verilog-expand-vector) + (define-key map "\C-c\C-h" 'verilog-header)) "Keymap used in Verilog mode.") -(if verilog-mode-map - () - (setq verilog-mode-map (make-sparse-keymap)) - (define-key verilog-mode-map ";" 'electric-verilog-semi) - (define-key verilog-mode-map [(control 59)] 'electric-verilog-semi-with-comment) - (define-key verilog-mode-map ":" 'electric-verilog-colon) - ;;(define-key verilog-mode-map "=" 'electric-verilog-equal) - (define-key verilog-mode-map "\`" 'electric-verilog-tick) - (define-key verilog-mode-map "\t" 'electric-verilog-tab) - (define-key verilog-mode-map "\r" 'electric-verilog-terminate-line) - ;; backspace/delete key bindings - (define-key verilog-mode-map [backspace] 'backward-delete-char-untabify) - (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable - (define-key verilog-mode-map [delete] 'delete-char) - (define-key verilog-mode-map [(meta delete)] 'kill-word)) - (define-key verilog-mode-map "\M-\C-b" 'electric-verilog-backward-sexp) - (define-key verilog-mode-map "\M-\C-f" 'electric-verilog-forward-sexp) - (define-key verilog-mode-map "\M-\r" `electric-verilog-terminate-and-indent) - (define-key verilog-mode-map "\M-\t" 'verilog-complete-word) - (define-key verilog-mode-map "\M-?" 'verilog-show-completions) - (define-key verilog-mode-map [(meta control h)] 'verilog-mark-defun) - (define-key verilog-mode-map "\C-c\`" 'verilog-lint-off) - (define-key verilog-mode-map "\C-c\*" 'verilog-delete-auto-star-implicit) - (define-key verilog-mode-map "\C-c\C-r" 'verilog-label-be) - (define-key verilog-mode-map "\C-c\C-i" 'verilog-pretty-declarations) - (define-key verilog-mode-map "\C-c=" 'verilog-pretty-expr) - (define-key verilog-mode-map "\C-c\C-b" 'verilog-submit-bug-report) - (define-key verilog-mode-map "\M-*" 'verilog-star-comment) - (define-key verilog-mode-map "\C-c\C-c" 'verilog-comment-region) - (define-key verilog-mode-map "\C-c\C-u" 'verilog-uncomment-region) - (define-key verilog-mode-map "\M-\C-a" 'verilog-beg-of-defun) - (define-key verilog-mode-map "\M-\C-e" 'verilog-end-of-defun) - (define-key verilog-mode-map "\C-c\C-d" 'verilog-goto-defun) - (define-key verilog-mode-map "\C-c\C-k" 'verilog-delete-auto) - (define-key verilog-mode-map "\C-c\C-a" 'verilog-auto) - (define-key verilog-mode-map "\C-c\C-s" 'verilog-auto-save-compile) - (define-key verilog-mode-map "\C-c\C-z" 'verilog-inject-auto) - (define-key verilog-mode-map "\C-c\C-e" 'verilog-expand-vector) - (define-key verilog-mode-map "\C-c\C-h" 'verilog-header) - ) ;; menus (defvar verilog-xemacs-menu @@ -1384,11 +1370,11 @@ Called by `compilation-mode-hook'. This allows \\[next-error] to find the error (verilog-regexp-words `( ;; port direction - "inout" "input" "output" "ref" + "inout" "input" "output" "ref" ;; changeableness "const" "static" "protected" "local" ;; parameters - "localparam" "parameter" "var" + "localparam" "parameter" "var" ;; type creation "typedef" )))) @@ -1408,9 +1394,9 @@ Called by `compilation-mode-hook'. This allows \\[next-error] to find the error "string" "event" "chandle" "virtual" "enum" "genvar" "struct" "union" ;; builtin classes - "mailbox" "semaphore" + "mailbox" "semaphore" )))) -(defconst verilog-declaration-re +(defconst verilog-declaration-re (concat "\\(" verilog-declaration-prefix-re "\\s-*\\)?" verilog-declaration-core-re)) (defconst verilog-range-re "\\(\\[[^]]*\\]\\s-*\\)+") (defconst verilog-optional-signed-re "\\s-*\\(signed\\)?") @@ -1676,7 +1662,7 @@ fashion, but strange indentation errors could be encountered." (print (format "The version of Emacs 18 you are running, %s, has known deficiencies in its ability to handle the dual verilog -(and C++) comments, (e.g. the // and /* */ comments). This will +\(and C++) comments, (e.g. the // and /* */ comments). This will not be much of a problem for you if you only use the /* */ comments, but you really should strongly consider upgrading to one of the latest Emacs 19's. In Emacs 18, you may also experience performance degradations. @@ -2323,7 +2309,7 @@ so there may be a large up front penalty for the first search." ;; Mode ;; (defvar verilog-which-tool 1) -;;###autoload +;;;###autoload (defun verilog-mode () "Major mode for editing Verilog code. \\<verilog-mode-map> @@ -2459,6 +2445,10 @@ Key bindings specific to `verilog-mode-map' are: (setq local-abbrev-table verilog-mode-abbrev-table) (setq verilog-mode-syntax-table (make-syntax-table)) (verilog-populate-syntax-table verilog-mode-syntax-table) + (set (make-local-variable 'beginning-of-defun-function) + 'verilog-beg-of-defun) + (set (make-local-variable 'end-of-defun-function) + 'verilog-end-of-defun) ;; add extra comment syntax (verilog-setup-dual-comments verilog-mode-syntax-table) (set-syntax-table verilog-mode-syntax-table) @@ -2483,17 +2473,13 @@ Key bindings specific to `verilog-mode-map' are: (add-hook 'hack-local-variables-hook 'verilog-modify-compile-command t)) ;; Setting up menus - (if (featurep 'xemacs) - (progn - (if (and current-menubar - (not (assoc "Verilog" current-menubar))) - (progn - ;; (set-buffer-menubar (copy-sequence current-menubar)) - (add-submenu nil verilog-xemacs-menu) - (add-submenu nil verilog-stmt-menu) - ) - ) - )) + (when (featurep 'xemacs) + (when (and current-menubar + (not (assoc "Verilog" current-menubar))) + ;; (set-buffer-menubar (copy-sequence current-menubar)) + (add-submenu nil verilog-xemacs-menu) + (add-submenu nil verilog-stmt-menu) + )) ;; Stuff for GNU emacs (make-local-variable 'font-lock-defaults) ;;------------------------------------------------------------ @@ -2737,7 +2723,7 @@ To call this from the command line, see \\[verilog-batch-indent]." The upper left corner is defined by the current point. Indices always begin with 0 and extend to the MAX - 1. If no prefix arg is given, the user is prompted for a value. The indices are surrounded by square brackets -[]. For example, the following code with the point located after the first +\[]. For example, the following code with the point located after the first 'a' gives: a = b a[ 0] = b @@ -3007,7 +2993,7 @@ With ARG, first kill any existing labels." (goto-char (match-beginning 0)) (throw 'found nil)) ((looking-at "[ \t]*)") - (throw 'found (point))) + (throw 'found (point))) ((eobp) (throw 'found (point)))))))) (if (not pos) @@ -3831,11 +3817,11 @@ becomes: (defmacro verilog-batch-error-wrapper (&rest body) "Execute BODY and add error prefix to any errors found. This lets programs calling batch mode to easily extract error messages." - (` (condition-case err - (progn (,@ body)) - (error - (error "%%Error: %s%s" (error-message-string err) - (if (featurep 'xemacs) "\n" "")))))) ;; xemacs forgets to add a newline + `(condition-case err + (progn ,@body) + (error + (error "%%Error: %s%s" (error-message-string err) + (if (featurep 'xemacs) "\n" ""))))) ;; xemacs forgets to add a newline (defun verilog-batch-execute-func (funref) "Internal processing of a batch command, running FUNREF on all command arguments." @@ -5127,7 +5113,7 @@ BASEIND is the base indent to offset everything." ;; Use previous declaration (in this module) as template. (if (or (memq 'all verilog-auto-lineup) (memq 'declaration verilog-auto-lineup)) - (if (verilog-re-search-backward + (if (verilog-re-search-backward (or (and verilog-indent-declaration-macros verilog-declaration-re-1-macro) verilog-declaration-re-1-no-macro) lim t) @@ -5186,7 +5172,7 @@ Region is defined by B and EDPOS." ;; Get rightmost position (while (progn (setq e (marker-position edpos)) (< (point) e)) - (if (verilog-re-search-forward + (if (verilog-re-search-forward (or (and verilog-indent-declaration-macros verilog-declaration-re-1-macro) verilog-declaration-re-1-no-macro) e 'move) @@ -9443,7 +9429,7 @@ This will allow trace viewers to show the ASCII name of states. First, parameters are built into a enumeration using the synopsys enum comment. The comment must be between the keyword and the symbol. -(Annoying, but that's what Synopsys's dc_shell FSM reader requires.) +\(Annoying, but that's what Synopsys's dc_shell FSM reader requires.) Next, registers which that enum applies to are also tagged with the same enum. Synopsys also suggests labeling state vectors, but `verilog-mode' @@ -9731,39 +9717,38 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com." ;; ;; Skeleton based code insertion ;; -(defvar verilog-template-map nil +(defvar verilog-template-map + (let ((map (make-sparse-keymap))) + (define-key map "a" 'verilog-sk-always) + (define-key map "b" 'verilog-sk-begin) + (define-key map "c" 'verilog-sk-case) + (define-key map "f" 'verilog-sk-for) + (define-key map "g" 'verilog-sk-generate) + (define-key map "h" 'verilog-sk-header) + (define-key map "i" 'verilog-sk-initial) + (define-key map "j" 'verilog-sk-fork) + (define-key map "m" 'verilog-sk-module) + (define-key map "p" 'verilog-sk-primitive) + (define-key map "r" 'verilog-sk-repeat) + (define-key map "s" 'verilog-sk-specify) + (define-key map "t" 'verilog-sk-task) + (define-key map "w" 'verilog-sk-while) + (define-key map "x" 'verilog-sk-casex) + (define-key map "z" 'verilog-sk-casez) + (define-key map "?" 'verilog-sk-if) + (define-key map ":" 'verilog-sk-else-if) + (define-key map "/" 'verilog-sk-comment) + (define-key map "A" 'verilog-sk-assign) + (define-key map "F" 'verilog-sk-function) + (define-key map "I" 'verilog-sk-input) + (define-key map "O" 'verilog-sk-output) + (define-key map "S" 'verilog-sk-state-machine) + (define-key map "=" 'verilog-sk-inout) + (define-key map "W" 'verilog-sk-wire) + (define-key map "R" 'verilog-sk-reg) + (define-key map "D" 'verilog-sk-define-signal)) "Keymap used in Verilog mode for smart template operations.") -(let ((verilog-mp (make-sparse-keymap))) - (define-key verilog-mp "a" 'verilog-sk-always) - (define-key verilog-mp "b" 'verilog-sk-begin) - (define-key verilog-mp "c" 'verilog-sk-case) - (define-key verilog-mp "f" 'verilog-sk-for) - (define-key verilog-mp "g" 'verilog-sk-generate) - (define-key verilog-mp "h" 'verilog-sk-header) - (define-key verilog-mp "i" 'verilog-sk-initial) - (define-key verilog-mp "j" 'verilog-sk-fork) - (define-key verilog-mp "m" 'verilog-sk-module) - (define-key verilog-mp "p" 'verilog-sk-primitive) - (define-key verilog-mp "r" 'verilog-sk-repeat) - (define-key verilog-mp "s" 'verilog-sk-specify) - (define-key verilog-mp "t" 'verilog-sk-task) - (define-key verilog-mp "w" 'verilog-sk-while) - (define-key verilog-mp "x" 'verilog-sk-casex) - (define-key verilog-mp "z" 'verilog-sk-casez) - (define-key verilog-mp "?" 'verilog-sk-if) - (define-key verilog-mp ":" 'verilog-sk-else-if) - (define-key verilog-mp "/" 'verilog-sk-comment) - (define-key verilog-mp "A" 'verilog-sk-assign) - (define-key verilog-mp "F" 'verilog-sk-function) - (define-key verilog-mp "I" 'verilog-sk-input) - (define-key verilog-mp "O" 'verilog-sk-output) - (define-key verilog-mp "S" 'verilog-sk-state-machine) - (define-key verilog-mp "=" 'verilog-sk-inout) - (define-key verilog-mp "W" 'verilog-sk-wire) - (define-key verilog-mp "R" 'verilog-sk-reg) - (define-key verilog-mp "D" 'verilog-sk-define-signal) - (setq verilog-template-map verilog-mp)) ;; ;; Place the templates into Verilog Mode. They may be inserted under any key. @@ -10124,11 +10109,7 @@ and the case items." "^`include\\s-+\"\\([^\n\"]*\\)\"" "Regexp that matches the include file.") -(defvar verilog-mode-mouse-map nil - "Map containing mouse bindings for `verilog-mode'.") - -(if verilog-mode-mouse-map - () +(defvar verilog-mode-mouse-map (let ((map (make-sparse-keymap))) ; as described in info pages, make a map (set-keymap-parent map verilog-mode-map) ;; mouse button bindings @@ -10138,8 +10119,9 @@ and the case items." (define-key map [mouse-2] 'verilog-load-file-at-mouse)) (if (featurep 'xemacs) (define-key map 'Sh-button2 'mouse-yank) ; you wanna paste don't you ? - (define-key map [S-mouse-2] 'mouse-yank-at-click)) - (setq verilog-mode-mouse-map map))) ;; copy complete map now + (define-key map [S-mouse-2] 'mouse-yank-at-click))) + "Map containing mouse bindings for `verilog-mode'.") + ;; create set-extent-keymap procedure when it does not exist (eval-and-compile @@ -10327,6 +10309,8 @@ but instead, [[Fill in here]] happens!. == The code: ==")))) +(provide 'verilog-mode) + ;; Local Variables: ;; checkdoc-permit-comma-termination-flag:t ;; checkdoc-force-docstrings-flag:nil From b68a96b966c7893316c6135764f6a04eb529d21e Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 19:19:43 +0000 Subject: [PATCH 052/172] (verilog-string-replace-matches) (verilog-string-remove-spaces, verilog-re-search-forward) (verilog-re-search-backward, verilog-re-search-forward-quick) (verilog-re-search-backward-quick, verilog-get-beg-of-line) (verilog-get-end-of-line, verilog-within-string): Move definitions before first use. No code changes. --- lisp/ChangeLog | 9 ++ lisp/progmodes/verilog-mode.el | 184 ++++++++++++++++----------------- 2 files changed, 101 insertions(+), 92 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4fa2d6de0c6..2295cab3b86 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> + + * progmodes/verilog-mode.el (verilog-string-replace-matches) + (verilog-string-remove-spaces, verilog-re-search-forward) + (verilog-re-search-backward, verilog-re-search-forward-quick) + (verilog-re-search-backward-quick, verilog-get-beg-of-line) + (verilog-get-end-of-line, verilog-within-string): Move definitions + before first use. No code changes. + 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> * progmodes/verilog-mode.el (verilog-mode-version) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index baec1ec3f9f..0fbe238d912 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -1057,6 +1057,98 @@ If set will become buffer local.") (define-abbrev-table 'verilog-mode-abbrev-table ()) +;; +;; Macros +;; + +(defsubst verilog-string-replace-matches (from-string to-string fixedcase literal string) + "Replace occurrences of FROM-STRING with TO-STRING. +FIXEDCASE and LITERAL as in `replace-match`. STRING is what to replace. +The case (verilog-string-replace-matches \"o\" \"oo\" nil nil \"foobar\") +will break, as the o's continuously replace. xa -> x works ok though." + ;; Hopefully soon to a emacs built-in + (let ((start 0)) + (while (string-match from-string string start) + (setq string (replace-match to-string fixedcase literal string) + start (min (length string) (match-end 0)))) + string)) + +(defsubst verilog-string-remove-spaces (string) + "Remove spaces surrounding STRING." + (save-match-data + (setq string (verilog-string-replace-matches "^\\s-+" "" nil nil string)) + (setq string (verilog-string-replace-matches "\\s-+$" "" nil nil string)) + string)) + +(defsubst verilog-re-search-forward (REGEXP BOUND NOERROR) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `re-search-forward', but skips over match in comments or strings." + (store-match-data '(nil nil)) + (while (and + (re-search-forward REGEXP BOUND NOERROR) + (and (verilog-skip-forward-comment-or-string) + (progn + (store-match-data '(nil nil)) + (if BOUND + (< (point) BOUND) + t) + )))) + (match-end 0)) + +(defsubst verilog-re-search-backward (REGEXP BOUND NOERROR) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `re-search-backward', but skips over match in comments or strings." + (store-match-data '(nil nil)) + (while (and + (re-search-backward REGEXP BOUND NOERROR) + (and (verilog-skip-backward-comment-or-string) + (progn + (store-match-data '(nil nil)) + (if BOUND + (> (point) BOUND) + t) + )))) + (match-end 0)) + +(defsubst verilog-re-search-forward-quick (regexp bound noerror) + "Like `verilog-re-search-forward', including use of REGEXP BOUND and NOERROR, +but trashes match data and is faster for REGEXP that doesn't match often. +This may at some point use text properties to ignore comments, +so there may be a large up front penalty for the first search." + (let (pt) + (while (and (not pt) + (re-search-forward regexp bound noerror)) + (if (not (verilog-inside-comment-p)) + (setq pt (match-end 0)))) + pt)) + +(defsubst verilog-re-search-backward-quick (regexp bound noerror) + ; checkdoc-params: (REGEXP BOUND NOERROR) + "Like `verilog-re-search-backward', including use of REGEXP BOUND and NOERROR, +but trashes match data and is faster for REGEXP that doesn't match often. +This may at some point use text properties to ignore comments, +so there may be a large up front penalty for the first search." + (let (pt) + (while (and (not pt) + (re-search-backward regexp bound noerror)) + (if (not (verilog-inside-comment-p)) + (setq pt (match-end 0)))) + pt)) + +(defsubst verilog-get-beg-of-line (&optional arg) + (save-excursion + (beginning-of-line arg) + (point))) + +(defsubst verilog-get-end-of-line (&optional arg) + (save-excursion + (end-of-line arg) + (point))) + +(defsubst verilog-within-string () + (save-excursion + (nth 3 (parse-partial-sexp (verilog-get-beg-of-line) (point))))) + ;; compilation program (defun verilog-set-compile-command () "Function to compute shell command to compile verilog. @@ -2147,98 +2239,6 @@ Use filename, if current buffer being edited shorten to just buffer name." (defun verilog-declaration-beg () (verilog-re-search-backward verilog-declaration-re (bobp) t)) -;; -;; Macros -;; - -(defsubst verilog-string-replace-matches (from-string to-string fixedcase literal string) - "Replace occurrences of FROM-STRING with TO-STRING. -FIXEDCASE and LITERAL as in `replace-match`. STRING is what to replace. -The case (verilog-string-replace-matches \"o\" \"oo\" nil nil \"foobar\") -will break, as the o's continuously replace. xa -> x works ok though." - ;; Hopefully soon to a emacs built-in - (let ((start 0)) - (while (string-match from-string string start) - (setq string (replace-match to-string fixedcase literal string) - start (min (length string) (match-end 0)))) - string)) - -(defsubst verilog-string-remove-spaces (string) - "Remove spaces surrounding STRING." - (save-match-data - (setq string (verilog-string-replace-matches "^\\s-+" "" nil nil string)) - (setq string (verilog-string-replace-matches "\\s-+$" "" nil nil string)) - string)) - -(defsubst verilog-re-search-forward (REGEXP BOUND NOERROR) - ; checkdoc-params: (REGEXP BOUND NOERROR) - "Like `re-search-forward', but skips over match in comments or strings." - (store-match-data '(nil nil)) - (while (and - (re-search-forward REGEXP BOUND NOERROR) - (and (verilog-skip-forward-comment-or-string) - (progn - (store-match-data '(nil nil)) - (if BOUND - (< (point) BOUND) - t) - )))) - (match-end 0)) - -(defsubst verilog-re-search-backward (REGEXP BOUND NOERROR) - ; checkdoc-params: (REGEXP BOUND NOERROR) - "Like `re-search-backward', but skips over match in comments or strings." - (store-match-data '(nil nil)) - (while (and - (re-search-backward REGEXP BOUND NOERROR) - (and (verilog-skip-backward-comment-or-string) - (progn - (store-match-data '(nil nil)) - (if BOUND - (> (point) BOUND) - t) - )))) - (match-end 0)) - -(defsubst verilog-re-search-forward-quick (regexp bound noerror) - "Like `verilog-re-search-forward', including use of REGEXP BOUND and NOERROR, -but trashes match data and is faster for REGEXP that doesn't match often. -This may at some point use text properties to ignore comments, -so there may be a large up front penalty for the first search." - (let (pt) - (while (and (not pt) - (re-search-forward regexp bound noerror)) - (if (not (verilog-inside-comment-p)) - (setq pt (match-end 0)))) - pt)) - -(defsubst verilog-re-search-backward-quick (regexp bound noerror) - ; checkdoc-params: (REGEXP BOUND NOERROR) - "Like `verilog-re-search-backward', including use of REGEXP BOUND and NOERROR, -but trashes match data and is faster for REGEXP that doesn't match often. -This may at some point use text properties to ignore comments, -so there may be a large up front penalty for the first search." - (let (pt) - (while (and (not pt) - (re-search-backward regexp bound noerror)) - (if (not (verilog-inside-comment-p)) - (setq pt (match-end 0)))) - pt)) - -(defsubst verilog-get-beg-of-line (&optional arg) - (save-excursion - (beginning-of-line arg) - (point))) - -(defsubst verilog-get-end-of-line (&optional arg) - (save-excursion - (end-of-line arg) - (point))) - -(defsubst verilog-within-string () - (save-excursion - (nth 3 (parse-partial-sexp (verilog-get-beg-of-line) (point))))) - (require 'font-lock) (defvar verilog-need-fld 1) (defvar font-lock-defaults-alist nil) ;In case we are XEmacs From 62a7c35dbc53e79b828e2f0faffe36337e962114 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 19:39:26 +0000 Subject: [PATCH 053/172] (auto-mode-alist): Recognize verilog files. --- lisp/ChangeLog | 2 ++ lisp/files.el | 1 + 2 files changed, 3 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2295cab3b86..46db546954e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> + * files.el (auto-mode-alist): Recognize verilog files. + * progmodes/verilog-mode.el (verilog-string-replace-matches) (verilog-string-remove-spaces, verilog-re-search-forward) (verilog-re-search-backward, verilog-re-search-forward-quick) diff --git a/lisp/files.el b/lisp/files.el index 6aff489e0a2..09d020533f5 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -1990,6 +1990,7 @@ since only a single case-insensitive search through the alist is made." ("\\.ds\\(ss\\)?l\\'" . dsssl-mode) ("\\.js\\'" . java-mode) ; javascript-mode would be better ("\\.x[bp]m\\'" . c-mode) + ("\\.d?v\\'" . verilog-mode) ;; .emacs or .gnus or .viper following a directory delimiter in ;; Unix, MSDOG or VMS syntax. ("[]>:/\\]\\..*\\(emacs\\|gnus\\|viper\\)\\'" . emacs-lisp-mode) From 7d49d8e100f78ea9c475501dba4d780dd7bc1f1f Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 19:59:24 +0000 Subject: [PATCH 054/172] * progmodes/verilog-mode.el (verilog-mode-map): Fix typo. --- lisp/ChangeLog | 2 ++ lisp/progmodes/verilog-mode.el | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 46db546954e..c773b03241d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> + * progmodes/verilog-mode.el (verilog-mode-map): Fix typo. + * files.el (auto-mode-alist): Recognize verilog files. * progmodes/verilog-mode.el (verilog-string-replace-matches) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 0fbe238d912..94ac97836cc 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -872,7 +872,7 @@ If set will become buffer local.") "*Default name of Project for verilog header. If set will become buffer local.") -(defvar verilog-mode-map () +(defvar verilog-mode-map (let ((map (make-sparse-keymap))) (define-key map ";" 'electric-verilog-semi) (define-key map [(control 59)] 'electric-verilog-semi-with-comment) From 30d48f20cdd2708c67ca419891fb53b5ebec318c Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 20:43:01 +0000 Subject: [PATCH 055/172] * progmodes/verilog-mode.el (verilog-mode-map) (verilog-template-map, verilog-mode-mouse-map): Fix typos. (verilog-colorize-include-files): Use only overlay functions so that it can work on both emacs and XEmacs. (set-extent-keymap): Remove unused defun. --- lisp/ChangeLog | 8 ++++++-- lisp/progmodes/verilog-mode.el | 34 ++++++++++++++-------------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c773b03241d..00f525ec533 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,7 +1,11 @@ 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> - * progmodes/verilog-mode.el (verilog-mode-map): Fix typo. - + * progmodes/verilog-mode.el (verilog-mode-map) + (verilog-template-map, verilog-mode-mouse-map): Fix typos. + (verilog-colorize-include-files): Use only overlay functions so + that it can work on both emacs and XEmacs. + (set-extent-keymap): Remove unused defun. + * files.el (auto-mode-alist): Recognize verilog files. * progmodes/verilog-mode.el (verilog-string-replace-matches) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 94ac97836cc..7bc4a18c0ad 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -909,7 +909,8 @@ If set will become buffer local.") (define-key map "\C-c\C-s" 'verilog-auto-save-compile) (define-key map "\C-c\C-z" 'verilog-inject-auto) (define-key map "\C-c\C-e" 'verilog-expand-vector) - (define-key map "\C-c\C-h" 'verilog-header)) + (define-key map "\C-c\C-h" 'verilog-header) + map) "Keymap used in Verilog mode.") ;; menus @@ -9746,7 +9747,8 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com." (define-key map "=" 'verilog-sk-inout) (define-key map "W" 'verilog-sk-wire) (define-key map "R" 'verilog-sk-reg) - (define-key map "D" 'verilog-sk-define-signal)) + (define-key map "D" 'verilog-sk-define-signal) + map) "Keymap used in Verilog mode for smart template operations.") @@ -10119,17 +10121,11 @@ and the case items." (define-key map [mouse-2] 'verilog-load-file-at-mouse)) (if (featurep 'xemacs) (define-key map 'Sh-button2 'mouse-yank) ; you wanna paste don't you ? - (define-key map [S-mouse-2] 'mouse-yank-at-click))) + (define-key map [S-mouse-2] 'mouse-yank-at-click)) + map) "Map containing mouse bindings for `verilog-mode'.") -;; create set-extent-keymap procedure when it does not exist -(eval-and-compile - (unless (fboundp 'set-extent-keymap) - (defun set-extent-keymap (extent keymap) - "fallback version of set-extent-keymap (for emacs 2[01])" - (set-extent-property extent 'local-map keymap)))) - (defun verilog-colorize-include-files (beg end old-len) "This function colorizes included files when the mouse passes over them. Clicking on the middle-mouse button loads them in a buffer (as in dired)." @@ -10150,17 +10146,15 @@ Clicking on the middle-mouse button loads them in a buffer (as in dired)." (setq overlays (cdr overlays)))) ; let ;; make new ones, could reuse deleted one ? (while (search-forward-regexp verilog-include-file-regexp end-point t) - (let (extent) + (let (ov) (goto-char (match-beginning 1)) - (or (extent-at (point) (buffer-name) 'mouse-face) ;; not yet extended - (progn - (setq extent (make-extent (match-beginning 1) (match-end 1))) - (set-extent-property extent 'start-closed 't) - (set-extent-property extent 'end-closed 't) - (set-extent-property extent 'detachable 't) - (set-extent-property extent 'verilog-include-file 't) - (set-extent-property extent 'mouse-face 'highlight) - (set-extent-keymap extent verilog-mode-mouse-map))))))))) + (setq ov (make-overlay (match-beginning 1) (match-end 1))) + (overlay-put ov 'start-closed 't) + (overlay-put ov 'end-closed 't) + (overlay-put ov 'evaporate 't) + (overlay-put ov 'verilog-include-file 't) + (overlay-put ov 'mouse-face 'highlight) + (overlay-put ov 'local-map verilog-mode-mouse-map))))))) (defun verilog-colorize-include-files-buffer () From d65f0593f570209520091170d57c216d2c0b9008 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 21:34:13 +0000 Subject: [PATCH 056/172] * emacs.desktop (Exec, Icon, Categories): Fix entries. --- etc/ChangeLog | 4 ++++ etc/emacs.desktop | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/etc/ChangeLog b/etc/ChangeLog index a0a3707ed06..c2d8deb8218 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,7 @@ +2007-12-08 Ulrich Mueller <ulm@gentoo.org> + + * emacs.desktop (Exec, Icon, Categories): Fix entries. + 2007-12-08 Reiner Steib <Reiner.Steib@gmx.de> * NEWS: Add minimal Gnus item. diff --git a/etc/emacs.desktop b/etc/emacs.desktop index 630d3c78834..4e2603b32c8 100644 --- a/etc/emacs.desktop +++ b/etc/emacs.desktop @@ -3,10 +3,9 @@ Name=Emacs GenericName=Text Editor Comment=Edit text MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++; -Exec=emacs %f -Icon=emacs_32.png +Exec=emacs %F +Icon=emacs_32 Type=Application Terminal=false -Categories=Application;Development;TextEditor; -Encoding=UTF-8 +Categories=Development;TextEditor; StartupWMClass=Emacs From 4f85908cfe4632dbd5f9d9f4412ccdfb74eafbf2 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 22:27:34 +0000 Subject: [PATCH 057/172] *** empty log message *** --- etc/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/ChangeLog b/etc/ChangeLog index c2d8deb8218..b6b86ce4ae0 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,4 +1,4 @@ -2007-12-08 Ulrich Mueller <ulm@gentoo.org> +2007-12-08 Ulrich Mueller <ulm@gentoo.org> (tiny change) * emacs.desktop (Exec, Icon, Categories): Fix entries. From c486a8e4ff23168c0a45466f72ffe4efb6a8dfc9 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sat, 8 Dec 2007 22:56:04 +0000 Subject: [PATCH 058/172] * mail/hashcash.el (declare-function): * net/imap.el (declare-function): New no-op macro for backward compatibility. --- lisp/ChangeLog | 8 +++++++- lisp/mail/hashcash.el | 3 +++ lisp/net/imap.el | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 638fdbae06b..ec7ce254dae 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,7 +1,13 @@ +2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> + + * mail/hashcash.el (declare-function): + * net/imap.el (declare-function): New no-op macro for backward + compatibility. + 2007-12-08 Eli Zaretskii <eliz@gnu.org> Sync makefile.w32-in with Makefile.in. - + * makefile.w32-in (check-declare): New target. (BYTE_COMPILE_EXTRA_FLAGS): New variable. (.el.elc, compile-CMD, compile-SH, compile-always-CMD) diff --git a/lisp/mail/hashcash.el b/lisp/mail/hashcash.el index 22005ce957e..1f4483a7c94 100644 --- a/lisp/mail/hashcash.el +++ b/lisp/mail/hashcash.el @@ -49,6 +49,9 @@ ;;; Code: +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (defgroup hashcash nil "Hashcash configuration." :group 'mail) diff --git a/lisp/net/imap.el b/lisp/net/imap.el index 8e41c68720b..85af73972fe 100644 --- a/lisp/net/imap.el +++ b/lisp/net/imap.el @@ -140,6 +140,7 @@ (eval-when-compile (require 'cl)) (eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))) (autoload 'starttls-open-stream "starttls") (autoload 'starttls-negotiate "starttls") (autoload 'sasl-find-mechanism "sasl") From 637b4d38389f0afc839afebd3712e59b9b43f081 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 01:32:56 +0000 Subject: [PATCH 059/172] Fix copyright years. Re-license under GPLv3+. --- lisp/progmodes/verilog-mode.el | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 7bc4a18c0ad..6cd90ad561d 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -1,7 +1,7 @@ ;; verilog-mode.el --- major mode for editing verilog source in Emacs -;; -;; Copyright (C) 1996-2007 Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: Michael McNamara (mac@verilog.com) ;; http://www.verilog.com @@ -11,19 +11,22 @@ ;; http://www.veripool.com ;; Keywords: languages -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2 of the License, or -;; (at your option) any later version. +;; This file is part of GNU Emacs. -;; This program is distributed in the hope that it will be useful, +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: From 9640c3bce092d39e121b8101756282c816b99066 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:04:18 +0000 Subject: [PATCH 060/172] (declare-function): Add compatibility declaration. (w3-region, w3m-region, Info-menu): Declare as functions. --- lisp/gnus/gnus-art.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 4bb9ceb97ba..d8f03ff2cb8 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -27,6 +27,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) (defvar tool-bar-map) @@ -2705,6 +2708,9 @@ charset defined in `gnus-summary-show-article-charset-alist' is used." (t (apply (car func) (cdr func)))))))))) +;; External. +(declare-function w3-region "ext:w3-display" (st nd)) + (defun gnus-article-wash-html-with-w3 () "Wash the current buffer with w3." (mm-setup-w3) @@ -2716,6 +2722,9 @@ charset defined in `gnus-summary-show-article-charset-alist' is used." (w3-region (point-min) (point-max)) (error)))) +;; External. +(declare-function w3m-region "ext:w3m" (start end &optional url charset)) + (defun gnus-article-wash-html-with-w3m () "Wash the current buffer with emacs-w3m." (mm-setup-w3m) @@ -7682,6 +7691,9 @@ url is put as the `gnus-button-url' overlay property on the button." "Fetch KDE style info URL." (gnus-info-find-node (gnus-url-unhex-string url))) +;; (info) will autoload info.el +(declare-function Info-menu "info" (menu-item &optional fork)) + (defun gnus-button-handle-info-keystrokes (url) "Call `info' when pushing the corresponding URL button." ;; For links like `C-h i d m gnus RET', `C-h i d m CC Mode RET'. From 2d1974c9e45e089a6bb1ed51dbe3e2776dc274d7 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:05:41 +0000 Subject: [PATCH 061/172] (declare-function): Add compatibility declaration. (gnus-summary-from-or-to-or-newsgroups): Declare as function. --- lisp/gnus/gnus-spec.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/gnus-spec.el b/lisp/gnus/gnus-spec.el index f87377cb1ed..5b8bf92ffdb 100644 --- a/lisp/gnus/gnus-spec.el +++ b/lisp/gnus/gnus-spec.el @@ -27,6 +27,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) (defvar gnus-newsrc-file-version) @@ -87,6 +90,9 @@ text properties. This is only needed on XEmacs, as FSF Emacs does this anyway." (defvar gnus-tmp-header) (defvar gnus-tmp-from) +(declare-function gnus-summary-from-or-to-or-newsgroups "gnus-sum" + (header gnus-tmp-from)) + (defun gnus-summary-line-format-spec () (insert gnus-tmp-unread gnus-tmp-replied gnus-tmp-score-char gnus-tmp-indentation) From d09ae6ca78bb45c9c8042bdbc5e568febc020980 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:07:07 +0000 Subject: [PATCH 062/172] (declare-function): Add compatibility declaration. (gnus-get-predicate): Declare as function. --- lisp/gnus/gnus-sum.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 826fdd71896..72a79035f0c 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -27,6 +27,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) @@ -5576,6 +5579,8 @@ If SELECT-ARTICLES, only select those articles from GROUP." (gnus-inverse-list-range-intersection gnus-newsgroup-articles gnus-newsgroup-seen)))) +(declare-function gnus-get-predicate "gnus-agent" (predicate)) + (defun gnus-summary-display-make-predicate (display) (require 'gnus-agent) (when (= (length display) 1) From 88bfa2e405c457e05f6a481344c511fdfde2ebba Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:08:47 +0000 Subject: [PATCH 063/172] (declare-function): Add compatibility declaration. (mm-append-to-file, w32-focus-frame): Declare as functions. --- lisp/gnus/gnus-util.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index de01fb2db11..8a6e8fa71cb 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -35,6 +35,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) ;; Fixme: this should be a gnus variable, not nnmail-. @@ -987,6 +990,9 @@ with potentially long computations." (defvar rmail-default-rmail-file) (defvar mm-text-coding-system) +(declare-function mm-append-to-file "mm-util" + (start end filename &optional codesys inhibit)) + (defun gnus-output-to-rmail (filename &optional ask) "Append the current article to an Rmail file named FILENAME." (require 'rmail) @@ -1515,6 +1521,8 @@ CHOICE is a list of the choice char and help message at IDX." (kill-buffer buf)) tchar)) +(declare-function w32-focus-frame "../term/w32-win" (frame)) + (defun gnus-select-frame-set-input-focus (frame) "Select FRAME, raise it, and set input focus, if possible." (cond ((featurep 'xemacs) From b43906b677ba264cd3ca6324b6cd6ec1505b5bbb Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:10:05 +0000 Subject: [PATCH 064/172] (declare-function): Add compatibility declaration. (mail-abbrev-in-expansion-header-p): Declare as function. --- lisp/gnus/message.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 3aaa8c25745..919a4c06721 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -31,9 +31,11 @@ ;;; Code: +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) - + (require 'hashcash) (require 'canlock) (require 'mailheader) @@ -7474,6 +7476,8 @@ If nil, the function bound in `text-mode-map' or `global-map' is executed." :type '(choice (const nil) function)) +(declare-function mail-abbrev-in-expansion-header-p "mailabbrev" ()) + (defun message-tab () "Complete names according to `message-completion-alist'. Execute function specified by `message-tab-body-function' when not in From 49ad38a13c6bb79874fda023f4e60a2b7ac6db43 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:10:57 +0000 Subject: [PATCH 065/172] (declare-function): Add compatibility declaration. (w3-do-setup, w3-region, w3-prepare-buffer, w3m-detect-meta-charset) (w3m-region): Declare as functions. --- lisp/gnus/mm-view.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el index cb4f42dabcf..04e72dffa27 100644 --- a/lisp/gnus/mm-view.el +++ b/lisp/gnus/mm-view.el @@ -24,7 +24,8 @@ ;;; Commentary: ;;; Code: - +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (eval-when-compile (require 'cl)) (require 'mail-parse) (require 'mailcap) @@ -117,6 +118,11 @@ (defalias 'mm-inline-image 'mm-inline-image-xemacs) (defalias 'mm-inline-image 'mm-inline-image-emacs))) +;; External. +(declare-function w3-do-setup "ext:w3" ()) +(declare-function w3-region "ext:w3-display" (st nd)) +(declare-function w3-prepare-buffer "ext:w3-display" (&rest args)) + (defvar mm-w3-setup nil) (defun mm-setup-w3 () (unless mm-w3-setup @@ -201,6 +207,10 @@ (defvar mm-w3m-setup nil "Whether gnus-article-mode has been setup to use emacs-w3m.") +;; External. +(declare-function w3m-detect-meta-charset "ext:w3m" ()) +(declare-function w3m-region "ext:w3m" (start end &optional url charset)) + (defun mm-setup-w3m () "Setup gnus-article-mode to use emacs-w3m." (unless mm-w3m-setup From a5ded4c97bac3fc56e20f5273c5b6bc365949a1c Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:15:01 +0000 Subject: [PATCH 066/172] (gnus-uu-yenc-article): Use insert-buffer-substring. --- lisp/gnus/ChangeLog | 16 ++++++++++++++++ lisp/gnus/gnus-uu.el | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 3bc43a4c1f5..29c80847c23 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,19 @@ +2007-12-09 Glenn Morris <rgm@gnu.org> + + * gnus-uu.el (gnus-uu-yenc-article): Use insert-buffer-substring. + + * gnus-art.el, gnus-spec.el, gnus-sum.el, gnus-util.el: + * message.el, mm-view.el: Add declare-function compatibility + declaration. + + * gnus-art.el (w3-region, w3m-region, Info-menu): + * gnus-spec.el (gnus-summary-from-or-to-or-newsgroups): + * gnus-sum.el (gnus-get-predicate): + * gnus-util.el (mm-append-to-file, w32-focus-frame): + * message.el (mail-abbrev-in-expansion-header-p): + * mm-view.el (w3-do-setup, w3-region, w3-prepare-buffer) + (w3m-detect-meta-charset, w3m-region): Declare as functions. + 2007-12-08 David Kastrup <dak@gnu.org> * gnus-sum.el (gnus-summary-simplify-subject-query): diff --git a/lisp/gnus/gnus-uu.el b/lisp/gnus/gnus-uu.el index 3a045c2c234..82a423ba3eb 100644 --- a/lisp/gnus/gnus-uu.el +++ b/lisp/gnus/gnus-uu.el @@ -1051,7 +1051,7 @@ When called interactively, prompt for REGEXP." (unless state (push 'middle state)) (mm-with-unibyte-buffer - (insert-buffer gnus-original-article-buffer) + (insert-buffer-substring gnus-original-article-buffer) (yenc-decode-region (point-min) (point-max)) (when (and (member 'begin state) (file-exists-p gnus-uu-yenc-article-name)) From ed8a25dfa1cb441e81333968f7a5bc8852f5e3b8 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 02:18:04 +0000 Subject: [PATCH 067/172] (top-level): Use dolist rather than mapc in make-variable-frame-local call. --- admin/FOR-RELEASE | 4 ++++ lisp/ChangeLog | 5 +++++ lisp/emulation/viper-init.el | 10 ++++------ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/admin/FOR-RELEASE b/admin/FOR-RELEASE index b0965a01ba2..f96da325b75 100644 --- a/admin/FOR-RELEASE +++ b/admin/FOR-RELEASE @@ -107,6 +107,10 @@ http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg02052.html ** Fix or document the shortcoming of easymenu and :suffix. http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01857.html +** Fix problem with mode-name in SGML mode. +If mode-name stays non-string, add NEWS entry and doc fix. +http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg02048.html + * DOCUMENTATION ** Check the Emacs Tutorial. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ec7ce254dae..4a5a423cebc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-09 Glenn Morris <rgm@gnu.org> + + * emulation/viper-init.el (top-level): Use dolist rather than mapc + in make-variable-frame-local call. + 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> * mail/hashcash.el (declare-function): diff --git a/lisp/emulation/viper-init.el b/lisp/emulation/viper-init.el index 539a561bb5b..c91886e0329 100644 --- a/lisp/emulation/viper-init.el +++ b/lisp/emulation/viper-init.el @@ -445,12 +445,10 @@ delete the text being replaced, as in standard Vi." (defvar viper-vi-state-cursor-color nil) (if (fboundp 'make-variable-frame-local) - (mapc 'make-variable-frame-local - '(viper-replace-overlay-cursor-color - viper-insert-state-cursor-color - viper-emacs-state-cursor-color - viper-vi-state-cursor-color))) - + (dolist (v '(viper-replace-overlay-cursor-color + viper-insert-state-cursor-color viper-emacs-state-cursor-color + viper-vi-state-cursor-color)) + (make-variable-frame-local v))) (viper-deflocalvar viper-replace-overlay nil "") (put 'viper-replace-overlay 'permanent-local t) From 8d0f97a4a39b2624476ccc52452299fef53d1dc7 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 04:10:26 +0000 Subject: [PATCH 068/172] (declare-function): Add compatibility definition. (password-read-and-add): Declare as a function. --- lisp/gnus/ChangeLog | 7 ++++--- lisp/gnus/smime.el | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 29c80847c23..e271520f14e 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -3,8 +3,8 @@ * gnus-uu.el (gnus-uu-yenc-article): Use insert-buffer-substring. * gnus-art.el, gnus-spec.el, gnus-sum.el, gnus-util.el: - * message.el, mm-view.el: Add declare-function compatibility - declaration. + * message.el, mm-view.el, smime.el: Add declare-function compatibility + definition. * gnus-art.el (w3-region, w3m-region, Info-menu): * gnus-spec.el (gnus-summary-from-or-to-or-newsgroups): @@ -12,7 +12,8 @@ * gnus-util.el (mm-append-to-file, w32-focus-frame): * message.el (mail-abbrev-in-expansion-header-p): * mm-view.el (w3-do-setup, w3-region, w3-prepare-buffer) - (w3m-detect-meta-charset, w3m-region): Declare as functions. + (w3m-detect-meta-charset, w3m-region): + * smime.el (password-read-and-add): Declare as functions. 2007-12-08 David Kastrup <dak@gnu.org> diff --git a/lisp/gnus/smime.el b/lisp/gnus/smime.el index 31545c16044..bd9ce5a5c46 100644 --- a/lisp/gnus/smime.el +++ b/lisp/gnus/smime.el @@ -121,6 +121,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (require 'dig) (or (require 'password-cache nil t) (require 'password)) @@ -257,6 +260,7 @@ must be set in `ldap-host-parameters-alist'." temporary-file-directory)))))) ;; Password dialog function +(declare-function password-read-and-add "password-cache" (prompt &optional key)) (defun smime-ask-passphrase (&optional cache-key) "Asks the passphrase to unlock the secret key. From 1d1df709e13c089bdc4567d8553b53e8411edd1a Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Sun, 9 Dec 2007 04:14:11 +0000 Subject: [PATCH 069/172] (declare-function): Add compatibility definition. (password-read, password-cache-add, password-cache-remove): Declare as functions. --- lisp/gnus/ChangeLog | 6 ++++-- lisp/gnus/sieve-manage.el | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index e271520f14e..e54a5f4783e 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -3,8 +3,8 @@ * gnus-uu.el (gnus-uu-yenc-article): Use insert-buffer-substring. * gnus-art.el, gnus-spec.el, gnus-sum.el, gnus-util.el: - * message.el, mm-view.el, smime.el: Add declare-function compatibility - definition. + * message.el, mm-view.el, sieve-manage, smime.el: + Add declare-function compatibility definition. * gnus-art.el (w3-region, w3m-region, Info-menu): * gnus-spec.el (gnus-summary-from-or-to-or-newsgroups): @@ -13,6 +13,8 @@ * message.el (mail-abbrev-in-expansion-header-p): * mm-view.el (w3-do-setup, w3-region, w3-prepare-buffer) (w3m-detect-meta-charset, w3m-region): + * sieve-manage.el (password-read, password-cache-add) + (password-cache-remove): * smime.el (password-read-and-add): Declare as functions. 2007-12-08 David Kastrup <dak@gnu.org> diff --git a/lisp/gnus/sieve-manage.el b/lisp/gnus/sieve-manage.el index 5cf14f7eb32..a4b763650c8 100644 --- a/lisp/gnus/sieve-manage.el +++ b/lisp/gnus/sieve-manage.el @@ -76,6 +76,9 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) (or (require 'password-cache nil t) (require 'password)) (eval-when-compile @@ -193,6 +196,10 @@ Valid states are `closed', `initial', `nonauth', and `auth'.") (when (fboundp 'set-buffer-multibyte) (set-buffer-multibyte nil))) +(declare-function password-read "password-cache" (prompt &optional key)) +(declare-function password-cache-add "password-cache" (key password)) +(declare-function password-cache-remove "password-cache" (key)) + ;; Uses the dynamically bound `reason' variable. (defvar reason) (defun sieve-manage-interactive-login (buffer loginfunc) From 1c36df9774d33066c804b9d4f124216ffcd5c813 Mon Sep 17 00:00:00 2001 From: Michael Olson <mwolson@gnu.org> Date: Sun, 9 Dec 2007 06:40:47 +0000 Subject: [PATCH 070/172] Sync from ERC upstream Changes include: - Add nickserv support for GRnet. - Parse 275 (secure connection) response. - Provide new hook `erc-nickserv-identified-hook' that runs when nickserv confirms that the user has successfully identified. --- lisp/erc/ChangeLog | 24 ++++++++++++ lisp/erc/erc-backend.el | 10 +++++ lisp/erc/erc-services.el | 83 +++++++++++++++++++++++++++++++--------- lisp/erc/erc.el | 1 + 4 files changed, 99 insertions(+), 19 deletions(-) diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog index d968a5a6ce9..cdb64e87d0d 100644 --- a/lisp/erc/ChangeLog +++ b/lisp/erc/ChangeLog @@ -1,9 +1,33 @@ +2007-12-09 Michael Olson <mwolson@gnu.org> + + * erc-services.el (erc-nickserv-alist): Fix regexps for GRnet. + +2007-12-09 Giorgos Keramidas <keramida@ceid.upatras.gr> (tiny change) + + * erc-backend.el, erc.el: + Parse 275 (secure connection) responses. + + * erc-services.el: Add identification hooks for GRnet, the Greek + IRC network <http://www.irc.gr>. + 2007-12-08 David Kastrup <dak@gnu.org> * erc-stamp.el (erc-echo-timestamp): * erc-lang.el (language): * erc-backend.el (erc-server-connect): Fix buggy call to `message'. +2007-12-07 Edward O'Connor <ted@oconnor.cx> + + * erc-services.el: Provide a hook that runs when nickserv confirms + that the user has successfully identified. + (services, erc-nickserv-identify-mode): Add and remove + erc-nickserv-identification-autodetect from + erc-server-NOTICE-functions. + (erc-nickserv-alist): Add SUCCESS-REGEXP to each entry. + (erc-nickserv-alist-identified-regexp) + (erc-nickserv-identification-autodetect): New functions. + (erc-nickserv-identified-hook): New hook. + 2007-12-06 D. Goel <deego3@gmail.com> * erc-match.el (erc-add-entry-to-list): Fix buggy call to `error'. diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 04ddab1f300..5d94408ad4f 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -1538,6 +1538,16 @@ A server may send more than one 005 message." See `erc-display-server-message'." nil (erc-display-server-message proc parsed)) +(define-erc-response-handler (275) + "Display secure connection message." nil + (multiple-value-bind (nick user message) + (cdr (erc-response.command-args parsed)) + (erc-display-message + parsed 'notice 'active 's275 + ?n nick + ?m (mapconcat 'identity (cddr (erc-response.command-args parsed)) + " ")))) + (define-erc-response-handler (290) "Handle dancer-ircd CAPAB messages." nil nil) diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el index e6f6c40d7e8..099166bbc3f 100644 --- a/lisp/erc/erc-services.el +++ b/lisp/erc/erc-services.el @@ -29,9 +29,10 @@ ;; are made to test if NickServ is the real NickServ for a given network or ;; server. -;; As a default, ERC has the data for the official nickname services on the -;; networks Austnet, BrasNET, Dalnet, freenode, GalaxyNet, and Slashnet. -;; You can add more by using M-x customize-variable RET erc-nickserv-alist. +;; As a default, ERC has the data for the official nickname services on +;; the networks Austnet, BrasNET, Dalnet, freenode, GalaxyNet, GRnet, +;; and Slashnet. You can add more by using M-x customize-variable RET +;; erc-nickserv-alist. ;; Usage: ;; @@ -109,7 +110,9 @@ You can also use M-x erc-nickserv-identify-mode to change modes." (remove-hook 'erc-after-connect 'erc-nickserv-identify-on-connect) (remove-hook 'erc-nick-changed-functions - 'erc-nickserv-identify-on-nick-change))) + 'erc-nickserv-identify-on-nick-change) + (remove-hook 'erc-server-NOTICE-functions + 'erc-nickserv-identification-autodetect))) ;;;###autoload (defun erc-nickserv-identify-mode (mode) @@ -118,6 +121,8 @@ You can also use M-x erc-nickserv-identify-mode to change modes." (list (intern (completing-read "Choose Nickserv identify mode (RET to disable): " '(("autodetect") ("nick-change") ("both")) nil t)))) + (add-hook 'erc-server-NOTICE-functions + 'erc-nickserv-identification-autodetect) (cond ((eq mode 'autodetect) (setq erc-nickserv-identify-mode 'autodetect) (add-hook 'erc-server-NOTICE-functions @@ -149,7 +154,9 @@ You can also use M-x erc-nickserv-identify-mode to change modes." (remove-hook 'erc-after-connect 'erc-nickserv-identify-on-connect) (remove-hook 'erc-nick-changed-functions - 'erc-nickserv-identify-on-nick-change)))) + 'erc-nickserv-identify-on-nick-change) + (remove-hook 'erc-server-NOTICE-functions + 'erc-nickserv-identification-autodetect)))) (defcustom erc-prompt-for-nickserv-password t "Ask for the password when identifying to NickServ." @@ -176,6 +183,7 @@ Example of use: (const DALnet) (const freenode) (const GalaxyNet) + (const GRnet) (const iip) (const OFTC) (const QuakeNet) @@ -192,63 +200,70 @@ Example of use: '((Ars nil nil "Census" - "IDENTIFY" nil nil) + "IDENTIFY" nil nil nil) (Austnet "NickOP!service@austnet.org" "/msg\\s-NickOP@austnet.org\\s-identify\\s-<password>" "nickop@austnet.org" - "identify" nil nil) + "identify" nil nil nil) (Azzurra "NickServ!service@azzurra.org" "/ns\\s-IDENTIFY\\s-password" "NickServ" - "IDENTIFY" nil nil) + "IDENTIFY" nil nil nil) (BitlBee nil nil "&bitlbee" - "identify" nil nil) + "identify" nil nil nil) (BRASnet "NickServ!services@brasnet.org" "/NickServ\\s-IDENTIFY\\s-senha" "NickServ" - "IDENTIFY" nil "") + "IDENTIFY" nil "" nil) (DALnet "NickServ!service@dal.net" "/msg\\s-NickServ@services.dal.net\\s-IDENTIFY\\s-<password>" "NickServ@services.dal.net" - "IDENTIFY" nil nil) + "IDENTIFY" nil nil nil) (freenode "NickServ!NickServ@services." "/msg\\s-NickServ\\s-IDENTIFY\\s-<password>" "NickServ" - "IDENTIFY" nil nil) + "IDENTIFY" nil nil + "Password\\s-accepted\\s--\\s-you\\s-are\\s-now\\s-recognized") (GalaxyNet "NS!nickserv@galaxynet.org" "Please\\s-change\\s-nicks\\s-or\\s-authenticate." "NS@services.galaxynet.org" - "AUTH" t nil) + "AUTH" t nil nil) + (GRnet + "NickServ!service@irc.gr" + "This\\s-nickname\\s-is\\s-registered\\s-and\\s-protected." + "NickServ" + "IDENTIFY" nil nil + "Password\\s-accepted\\s--\\s-you\\s-are\\s-now\\s-recognized.") (iip "Trent@anon.iip" "type\\s-/squery\\s-Trent\\s-identify\\s-<password>" "Trent@anon.iip" - "IDENTIFY" nil "SQUERY") + "IDENTIFY" nil "SQUERY" nil) (OFTC "NickServ!services@services.oftc.net" "type\\s-/msg\\s-NickServ\\s-IDENTIFY\\s-password." "NickServ" - "IDENTIFY" nil nil) + "IDENTIFY" nil nil nil) (QuakeNet nil nil "Q@CServe.quakenet.org" - "auth" t nil) + "auth" t nil nil) (SlashNET "NickServ!services@services.slashnet.org" "/msg\\s-NickServ\\s-IDENTIFY\\s-password" "NickServ@services.slashnet.org" - "IDENTIFY" nil nil)) + "IDENTIFY" nil nil nil)) "Alist of NickServer details, sorted by network. Every element in the list has the form - \(SYMBOL NICKSERV REGEXP NICK KEYWORD USE-CURRENT ANSWER) + \(SYMBOL NICKSERV REGEXP NICK KEYWORD USE-CURRENT ANSWER SUCCESS-REGEXP) SYMBOL is a network identifier, a symbol, as used in `erc-networks-alist'. NICKSERV is the description of the nickserv in the form nick!user@host. @@ -258,7 +273,9 @@ KEYWORD is the keyword to use in the reply message to identify yourself. USE-CURRENT indicates whether the current nickname must be used when identifying. ANSWER is the command to use for the answer. The default is 'privmsg. - This last element is optional." +SUCCESS-REGEXP is a regular expression matching the message nickserv + sends when you've successfully identified. +The last two elements are optional." :group 'erc-services :type '(repeat (list :tag "Nickserv data" @@ -292,8 +309,36 @@ ANSWER is the command to use for the answer. The default is 'privmsg. (defsubst erc-nickserv-alist-ident-command (network &optional entry) (nth 6 (or entry (assoc network erc-nickserv-alist)))) +(defsubst erc-nickserv-alist-identified-regexp (network &optional entry) + (nth 7 (or entry (assoc network erc-nickserv-alist)))) + ;; Functions: +(defcustom erc-nickserv-identified-hook nil + "Run this hook when NickServ acknowledged successful identification. +Hooks are called with arguments (NETWORK NICK)." + :group 'erc-services + :type 'hook) + +(defun erc-nickserv-identification-autodetect (proc parsed) + "Check for NickServ's successful identification notice. +Make sure it is the real NickServ for this network and that it has +specifically confirmed a successful identification attempt. +If this is the case, run `erc-nickserv-identified-hook'." + (let* ((network (erc-network)) + (sender (erc-nickserv-alist-sender network)) + (success-regex (erc-nickserv-alist-identified-regexp network)) + (sspec (erc-response.sender parsed)) + (nick (car (erc-response.command-args parsed))) + (msg (erc-response.contents parsed))) + ;; continue only if we're sure it's the real nickserv for this network + ;; and it's told us we've successfully identified + (when (and sender (equal sspec sender) + (string-match success-regex msg)) + (erc-log "NickServ IDENTIFY success notification detected") + (run-hook-with-args 'erc-nickserv-identified-hook network nick) + nil))) + (defun erc-nickserv-identify-autodetect (proc parsed) "Check for a NickServ identify request everytime a notice is received. Make sure it is the real NickServ for this network and that it has diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index e4e9268bfbe..cc9eb7a8f04 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -6213,6 +6213,7 @@ All windows are opened in the current frame." (s252 . "%i operator(s) online") (s253 . "%i unknown connection(s)") (s254 . "%i channels formed") + (s275 . "%n %m") (s301 . "%n is AWAY: %r") (s303 . "Is online: %n") (s305 . "%m") From 819ee2f42a760ed0d7835826d04218990462346e Mon Sep 17 00:00:00 2001 From: Miles Bader <miles@gnu.org> Date: Sun, 9 Dec 2007 07:24:51 +0000 Subject: [PATCH 071/172] Add arch tagline --- lisp/progmodes/verilog-mode.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 6cd90ad561d..4c0cbd65c18 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -10313,4 +10313,5 @@ but instead, [[Fill in here]] happens!. ;; checkdoc-force-docstrings-flag:nil ;; End: +;; arch-tag: 87923725-57b3-41b5-9494-be21118c6a6f ;;; verilog-mode.el ends here From 209a3a867f2ff64dd85402f16c8dbae53b25c3e6 Mon Sep 17 00:00:00 2001 From: Andreas Schwab <schwab@suse.de> Date: Sun, 9 Dec 2007 11:08:24 +0000 Subject: [PATCH 072/172] D-Bus is not enabled by default. --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 804fd5484a8..c07541fe1ba 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ EMACS_ARG_N([toolkit-scroll-bars],[don't use Motif or Xaw3d scroll bars]) EMACS_ARG_N([xaw3d],[don't use Xaw3d]) EMACS_ARG_N([xim],[don't use X11 XIM]) EMACS_ARG_N([carbon],[don't use Carbon GUI on Mac OS X]) -EMACS_ARG_N([dbus],[don't use D-Bus]) +EMACS_ARG_Y([dbus],[use D-Bus]) AC_ARG_ENABLE(carbon-app, [AS_HELP_STRING([--enable-carbon-app@<:@=DIR@:>@], From d088fbb2d39ab5e181c1f54bab112b509d6b0891 Mon Sep 17 00:00:00 2001 From: Andreas Schwab <schwab@suse.de> Date: Sun, 9 Dec 2007 11:08:55 +0000 Subject: [PATCH 073/172] Regenerate. --- ChangeLog | 4 ++++ configure | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4366e4a7a69..8280d712ab1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-12-09 Andreas Schwab <schwab@suse.de> + + * configure.in: D-Bus is not enabled by default. + 2007-12-06 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> * configure.in: Add AC_CONFIG_SRCDIR which was lost in the previous diff --git a/configure b/configure index b222b9bc902..4d8d153ba55 100755 --- a/configure +++ b/configure @@ -1358,7 +1358,7 @@ Optional Packages: --without-xaw3d don't use Xaw3d --without-xim don't use X11 XIM --without-carbon don't use Carbon GUI on Mac OS X - --without-dbus don't use D-Bus + --with-dbus use D-Bus --with-x use the X Window System Some influential environment variables: From 06005961b7736ab639297a6544e0fd43e9170404 Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Sun, 9 Dec 2007 12:55:00 +0000 Subject: [PATCH 074/172] Fix pr-interface-map initialization --- lisp/ChangeLog | 9 +++++++++ lisp/printing.el | 51 ++++++++++++++++++++++++------------------------ 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4a5a423cebc..e257cd96b91 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2007-12-09 Vinicius Jose Latorre <viniciusjl@ig.com.br> + + * printing.el: Fix pr-interface-map initialization. Replace + pr-f-set-keymap-parents, pr-f-set-keymap-name and pr-f-read-string by + pr-set-keymap-parents, pr-set-keymap-name and pr-read-string, + respectively. + (pr-version): New version 6.9.3. + (pr-interactive-n-up, pr-interactive-regexp): Code fix. + 2007-12-09 Glenn Morris <rgm@gnu.org> * emulation/viper-init.el (top-level): Use dolist rather than mapc diff --git a/lisp/printing.el b/lisp/printing.el index 6de22743c97..ef38490c936 100644 --- a/lisp/printing.el +++ b/lisp/printing.el @@ -1,16 +1,16 @@ ;;; printing.el --- printing utilities -;; Copyright (C) 2000, 2001, 2003, 2004, 2005, -;; 2006, 2007 Free Software Foundation, Inc. +;; Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007 +;; Free Software Foundation, Inc. ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> ;; Keywords: wp, print, PostScript -;; Version: 6.9.2 +;; Version: 6.9.3 ;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre -(defconst pr-version "6.9.2" - "printing.el, v 6.9.2 <2007/10/26 vinicius> +(defconst pr-version "6.9.3" + "printing.el, v 6.9.3 <2007/12/09 vinicius> Please send all bug fixes and enhancements to Vinicius Jose Latorre <viniciusjl@ig.com.br> @@ -1118,8 +1118,8 @@ If SUFFIX is non-nil, add that at the end of the file name." (defalias 'pr-region-active-p 'ignore) (defalias 'pr-do-update-menus 'ignore) (defalias 'pr-update-mode-line 'ignore) - (defalias 'pr-f-read-string 'ignore) - (defalias 'pr-f-set-keymap-parents 'ignore) + (defalias 'pr-read-string 'ignore) + (defalias 'pr-set-keymap-parents 'ignore) (defalias 'pr-keep-region-active 'ignore)) @@ -1154,11 +1154,11 @@ Used by `pr-menu-bind' and `pr-update-menus'.") (cond ((featurep 'xemacs) ; XEmacs ;; XEmacs - (defalias 'pr-f-set-keymap-parents 'set-keymap-parents) - (defalias 'pr-f-set-keymap-name 'set-keymap-name) + (defalias 'pr-set-keymap-parents 'set-keymap-parents) + (defalias 'pr-set-keymap-name 'set-keymap-name) ;; XEmacs - (defun pr-f-read-string (prompt initial history default) + (defun pr-read-string (prompt initial history default) (let ((str (read-string prompt initial))) (if (and str (not (string= str ""))) str @@ -1353,9 +1353,9 @@ Used by `pr-menu-bind' and `pr-update-menus'.") ) (t ; GNU Emacs ;; GNU Emacs - (defalias 'pr-f-set-keymap-parents 'set-keymap-parent) - (defalias 'pr-f-set-keymap-name 'ignore) - (defalias 'pr-f-read-string 'read-string) + (defalias 'pr-set-keymap-parents 'set-keymap-parent) + (defalias 'pr-set-keymap-name 'ignore) + (defalias 'pr-read-string 'read-string) ;; GNU Emacs (defvar deactivate-mark) @@ -1451,7 +1451,7 @@ Used by `pr-menu-bind' and `pr-update-menus'.") ))) (defvar pr-menu-position nil) - (defvar pr-menu-state nil) + (defvar pr-menu-state nil) ;; GNU Emacs (defun pr-menu-lookup (path) @@ -5719,7 +5719,7 @@ If menu binding was not done, calls `pr-menu-bind'." (save-match-data (let* ((fmt-prompt "%s[%s] N-up printing (default 1): ") (prompt "") - (str (pr-f-read-string (format fmt-prompt prompt mess) "1" nil "1")) + (str (pr-read-string (format fmt-prompt prompt mess) "1" nil "1")) int) (while (if (string-match "^\\s *[0-9]+$" str) (setq int (string-to-number str) @@ -5729,7 +5729,7 @@ If menu binding was not done, calls `pr-menu-bind'." (setq prompt "Invalid integer syntax; ")) (ding) (setq str - (pr-f-read-string (format fmt-prompt prompt mess) str nil "1"))) + (pr-read-string (format fmt-prompt prompt mess) str nil "1"))) int))) @@ -5754,7 +5754,7 @@ If menu binding was not done, calls `pr-menu-bind'." (defun pr-interactive-regexp (mess) - (pr-f-read-string (format "[%s] File regexp to print: " mess) "" nil "")) + (pr-read-string (format "[%s] File regexp to print: " mess) "" nil "")) (defun pr-interactive-dir-args (mess) @@ -6038,14 +6038,15 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order." "Keymap for pr-interface.") (unless pr-interface-map - (setq pr-interface-map (make-sparse-keymap)) - (cond ((featurep 'xemacs) ; XEmacs - (pr-f-set-keymap-parents pr-interface-map (list widget-keymap)) - (pr-f-set-keymap-name pr-interface-map 'pr-interface-map)) - (t ; GNU Emacs - (pr-f-set-keymap-parents pr-interface-map widget-keymap))) - (define-key pr-interface-map "q" 'pr-interface-quit) - (define-key pr-interface-map "?" 'pr-interface-help)) + (let ((map (make-sparse-keymap))) + (cond ((featurep 'xemacs) ; XEmacs + (pr-set-keymap-parents map (list widget-keymap)) + (pr-set-keymap-name map 'pr-interface-map)) + (t ; GNU Emacs + (pr-set-keymap-parents map widget-keymap))) + (define-key map "q" 'pr-interface-quit) + (define-key map "?" 'pr-interface-help) + (setq pr-interface-map map))) (defmacro pr-interface-save (&rest body) From 316be4e813098bbdb0f959605b73ac4e15f51afd Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Sun, 9 Dec 2007 13:37:03 +0000 Subject: [PATCH 075/172] Doc fix --- lisp/printing.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/printing.el b/lisp/printing.el index ef38490c936..578f1a93d85 100644 --- a/lisp/printing.el +++ b/lisp/printing.el @@ -70,7 +70,7 @@ Please send all bug fixes and enhancements to ;; `http://www.emacswiki.org/cgi-bin/wiki/PsPrintPackage'. ;; Please, see README file for ps-print installation instructions. ;; -;; `printing' was inspired on: +;; `printing' was inspired by: ;; ;; print-nt.el Frederic Corne <frederic.corne@erli.fr> ;; Special printing functions for Windows NT @@ -6008,7 +6008,7 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Printing Interface (inspired on ps-print-interface.el) +;; Printing Interface (inspired by ps-print-interface.el) (eval-when-compile From 0e250bf8782b236076a03f470eab9ce3a26bccb5 Mon Sep 17 00:00:00 2001 From: David Kastrup <dak@gnu.org> Date: Sun, 9 Dec 2007 14:47:24 +0000 Subject: [PATCH 076/172] (lm-verify): Make it work with directories. Not sure anybody uses this anymore, though. --- lisp/ChangeLog | 5 +++++ lisp/emacs-lisp/lisp-mnt.el | 23 +++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e257cd96b91..5c44fc072ef 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-09 David Kastrup <dak@gnu.org> + + * emacs-lisp/lisp-mnt.el (lm-verify): Make it work with + directories. Not sure anybody uses this anymore, though. + 2007-12-09 Vinicius Jose Latorre <viniciusjl@ig.com.br> * printing.el: Fix pr-interface-map initialization. Replace diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el index bf7c4147309..8d098a443fe 100644 --- a/lisp/emacs-lisp/lisp-mnt.el +++ b/lisp/emacs-lisp/lisp-mnt.el @@ -511,18 +511,17 @@ copyright notice is allowed." (if (and file (file-directory-p file)) (setq ret (with-temp-buffer - (mapcar - (lambda (f) - (if (string-match ".*\\.el\\'" f) - (let ((status (lm-verify f))) - (insert f ":") - (if status - (lm-insert-at-column lm-comment-column status - "\n") - (if showok - (lm-insert-at-column lm-comment-column - "OK\n")))))) - (directory-files file)))) + (dolist (f (directory-files file nil "\\.el\\'") + (buffer-string)) + (when (file-regular-p f) + (let ((status (lm-verify f))) + (insert f ":") + (if status + (lm-insert-at-column lm-comment-column status + "\n") + (if showok + (lm-insert-at-column lm-comment-column + "OK\n")))))))) (lm-with-file file (setq name (lm-get-package-name)) (setq ret From 2d5590e0a3357b155d0483316c1d8ac8aafb03db Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sun, 9 Dec 2007 19:19:46 +0000 Subject: [PATCH 077/172] * progmodes/perl-mode.el (perl-continued-statement-offset) (perl-continued-brace-offset, perl-brace-offset) (perl-brace-imaginary-offset, perl-label-offset): * progmodes/cperl-mode.el (cperl-brace-offset) (cperl-continued-brace-offset, cperl-label-offset) (cperl-continued-statement-offset) (cperl-extra-newline-before-brace, cperl-merge-trailing-else): Add safe-local-variable properties. --- lisp/ChangeLog | 16 ++++++++++++++++ lisp/progmodes/cperl-mode.el | 10 ++++++++-- lisp/progmodes/perl-mode.el | 9 +++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 00f525ec533..13505897067 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2007-12-09 Dan Nicolaescu <dann@ics.uci.edu> + + * progmodes/perl-mode.el (perl-continued-statement-offset) + (perl-continued-brace-offset, perl-brace-offset) + (perl-brace-imaginary-offset, perl-label-offset): + * progmodes/cperl-mode.el (cperl-brace-offset) + (cperl-continued-brace-offset, cperl-label-offset) + (cperl-continued-statement-offset) + (cperl-extra-newline-before-brace, cperl-merge-trailing-else): Add + safe-local-variable properties. + 2007-12-08 Dan Nicolaescu <dann@ics.uci.edu> * progmodes/verilog-mode.el (verilog-mode-map) @@ -5,6 +16,11 @@ (verilog-colorize-include-files): Use only overlay functions so that it can work on both emacs and XEmacs. (set-extent-keymap): Remove unused defun. + (verilog-kill-existing-comment, verilog-insert-date) + (verilog-insert-year): Rename in order not to pollute the global + namespace from kill-existing-comment, insert-date and + insert-year, respectively. + (verilog-set-auto-endcomments, verilog-header): Update callers. * files.el (auto-mode-alist): Recognize verilog files. diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 4de1a845ab4..58781578a4e 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -234,12 +234,18 @@ for constructs with multiline if/unless/while/until/for/foreach condition." :type 'integer :group 'cperl-indentation-details) -;; Is is not unusual to put both perl-indent-level and +;; Is is not unusual to put both things like perl-indent-level and ;; cperl-indent-level in the local variable section of a file. If only ;; one of perl-mode and cperl-mode is in use, a warning will be issued -;; about the variable. Autoload this here, so that no warning is +;; about the variable. Autoload these here, so that no warning is ;; issued when using either perl-mode or cperl-mode. ;;;###autoload(put 'cperl-indent-level 'safe-local-variable 'integerp) +;;;###autoload(put 'cperl-brace-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'cperl-continued-brace-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'cperl-label-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'cperl-continued-statement-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'cperl-extra-newline-before-brace 'safe-local-variable 'booleanp) +;;;###autoload(put 'cperl-merge-trailing-else 'safe-local-variable 'booleanp) (defcustom cperl-lineup-step nil "*`cperl-lineup' will always lineup at multiple of this number. diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el index ee14100f56d..0ccb643bc75 100644 --- a/lisp/progmodes/perl-mode.el +++ b/lisp/progmodes/perl-mode.el @@ -402,12 +402,17 @@ The expansion is entirely correct because it uses the C preprocessor." :type 'integer :group 'perl) -;; Is is not unusual to put both perl-indent-level and +;; Is is not unusual to put both things like perl-indent-level and ;; cperl-indent-level in the local variable section of a file. If only ;; one of perl-mode and cperl-mode is in use, a warning will be issued -;; about the variable. Autoload this here, so that no warning is +;; about the variable. Autoload these here, so that no warning is ;; issued when using either perl-mode or cperl-mode. ;;;###autoload(put 'perl-indent-level 'safe-local-variable 'integerp) +;;;###autoload(put 'perl-continued-statement-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'perl-continued-brace-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'perl-brace-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'perl-brace-imaginary-offset 'safe-local-variable 'integerp) +;;;###autoload(put 'perl-label-offset 'safe-local-variable 'integerp) (defcustom perl-continued-statement-offset 4 "*Extra indent for lines not starting new statements." From 6ca0ff7375c34ba105101e5318194bdee07edf7f Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Sun, 9 Dec 2007 19:38:37 +0000 Subject: [PATCH 078/172] (verilog-kill-existing-comment, verilog-insert-date) (verilog-insert-year): Rename in order not to pollute the global namespace from kill-existing-comment, insert-date and insert-year, respectively. (verilog-set-auto-endcomments, verilog-header): Update callers. --- lisp/progmodes/verilog-mode.el | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 4c0cbd65c18..79a4cd5c399 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -3169,7 +3169,7 @@ Limit search to point LIM." ;; Other functions ;; -(defun kill-existing-comment () +(defun verilog-kill-existing-comment () "Kill auto comment on this line." (save-excursion (let* ( @@ -3210,7 +3210,7 @@ Insert `// NAME ' if this line ends a function, task, module, primitive or inter ) (end-of-line) (if kill-existing-comment - (kill-existing-comment)) + (verilog-kill-existing-comment)) (delete-horizontal-space) (save-excursion (backward-sexp 1) @@ -3287,7 +3287,7 @@ Insert `// NAME ' if this line ends a function, task, module, primitive or inter (verilog-get-expr)))))) (end-of-line) (if kill-existing-comment - (kill-existing-comment)) + (verilog-kill-existing-comment)) (delete-horizontal-space) (insert (concat " // " str )) (if err (ding 't)) @@ -3309,7 +3309,7 @@ Insert `// NAME ' if this line ends a function, task, module, primitive or inter (goto-char here) (end-of-line) (if kill-existing-comment - (kill-existing-comment)) + (verilog-kill-existing-comment)) (delete-horizontal-space) (insert str) (ding 't) @@ -3450,7 +3450,7 @@ Insert `// NAME ' if this line ends a function, task, module, primitive or inter (goto-char here) (end-of-line) (if kill-existing-comment - (kill-existing-comment)) + (verilog-kill-existing-comment)) (delete-horizontal-space) (if (or err (> (count-lines here there) verilog-minimum-comment-distance)) @@ -3503,7 +3503,7 @@ Insert `// NAME ' if this line ends a function, task, module, primitive or inter (end-of-line) (if kill-existing-comment (save-match-data - (kill-existing-comment))) + (verilog-kill-existing-comment))) (delete-horizontal-space) (backward-sexp) (cond @@ -5846,13 +5846,13 @@ Bound search by LIMIT. Adapted from (insert (user-full-name)) (insert " <" (user-login-name) "@" (system-name) ">") (search-forward "<credate>") (replace-match "" t t) - (insert-date) + (verilog-insert-date) (search-forward "<moddate>") (replace-match "" t t) - (insert-date) + (verilog-insert-date) (search-forward "<copydate>") (replace-match "" t t) - (insert-year) + (verilog-insert-year) (search-forward "<modhist>") (replace-match "" t t) - (insert-date) + (verilog-insert-date) (insert " : created") (goto-char start) (let (string) @@ -5877,9 +5877,9 @@ Bound search by LIMIT. Adapted from (replace-match "" t t) ))) -;; verilog-header Uses the insert-date function +;; verilog-header Uses the verilog-insert-date function -(defun insert-date () +(defun verilog-insert-date () "Insert date from the system." (interactive) (let ((timpos)) @@ -5892,7 +5892,7 @@ Bound search by LIMIT. Adapted from (end-of-line)) (delete-char 1)) -(defun insert-year () +(defun verilog-insert-year () "Insert year from the system." (interactive) (let ((timpos)) From 21ee0911f749a8dfaf97d13075bfec4862c06161 Mon Sep 17 00:00:00 2001 From: Miles Bader <miles@gnu.org> Date: Sun, 9 Dec 2007 22:14:32 +0000 Subject: [PATCH 079/172] Merge from gnus--devo--0 Revision: emacs@sv.gnu.org/emacs--devo--0--patch-950 --- lisp/ChangeLog | 7 +++++++ lisp/gnus/ChangeLog | 12 ++++++++++++ lisp/gnus/nnmaildir.el | 22 ++++++++++++++-------- lisp/mail/hashcash.el | 14 ++++++++------ lisp/net/imap.el | 12 ++++++++++++ lisp/pgg-parse.el | 4 +++- lisp/pgg.el | 1 + 7 files changed, 57 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5c44fc072ef..db5930b7db6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2007-12-09 Reiner Steib <Reiner.Steib@gmx.de> + + * mail/hashcash.el, net/imap.el, pgg.el, pgg-parse.el + (declare-function): Add new no-op macro for backward compatibility. + + * net/imap.el (imap-string-to-integer): New function. + 2007-12-09 David Kastrup <dak@gnu.org> * emacs-lisp/lisp-mnt.el (lm-verify): Make it work with diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index e54a5f4783e..4bddd344115 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -31,6 +31,18 @@ * gnus-start.el (gnus-load): Rename local variable to avoid confusion. +2007-12-06 Christian Plate <cplate@web.de> (tiny change) + + * nnmaildir.el (nnmaildir-request-update-info): Improved performance. + Call gnus-add-to-range ranges only once with a prepared article-list. + +2007-12-06 Paul Jarc <prj@po.cwru.edu> + + * nnmaildir.el (nnmaildir-request-list, nnmaildir-retrieve-groups, + nnmaildir-request-group, nnmaildir-retrieve-headers): Escape spaces in + group names with backslashes. Reported by Tassilo Horn + <tassilo@member.fsf.org>. + 2007-12-06 D. Goel <deego3@gmail.com> * gnus-art.el (article-make-date-line): diff --git a/lisp/gnus/nnmaildir.el b/lisp/gnus/nnmaildir.el index e7674168484..829b3761cd3 100644 --- a/lisp/gnus/nnmaildir.el +++ b/lisp/gnus/nnmaildir.el @@ -884,7 +884,9 @@ by nnmaildir-request-article.") pgname (nnmaildir--pgname nnmaildir--cur-server pgname) group (symbol-value group) ro (nnmaildir--param pgname 'read-only)) - (insert (nnmaildir--grp-name group) " ") + (insert (gnus-replace-in-string + (nnmaildir--grp-name group) " " "\\ " t) + " ") (princ (nnmaildir--group-maxnum nnmaildir--cur-server group) nntp-server-buffer) (insert " ") @@ -911,14 +913,17 @@ by nnmaildir-request-article.") (insert " ") (princ (nnmaildir--group-maxnum nnmaildir--cur-server group) nntp-server-buffer) - (insert " " gname "\n"))))) + (insert " " + (gnus-replace-in-string gname " " "\\ " t) + "\n"))))) 'group) (defun nnmaildir-request-update-info (gname info &optional server) (let ((group (nnmaildir--prepare server gname)) pgname flist always-marks never-marks old-marks dotfile num dir markdirs marks mark ranges markdir article read end new-marks ls - old-mmth new-mmth mtime mark-sym existing missing deactivate-mark) + old-mmth new-mmth mtime mark-sym existing missing deactivate-mark + article-list) (catch 'return (unless group (setf (nnmaildir--srv-error nnmaildir--cur-server) @@ -966,12 +971,13 @@ by nnmaildir-request-article.") (setq ranges (assq mark-sym old-marks)) (if ranges (setq ranges (cdr ranges))) (throw 'got-ranges nil)) + (setq article-list nil) (dolist (prefix (funcall ls markdir nil "\\`[^.]" 'nosort)) (setq article (nnmaildir--flist-art flist prefix)) (if article - (setq ranges - (gnus-add-to-range ranges - `(,(nnmaildir--art-num article))))))) + (setq article-list + (cons (nnmaildir--art-num article) article-list)))) + (setq ranges (gnus-add-to-range ranges (sort article-list '<)))) (if (eq mark-sym 'read) (setq read ranges) (if ranges (setq marks (cons (cons mark-sym ranges) marks))))) (gnus-info-set-read info (gnus-range-add read missing)) @@ -999,7 +1005,7 @@ by nnmaildir-request-article.") (insert " ") (princ (nnmaildir--group-maxnum nnmaildir--cur-server group) nntp-server-buffer) - (insert " " gname "\n") + (insert " " (gnus-replace-in-string gname " " "\\ " t) "\n") t)))) (defun nnmaildir-request-create-group (gname &optional server args) @@ -1161,7 +1167,7 @@ by nnmaildir-request-article.") (insert "\t" (nnmaildir--nov-get-beg nov) "\t" (nnmaildir--art-msgid article) "\t" (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " - gname ":") + (gnus-replace-in-string gname " " "\\ " t) ":") (princ num nntp-server-buffer) (insert "\t" (nnmaildir--nov-get-end nov) "\n")))) (catch 'return diff --git a/lisp/mail/hashcash.el b/lisp/mail/hashcash.el index 1f4483a7c94..36cd17fe6fc 100644 --- a/lisp/mail/hashcash.el +++ b/lisp/mail/hashcash.el @@ -115,13 +115,15 @@ For example, you may want to set this to '(\"-Z2\") to reduce header length." (require 'mail-utils) (eval-and-compile - (if (fboundp 'point-at-bol) - (defalias 'hashcash-point-at-bol 'point-at-bol) - (defalias 'hashcash-point-at-bol 'line-beginning-position)) + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))) - (if (fboundp 'point-at-eol) - (defalias 'hashcash-point-at-eol 'point-at-eol) - (defalias 'hashcash-point-at-eol 'line-end-position))) + (if (fboundp 'point-at-bol) + (defalias 'hashcash-point-at-bol 'point-at-bol) + (defalias 'hashcash-point-at-bol 'line-beginning-position)) + + (if (fboundp 'point-at-eol) + (defalias 'hashcash-point-at-eol 'point-at-eol) + (defalias 'hashcash-point-at-eol 'line-end-position))) (defun hashcash-strip-quoted-names (addr) (setq addr (mail-strip-quoted-names addr)) diff --git a/lisp/net/imap.el b/lisp/net/imap.el index 85af73972fe..40e41d79de7 100644 --- a/lisp/net/imap.el +++ b/lisp/net/imap.el @@ -1735,6 +1735,18 @@ is non-nil return these properties." (concat "UID STORE " articles " +FLAGS" (if silent ".SILENT") " (" flags ")")))))) +;; Cf. http://thread.gmane.org/gmane.emacs.gnus.general/65317/focus=65343 +;; Signal an error if we'd get an integer overflow. +;; +;; FIXME: Identify relevant calls to `string-to-number' and replace them with +;; `imap-string-to-integer'. +(defun imap-string-to-integer (string &optional base) + (let ((number (string-to-number string base))) + (if (> number most-positive-fixnum) + (error + (format "String %s cannot be converted to a lisp integer" number)) + number))) + (defun imap-message-copyuid-1 (mailbox) (if (imap-capability 'UIDPLUS) (list (nth 0 (imap-mailbox-get-1 'copyuid mailbox)) diff --git a/lisp/pgg-parse.el b/lisp/pgg-parse.el index 336c492efde..87bafc08fd4 100644 --- a/lisp/pgg-parse.el +++ b/lisp/pgg-parse.el @@ -36,7 +36,9 @@ ;;; Code: -(eval-when-compile (require 'cl)) +(eval-when-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))) + (require 'cl)) (defgroup pgg-parse () "OpenPGP packet parsing." diff --git a/lisp/pgg.el b/lisp/pgg.el index 6e4a2a874ec..74b6ed7cb22 100644 --- a/lisp/pgg.el +++ b/lisp/pgg.el @@ -35,6 +35,7 @@ ;; Don't merge these two `eval-when-compile's. (eval-when-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))) (require 'cl)) ;;; @ utility functions From 522bec736968730e9cf3e75b54a1c8ca7912c30a Mon Sep 17 00:00:00 2001 From: Reiner Steib <Reiner.Steib@gmx.de> Date: Sun, 9 Dec 2007 22:24:03 +0000 Subject: [PATCH 080/172] Remove mail/hashcash.el and net/imap.el from file list in previous change. --- lisp/ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index db5930b7db6..b69b8780d20 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,7 +1,7 @@ 2007-12-09 Reiner Steib <Reiner.Steib@gmx.de> - * mail/hashcash.el, net/imap.el, pgg.el, pgg-parse.el - (declare-function): Add new no-op macro for backward compatibility. + * pgg.el, pgg-parse.el (declare-function): Add new no-op macro for + backward compatibility. * net/imap.el (imap-string-to-integer): New function. From 3be42fcdfbb97a7fb33a9c1394e86245e9867bc5 Mon Sep 17 00:00:00 2001 From: Juri Linkov <juri@jurta.org> Date: Sun, 9 Dec 2007 23:47:04 +0000 Subject: [PATCH 081/172] (keep-lines, flush-lines, how-many): Doc fix. Check search-upper-case before calling isearch-no-upper-case-p to set case-fold-search. (occur): Doc fix. (occur-1, perform-replace): Check search-upper-case before calling isearch-no-upper-case-p to set case-fold-search. --- lisp/replace.el | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/lisp/replace.el b/lisp/replace.el index 34fdd5fe3df..8bd3bec20a0 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -552,8 +552,8 @@ A match split across lines preserves all the lines it lies in. When called from Lisp (and usually interactively as well, see below) applies to all lines starting after point. -If REGEXP contains upper case characters (excluding those preceded by `\\'), -the matching is case-sensitive. +If REGEXP contains upper case characters (excluding those preceded by `\\') +and `search-upper-case' is non-nil, the matching is case-sensitive. Second and third arg RSTART and REND specify the region to operate on. This command operates on (the accessible part of) all lines whose @@ -597,8 +597,10 @@ a previously found match." (save-excursion (or (bolp) (forward-line 1)) (let ((start (point)) - (case-fold-search (and case-fold-search - (isearch-no-upper-case-p regexp t)))) + (case-fold-search + (if (and case-fold-search search-upper-case) + (isearch-no-upper-case-p regexp t) + case-fold-search))) (while (< (point) rend) ;; Start is first char not preserved by previous match. (if (not (re-search-forward regexp rend 'move)) @@ -626,8 +628,8 @@ well, see below), applies to the part of the buffer after point. The line point is in is deleted if and only if it contains a match for regexp starting after point. -If REGEXP contains upper case characters (excluding those preceded by `\\'), -the matching is case-sensitive. +If REGEXP contains upper case characters (excluding those preceded by `\\') +and `search-upper-case' is non-nil, the matching is case-sensitive. Second and third arg RSTART and REND specify the region to operate on. Lines partially contained in this region are deleted if and only if @@ -657,8 +659,10 @@ starting on the same line at which another match ended is ignored." (setq rstart (point) rend (point-max-marker))) (goto-char rstart)) - (let ((case-fold-search (and case-fold-search - (isearch-no-upper-case-p regexp t)))) + (let ((case-fold-search + (if (and case-fold-search search-upper-case) + (isearch-no-upper-case-p regexp t) + case-fold-search))) (save-excursion (while (and (< (point) rend) (re-search-forward regexp rend t)) @@ -676,8 +680,8 @@ When called from Lisp and INTERACTIVE is omitted or nil, just return the number, do not print it; if INTERACTIVE is t, the function behaves in all respects has if it had been called interactively. -If REGEXP contains upper case characters (excluding those preceded by `\\'), -the matching is case-sensitive. +If REGEXP contains upper case characters (excluding those preceded by `\\') +and `search-upper-case' is non-nil, the matching is case-sensitive. Second and third arg RSTART and REND specify the region to operate on. @@ -704,8 +708,10 @@ a previously found match." (goto-char rstart)) (let ((count 0) opoint - (case-fold-search (and case-fold-search - (isearch-no-upper-case-p regexp t)))) + (case-fold-search + (if (and case-fold-search search-upper-case) + (isearch-no-upper-case-p regexp t) + case-fold-search))) (while (and (< (point) rend) (progn (setq opoint (point)) (re-search-forward regexp rend t))) @@ -1030,8 +1036,8 @@ The lines are shown in a buffer named `*Occur*'. It serves as a menu to find any of the occurrences in this buffer. \\<occur-mode-map>\\[describe-mode] in that buffer will explain how. -If REGEXP contains upper case characters (excluding those preceded by `\\'), -the matching is case-sensitive." +If REGEXP contains upper case characters (excluding those preceded by `\\') +and `search-upper-case' is non-nil, the matching is case-sensitive." (interactive (occur-read-primary-args)) (occur-1 regexp nlines (list (current-buffer)))) @@ -1119,8 +1125,9 @@ See also `multi-occur'." (let ((count (occur-engine regexp active-bufs occur-buf (or nlines list-matching-lines-default-context-lines) - (and case-fold-search - (isearch-no-upper-case-p regexp t)) + (if (and case-fold-search search-upper-case) + (isearch-no-upper-case-p regexp t) + case-fold-search) list-matching-lines-buffer-name-face nil list-matching-lines-face (not (eq occur-excluded-properties t))))) @@ -1459,8 +1466,9 @@ make, or the user didn't cancel the call." (and query-flag minibuffer-auto-raise (raise-frame (window-frame (minibuffer-window)))) (let* ((case-fold-search - (and case-fold-search - (isearch-no-upper-case-p from-string regexp-flag))) + (if (and case-fold-search search-upper-case) + (isearch-no-upper-case-p from-string regexp-flag) + case-fold-search)) (nocasify (not (and case-replace case-fold-search))) (literal (or (not regexp-flag) (eq regexp-flag 'literal))) (search-function (if regexp-flag 're-search-forward 'search-forward)) From 6e3057bbed906aaeae458b2e4ac5f81f3986edfa Mon Sep 17 00:00:00 2001 From: Juri Linkov <juri@jurta.org> Date: Sun, 9 Dec 2007 23:47:59 +0000 Subject: [PATCH 082/172] (search-upper-case): Doc fix. (isearch-mode-map): Bind `M-s o' to isearch-occur. (isearch-query-replace): Doc fix. Let-bind search-upper-case to nil. (isearch-query-replace-regexp): Doc fix. (isearch-occur): New function. --- lisp/ChangeLog | 15 +++++++++++++++ lisp/isearch.el | 27 +++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b69b8780d20..7c0d17380f3 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,18 @@ +2007-12-09 Juri Linkov <juri@jurta.org> + + * replace.el (keep-lines, flush-lines, how-many): Doc fix. + Check search-upper-case before calling isearch-no-upper-case-p + to set case-fold-search. + (occur): Doc fix. + (occur-1, perform-replace): Check search-upper-case before calling + isearch-no-upper-case-p to set case-fold-search. + + * isearch.el (search-upper-case): Doc fix. + (isearch-mode-map): Bind `M-s o' to isearch-occur. + (isearch-query-replace): Doc fix. Let-bind search-upper-case to nil. + (isearch-query-replace-regexp): Doc fix. + (isearch-occur): New function. + 2007-12-09 Reiner Steib <Reiner.Steib@gmx.de> * pgg.el, pgg-parse.el (declare-function): Add new no-op macro for diff --git a/lisp/isearch.el b/lisp/isearch.el index 7c5585d6ea6..2c88fea4526 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -96,7 +96,8 @@ that the search has reached." That is, upper and lower case chars must match exactly. This applies no matter where the chars come from, but does not apply to chars in regexps that are prefixed with `\\'. -If this value is `not-yanks', yanked text is always downcased." +If this value is `not-yanks', text yanked into the search string +in Isearch mode is always downcased." :type '(choice (const :tag "off" nil) (const not-yanks) (other :tag "on" t)) @@ -411,6 +412,7 @@ A value of nil means highlight all matches." (define-key map [?\M-%] 'isearch-query-replace) (define-key map [?\C-\M-%] 'isearch-query-replace-regexp) + (define-key map "\M-so" 'isearch-occur) map) "Keymap for `isearch-mode'.") @@ -1230,11 +1232,14 @@ Use `isearch-exit' to quit without signaling." (isearch-update)) (defun isearch-query-replace (&optional regexp-flag) - "Start query-replace with string to replace from last search string." + "Start `query-replace' with string to replace from last search string." (interactive) (barf-if-buffer-read-only) (if regexp-flag (setq isearch-regexp t)) - (let ((case-fold-search isearch-case-fold-search)) + (let ((case-fold-search isearch-case-fold-search) + ;; set `search-upper-case' to nil to not call + ;; `isearch-no-upper-case-p' in `perform-replace' + (search-upper-case nil)) (isearch-done) (isearch-clean-overlays) (if (and isearch-other-end @@ -1256,10 +1261,24 @@ Use `isearch-exit' to quit without signaling." (if (and transient-mark-mode mark-active) (region-end))))) (defun isearch-query-replace-regexp () - "Start query-replace-regexp with string to replace from last search string." + "Start `query-replace-regexp' with string to replace from last search string." (interactive) (isearch-query-replace t)) +(defun isearch-occur (regexp &optional nlines) + "Run `occur' with regexp to search from the current search string. +Interactively, REGEXP is the current search regexp or a quoted search +string. NLINES has the same meaning as in `occur'." + (interactive + (list + (if isearch-regexp isearch-string (regexp-quote isearch-string)) + (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) + (let ((case-fold-search isearch-case-fold-search) + ;; set `search-upper-case' to nil to not call + ;; `isearch-no-upper-case-p' in `occur-1' + (search-upper-case nil)) + (occur regexp nlines))) + (defun isearch-delete-char () "Discard last input item and move point back. From bafbec396a9353a526a2df8cd43c6806af119722 Mon Sep 17 00:00:00 2001 From: Juri Linkov <juri@jurta.org> Date: Sun, 9 Dec 2007 23:48:33 +0000 Subject: [PATCH 083/172] Add isearch-occur. --- etc/NEWS | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index ba5b86e6727..5f89a8d46be 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -234,7 +234,12 @@ position of point in help window (for example in `view-lossage'). ** view-remove-frame-by-deleting is now by default t since users found iconification of view-mode frames distracting. -** isearch can now search through multiple ChangeLog files. +** Isearch mode + +*** New command `isearch-occur' bound to `M-s o' in isearch mode +runs `occur' with the current search string. + +*** isearch can now search through multiple ChangeLog files. When running isearch in a ChangeLog file, if the search fails, then another C-s tries searching the previous ChangeLog, if there is one (e.g. go from ChangeLog to ChangeLog.12). From e2bec88627c84ae289be6ff086c073a1a1dc7734 Mon Sep 17 00:00:00 2001 From: Juri Linkov <juri@jurta.org> Date: Sun, 9 Dec 2007 23:49:15 +0000 Subject: [PATCH 084/172] (Frename_buffer): Change interactive spec from "s" to Lisp code that uses `read-buffer' with current buffer as default. --- src/ChangeLog | 5 +++++ src/buffer.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ChangeLog b/src/ChangeLog index 15873d2550b..1ac5cc65241 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2007-12-09 Juri Linkov <juri@jurta.org> + + * buffer.c (Frename_buffer): Change interactive spec from "s" to + Lisp code that uses `read-buffer' with current buffer as default. + 2007-12-08 Michael Albinus <michael.albinus@gmx.de> * dbusbind.c (xd_read_message): Generate an event for every diff --git a/src/buffer.c b/src/buffer.c index ad76c185c5e..cfaacc28905 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1169,7 +1169,8 @@ buffer as BUFFER. */) } DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, - "sRename buffer (to new name): \nP", + "(list (read-buffer \"Rename buffer (to new name): \" \ + (current-buffer)) current-prefix-arg)", doc: /* Change current buffer's name to NEWNAME (a string). If second arg UNIQUE is nil or omitted, it is an error if a buffer named NEWNAME already exists. From 59ab76755818a07c3e8619b73aee353ed17e6bc2 Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Mon, 10 Dec 2007 01:47:17 +0000 Subject: [PATCH 085/172] Fix log entry format. --- lisp/ChangeLog | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7c0d17380f3..c7f046adf5f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -27,11 +27,13 @@ 2007-12-09 Vinicius Jose Latorre <viniciusjl@ig.com.br> - * printing.el: Fix pr-interface-map initialization. Replace - pr-f-set-keymap-parents, pr-f-set-keymap-name and pr-f-read-string by - pr-set-keymap-parents, pr-set-keymap-name and pr-read-string, - respectively. + * printing.el: Fix pr-interface-map initialization code. (pr-version): New version 6.9.3. + (pr-f-set-keymap-parents): Replaced by pr-set-keymap-parents. + (pr-f-set-keymap-name): Replaced by pr-set-keymap-name. + (pr-f-read-string): Replaced by pr-read-string. + (pr-set-keymap-parents, pr-set-keymap-name, pr-read-string): New fun + name. (pr-interactive-n-up, pr-interactive-regexp): Code fix. 2007-12-09 Glenn Morris <rgm@gnu.org> From 3709505e05ef3670b630fa3bbb2c154113cbb322 Mon Sep 17 00:00:00 2001 From: Stefan Monnier <monnier@iro.umontreal.ca> Date: Mon, 10 Dec 2007 03:47:46 +0000 Subject: [PATCH 086/172] (reset_buffer_local_variables): If permanent_too is 0, also preserve non-built-in buffer-local variables. (Fkill_all_local_variables): Don't re-create&re-set permanent buffer-local variables. --- src/ChangeLog | 13 +++++++++++++ src/buffer.c | 54 +++++++++++++++++++++++++-------------------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 1ac5cc65241..86bfa0ab211 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * keyboard.c (Fcommand_execute): Call Qcall_interactively instead of + manipulating the backtrace manually. + (make_lispy_event): Merge the ASCII and MULTIBYTE cases. + (struct backtrace, backtrace_list): Remove. + (command_loop_1): Remove dead var `no_direct'. + + * buffer.c (reset_buffer_local_variables): If permanent_too is 0, also + preserve non-built-in buffer-local variables. + (Fkill_all_local_variables): Don't re-create&re-set permanent + buffer-local variables. + 2007-12-09 Juri Linkov <juri@jurta.org> * buffer.c (Frename_buffer): Change interactive spec from "s" to diff --git a/src/buffer.c b/src/buffer.c index cfaacc28905..44c449767c3 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -107,12 +107,14 @@ static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS]; int last_per_buffer_idx; -Lisp_Object Fset_buffer (); -void set_buffer_internal (); -void set_buffer_internal_1 (); -static void call_overlay_mod_hooks (); -static void swap_out_buffer_local_variables (); -static void reset_buffer_local_variables (); +EXFUN (Fset_buffer, 1); +void set_buffer_internal P_ ((struct buffer *b)); +void set_buffer_internal_1 P_ ((struct buffer *b)); +static void call_overlay_mod_hooks P_ ((Lisp_Object list, Lisp_Object overlay, + int after, Lisp_Object arg1, + Lisp_Object arg2, Lisp_Object arg3)); +static void swap_out_buffer_local_variables P_ ((struct buffer *b)); +static void reset_buffer_local_variables P_ ((struct buffer *b, int permanent_too)); /* Alist of all buffer names vs the buffers. */ /* This used to be a variable, but is no longer, @@ -716,7 +718,7 @@ reset_buffer (b) it does not treat permanent locals consistently. Instead, use Fkill_all_local_variables. - If PERMANENT_TOO is 1, then we reset permanent built-in + If PERMANENT_TOO is 1, then we reset permanent buffer-local variables. If PERMANENT_TOO is 0, we preserve those. */ @@ -754,7 +756,23 @@ reset_buffer_local_variables (b, permanent_too) #endif /* Reset all (or most) per-buffer variables to their defaults. */ - b->local_var_alist = Qnil; + if (permanent_too) + b->local_var_alist = Qnil; + else + { + Lisp_Object tmp, last = Qnil; + for (tmp = b->local_var_alist; CONSP (tmp); tmp = XCDR (tmp)) + if (CONSP (XCAR (tmp)) + && SYMBOLP (XCAR (XCAR (tmp))) + && !NILP (Fget (XCAR (XCAR (tmp)), Qpermanent_local))) + /* If permanent-local, keep it. */ + last = tmp; + else if (NILP (last)) + b->local_var_alist = XCDR (tmp); + else + XSETCDR (last, XCDR (tmp)); + } + for (i = 0; i < last_per_buffer_idx; ++i) if (permanent_too || buffer_permanent_local_flags[i] == 0) SET_PER_BUFFER_VALUE_P (b, i, 0); @@ -2452,14 +2470,10 @@ The first thing this function does is run the normal hook `change-major-mode-hook'. */) () { - register Lisp_Object alist, sym, tem; - Lisp_Object oalist; - if (!NILP (Vrun_hooks)) call1 (Vrun_hooks, Qchange_major_mode_hook); - oalist = current_buffer->local_var_alist; - /* Make sure none of the bindings in oalist + /* Make sure none of the bindings in local_var_alist remain swapped in, in their symbols. */ swap_out_buffer_local_variables (current_buffer); @@ -2468,20 +2482,6 @@ the normal hook `change-major-mode-hook'. */) reset_buffer_local_variables (current_buffer, 0); - /* Any which are supposed to be permanent, - make local again, with the same values they had. */ - - for (alist = oalist; CONSP (alist); alist = XCDR (alist)) - { - sym = XCAR (XCAR (alist)); - tem = Fget (sym, Qpermanent_local); - if (! NILP (tem)) - { - Fmake_local_variable (sym); - Fset (sym, XCDR (XCAR (alist))); - } - } - /* Force mode-line redisplay. Useful here because all major mode commands call this function. */ update_mode_lines++; From 6d0867e5f54987f3133afce53d35a65adbae99b7 Mon Sep 17 00:00:00 2001 From: Stefan Monnier <monnier@iro.umontreal.ca> Date: Mon, 10 Dec 2007 03:48:05 +0000 Subject: [PATCH 087/172] (Fcommand_execute): Call Qcall_interactively instead of manipulating the backtrace manually. (make_lispy_event): Merge the ASCII and MULTIBYTE cases. (struct backtrace, backtrace_list): Remove. (command_loop_1): Remove dead var `no_direct'. --- src/keyboard.c | 89 ++++++++++++++------------------------------------ 1 file changed, 25 insertions(+), 64 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 7febb3f064f..bcd3b536c57 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -108,21 +108,6 @@ int interrupt_input_pending; #define KBD_BUFFER_SIZE 4096 #endif /* No X-windows */ -/* Following definition copied from eval.c */ - -struct backtrace - { - struct backtrace *next; - Lisp_Object *function; - Lisp_Object *args; /* Points to vector of args. */ - int nargs; /* length of vector. If nargs is UNEVALLED, - args points to slot holding list of - unevalled args */ - char evalargs; - /* Nonzero means call value of debugger when done with this operation. */ - char debug_on_exit; - }; - #ifdef MULTI_KBOARD KBOARD *initial_kboard; KBOARD *current_kboard; @@ -175,8 +160,6 @@ extern int minbuf_level; extern int message_enable_multibyte; -extern struct backtrace *backtrace_list; - /* If non-nil, the function that implements the display of help. It's called with one argument, the help string to display. */ @@ -1565,7 +1548,6 @@ command_loop_1 () int nonundocount; Lisp_Object keybuf[30]; int i; - int no_direct; int prev_modiff = 0; struct buffer *prev_buffer = NULL; #if 0 /* This shouldn't be necessary anymore. --lorentey */ @@ -1625,8 +1607,6 @@ command_loop_1 () while (pending_malloc_warning) display_malloc_warning (); - no_direct = 0; - Vdeactivate_mark = Qnil; /* If minibuffer on and echo area in use, @@ -1787,7 +1767,7 @@ command_loop_1 () } else { - if (NILP (current_kboard->Vprefix_arg) && ! no_direct) + if (NILP (current_kboard->Vprefix_arg)) { /* In case we jump to directly_done. */ Vcurrent_prefix_arg = current_kboard->Vprefix_arg; @@ -5558,41 +5538,32 @@ make_lispy_event (event) { /* A simple keystroke. */ case ASCII_KEYSTROKE_EVENT: - { - Lisp_Object lispy_c; - int c = event->code & 0377; - /* Turn ASCII characters into control characters - when proper. */ - if (event->modifiers & ctrl_modifier) - c = make_ctrl_char (c); - - /* Add in the other modifier bits. We took care of ctrl_modifier - just above, and the shift key was taken care of by the X code, - and applied to control characters by make_ctrl_char. */ - c |= (event->modifiers - & (meta_modifier | alt_modifier - | hyper_modifier | super_modifier)); - /* Distinguish Shift-SPC from SPC. */ - if ((event->code & 0377) == 040 - && event->modifiers & shift_modifier) - c |= shift_modifier; - button_down_time = 0; - XSETFASTINT (lispy_c, c); - return lispy_c; - } - case MULTIBYTE_CHAR_KEYSTROKE_EVENT: { Lisp_Object lispy_c; int c = event->code; + if (event->kind == ASCII_KEYSTROKE_EVENT) + { + c &= 0377; + eassert (c == event->code); + /* Turn ASCII characters into control characters + when proper. */ + if (event->modifiers & ctrl_modifier) + { + c = make_ctrl_char (c); + event->modifiers &= ~ctrl_modifier; + } + } - /* Add in the other modifier bits. We took care of ctrl_modifier - just above, and the shift key was taken care of by the X code, - and applied to control characters by make_ctrl_char. */ + /* Add in the other modifier bits. The shift key was taken care + of by the X code. */ c |= (event->modifiers & (meta_modifier | alt_modifier | hyper_modifier | super_modifier | ctrl_modifier)); - /* What about the `shift' modifier ? */ + /* Distinguish Shift-SPC from SPC. */ + if ((event->code) == 040 + && event->modifiers & shift_modifier) + c |= shift_modifier; button_down_time = 0; XSETFASTINT (lispy_c, c); return lispy_c; @@ -9619,7 +9590,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last, } GROW_RAW_KEYBUF; - XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key; + ASET (raw_keybuf, raw_keybuf_count++, key); } /* Clicks in non-text areas get prefixed by the symbol @@ -10371,7 +10342,6 @@ a special event, so ignore the prefix argument and don't clear it. */) register Lisp_Object final; register Lisp_Object tem; Lisp_Object prefixarg; - struct backtrace backtrace; extern int debug_on_next_call; debug_on_next_call = 0; @@ -10437,20 +10407,11 @@ a special event, so ignore the prefix argument and don't clear it. */) } if (CONSP (final) || SUBRP (final) || COMPILEDP (final)) - { - backtrace.next = backtrace_list; - backtrace_list = &backtrace; - backtrace.function = &Qcall_interactively; - backtrace.args = &cmd; - backtrace.nargs = 1; - backtrace.evalargs = 0; - backtrace.debug_on_exit = 0; + /* Don't call Fcall_interactively directly because we want to make + sure the backtrace has an entry for `call-interactively'. + For the same reason, pass `cmd' rather than `final'. */ + return call3 (Qcall_interactively, cmd, record_flag, keys); - tem = Fcall_interactively (cmd, record_flag, keys); - - backtrace_list = backtrace.next; - return tem; - } return Qnil; } @@ -10561,7 +10522,7 @@ give to the command you invoke, if it asks for an argument. */) bindings = Qnil; value = Qnil; - GCPRO2 (bindings, value); + GCPRO3 (bindings, value, function); value = Fcommand_execute (function, Qt, Qnil, Qnil); /* If the command has a key binding, print it now. */ From ff91dc79efda4e4f20cefd4bc11cb711ec5f0fde Mon Sep 17 00:00:00 2001 From: Stefan Monnier <monnier@iro.umontreal.ca> Date: Mon, 10 Dec 2007 03:51:25 +0000 Subject: [PATCH 088/172] (server-select-display): Fix important typo. (server-process-filter): Turn a "" display into nil. --- lisp/ChangeLog | 39 ++++++++++++++++++++------------------- lisp/server.el | 8 ++++---- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c7f046adf5f..701a0071745 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * server.el (server-select-display): Fix important typo. + (server-process-filter): Turn a "" display into nil. + 2007-12-09 Juri Linkov <juri@jurta.org> * replace.el (keep-lines, flush-lines, how-many): Doc fix. @@ -29,9 +34,9 @@ * printing.el: Fix pr-interface-map initialization code. (pr-version): New version 6.9.3. - (pr-f-set-keymap-parents): Replaced by pr-set-keymap-parents. - (pr-f-set-keymap-name): Replaced by pr-set-keymap-name. - (pr-f-read-string): Replaced by pr-read-string. + (pr-f-set-keymap-parents): Replace by pr-set-keymap-parents. + (pr-f-set-keymap-name): Replace by pr-set-keymap-name. + (pr-f-read-string): Replace by pr-read-string. (pr-set-keymap-parents, pr-set-keymap-name, pr-read-string): New fun name. (pr-interactive-n-up, pr-interactive-regexp): Code fix. @@ -68,8 +73,7 @@ 2007-12-08 Michael Albinus <michael.albinus@gmx.de> * net/dbus.el (dbus-hash-table=): Remove function. We cannot - apply wildcards in a hash table key; there is no usable hash code - then. + apply wildcards in a hash table key; there is no usable hash code then. (dbus-registered-functions-table): Use `equal' as test function. (dbus-name-owner-changed-handler): Rewrite due to new hash table structure. @@ -114,8 +118,7 @@ * calc/calcalg2.el (math-integral): * calc/calc.el (calc-read-key-sequence, calc-version): * calc/calc-mode.el (calc-set-simplify-mode): - * calc/calc-ext.el (calc-fancy-prefix): Fix buggy call to - `message'. + * calc/calc-ext.el (calc-fancy-prefix): Fix buggy call to `message'. 2007-12-07 D. Goel <deego3@gmail.com> @@ -136,10 +139,8 @@ 2007-12-07 Michael Albinus <michael.albinus@gmx.de> - * net/dbus.el (dbus-hash-table=): Fix for new hash table key - structure. - (dbus-list-hash-table, dbus-name-owner-changed-handler): New - defuns. + * net/dbus.el (dbus-hash-table=): Fix for new hash table key structure. + (dbus-list-hash-table, dbus-name-owner-changed-handler): New defuns. (dbus-check-event, dbus-handle-event, dbus-event-bus-name) (dbus-event-service-name, dbus-event-path-name) (dbus-event-interface-name, dbus-event-member-name): Fix for new @@ -291,8 +292,8 @@ * eshell/esh-module.el (eshell-load-defgroups): Eval and compile. - * eshell/esh-util.el (top-level): Don't require pp. Use - condition-case rather than ignore-errors. + * eshell/esh-util.el (top-level): Don't require pp. + Use condition-case rather than ignore-errors. * eshell/eshell.el (eshell-buffer-name): Define for compiler. @@ -314,8 +315,8 @@ esh-maint. Collect any require statements. Leave provide at start. Move any commentary to start. - * emacs-lisp/bytecomp.el (byte-compile-declare-function): Remove - declared function from byte-compile-noruntime-functions. + * emacs-lisp/bytecomp.el (byte-compile-declare-function): + Remove declared function from byte-compile-noruntime-functions. * ediff-util.el (ediff-version): * progmodes/python.el (compilation-shell-minor-mode): @@ -417,16 +418,16 @@ 2007-12-03 Richard Stallman <rms@gnu.org> - * subr.el (declare-function): Moved from byte-run.el. + * subr.el (declare-function): Move from byte-run.el. - * emacs-lisp/byte-run.el (declare-function): Moved to subr.el + * emacs-lisp/byte-run.el (declare-function): Move to subr.el * window.el (recenter-top-bottom): Don't use `ecase'. 2007-12-02 Karl Fogel <kfogel@red-bean.com> - * saveplace.el (save-place-alist-to-file): Set - coding-system-for-write once and refer to it throughout. + * saveplace.el (save-place-alist-to-file): + Set coding-system-for-write once and refer to it throughout. Suggested by David Reitter <dreitter{_AT_}inf.ed.ac.uk>. 2007-12-02 Karl Fogel <kfogel@red-bean.com> diff --git a/lisp/server.el b/lisp/server.el index e6477b92d6f..4d21959774a 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -242,8 +242,7 @@ ENV should be in the same format as `process-environment'." "Delete PROC, including its buffers, terminals and frames. If NOFRAME is non-nil, let the frames live. (To be used from `delete-frame-functions'.)" - (server-log (concat "server-delete-client" (if noframe " noframe")) - proc) + (server-log (concat "server-delete-client" (if noframe " noframe")) proc) ;; Force a new lookup of client (prevents infinite recursion). (when (memq proc server-clients) (let ((buffers (process-get proc 'buffers))) @@ -339,7 +338,7 @@ If CLIENT is non-nil, add a description of it to the logged message." display ;; Make it display (and remember) some dummy buffer, so ;; we can detect later if the frame is in use or not. - `((server-dummmy-buffer . ,buffer) + `((server-dummy-buffer . ,buffer) ;; This frame may be deleted later (see ;; server-unselect-display) so we want it to be as ;; unobtrusive as possible. @@ -833,7 +832,8 @@ The following commands are accepted by the client: ;; -display DISPLAY: ;; Open X frames on the given display instead of the default. ((and (equal "-display" arg) command-line-args-left) - (setq display (pop command-line-args-left))) + (setq display (pop command-line-args-left)) + (if (zerop (length display)) (setq display nil))) ;; -window-system: Open a new X frame. ((equal "-window-system" arg) From aa5fea59c1ed01e895877a623ba893846d3d32ed Mon Sep 17 00:00:00 2001 From: Stefan Monnier <monnier@iro.umontreal.ca> Date: Mon, 10 Dec 2007 17:02:42 +0000 Subject: [PATCH 089/172] New file. --- admin/CPP-DEFINES | 26 ++++++++++++++++++++++++++ admin/ChangeLog | 4 ++++ 2 files changed, 30 insertions(+) create mode 100644 admin/CPP-DEFINES diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES new file mode 100644 index 00000000000..0490d89325e --- /dev/null +++ b/admin/CPP-DEFINES @@ -0,0 +1,26 @@ +Here are some of the cpp macros used, together with some short explanation +of their use. Feel free to add more macros and more categories. + +** Distinguishing OSes ** + +MAC_OS Compiling for some version of Mac OS? +MAC_OS8 Compiling for Mac OS version 8. Requires MAC_OS? +MAC_OSX Compiling for Mac OS X? Is that also valid for Darwin? +MAC_OS_X ?? Apparently only used once in mac.c. +CYGWIN Compiling the Cygwin port. +MSDOS Compiling the MSDOS port. +DOS_NT Compiling for either the MSDOS or W32 port. +WINDOWSNT Compiling the W32 port. +WINDOWS_NT ?? Only once in dispextern.h + +** Distinguishing GUIs ** + +HAVE_NTGUI Compile support for the W32 GUI. +HAVE_CARBON Compile support for the Carbon GUI. Requires MAC_OS? +HAVE_X11 Compile support for the X11 GUI. +X11 ?? Makefile.in suggests it's equivalent to HAVE_X11 +USE_LUCID Use the Lucid toolkit for menus&scrollbars. Requires HAVE_X11. +USE_MOTIF Use the Motif toolkit for menus&scrollbars. Requires HAVE_X11. +USE_GTK Use the Gtk toolkit for menus&scrollbars. Requires HAVE_X11. + +# arch-tag: bc80061a-1168-4911-9766-46aaf2640250 diff --git a/admin/ChangeLog b/admin/ChangeLog index db8795f3aaa..516cecfbb6d 100644 --- a/admin/ChangeLog +++ b/admin/ChangeLog @@ -1,3 +1,7 @@ +2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * CPP-DEFINES: New file. + 2007-12-08 Reiner Steib <Reiner.Steib@gmx.de> * FOR-RELEASE: Remove "window-system in face definition" [of From bb14938c9ff60e83fc2bc17ff5af83ea7648688d Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Tue, 11 Dec 2007 00:26:52 +0000 Subject: [PATCH 090/172] revert-buffer eliminates overlays and the mark --- lisp/ChangeLog | 4 ++++ lisp/files.el | 16 +++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 701a0071745..09a3e801ddd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2007-12-10 Yoni Rabkin Katzenell <yoni-r@actcom.com> (tiny change) + + * file.el (revert-buffer): Eliminate overlays and the mark. + 2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> * server.el (server-select-display): Fix important typo. diff --git a/lisp/files.el b/lisp/files.el index 8d5fcfda8c2..e6f957f480f 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4204,10 +4204,12 @@ This undoes all changes since the file was visited or saved. With a prefix argument, offer to revert from latest auto-save file, if that is more recent than the visited file. -This command also works for special buffers that contain text which -doesn't come from a file, but reflects some other data base instead: -for example, Dired buffers and `buffer-list' buffers. In these cases, -it reconstructs the buffer contents from the appropriate data base. +This command also implements an interface for special buffers +that contain text which doesn't come from a file, but reflects +some other data instead (e.g. Dired buffers, `buffer-list' +buffers). This is done via the variable +`revert-buffer-function'. In these cases, it should reconstruct +the buffer contents from the appropriate data. When called from Lisp, the first argument is IGNORE-AUTO; only offer to revert from the auto-save file when this is nil. Note that the @@ -4323,7 +4325,11 @@ non-nil, it is called instead of rereading visited file contents." (insert-file-contents file-name (not auto-save-p) nil nil t)) (insert-file-contents file-name (not auto-save-p) - nil nil t))))) + nil nil t)) + ;; Reset the mark and remove all overlays. + (setq mark-active nil + mark-ring nil) + (remove-overlays)))) ;; Recompute the truename in case changes in symlinks ;; have changed the truename. (setq buffer-file-truename From 38f584e90e8785a409d99d90f41ff357f7680ee1 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu <dann@ics.uci.edu> Date: Tue, 11 Dec 2007 03:19:09 +0000 Subject: [PATCH 091/172] (set-buffer-menubar): Remove unused function. (add-submenu): Only define for XEmacs. (verilog-regexp-words): Revert previous change, keep the other definition. --- lisp/ChangeLog | 8 ++++++++ lisp/progmodes/verilog-mode.el | 23 ++++++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 13505897067..b49ec6d23bd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2007-12-11 Dan Nicolaescu <dann@ics.uci.edu> + + * progmodes/verilog-mode.el (set-buffer-menubar): Remove unused + function. + (add-submenu): Only define for XEmacs. + (verilog-regexp-words): Revert previous change, keep the other + definition. + 2007-12-09 Dan Nicolaescu <dann@ics.uci.edu> * progmodes/perl-mode.el (perl-continued-statement-offset) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 79a4cd5c399..2d34d9d599a 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -154,14 +154,14 @@ nil ;; fab (defmacro store-match-data (&rest args) nil)) (error nil)) - (condition-case nil - (if (boundp 'current-menubar) - nil ;; great - (progn - (defmacro set-buffer-menubar (&rest args) nil) - (defmacro add-submenu (&rest args) nil)) - ) - (error nil)) + (if (featurep 'xemacs) + (condition-case nil + (if (boundp 'current-menubar) + nil ;; great + (progn + (defmacro add-submenu (&rest args) nil)) + ) + (error nil))) (condition-case nil (if (fboundp 'zmacs-activate-region) nil ;; great @@ -274,9 +274,10 @@ STRING should be given if the last search was by `string-match' on STRING." (concat open (mapconcat 'regexp-quote strings "\\|") close))) )) -(defun verilog-regexp-words (a) - "Call 'regexp-opt' with word delimiters for the words A." - (concat "\\<" (verilog-regexp-opt a t) "\\>")) +(eval-when-compile + (defun verilog-regexp-words (a) + "Call 'regexp-opt' with word delimiters for the words A." + (concat "\\<" (verilog-regexp-opt a t) "\\>"))) (defun verilog-customize () "Link to customize screen for Verilog." From c65d038099789ce426238e3e22e460da0b43f4ab Mon Sep 17 00:00:00 2001 From: Jay Belanger <jay.p.belanger@gmail.com> Date: Tue, 11 Dec 2007 04:04:26 +0000 Subject: [PATCH 092/172] (calc-lang-name): New property name. --- lisp/calc/calc-lang.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lisp/calc/calc-lang.el b/lisp/calc/calc-lang.el index 2ae23cd5aa9..6773049c391 100644 --- a/lisp/calc/calc-lang.el +++ b/lisp/calc/calc-lang.el @@ -408,6 +408,9 @@ (message "LaTeX language mode with \\func(\\text{var}) and multiline matrices"))))) +(put 'tex 'math-lang-name "TeX") +(put 'latex 'math-lang-name "LaTeX") + (put 'tex 'math-oper-table '( ( "\\hat" calcFunc-hat -1 950 ) ( "\\check" calcFunc-check -1 950 ) From da6b9bf428360100c44c6b48cb5a66a379756699 Mon Sep 17 00:00:00 2001 From: Jay Belanger <jay.p.belanger@gmail.com> Date: Tue, 11 Dec 2007 04:07:28 +0000 Subject: [PATCH 093/172] (calc-set-mode-line): Use `math-lang-name' to set language name. --- lisp/ChangeLog | 7 +++++++ lisp/calc/calc.el | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 09a3e801ddd..d392c85e212 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2007-12-11 Jay Belanger <jay.p.belanger@gmail.com> + + * calc/calc-lang.el (math-lang-name): New property name. + + * calc/calc.el (calc-set-mode-line): Use `math-lang-name' + to set language name. + 2007-12-10 Yoni Rabkin Katzenell <yoni-r@actcom.com> (tiny change) * file.el (revert-buffer): Eliminate overlays and the mark. diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el index 6e12fbe9f5f..fa98b161567 100644 --- a/lisp/calc/calc.el +++ b/lisp/calc/calc.el @@ -1675,8 +1675,8 @@ See calc-keypad for details." (t (format "Radix%d " calc-number-radix))) (if calc-leading-zeros "Zero " "") (cond ((null calc-language) "") - ((eq calc-language 'tex) "TeX ") - ((eq calc-language 'latex) "LaTeX ") + ((get calc-language 'math-lang-name) + (concat (get calc-language 'math-lang-name) " ")) (t (concat (capitalize (symbol-name calc-language)) " "))) From e230a06e0b0527bb396e6bc0a8411ebc5173a1cc Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:20:26 +0000 Subject: [PATCH 094/172] Move `require's before `eval-when-compile's. Add declare-function compatibility definition. (gnus-extract-address-components): Declare as a function. --- lisp/gnus/spam.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el index fddebb1d290..f2c18e71d0c 100644 --- a/lisp/gnus/spam.el +++ b/lisp/gnus/spam.el @@ -40,16 +40,20 @@ ;;{{{ compilation directives and autoloads/requires +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) -(eval-when-compile (require 'spam-report)) -(eval-when-compile (require 'hashcash)) +(require 'message) ;for the message-fetch-field functions (require 'gnus-sum) - (require 'gnus-uu) ; because of key prefix issues ;;; for the definitions of group content classification and spam processors (require 'gnus) -(require 'message) ;for the message-fetch-field functions + +(eval-when-compile (require 'spam-report)) +(eval-when-compile (require 'hashcash)) ;; for nnimap-split-download-body-default (eval-when-compile (require 'nnimap)) @@ -2066,6 +2070,9 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (autoload 'bbdb-create-internal "bbdb") (autoload 'bbdb-search-simple "bbdb")) +;; Autoloaded in message, which we require. +(declare-function gnus-extract-address-components "gnus-util" (from)) + (eval-and-compile (when (condition-case nil (progn From 64c7b653e17118f2dc0dae78d70d02a929ded3c6 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:20:46 +0000 Subject: [PATCH 095/172] (gnus-message): Autoload. --- lisp/gnus/spam-stat.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/gnus/spam-stat.el b/lisp/gnus/spam-stat.el index 5b57f376cf8..bba1c2a70e8 100644 --- a/lisp/gnus/spam-stat.el +++ b/lisp/gnus/spam-stat.el @@ -377,6 +377,8 @@ Use `spam-stat-ngood', `spam-stat-nbad', `spam-stat-good', (spam-stat-buffer-words)) (setq spam-stat-dirty t)) +(autoload 'gnus-message "gnus-util") + (defun spam-stat-buffer-change-to-spam () "Consider current buffer no longer normal mail but spam." (setq spam-stat-nbad (1+ spam-stat-nbad) From 48fd2675766dc53a4140338b4ee4ba2ed12b396c Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:21:18 +0000 Subject: [PATCH 096/172] (gnus-run-mode-hooks): Autoload it. --- lisp/gnus/smime.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/gnus/smime.el b/lisp/gnus/smime.el index bd9ce5a5c46..105cadff081 100644 --- a/lisp/gnus/smime.el +++ b/lisp/gnus/smime.el @@ -658,6 +658,8 @@ A string or a list of strings is returned." (define-key smime-mode-map "q" 'smime-exit) (define-key smime-mode-map "f" 'smime-certificate-info)) +(autoload 'gnus-run-mode-hooks "gnus-util") + (defun smime-mode () "Major mode for browsing, viewing and fetching certificates. From 444f6b28fac106730e052322a6291470959c7db2 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:22:04 +0000 Subject: [PATCH 097/172] Add declare-function compatibility definition. (mail-header-parse-content-type, message-narrow-to-head): Autoload. (message-fetch-field): Declare as a function. --- lisp/gnus/rfc1843.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lisp/gnus/rfc1843.el b/lisp/gnus/rfc1843.el index f27825b6d74..4820184d21a 100644 --- a/lisp/gnus/rfc1843.el +++ b/lisp/gnus/rfc1843.el @@ -34,6 +34,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'mm-util) @@ -139,6 +143,10 @@ ftp://ftp.math.psu.edu/pub/simpson/chinese/hzp/hzp.doc" (aset s (incf i) (+ v (if (< v 63) 64 98)))))) s)) +(autoload 'mail-header-parse-content-type "mail-parse") +(autoload 'message-narrow-to-head "message") +(declare-function message-fetch-field "message" (header &optional not-all)) + (defun rfc1843-decode-article-body () "Decode HZ encoded text in the article body." (if (string-match (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") From 0f7cbeb9eafceb644cf51b7e5aa073751b4b96e0 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:22:34 +0000 Subject: [PATCH 098/172] Add declare-function compatibility definition. (w3-parse-buffer, gnus-group-make-rss-group): Declare as functions. --- lisp/gnus/nnrss.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lisp/gnus/nnrss.el b/lisp/gnus/nnrss.el index f72166b0455..4a02690a3c5 100644 --- a/lisp/gnus/nnrss.el +++ b/lisp/gnus/nnrss.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'gnus) @@ -418,6 +422,8 @@ otherwise return nil." nnrss-compatible-encoding-alist))))) (mm-coding-system-p 'utf-8))) +(declare-function w3-parse-buffer "ext:w3-parse" (&optional buff)) + (defun nnrss-fetch (url &optional local) "Fetch URL and put it in a the expected Lisp structure." (mm-with-unibyte-buffer @@ -784,6 +790,8 @@ which RSS 2.0 allows." (push (list group nnrss-group-max) nnrss-server-data))) (nnrss-save-server-data server)))) +(declare-function gnus-group-make-rss-group "gnus-group" (&optional url)) + (defun nnrss-opml-import (opml-file) "OPML subscriptions import. Read the file and attempt to subscribe to each Feed in the file." From cdbd069ad0f04009a01b31bf775b1e3fb30b9c41 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:23:01 +0000 Subject: [PATCH 099/172] Add declare-function compatibility definition. (gnus-group-mark-article-read): Declare as a function. --- lisp/gnus/nnmaildir.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/nnmaildir.el b/lisp/gnus/nnmaildir.el index 829b3761cd3..05c19c27ee1 100644 --- a/lisp/gnus/nnmaildir.el +++ b/lisp/gnus/nnmaildir.el @@ -61,6 +61,10 @@ ) ] +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-and-compile (require 'nnheader) (require 'gnus) @@ -1439,6 +1443,8 @@ by nnmaildir-request-article.") (defun nnmaildir-active-number (gname) 0) +(declare-function gnus-group-mark-article-read "gnus-group" (group article)) + (defun nnmaildir-request-expire-articles (ranges &optional gname server force) (let ((no-force (not force)) (group (nnmaildir--prepare server gname)) From 163a3c6aee8034d447e4f066307f32d8aa010e59 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:23:37 +0000 Subject: [PATCH 100/172] Add declare-function compatibility definition. Require gnus-int. (gnus-activate-group, gnus-group-mark-article-read): Declare as functions. --- lisp/gnus/nnmail.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el index e05c286b1ab..06e6db5f792 100644 --- a/lisp/gnus/nnmail.el +++ b/lisp/gnus/nnmail.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'gnus) ; for macro gnus-kill-buffer, at least @@ -35,6 +39,7 @@ (require 'gnus-util) (require 'mail-source) (require 'mm-util) +(require 'gnus-int) (eval-and-compile (autoload 'gnus-add-buffer "gnus") @@ -1315,6 +1320,9 @@ Eudora has a broken References line, but an OK In-Reply-To." ;;; Utility functions +(declare-function gnus-activate-group "gnus-start" + (group &optional scan dont-check method)) + (defun nnmail-do-request-post (accept-func &optional server) "Utility function to directly post a message to an nnmail-derived group. Calls ACCEPT-FUNC (which should be `nnchoke-request-accept-article') @@ -1854,6 +1862,8 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." ;; Compare the time with the current time. (ignore-errors (time-less-p days (time-since time)))))))) +(declare-function gnus-group-mark-article-read "gnus-group" (group article)) + (defun nnmail-expiry-target-group (target group) ;; Do not invoke this from nntp-server-buffer! At least nnfolder clears ;; that buffer if the nnfolder group isn't selected. From 8867ac549103837c58e20949bc78bf33814a9238 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:24:02 +0000 Subject: [PATCH 101/172] (ietf-drums-unfold-fws): Autoload it. --- lisp/gnus/nnheader.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/gnus/nnheader.el b/lisp/gnus/nnheader.el index 11cb4bff55c..79783f535c3 100644 --- a/lisp/gnus/nnheader.el +++ b/lisp/gnus/nnheader.el @@ -251,6 +251,8 @@ on your system, you could say something like: (skip-chars-forward " \t") (buffer-substring (point) (point-at-eol))) +(autoload 'ietf-drums-unfold-fws "ietf-drums") + (defun nnheader-parse-naked-head (&optional number) ;; This function unfolds continuation lines in this buffer ;; destructively. When this side effect is unwanted, use From 75327e9460257356ddae092997af290cec794550 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:25:23 +0000 Subject: [PATCH 102/172] Add declare-function compatibility definition. (gnus-request-group): Autoload it. (gnus-request-create-group): Declare as a function. --- lisp/gnus/nnfolder.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lisp/gnus/nnfolder.el b/lisp/gnus/nnfolder.el index bf82791fea6..8dc28a3eaf6 100644 --- a/lisp/gnus/nnfolder.el +++ b/lisp/gnus/nnfolder.el @@ -31,6 +31,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (require 'nnheader) (require 'message) (require 'nnmail) @@ -429,6 +433,10 @@ the group. Then the marks file will be regenerated properly by Gnus.") ;; The article numbers are increasing, so this result is sorted. (nreverse numbers))))) +(autoload 'gnus-request-group "gnus-int") +(declare-function gnus-request-create-group "gnus-int" + (group &optional gnus-command-method args)) + (deffoo nnfolder-request-expire-articles (articles newsgroup &optional server force) (nnfolder-possibly-change-group newsgroup server) From 43ec17092f4c0ce5278c6b2c8cbc0b7a7fa38934 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:25:51 +0000 Subject: [PATCH 103/172] Add declare-function compatibility definition. (nndb-request-article): Declare as a function. --- lisp/gnus/nndb.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/nndb.el b/lisp/gnus/nndb.el index 70d395ba986..9e1bd3623dc 100644 --- a/lisp/gnus/nndb.el +++ b/lisp/gnus/nndb.el @@ -48,6 +48,12 @@ ;; * make the backend TOUCH an article when marked as expireable (will ;; make article expire 'expiry' days after that moment). +;;; Code: + +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + ;;- ;; Register nndb with known select methods. @@ -55,8 +61,6 @@ (unless (assoc "nndb" gnus-valid-select-methods) (gnus-declare-backend "nndb" 'mail 'respool 'address 'prompt-address)) -;;; Code: - (require 'nnmail) (require 'nnheader) (require 'nntp) @@ -240,6 +244,9 @@ expiry mechanism." (nndb-request-expire-articles-remote articles group server force) (nndb-request-expire-articles-local articles group server force))) +;; _Something_ defines it... +(declare-function nndb-request-article "nndb" t t) + (deffoo nndb-request-move-article (article group server accept-form &optional last move-is-internal) "Move ARTICLE (a number) from GROUP on SERVER. From 5a12b40c6a3bd58d7fb45a1d498dd87c0f5447aa Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:26:52 +0000 Subject: [PATCH 104/172] Add declare-function compatibility definition. (epg-check-configuration, epg-configuration) (message-options-set): Declare as functions. (gnus-buffer-live-p, gnus-get-buffer-create): Autoload. --- lisp/gnus/mml2015.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el index 28d1929399e..95d119282ae 100644 --- a/lisp/gnus/mml2015.el +++ b/lisp/gnus/mml2015.el @@ -30,6 +30,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'mm-decode) (require 'mm-util) @@ -38,6 +42,10 @@ (defvar mc-pgp-always-sign) +(declare-function epg-check-configuration "ext:epg-config" + (config &optional minimum-version)) +(declare-function epg-configuration "ext:epg-config" ()) + (defvar mml2015-use (or (condition-case nil (progn @@ -396,6 +404,10 @@ Whether the passphrase is cached at all is controlled by (insert (format "--%s--\n" boundary)) (goto-char (point-max)))) +;; We require mm-decode, which requires mm-bodies, which autoloads +;; message-options-get (!). +(declare-function message-options-set "message" (symbol value)) + (defun mml2015-mailcrypt-encrypt (cont &optional sign) (let ((mc-pgp-always-sign (or mc-pgp-always-sign @@ -1329,6 +1341,9 @@ If no one is selected, default secret key is used. " ;;; General wrapper +(autoload 'gnus-buffer-live-p "gnus-util") +(autoload 'gnus-get-buffer-create "gnus") + (defun mml2015-clean-buffer () (if (gnus-buffer-live-p mml2015-result-buffer) (with-current-buffer mml2015-result-buffer From 0cc7b6420993e88b176df08e4f493707f41da9cb Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:28:13 +0000 Subject: [PATCH 105/172] Add declare-function compatibility definition. (mm-decode-content-transfer-encoding) (mm-encode-content-transfer-encoding) (message-options-get, message-options-set): Autoload. (mc-encrypt-generic, gpg-sign-encrypt, gpg-encrypt): Declare as functions. --- lisp/gnus/mml1991.el | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el index be9981676e6..44efe6da668 100644 --- a/lisp/gnus/mml1991.el +++ b/lisp/gnus/mml1991.el @@ -28,6 +28,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl) (require 'mm-util)) @@ -39,6 +43,11 @@ (autoload 'quoted-printable-decode-region "qp") (autoload 'quoted-printable-encode-region "qp") +(autoload 'mm-decode-content-transfer-encoding "mm-bodies") +(autoload 'mm-encode-content-transfer-encoding "mm-bodies") +(autoload 'message-options-get "message") +(autoload 'message-options-set "message") + (defvar mml1991-use mml2015-use "The package used for PGP.") @@ -111,6 +120,9 @@ Whether the passphrase is cached at all is controlled by (insert-buffer-substring signature) (goto-char (point-max))))) +(declare-function mc-encrypt-generic "ext:mc-toplev" + (&optional recipients scheme start end from sign)) + (defun mml1991-mailcrypt-encrypt (cont &optional sign) (let ((text (current-buffer)) (mc-pgp-always-sign @@ -161,6 +173,13 @@ Whether the passphrase is cached at all is controlled by (eval-and-compile (autoload 'gpg-sign-cleartext "gpg")) +(declare-function gpg-sign-encrypt "ext:gpg" + (plaintext ciphertext result recipients &optional + passphrase sign-with-key armor textmode)) +(declare-function gpg-encrypt "ext:gpg" + (plaintext ciphertext result recipients &optional + passphrase armor textmode)) + (defun mml1991-gpg-sign (cont) (let ((text (current-buffer)) headers signature From 5ab56288c0118347d7fc4a2b0e2fefc104261881 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:28:59 +0000 Subject: [PATCH 106/172] Add declare-function compatibility definition. (widget-button-press, gnus-make-hashtable): Autoload. (widget-event-point, gnus-configure-windows): Declare as functions. --- lisp/gnus/mml.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el index 092827c570d..ec37c2b7560 100644 --- a/lisp/gnus/mml.el +++ b/lisp/gnus/mml.el @@ -25,6 +25,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (require 'mm-util) (require 'mm-bodies) (require 'mm-encode) @@ -1316,6 +1320,12 @@ Should be adopted if code in `message-send-mail' is changed." (defvar mml-preview-buffer nil) +(autoload 'gnus-make-hashtable "gnus-util") +(autoload 'widget-button-press "wid-edit" nil t) +(declare-function widget-event-point "wid-edit" (event)) +;; If gnus-buffer-configuration is bound this is loaded. +(declare-function gnus-configure-windows "gnus-win" (setting &optional force)) + (defun mml-preview (&optional raw) "Display current buffer with Gnus, in a new buffer. If RAW, display a raw encoded MIME message. From 431e6df6c8fa1c38788baf303023e80f0d0018ed Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:29:49 +0000 Subject: [PATCH 107/172] Add declare-function compatibility definition. (mml-compute-boundary, gnus-completing-read-with-default): Autoload. (epg-key-sub-key-list, epg-sub-key-capability) (epg-sub-key-validity, message-options-set): Declare as functions. --- lisp/gnus/mml-smime.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el index 07dc1ab4ccb..cbd70cb2adb 100644 --- a/lisp/gnus/mml-smime.el +++ b/lisp/gnus/mml-smime.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'smime) @@ -216,6 +220,8 @@ Whether the passphrase is cached at all is controlled by (quit)) result)) +(autoload 'gnus-completing-read-with-default "gnus-util") + (defun mml-smime-openssl-encrypt-query () ;; todo: try dns/ldap automatically first, before prompting user (let (certs done) @@ -346,6 +352,10 @@ Whether the passphrase is cached at all is controlled by (cons key-id mml-smime-epg-secret-key-id-list)) (copy-sequence passphrase))))) +(declare-function epg-key-sub-key-list "ext:epg" (key)) +(declare-function epg-sub-key-capability "ext:epg" (sub-key)) +(declare-function epg-sub-key-validity "ext:epg" (sub-key)) + (defun mml-smime-epg-find-usable-key (keys usage) (catch 'found (while keys @@ -358,6 +368,12 @@ Whether the passphrase is cached at all is controlled by (setq pointer (cdr pointer)))) (setq keys (cdr keys))))) +(autoload 'mml-compute-boundary "mml") + +;; We require mm-decode, which requires mm-bodies, which autoloads +;; message-options-get (!). +(declare-function message-options-set "message" (symbol value)) + (defun mml-smime-epg-sign (cont) (let* ((inhibit-redisplay t) (context (epg-make-context 'CMS)) From 5f3c7783d15480a387f83542fd7c726afd8705ca Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:30:04 +0000 Subject: [PATCH 108/172] (gnus-original-article-buffer): Define for compiler. --- lisp/gnus/mm-uu.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/gnus/mm-uu.el b/lisp/gnus/mm-uu.el index 52d47b728ef..610f53002c6 100644 --- a/lisp/gnus/mm-uu.el +++ b/lisp/gnus/mm-uu.el @@ -427,6 +427,8 @@ apply the face `mm-uu-extract'." (list mm-dissect-disposition (cons 'filename file-name))))) +(defvar gnus-original-article-buffer) ; gnus.el + (defun mm-uu-yenc-extract () ;; This might not be exactly correct, but we sure can't get the ;; binary data from the article buffer, since that's already in a From b50005900277517eb4c6bb7d177c11252fa731d0 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:39:36 +0000 Subject: [PATCH 109/172] Add declare-function compatibility definition. (gmm-write-region): Autoload. (mm-delete-duplicates, mm-detect-coding-region): Declare as functions. --- lisp/gnus/mm-util.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el index 69dd40d2044..8a2e34498cb 100644 --- a/lisp/gnus/mm-util.el +++ b/lisp/gnus/mm-util.el @@ -26,6 +26,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'mail-prsvr) @@ -960,6 +964,8 @@ But this is very much a corner case, so don't worry about it." (when (featurep 'xemacs) `(and (featurep 'mule) (mm-xemacs-find-mime-charset-1 ,begin ,end)))) +(declare-function mm-delete-duplicates "mm-util" (list)) + (defun mm-find-mime-charset-region (b e &optional hack-charsets) "Return the MIME charsets needed to encode the region between B and E. nil means ASCII, a single-element list represents an appropriate MIME @@ -1210,6 +1216,8 @@ If INHIBIT is non-nil, inhibit `mm-inhibit-file-name-handlers'." inhibit-file-name-handlers))) (write-region start end filename append visit lockname))) +(autoload 'gmm-write-region "gmm-utils") + ;; It is not a MIME function, but some MIME functions use it. (if (and (fboundp 'make-temp-file) (ignore-errors @@ -1301,6 +1309,8 @@ If SUFFIX is non-nil, add that at the end of the file name." (if (eq (point) end) 'ascii (mm-guess-charset)) (goto-char point))))) +(declare-function mm-detect-coding-region "mm-util" (start end)) + (if (fboundp 'coding-system-get) (defun mm-detect-mime-charset-region (start end) "Detect MIME charset of the text in the region between START and END." From f72f15031a6850bb7c717fdab8e64bbe8cee3d09 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:40:08 +0000 Subject: [PATCH 110/172] Add declare-function compatibility definition. (message-goto-body): Declare as a function. --- lisp/gnus/mm-extern.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/mm-extern.el b/lisp/gnus/mm-extern.el index 14e4c77dbed..784ea8c9297 100644 --- a/lisp/gnus/mm-extern.el +++ b/lisp/gnus/mm-extern.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'mm-util) @@ -90,6 +94,8 @@ (let (mm-extern-anonymous) (mm-extern-anon-ftp handle))) +(declare-function message-goto-body "message" (&optional interactivep)) + (defun mm-extern-mail-server (handle) (require 'message) (let* ((params (cdr (mm-handle-type handle))) From 60ef4154fb8c831ce0939e097f6779e673db74fe Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:41:13 +0000 Subject: [PATCH 111/172] Add declare-function compatibility definition. Require gnus-util. (gnus-configure-windows): Declare as a function. (mm-remove-part): Only call delete-annotation on XEmacs. (mm-view-pkcs7): Autoload. --- lisp/gnus/mm-decode.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index 71ef9bcdf55..9de9b3d354e 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -26,9 +26,14 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (require 'mail-parse) (require 'mailcap) (require 'mm-bodies) +(require 'gnus-util) (eval-when-compile (require 'cl) (require 'term)) @@ -733,6 +738,8 @@ external if displayed external." (mm-display-external handle 'mailcap-save-binary-file))))))))) +(declare-function gnus-configure-windows "gnus-win" (setting &optional force)) + (defun mm-display-external (handle method) "Display HANDLE using METHOD." (let ((outbuf (current-buffer))) @@ -990,7 +997,8 @@ external if displayed external." (cond ;; Internally displayed part. ((mm-annotationp object) - (delete-annotation object)) + (if (featurep 'xemacs) + (delete-annotation object))) ((or (functionp object) (and (listp object) (eq (car object) 'lambda))) @@ -1490,6 +1498,8 @@ If RECURSIVE, search recursively." (put-text-property 0 (length (car handle)) parameter value (car handle)))) +(autoload 'mm-view-pkcs7 "mm-view") + (defun mm-possibly-verify-or-decrypt (parts ctl) (let ((type (car ctl)) (subtype (cadr (split-string (car ctl) "/"))) From 498fc2ae10af3d4ecbee270c431d9cad52655517 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:41:53 +0000 Subject: [PATCH 112/172] Add declare-function compatibility definition. (message-options-get): Autoload. (message-options-set): Declare as a function. --- lisp/gnus/mm-bodies.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lisp/gnus/mm-bodies.el b/lisp/gnus/mm-bodies.el index 557bd132ed5..e7743d12d30 100644 --- a/lisp/gnus/mm-bodies.el +++ b/lisp/gnus/mm-bodies.el @@ -26,6 +26,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (require 'mm-util) (require 'rfc2047) (require 'mm-encode) @@ -67,6 +71,9 @@ Valid encodings are `7bit', `8bit', `quoted-printable' and `base64'." (const base64)))) :group 'mime) +(autoload 'message-options-get "message") +(declare-function message-options-set "message" (symbol value)) + (defun mm-encode-body (&optional charset) "Encode a body. Should be called narrowed to the body that is to be encoded. From ea7d768a9ac545a2a825dba59a54f1d6fc4505e0 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:42:15 +0000 Subject: [PATCH 113/172] (Info-goto-node, format-spec): Autoload. --- lisp/gnus/message.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 919a4c06721..4fba4fd630e 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -2471,6 +2471,8 @@ Point is left at the beginning of the narrowed-to region." (kill-region start (point)))) +(autoload 'Info-goto-node "info") + (defun message-info (&optional arg) "Display the Message manual. @@ -3698,6 +3700,8 @@ This function uses `mail-citation-hook' if that is non-nil." (defvar gnus-extract-address-components) +(autoload 'format-spec "format-spec") + (defun message-insert-formatted-citation-line (&optional from date) "Function that inserts a formatted citation line. From 1ffeb586a53bfad9006036f160c6321933cfd6b6 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:43:42 +0000 Subject: [PATCH 114/172] Add declare-function compatibility definition. (gnus-compress-sequence): Autoload. (imap-capability): Declare as a function. --- lisp/gnus/mail-source.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lisp/gnus/mail-source.el b/lisp/gnus/mail-source.el index 39595b767ad..a3721430819 100644 --- a/lisp/gnus/mail-source.el +++ b/lisp/gnus/mail-source.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (require 'format-spec) (eval-when-compile (require 'cl) @@ -997,9 +1001,14 @@ This only works when `display-time' is enabled." (autoload 'imap-range-to-message-set "imap") (autoload 'nnheader-ms-strip-cr "nnheader")) +(autoload 'gnus-compress-sequence "gnus-range") + (defvar mail-source-imap-file-coding-system 'binary "Coding system for the crashbox made by `mail-source-fetch-imap'.") +;; Autoloads will bring in imap before this is called. +(declare-function imap-capability "imap" (&optional identifier buffer)) + (defun mail-source-fetch-imap (source callback) "Fetcher for imap sources." (mail-source-bind (imap source) From c7e9cfaf696803061e90ce07fc62af34046c9be6 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:44:18 +0000 Subject: [PATCH 115/172] Add declare-function compatibility definition. (gnus-group-decoded-name): Declare as a function. --- lisp/gnus/gnus.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index bd96e52d65f..fc76fce86d7 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -30,6 +30,10 @@ (eval '(run-hooks 'gnus-load-hook)) +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'wid-edit) (require 'mm-util) @@ -3736,6 +3740,8 @@ server is native)." "Return the prefix of the current group name." (< 0 (length (gnus-group-real-prefix group)))) +(declare-function gnus-group-decoded-name "gnus-group" (string)) + (defun gnus-summary-buffer-name (group) "Return the summary buffer name of GROUP." (concat "*Summary " (gnus-group-decoded-name group) "*")) From 704f16638a2c1888c4e4b80a5ee8e4b6d8743f23 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:44:54 +0000 Subject: [PATCH 116/172] (turn-on-gnus-mailing-list-mode) (gnus-cache-write-active, mm-uu-dissect, idna-to-unicode): Declare as functions. --- lisp/gnus/gnus-sum.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 72a79035f0c..2f4ccb7307c 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -2962,6 +2962,9 @@ When FORCE, rebuild the tool bar." (setq headers (cdr headers))) (list (nreverse outh)))))))) + +(declare-function turn-on-gnus-mailing-list-mode "gnus-ml" ()) + (defun gnus-summary-mode (&optional group) @@ -6951,6 +6954,8 @@ If FORCE (the prefix), also save the .newsrc file(s)." (gnus-save-newsrc-file) (gnus-dribble-save))) +(declare-function gnus-cache-write-active "gnus-cache" (&optional force)) + (defun gnus-summary-exit (&optional temporary leave-hidden) "Exit reading current newsgroup, and then return to group selection mode. `gnus-exit-group-hook' is called with no arguments if that value is non-nil." @@ -9442,6 +9447,8 @@ prefix specifies how many places to rotate each letter forward." ;; Create buttons and stuff... (gnus-treat-article nil)) +(declare-function idna-to-unicode "ext:idna" (str)) + (defun gnus-summary-idna-message (&optional arg) "Decode IDNA encoded domain names in the current articles. IDNA encoded domain names looks like `xn--bar'. If a string @@ -11797,6 +11804,7 @@ save those articles instead." encoded))) (defvar gnus-summary-save-parts-counter) +(declare-function mm-uu-dissect "mm-uu" (&optional noheader mime-type)) (defun gnus-summary-save-parts (type dir n &optional reverse) "Save parts matching TYPE to DIR. From fe86b5e0085e687c2977770477251260c011038c Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:45:10 +0000 Subject: [PATCH 117/172] (gnus-server-opened, gnus-status-message): Move definitions before use. --- lisp/gnus/gnus-int.el | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el index ac2b7237866..5c48f70a6ad 100644 --- a/lisp/gnus/gnus-int.el +++ b/lisp/gnus/gnus-int.el @@ -58,6 +58,27 @@ server denied." (defvar gnus-internal-registry-spool-current-method nil "The current method, for the registry.") + +(defun gnus-server-opened (gnus-command-method) + "Check whether a connection to GNUS-COMMAND-METHOD has been opened." + (unless (eq (gnus-server-status gnus-command-method) + 'denied) + (when (stringp gnus-command-method) + (setq gnus-command-method (gnus-server-to-method gnus-command-method))) + (funcall (inline (gnus-get-function gnus-command-method 'server-opened)) + (nth 1 gnus-command-method)))) + +(defun gnus-status-message (gnus-command-method) + "Return the status message from GNUS-COMMAND-METHOD. +If GNUS-COMMAND-METHOD is a string, it is interpreted as a group +name. The method this group uses will be queried." + (let ((gnus-command-method + (if (stringp gnus-command-method) + (gnus-find-method-for-group gnus-command-method) + gnus-command-method))) + (funcall (gnus-get-function gnus-command-method 'status-message) + (nth 1 gnus-command-method)))) + ;;; ;;; Server Communication ;;; @@ -315,26 +336,6 @@ If it is down, start it up (again)." (when func (funcall func date (nth 1 gnus-command-method))))) -(defun gnus-server-opened (gnus-command-method) - "Check whether a connection to GNUS-COMMAND-METHOD has been opened." - (unless (eq (gnus-server-status gnus-command-method) - 'denied) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (inline (gnus-get-function gnus-command-method 'server-opened)) - (nth 1 gnus-command-method)))) - -(defun gnus-status-message (gnus-command-method) - "Return the status message from GNUS-COMMAND-METHOD. -If GNUS-COMMAND-METHOD is a string, it is interpreted as a group -name. The method this group uses will be queried." - (let ((gnus-command-method - (if (stringp gnus-command-method) - (gnus-find-method-for-group gnus-command-method) - gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'status-message) - (nth 1 gnus-command-method)))) - (defun gnus-request-regenerate (gnus-command-method) "Request a data generation from GNUS-COMMAND-METHOD." (when (stringp gnus-command-method) From 39c7e99daeb94a360f551f9c3b9d8372e71ea459 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:45:43 +0000 Subject: [PATCH 118/172] Add declare-function compatibility definition. (nnkiboze-score-file): Declare as a function. --- lisp/gnus/gnus-group.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el index 5843214e48a..73d632591b5 100644 --- a/lisp/gnus/gnus-group.el +++ b/lisp/gnus/gnus-group.el @@ -27,6 +27,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (defvar tool-bar-mode) @@ -3004,6 +3008,8 @@ mail messages or news articles in files that have numeric names." (list 'nndir (gnus-group-real-name group) (list 'nndir-directory dir))))) (defvar nnkiboze-score-file) +(declare-function nnkiboze-score-file "nnkiboze" (group)) + (defun gnus-group-make-kiboze-group (group address scores) "Create an nnkiboze group. The user will be prompted for a name, a regexp to match groups, and From 25fcd06c74258a8cca74ab23ab7caa2886df0fc1 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:46:37 +0000 Subject: [PATCH 119/172] Add declare-function compatibility definition. (message-goto-eoh): Autoload. (article-narrow-to-head, gnus-article-goto-header) (gnus-add-image, gnus-add-wash-type): Declare as functions. (gnus-display-x-face-in-from): Require gnus-art. --- lisp/gnus/gnus-fun.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lisp/gnus/gnus-fun.el b/lisp/gnus/gnus-fun.el index 05454960e38..e9c6d9fd816 100644 --- a/lisp/gnus/gnus-fun.el +++ b/lisp/gnus/gnus-fun.el @@ -26,6 +26,10 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) @@ -105,6 +109,8 @@ Output to the current buffer, replace text, and don't mingle error." (format gnus-convert-pbm-to-x-face-command (shell-quote-argument file))))))) +(autoload 'message-goto-eoh "message" nil t) + ;;;###autoload (defun gnus-insert-random-x-face-header () "Insert a random X-Face header from `gnus-x-face-directory'." @@ -203,8 +209,14 @@ The colors from this face are used as the foreground and background colors of the displayed X-Faces." :group 'gnus-article-headers) +(declare-function article-narrow-to-head "gnus-art" ()) +(declare-function gnus-article-goto-header "gnus-art" (header)) +(declare-function gnus-add-image "gnus-art" (category image)) +(declare-function gnus-add-wash-type "gnus-art" (type)) + (defun gnus-display-x-face-in-from (data) "Display the X-Face DATA in the From header." + (require 'gnus-art) (let ((default-enable-multibyte-characters nil) pbm) (when (or (gnus-image-type-available-p 'xface) From db48b1977afad305856f681b744ec5eac5b30438 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:46:54 +0000 Subject: [PATCH 120/172] (gnus-alive-p): Autoload. --- lisp/gnus/gnus-ems.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/gnus/gnus-ems.el b/lisp/gnus/gnus-ems.el index 79e513b5f05..a49d46a94d6 100644 --- a/lisp/gnus/gnus-ems.el +++ b/lisp/gnus/gnus-ems.el @@ -161,6 +161,8 @@ "Non-nil means the mark and region are currently active in this buffer." mark-active) ; aliased to region-exists-p in XEmacs. +(autoload 'gnus-alive-p "gnus-util") + (defun gnus-x-splash () "Show a splash screen using a pixmap in the current buffer." (interactive) From cef98b1310b1feb4201618067d7fcae4bc04923f Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:48:08 +0000 Subject: [PATCH 121/172] Add declare-function compatibility definition. Require gnus-sum not just when compiling. (nnvirtual-find-group-art): Declare as a function. --- lisp/gnus/ChangeLog | 71 +++++++++++++++++++++++++++++++++++++++++ lisp/gnus/gnus-cache.el | 11 +++++-- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 4bddd344115..a09d3da95c0 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,74 @@ +2007-12-11 Glenn Morris <rgm@gnu.org> + + * gnus-cache.el: Require gnus-sum not just when compiling. + + * gnus-fun.el (gnus-display-x-face-in-from): Require gnus-art. + + * gnus-int.el (gnus-server-opened, gnus-status-message): Move + definitions before use. + + * mm-decode.el: Require gnus-util. + (mm-remove-part): Only call delete-annotation on XEmacs. + + * mm-uu.el (gnus-original-article-buffer): Define for compiler. + + * nnmail.el: Require gnus-int. + + * spam.el: Move `require's before `eval-when-compile's. + + * gnus-ems.el (gnus-alive-p): + * gnus-fun.el (message-goto-eoh): + * mail-source.el (gnus-compress-sequence): + * message.el (Info-goto-node, format-spec): + * mm-bodies.el (message-options-get): + * mm-decode.el (mm-view-pkcs7): + * mm-util.el (gmm-write-region): + * mml-smime.el (mml-compute-boundary) + (gnus-completing-read-with-default): + * mml.el (widget-button-press, gnus-make-hashtable): + * mml1991.el (mm-decode-content-transfer-encoding) + (mm-encode-content-transfer-encoding) + (message-options-get, message-options-set): + * mml2015.el (gnus-buffer-live-p, gnus-get-buffer-create): + * nnfolder.el (gnus-request-group): + * nnheader.el (ietf-drums-unfold-fws): + * rfc1843.el (mail-header-parse-content-type, message-narrow-to-head): + * smime.el (gnus-run-mode-hooks): + * spam-stat.el (gnus-message): Autoload. + + * gnus-cache.el, gnus-fun.el, gnus-group.el, gnus.el, mail-source.el: + * mm-bodies.el, mm-decode.el, mm-extern.el, mm-util.el: + * mml-smime.el, mml.el, mml1991.el, mml2015.el, nndb.el, nnfolder.el: + * nnmail.el, nnmaildir.el, nnrss.el, rfc1843.el, spam.el: + Add declare-function compatibility definition. + + * gnus-cache.el (nnvirtual-find-group-art): + * gnus-fun.el (article-narrow-to-head, gnus-article-goto-header) + (gnus-add-image, gnus-add-wash-type): + * gnus-group.el (nnkiboze-score-file): + * gnus-sum.el (turn-on-gnus-mailing-list-mode) + (gnus-cache-write-active, mm-uu-dissect, idna-to-unicode): + * gnus.el (gnus-group-decoded-name): + * mail-source.el (imap-capability): + * mm-bodies.el (message-options-set): + * mm-decode.el (gnus-configure-windows): + * mm-extern.el (message-goto-body): + * mm-util.el (mm-delete-duplicates, mm-detect-coding-region): + * mml-smime.el (epg-key-sub-key-list, epg-sub-key-capability) + (epg-sub-key-validity, message-options-set): + * mml.el (widget-event-point, gnus-configure-windows): + * mml1991.el (mc-encrypt-generic, gpg-sign-encrypt, gpg-encrypt): + * mml2015.el (epg-check-configuration, epg-configuration) + (message-options-set): + * nndb.el (nndb-request-article): + * nnfolder.el (gnus-request-create-group): + * nnmail.el (gnus-activate-group, gnus-group-mark-article-read): + * nnmaildir.el (gnus-group-mark-article-read): + * nnrss.el (w3-parse-buffer, gnus-group-make-rss-group): + * rfc1843.el (message-fetch-field): + * spam.el (gnus-extract-address-components): + Declare as functions. + 2007-12-09 Glenn Morris <rgm@gnu.org> * gnus-uu.el (gnus-uu-yenc-article): Use insert-buffer-substring. diff --git a/lisp/gnus/gnus-cache.el b/lisp/gnus/gnus-cache.el index 4f61a0f2759..72c88600a5e 100644 --- a/lisp/gnus/gnus-cache.el +++ b/lisp/gnus/gnus-cache.el @@ -27,13 +27,18 @@ ;;; Code: +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'gnus) +(require 'gnus-sum) + (eval-when-compile (unless (fboundp 'gnus-agent-load-alist) - (defun gnus-agent-load-alist (group))) - (require 'gnus-sum)) + (defun gnus-agent-load-alist (group)))) (defcustom gnus-cache-active-file (expand-file-name "active" gnus-cache-directory) @@ -91,6 +96,8 @@ it's not cached." (defvar gnus-cache-active-altered nil) (defvar gnus-cache-total-fetched-hashtb nil) +(declare-function nnvirtual-find-group-art "nnvirtual" (group article)) + (eval-and-compile (autoload 'nnml-generate-nov-databases-directory "nnml") (autoload 'nnvirtual-find-group-art "nnvirtual")) From 4577244fc903ff0344abd1f9cf3d75e50b4fa953 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:48:25 +0000 Subject: [PATCH 122/172] (url-configuration-directory): Make it a defcustom. --- lisp/url/url.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lisp/url/url.el b/lisp/url/url.el index c375a75e06f..448b31f4b68 100644 --- a/lisp/url/url.el +++ b/lisp/url/url.el @@ -46,13 +46,16 @@ (require 'url-parse) (require 'url-util) -;; Fixme: customize? convert-standard-filename? -(defvar url-configuration-directory - (cond - ((file-directory-p "~/.url") "~/.url") - ((file-directory-p user-emacs-directory) - (concat user-emacs-directory "url")) - (t "~/.url"))) + +;; FIXME convert-standard-filename? +(defcustom url-configuration-directory + (if (and (file-directory-p user-emacs-directory) + (not (file-directory-p "~/.url"))) + (expand-file-name "url" user-emacs-directory) + "~/.url") + "Directory used by the URL package for cookies, history, etc." + :type 'directory + :group 'url) (defun url-do-setup () "Setup the url package. From 8703ea5358af50c74f3958cc699707731b253ecc Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:48:40 +0000 Subject: [PATCH 123/172] (url-make-private-file): New function. --- lisp/url/url-util.el | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el index 119f40b4da4..865c3981ec1 100644 --- a/lisp/url/url-util.el +++ b/lisp/url/url-util.el @@ -523,6 +523,28 @@ Has a preference for looking backward when not directly on a symbol." (set (make-local-variable 'url-current-mime-headers) (mail-header-extract))))) +(defun url-make-private-file (file) + "Make FILE only readable and writable by the current user. +Creates FILE and its parent directories if they do not exist." + (let ((dir (file-name-directory file))) + (when dir + ;; For historical reasons. + (make-directory dir t))) + ;; Based on doc-view-make-safe-dir. + (condition-case nil + (let ((umask (default-file-modes))) + (unwind-protect + (progn + (set-default-file-modes #o0600) + (with-temp-buffer + (write-region (point-min) (point-max) + file nil 'silent nil 'excl))) + (set-default-file-modes umask))) + (file-already-exists + (if (file-symlink-p file) + (error "Danger: `%s' is a symbolic link" file)) + (set-file-modes file #o0600)))) + (provide 'url-util) ;; arch-tag: 24352abc-5a5a-412e-90cd-313b26bed5c9 From 4e44324af220f05b922fcabed7142b0601949f02 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:49:10 +0000 Subject: [PATCH 124/172] (url-cookie-write-file): Use url-make-private-file and with-temp-buffer. --- lisp/url/url-cookie.el | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/lisp/url/url-cookie.el b/lisp/url/url-cookie.el index bc0fea4de44..40791d29fb6 100644 --- a/lisp/url/url-cookie.el +++ b/lisp/url/url-cookie.el @@ -119,19 +119,17 @@ telling Microsoft that." (set var new))) (defun url-cookie-write-file (&optional fname) - (setq fname (or fname url-cookie-file)) - (unless (file-directory-p (file-name-directory fname)) - (ignore-errors (make-directory (file-name-directory fname)))) - (cond - ((not url-cookies-changed-since-last-save) nil) - ((not (file-writable-p fname)) - (message "Cookies file %s (see variable `url-cookie-file') is unwritable." fname)) - (t + (when url-cookies-changed-since-last-save + (or fname (setq fname (expand-file-name url-cookie-file))) + (if (condition-case nil + (progn + (url-make-private-file fname) + nil) + (error t)) + (message "Error accessing cookie file `%s'" fname) (url-cookie-clean-up) (url-cookie-clean-up t) - (with-current-buffer (get-buffer-create " *cookies*") - (erase-buffer) - (fundamental-mode) + (with-temp-buffer (insert ";; Emacs-W3 HTTP cookies file\n" ";; Automatically generated file!!! DO NOT EDIT!!!\n\n" "(setq url-cookie-storage\n '") @@ -144,9 +142,8 @@ telling Microsoft that." ";; no-byte-compile: t\n" ";; End:\n") (set (make-local-variable 'version-control) 'never) - (write-file fname) - (setq url-cookies-changed-since-last-save nil) - (kill-buffer (current-buffer)))))) + (write-file fname)) + (setq url-cookies-changed-since-last-save nil)))) (defun url-cookie-store (name value &optional expires domain localpart secure) "Store a netscape-style cookie." From 9824ded5dded6f1d25ba7c71d959d56ac2f10e7e Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:49:36 +0000 Subject: [PATCH 125/172] (url-history-save-history): Use url-make-private-file and with-temp-buffer. --- lisp/url/ChangeLog | 9 +++++++++ lisp/url/url-history.el | 38 ++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog index 9d86733ab98..a1b86af13ae 100644 --- a/lisp/url/ChangeLog +++ b/lisp/url/ChangeLog @@ -1,3 +1,12 @@ +2007-12-11 Glenn Morris <rgm@gnu.org> + + * url.el (url-configuration-directory): Make it a defcustom. + + * url-util.el (url-make-private-file): New function. + * url-cookie.el (url-cookie-write-file): + * url-history.el (url-history-save-history): + Use url-make-private-file and with-temp-buffer. + 2007-12-06 Glenn Morris <rgm@gnu.org> * url-file.el, url-mailto.el: Remove directory part from filenames diff --git a/lisp/url/url-history.el b/lisp/url/url-history.el index 605ffa0145f..bf4acf5d046 100644 --- a/lisp/url/url-history.el +++ b/lisp/url/url-history.el @@ -112,29 +112,28 @@ to run the `url-history-setup-save-timer' function manually." (puthash (if (vectorp url) (url-recreate-url url) url) time url-history-hash-table)) +(autoload 'url-make-private-file "url-util") + (defun url-history-save-history (&optional fname) "Write the global history file into `url-history-file'. The type of data written is determined by what is in the file to begin with. If the type of storage cannot be determined, then prompt the user for what type to save as." (interactive) - (or fname (setq fname (expand-file-name url-history-file))) - (unless (file-directory-p (file-name-directory fname)) - (condition-case nil - (make-directory (file-name-directory fname)) - (error nil))) - (cond - ((not url-history-changed-since-last-save) nil) - ((not (file-writable-p fname)) - (message "%s is unwritable." fname)) - (t - (let ((make-backup-files nil) - (version-control nil) - (require-final-newline t)) - (with-current-buffer (get-buffer-create " *url-tmp*") - (erase-buffer) - (let ((count 0)) - (maphash (lambda (key value) + (when url-history-changed-since-last-save + (or fname (setq fname (expand-file-name url-history-file))) + (if (condition-case nil + (progn + (url-make-private-file fname) + nil) + (error t)) + (message "Error accessing history file `%s'" fname) + (let ((make-backup-files nil) + (version-control nil) + (require-final-newline t) + (count 0)) + (with-temp-buffer + (maphash (lambda (key value) (while (string-match "[\r\n]+" key) (setq key (concat (substring key 0 (match-beginning 0)) (substring key (match-end 0) nil)))) @@ -153,9 +152,8 @@ user for what type to save as." ;; (/ count 4))) ;; (goto-char (point-max)) (insert "\n") - (write-file fname)) - (kill-buffer (current-buffer)))))) - (setq url-history-changed-since-last-save nil)) + (write-file fname))) + (setq url-history-changed-since-last-save nil)))) (defun url-have-visited-url (url) (url-do-setup) From e6ed4935020f267cb05f065224eba69cb817c829 Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:49:53 +0000 Subject: [PATCH 126/172] (url-cookie-write-file): Use url-make-private-file and with-temp-buffer. --- lisp/url/url-cookie.el | 53 ++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/lisp/url/url-cookie.el b/lisp/url/url-cookie.el index cdca65104ad..eea34042970 100644 --- a/lisp/url/url-cookie.el +++ b/lisp/url/url-cookie.el @@ -148,34 +148,31 @@ telling Microsoft that." (set var new))) (defun url-cookie-write-file (&optional fname) - (setq fname (or fname url-cookie-file)) - (unless (file-directory-p (file-name-directory fname)) - (ignore-errors (make-directory (file-name-directory fname)))) - (cond - ((not url-cookies-changed-since-last-save) nil) - ((not (file-writable-p fname)) - (message "Cookies file %s (see variable `url-cookie-file') is unwritable." fname)) - (t - (url-cookie-clean-up) - (url-cookie-clean-up t) - (with-current-buffer (get-buffer-create " *cookies*") - (erase-buffer) - (fundamental-mode) - (insert ";; Emacs-W3 HTTP cookies file\n" - ";; Automatically generated file!!! DO NOT EDIT!!!\n\n" - "(setq url-cookie-storage\n '") - (pp url-cookie-storage (current-buffer)) - (insert ")\n(setq url-cookie-secure-storage\n '") - (pp url-cookie-secure-storage (current-buffer)) - (insert ")\n") - (insert " \n;; Local Variables:\n" - ";; version-control: never\n" - ";; no-byte-compile: t\n" - ";; End:\n") - (set (make-local-variable 'version-control) 'never) - (write-file fname) - (setq url-cookies-changed-since-last-save nil) - (kill-buffer (current-buffer)))))) + (when url-cookies-changed-since-last-save + (or fname (setq fname (expand-file-name url-cookie-file))) + (if (condition-case nil + (progn + (url-make-private-file fname) + nil) + (error t)) + (message "Error accessing cookie file `%s'" fname) + (url-cookie-clean-up) + (url-cookie-clean-up t) + (with-temp-buffer + (insert ";; Emacs-W3 HTTP cookies file\n" + ";; Automatically generated file!!! DO NOT EDIT!!!\n\n" + "(setq url-cookie-storage\n '") + (pp url-cookie-storage (current-buffer)) + (insert ")\n(setq url-cookie-secure-storage\n '") + (pp url-cookie-secure-storage (current-buffer)) + (insert ")\n") + (insert " \n;; Local Variables:\n" + ";; version-control: never\n" + ";; no-byte-compile: t\n" + ";; End:\n") + (set (make-local-variable 'version-control) 'never) + (write-file fname)) + (setq url-cookies-changed-since-last-save nil)))) (defun url-cookie-store (name value &optional expires domain localpart secure) "Store a netscape-style cookie." From 57f44ca44a21b5030a29860918b26fad5297e55b Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:50:11 +0000 Subject: [PATCH 127/172] (url-history-save-history): Use url-make-private-file and with-temp-buffer. --- lisp/url/url-history.el | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/lisp/url/url-history.el b/lisp/url/url-history.el index 1ed3c71174e..f47336d9b9e 100644 --- a/lisp/url/url-history.el +++ b/lisp/url/url-history.el @@ -112,27 +112,28 @@ to run the `url-history-setup-save-timer' function manually." (puthash (if (vectorp url) (url-recreate-url url) url) time url-history-hash-table)) +(autoload 'url-make-private-file "url-util") + (defun url-history-save-history (&optional fname) "Write the global history file into `url-history-file'. The type of data written is determined by what is in the file to begin with. If the type of storage cannot be determined, then prompt the user for what type to save as." (interactive) - (or fname (setq fname (expand-file-name url-history-file))) - (unless (file-directory-p (file-name-directory fname)) - (ignore-errors (make-directory (file-name-directory fname)))) - (cond - ((not url-history-changed-since-last-save) nil) - ((not (file-writable-p fname)) - (message "%s is unwritable." fname)) - (t - (let ((make-backup-files nil) - (version-control nil) - (require-final-newline t)) - (with-current-buffer (get-buffer-create " *url-tmp*") - (erase-buffer) - (let ((count 0)) - (maphash (lambda (key value) + (when url-history-changed-since-last-save + (or fname (setq fname (expand-file-name url-history-file))) + (if (condition-case nil + (progn + (url-make-private-file fname) + nil) + (error t)) + (message "Error accessing history file `%s'" fname) + (let ((make-backup-files nil) + (version-control nil) + (require-final-newline t) + (count 0)) + (with-temp-buffer + (maphash (lambda (key value) (while (string-match "[\r\n]+" key) (setq key (concat (substring key 0 (match-beginning 0)) (substring key (match-end 0) nil)))) @@ -145,15 +146,14 @@ user for what type to save as." ;; We used to add this in the file, but it just makes the code ;; more complex with no benefit. Worse: it makes it harder to ;; preserve preexisting history when loading the history file. - ;; (goto-char (point-min)) - ;; (insert (format - ;; "(setq url-history-hash-table (make-hash-table :size %d :test 'equal))\n" - ;; (/ count 4))) - ;; (goto-char (point-max)) - (insert "\n") - (write-file fname)) - (kill-buffer (current-buffer)))))) - (setq url-history-changed-since-last-save nil)) + ;; (goto-char (point-min)) + ;; (insert (format + ;; "(setq url-history-hash-table (make-hash-table :size %d :test 'equal))\n" + ;; (/ count 4))) + ;; (goto-char (point-max)) + (insert "\n") + (write-file fname))) + (setq url-history-changed-since-last-save nil)))) (defun url-have-visited-url (url) (url-do-setup) From 812498713a4bc715d7aaffb4f68382b73fb83ede Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:50:37 +0000 Subject: [PATCH 128/172] (url-make-private-file): New function. --- lisp/url/ChangeLog | 7 +++++++ lisp/url/url-util.el | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog index 7016382f71e..aadd79ccc02 100644 --- a/lisp/url/ChangeLog +++ b/lisp/url/ChangeLog @@ -1,3 +1,10 @@ +2007-12-11 Glenn Morris <rgm@gnu.org> + + * url-util.el (url-make-private-file): New function. + * url-cookie.el (url-cookie-write-file): + * url-history.el (url-history-save-history): + Use url-make-private-file and with-temp-buffer. + 2007-12-02 Glenn Morris <rgm@gnu.org> * url-news.el (nntp-open-tls-stream, nntp-open-ssl-stream): diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el index d7d8e2b4a4b..4f5b4b8cd17 100644 --- a/lisp/url/url-util.el +++ b/lisp/url/url-util.el @@ -523,6 +523,28 @@ Has a preference for looking backward when not directly on a symbol." (set (make-local-variable 'url-current-mime-headers) (mail-header-extract))))) +(defun url-make-private-file (file) + "Make FILE only readable and writable by the current user. +Creates FILE and its parent directories if they do not exist." + (let ((dir (file-name-directory file))) + (when dir + ;; For historical reasons. + (make-directory dir t))) + ;; Based on doc-view-make-safe-dir. + (condition-case nil + (let ((umask (default-file-modes))) + (unwind-protect + (progn + (set-default-file-modes #o0600) + (with-temp-buffer + (write-region (point-min) (point-max) + file nil 'silent nil 'excl))) + (set-default-file-modes umask))) + (file-already-exists + (if (file-symlink-p file) + (error "Danger: `%s' is a symbolic link" file)) + (set-file-modes file #o0600)))) + (provide 'url-util) ;; arch-tag: 24352abc-5a5a-412e-90cd-313b26bed5c9 From e49337eabb2f1d16999f9329b287ca43d68c47cf Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:52:07 +0000 Subject: [PATCH 129/172] (check-declare-verify): Handle deffoo. --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/check-declare.el | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d392c85e212..260a6a802a0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2007-12-11 Glenn Morris <rgm@gnu.org> + + * emacs-lisp/check-declare.el (check-declare-verify): Handle deffoo. + 2007-12-11 Jay Belanger <jay.p.belanger@gmail.com> * calc/calc-lang.el (math-lang-name): New property name. diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el index 9fc8a9e61e7..fe7f774c7e9 100644 --- a/lisp/emacs-lisp/check-declare.el +++ b/lisp/emacs-lisp/check-declare.el @@ -34,6 +34,9 @@ ;;; TODO: +;; 1. Warn about functions marked as obsolete, eg +;; password-read-and-add in smime.el. + ;;; Code: (defconst check-declare-warning-buffer "*Check Declarations Warnings*" @@ -141,7 +144,8 @@ is a string giving details of the error." ;; defsubst's don't _have_ to be known at compile time. (setq re (format (if cflag "^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\"" - "^[ \t]*(\\(fset[ \t]+'\\|def\\(?:un\\|subst\\|\ + "^[ \t]*(\\(fset[ \t]+'\\|\ +def\\(?:un\\|subst\\|foo\\|\ ine-\\(?:derived\\|generic\\|\\(?:global\\(?:ized\\)?-\\)?minor\\)-mode\ \\|\\(?:ine-obsolete-function-\\)?alias[ \t]+'\\)\\)\ \[ \t]*%s\\([ \t;]+\\|$\\)") From 0fef26e3c4e48c3a50d708e8ec9ca3dd42c396ef Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 05:54:44 +0000 Subject: [PATCH 130/172] revert-buffer should eliminate overlays and the mark --- etc/TODO | 2 -- 1 file changed, 2 deletions(-) diff --git a/etc/TODO b/etc/TODO index 7d4c5d34980..cfd8dba2ec2 100644 --- a/etc/TODO +++ b/etc/TODO @@ -37,8 +37,6 @@ a window doesn't select it. ** buffer-offer-save should be a permanent local. -** revert-buffer should eliminate overlays and the mark. - ** erase-buffer should perhaps disregard read-only properties of text. ** Make occur correctly handle matches that span more than one line, From 5ec7fe1bff1362d0bb58d0bbc854ca815c1bc81d Mon Sep 17 00:00:00 2001 From: Glenn Morris <rgm@gnu.org> Date: Tue, 11 Dec 2007 08:28:49 +0000 Subject: [PATCH 131/172] (gnus-group-name-decode): Autoload. (gnus-find-method-for-group, gnus-group-name-charset) (message-tokenize-header, gnus-get-buffer-create) (mm-enable-multibyte, gnus-put-text-property, gnus-overlay-put) (gnus-make-overlay, mm-disable-multibyte, gnus-add-text-properties): Declare as functions. --- lisp/gnus/ChangeLog | 5 +++++ lisp/gnus/gnus-util.el | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index a09d3da95c0..cda28979cb1 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -18,6 +18,7 @@ * gnus-ems.el (gnus-alive-p): * gnus-fun.el (message-goto-eoh): + * gnus-util.el (gnus-group-name-decode): * mail-source.el (gnus-compress-sequence): * message.el (Info-goto-node, format-spec): * mm-bodies.el (message-options-get): @@ -48,6 +49,10 @@ * gnus-group.el (nnkiboze-score-file): * gnus-sum.el (turn-on-gnus-mailing-list-mode) (gnus-cache-write-active, mm-uu-dissect, idna-to-unicode): + * gnus-util.el (gnus-find-method-for-group, gnus-group-name-charset) + (message-tokenize-header, gnus-get-buffer-create) + (mm-enable-multibyte, gnus-put-text-property, gnus-overlay-put) + (gnus-make-overlay, mm-disable-multibyte, gnus-add-text-properties): * gnus.el (gnus-group-decoded-name): * mail-source.el (imap-capability): * mm-bodies.el (message-options-set): diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 8a6e8fa71cb..7b36c07da62 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -217,6 +217,13 @@ is slower." (search-forward ":" eol t) (point))))) +(declare-function gnus-find-method-for-group "gnus" (group &optional info)) +(autoload 'gnus-group-name-decode "gnus-group") +(declare-function gnus-group-name-charset "gnus-group" (method group)) +;; gnus-group requires gnus-int which requires message. +(declare-function message-tokenize-header "message" + (header &optional separator)) + (defun gnus-decode-newsgroups (newsgroups group &optional method) (let ((method (or method (gnus-find-method-for-group group)))) (mapconcat (lambda (group) @@ -657,6 +664,10 @@ If N, return the Nth ancestor instead." (defvar gnus-work-buffer " *gnus work*") +(declare-function gnus-get-buffer-create "gnus" (name)) +;; gnus.el requires mm-util. +(declare-function mm-enable-multibyte "mm-util") + (defun gnus-set-work-buffer () "Put point in the empty Gnus work buffer." (if (get-buffer gnus-work-buffer) @@ -841,6 +852,9 @@ If there's no subdirectory, delete DIRECTORY as well." (setq string (replace-match "" t t string))) string) +(declare-function gnus-put-text-property "gnus" + (start end property value &optional object)) + (defsubst gnus-put-text-property-excluding-newlines (beg end prop val) "The same as `put-text-property', but don't put this prop on any newlines in the region." (save-match-data @@ -852,6 +866,10 @@ If there's no subdirectory, delete DIRECTORY as well." (setq beg (point))) (gnus-put-text-property beg (point) prop val))))) +(declare-function gnus-overlay-put "gnus" (overlay prop value)) +(declare-function gnus-make-overlay "gnus" + (beg end &optional buffer front-advance rear-advance)) + (defsubst gnus-put-overlay-excluding-newlines (beg end prop val) "The same as `put-text-property', but don't put this prop on any newlines in the region." (save-match-data @@ -1205,6 +1223,9 @@ Return the modified alist." (throw 'found nil))) t)) +;; gnus.el requires mm-util. +(declare-function mm-disable-multibyte "mm-util") + (defun gnus-write-active-file (file hashtb &optional full-names) ;; `coding-system-for-write' should be `raw-text' or equivalent. (let ((coding-system-for-write nnmail-active-file-coding-system)) @@ -1272,6 +1293,9 @@ Return the modified alist." (pop l2)) l1)))) +(declare-function gnus-add-text-properties "gnus" + (start end properties &optional object)) + (defun gnus-add-text-properties-when (property value start end properties &optional object) "Like `gnus-add-text-properties', only applied on where PROPERTY is VALUE." From c7d97628b0b89069ae740bf0955d1bdb595e1a09 Mon Sep 17 00:00:00 2001 From: Juri Linkov <juri@jurta.org> Date: Wed, 12 Dec 2007 00:10:37 +0000 Subject: [PATCH 132/172] (Frename_buffer): In interactive spec replace `read-buffer' with `read-string' that uses `buffer-name-history' as history, and the current buffer's name as default. --- src/ChangeLog | 6 ++++++ src/buffer.c | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 86bfa0ab211..babf84e1e85 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2007-12-12 Juri Linkov <juri@jurta.org> + + * buffer.c (Frename_buffer): In interactive spec replace + `read-buffer' with `read-string' that uses `buffer-name-history' + as history, and the current buffer's name as default. + 2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> * keyboard.c (Fcommand_execute): Call Qcall_interactively instead of diff --git a/src/buffer.c b/src/buffer.c index 44c449767c3..58e2bd9e4cd 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1187,8 +1187,9 @@ buffer as BUFFER. */) } DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, - "(list (read-buffer \"Rename buffer (to new name): \" \ - (current-buffer)) current-prefix-arg)", + "(list (read-string \"Rename buffer (to new name): \" \ + nil 'buffer-name-history (buffer-name (current-buffer))) \ + current-prefix-arg)", doc: /* Change current buffer's name to NEWNAME (a string). If second arg UNIQUE is nil or omitted, it is an error if a buffer named NEWNAME already exists. From 2a29c40930f8585f3bf6b19e85eb6703dcc38ae5 Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Wed, 12 Dec 2007 01:18:26 +0000 Subject: [PATCH 133/172] return back entry: revert-buffer should eliminate overlays and the mark --- etc/TODO | 2 ++ lisp/ChangeLog | 4 ---- lisp/files.el | 16 +++++----------- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/etc/TODO b/etc/TODO index cfd8dba2ec2..7d4c5d34980 100644 --- a/etc/TODO +++ b/etc/TODO @@ -37,6 +37,8 @@ a window doesn't select it. ** buffer-offer-save should be a permanent local. +** revert-buffer should eliminate overlays and the mark. + ** erase-buffer should perhaps disregard read-only properties of text. ** Make occur correctly handle matches that span more than one line, diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 260a6a802a0..12cbb15eacc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -9,10 +9,6 @@ * calc/calc.el (calc-set-mode-line): Use `math-lang-name' to set language name. -2007-12-10 Yoni Rabkin Katzenell <yoni-r@actcom.com> (tiny change) - - * file.el (revert-buffer): Eliminate overlays and the mark. - 2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> * server.el (server-select-display): Fix important typo. diff --git a/lisp/files.el b/lisp/files.el index e6f957f480f..8d5fcfda8c2 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4204,12 +4204,10 @@ This undoes all changes since the file was visited or saved. With a prefix argument, offer to revert from latest auto-save file, if that is more recent than the visited file. -This command also implements an interface for special buffers -that contain text which doesn't come from a file, but reflects -some other data instead (e.g. Dired buffers, `buffer-list' -buffers). This is done via the variable -`revert-buffer-function'. In these cases, it should reconstruct -the buffer contents from the appropriate data. +This command also works for special buffers that contain text which +doesn't come from a file, but reflects some other data base instead: +for example, Dired buffers and `buffer-list' buffers. In these cases, +it reconstructs the buffer contents from the appropriate data base. When called from Lisp, the first argument is IGNORE-AUTO; only offer to revert from the auto-save file when this is nil. Note that the @@ -4325,11 +4323,7 @@ non-nil, it is called instead of rereading visited file contents." (insert-file-contents file-name (not auto-save-p) nil nil t)) (insert-file-contents file-name (not auto-save-p) - nil nil t)) - ;; Reset the mark and remove all overlays. - (setq mark-active nil - mark-ring nil) - (remove-overlays)))) + nil nil t))))) ;; Recompute the truename in case changes in symlinks ;; have changed the truename. (setq buffer-file-truename From 57f8977d5cc4d63494061f2ec2e1ab225ab46519 Mon Sep 17 00:00:00 2001 From: Jay Belanger <jay.p.belanger@gmail.com> Date: Wed, 12 Dec 2007 04:55:20 +0000 Subject: [PATCH 134/172] (math-restore-underscores, math-string-restore-underscores): New functions. (math-read-factor): Properly check variable names with underscores for entries in `math-expr-variable-mapping'. --- lisp/ChangeLog | 5 +++++ lisp/calc/calc-aent.el | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 12cbb15eacc..59b0854751b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -4,6 +4,11 @@ 2007-12-11 Jay Belanger <jay.p.belanger@gmail.com> + * calc/calc-aent.el (math-restore-underscores) + (math-string-restore-underscores): New functions. + (math-read-factor): Properly check variable names with underscores + for entries in `math-expr-variable-mapping'. + * calc/calc-lang.el (math-lang-name): New property name. * calc/calc.el (calc-set-mode-line): Use `math-lang-name' diff --git a/lisp/calc/calc-aent.el b/lisp/calc/calc-aent.el index 697d510ac02..ee9c6e61e4c 100644 --- a/lisp/calc/calc-aent.el +++ b/lisp/calc/calc-aent.el @@ -1015,6 +1015,19 @@ in Calc algebraic input.") (concat (math-match-substring x 1) "-" (math-match-substring x 2))) x)) +(defun math-restore-underscores (x) + "Replace pound signs by underscores in the symbol x. +If the current Calc language does not allow underscores, return nil." + (if (memq calc-language calc-lang-allow-underscores) + (intern-soft (math-string-restore-underscores (symbol-name x))))) + +(defun math-string-restore-underscores (x) + "Replace pound signs by underscores in the string x." + (if (string-match "\\`\\(.*\\)#\\(.*\\)\\'" x) + (math-string-restore-underscores + (concat (math-match-substring x 1) "_" (math-match-substring x 2))) + x)) + (defun math-read-if (cond op) (let ((then (math-read-expr-level 0))) (or (equal math-expr-data ":") @@ -1116,7 +1129,10 @@ in Calc algebraic input.") sym (intern (concat "var-" (symbol-name sym))))))) - (let ((v (assq (nth 1 val) math-expr-variable-mapping))) + (let ((v (or + (assq (nth 1 val) math-expr-variable-mapping) + (assq (math-restore-underscores (nth 1 val)) + math-expr-variable-mapping)))) (and v (setq val (if (consp (cdr v)) (funcall (car (cdr v)) v val) (list 'var From 045744c697ed42220ad34e9219604f3474e40dc3 Mon Sep 17 00:00:00 2001 From: Martin Rudalics <rudalics@gmx.at> Date: Wed, 12 Dec 2007 07:37:57 +0000 Subject: [PATCH 135/172] *** empty log message *** --- etc/TODO | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/etc/TODO b/etc/TODO index 7d4c5d34980..2ebbc464434 100644 --- a/etc/TODO +++ b/etc/TODO @@ -25,10 +25,6 @@ I.e. mouse-set-font should use customize-face. ** Compute the list of active keymaps *after* reading the first event. -** mouse-autoselect-window should wait to select the window until -the mouse is put to rest or after a delay or both, so that moving over -a window doesn't select it. - ** Distribute a bar cursor of width > 1 evenly between the two glyphs on each side of the bar (what to do at the edges?). @@ -38,6 +34,8 @@ a window doesn't select it. ** buffer-offer-save should be a permanent local. ** revert-buffer should eliminate overlays and the mark. + For related problems consult the thread starting with + http://lists.gnu.org/archive/html/emacs-devel/2005-11/msg01346.html ** erase-buffer should perhaps disregard read-only properties of text. @@ -570,7 +568,7 @@ but which can also be used as a modifier). a derived mode of sendmail.el. Or arrange for messages.el to be split into a small core and "the rest" so that we use less resources as long as we stick to the features provided in sendmail.el. - + ** Replace gmalloc.c with the modified Doug Lea code from the current GNU libc so that the special mmapping of buffers can be removed -- that apparently loses under Solaris, at least. [fx has mostly done From f26920db7ebc9d4b3e3b1ae50ebaf6936b1d0f94 Mon Sep 17 00:00:00 2001 From: Thien-Thi Nguyen <ttn@gnuvola.org> Date: Wed, 12 Dec 2007 08:00:45 +0000 Subject: [PATCH 136/172] (defcustom-c-stylevar): Rewrite. --- lisp/progmodes/cc-vars.el | 59 +++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index 76b0e5a898c..291f8b584ce 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el @@ -156,34 +156,45 @@ Useful as last item in a `choice' widget." (setq c-fallback-style (cons (cons name val) c-fallback-style))) (defmacro defcustom-c-stylevar (name val doc &rest args) - "Defines a style variable." - `(let ((-value- ,val)) - (c-set-stylevar-fallback ',name -value-) - (custom-declare-variable - ',name ''set-from-style - ,(concat doc " + "Define a style variable NAME with VAL and DOC. +More precisely, convert the given `:type FOO', mined out of ARGS, +to an aggregate `:type (radio STYLE (PREAMBLE FOO))', append some +some boilerplate documentation to DOC, arrange for the fallback +value of NAME to be VAL, and call `custom-declare-variable' to +do the rest of the work. + +STYLE stands for the choice where the value is taken from some +style setting. PREAMBLE is optionally prepended to FOO; that is, +if FOO contains :tag or :value, the respective two-element list +component is ignored." + (declare (debug (symbolp form stringp &rest))) + (let* ((expanded-doc (concat doc " This is a style variable. Apart from the valid values described -above, it can be set to the symbol `set-from-style'. In that case, it -takes its value from the style system (see `c-default-style' and +above, it can be set to the symbol `set-from-style'. In that case, +it takes its value from the style system (see `c-default-style' and `c-style-alist') when a CC Mode buffer is initialized. Otherwise, the value set here overrides the style system (there is a variable -`c-old-style-variable-behavior' that changes this, though).") - ,@(plist-put - args ':type - `(` (radio - (const :tag "Use style settings" - set-from-style) - ,(, (let ((type (eval (plist-get args ':type)))) - (unless (consp type) - (setq type (list type))) - (unless (c-safe (plist-get (cdr type) ':value)) - (setcdr type (append '(:value (, -value-)) - (cdr type)))) - (unless (c-safe (plist-get (cdr type) ':tag)) - (setcdr type (append '(:tag "Override style settings") - (cdr type)))) - (bq-process type))))))))) +`c-old-style-variable-behavior' that changes this, though).")) + (typ (eval name (plist-get args :type))) + (type (if (consp typ) typ (list typ))) + (head (car type)) + (tail (cdr type)) + (newt (append (unless (plist-get tail :tag) + '(:tag "Override style settings")) + (unless (plist-get tail :value) + `(:value ,val)) + tail)) + (aggregate `'(radio + (const :tag "Use style settings" set-from-style) + ,(cons head newt)))) + (message "aggregate: %S" aggregate) + `(progn + (c-set-stylevar-fallback ',name ,val) + (custom-declare-variable + ',name ''set-from-style + ,expanded-doc + ,@(plist-put args :type aggregate))))) (defun c-valid-offset (offset) "Return non-nil if OFFSET is a valid offset for a syntactic symbol. From f2f8d5f2d4070b0af5a37c17a7a3b860355d3f58 Mon Sep 17 00:00:00 2001 From: Thien-Thi Nguyen <ttn@gnuvola.org> Date: Wed, 12 Dec 2007 08:14:07 +0000 Subject: [PATCH 137/172] *** empty log message *** --- lisp/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b49ec6d23bd..697fd4d3e31 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2007-12-12 Thien-Thi Nguyen <ttn@gnuvola.org> + + * progmodes/cc-vars.el (defcustom-c-stylevar): Rewrite. + 2007-12-11 Dan Nicolaescu <dann@ics.uci.edu> * progmodes/verilog-mode.el (set-buffer-menubar): Remove unused From 7d2a95143a15e69712313095aa24dd66a3b16f64 Mon Sep 17 00:00:00 2001 From: Thien-Thi Nguyen <ttn@gnuvola.org> Date: Wed, 12 Dec 2007 10:12:51 +0000 Subject: [PATCH 138/172] Fix typo. --- lisp/progmodes/cc-vars.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index 291f8b584ce..fcfdbc53bb4 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el @@ -176,7 +176,7 @@ it takes its value from the style system (see `c-default-style' and `c-style-alist') when a CC Mode buffer is initialized. Otherwise, the value set here overrides the style system (there is a variable `c-old-style-variable-behavior' that changes this, though).")) - (typ (eval name (plist-get args :type))) + (typ (eval (plist-get args :type))) (type (if (consp typ) typ (list typ))) (head (car type)) (tail (cdr type)) From 0dff8975207307e73ba16f6306ab41016461dc57 Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Wed, 12 Dec 2007 11:25:21 +0000 Subject: [PATCH 139/172] revert-buffer docstring fix --- lisp/ChangeLog | 4 ++++ lisp/files.el | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 59b0854751b..fffb1e03f60 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2007-12-12 Yoni Rabkin Katzenell <yoni-r@actcom.com> (tiny change) + + * files.el (revert-buffer): Docstring fix. + 2007-12-11 Glenn Morris <rgm@gnu.org> * emacs-lisp/check-declare.el (check-declare-verify): Handle deffoo. diff --git a/lisp/files.el b/lisp/files.el index 8d5fcfda8c2..110dbef9289 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4204,10 +4204,12 @@ This undoes all changes since the file was visited or saved. With a prefix argument, offer to revert from latest auto-save file, if that is more recent than the visited file. -This command also works for special buffers that contain text which -doesn't come from a file, but reflects some other data base instead: -for example, Dired buffers and `buffer-list' buffers. In these cases, -it reconstructs the buffer contents from the appropriate data base. +This command also implements an interface for special buffers +that contain text which doesn't come from a file, but reflects +some other data instead (e.g. Dired buffers, `buffer-list' +buffers). This is done via the variable +`revert-buffer-function'. In these cases, it should reconstruct +the buffer contents from the appropriate data. When called from Lisp, the first argument is IGNORE-AUTO; only offer to revert from the auto-save file when this is nil. Note that the From c84b30043d52aa79e665d5968460ff7569af79ed Mon Sep 17 00:00:00 2001 From: Vinicius Jose Latorre <viniciusjl@ig.com.br> Date: Wed, 12 Dec 2007 11:31:52 +0000 Subject: [PATCH 140/172] revert-buffer docstring fix --- lisp/files.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/files.el b/lisp/files.el index 110dbef9289..06e3e319d2d 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4207,8 +4207,8 @@ that is more recent than the visited file. This command also implements an interface for special buffers that contain text which doesn't come from a file, but reflects some other data instead (e.g. Dired buffers, `buffer-list' -buffers). This is done via the variable -`revert-buffer-function'. In these cases, it should reconstruct +buffers). This is done via the variable +`revert-buffer-function'. In these cases, it should reconstruct the buffer contents from the appropriate data. When called from Lisp, the first argument is IGNORE-AUTO; only offer From bf2540370278fcfbe6ac2423650db8fb4e357be7 Mon Sep 17 00:00:00 2001 From: Jason Rumney <jasonr@gnu.org> Date: Thu, 13 Dec 2007 15:53:26 +0000 Subject: [PATCH 141/172] (w32_wnd_proc, Fw32_reconstruct_hot_key): Range check before dereferencing array. (lookup_vk_code): Remove zero comparison. --- src/ChangeLog | 6 ++++++ src/w32fns.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 87f9894f488..7d2240f7829 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2007-12-13 Jason Rumney <jasonr@gnu.org> + + * w32fns.c (w32_wnd_proc, Fw32_reconstruct_hot_key): Range check + before dereferencing array. + (lookup_vk_code): Remove zero comparison. + 2007-12-02 Magnus Henoch <mange@freemail.hu> * process.c (make_process): Initialize pty_flag to 0. diff --git a/src/w32fns.c b/src/w32fns.c index a006531f2b3..9492989e735 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -2956,7 +2956,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam) they don't produce WM_CHAR messages). This ensures that indicator lights are toggled promptly on Windows 9x, for example. */ - if (lispy_function_keys[wParam] != 0) + if (wParam < 256 && lispy_function_keys[wParam]) { windows_translate = 1; goto translate; @@ -3078,7 +3078,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam) break; default: /* If not defined as a function key, change it to a WM_CHAR message. */ - if (lispy_function_keys[wParam] == 0) + if (wParam > 255 || !lispy_function_keys[wParam]) { DWORD modifiers = construct_console_modifiers (); @@ -8129,7 +8129,7 @@ lookup_vk_code (char *key) int i; for (i = 0; i < 256; i++) - if (lispy_function_keys[i] != 0 + if (lispy_function_keys[i] && strcmp (lispy_function_keys[i], key) == 0) return i; @@ -8307,7 +8307,7 @@ usage: (w32-reconstruct-hot-key ID) */) vk_code = HOTKEY_VK_CODE (hotkeyid); w32_modifiers = HOTKEY_MODIFIERS (hotkeyid); - if (lispy_function_keys[vk_code]) + if (vk_code < 256 && lispy_function_keys[vk_code]) key = intern (lispy_function_keys[vk_code]); else key = make_number (vk_code); From 3be92e636993ae5efd9ea7f1524ed9a0e59ddf33 Mon Sep 17 00:00:00 2001 From: Martin Rudalics <rudalics@gmx.at> Date: Fri, 14 Dec 2007 06:51:03 +0000 Subject: [PATCH 142/172] (System Interface): Fix typo. --- doc/lispref/os.texi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi index bff759215da..6c237d83457 100644 --- a/doc/lispref/os.texi +++ b/doc/lispref/os.texi @@ -21,8 +21,8 @@ pertaining to the terminal and the screen. * System Environment:: Distinguish the name and kind of system. * User Identification:: Finding the name and user id of the user. * Time of Day:: Getting the current time. -* Time Conversion:: Converting a time from numeric form - to calendrical data, and vice versa). +* Time Conversion:: Converting a time from numeric form to + calendrical data and vice versa. * Time Parsing:: Converting a time from numeric form to text and vice versa. * Processor Run Time:: Getting the run time used by Emacs. From 27a4f44552df79f12a8bc2840d5e1e0a3aad892b Mon Sep 17 00:00:00 2001 From: Martin Rudalics <rudalics@gmx.at> Date: Fri, 14 Dec 2007 06:58:44 +0000 Subject: [PATCH 143/172] *** empty log message *** --- doc/lispref/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 586f250bd06..14d8190385d 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,7 @@ +2007-12-14 Martin Rudalics <rudalics@gmx.at> + + * os.texi (System Interface): Fix typo. + 2007-12-04 Richard Stallman <rms@gnu.org> * objects.texi (Symbol Type): Fix typo. From e2e3f1d7ee4564a4ac3f3c45045f9671d6ad6e60 Mon Sep 17 00:00:00 2001 From: Martin Rudalics <rudalics@gmx.at> Date: Fri, 14 Dec 2007 07:38:58 +0000 Subject: [PATCH 144/172] (Encoding and I/O): Reword to avoid saying "visit the current buffer". --- doc/lispref/ChangeLog | 3 +++ doc/lispref/nonascii.texi | 18 +++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 14d8190385d..bfeb88f7830 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,5 +1,8 @@ 2007-12-14 Martin Rudalics <rudalics@gmx.at> + * nonascii.texi (Encoding and I/O): Reword to avoid saying + "visit the current buffer". + * os.texi (System Interface): Fix typo. 2007-12-04 Richard Stallman <rms@gnu.org> diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi index 7c504aef2cd..16f70f57b9d 100644 --- a/doc/lispref/nonascii.texi +++ b/doc/lispref/nonascii.texi @@ -727,15 +727,15 @@ operation finishes the job of choosing a coding system. Very often you will want to find out afterwards which coding system was chosen. @defvar buffer-file-coding-system -This buffer-local variable records the coding system that was used to visit -the current buffer. It is used for saving the buffer, and for writing part -of the buffer with @code{write-region}. If the text to be written -cannot be safely encoded using the coding system specified by this -variable, these operations select an alternative encoding by calling -the function @code{select-safe-coding-system} (@pxref{User-Chosen -Coding Systems}). If selecting a different encoding requires to ask -the user to specify a coding system, @code{buffer-file-coding-system} -is updated to the newly selected coding system. +This buffer-local variable records the coding system used for saving the +buffer and for writing part of the buffer with @code{write-region}. If +the text to be written cannot be safely encoded using the coding system +specified by this variable, these operations select an alternative +encoding by calling the function @code{select-safe-coding-system} +(@pxref{User-Chosen Coding Systems}). If selecting a different encoding +requires to ask the user to specify a coding system, +@code{buffer-file-coding-system} is updated to the newly selected coding +system. @code{buffer-file-coding-system} does @emph{not} affect sending text to a subprocess. From 8a8ce986d7b489c672223c6c5fd0190e109ea600 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Fri, 14 Dec 2007 11:56:30 +0000 Subject: [PATCH 145/172] (WINDOWS_NT): Fix incorrect spelling of WINDOWSNT. --- src/dispextern.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dispextern.h b/src/dispextern.h index 8e792a50fb4..9cf666b2fd2 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -2772,7 +2772,7 @@ int draw_window_fringes P_ ((struct window *, int)); int update_window_fringes P_ ((struct window *, int)); void compute_fringe_widths P_ ((struct frame *, int)); -#ifdef WINDOWS_NT +#ifdef WINDOWSNT void w32_init_fringe P_ ((struct redisplay_interface *)); void w32_reset_fringes P_ ((void)); #endif From 2e3566d8b733b5ba810508e5507a131b1bf255b9 Mon Sep 17 00:00:00 2001 From: Jason Rumney <jasonr@gnu.org> Date: Fri, 14 Dec 2007 12:26:31 +0000 Subject: [PATCH 146/172] (w32_read_socket): Use MULTIBYTE_CHAR_KEYSTROKE_EVENT for characters above 127. --- src/ChangeLog | 5 +++ src/w32term.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 7d2240f7829..2bf4e0ed15f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2007-12-14 Jason Rumney <jasonr@gnu.org> + + * w32term.c (w32_read_socket): Use MULTIBYTE_CHAR_KEYSTROKE_EVENT + for characters above 127. + 2007-12-13 Jason Rumney <jasonr@gnu.org> * w32fns.c (w32_wnd_proc, Fw32_reconstruct_hot_key): Range check diff --git a/src/w32term.c b/src/w32term.c index a2d64ba581f..1a76d6bfcca 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -4128,6 +4128,8 @@ x_scroll_bar_clear (f) static int temp_index; static short temp_buffer[100]; +/* Temporarily store lead byte of DBCS input sequences. */ +static char dbcs_lead = 0; /* Read events coming from the W32 shell. This routine is called by the SIGIO handler. @@ -4287,8 +4289,96 @@ w32_read_socket (sd, expected, hold_quit) if (temp_index == sizeof temp_buffer / sizeof (short)) temp_index = 0; temp_buffer[temp_index++] = msg.msg.wParam; - inev.kind = ASCII_KEYSTROKE_EVENT; - inev.code = msg.msg.wParam; + + if (msg.msg.wParam < 128 && !dbcs_lead) + { + inev.kind = ASCII_KEYSTROKE_EVENT; + inev.code = msg.msg.wParam; + } + else if (msg.msg.wParam < 256) + { + wchar_t code; + + inev.kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; + + if (IsDBCSLeadByteEx(CP_ACP, (BYTE) msg.msg.wParam)) + { + dbcs_lead = (char) msg.msg.wParam; + inev.kind = NO_EVENT; + break; + } + else if (dbcs_lead) + { + char dbcs[2]; + dbcs[0] = dbcs_lead; + dbcs[1] = (char) msg.msg.wParam; + dbcs_lead = 0; + if (!MultiByteToWideChar(CP_ACP, 0, dbcs, 2, &code, 1)) + { + /* Garbage */ + DebPrint (("Invalid DBCS sequence: %d %d\n", + dbcs[0], dbcs[1])); + inev.kind = NO_EVENT; + break; + } + } + else + { + char single_byte = (char) msg.msg.wParam; + if (!MultiByteToWideChar(CP_ACP, 0, &single_byte, 1, + &code, 1)) + { + /* What to do with garbage? */ + DebPrint (("Invalid character: %d\n", single_byte)); + inev.kind = NO_EVENT; + break; + } + } + + /* Now process unicode input as per xterm.c */ + if (code < 0x80) + { + inev.kind = ASCII_KEYSTROKE_EVENT; + inev.code = code; + } + else if (code < 0xA0) + inev.code = MAKE_CHAR (CHARSET_8_BIT_CONTROL, code, 0); + else if (code < 0x100) + inev.code = MAKE_CHAR (charset_latin_iso8859_1, code, 0); + else + { + int c1, c2; + int charset_id; + + if (code < 0x2500) + { + charset_id = charset_mule_unicode_0100_24ff; + code -= 0x100; + } + else if (code < 0xE000) + { + charset_id = charset_mule_unicode_2500_33ff; + code -= 0x2500; + } + else + { + charset_id = charset_mule_unicode_e000_ffff; + code -= 0xE000; + } + + c1 = (code / 96) + 32; + c2 = (code % 96) + 32; + inev.code = MAKE_CHAR (charset_id, c1, c2); + } + } + else + { + /* Windows shouldn't generate WM_CHAR events above 0xFF + in non-Unicode message handlers. */ + DebPrint (("Non-byte WM_CHAR: %d\n", msg.msg.wParam)); + inev.kind = NO_EVENT; + break; + } inev.modifiers = msg.dwModifiers; XSETFRAME (inev.frame_or_window, f); inev.timestamp = msg.msg.time; From 077e3aa88abcb13749b1de06409ae77c9c940c4b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Fri, 14 Dec 2007 12:41:12 +0000 Subject: [PATCH 147/172] Add more symbols. --- admin/CPP-DEFINES | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES index 0490d89325e..56693064c98 100644 --- a/admin/CPP-DEFINES +++ b/admin/CPP-DEFINES @@ -8,19 +8,39 @@ MAC_OS8 Compiling for Mac OS version 8. Requires MAC_OS? MAC_OSX Compiling for Mac OS X? Is that also valid for Darwin? MAC_OS_X ?? Apparently only used once in mac.c. CYGWIN Compiling the Cygwin port. -MSDOS Compiling the MSDOS port. -DOS_NT Compiling for either the MSDOS or W32 port. -WINDOWSNT Compiling the W32 port. -WINDOWS_NT ?? Only once in dispextern.h +__CYGWIN__ Ditto +MSDOS Compiling the MS-DOS port. +__MSDOS__ Ditto. +__DJGPP__ Major version number of the DJGPP library for the DOS port. +__DJGPP_MINOR__ Minor version number of the DJGPP library. +__GO32__ Compiling the DOS port with DJGPP v1.x (obsolete). +DOS_NT Compiling for either the MS-DOS or native MS-Windows port. +WINDOWSNT Compiling the native MS-Windows (W32) port. +__MINGW32__ Compiling the W32 port with the MinGW port of GCC. +_MSC_VER Compiling the W32 port with the Microsoft C compiler. ** Distinguishing GUIs ** -HAVE_NTGUI Compile support for the W32 GUI. +HAVE_NTGUI Use the native W32 GUI for windows, frames, menus&scrollbars. HAVE_CARBON Compile support for the Carbon GUI. Requires MAC_OS? HAVE_X11 Compile support for the X11 GUI. +HAVE_X_WINDOWS Compile support for X Window system X11 ?? Makefile.in suggests it's equivalent to HAVE_X11 USE_LUCID Use the Lucid toolkit for menus&scrollbars. Requires HAVE_X11. USE_MOTIF Use the Motif toolkit for menus&scrollbars. Requires HAVE_X11. USE_GTK Use the Gtk toolkit for menus&scrollbars. Requires HAVE_X11. +** Frame types ** + +FRAME_TERMCAP_P A tty (character terminal) frame. +FRAME_X_P A frame on X Window system. +FRAME_MSDOS_P An MS-DOS frame (used only by the DOS port). +FRAME_MAC_P A Mac frame. +FRAME_W32_P A frame using native MS-Windows GUI. +FRAME_WINDOW_P A GUI frame (like X, w32, etc.) + +** Compile-time options ** +REL_ALLOC Compile in the relocatable memory allocator ralloc.c. +SYSTEM_MALLOC Use the system library's malloc. + # arch-tag: bc80061a-1168-4911-9766-46aaf2640250 From eb7c7bf54e9c84a35b76afd013e37f3443971680 Mon Sep 17 00:00:00 2001 From: Michael Albinus <michael.albinus@gmx.de> Date: Fri, 14 Dec 2007 21:49:52 +0000 Subject: [PATCH 148/172] * dbusbind.c (xd_retrieve_value, xd_retrieve_arg) (Fdbus_call_method, Fdbus_send_signal, xd_read_message): Use `unsigned int' instead of `uint'. (xd_read_message, Fdbus_register_signal): Split expressions into multiple lines before operators "&&" and "||", according to the GNU Coding Standards. --- src/ChangeLog | 9 +++++++++ src/dbusbind.c | 30 ++++++++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index babf84e1e85..e9e03c914e1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2007-12-14 Michael Albinus <michael.albinus@gmx.de> + + * dbusbind.c (xd_retrieve_value, xd_retrieve_arg) + (Fdbus_call_method, Fdbus_send_signal, xd_read_message): Use + `unsigned int' instead of `uint'. + (xd_read_message, Fdbus_register_signal): Split expressions into + multiple lines before operators "&&" and "||", according to the + GNU Coding Standards. + 2007-12-12 Juri Linkov <juri@jurta.org> * buffer.c (Frename_buffer): In interactive spec replace diff --git a/src/dbusbind.c b/src/dbusbind.c index 29835772dc5..0ccccc8b22d 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -112,7 +112,7 @@ Lisp_Object Vdbus_debug; message. */ char * xd_retrieve_value (dtype, object) - uint dtype; + unsigned int dtype; Lisp_Object object; { @@ -146,7 +146,7 @@ xd_retrieve_value (dtype, object) partly supported; they result always in a Lisp list. */ Lisp_Object xd_retrieve_arg (dtype, iter) - uint dtype; + unsigned int dtype; DBusMessageIter *iter; { @@ -316,7 +316,7 @@ usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &rest ARGS) */) DBusMessage *reply; DBusMessageIter iter; DBusError derror; - uint dtype; + unsigned int dtype; int i; char *value; @@ -459,7 +459,7 @@ usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */) struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; DBusConnection *connection; DBusMessage *dmessage; - uint dtype; + unsigned int dtype; int i; char *value; @@ -549,7 +549,7 @@ xd_read_message (bus) DBusConnection *connection; DBusMessage *dmessage; DBusMessageIter iter; - uint dtype; + unsigned int dtype; char uname[DBUS_MAXIMUM_NAME_LENGTH]; char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */ char interface[DBUS_MAXIMUM_NAME_LENGTH]; @@ -605,11 +605,13 @@ xd_read_message (bus) { key = XCAR (value); /* key has the structure (SERVICE UNAME PATH HANDLER). */ - if (((uname == NULL) || (NILP (XCAR (XCDR (key)))) || - (strcmp (uname, SDATA (XCAR (XCDR (key)))) == 0)) && - ((path == NULL) || (NILP (XCAR (XCDR (XCDR (key))))) || - (strcmp (path, SDATA (XCAR (XCDR (XCDR (key))))) == 0)) && - (!NILP (XCAR (XCDR (XCDR (XCDR (key))))))) + if (((uname == NULL) + || (NILP (XCAR (XCDR (key)))) + || (strcmp (uname, SDATA (XCAR (XCDR (key)))) == 0)) + && ((path == NULL) + || (NILP (XCAR (XCDR (XCDR (key))))) + || (strcmp (path, SDATA (XCAR (XCDR (XCDR (key))))) == 0)) + && (!NILP (XCAR (XCDR (XCDR (XCDR (key))))))) { EVENT_INIT (event); event.kind = DBUS_EVENT; @@ -710,10 +712,10 @@ SIGNAL and HANDLER must not be nil. Example: will register for the corresponding unique name, if any. Signals are sent always with the unique name as sender. Note: the unique name of "org.freedesktop.DBus" is that string itself. */ - if ((!NILP (service)) && - (strlen (SDATA (service)) > 0) && - (strcmp (SDATA (service), DBUS_SERVICE_DBUS) != 0) && - (strncmp (SDATA (service), ":", 1) != 0)) + if ((!NILP (service)) + && (strlen (SDATA (service)) > 0) + && (strcmp (SDATA (service), DBUS_SERVICE_DBUS) != 0) + && (strncmp (SDATA (service), ":", 1) != 0)) unique_name = call2 (intern ("dbus-get-name-owner"), bus, service); else unique_name = service; From 34fb0fc985bb0f774475787ae21101c32de24ca4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:09:17 +0000 Subject: [PATCH 149/172] *** empty log message *** --- src/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index e9e03c914e1..ea8c01bef59 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -7,6 +7,10 @@ multiple lines before operators "&&" and "||", according to the GNU Coding Standards. +2007-12-14 Eli Zaretskii <eliz@gnu.org> + + * dispextern.h (WINDOWS_NT): Fix incorrect spelling of WINDOWSNT. + 2007-12-12 Juri Linkov <juri@jurta.org> * buffer.c (Frename_buffer): In interactive spec replace From a197b1d43e21a5751e2012dd99ddf25fc305fecf Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:21:10 +0000 Subject: [PATCH 150/172] Renamed macemacs_16.png to emacs16_mac.png. --- etc/images/icons/emacs16_mac.png | 1 + etc/images/icons/macemacs_16.png | Bin 1272 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 etc/images/icons/emacs16_mac.png delete mode 100644 etc/images/icons/macemacs_16.png diff --git a/etc/images/icons/emacs16_mac.png b/etc/images/icons/emacs16_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs16_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_16.png b/etc/images/icons/macemacs_16.png deleted file mode 100644 index 0f112d87185489cc132e74e07cc424fbe8a6e1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcmds#`A^yh7{<RIY1&59)-7$iBk2#@vaZwBW!0wbGBp}&*J|qtC@2VcAaZ-+QLA!z zY*lbtWYT(|f~d%0y$=+qFtnblPUo!GiVi9m&`F2ef3Y`tpEvI(dEYm0@-XfP2fCjA z;4}aLu0gl`L+$nKah`Ot>*wxg!tBL4!S|jo0L(4Sgn+)b_ZP_lAaWQEO-_dsQGhQJ zhd^Bl!om|!p(r>qlb}Z30su$k{k!1-kf>G?L0<G|D3{uwiji2Ye^;^8`MCp#SdmCL zYqQyk3y0&NZINNkSd3(7U>OP#ZfzMYmcugUxVU4Un%%3JSZ@=|!l511tlrp|HUz9a z1}u1^H`9wpP>2o+xtmw_OGEusQ~gxI!+~c0baUf0CP{p7aKx@uu~{lsg^EIyn@rZE zgiZohmP_r+$r_w^u|XlpiwlPq=Ks`cU*}}^l`_XhMpop~U!{@-z1|cZC4fW;dV7{& z(ZZhYS37$1kL5~!<IBfCD3I_DNM!5A`db`UM#9TyX10lVS?v=|6-&jWjn;A|N|>YI z$W~g>a8`QH(&7%gLY<P>Rn8nwr^qwN&+~KpdECjpJ!=VVob`BuK^q?IUsR5-;#0aO zb?d6}wLex3Mxz;*A|c>pIIMJ1xAE+$?os|=EJV1wYZeJ->bP12OjKSr76TF_Cy1*m z)#;SyM&o{bTsssjD99h6kYrFuE14+I%jvgR4kVomrA!5<MuSV0Zf+VWr0ztd*!Ir0 zFt5+a?rm(Cd|IcgtWffJT0*L<gsvD<ti*s@lhEQsROi~7fk_{+9odr6Vl=V?n<UFj z>wcIwP|6q;ch3E_Yv$BU6crA&wN1kyLIPGE5z03h_IX?#1}!~2Jc<ShN=p<wJ9`Cr zgUi3^OX$O;%uytwJu<w-Xtbc<U4?~1VIh3eo~5irL8px{Xd~NO#%DYo6fB&d+d{(I zYpN&oZ_FgT>}RgFimfbVDD-+W8Q-(IY8dEWdiQVS-ZES5rqqx_gTwwK{|f~&eZ1-b zz`-xb-#0wt72>+9GuKlYrMXk??bzwyNMAK2m94uS1ajC}pQSJssR!Tq0G_q5%YEKo z+yysGy~xtJjV??B4hlSE>02rmeCOasVDPn_{gWQ~0OIzVD*p0S==f|Ww@#aRBn!8* z-(4Vj>ETSvT&1!pq?QB1IGpuyA-Y6RT*JDq5YJb0pL~^(c*1_fwCKsY@o9_ZrrSp^ zbNtfMPT84Z=cg5kj`KjW90PBHz5XQ0zEHKk^}R}-!Vq~~joe(7q8v_MIuQZmUgMva zx-Y4<`mP6P_ILK#!X9^X7lGSVe;qGq;J@#5%xcrl#WmNY@h0Wz7v8G}yssQHG>WK# ze9X%LVVp=P>#+SfXH%`mhi76hRGzvSf38=#ef%%*R$PtVV5u+O+xPSF^2v7qI3CHs Tm-Kpz-6cR!K(N2aFRtJp3ycro From eb5b4f5f613cdb92ceba7f596b0619ed4f7bcd77 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:21:45 +0000 Subject: [PATCH 151/172] Renamed macemacs_24.png to emacs24_mac.png. --- etc/images/icons/emacs24_mac.png | 1 + etc/images/icons/macemacs_24.png | Bin 1795 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 etc/images/icons/emacs24_mac.png delete mode 100644 etc/images/icons/macemacs_24.png diff --git a/etc/images/icons/emacs24_mac.png b/etc/images/icons/emacs24_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs24_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_24.png b/etc/images/icons/macemacs_24.png deleted file mode 100644 index 7666a1d1dea5f4605c205dbbb798a605216e649a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 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 U^%|LrwQMoK)y2)3b_$OF2kmlP&;S4c From c0182a725c1fc961c1301713d3a4dde4bf2309f6 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:22:05 +0000 Subject: [PATCH 152/172] Renamed macemacs_32.png to emacs32_mac.png. --- etc/images/icons/emacs32_mac.png | 1 + etc/images/icons/macemacs_32.png | Bin 2454 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 etc/images/icons/emacs32_mac.png delete mode 100644 etc/images/icons/macemacs_32.png diff --git a/etc/images/icons/emacs32_mac.png b/etc/images/icons/emacs32_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs32_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_32.png b/etc/images/icons/macemacs_32.png deleted file mode 100644 index 94bfe8893b6cf7ff0c6e08719cdc2579d4d63781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 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 U29eYT)&Kwi07*qoM6N<$g007fGXMYp From e43d772c45dd350d32d5415328a6c74ad0958c42 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:22:49 +0000 Subject: [PATCH 153/172] Renamed macemacs_48.png to emacs48_mac.png. --- etc/images/icons/emacs48_mac.png | 1 + etc/images/icons/macemacs_48.png | Bin 4330 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 etc/images/icons/emacs48_mac.png delete mode 100644 etc/images/icons/macemacs_48.png diff --git a/etc/images/icons/emacs48_mac.png b/etc/images/icons/emacs48_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs48_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_48.png b/etc/images/icons/macemacs_48.png deleted file mode 100644 index ac3e703f8203db1c222207f7e4f96fc27bc34690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4330 zcmV<G5Ebu<P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru*9s8{HyN5oofiNA5O+yL zK~!koy_supTxWU5fA9OA%U*StR(DyJ6)ek6Vlc!I2$X>^L!r>bIO&uOo!%y$b~<I+ zVOpl0e(4uJlzwQZ47ZeWF<2%zB!mP9f=!&n5q6ve%h&iOTb68TCCggv<?K1{+YjgL zYQ2_Bn9}adJ9{~2wg3Nf{XdTc|BJ`Y-~WCL7zXYH-U0LjT|g?jWy!z{a1MACcs+Vu z+Ou~Dzm13ZjX^)KM`0KSb^s3|7zUC6QV4_ufdB!<fH4NG0TU7e-Zb!iU<^3FXYY>S z|Bb-T2li|L{t@^D&?GQemLwLlh$n1fF$>F<C?$|m00ONIrJ~PrzD#bZj92n820$zj z68XZ|-W_NEPYLXNU{9lfzXd)ECM6^|jv|$INTnQ-DThSd#*JAxwnSMW2_Xa+2m(#1 z6tKKp=KA#_*|`FXizRem0B(Tz0`Tu+dv`4TRtY@x;20P-0{@L*8z3D=kxbg8(l+U| zOETpUk6XA-Xnos~NK2w*=mjCdpD@Ny_B8oInH!5GW@q!vOfR#%>|qQVBMtzMj_uuX z`nN*hp$EqRJ_LLn=$8^=af?*SA(eDUr5%#V$m)*5wiT8ou`G#FG6XNfyf7gHjDa99 zcwWHLjS_Qnd8V)An42pQ1O^OKz)lb^jlIPrw{COolfXB@q?HmR5;lpXO)}|_O4%e5 zHm)0jcN~RnsW5b+@R0(96o|-527xvpga#pLY;v(IiQ_0-S8;V_nUbe_fTuC$Az<HI zA)wZ<{yTxk1*TC-K`d^Oh}*>DHt~c-EM^mPtrY^c#IhB3l)y>~lpT6PMPXDSgArk6 zG6oPU`68iE@CgDFL-3K&k)1D0oY*t<8xwf=!QDLqekcSzLJC}05sO*4(TT^xYU4Nx z$5mKS==2XXvSC9Lna(7(D=8MrV4@rlq8hD+FqE`5)dL2i&kBVy7?T9?zR{7LyCzQT zDZFI@5AWFRAox0h_X+{FEwLSiZHItkF)IY`TDWd#aod)xA8KY~Qw!;Ij8xjCr6o=# zlb~D<$Sr$OB8MQuzF-KnA@B{pZwLa7HijTD_`b#~2LNpX(LXw}^Qnmwd)Dj~vhMv3 z;Nu98QXrK?N{N)9ED<KCC8~8^Dv50?`ub8RrLb)q%d)U-n?xeU@Exse9BIL_Lg1nG z!|*Xx4`_4{zVGWx<G2FLifW564+{ABLl5lX*AjSm$L=KX&q81eKu8(Jt^gqfRt2;a zq#GPsTjMAhdMOqUf#39prNnV;IyxG-duxW47MCCh2(&>5E8v5`;0GGtH?*`RXl%5j z9%29-F#iNJ+_nlmykj@OBSLTogn(rfx&n}rY9elXXBTgOM<=$exPHCB@rl_ejw7p? z@LsJoAh47onT)e}O9z)O-Qd)TEWWQPS57&g?1j(QuIAXhrGv|t&mpA<JtM>xFrSLb zd2QJ@D;^Leh2W3E*P+#GJ4GcCJ3Euyb$2^TNi55zxjD&QcV_?-0S3?WIrgh7T)a3> zp-@B{jg$i0cIfYK;$7RjX>79bN`3@f<CT3pFTnRTLmQfr($wa?6hb~4kN3w020pOy zkw-prmu=gLO8&|S;}&2mLPRyYqP=c@F|w%@DZ^M7LZBk+I*!8keT*?=v&&q#u)v9l zSzbJNk+W~kQTD=XmSxf0oaEm3_OofUm2$a^R|@bvpHj&u5x2=?(sXvFF`-~WpedL0 z?~r2SH$ME~_r3VhkAC#|ZQI`Y_DDdAN)G%U2uIYlXA>3<v<WTJkx61%>LyPrC2<@V z$FTu$T`N?dNIVaYAD`oeUz{VG%@OzkQb=6a;m*6d_}z~U)7;`vEcj?`7~RrNpkeFV zyU<!Agdw-Qz=4BLiVytG+a9{_zLDmmM=!hM<41d=ypYx(d}_=FK7d$VTvW=QQj$c% zK?qq5u|nQsb~Z;_dlJV9lQ`Yr;`;%{$gtiAke&B<{-@{Ia#x0-p*Cz=p_D~?N19JQ zu#xOs9%Bs2q>Ydk8#lJ&xF?yNo#oIkpJQaCogF*g#VfCzH(&Y6u3rX0ArAzAv4AFE zNL1oI%7ak5L`^3M>vgpmh2n;nUcA7WH|OZ?YT!Nh4$#mTk33>gDEJs7(1EVj_k+Kf zWa{!F_r7->wr!!5!gXER+ZDbapmiv}6G?|yti&sa_pyF`3!nb<dzhHG##g`k^jx`o z{zt%NAO{$UV4V<QnG$s#s0<`QVDQU9HBl>%bLSTjSj^6rc;?5aIe$Kj=aosNEQ&=R zujo@O1r&=u#iCECs5$!TRlfV3*U4scQJ8>Kp+|%eXk(b1oZ{!dc!t5jb{=`;UQV98 z#uvZ%gwcBH3CRBnxCG<@BLy@A?h5d*3YjQzbwnbc_sHc+)#M68sEk(*J7=L_II#Z$ zM_-*Hk#Hy$$`ngJ#X^}vu}nVilP~yqp5fxfB_8|Q5hjk!RFl6FuG3ep@(-W?5~);z zojbR2=FBu-{_;LD9cel<najXgU@;0IETAO{8Y)$&;)u`#k(T#0(^r=0>ubW8@OrUW zMhJstDU=lwKXP~mHzvpze1x#@eU0yHf=Dv>fd&J)rGP!Vk1;aZ&i(ff<G2>N<z+tq z`7aR!0U!I=om{$fjc<J81zcCs)7>MC>AG=wYJ3LpY8#n@SY<+}DMi`{q=sy^cvBY< zLXt0(v8=Gx%c%1e3Q_JDAEWh6;>~CXOjy|hEqLwKtGxEwG@CXx@$652!cs2J2S2!x zsi_&h`OTMc9L3;3FHMboMk;r)5;`jc1i|Xl&B`QINoLQh<Uu8&1!Yg81EK*Y?BJE} z8$!Uf0xl#`krLsY;1zrxd+diumFL~>-as}x%dTDHNGVv?pP{*_k5npyF(v?Xy_A@% zR-Wj`Qz@HVu8a^B5C)?}Bzaf9uXUvBbx2SegRXY+TJ;%P+ypD)O=~dP5Cj3!)91No zdmFZGQ!HL*Z0rc0rx_Y-r>(V*hK3$oCyg<|{4HWmzyeUJl^8v}X+}4<5`-qIhCnLq zpwvnuD|tSFuhD@Hf$0@*-PFXRe5y$1Ai6iu0oSfgF*|=2AzYMN=Gd_r@_CP*o<=eq zy)-oT5RWw?r7}u6ldGxG$!K3wsX?4NnPqUOnfpJo4%-f`uB2eyU}JSi2gv10(PR~l zk5YycSU8nQEG5FJtX6_YD$!`o;^G45FTTM&_q+`ua(wGshskDhY}+<KZ}$L=jr}Cz zEhuFJViCBuni`!)i1R>ORlFg2?%A{a@t@w!)~%hKIkP~fGfj7Q3Lzw5D3!tll~Pp` zSXMyR2tcC^LRWQJIFlJD_(hIQyu$W(50lL<ap1t~%*`#Kl%b`mgQlhdlF2qK%LO9{ z%cr<Cgub(Trw8n>zfdk4zW3b;T-V~h_YbmpbB0*VMaob<WwUuqq=lqfv2bObQcFsy za6Ybh1Og6?@8{0DdJqC$etCi`SLSJMj<c@6kEW&p(#Z^#6<aASf}eeN&rWZxf#yj8 ze*MN}@w&$k9zO{flu}5!GJ#&ZmIESyvJQMis_K!->j?ZS<1f<H6{oGOk@4{pOis>_ zPCKk0?4_x(pJbvPWw|$nEAZ6qCbHLoW4CUN1QQc;96mfn5Cqk<GzQL{&7x#w|0AnF zMNO=Sq-1!ML`uW)6Tc$2e2pzzhIr$Rvm8Hu0oPI7G2BC2Yd;MQT{unxDP(P7KP}*u zH3<k<LhxU!PW@7{_wkdQKR-_pggqdaD{*|{YUmXqkdkW1C=rE@tg*ffyTatf^Gr+} z<-Ysw=G3W4#>Y=!jAnGSm#)rrG&lF+x|KYu)-eP8=dQ7x{+a~7{k=~Cd@HI*bweAJ zikip1_9{nTonn4|nIAuWf?UqWjoHLvm3@&-EFNwxTsK;DDOnAJ#TyI!?D?N^&-P8s z%w#!u@C}N^5}QW4=<OY%wRM1Gq7fm~&CuZ-LhOD^tHnQjc<fK46ki6RD&ZH7b^?Jx zS&&Rw#9W7D(j^wNqqR$zpi;?|)q2!z{Xmn;E%TjSyBQd0CXtA7;J|Cl%`LELq?6&{ zVcOe<aqK2aB`6mCss<AX<9W-Ej{V>>UwKPwm8mO7zHJQ8R7zc~Cxj3<j!n#ok%&7u zwQEINMVq;3S7b>nM`GCmr40KI?8kKtwr#P0|50XV7udKl!`trIKqfOpD%Apn!q3#q zv&QIW7Or3T_U(4KwTmrr;o^&WaPWOcTsQp*5RH|=S^!c>TsPd#Ij$9fjTX8p+=<Gl znN?MZfwN~%)6r3;T!ur3jx#%VouTzDY}qnGSLX)O>2{2^$>+ntzQ$@ZOSx+gKeO+1 zv$xyK$$Aa?!>9iGobMO^ObC%PD_g%vm9EUmmCwV4RjueV)j4|M`aENMp5o%g1$uiO zl1Yo+o(48=*+6GzkcP$#0*7KT2pi*y1SytExxaYw>A$)dVH7oIRS#4yN<bZ(*gHAA z;X_v(C;1^TcCE~iN@7V-U7^crj)<FP=t7~uu3e84i(5=gO!Cr8XSo0V5!zZ?=<Xb% zsi_C8ZI+jPmX^GgLCKKMEzkbt6Hh++%uT6$tGv2}fQ;TNK%G9b?{t6P_A{=Vx=#p^ zs0ca}?yJHi6E)t5JfyY3FZ=v*{0Jvconm3(1~W4Yw6!H@Z)>G9Geko}H(I;omdfOE z9y*#CjM2*r3m5+G*?oWiW39`kX2WAv179IfYyHYm+630=Ge5c5)HLu?D%tTKDOIxp zf@t~b`{A&@a&)wD3z(mu=SNRJOQBF?W@es_jwD;RZlI%mJ;`JjzVEVhqZ|$XA+8`O zU${7V=x?6i|1U3S?VCvV>t9Dg)Q3+b@GQWsoUYD08@Ipf&p(?^cRm2bD<xJ+iDk=b zHL{dMNX^TK4si0+akAM(+S?M0ZW^SmZIEQL8;BA3tW-H;yv3#IA00mO*neD^ek~hG z`(pH50?LFkC#WNJiwA1GplZqFa#uNf?&pVvP)8dYx;tzu)^5Nu#-Ia@=Y^YxLZQse z%rxVN53;zpL~Cn;^@Dw+QoXot1|i}Q?TY}fSiFAp^qbH9>%kZQ?eWDMQ^g3RUjsN; z!xOjlfCB7rGmKN~3Ba-KL~L}^CpHiCZ~t&Zy8Hc7%4S0)3_M;w^c<6y&XdVBFwoaa zQ&S(QWCxC$LJA9Q^y1Re%u5$89Nc%})YHd3FISAL?A2Jka=hqTxw6Qr_kdU<iLE*k zwa2b_#<t_JEt?<Q*x50<Ii6@9o}Qi>Jv4rxxu?4^-_zY4G&c4WlZmz)2r*MATt7QA zbL`l}i6>5ZUcLmzud#T!hJ?2U_@K@cw-6AuRj7tU{i)<g<-REFqyu+;4rZqvXYrC! z_7$b<tEEzIsa($cH9xFt00pa%s6YNH;MXJ|>+--_<y1bGHxm#p*j?Zyfn{JmO2+yh z)-@z_9SOe<w7*6ktSaVeN!-#G>W*CHC?FO+S3sDW24w0$)LJ!I1+ZTOT-W`rHUH5q z*6_w^N7S`>S=a9CYqnX%6Q&NNu1nV2f?tb3J(1M_iZwKfSVKA11JJi2WY&oHRXg$j Y0H<p3KkcrS;s5{u07*qoM6N<$f;(6d$^ZZW From 0235bce71ef7c8f42766111da507af05ad3cb65a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:23:25 +0000 Subject: [PATCH 154/172] Renamed macemacs_256.png to emacs256_mac.png. --- etc/images/icons/emacs256_mac.png | 1 + etc/images/icons/macemacs_256.png | Bin 58604 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 etc/images/icons/emacs256_mac.png delete mode 100644 etc/images/icons/macemacs_256.png diff --git a/etc/images/icons/emacs256_mac.png b/etc/images/icons/emacs256_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs256_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_256.png b/etc/images/icons/macemacs_256.png deleted file mode 100644 index 5529c75a4eee371278128808634f4d54ca046fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58604 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 From 243d547c730449b851f31a74e147d7569bf05f51 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:27:17 +0000 Subject: [PATCH 155/172] Renamed macemacs_512.png to emacs512_mac.png. --- etc/ChangeLog | 10 ++++++++++ etc/images/icons/emacs512_mac.png | 1 + etc/images/icons/macemacs_512.png | Bin 160704 -> 0 bytes 3 files changed, 11 insertions(+) create mode 100644 etc/images/icons/emacs512_mac.png delete mode 100644 etc/images/icons/macemacs_512.png diff --git a/etc/ChangeLog b/etc/ChangeLog index b6b86ce4ae0..764d01729c9 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,13 @@ +2007-12-15 Eli Zaretskii <eliz@gnu.org> + + * images/icons/macemacs_16.png, images/icons/macemacs_24.png: + * images/icons/macemacs_32.png, images/icons/macemacs_48.png: + * images/icons/macemacs_256.png, images/icons/macemacs_512.png: + Renamed to emacs16_mac.png, emacs24_mac.png, emacs32_mac.png, + emacs48_mac.png, emacs256_mac.png, and emacs512_mac.png, + respectively, to avoid file-name clashes in 8+3 (a.k.a. DOS) + namespace. + 2007-12-08 Ulrich Mueller <ulm@gentoo.org> (tiny change) * emacs.desktop (Exec, Icon, Categories): Fix entries. diff --git a/etc/images/icons/emacs512_mac.png b/etc/images/icons/emacs512_mac.png new file mode 100644 index 00000000000..f1ad7558e49 --- /dev/null +++ b/etc/images/icons/emacs512_mac.png @@ -0,0 +1 @@ +‰PNG diff --git a/etc/images/icons/macemacs_512.png b/etc/images/icons/macemacs_512.png deleted file mode 100644 index b817081ad12a48e427704f88cec3a90407de9c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160704 zcmX`ScUTkA);&BagaCoidkIAZL3(cqMT&wHMT$sQkX{9;q4y%9qEZEvCLki9w9o`Z zny7RLAiehhfqdNi-rx66W+u;*nRE79d!2Rmo+KFE)}f|krvw0iT2EKY1OUL7r(ggM zyF45O{yx1tK%LYL)B)h{*l$B~smp6NzZ>R$cRU~Y1=#sK1k@cp?H{7_-0hqmnmn{~ zeCpl%Pz3<{n&@e%-wm9wM<A`cBq&ROizvAE8i%4l2Oj;W!=4s$5A_IU{{;0YDkzuZ zS~s{e5hDui43Efy#Q%xNVu&ZH{~?0xy-Sn?)5E~KG?ZgDm=K2eR$elh_zN%-3F1FW zg=(RG7}Xi3F-`u9#34}U@?d9s_@^?Zc3Te=0Cg%%0IcpnvK+7jHo77PbXpDF%w@5B z=Bg>;qgcWk|1#oU#l+BeAT%;tVFwh?qd86fZWglZiwc8x<~?&ZDx4RgKX;Pxb?}Ty z0XtK2+C{Xr@#4JJHtxo9$jc+1wgOPvK4&mDSs{SHyl7yhO~M3kv|}n@ABpO<0(Y&T zmyf4sqBDW01BvQ5c-&szka3jL(05RL3#8LCpJ<37QpVe8{7H>8mY|H40O0w<Fq{zU zW8k;+E0{fnbJ_#$n;q4hcRkDxTy>pM5*QtYe+8^uA(8XsL&IRB1-x2q+fF7(>Tt(f z=4s01P5b~1kRk_Yw|SA9U@E|!WxBO0wO7R@vx4@cK1E=m1Z)bKnlpbdOpmBsE9u1& zZv)w7K()|xzKS3)LmVHp3$c<F+R}ot0Q+UwBIlr(q!moZAq<gj=W*THljrVul16Yt zAvQ53hLrA4`@<-CMhI)bWd)rV!Gy3Y1xZ{6UWgS6ps?B;K%s5Ps2)4Ujk>cAQ_&5) zZd`W4{#;F~{KL+f0!G7nz?wttnnQkV6eu-hCwT!stk9M*IT8c_Aeqa!k!h0Q>Lz+I zBEhtE_87#%=Tz7*-jxwE$||AG@eox3xL2P?&j({dpz%me4p_c%6b~ZaJ>x(30JDSs zH-R<;AzwAf-MM%U)_FSg9ftxJxs7pJMA0WVXeMzbQs*ngfocwSSZTM(=0k^uBLfiW z!ZDXvXoFsW{ufEx^~I>A^@kB-(D(-tV;P_tGEYFn-R18jsdPTOU@FVDbJKmuf=bK? z0nR@JD`NwZ5JzP`=YqNAVK=GE8~Oh~NNj<8yO0O4o@%v{cKORl%-w1A;i>Q!<R`lz zqWw51k_iqpwfFhC5@#_SU?(g=ls3-+>voIt5)j683IOa}3zDFOQDT?&xUgdg%af?s z2(tJp*^9JTl(9cCoXAc>Qdbe<k`XsBk}FLSQA4pfGFZ=6<Z>Z}-DOOE{cju~RZvMJ z(iV%@bk&rk8u;PjM~zNt3vZI$vQ0$DOrDT5pD+{DIUx1<DcCQFbh4OM?S&_ozi<B^ zsMx<i?NA?Gd~<<n*bUpwb^}ZCCya;?Ga@P9g;9dfifqEdma>Z%k=~bvX{5NP$w5}w zNO8#u9O!>ja3(|KH;3BTN>WcC2hf(|$j{oKzrj>&<UjRDya9?>31==nKFGhFf)|&7 zal{TkExZK8=>LuW3*cNO@0`nAn=Vda{x{NjW|%TuAcfx6l~IBw+BfS$Q_Q30GHg8V zu=(qlCTM(`G^UQ}f-41QEb;4qkb;T<nJVPBJ~jII4y-Je=p2Kd5Mo_{fikZD9Quyo zr0vG&kS#%WpTK$^Y8S4PX}86b{g0FXj*b=!nni}n+{C?JD_ib9pRyB#5qWOsYConO zYL*1p*#It<X=LXY4C32RC^h6?Wu#M~upeWx3_y!1q{bR!T!KIkY8I%vzFkf(zOt5$ zjn1EgpI_r@azFf`ttt@r?4L+5g*@v;;o8M9((VU|6eWZqxAnu)(dFhFM+m@rEI~t( zos;?0k@pdWu9stjgZ?+R&iBtzupZ+kl&Erc(3sZS!FU&rcx3t1>nvJoAe~i<^*t=< z7F&Y%ad`9tEm``DsK@D{_-}`3KMEq6mWPkL)Rz?XnDuP7l@!QMdyrgBQm|A_uB~P6 zB>Tuz4YGWV175QOvQUgNh4u$>?Y3&z|DH<#RyZ$gVLeCJs9=e=mpPPP5J{vGCV7|Q zR9k*$XQq^QadZ<31SFG_)@Sl-<dY9{^3`#=`FnAu6UjY^>eN`0k@7{yZ{8Fr_8;jy zPKM?}^9`~(7G$-7_9?`Za9T2<+LT$Wyz;kP0QV%=ud|3iHi+Xce&t@fv4rUV!&DBi z?C0qNgyHJG?;$=T+^Ub_*`B%RS1>7O_IE~?;Mwdt&XUt}70r_q=w|LXIYuMMa2ycb z4)UGEJRx*Df?%kB%+n=9hzBY_K;{|p<Doh=XO@CvG@j?~1yAiT))~OC!>hI1&^vzM zcWM`gdBfoBbvWzehg{Agc7*UAXO@+T`Bh9)uASfVrG`KHU%CKnSh4BesCySEx#^|j z)h}VR{?6QA-jSQ`ja>^jTBKp0*V$T>meLs4O#um(=-_igwL6DY_u$|s@^duLNm?=7 zsdgc5s^R~H0b4Q>a>Yk?5=&9ZEJq3Ca%1Hwv3n#`A!R%a>{Eyxpa!#x3qjuq!Hcr7 zV_WEd6Y~j}rc98}DgIK{HMs%kkTb-V5xaI>7}i6)x^na0?wrXuzgczikY!E+os<o- zGX1qt@VS?FQ6i7!pyn7NJ~1zW?lB|q)fk6WL8O%&yk>o-I;dN{r$a5?o_OJ4M~tK4 zwndOM6T+)+ay(1{+<pL|P(1o(2cQo*>j)=FYH&bTT-YT3G7rh{4%bQIz%s_vx`t#E z8OWkZR#XzqCXJb=&{hcYe|o)<$Wt4RhEA-%VrOPjYm(AtZ;88i6wj?@Z_Z<q5cOLs zf&<Xkr3Q~psY>$;)M7$IqJuW>knOCon?Zn&bhsYf9Is9{0Cg?sU`Fu*21H|$0SViC z#Om*W^8ucRp$G)nNBzr}v3CTd5_fo9kf9t988)U%Rx?Xr-opeXF&;u8QkL1tkp*x7 zT<uFH4@62-Z;FcHt+xJgR^r)dOtdD!^!T`hXMzUthjxKp0h@CufRwa;HydMhPUYuy za7<48P@^R!d)+<6c#kpS_1%-nHyL!mxK&<RP6T`}v*OF6B8X9Iq1QQb(giIK2Qweh zO-|ykeE}}CVHJ;H>a;_*do_Td)CZtfbfCXYI^fc0=`k|Zn!G^8_L^@1UDV8UM1VF_ zx(6BaB(Hq1e_1m16`f7uo&T=;%tld11crhXEU(d=Ln|+>u_8ZmIx6T;-#l)Qml_Z( zdIlW);GU4M#ju|`X?enJ>6~n}Tme)S(iZg*go_ukVxzDgi28haTC!t23c|3G@~MH# zG~h!0YHtl63nJ;N2506#FEQBZ0p8W<$Uw2wQLVI}T8E6mJMj>H$e}#jkW(Tq8{|Vb zd`UCoj{IP9>l9|$OOOF9u#sa-iA5n|{ijRI{jimPRD)|4-{1dS6c3N&)K&eRq)Qql zl3akDG(I!wP)dJ4;k5%$LF>u-Y()f)kLuby@p~RGpd=K{rB&PJN3NAE%@}w{CZK@v z-kUu8=!x4p<Z#G)4>k8|-f!@ygwkf0M*)e0wmeKtZ<K6a>s45}M3cto#w_={;rQNX zF=|&JlyIZxs5Z^+`=GW+Fctd!ZA>&&4O#NNy$k3Gb{DSr`KR!YL3xIKO(>@(=N(wY zSJfcP(69IY>riH}4Dol^P*g;O?)63IdvgqrCH7o`1PLx7L)j_}O|NJ?;Q5C;bLB^u zBEL^!Ehi4goxUEr_7qlo2p*#$sNX$}mxbsmLyVNRog0C4<wIQ;T}qyVf$RL0N?Yi) zN?;`f4GG%jQFF)2WDjCnBzAZl<$(}JK=OB5ix;g56Oic?@ezqNAS1@CMJ1k}Q{6WN zI`Xw4kPvE6Kk!42s;q+JlG|<tPpM^o$g#zbrZ8(3+E)LcyF(ZP*SeY_8ZtmWve)>9 z*;i*8yG>R*f;MdBN`A$e9^m+xgCT(NIRD^&$I|)S2&CtQGQ+7HMvzmJ)H4G6?Ey&G zr|wA8v)n1Ul<+`yK$l7QS0(Th23+Hqdh3LlX2M#XbZ8^-`)57PfrKDH+qsJ8@dTFb zH_A5BjG(Wd&XiF73~Us2`3;;v<<2RAVrP+YhvVH0o*^*gj}#>^sr|4AnBUM&7VV^B zV~Md#3vg5^K!#z3O$6>NO&-XGbs+1%+@E;-m`=;MC<c3LN9lQQmLGVh)uCVSZ9-S) z0p*Gf5p{1q`jKkpNdlg`D9k<~FPI<;MzNoVBR}W@H7cNMTATnhoEDK~_Txksv4#&X z!$PY){XhAq_%Wqbe;Z7)o?%LFb+GMz4KjW++Pj-(jnxNv{ZoGm#sgf8fE?unNXr;h z?RrL(O;Nf=ZgQ>1Ft&Z!G~#|d&dr|M5m!fcR3Of^wye2Ki)|Lswx^A?qwrgz2z}5x zl(W3kvXwyL&FDDc@vmWFUfELs0;#)l>i~vV+tokuDZ7(9!4j&t*sdg*CT4gd)Q;FJ z#Gip~g;}J(8kDF<MgvA@bjKs~Bfa#4^F~ViebOK&TAs`Zgm|<tI{{YC4*1KoLl8T+ zVZ~kO>!#MVRe%m!uS6s>O3e2^m)(dc);}K>g-X%q2khKK-y+upUR8~Rb0(OKQ3e7o z`P^V63i^UOosXaKkS$*M25=Wh(fWK3Z*`^Zk<fvdGcMal?_@Qvg4?Y78W24Cq+J35 zDOTw7dvoERu{Fe|<hHp+r&s52vw*tTHVSnSPZ5D{99dKW;Yi4Vb@ZJFrMJ61h>Idr zU!>0X=p}w_HIf6WjkBi*J|B;v0PtEK$akTD_IZ-ny}kft*+3Y#!%5P#Stpx<{TT>Q zTIDJ1bz8a-GPj|5-;Xe`OATN-0M^%2-#CGuAl>w0K;y-wFM_UdV&602`ayOV<qhXo ztQE?6jo6x&5Kd<Bn}M)j{7sM>7GX6hVT+0ifNmwA)rc7#+~V?DoP*0$?^A>vka>Sw z%30I!hp2km=1NO+4}QOMNx>`R5wx*KU+R4x&JQ#OT5LO{)11$FIwZfr#5%IVlX!m? zZhy(~2MF6=CXa*G4hb&T!$Ak-{y*QZu0!Y`Th#;4-jHH{grO(+IK3|@4l2*~HOunK z7*M7!aUI7lzcJs>3@t9=??~+gM6`1Y<VbRX8)S9_KA=TiZ2wYhvC!7%r$!e&eKdfE zw)uxfAEKA&n!yAH;<GStVoB)FD|aY7&ON4|FOwU+$<y8le_I4f6i`<u)k~_027Xy1 zV^b?(ZfWr4RqAm_<i;D^-U)MnBzt2&(eZe5YK<c|H~YO-{B`)#u-x#0b>F%l@;^+0 zqXF(XJJ#s-!GDaZ500!wKlqi<J0RpXX^UT6dp(>O*8|}}BLxBC2UUUMhIbpXt!+B9 z%PR}<t%`yEQ?l$I9RG!I0~u#C>qLG4CBKU-K%@)(J=XCLpCo)Z#!Zj|{h~Ng;x6f2 zu{|!gwV%chz_lqJd-j6COu*4rj-p}=j`h6WIsDlh^tZ<m#RY>hL~37fz6A&g4l_Y5 z%3a0(L^+PAlq`b1iC?ieI1tjVaUFU0>AcxZ=*!N^TNKEcfjhQ%bGcf(0c6&ZLofwy z=0%YNq5~tI)+<a}z2&n-e)_SgEX6@FL#50h-{>Yp4qh{^nB}N_h5|+>tM0$N(nlQ3 zw|UuV6|9shyPTW)jJ4$DAc`kg44?pqKwMK;oB{3#E<LTPhBQyU^Wkmrerz;re3|$M z-rDmJZ};8ubxxFyUjG?UO?W=MEa7xU?2SmS?4NhU@;c85kxyt|?^hTG4!jBjImf@N z$MSbDa0(!R^S4Rc?OWt#V51RYPf;F9LE`(VJ|-L;f&L04-oT@PL5w8qJ}*dSyVwyo zu5shRy90whtVCfNx=6UMgUdqsSahAxpR!y2i3&Hv^q&b!C^v2ipM6g~8_KPzPj&O& z9P^oYpdBnEKr574JH#!ZoFPSld;0xjzth_^xvEBhq)r!RKG&!-OMx|AdzFp*aHRG( zG&BI@2R4!`Bk{H&t$^k~dCG9K7FO#$Lp3Le@u)c74s_QHR4E$X_om$yEP*292jQp~ zb0Egp7f0URvjhqQY`_P_#JeDS6hq~H)vo21t!EA(sDKgbg6fdlf;_GQ9K4u&hp*Tr z+lR^Wi$FrMJrRKX5>-zwdWpP~8S4Ted>k~{#Lk#W;l#9)Jv6x>jK^0Yq_5=Bxzl>r z8^ui~@haY4sU6*Bm+6X+y-e4xk~@9{Tf?$S_m<0lE$HGXeyQG8Ek&lMkKw+5%DDkt zknWc5JjREk(<WI+M_&VGaWcBZr%=2jun)(9a+XhwFTD_iu_!B#4y0$=*2Jh=LT02v zXS7B*X2j-4dG-(uKVsP$5@?J30Gj3VA_i9M;1Om6$P<ZMeuO#ra4P<#dMZs=YK1z| z64Mur@y67ewkxT?&X*0Lm|$uNK0PlU+-)G%GauBlNl$PV0P0;Rf74RA#p3K|Kx`Bs zcJhWa+bpU@jOxiVKCe{xU3;55DruW7b!RUh(pxRJ?=xYWr5i4jv_L4!``b;H@*2J4 zHTDKpHwWd9cW-E{fds?^;&c=C!nuzI<p7eZP~EZfewac1XkrUPSk&m1d-YoMwrR(a zEfyb<SMuzi^4f=vFOT}6C;3($N1Y+D)YKWSa_f4>J9c%XuBPz!bQ6?9HWR4Z5sxvy zBW=1!&v!l(!q2&?)5#D1frg($Rw*%l@pHc~u4)&)lZBOZg-auCE6m<0$oeMP3ZW3a z;V3AGwKu94iXG=0tJi8+%5Rqdg1A3AWnYih0;EQ;QY{y&xlcZA4^ovSur5<R%^C+Q zUYCN5rU1j(`)>zjD4{&=El1^EX-o^(FV~;S|Exa`scwds^StEQre#?_@S7;EP3PqX z^P2Z&J|Fln@&d^Aou*LjxUU&b3c!(;KZU$DVF|K{c=egp6XeA}c;OQIeLj{SAoE>% z7-<7>#Z8H1mEXhJE16$?g#FuzP1VN0mU3#QJ+V*3JHm+bK0s+FS6ufnT&OP7qegq2 zvBdPt)0-4cdiWfeElI^$*KS;M{*UVPRXZMad=LAbvNPDrf@<)$fP1U$0?9)P=E}J_ zhy0}+1Mp}YEcj5$$l2+pQUtFaR`u0iwA`_J_L-ppj!08_BujxgLzxa@{X}V#F#=$+ z&x6n4Q*bUdWaOt&PGw?KSjy<>V$h|eG5wQ(cT_77owmnEj>s;0emFm;Cx0^DS;S?T zKy?7j;}!fji~-{8w*(8q47y``_Vam5CgQ2oez#sqxZKJor;%vHR<pxUQoJxU+5!q6 zLBii2X&FC@!YYi5+ehAr=7ba$4^Dt!0jvX?I^cFP@E48W@)0F!^~=KoTl&+3n`cI4 zo4p!O?$7ey8rc&`LNNT2U!URcQ?;jG2cL1g&>sK9!>x4><3z09-ks04gmpyl(CoNx z81oxf7a0|}+k83-x9IT17RHp@4Kb*gz{vxh_WIH7=OBDH#o8UPOBl`c^L){A(XOLW zk`-0NDQV14=rKyH>Se1KwCu=frZO%7(p`izfA#Sdu<<~h=8_byzdU!j)o?5XhCBxj zclO5KS}J-JjmTQD7lxs|)Ir$^w1X}ub=gd|yr|bcyjZJ4?!0>a{S{wuVb3-O=#egN zKvrT`I=YvKxU&EopDFPyaAf^f5K#ztZ)ihaOiR3o!Mn_BHaRY>A?@(ml<25dg7hv2 zN$@U_>H%2yWYXNA8i$p)xg~fp%?6z2tw!3#8zxdP>ve=Aen!DM`N$_Ca^3^RxPk{p zyBCy0I=m=t<e2<@Czt$**N|2gSWab{hQ?xg!3zX7qJABMS-&G<3#iosoMJ`8H)t)P z{xC9APf*bjXkhYV_|w$c5tDLhXq(9jdqh<oY=%ee_ZN`r%KERP=1m>NFQDa9+<&Q3 zj6!q_2?Q}9m+VyHa%=1A3`UwB!Q0iQx+y#K<XLHYZ|%+WQ2?o*Jc^3)ls~F$w>~_P zT&S;@id{khV;RJu&v~}#hSmFI+N3pVAR7w+?`o@Ecf?n&HDnN3{Z7ZgL-F_Ducn1p zzHT1N4UIU8Be#EDq{+Ssp54c&O~U$=IS0-E`lt&qGS8cu;v_4fVeL!ocfmMqsuoQ? zXBVLH>);Aq)1)Kzomk`s6NrPpNUzd*)GbSS*ZMBKt~Ruy^@AlvV~!^%$yR{s=m&tj zjX6?;gj(7{xHFo6&gO<?-{Sjr&nSI{hSucTXN^Bt!08Ipn{ezNMPMDv9*bKu2W{uE zN!Z1m`ez+gK`QIJ`My&-U!PQ_T@vS3Wd{mT+s_r0642!l^v$|7#=hE4f4KavsSAs` z24#W~voUM<_k|9Ca4~c`dn+fr6-v}i)%3azAJAh)=DoA>+#w35@4gqrh>~%}Lf*6F z?;<lUpjSdZE#w)=0L-dbx{P`Wta(Vz=s;NN$xlP-km{}3^N=}ef?O1)WJBvBy|J6F z*{n6^#D;OTiF{)56ICqJ(rsHx8vK(R8V%xE782WkzCcv0XE;dJ*RL+vP#3tJgxfE} z2p1|X!F6j9%-;uPu2E$7=ZW<632|+hlD$!K#)(U*p4*oK{LFGjaYER2sIx4_<yzG7 zlj}<BmL5lHp)X}jjOwl@pa+=Xs}ZlzgoL0(qroKKoY4ii>i5P4-b<OSxeQFl(nj6j z^wo{Vh-5iEy<c1YSq-)HSD_}RMV+bck04$%*J`clj;D^-p9nUiuU&BQA;D^C^Us9N z@9yXng5M2r$Kz?^GtrU#;^T+3Z)386m8h^O0@o+H289%C!CCs!2OW^SCHzNlZFWve z^_ejM>n<G}5n<v{<GJ9Fw=1flo9$cOk7N<r8<zHhmH)`iA`E6x{G9@gmEbzl+e!5r z;*lC<@a%qAk4bImV?Z}O@CIo#9p&802FsAfQg^L~(yxWzN4l$XE!&p=ReufFJMa>| z`0`Z9puNV^^F`=C$F^2^@T@EJCNaR9N+pvi%e69Z^gq`BA1s0u_Wd?*(@IQ6NtC$i zuQqT(8X^83HX53ywdX3I_UGp7Ko#yPDxBxvPhG`bt9jVjk#ou&S%WEl?_9^#qlzpa zo)?O`C~oc3fm1;I;EwSu?e3yA$wig8wB&R~9$#p@hsVm@Km2YTwhT&_as!fk*lYaX zzk*mS#KH`8C1WYBNY1^*wHh8SpBrUhaB37w90^W^rnK^zAiE~Jf=q7hB~RuyH?__i zE;fVnFV)TXXuoKAQf#yULM;%jWAxU6+PT@XXv1M{I33kHB~pQ_yw*MiCUnUh8wSEW zzHv7PNYuvZM`x+7T#5QN?x)#|*bv;Yae`QLgX5S-+lwQ7lO~lcM^7D9$!xbLOjuzN z_{!W;mQ}9P;r#;>)w?NwLK`Y~J2ZsPjcDmLP^>)zsnXA>fiQICLp6*>=tc34t7P)< z$bt6`Ugs0>wF`-J+12ITmj>&=<ke0i)QoNbybx!riC=&1y1&hjIe`Pt?}Eq6k-2N5 z_8<8)Y&zQ(FCc{Lk$?XwCpH)EKQNPL3?o$REF`O%e>DRQ5E$O(r#Z<1o^Cj13KeRO zHEHS^0s2P}D5s{Ix_bO0Pz9Il5BobAJZ~sl6TuWv+q%0NN=|Kp0i?L5ZOd9D9lXXi zofQNQ3(>y~CWC_kdPOkSEm~+aUKL((!{~i}EY+Xukq3z(xj!W(-0`iwunJJbxA=M~ z@rN^gAzOwU+~xl@BriKI7h}{0Wn=f&myt~@7r!B5ZQ|T*f?T(x?C$W9NGgLe6+rZO zFxhg|{iu<62d^XFQaM~N%2Pw2p~+80ntZEqATXSU?@Wj@h)6_2*hND}1o-c^a+5=4 z1u0;`AScS^WLxYhDOQbV1#36KJ+udBeDu@?SrPcsX3fi5f?9an>yQU_(cwlyy=;0d zll5UcmwW}<j5a5;oP~f4@ImC&V6m6OedhQT9<NrQW~qg9D|}8KH-08<fvTF5TG>O} zQ|9Rkhd-@^cC~&jr5)YXi;`vI#~pKSd^VsF*x&(1c<o?CqC+!X58*y|qs};uOz2xV zp0F3xtVUgr!*L%sbxgXAa-|yXf?abe|NkZV*00eW*4%FXla9X{Z{G;G#EpSE3tl|2 zkJHoiogW*x288*R)wfOrRFc3%;HNj0P0^zNgR1SFX(GDI>RhITm=h>2bn37-+pxP` z0;IpXPLq4laL^qc8aOc46)cB}v`WiQ;!?vf{I2U6i(p|-f>wP-27>}qnHd1|O-2=J zq7%tFt{_S!pi;3<;1#RgPzCme8Rb<z2HJ167)O|Sdb$+F>py~zD<X`KUvN32T3jQ{ z%-OK++s97T(9(}mFFi=E+v4j&8fANVjAN487$4LgDB2GZG20+b-E^44<W?9{#SG3% zf|g@;j+(@ZUW1MgS05}-KZReqv?&QhJI0NBy4ct6qsOlo-{={uQ_|qS@0q?p>W1*e z^J#zsvIm19J0u^GL%M%W9?{8HnY1?OLQgC>PgEGIE*f4?OMFn9q@``l$iqM|tlLPZ z^DhQ|5jLJtkI?50b6I~!<zYEr(hou=W~(d^=z^L&#Fuv~X<Tf|6%UN|PcX-tEGpVr zxT7n71`oI<J`BFvtxs0B7MH3Wdvy)N!(D9XAV8j_(v7*%&vqA3e0rqbPmcM{3LPT< z9l$2bk<WJEY;Ju&{yD-%&JZZvu+WNpF;gXBjmYj~E$MHAa)Si{=rr(I5>%i=e^9NF z5iHR7N)l!ulKy@e{CSSF+Q;*YR(!eRO8l#yFTaCJ2hXWy9-3N%s{`ES5$zJ`zVa*g zata&$-g?Am2-58GQ`DLyoiYf7VX)Egy6ug|*Fg4}$M)m!qCY|BPQ|nB&0ot{?r@dv zusq&lXyJK7tB_#5m)<&ZuES4o&^{1Lara#QP0q>#<N?30&0IyK6pOd*ZddozOCEuO zSTW!)P(_E*`{&q3)GU;=Nv;}wio6y^Ecu0Q>bB0D4Yt}4XEWq8;mQ9wm0uODS9`Jl z8k5N0`CZeNZXWcdsv1lEDfvxoidxSqZ1B)`C{2UEm(^BiR`wXF+kwi`07`vqZ%eQW zqc-W_e+*HC84#ZVkabU&{I97$LQUhK)%vIBA;ja>FiUSH&i5j9S#IJ#k<eCzM@!H? zJm^ab6!I)O-pMj~EId>x+qv?cNB1Z|e!N=wVW7SlsCv-0t@XvaNz1PhbPUg<wuF}- zs?ZWTE3J%xd)M~c)q^|0_q{kWfJ+A64R9I+&)Thb3y`V_lSiPgcX|3{JR4yFOmUyq z;?`GKT0Vp!*)`&If2cwm+)o)gLK%MuwJ?V1SDYD^50n(*e-Av-g=A}H(7|nPS!B}Y zYX)5QOQAkw7w{H|mDN~F+UhnGwt)VkbD2OU@mn9f2zL|{#=ioQA^x0t-Um2oI_1!f z_pK1l*Bq5qQTqf*`&c&0iv28^bfG>vji<2TgSSMB{Gni@9jnUVvfg*2hxe@=lym=& z7Eu_)b3G-U<u#h=LSN=LIPWTrj5OU7P{QR0|1;#|@>??8;rgeo!BaD}?WV)Gh#=U* zoCThrw%oAU8!Ja-YHi3I_ndRV@j=9*vAWuls@^W-PWkZd1BV|oi)ZA)h2+J%gleAH zqK3E>n%|0Hqx)y9H;>_!n^ihQmnZWp2YYZw<Tucfnu>xn&+V7gs?vCP*8!)%W|TnQ zjRepSjr^?CNP7Y#g;P)uHFg3j?UfbauN^9Q^Bti_eRnfLcpaPX0@hk(*VWqeEK|>% z40mPIzXy&NP|n<Dw5Nx%d^<epD~-LnbM{LEzx_{64{y+g6Zv_s?d$K;|J17fNg$#y zZ(kiup%0`(pUj%feHR7Ie=9aAvUck=q4}!iqayJWM+po(sNWRd&{VD@!NSOdAYrqA z1|zXUO;?3ZnvJSxQnC7gZP@u*>?xz`KS;}C!-P;Un80zT;4rX{$d!V0u-tllj&W7a z3(2lwv8&@YA%3k+9go?i^iZQe<NNuRlbwL+AW@zQ|Ha5W^K9Ywt&qmTf;sG{;w?qg zl_P$f2iuPLFnn1zg<(Fh`94Cz?MVzDbZ6t^crmC!)BqsDD?x>-!wdtzBhMO(6!T}| znkxWDX~zc?ujGO(ux<!Le*uBrvrG=#Ym7~vXC`CU2<B#omZ8m1+igk@R+t_B^~O+y zlBU@@^YlAcrmwcil9>W7Or?2RKSc7NWCKUz0ZxF|l>e=_+qp+Gi?cZ7{Ovd%nfMLS z&y{D!yW%ol$Av-4rhqR*M#QETu#He%HzkHh&<2^J?|$a)Fkjf4lkSt;?{u`DUEEfA zS>EVR{CCz^kyjTCat_KK34*1i$YlRje`N*XA4ELj+!>K44H}|zMfUdn9>?}XCO&D6 z3~dXndt?Ce;gbgORXG*S^t{fs-=`9)1!eLHZC*$;$Lrtdv<x*8$Fj%6ujChoWt_Wy zwh=q-wpvP)pi~#avS+!h+U!`%2%2j%MwP%}?o#?TC-X-$%C~xTIKk_gIN51rruV<) zr;d4}_y1dpwxf-g@>?AU4iryYn%M`nJ3Pwg=SvV2b7RPOf5m--cIkMjxdTKXDtzUe z*Q8xmApKkkxcix}KB+&ApXkFdid~Yw+xphkI80||WWXS2R`=pp<%_{T`s&9jtEHoE z&=cleU(ej4wKM%2JUOl^l^C^Acu?n1@=btPSVk}Y+VWiJoqVJ+>_km#Y5N-DaTe9p zH;y#S$>{NbHvxxVf`cAvyY=#Ye4Q;T(0KClAgtvSy!yIfNIDG?)^YDD*ybvqRvFg( zuZ3F!2)ai%b>YkqP5Vr<6S-zr)~Sw(mQXjMwXnAl#{L0ematha3OkniIJj+dyM-+= z!a*PVsF+WQ{-y|@v2$j-_m)TKWiv1UD)w}0uVKj>UAIkA<GvJ-D~gB?6zvM+^g^w` zroz$L{U!V4;T2PHgCbpHIVV|(*w-T<1-S<W4^QOHH$UW)7$5Ta=|7c7SQY3<$>0mE z-PIS+_i26HX#5uzgnx!Ma;`W&JR4&Gfdrs!>!i?dFD2`Ctvrs{mcqGB{+sNlatW?) zlr`BAN*@cJXCj>0L)N`RC;p5sLjH291a}xx3~{+21BOoLL!_qc#^TcI^B={(|C@^a z^Lb(3Fo7J`&IK8zb1t{wyP}y*j(ho9IRzF4fm(&=_EApm7=5a%jyb119QFL34G8Up zEngU#wqRYxPV9TwWxe0w$#!_5|8zY*(&#auuYIeyjeQ47zInS=c;U>$1NTO&q$Yhv z{fn+g)rt3$MUvuwExi9_Pbz;i#n2X?N08E1dm$-kAoeMz4#eB3A@cC?pPQ>9M<*cx zP$189S!L^~Re0{|Sz2Sq>X+Qdr$l=#l_hFlo`h=EwCWb9T#M83eNVLcDc=*dU>)?@ z%jPNGQ2)vZ7kf4P^=pk6VSD$QL5cP4s>j;lSGZqdXx^)``-Xh_(eiMN{khv!zFM;5 zswm0v-uaV5P3!TKQ~It7ch4v8)2p|fxnrk3hJ}hO$dE=qDpDtd!uC_{)nNFYsnuCa zrqLysm&xc4!=-cA&GC$z0gKJ|lcT+Mf0@7w^QD&Cc}mnkG5i4A{ExLbF+elc9CUnD z6Kdje1-QX^+34>fz_P4WwK3#t7cra-`H=p-KxW#o8=AH})C!B<eG3|YOn1DAzet|J zl$Y*JKoZ`LX@7q9yyerj(5hBOdd%3w?GLYh7!T8V>zaRVbOP^KFi7XQu3Am<Krg0f zvT)}#F#(7co%4{Jw2^<Z$gM8s{i9XFs*iK}gR^VQa5<j&v~BH|n;45}fc4NQu|d48 zN^DogeubYf_yxpB54DUGD3;b(edbhja;|6n{YLi@_P~TQ-uLFa*|!1OvYvcT2jXzN zI}d6TpQmNB{(E`AB_l+`sS^F|-1Ru~R#)7ZRGRH+hxQGLtX!S7J2Ic#Xf$iB#q$x7 z?=Aq7m8;4D>ram3DuY@kxw|mps!Bfjp)S6m$^B6nKgf@CZ8g;4Sxy&}0c1fEPlU&J z?QB|2kjhmrHQCCCHQElf79n!L%vpN8eO-5A?6&=K6z0V@VO=-cYK%}__rfb>P(zs8 zwLEw9bAlui@M@bmCVT`Nl@b431O64A<t~j1kd@$hjyZ?QsdL_j6RkF1ueE<=y%)|v z`|igt#|F>~yu7*Quvsm?13uXYVzxX_IBIj_xe0u)oo{6)43dQ^!A}>C4;NgV5Ybr~ zu(ZgQ0<q&NmlL_+Tk~wooX>{^RvxKWH(||N0JANDj|HZ$fnR8IHlA!=bnp?C051L8 zIg4&yL_JLK+(y`pB(-HmPc578l~GMDU6VM$ZOi|zhayBZu`S&<j<!#Y@@lMRt32gt zG{5niyu5vNDdC-OuLvZ?nM;)+`;W>X#+*){pW93Xl--TSQ1FkxGia<(y=O{eYDqqs zwGLE2@%BV_pL(DRPOo-Mf6G+at_?tOMl^gli3zKh!<aQYaN-uWPKHqJD;GM;sqddh z!2g5|A{5y8gW1Hg<D~L8-tQTMzjsMO4-kuNw2)Xgk{O<-%p!|*SJ02-Btvq(`r`O+ zhg2Y=UD0e*0{Oab%wL%K-<GsG!{`hhBc4J7vAa*F5wX{Gu+ZdExM^n&_(f#B<S@Ii zC_RV+?AdttFymPKQ_L@^F&`0gZ2%Nz?J(*+Jj0Mr9y#$6UirXiEaKXYmFTwYGSY=Q z$_cXdvDywjvT*u`)a`${xB2p)y^Yb^uivyr*J&RVNt3bLN1;R73!1gm=Of=mYeC;S zwJuMB%smI2TgUEPRL$j)NU=e2V+p&#(0p$ILkpO~Mt^}OhaytX-zo}ywYf#*R~GtW zgj{aiP-Gt_!E`*tWmV1i@3D}Nf^3*-yA9P=y-9mZh*)+uG3nGcfP*Ii$ho;+$r=v5 zpQEcPK(jS`cK71jzomQYg2innrj=<<qD4$v8frS(=E?{Sip+GVRB<}~sDo|{`;?&f zo$o=OdysR{;bU6)7>M^1baMzarvl@Bp3#N-aAu{JCCyP?N%4pqphKmlgGLayn6(~J z>pDN|rz1$R?~I+jrHdGBUbJZqy{wE_d7v({gT0XiF0oB2xVpeZh<cs{Sl$*<0Fl$0 zbSm@``tJi)ETq-PyXeUUG<~>d1l2pL^mM|6uk+X$=*P%g=-VD^crK)CZ);n;AS)eQ za2J&aKO1*=68tPq-BZnx3esF7DD4$~EwwY8cBAlH`q4IdKua&+WD|E>0Xlwkewe76 zw4_=sc_5E^UECqQpftN(wKk>Rm;Z507mGT6SCUKZQAhFD+f_fTLsy!LH~k9ZP*Pkx z3RcJ<RzMiKhk1QS<rt4UI+m5CWjUTxxI!C4fr-z}TDbsJXMLdX=9qL{%ne@3g6yY| z+y~TSV)w#Fbds<q=ZB=@-OGNI@2$(uTY>X)i{junIX~ImyXBD2Yu6Zw?4ktTc+@+2 zJ<r>@06ysY<nHZNYaCMFktjeE#s*g}?3CkRG$dyN&9{3h%p{gTDb$+?^!rRtgYW^4 z{E+}~mw4)^DpTVyGVOY(?n4t!xwT{PdV9jk;CgZlzJ?GuBIzDr_DSf1){@ejFHV{H zBFcn>DRDAx1AI>$MZVfxJ-7<%kh*I5#PPE%MZEVNJmxymDc*=r+NOi*vrYb7xOB6! zXudRg%`fQLX6d^Ja*UkmpQGSdK4J_%rPAQpzLZyqHGd~&Q`aKK?X^L%=>AL0DcOdv zjVvxa*#8NJ4ECoqGEWD55%3=-xR_mfSKE0<(s5^SQM2uX_bHOQ<-QWE$;`ykm}@h| zy$^1KCBiFlC)L56^){ezE_Ek)so|eVs^T|~Ri)@Lg@Y`;IsJ1<GKSao=#<`Ci-|Gj z0i{zP-pH`-6;KDcC0Ub=T7DnBd%7N4Dc5qlN>=hz_;J{J8r2K$s#4*se}o5x$>Nj% zC%C-QeMwO!U;hkg9o?diY<U6t8wT3<m3AHs;KX(4m_QX0<sQ$eq@hCl8?uHltRER^ zarq3~+nT5Guco4Po1s4QXu2p|LD*lG4X5N0HjmjGf>5z21)ZaUPl-p|Y>iPF(7a>M zBsx|9Xv3a}{BI(zg{Dk*Kj*H61a2IXxafyk`FkPHb#Tnx3(--ekpJv-FTGj2#8B#Q zvtyA^_1So@w-Tvb%8}VYCHPK0Ei5iD=PNb#WG}z)`clGS9w<yDScq_kH}7A<q$Je> zRWkVcj)>+bYu@M64|Qf7vVr`KO%=d#R6KX-l~PW5WL6qYk?vD~1Px1_8!X@R)+I`l zS2f&+8}FILrlT8Y!sl6^>Kf)%Jl5xweiqHws&^$)-c2ms*C74s2zYPLF{4*uKQ!s; zD|5degYIOnu?%@>&mM;LY%_Zu_02f&^>UZ&BXe7AEAM%+<UGHo5Y4G^M^LoqZyz03 ziFRA%jp!a0nIqi9)57cF&P-E`|L%*}J)V63sFV|YI)&o}o)s*dO=~7%lU2O}Lzks+ zql<YW=!&qEs)Y`5B4k!xlsLObclpv#pT=d4)z$;=-kcEk$KC+0Pyemdrsb%r>ee?y zC+r*%1pobn>|)XrM`FN}AN}0Ib$_3FP^P17^ZD$d#5U-O$9k)wR0M;K&)2-4FxL9V zAH$Na;WR&n(Fhv}d)pVUW#PN2rRQm;7S@^N*H-^|xk09M=fNAV%`kVKNNjss5yfnd zq-JwJ?KAI;fbcf+*k>?a$T#i#Ri!NCH;ByH%rs2frO>L|HZnNIEE+p8$LqcVyB^Ww zqVY1~xIF37uc2=QvSz6aXi8$WzHoh_RaaiC85jxEzR~@*Cra~qETtcC^P5$P0@z#; zGG;TdpVphf8mEiXcE*<z0iFe=!6|=vCk6cA`~MUW?^AZ75c(S*S&sOE&HC>dOk@#+ zGS4k6(|?8O#%O%^ezXSw;myap-|i5%H%|*VW}@VNnNc0fNo1<9Znq@jsn;xIz$Mzw zt06`yL6l1L+Ms;X-SrYRrpfihSUS+@m$>&<Zxd%e4T269{eREiNW;dS(H!6$J(gRo zh&s~*FR0GkT58^3Tl;=#{iXZHr`P{Te<m<llQHe&yOt|4ktnjKBLn#gorZL%d!FFx zu6ABrS7(e2VbnS-5_%EbPZUQfKm5k?HAm7F@(v5S&5}$H?F4BM#s9#x0>{9<(cTr3 zaUXyqFV5;ki2xSHx2P2CKw26sUW#F7P96y-6t0T^!DbnkQRuL5%|~t-p2mbp`U{V# z4}AZ{Mx(Fb{ew69lc>lq0Ju2mKg)AEUQ8})H6>EGd7P_;Z*S*8qEzP6hMuJjs~XYY z!fu7SI`M>9=G`FU@E`Cx5#8UCzuFqvEax>e!NN!jEn1d_kiekK$04%2Y~JUe@0K2E zn<em}^Tewom`lWe7Shxx%<LXtJ@H%7>T509+w$d+!(zTvO<PQ7B%xyJJnXqeoYT{k zC<j=M1C7^oEPVNHfWUGKh&N1n{DQGycXXT-c#XTk?}FWf_Avdnt-$+5^W)_^+Eg~h zNZP0R;^GgMRBv{v=2ra|`e+Hn&)VbG_FOyhhD{IGUxJUz&xqzmJDRlWMuNR6KFq*5 z?Epy`Pf87?{44KCc+#Bl>I4)$3@)kP7$;LXpBZZ)atktIZsX*c!BB-+HAeYChx<oL zNCiRT)}p6DRQMX=726p({$MNFU#$=2D<O{W@!OVriktZsZWZK68LDv$zw<E=>BF~+ zg;aF73WGIzcmy)Oe_R#$)sH}~fzhAs`%bk5vOYQL^LtlG{+A8x1{rg%`PmyPI=<kZ z@s*5RAQkcGshxo7iJ;n~q5Athp;6Q3w`J)Pb!XYEJAyNv{bIVcLg1gQiyv-aEW(~V zwPLixA4VsW&|ClKG210Xg(tj8;kXuxeWB}mZx}oA(NJ<|S!aP!hSH~V0l;#9aEP@2 z^IHQuq0g}Q_rz$vYknxVxxzt8jA!w-@Zju^t)ND0pF`qHu^#O;Gv{y^nNfqy(~EyU zfP{}xNnB<)Rat6xx(%dqaOy!z;6n)g8{3(18Y;B1!m+pEj}I!+{t&b$EbJY_moO#Z zc-x=Uk#+i2ajShV+&^`9ORRC1+AB2yH+)&agpBEN*&A|puCcx`?Ue1dmvXKR{h@UB zcUQ$`Tr%BN7#K<mQy<2&TYTNPAirtPE%ULzbYzXn=nTS~2KvA$sU8z4W$LYUPfRXT z^PP9}3g^Ld?B=nbDn<Tr$mvgc3ps)?`4o}xpI09?QSc7jddQ*jxe&=T>D%-~sy%eK z4VsG*fPB}OT%Yz90B~f7p5_nl?~ufHq`d-<Lbm%lR`(xzO-E6Ufy&~1PdO%`hStx2 zRs;&aUccA8qZ_?Ws!#id`aBf?Y7zJunu^w_)ZAGnyqQ@1UWeU$EIJuA+bR$e%}G`5 z^oK}HEVKD{USm#q;R+_%hl+WJ`8FuG2E<&@uXfX@93s7<H%ymRVY@4!q=13@r9m1O z;dq+o%ty>wG-bb*=)I_1i+e9@wKT84)EZJB5-2sz=!u?ZoFd!xQ7THbr4qL#_rafd z&$%iqWMI)Vf}pX+IsvF1YZerVA8*PDU@CNfqjL**A+B>0T`<Cy)%)ag<B31u1zJ5D z2_})2RWH0{>*r#28-BBd>~20s&L`A0m!^S_bY~r<c(6!t;yqP%Cy<OaL#PDu+2lH- zX!YW0@HS>DaBQ5&7cW7FN*zDLn`{WkB877&hWP@xSP!lq?~c#cdK5scpLp|Um<6?E zSA4EGdM#>875?uA&mFI?H+vjBDEc~6-YVT#?CjRUzmh%+a0|=ne9pj~5@12IG<0Y5 zfIHrTT1XLSN>k3fDgoS@s>T-1lp#e`&ZnN3vw_OW!fWOr!v@397(q_s%{H$0Z>QQB z{v_x7%$r#w-rx;KjfZV1<S<k{v<7V|@*msT;VUKi#753Yd-(G5{m~kxbON4q7&EGQ zSt~=uMbJViL)AUc%}9Ul%>J%FU@}<%Q}wWmyZ@>c{QkW15d&K~TNoQ)b-%Sf?8LET zc4qYDQk;<gcH!=^NmI*En%*A6ZM7h>mID0kiXo@K{gO<zi9GJ)`oiP#NXT0jTiN|y zrzrzObP8h++bs#=%YE^f2-I8`k`${r_6#i4j+XOM9iQVKSE$zKrM4g6j9cx}r_4%y znf#sSCHRnv`twK4y>m%Rpso9-&7!bk0{J6XY}E1}##IT1-z=gNO<p(aK{WKqPdUc8 zo(_$MI=V-+|7!0Ms*$oC9SJ~SCj-mai+P#U+UNZe8sX^zeQSjlZ~L5hE$+L(t4%=t zQ|I-W9BTDfJl#X;E(mW&wq3<9X%xu`)nJ7aV1q5);snVmwH|rnTN-wj_XW81lRbWQ z<T9H-`Ecj`W|b1)R3|dIJAy;2d)7Go8Ph3VdMyfowjl}-3K<CV*q=~R1jx2LUhxrk zkxVM9sDBK$h3Z8YDxUfG!*I!WmW?mvSSZb9;>!~&mGRn<27T6SKGu6qK6ISroZnG- zkpdA-*_GsLj$=wE>M?=Rts<bn8ylLK(dRR&_C0h_AMh5Hb-W@wn*Q*%AOtU}U>`FW z^Qzd?f1RcW_rQhy9qv6fih|#?nPq?HfqJP_OY=)@_`-%PP(sC6d~4y7JtNQT?<Or^ zyMo83*p){UHorfyYb5a=Hde-6{w=|Pz8!^#(NobJoO|3<C;!elf+!jB=yyutK!ewC z4Ap6KbW@WJBQR=x;<>Byqr3Antk&T0xtzkD7_IWE_~Q_0n9*Ogh+HeWmDvRO4PGTV zbeYSkKQ#YybK2Jx1#n5(YW5QrBGw<Y_ig5%;Zny=5cpN9+{d(Qy3}Ld20Luonwf7c zDZx8P>};@N@Mf5~F7vc{{N7Yvb>2`xMbD>rUcs5oD$e{ExPoTZ(gq6r$jOw%WDSF2 zVxE2h{kBteD~%FZG2NYwmQ(~$j)}mFAKdxmB>7yTp~vlJ><sCL`?PmIYfq+-f;Swh z4D$R5;{<8wWbSO9G?PA^s^<MC2L05R^^2HI$LEz(yx+`@ou~P#4}rJQx{7zH>96`E zL=%YnZlt%MbUcZ$HJP~_4koU@3EB7?Hx~|)<e_d3P6qN{Rnd{%*%XH=`jY?7)+};k z8Z@X1(}C(v#a}Q}ntC9Fp)OKXp}suW*3jt0uu9xKlJIf=t626^Egy>BUYX^S{Q;T? z-fe}j1_$Fgs5#PR<G}`6|0H*q?TPA_EJx>$2gmMxW9k^!h@=~@w1Vw*nISJf%d<A# zV?5*g{JpCWi_0wcYoWAk>mu2helWVQapI@wv3tl*?`2(#3A(eL8TUa|y!PVz>Hqa% z;T;$r{SM0M;xqI&jq*%D?n!mbjil(`e2WmiG?Wj^WWdE0uu<cQsm(esH8Ia4S&Xp$ z_p7rDs7H5~P$I?~g84EvJ@COG#L__7wtA#Vgo~JI7(^vEUsVN~y06O8ZzpGRkB#73 zRI^zYQ&tRhw%SbkbT&OQ)rIFlu?fkM-_&MG)kghL$D_Fpr1!%<ScC#MZ$JAt^K9nn zo9od@&HO!#U5PahpPdA7J&&{3k5>3RNES8H%w6sdgda;i-@0nYOD3&YLK?jLe5@*3 zHv?RSpg<|{Uh(44@kcbJE$qgPuG@Hm#*|-i!t7Y%gDR}w9j|Z&HE=g@WHK%;j77-k z*%_DKuqTff!i}Xq-4_AjUVw3t9_QPCzqZ>rT{L<3mrotYkYiqKr^IvE^VA8b{aXX+ z1IEr+H`=hhTXq@3xl9x}{jH@=kS>)HW}FXqec#0Q%6h+yLiGSw9C%r<Uj4Kqny}4< z9bQJPba8%2x+n?TCi8y(bldhJkooyxxK?H?`8Y>?yw8t!hgQ1dJhZWZw;VBHySy-C zZuyqtO4s$6yn$wr+T5pCa9+w5(5u6nw>B`D!H1&p|AyY<LxL4?h`I;V1c}tfs<Wtf z&)4?FKg~A(r)f0dLko*QHC_bD3@%wTNBrn{8(~6yNXOvbuEUT~C-5*JHfP*M7dZ0Z zoK^^7KRj;BQ~sCm8_y}1ru9+e@ll^*Yx*#fEs|AD3MB}be8h?bIlbY$5s*E(Rr8(e zn)cb)2qWACfA5;dj~_}Og{+kZd7O3r1O$<8MCC16zp<@~?FCmJ=q!LFSgt>wy#JYo z`!{R=MKXCP7GU(M$Dx*Vn-Pua4qPl`s3BVlA+Hkz71n_^<3wjW-uQRB_+4X^qr7(2 zZrmD^KK7+(8|mw|fyuh~<9ywU0qS@Sw>`wd@FwKXKT6O^@NK(S$}C@>He|?1^?yD( zA)BsV$^|LBUa1Vah#TK-_PBJ8*A?NNs9Fi`5#>NK`P={x33ICAAt{Fk`u6VxMfLS- z6DXTn1{cW(0tWp<CkciGet+YZwwzF^<<)$m5UyMH{1N?czR<-=?k)wWON|YC##vw% zX4DDyZ^q&3Aw=ep(vy+;DWDsI8N4o0Mn2{0{IYQ<pgHj_O0mZu4}xxm*~-i;T<9;k zZ_M>fHK$rjg}wg33nf>vk|YzB))5Wc?T-IBK7wgg(T*qMnq(|*qQmtr&iDIzvbZ1J zk)d;N%Q@ws(JbZZS14HtocEq3Gu`RkHhz>~&m(%l6!RyKz>d{YZg{b5+O9*{_gstC zY+dUmjYskkiwNeowCi2(${QbKe%ar~AryTEq-}j@14D85D`iI)W*@a4?=oT=MS3D= zqa%J^_=n@iyEjIUc$pqhU3Y&W)GL@F!`qg`x`E(|{Q$uRqzYf;r8p7Q_5(6n^@w!l z3aeLTWW(YeLi|6dOFmvvlL7yKJbeXQl;0Qa%mBmCT~b4L3DPk`cL+#Gmvo7=Ff^is zbV&;+-AZ?Nhje#$U4H-j-1`;I`|iEhUT3X!%E1x}yce{r$~|?fH1lA;DL9`QY#{Hu zK?o(SzFrH5aKy$PKk)UMwDI6fBa~MCOR2%DsavP1YdL}XazJ4V@p6)-FDI)Z^Kl=} z&bS*%l|-e8uIsH!3c@|>>AW$=%&)7ku=Q=XOm&fgr(y`kDnDc9`g%AhuVhspHEcpe zn!J1~QK(0tXIsw(#oy@L`aCVbV<s^O20>a#_2k9*uofvAQ=p3%JPwi>ME5&jeEj!8 zvcU2~z8oijQ{1t&ioY1SiQ<8+!7y=6!{)D2ewp8=(xdX43N`o*0TIBsZWYY^9!;V; z_aPl}xFl+dc9cqlWzC6Gyp@HEn0xbaIWSZz!x^JO;i3L`XZMk#UI*i87R5hKryMEs zFdG(h=$D@I=ig-fwZV@M4c6k`Buwi8{>?K2HMmwoenwxj^2*rtv#L810YZahy%K|3 zKwQKFGU%Yf3^K?5m^>>@K`w{$aZJt0qm9D_xJGJ5T7;B(%>5H0c>m|l^X3mVsy+q# z)xgujDgMh>{bPz78XzR$skO&RS*7F_!Kr!k32$6FLLt5LSIE5L<|;L5AnYooVL*c% zp%nf;e1c2E|NVnT-&182wU{dvbnd~C8wh2_LZaWhwj=-q)W2CL`yIi($CYUtk6Gh9 zwZ$a;nJ}YITb1U(E2Zds#o^#7K)SdpAG|1)=6-V}gDYj<HFLG!^}INL&3ieGW3Z@Y z%FgcZg302soi@P}kNs+anXrRy3za?=noNR}p=f$OyF!VeEBml$5rkILV@yYH>6bAD z>XMZs?DMxTjL8QEO0BqJr|GHx&F6uSCbJ5c7)gmru|FH>=I<VCZ5~mb^YBagqO~p( zl>i{^t!bHf$e*R2pKSsd7#tjiknvuhFnr-2cc?q$G-<RGk{vI}xXhkkxKUc?%=V({ znxHEi%B&hiPF96qfu%nHJkT?MVvEk=P@?-ix^|C5(eLgn<2zhi51cFOUcRk#BU9K& zHU%RFFg`~+M}H9lyc%!Q(r>}Q%y18*w`G`-kP}|&Lleb4uz4cN*F#6pOxn%xik9vN zdw&48AzG71P|UyKd#={3YpY9%UjXirqVLtPbT0*A*~=Dna;R@tA0GGP;-5UHzYgns z0tf$Xz$`B&mcb~lpwAziW}p4@YLuGhqX@d^TS+kp=V8$`S~8XXkpP1vyF-=FN(^aV z-f+dORekiUb@1nnH32RH8OWh!ubV$!qtdoD>HeGeqNeif$M%CHY2w_~i?6F|4QuFV zL4HDB{^L#WVqw#hYdqlt58&B@P3Q2a+d4AxB9*edip1(ryd2A?BA>nR`@nqlHyXB# z&C%&+1P{*5Ewo6mm25Oyj}9LZ7sKR(SJe+FjC((IOyCz-knb66NMFadWuk^DZH;=f zX*4Z{bay&;IKTuNXOZ4jox=6Ze!fe+#C`d3`(CUZ0ks+*cen3?pYqF83u!Siqb4L1 zC{o{JGxvjxx~WE{6aht*%N<xIBY8@1%=o!O)FK1o?cx_Lg8(tdqXGed;UkYha@(A$ zNee;?mnN`8@j8hqL0q4Gdd`qPSv8>Xi&uJ<ip!G%4Rgf8`=q0OYs->zr|pr3te<bJ z?0Hb#t-!Em>T?f<pE}yoEZOB#y~mD1Q^`GE3bc(#i657rBB_Zn5AWCaH*@E-cXf~3 zk~R803faFh1l~9}uc(=VEhE;84T6ee6)NE1oKSk;4$t2i25ad^NvTat1))v8u)=*T zt_m;a><|*mTenf9Lk!9Zf|EQgu;*j$N4@6{5Q4@0drOL~_kg3)!x#Jl7IwrlKN}%D z=s^D#XcELZ8jFk1<i4IKN*}W$r-hdNF1*mAdDg>@79i4cmDOnNH&zS>a5X-z>q(r= z`E;cUc-=~6qXQ~&0R9<#X6cbDmJC3PV}Qj;5^|97zk0M$$ZloaMqcs5SfT#s=?yu6 z)5d3%!aW{XF7m_MCX-591^~#PMy}kl!meE6EpNGL|9cC_#@?H1jULs#lkuw=$Dq;c z!trCrxFDDG8===9Uq-Xbi)RC7Ihm&TMo%RA^U$%*)1fxvUSGk$CqwmvTS-u0zqDz@ zj>|~z@Hjp2=UvSk^y|Njj)t28Cq^nwVrZ=$%{hgu+^P5SlJp&!*1^Hm687{+06t|> zJke`_pi)2}BNIw}%4^Fnoo~(C-a59%;*UbpoSfT(j6bwQ`J*O25{Is0Chgn2$?_t3 z`K@N*FE=uWfG>9nPd{3=r*OEbF7r^i(Wfg)-p_FZ39!v1+ieca7OwB^>f=Es1({;= z#DKxY{bN%!ybYS#i#K2>>l7Gad}kRKM7oH?L%E{!aHcFF{ed}upQpbVsq)h=g7Dd| zqj40k3R7XFj5~f5tPC2`CI>rgrGsp0F)ZgB@_PaGey^Dn=%icf*wEuif>U4%^P_+D zH_I0Z%Z*6X6aUHrQe;8smH#+G@JNpBbr<rdybxJ_e4{(p^?q<|u^|y*Q`CBjVEW=H zy&!nJfyiOp`k&-TBxq7IT<}5MNC-nmoNg7t?IKO%3A$+fV!fAi7^Yx<eaUq0|1A)Y zP}mAKZ-gqvb@r|uyiVZ#9jb}aZ6A&lf`>M5G14uW&A_0`&J~|`Isrr@Klw;AsseUX z4Pbhtcw*_Z_>EY2d^t@Q9+XzO7fQhr#gr6cWhbM4F<E82spfSe*HlaL-D*fA?Qpsl zJ;H<r6+Viv;;$0ny(}vt8|%@?7!r@lM1F!~$hV0t=J5XR4+>cArkZGBEnUzF3C+a5 z#IpW$214}B=SBU6_8^_oDxl6(N=G5_l`Hro^Qele-RXdM)#k|+_E0;B<xqYmU=;E= z$M^OX{{V0GlU!$gnV9!(daF{UdEX)HfOYe}wam_WRe2o|+IBnSkC=Xf9{CKQUpUT5 zW;r<h-an%0iUdmB&bt}QV;ipUe2T3Da^Gag6mVrreaP+VeD;{Tc#KhR-Bt*Z#Nss~ zZ=6_Y{X#pK1mt{!t5nPM3y_sgGX9JC<T%?DKI~H7|7u&5lbkfrL^NJ9G)IbtPJ|r; z@n<$S<pE-3i!sZ4Z#LamTy!U4>_Y`|_HYn^v~yRNFe)~#U_5*~{rcc(G${?zA~koT zqz{(I6hD!y1?$cV?W>MVzd%{ZhGYLnlp9p>`z3U0sjNw#)4cQ>i#LehZ<9a>m{h2k z^;MDgc)q6}F`-^zEKf3<4M_3Z!eJ;GxU6Z5<Tc+fRoa*o7*R)ZF%)O1wY2CU%s%oh z?wTj6f-B;tQh+{-d>K5L#&4;IshZr;Gj@G7qEY=udd+|!f=>*tq4fsMQ!24(<+c}# z3>Wt}KwP+hO#S+C93AW7HThY{zsG+PD2atBi5fz^+gj_Co?kws5%+voCN%kWP*M91 zhOtD8NDtv}ID_L`01m$dTc{wCrO{UM3G!nrsKM{vvrhj`{&3GW!Uz<wmI=7N>(>e3 zxAJ{b;=jg2G}z6-alwI$RN<s%Ae~3SM|%HBXAoAjem`-o(l3)7FpdEvSaSBrO}L@z zvQB6}^Wbc#(}^mi<{&nC!BgpyzI;p6e8DLH?&GU_<@$TCVYHPfKXKKJvGejlpHPe^ zL=`UAkYlf>m{MJZqNCaQ43p;xL3Qi9o|CtmeJU1h934{q&E#sa2c4&GxHhk%m-bae z=ody=6}~IP7=7sU>(!sEVS9?8WvOJJ?pd<O+VJ|-24jiHdDR;FcvO4jlM~MbgSBIF zG^C<G%Xc;=SSO$_Q-OeR=Bnf-T^z(#&&FHapqlblB5(5`q)+e&!c2rKTQGe$QthkS zPtR5&eQ%#Dqe<rG{Xm7R>ef^6S`l`@6A-eqbrhx6;t0Lpzs<tG?l~+2v}ywON=;DU z(C}e)Jme{jyykrBV+zBDD-1A|bj)mtp`phI3SJ^w6t2oYp3ci@0_RqV$^g|jL3|Qo zJ-%+Go?19C2LGIN^MXI$Fd-4<pJl<lOMco1n6L-I4;h3&Mf6={ACgp9pfD)pxH+1( zYG)Z^J;}UqQOf`~<^nCRC(@*AjS^ZTi&~xLp_P#@B1myP%xIZ8x04=JjNB+SA}Bv| zJAJp9Xn-7D>$)3CKPRc76=TV;;f1Ds>9!wVL<g@#{ZWEjK*fwl%6jpt*7mCUf@t$H zCDJo8<=oB>=d4h!9&ABs*S8v6=17kG#vTyDlEN{2ua&KN;1*8|iEGea$6k?YYow7& zDQu?sjS8Xnrv>h0Fq?CxwUr|UIUe6X%)tKYOI`ix*sKSXzFzyE53Kk<A6OnUk}0kC z3GGqbqe65<28G~EeTm9YqPu05h~AEA*w}bw)5c|!8&9<2)7PQUp|JeS)UZqYISF#9 zO9ZvgY&XyVrOI2cfjW8KSiPZ;cJ8{h%!)oU3NNchA{bXb48R*Y9s4u<ZUip`i;~7n zWgD9j4lX>61P-$&uiCR*o^EF>ETTu4A$euMOY91bx;64_xHHjpyUTMV#7WByMdEAa zP?Q9zcng11lqRA6J7S36teU{lm8d)0<yqSX(GZ@KTT^pm-!XnZKEA<7&Y2!6Qw4P< z3x+r)^D*foaTuV%wfA-D&3r45i--uU?FtmK75(TvWf<}4F)FqakQN0F%hX;{ji8&w z1jx1Q@SaKyilM-|zCc(-)G8EOG3Zl1jF_hK4E0Z|X+l{!(szB?6?c>^f0_Oq>m0#r z%tbvZv=xvx%bHhxKmQu~MLLLGiDmWP$ar~BSsN(WV)Sdhu1$h(&J?=qL-vmTCS4Yi zhcy3Ngw*<+HuV%;cCCQtlY2R~E;d9_01W|M<mQ!^lx|;inttF=E$U59{*8Qy8m6Hv zQ7)z&PI%F~SYl3Yp7W9GcdBcilZVg&&R?JwN88LN(S0>|hQP+D1!7+$Pi3Io@|GKx zY00bWL|kq#1n(Cy;6nLlVM>cxO@n8T?RD2-E{)u(6IXSu1uIkJ>;LBC*19P_DOjLE zZHUQx2YUnm#E1O1sj+WbW3iuuLAZ}P?RaJiFXz%f0*u=YUBUciZHoob4k#K|VF}eH zSlXwv8)Ma!paIU~ID^iR9@J8s(CpP-80J`tU{g|S)EHdU2yc!xHQx}mGjh(R#MHbf z@((oORID^(Y(%?`J_jkcZO916E1UY#N-g}G5O0#S6BE(W4_ceY#)7hI&RfqptlN>; z0kR<q>ofRM&7CBO>LG`==!^hQ0-~<uwP>Sw10}++M;^(e^?gY)JNR#3#T1abA|v-( zym;{sC$D-L+%5T_*iRAHI4+r@A8$Th6<w{@F3`Fq5u`WJIXn6FV$35ua=~xw$EkXp zRWFgVzd@~kS!G)Z-B7zE;|J6(N=+POALE>qe?gE_#7_fm&^1K%Vr7BcoAV^)l)r;m zsp9~@vm|z(i{#Zm0DRLpMst>5qb|0OSBaGoQ+j`_DCBm|?q&FG2s^Kb1c2rJz=#YW z76JLH!eCDmIsdMdL_<6L--&qW7#hXxS91fimEz#cxXBo-2ReIsJ|HtWWW&76au9J5 zkYk2!+(7O~wSvvQ{<Qq=f1UvcHb@7z8=Cly-~;GX^MOf1)8C>@yuN!WEw6-}6$uU} zEU`4N5)xt(dVB+LuJstRj9ceCH9(P6hug<YJ&Bq|nq(<=!;oaJpvV7u?oV0nA<SW( zeZM7}%9MYxNwZ*a-+~q<1N;_}$*bQ&10d!Ul}T{(wvr7{%;A@;fS{a<E>dd|;GRB! zccf$3YPe^j&F+bFeOtz_<iJk>yb_@H_F(_v=r3WGgi;43%&W85pW?dtYipD0#9|!* zv5+kIrqgT`)~}THEqCcmdA|+NnA6^Z^HgL9KW11Th?gt~87<c3S6&b6Y&odraAn%r z2v7O_^ySuqQ15#mQgS^~yA4e!><E^V4S4m>-!)&$`YV<72Lp6sXy+XWl>!90aemAb zCm#iZRMG#;ZC_HS)_IA(RI{!Ai;mGcuz<4h;QHv<JF(3~B$>luBHtmfANL<JPM`_L z+Q5v@@e9(}-)@AvB?(j992)$3Gl#e2GjW{MChAhFiER>Fk-c-P6E9Ae8<uK08pwwz z@O8QwThFkOV2ix2!wj&MYo=T{OhdO}YUS%Pw!AbN$O1;>t@K#>V?DixFQYokbm*t# zpJ$BK0`Km*Q9zAbI_lIGTdjgdCK=S+D%Vgx!g&xRfh*9_aw7|1D;8o2KWWS!!d&#k zIp_>k71Y^~1y@rE?ws-0Yyv+iT!j2^o^v_?nU9Sc^tUhp#mktAf+a1!WsT#IuC=Ox zytC2Xaz4vdRF315G7t4;Y2`+tfzn^$q@h$KVcdg7M=pV;3csIrJTY1qYt~<8g!;lF z9)T3zpco2?`KCqqI=2q%SDHMPg9rKGU_`bi1C!0TC{yk7{ZBl~HmfIpiig}YkyTvW zPI@uysVzja@{yF+`z-18MoQNxB!*sRSHLC6R0b^0RV#(-e$11Ig-nK@#ctf9Cfh0L z!Ci5iy)M(k&4MraMvi?jY3Z%K7ePm@ahqeyyA@-M2Sq-#8s@mS`j~tawwZ6=uRgqz zGf8zE**DS@;>IN3p*H7b63-Yw)l2Z2^D)BrP#FAFaCvp^`=cWUrA6_%+CFySK3Vr` zWwu*z5brWt6K`i$UZ@Z+xCUEB(BZa6dG@Oo^DsehNTZe!0+VuqnHf$)BPqLruN3)1 z^(3zIj_~;4*T2ecY?E7HGb;VBAeYAWTh}`g)D_Mbo~<&F8xz@MUjg?wsuN1n<<|p} zn`f%a4ck|4RekLAg;~U|_BQB4gTvxmI*?Xrm*MAa1hv9Sehg=dfw5K#+bi*~TU_!6 zUB-PRTko5Xb4?$)|H(IcQV+h76X-?yK=4@Td0c;E_*Mo=-LfS>i2FN&+0i_m#43z( zXx0M@_BUtI52>x?-I)^&T8(tOCQ0?Pu>k<n5cnN}i`9|Z?V|L#B^~D|d44oJvrW9% z_o!hNplP0jXnq5PjzbnA`54fqsb#;Zi%C-AAR6Vbrp9}wsu?5J!%aA9rYMvjDJS(t zrw{X@f-tST5mPpinl}l=hWA+|I^jC5l*jugDr5fKKw)E5e>s5T3&=<LuO;!Ngtc+f zdb)@03V5G$J)%7Z(RS<qQb|m-5|p9b5T15WF*1rvG6n!doP2ItNfp?wCR0&H#U6io zs$yQP<_N3Bb9OMWat#2H-!*c*bH>`EZ568Ji0T98Yrurm+cOjM9=I69L!`SAU$na# z<JfE1LT|;yS3C?c$TM#RmeN$Pp8g()k06sim4M7mOtA?Ul_?+wtwN{{4G2?RspYc3 zHIp6paM$v0SkP%4s;?wpjfFja#{-d$M{jd=RywDuJEjyzD{~ZnV%M0{>>tI+#bC)N zv{n%QaTKyrP{6#9EN7oH*Cp$_AKB9FyGu-5!d|Lf#zh>>Qx=@_L_Itd?K1*C=~M+l zF@s(RSoO7#m5{0o(OZ)xUxLj3PNvuDELN3?SfQs$7H9!KgHI=}-d}%ip#p?EcV^q% zt64l{V@p4RV41CIBFJyMli^<;5UT(a`c2VOg&QKCqZN+lD1D|9TO2-_iY^M@UuNCa zJXl-2!F?n2O&H)2^lH6CHeIXpX$@Oc!J~&mzhxn*lN-vnKT!jsGgG=sdHEO+?wp-3 zsc6PWWxrW_&r$3J?3g2pDeYLG7IfgOF4I{yE4Mbu9}l<XUsRS}KacD#3WmZyrv4h6 zQIjhctI>!u)uM2}vEKt%hsV%hXdBSI`tBxM|D3=`y<h25r#1WQJ9aKGka=haWoP&T zYBE#3KJ(Fk)vB<}xjCJ2_ua#QI{~7}ZU#;o8sM&rhp$|Iazo4C9QeH4I>|>9WnN%v z-37}lPS~Rn&pd1}Mg`2QE^TvObBqb!=(-DQKC@(_ZdNi;?;|Wj4jMUa;iZ$?&QuJ1 zlOP6}o$FOQTul(9-@R>iMmYw+lw91x=f{ADUwrvB{)sKM1g+Bc$-b{c<g&w3Z~4*m zT=g4^_*K@T+f=kF`#mWjWs<{$`w<I6eW&BOPZ)IY)>G7B)pxEfRVIqchTnt&K0+&< zy4Q`39N_>($B_RB^{wzJYd9ec0idzx1~Uoi7R{0nIw0>!v2(0tsj^R+oS9KmyIzVj zo<p}lnEtW7pkh8!7|+al0H7n;js~~2C_vyQb8cAa|5FROw1v<mpHrqs)aS8==-egg z%5KKA!TewEa8I+;V~8Eb`4_hbA6}!I9M&DyeQS;yJwxJBh4DY-kr3q``DA05d|Nwy zhZX$2#SpVL<SqOtzrdTZ++52|I547<Ga(W|Jb<gE&;q(q|4G`%?CB-*BZi}zJ3N&p z5hVSC-RyUTSxhK|mgO(6um;_x0bdSs%<!Z?^*#9v-++529|-&ODr|b!(%azs{vi_z zejsttir?|1-udy~HU<S~CQ-tqCN-tY*B1M}N{EtcRj(XQ%J`7<)m+jKiCHOoZVi~? z?$_K*T4~k<E|2H5_`#(k=*>#^L3?oI$s+PLtU*^!wp}uOkZAJzJ(h<TD<=+e*An68 z42C|Z3Nuy!iwgbUX8eR@!8e4_`b;q^O$;%xzAI4*ieveD&mXi-ux@H%Qqya7dQ4^b zVf{x@!kv>l%E3p)MCU`s7Z3x$`u8|=xh>%V{L_$1^ny_TX|=_zz(=cYz~ad`t4br9 z27A+tHg`eTM5tm8K_wgt&0IrC#+CqUuH}5_3f-`Aj<C$_d24HhXxhXuHDP7#r$>%Y zjsIGh#C)?g%zDvgo;rfCaf!1kd|7XU=2t;OIH(M~nG4tB^YOoN+d|WMr&OX=od1Qs zYnBdpA62>e;3JT5X{5THt1nV4Ih(PEn6DcblYH!O_9%LjAaV3>w-M)c$4F_I;4jwK z(gR`)&Y>$<Uyaj`6MJzQV}Uz9$*80*EqoUb6@_>fYB<&T&=EN(V?kMN`0VReANcji zr1<`;PFQf<&>tABzhj}9j{4^em=;bJfM02Tz58%LuylRamlx}#>_sheRBD3yQjoPG z_?-A+&U~jIMQ@)oK}A4Hy9P&PKI=w2Y<s=-rG@>a{W5$6xv00yG59I`)x)P;YNdAq z8Dl2Z^DHM8J2XwAJ}%TiTOzB@LGkeY2uJ*vbkZ!7xA`k{U2N~;se>FcY-~-7f5qub z4cO3ZA{)}S&ao|DI~>GcNj4e3C_o+>M2xUvX8xckE~nt5gt;K3W?FAu1CM5hz0TX* z>pJPp<r{Mkz3<VF95E@1*T@3pT_vrvsz!zb<L6;us|nXKn3hU-UQw&MpeWHhgmSaN z2LBoLr#)!9tNd(sm(VWEbq~6loC~{x!f!m6lfA#LXn~vkFupZXKPLkIy<kK1w=efc zD~_<WwxB>N>G<ZUB(D=0@vMp(w>jlXn=E*zPnwF-e9Gd1vfp<=y3P2*z57@DRl@hR zP8L{i>*Er$SAS@_i#536wG(PVhaTajDIdUp;byaI9}EXOOOjG~Xk(GoVOCb+UqiFM zfsnYUng*i_C>_G=>#hWs@o&mdpYD>UXKUtK7RkB2P(6<e_p#j?jwHI_AK$=Ofn;p! ze*{c^PDOvms!BM255L>w)-TcQKSHs`s#eL1{pk>86iK$`!D=T+9v0BI@(}200inc! zJqT^~r1w5E^D|9s;MIp{oYGIJ&gh=?O%>S?t{OLE$2dwwZ-2h=GxApeEWM0zng7Ok z`Ah)xU`mbjW{c@=IgQl8@Qq4bi45ghhmovldE`c{!I2*xApLk|ccQPQ^hcTp=+AXy zq6L8&C!MZ%M_2*@np&xe4}FM!^uYGX9wlxwcw7pmM-t;8;nb+2*r_mqr=C$$j(v7) z^^G&40u3MIl?HU1CS<<!q@ZNSVGdl4|1eH!Vq^H7>C7daR)hPST<Ge`ogWEMQ#Xm8 zCVZp;2v_)SH6=tq`HuWD3lG}pMTpf~n=?^v<<|TBj#li+8j7e!3Urg#DZs~x>-<<@ znfu3?=oRCE-?pLb=;vLCy7<zC@#tq=CNR}@d-(z<5z28)Q-kvJzM2~WqM@qir5v)$ zBPW41QVgL~S=(#V1|Xi-0TEOdtu^cPd2fSpeO~>N_?`J<d!&UC&>oY?4}dt<2!gI- zP&b6yGh+ZVO;{IdK=HM2f-^~mNH=;&5_?num=UHdNv@l6*~eYamO_hvWBRiQe~gYl z=wXw<C`?0Fm8DIG&d{ya{}ePI$9{W!o1eKq;zaOJXWSwKiDyMQrGf*H<5sxc_(o7u z^NmE20AE=~8woYBVEpen-o=;m_~vp-%P*wwWln5Ke4K=D0L1iEVnlkvUZcs<LOEW= zFyVIalUUm#tvtq*q6Y;|`)SH-3IZ;4FPP26#>w5;Z-?DQyAqJ`{(bBALqyZA$eU6P zl2kpPZ%WtQUpk?@kZwn%mM@(GqH4DSQ|8;DY#!q}i~B~smasmbe^qk<M1!vf(4kQX zi!}U5d1L@NzZ=0~Joo2qB>D>UC`H0`m!j4gJC72+2tw^r!(C2J0-O&56BE{;hPtS+ zRzQu1F(I^-$)M$Xy4laLso^N~)<&XtJR0erJue>BnL`|t?80ir1otzMOn+k>P3xaG z^WZUmdSp?7MIfitbj-5=Fr}hh4#rr<EnXw_l4z+j!nv7kg=k^brT1mEOXNhUd$DkR zX=O82*f1Hv7p9<NHKs?6A+=;Ng{yD#`1Z$#EQ-{Z$NOxVakM=ubY$*ccu=beAfBdI z2H#HMwIlrsWF2!s2Dh-`x#v8}#`}>2_}{`r^uKVW{MXJoepseESP!RwCCL-)rPhXl zSML`}73LiR(L4G{qarKHj~KXi2hu4JX^X?uYL1?2_3=T?$j_tRV5q!9#Ew|)<V460 zn-;)J?bR1{&PaRhof{q4EVnXQF50XVjhZStdO-Xp9L_FZ`Pk{MKl;RdbqdZ{Ykj(X zYt5${4Q=C)y0wsCwPTCK4{Gt&Ys&Fo&hZev=7NuxRE&IFJ|}~TpZr{BI7#ZcIll$L zd%%1uhjWNU{ggto6~7;73A^&?%sSE}DS-icp*imWGCo#dbD?fJ)m0ByRost`)J#_w z=z~u#Q_=^N*?$JrW1wUsYQl7VKflI~hi!;nh=s<?CmN6#xq6AX<f|#zRw8??CiCQ8 zg_YDBME`aW*c&4=mBKUx5WR0MPI(J;@RZe(m=k@B4dQ1n*r<(LT=Z9cdY`5>)i11? zaJT)RNW-r0g$&P`$bp%0yEy#YK~oleiJKGb_CyhrmSav(Ex^or)BR@$oq2+Ae&)9E znhmf5;CMdw5PLpC)8D72e-<*$$odx<h<VX2BpN(iqM^BXYip9Eox9{4YY8!P&(0?o zru|w_q|wc$awyrHo=bp_H%cbZr;~vuAv$o;^9Sj@m?4*~wzlpo1M_b?cS)qzo(`W= zQK4dXMtilFtSU29F@OLZG*Trht;CcmCF|axv-EMsuyvkqDtJB#uK4{ojO>Fas>h4q zh>fZ)(&8A86^yET<ZQ)k&vI?t*N<3{P&0^yHxlXMM5dsPLYFN}ph)d0?GnGXfoPET zFw$8Y$Z-OI+fHuteKIj(<9c<WILot0K58H~?JzQ@A~6@?3ryNabG$w`MnZ%E{uwHv zw{zqE(7<JN&kkQJg&6MtY^?Gq|5O0AHZvm^8EQ$4Al=EwVxegf$h<zo0Kn=$Vz13z z{opp-{8&PsblN;r_Qr90T^cQVb`=tZBuJZhyiP>t-imGg8&g){$KEZb(FPFvQwIQx z=B;u@7(L#;YQMLQFkazjiiC#({#)_8r)5s>Zg2S@D0r0lgbv>NL(HTm1D?TU%A;n4 z78rS1L@CLc5BS3K@y=<abNxZ{AQ=1@UpHj6PiX#6rgB0Qzs(vk2d1M!pNbkP{JAba z&T+`6JO}Pz)ajLqHM#Trsu)ZBKAlrNqpW<v37YcG8&{WHFt;uTdissk#xxaKz9Vn? zQWP0d?$@7%4|!GGJK!I2#ys8nvJ;BFShEgXUcArD_PpGL;6!xd&d6jT;7nP4fHV&l zN|$>&^&1dR%umDLT9JeeTqBwOG(hM4sPpTf=lvz<8rol9(*;AJ)sdv$oUs9N(z>*| z8Y0h3Rs|#s^&byS5UdsKt)S@mBPqT0!!)S*SALnGPW!?@g;5K6l#er*1$rEG{$E@* zzo86MFnWe2>XoP^(98a04=|`{bxy+!<b(-2k3N;B{ALLixmh}S%eZX^L;oCB|7+x% z6WbQ|oX^z^ab?RD3+YeaUs0b|Pm%Qsz~Z1dKX9C_Wd9D+nL&G&8G<ke0>{V9Tp4n~ zYB&OY_76F9#Bx~hj9|E{G2;LyRFHM~5x>=tNI{ks1NNM{20j<Q!ubylQ@tq5=V@(E zRw7BooO$<*FEWc@o94C+H81JXbZAKo_ND=sm-|glNC@qZ)W%}wE)O%CemT;FPbdS- zf88A{DI}Q%m5=bMXsjWqU!>MD*uZcQEjD>2!>2KsH#f{IhtgLQboM{Wm<tEt)5B(E zwgQ<yV=RBIH*Cv($vE5bU%an_A!KFj1E{bFk*O@IK0EMbF-Yh+C6+I4s;VKfe%saN z<A6NJpn+6?4%1_aH3tm;3}uly&w=LpsLh(NxL!P2moEKt=7`?edrkUoSOzg%X`<-6 z*BD)fIvv|zI*$4PxE$!Oe(sq;+oqPg`MuQAFY~2wqRxp_(TT0I^jJSBI|*47<WZ5; zQvN@P3~1qvbg@IMaswyAzoqmA61@@o@A?uYhbfv-c7$<hb4z0E*=ggqCtVS@sr{lb z#7x<s9f&V3TYGU?^ZA8u{nHxX+49A``}_$H=I9W{h{k<Ewf-1%+<X0(hu){1XBqdg zQ-sjkJ)5;<=8R-XW^9Ofx=HRs*Gkri-9!vwO3`h|PSU#&%WsC#<DG&e1IkK^itQ3_ zF_vERyT_66#1DC{E2N{E+KT&Nz8{3wVQ=hf*(i;?baZf$fc;<O2)g*zIk4@sCZqEq z*y_HPsO!hl-+Oqa1_YvO{1VU?kMdvTyx~RfybG_u*t*xkun*_Koc2O(wx9Uw@YXbz zmQdzb8RfYlR`P^ViuyG~eOS4{7p35w<@5{|@L9Th<MSXWd|iurdoI!}w(Zd+<jm{d z2XOKt!1})(o3~S%ulNMKGo9-q<FrEdjl2m!o@-j|D>9*~L~FZNiN+U0ywtdx=GB4; zP|kclOItZ^PjHwwm#K{1eZ8QgbU?C;bOfODBBl6~FVf}<+LMP8wV6zfRK>Q@pNeut z{ah|Aw^I6b@c7rg@CQ@^Co1As4#u33-q)1^l+^ma5-KFN=hUS;(`0A92hUQpt$hKK zq&o$-Bo~{3*IS0)8cZ}cVk`$Z31CKPt3XUR^MOp1n66KBj${_~7k=c^YM_e?%Pyk~ zbn@naV)>O&W7;1zROaHAFsr3H1QTyLc+uLVdcZ9>iO(8G8W6&l_2+h@XzxmYM2;?T z@#xG^5&uz2erWy#Y%boufdg7v9&Pjb=4UTq{4Ua@X})#W7cp>oa}9h!Q)i_NFOq`r zVfnFoT*5py630EX&U-GgK-AHM*`MfL-|{jo@R?{ZiUJK2@b!gb8v6#)yq1*#)#2uk z3MX<^AzkH~r6k|+?kIPIr9h6z8-VwqOXbGer%#u-r%QQT(CWjBg{`;V>PTcLuN_B$ zQG^%yxR<z}fcyA(&aVjPj4LxP@7^seZ%rs$QR7=Xec>UEseho61x9w26NWu`8A_za zw%yW(xmE?|B)_pVbvTD^0uq+AU(uvyVaU(@I#*(l{XT1QHpx${^oRsllI|ejdHW3$ z8lKNP_EB7?Zl!sg|AB$OQ0)~VIG>`z90$B1yMyEK)=1mqkKw)*tCI(tCWlnvpnj*4 zGhBDupuDH_jAl<%yqXI3wWr46g}2J=t3*rZLKV!oI>C8K<U1Sw@N!<@^}a1rT1aKC z(G?Yy?=$KN&BdPqbzL{ZhAp)sW&#us3iBX%+C|dFeRBeU!ld(=3-#G!TjjfqJj)6} zr=L3dT_KUJ>e%il8r4D+xnPSlbH<TF1NnE-up+Ga?@|q4^m3@XB)Q?#F_!SYTYr$= z9_*th(z{U9c2WFEA#{8teyx?H<qzPJ>*soAMLB?Lfasg8>%SAvP7J_k>sDT#Y(W+v zr>@)L)TelXAs7;Wd2zpnXzv2YHC$YGj2Pd2&<3BbVGU?TEgbN@CpVrubaG;Y_gpg* zIV2}#Yv)WT<2UZ^anF(8nqwe#F4BaG`XMUvR<pf2{m$G5%+qNk?om0#@`1tnTUpHa zzX4G-hh4ucvA--hHiXt2c`2@CvNtNxcQv8SQuV#$lGbUIh2=D%x~+8o?FT03*&!(` zjZ_#BTfWru7z^O3;}Zd*@&D?CKCg8l$=#wn!u;Pyn@KAFw1DX~0P#BD_?$5S^75MF z!=@u5z`yw>gY&f(o>V~0u=^?vM(&mG+7GpNb2z-$?U;{@wli`6Y^8%xliDb5D9~`h z6F<I);`Pofzai<d|1{gYC2DXH!XDB7bO+%o6qaVXJI!JqJ)MviKb9yseHMFek-(3! z^<Nf1)HbT#gCY3PeSpQ;9|JaF9ZLa)CZS1Eiyr}%MT8~-UxzOzUn|Olkmi<0t()tc z;s;U~qG*uclt23lOU<xDFtuAFGDrAqBpr150_I#yCYK$QSp=^MJGWf?$BP^bZG!k& z5*cD)di!u7ko1sOmx0|LpA;I_ZT4})9r(%_6W(f*+Y<6*c@O!2HzEy^fj<ILqQXU- z0pRYXXF@kvvLF%d(}pG*bI#j*P6y4Nk&(<gWB_TqFh>nZ;rkh3GVKpQ5V77_ExC%y z4c5pZ_dZ15tx&UF3QDik)<zc|T99eOKU<x$6MUKMqY>scipqn881mliEom?IyAgP@ zl(0E?V`HudO;f^9|90mU&rM=<^+<eWs)7>8#T4Ba{$7I|W>Wx2nR`fVt2Dhe+&T14 z@v4?`D~w_*1pMozyDzbd&LXIO0*Zwl;{M{4d@W76D=D%0KuDu8RCwYSwT@K^1e9xj zNE4#)s1S6%ODF94nq>EVRERgWF*v1oPvj8i6RJVG@H2+V^Yn{Ov5~F&Ki(FbApECZ zKg7<s8^aT=Oj6PpslqK6AIcCD3p<!qj6eYEYm{=BYetgJHx~e{2{uZ9e1u6x#f~8b zZ@;GEpZoZpYrFe>%Z@a&mf^pR4#p~o=hpgtpH$;r>rB4=m*|QVfh^lE652{!<-VrU z{Bw6=oPCq69<YJDd`Clc%2frBf=l)zo4o7t0{_VksLzm`7=-DVFNZnC>d!jc1KthB zbCBI>h*@H_-XY~VMX1~qA7PWDm7nM2i{jK9b&|fb0^G@fTnTW=dIXN?Btqr2NIL@x zJD{&!Toqaz8psh<&IhVlm&nBDFGkk52xs;7S~aV9AnGqL%#!UI#|`xl7uyK9@j~$U z`Oy?L?eNYC(5n5i8XKa%G^hDP9B%IHBW{}H+h++7nsggqb|H4NNqerO+u^9N!jFNe zW^!@>^512ZzKt_f9kkN7Lz#cb)|LhpbTDh>)18dIbR?Jk<$Hrmyw{=%PV7=UdVWey zsH9^~^5pphOpp7-Q_ULENgRym6r3@we;#|x1OVyy@H`CxyIX28Sdc1bOQd;b22o?> zUp9<dI@%8^xMC>MKQe$2Zqa&FPA4<X_L#kC%tWFUjWnx1WC)oH<@(l)$M6ajDw!=Z z^SWesz0)VkAXPTdKcbYOxMMrq_JzaR9$g&g**XoOkAG7?!H%T!*~fxMekBX2%UXuj zJYYlQ!DcE>;r%Y!a$8z<Umos1;UOCB6ii>Xw>ZPy`~XRTM-C;m&0juW+zruLRU^?{ zUMny@DrN`%>64sP&WO8C!3WsiR|Vp~KkxYJZ(%vmUgCL5s#zL;LqegNbbZ99eaz7Y z4oQ4NGbmI|%TQ|O@@T4{s79OMA~7D@<{ADi>EP$@vbVIMt72wP^7dfwIdX|lk2a6b zolq!v&;XQpg;l<YaNhwJ3t$LR=ww~`LZ9`1!blmEuPeubkcmY0EMYwOL=elAoS9X; zSnFX9NJn3^DW{XIkI?~-r;RacMW}?5E2Qr`WpHgP87VSuBs5nYAlNSmS_*CQJ1<Sm z4_P$2KDOP8g&O|M4OUFZLI;XMiP-<9`E9QA4~vCjl>1t8PF@lXClNeMxRCsJI&jjL z-8S&O%X<Ew8c&qyRiVZNCj7=A)I#DS>z@2fLEe-+cMTR&2%$dnE|b&N(DvgvU{?F1 zi1^LENo%UkO)JnKwLW^zm35&I@33nEs1m@;FV}DQna>6@AnLO?8?sN+h?>|(-XZWa zEBU3EeSr|ChH=nhYswfDp8@Y5e{05~4(O|_rN?$Y<E2PQwit%$tyCF>i$LlYJbJ#$ zpg>9f-B;o6L5tAc2FXZ0*pb<QAQarFgpVsXAFHo^$N);3{!WW=K)%7(l8Xlgq<i45 zbRqHY!?SO-%Nj~N%LDKU6++x7cOsDIq`R)XHP2EkLrPA1&qe6_DEJfF-u=rknB%5J z8>8K(MHix9E(df%NCQyhi~dq$2A^Vb&hS#Gg|*y0FTcpZ4~74WjR3w9&c;3*{i#X) zJn`%K8Al$Hkk=W&=z=L-5-d!}f?*E5x?K|~Ljio-9id~`|Gad_1;9V*G5o2<A1FVM z3`e3(O*kBGA^+8&4&UGP@f!A#-(ipK58-X-DBM{9h@csVTgB*+E?oSbYsE-tZig<f zzUIsMw^5!TB>c6n(zp^PyoCIiZ&UHw*PXSvGKB3P-yrEFq=jO#)mSV4k)yfT0h{^Z zox2eZa<Ep5lCje3wpme#eXic~p4)ueW@FgzJ+{FpR3L;{&I|&~8ybypU1RNROjM?Q z+h#hEKgT(q)k})RmKsfTSv^KDH_tzT8YnP)2Rr8k!8Mmf0z|~2NBgT`U>7TMx*(fo z1;e^OBVHM%nkIV0&P|lg`dLmM?7o-Taw+KkCiA$=ygBbx&49F7r<+19QEH3@i}#-% zI_@{O830~0u@l^w(jU^L<*_t=qR&<!Fr2Z6+qC~MnQ45QLm*>id7pT!xy0rqCSrZ{ z&6BUdk34*#4DugxU5;K1Po58#oR^8_KcAB|exq&le}3&QJhb!aoEJ#5R!~`R4ZX{v zxj4#rH{AiP%_fvr_!omD^C@uAoPOJ`X5}zvfse?*=tqa|(fi}!J;iGD$mhTJC(!H# zU&#gc(NcjE%T}01qB6lGRGYNPBOm?~qp%zci$#Lsnnn#@2xli54`GVFD^31PV?JtX zHHy)w4)W_E177(@?Q<e9xSZ-BU%$TE+rms7Aki%`GW67w{TEYokz1cj{9fo(HnXlt zp(So$igpUuW~GE6TE?ptI<c!(mW&Je9G<!S-R15_V7@GT&K!Xed(SoNlQIk(D+l7~ zUCR8hdBNs@bXt?0Tze=wamnq1mo?B!n>Y&p=4z>J=nzzjrR(FTPYzYTFkt}>wOdYR zFPTcRg){%4mZ*sE?!P=Pz<=NSLr5%n-KFdS{^s5Tu=4(81Na}G>ZtLBNkff-@WEW7 zJDU4+OWVo&wW3*|Voqm5E%9BJq%T7^W4b4W^~8_GAH%*#fZ*1IRB_UWzKOd2e|v-D z#4J_WWummqNFR&5)DCmNfsq3z%;b#S3%*hx?WJXN@PBwFhH+DP;)WWY)H`euZ`Via z^Gf+d5<=(|`Vp<}1X6?y#h6M19Wq2APO(wo@y^g+wn95vMczdPia0AesB8CMQCvfv z&b4s^dF~{Lg92sU4MrW>ttZ1&!N~9S#prup<g3>!F!Xk#B?1zAj~M#Q^PQl-qlC74 zqO99%)iv3IOexXX<KpU<NZ&?wwTSg}!Vw8D#2e92%Q@3rqQn`Q(HN#_L!d(r>~wW- z>*v(Qb4V@FcR2{U)8<+c2Y>;qrLCJI_FBbm2w0+d1o#uGG_m4OKjCI^^Pycrk}YN$ zy-P%5@|lu{yZupL)Cm8xz_r8N`oZ`_1P=$w20NgcjCLtcw2?j(gIAw&yRBog<Za)} z@8SeWFYe@+wv~}dE)VXfr8o%!cwgsd<_c<fT}1cirq3901eK8v(OsIV=^^E5pK5X? z73$hsHRBaET56w@E2?zgVB{(zh(Be=`lPXgrSK`gbyGSUrfCP5`~2AOP1UT|Mg%*e zjVgZDvgaeMCd2x>m~L7n)+VNKZpDyjf+Is2g?v(qH<t=iEOon{LDs5B!+iQP`9f2r zQ`$%X6@@%}u&iq-bW5Vj7ed%wYdnq7X`C{0zd~^*3vr1aGGiEQmzqH1p@e>v4_<DZ zn$NCO{?o~dmPFN|QsDk&%)7e>FDpcLuHXj<KoCG;FTF$<UQC{Jf}XK$(OxHLDNN-* z9tPEwBK+<olW;Pg{<V8p_qqcEjI-_y-~?RXrvpy<lH)20T^BgMnELBJ{gZfldD^N- z=Vg4gC&@UE{yf}(>PibRp}<dweCdo;eDiWv)DBaW82&OA3}tZ&yV=N-&u@8OZ{DAM zPDP4o=auYUfcTfCN(zWIS07u5xPr6iy9+J;G~V)<br$kK#PQk5<1gH|ir%TS|2CY; zI3bjmUue?DF>NN@F&UczrnA<M7a!^fxZ!hQ7TG^%0i+&Z-h{A}Dq9Zd;|tn!wPwW$ zV%$l4we01z&Ff#@JQuxIne!a|u#YBrz+2#izz2HIth=D!GV|<@xGf#xweIP;jsLYW zjTS%RdWEErFZM5gh7qJF83Q*6by07I5&Pmoa8vW;5e^hjOt!#Kr^y`D>IQ!^B!slA z(TeK;!qlY9fbhfpQ}67qvnV`+DP|YBq*1Hp3oiF-(-7P{%ziSGI&GYEom|P=_g@0Y zKM$JKA6&hsd|xUd5OxfT@#qqMNf^8s7VHhIXXbqUM<G2j>h3u+SC&Q02J1>+wdBjI zTr`60_`GV5&!4ZC8VCTqfG(yWi6!krj6Q$*Ki8+Uuy3WG3wn3R-(MfuxhO?`K4_)m zM1S3KQ#f+>ThT$`^H&*g+Tq~qV65P>_<Huqddh!)H;M{RIq8uS#;2Xc73#UUWXlay z93KC`N!iWQdCF4Hr`-b(QV`DNpDjzn*E2DQ_sH-W@Ou$Ea~}I{!L+=~*=SR4<pYWQ zvdzE;_Ox@+hX}lF+;C7}t8o1Ab)SM+7|`%sIz5k4@Lx56q5Dq(AQ4)}a=k3I0ly-I zAwM+Bo-q)R{)$x}N4JULwD?GpC8|yAVwWy*-9VT3NVRc0YKvU$ny;$v-FB%W%u_@z z-jvrO&)iFjQesZUHMPpMeWmx(I}K4xp^zn3X-MEaa%XpZL`eRO@mWVr4X)Vq0#=_` zB@YfC1U$Z}5OpvpZq<wi*s_wq>3^`JXU|sq3X^)(LNHXyK!kM(3;3?9Wc+s$SW+?} zOQoAHEcWJ#QqAsDZ{pz1ukQm`cW)DO)COxzU{w<oz<?o6Qw{v_WTv05`=veUbh~&V zZ!jM7_^O8ejarC=r*KOiq#8ew)H<~RBDTjo3YHLp`~c^)!bxPRSl6wC*li_aZpk8P z9lftLtbv>uNyMC5ATjj$X6C)q&~=2W95wO^5(-f^dUypbywomRVhHimkQ=-idq#{{ z+W@k*l&!ip2|W|{GI<~2)Qr5dtxe{Z_uyr;&q2=imum=_VZm6by2dHCYsQ{KDL9Ub z$ob_}TXENO_`j+DB1)3}5KjK(3%sL!<wJI|CwP6_+=p<T43k`0ne8WZqC$ozi;+_o z4@|7Nw4b({#)*coZJ+fed{~a8H6Bn!w!#U2bL4B$wHkNOBm2(VI%z58f|>fs&oLv% z9a)19ap(w~xGj&_52+Y%B2jMLv3PgfU}Zsv`S=Z4*`$VIbLlJsGRoq#nI|OmTK2Om zEP=tV2pRE1W^+bh3Xq1cUO=HGRP2Kk@5(y>X%!a0*&|Vm;|5GpcuTR`MXmb=t~Sv( z+{Dr=*`(pX%oG?md5a6|RPogl6B(sn6KCJJ6J(cQb=%KpLN{^!o}Xe`BYJfo(fPi= z4JH%Q+*OVxT=T?)uh@Z19(WHdUxa(F$G-$b&PctNg$qZyqW%*Bj_$Xex*;xHpOiq( z1c<+OeJaq<>?>tCw=t}*Pr6zV?Y-a5K+egDOJQxCxAZWyb!Gg8FE6-God^xhrX3f* z-2A?2dn@qza}fOA`0zPi^m%UyoYewX+V}4S>PW)%NjnB!80K}=DV;%>>E8oJ>c8t* zUh=Q+(%2{^wHOf6l+{T}Qt@93S`3Cv7v!Eit_5fojpZIZ`G+K^fchmL?C#X>hWV08 zr9A!qhFoq{ctCgsDd->jKCClFW@21!uGf);jq^O(VIk1WGL?v=higcu_XlPm2RdZ} zp^ra57aS10De%%C&OYqHTv10wb5$$*K|q$x%%3o^wd8vD$|8ww4W!l6@|~H7UE|8e zH$9@B%bMHxW<UrIB>bopHF=xUJgh7ibx%h$PSP*s8*{1%p4*h-iFWyA4?szzO&l!M z-;yQ3KDVpG2@9OLL>eqzIC%;%%It^yTc$zd%qbV6AkXg0>wkB|RJkrlMun&!;Vd3- zm}u+S_Hnv)*Yq8C%JhE{{NMXVPzX|6NoTmMU^uGEB=Z+kv3(ii71W1kBwxUne#Pt% z$3=9Wl|FJ*sc;964<FnM41owXxdykHgKbG<N8#Uz?o3`fd|M53$X_zuzZLGl+6-y~ zF79Q>oX5xxlyH!WIz}8>V%h|vn4E>npb+rys?57h|G10&-~Q<6m<4=56!MsW7;EAF zz%dHqftYvnzpf0F1|ssEvwWDTotl~2EKTp#9uE6K-YPy#d)}t^4=Hu3{U7vBnG|?l z{n3*vUl=i=xO4W;>t~jae(Fom!3@ybr#oz{>$xZdweINrn`-PFo)PYsw*>I{CD&v7 z@2Uav+QweqTO6KN`JAx(9cVF&o4ZAzvQoMz#9?)ks02vfe-_S=$K{X%;q;(jK8mjp z=uKZ4e&W+pHQ|##)gZR6%zY04E*yv@)pZR$agC7sDm{CAZ}i6o8-c=!u>k7Ufy3ro z`NP)CE(sE~OA>TT{bc@@UEyV>hyt?${R0}VEh&+U;Bnkwt?K92qI(tPpKYjjh;8HN z?|z)(&1_Z`nN(pVI<4WAI;5_uw@$tD02LQ7kv3ju3<sU<F)BUsZ)R9Q>MD7utRpUF zO+@A>59{-;!6|_|%ibzi=MoDbH3IbJDL6PFQo>LHtfvR;U7Ktvr#khQ#v!$#qG;^J z@=65^3{%{g30+Vk?O>d*@V%Wkl_uAQt(jyTg}r;1m2Uq)y-$gH!WOTQeo5`{6*^xC zLedWceAYUYD3u2NB_{op4;m-Ex!NQNDrCm-{D6%_*ZfAY5S4{yIU}OzA=f@Dk~I=x z58aY2HJh9DB2&%GY&+RH#A3yg(X9Kdg3|y1asL;f@PZyA%DFlJS+AjRgYl!+9_yB1 zN#MiYQQ`&F0Xa}WUK;-c*-PN|5Cs@8#!W0Xe50K4?7zLox=4aYAgGl?+!%wm36#Y2 z*`~ontOLD9+A`@j)qZ-$pD))%!n&FLEiNjg=l}||fe@EvsNHD)R71r$i=sw6le}iO z5{f^1t29=)b*~Qp=g|Jj1wOs*UflsJpG(=C_8WwJ9OvgGbf_*oks&4%C&oCceDP-u z)4j$N$WJdzRqfWdK0JMA=G{~A0@v#X7|$xu`OYZrJZa?$6oZFX*Be6GzdR3Dj8cJ2 zKh)V^ZmtH&<b~|K2Ihp!3hX<?hmHe=@+1jc+<ZPnfb1_)7ltbK!}hm4&6|Mvh#E%4 z<C^~ir$AW09yj}F^i4gU_q8ehMU8>40L)!W4uUWc9gK;e5O)UD3m6ufa2L<usl1UU zo<gtSf@EY6+UYp05N+auT~i2@&b-%oZ(<|>2Y4v}qFDTX6a2Y@nKwK2HqsgXNcd?4 zZ7{sihQ{R&Oakm`L3N(0MpM+TwJbM~=c$qRL69x+BWsOG>B9iH<9u^N>mg9ViezI& z2J_k2Y<gBQIf6$WG)PepLj9WYPw&JBBQ01J4Ti7(<0sHT_o4TYIQ=!k-3950ioW}P zw}xewHU&Km8^F*v_YbfIbFFd!-`6q+;WoIVirl4}5AV+>tLqJj;EDpt*SFP+u1hax zO3+PDI2*wJX>JEB$D{Bout$N3U?>vf#MwO?B~xV5wJq{S7RYND+*ZV>et&tN5c(gK zi~pu5keKOXH`{cwfXnp+xBEFp;Ej3q|I={#6o9#F*+CEnf?LsOf}B+17w7@Jc=qW3 z|BnV(p-|XvAAmH`0~aV!liHn5XLdpZfM<O@!W94cYJag5VG8%eq{2UQZhD*m%#V*w zbSu0?UN{^9;F?V<^DonS`b)@fDO|1xx!Y3b>thAq6ncSI2sXw5_&|giFoQB>?vy5w z*TrC;v{t3wD_#$MzY0lhM$v>$3x8BZzbWc^LHi{zzzF~mENqb)gT_4?aMiK_1#EX~ z$g;*Aa+JqHm7KRj#58r306*q&v`I$3qc)fp67j3^2<*2H=m1%eA=U7qL;OphD+U12 z0!Aw00?<AgHIUG^IYtg{(83TB)pOV4x6uK_@dmQ|3}s~tAySJG>TA4UE0QJXXAuDx zCOz=p)hPL8N`K>@S#rgNyY#v52Lk~g0hqg*6@+0JoWKM<c<>@j(5v32zJ|}?``_k4 zX<WKi`<Jb<f*Xuo+I1~!e!e7MOB(<;;8U3Xru+;2Y~UX*GBgfli$xI1j=uhSls<!G z_9so-IVSOly?-wAYp%5suu4=Y(u`avHx}CC2*405FJ+V4i;V!LBtD+Dno_ne6YSeP z+9$M~_o5S;l+7HcSsDSUHU3qJ+x98%c@72+;ut9miey1<P|l(O9JbmYHqbOX9j9ia z@MXw@;1mCMpWu<-L<%~B_Jde`!pGI`Rv3q2LMPvW<H7OtB~Ak69`FMJ(qO5u5&UvU z$)Hg|UkIuRh&;}LQ1kFQvr%<9*V<T*c@QW$wp+oJa@Y|w1$l;Kp3r;U-FKc-RjpuA zEvG>JV!A^C1R&=dii8B-0uXogJP5)-v_}Xo7)@LpNSsWJ3#<RY|8C;X5I0>21B6!F z0{uD=3W=)}ur%qtzPtBsNdUkd|E^0}I8FIE@LntTGQ$i%kWe@b*BIhH#*ldgqvpB9 zcFuz$KS`zOUYM>(4R(L9u%&zW20xtvaC^<`bpie36$q$=Jn+OpKpcHhd@X=dS=FQ{ zO7Tr)mpVKRfCZ@0wE;61!j)IzY73k4hk=}GTM-Z7Qr-Us0>2yt-IISmsN`$_2Y~T9 zl5D_nN1`YYhEbH!u7$AF30Sf}s`B$-2Y;*ik6T!$DRHRgxXX}}zCnjGa~&EnzYYf4 z|7EBX+GlE3+f;SoQG@_xrrJS_rJd}L8LWbiyMVl3g}fh>$AG@~<atSw!<Hn;rg=9Q z@?)@ooNt5yZ}NK<2)Kmd>io!VBzxX{gDzMz924Znj)RFQh*?13BLHt#)0;31L*u0V z0TVYQ#KZw<7o_dFf3x4aAHj+1J}#XmEgnun`qH?x>d+36pdi$Qq<*&Fv+YgPi*Y=k z$HVeFn%4Q>Dj-tlolVhu#xQL2;=#*vI$M?v{Fs%$aV(BNirb-~?Q{S<*Qy&ODH#tt znf-ocw)c0T=njF0H5Eo4dhr;>zh?Buuh&2sfq<qP$JgQ!3J4HRKmY+hag8N^8F>H@ z!yy_40UAGG76@2a{ZQMuGEXUb)V56+P2<9Q=Ui@-GsOqsK`s5bXITY6{|yRiAj#FW z-sl_Pig2~R#29s*$OYN#b}Mr@tb<}eyjGv4?-Mc4=b90H#vh{tnJkD#7d7@~Q0T{V zQ3HT6YL}+wFGM~MpaKbr38eY_d)WJ+EGASX9+JMXk1W8w0$5;(dN7xH{~)0~kI#>< zetj=S0M2UHeTP)b<I_5vwfdRG1)rgi{}F(?ygpi0R$2}M{*(@&jkE2`>GW#e-j7q} zN;Ax8&@F%fJ23Kg#?Zb?%I9;yz#_BzD*$g-vw|=TgVQ<%Wj7HK&w5ZqpTM{9{V#f% z;Q#Msl~m`lEL%4z-o_|fSy}SsOY+4R1Av_J%4>4s2im_j#ZO1_Re1@^CrZx5{R~we zP#P$mc&CUF$|8;IB0BL5_ZEgt`$J=tfCE4bRPXPv6DdnHeig7#%reLk;a5CnGO!v3 zXl@RNn@t0t6HN?h5+QQ{;L-^2$p-N6j6etXi1iBC|GwWpU>jXwvpzx;U0}Dn!};{I zGZTU!1qN?`<OXe$f}=al^A9i})dzq$KY$l%()9@PkO}H`+b~}YVLa+tP5Sh#iQ}cx zxgXISFxj~Ql&FtcdqBPjpEzmC5EvsV@utzek%30O1A(6tr0hYgm<%#&56smFWIF<q zyI4b`xZ)V8HA1!pXLU?xedu&rR%Mg3n-s&BiG^w(#=6j4n4c`a(t4?MFsR{qs)oTu z&b{%uZWK6r?Eo7RGvLK7z62odYE~kKf$*dkS;R$G+y@X3dfr#?C4DFHT6_S(^(KWC z6*A^)({^S|cGI$GVQFc}Az_p6n{WP()ed+Qe)s?B^DmyeoAsaBJ1+Y<Y4vk##H)e6 zh`w>6w5H3<PZS-&7)bxHmcPF`>)*4VB;V%z@{?usUPg4%vgsvkt<0oAO17H?2{>Dx zw6y~2`ZWOOj+*APO>MO8Y2|qPes){nlH>scUa;yByRh9hfv|kEL2kXT8uv<A!aY$y zod%GcWgt9I2Zlm2-Y07}l+GiyK7V)d0d*+Gy=USaFmI42bQiq7xuo;ef}ZO)dJooZ zw+CR?`nU(2QSV0Z9x6-9{o_ehocx^$pxJ{;@pmK0D|w!VnuaC_kVQ8@3F1->;Bl<w z3T#sUh!jE5Dna+Wx>!X2zB$0+I^jLs0PCw$y1iS|)8k9q&YLY;NH7TX)s1c!rUGMY zCUWrf!+cY@3MqjP1;C#>Wpi>p(f*U!Wj29q^2i6^g^#tGKLW6JEjbOtK-80pLJ(b0 z(eAr0YnE^dF2Uir3LF3=b``3qDwRfvrVJiCF*A-Gr!<Qwu4+Yz73a;o`MkmP{QlT$ zoa*C2A2+?$`u{88FD3wF+g<)qR3NB-VA(6+d4%<E{-2Np@aDOYfg5L1g%H>^L@b=e z#<Tid13^uxHLq{LGz-PntK>hu@h|m;zrC9&m-rVjO#D*3W^!Jr{O{QM`eqZL7^4sa zHUhz1dntK7G#$=pt;XYX#p|+D#!Sk%>0kqP^888duqaCP^14zV`d$hADUoeob-T0A zW5>kO?5Yljl-oeSwp?zt(eP!~sty}ay*3=+4fSKd^%ELsV~+e%!SI@*)2tYc&eUXj zVX9m<n{Tx*y{~K~muEW<G601Dv&P5Bv*1xm{-V_2PzVyFeNi4B4)6>L#4vNf`vS;N zj$}6MTnHKn{ATFgy3)XI=zV(sN~<IY;u-8b`fiYP@bl9`oeT#Ovs{=IrPt9SlL~M+ zdzOX{=(sOg(&f(%rjvQ`xqW|Juivl*=(7m*AByeA&M8knM)5-n6M+fZzw>7P6@a*_ zSxp!S!m~>v9$M2&p^%F=X`#M^Z{e%@CZWE7rI&ay1T)=P<Ni)I5-knn5W$2j+4<)C z=I;>-z*3#t{{sJM@uLx)(!HEw`GsZrI%Y2?0tnocEs(qc84F_nlrW{^dBRYfQRD1O z@Iy@PF*{iZWco9Rh^e}4{b~qF4yIV}$NL*pUkAlrS}2NKfkW$cE92PyUjZKn{&jtV z{r*P-zgbfp+U|DE=~m<rknh$W&rly5&EQ^&xt^X#>cDK4nZZhAy!CrIWng3PIavj{ z(+L>PI{|R3aAFmp^PIp_)2KDb;d4zBC7+<GzICjdoasw0MQ0^`dTwU{{rW&;>+CVe zs|mXKIXQnCNc(cVxD7`iB0%6r6hnaiPOgEQ-jAUQ5%567U{Dg;?QScZAhL0t@Jo)* z{d|qp>J`dz0SD!L=9z@3y_iuv!tRg0=psNk-=ghBaKATji)F>=+sU)}X7OBZ)a5S0 z)`0<N4y+~fKRIHqnf6oWH<?%%j{T=)nZ)rc0B_gQnlKQAXSL!X2t^OowFiYF6p!}Y zf8k$O^x9&nAiixyn=!K_akAMp4`KsLa!5k5+00}o-=hc&0P!m8g(d%tM-(2f&|ZE{ zEMW3~Vw|6l6<@~8ghUePOrWJtP=VtpL3FzHD;n77f_8hhowvlCry7trU`r)q@}iG` zr&bNx@)1_cy?4JNmEcbniQp`uiuWbW(#dl5^JA@oYM{Z+sac_JyP@fVGz#SA1?a_M z50mK}M&obznr-3da8{UsYPF(15ZoJdL)*RnH$EVVDPVROG}sIy_~JolkY2(XygjQm zWo4yw>GJN5>-UB;ZC86ABd&lL(Yir|7=yqC{ZSzU;9>l{x;}s={u5Fgxg0n~-8A*< z1c=fKgBm<?8)Dy%TUc;VG<J5oBS=|;mtI3v3-ZKok%HuQUwr`cSpGe38vWPdyKD}C zJ@qsQejUhHX6vBQa&jDp-p7NtP3_O$?}6>dw{7Q3Q!RkJm4J%?#9iA;!$1(7*|ceC z@B)gU=r>qD!#DrJ@A7NJXCEs86%?UGx<N3aj+xDEce+~}toj%>S(1><<;<Bgy&sx# zcKqjSb^dFZ_UoNN-C+a%Q51p$aA7Fu6embL39-fk1jAo-i(?n=p(6Sz&&745&j#^$ zybq(KZw%wA>V9_C^&il%%<^TX=({Ig=lKB~>^wfqjjnvuQ;p1VXs@nlz)JasfT?*~ zuK6<pV20#a1T*=4FIA34kE3K`_VNa)o)wNif}P#OjMd%P9Gc^j&{dKl<#R6M0Q@B) zAkmrc&q0tn4|P__9RZB|BuQKZ0Y`9m`wWxG6!bhVGgz$Lg#~#x4wu|48i`!hKnqoK z`wXF}(}O3&Z|eM2NzT;;wg(xxEqox_I+0rEP0pxf5fBLdViHhA+%J99$0xYo0Z~I9 z<{&kHeTR52GCY8*%X?F*QWio*RfkipebA=%VO`W;paHc1*@9vU1?@YpMXG;_D!M2R zZUXRom)1S*LCygO#j7~j9t?47d~$d;n?8-S&aR91n`*7oEX!DZh|A_NxZ2qiKn0Xo ztKls4paGqcfG+`<yPB4Ufgn0-)Y?)gHt9{HxrtakRPf^e{{vN_nww3DRz#DCT4>hY zY&MzQ?D~O<9tx!pNOw1xH*em|`)&z<PgWZKAKKq?_(<(GSCjK<z>_uh2LH2y4o%tm zLJZDBnChzUrV;uPjYt|G0G~kN7Dm_uN0GfRt!n$W*g#9gFn{3>yf#DdUBE+sOv@xk z^xBMCOeKK7$O`dZnE-*Pqc6c5bSn{^0N(0#xV;X4w+RQo!UW*JS=g?!pu@BN$A@R} z^4Ilf&Dm_qfgtZu#VGo5p9HQMm_-TP-ej=Z?|@f=fz@@PoEI6N8DQD|`$xd*xAxt> z4`wu^noJ2sh_5|wd*xs#yqd%8IsxiPJrJ!!MwN++)h<dXvdxcbZhlnj?bn9wR1SZ+ zI=Dw#3g=pDpls`<Ic6QGLN7?cr_9WA1VAdQZsa2%ZIczCfR@g6JLR)M&F8OT5OYY= zmttz@w%>y=yoZgJV~sET9ta_g7mUOOSl?M!0Db@xAoNVYZepb4%jNQQwCkUq%<s;_ z#o`IHppO}HQ{7(%X0AGA=<?_QpnVLazYnnIZv}~aIBboAV5gU5=`@O_;bd}o7RT|0 z<2d6eipCkISlC7Evj$iv3QFBawJ&U@o~GYE4FcW-Ans~f8U}*sOp|)39;#l{6hVTA z-uxhV^wfg~!5`q?^y1M!;5kM_daSJ)MANj%uGw8eCfiL+Dbzp-w4{OA-Fa``&g`s0 z0E7W<|3mg)>fvSnfG+}U&h9InADUt~tfwbfkO@F+uHT?}BM1qrEo$XcDcuPGP)&6- zfHJ5iO(Mf}Use0W6tpOK3rDF+<}CSLlC(;tfK{N^6#SQqX1PoP6_LNlszxcxS5XP= zcol<+r9a9I@3w3O5~I-<e181M@fXQ)-R+LFi|DJM_kPfASf>iCZ(g8b{OKMt&5_^> zIVnmJQfh$cdU<x<%kJ;sKaF7;C16`vik21l7r8Nv)VQO;_NCMSQ|%wuBk*FOa?LNZ zTtP5310t)PF<Q=8KJJ*~Vt)WrI4Pa}hGp#kp%W}&)9(zU_V&Br9`8aBOq89dAIkGh zphz-oGDS*a0TmBcnlemPN<mF`Mlyg&8i9K>xbcI#`|-qoBT;$X;XOG6nnBBHgWbOZ z*t~{z{}iy}!W_1`I}`9uZ165Ta1IXHd^UB`bk>XG_;NTLhCvX#W}oLU3?HK?dhmV! zB^B(v?9!RGF~kVzKut^L@ONc^@wZ<Ah`V~8hG8Ij4vkbwnnp;NiEONhfsX~jiWs`{ zNB9f;HD<(^i3J4~P>GbZsf``y;}RPa(FiJ4YNWJrEhq2pJ>R=c0st!BHv``5gMmNJ z_WO_o{I}PtLEJHq0W)tFt&3;_NA#pY?NPtYR2MJM^$Dr{%Z*_NVW13381Iq0+UfQG z3<ykFt1U>70ncazbq#%%Ev?@*F$<gg-v<0ky)jk0tzDOV^N`b9p79@PG2Ui<a27`t z^B}FC<JSb<KQi$BPoVqL0t{t9R7nG-tlKsRe<ckN&Eo=Jw<%Y{43<7d^*K$KMb(6C zD=nFkr^lCKQ=2lILbN{0^lKpDyp#-}RhGvQ{SP>sFTDoZ%?Y`|cDOACw7VA?EQ~9k zfsRQ~Jtk&oKGa!ZtPD1SVBFXbgQ_~>Ot(Ch^O|L>s8l%=bN3KDi-2IIIt8|n94%ea zk9{7xAV6CuHG^XY|B5|X<>{QU^}RTJvj9GR0_OtwXW*XC!J)UXMbE@30dVn*$y1ol z61X^7z|~~|{_;L^c08Zcz1?&&8LvIh+m7S-h*EkShT(ORB&Sgn-HG!S9e^htCV(JD z06Gi-^pFCKuP*_JyLOz2VIVq�j5h3qYVvlhCXv5DgMqp)C*+5~4xk7Tky%aG`WG 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 RvjFJt;DN(d6_#Ex{|6FxPig=F From 1518e9a11892a829d379ab40959b9dfcce23d925 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:29:16 +0000 Subject: [PATCH 156/172] Update due to renaming of macemacs_*.png to emacs*_mac.png. --- etc/NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index 5f89a8d46be..fb51744bab6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -55,7 +55,7 @@ testing for the `multi-tty' feature. OS-X-style icons (an application icon and a relevant document icon) were contributed by Kentaro Ohkouchi. Source files for these icons can be found in Emacs.app/Contents/Resources. -PNG versions are available as etc/images/icons/macemacs_*.png. +PNG versions are available as etc/images/icons/emacs*_mac.png. ** Built-in functions (subr) can now have an interactive specification that is not a prompt string. If the `intspec' parameter of a `DEFUN' From 4619facdf62c6f41ac70d1d674be47b6fed5c6d3 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:42:29 +0000 Subject: [PATCH 157/172] Renamed docbook-dyntbl.rnc to docbk-dyntbl.rnc. --- etc/schema/{docbook-dyntbl.rnc => docbk-dyntbl.rnc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename etc/schema/{docbook-dyntbl.rnc => docbk-dyntbl.rnc} (100%) diff --git a/etc/schema/docbook-dyntbl.rnc b/etc/schema/docbk-dyntbl.rnc similarity index 100% rename from etc/schema/docbook-dyntbl.rnc rename to etc/schema/docbk-dyntbl.rnc From 291db8694dbc735d6c4b0fff61c17bdffcbe9dab Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:44:42 +0000 Subject: [PATCH 158/172] Renamed docbook-soextbl.rnc to docbk-soextbl.rnc. --- etc/schema/{docbook-soextbl.rnc => docbk-soextbl.rnc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename etc/schema/{docbook-soextbl.rnc => docbk-soextbl.rnc} (100%) diff --git a/etc/schema/docbook-soextbl.rnc b/etc/schema/docbk-soextbl.rnc similarity index 100% rename from etc/schema/docbook-soextbl.rnc rename to etc/schema/docbk-soextbl.rnc From 0afd5f04f5707355aabb0b14a5a7960bc1693b10 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 10:50:45 +0000 Subject: [PATCH 159/172] Fix a typo in commentary. --- etc/ChangeLog | 9 +++++++-- etc/schema/dbdyntbl.rnc | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/etc/ChangeLog b/etc/ChangeLog index 764d01729c9..0979acb6ee5 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,12 +1,17 @@ 2007-12-15 Eli Zaretskii <eliz@gnu.org> + * schema/docbook-dyntbl.rnc, schema/docbook-dyntbl.rnc: Renamed to + docbk-dyntbl.rnc and docbk-soextbl.rnc, respectively. + + The following files renamed to avoid file-name clashes in + 8+3 (a.k.a. DOS) namespace: + * images/icons/macemacs_16.png, images/icons/macemacs_24.png: * images/icons/macemacs_32.png, images/icons/macemacs_48.png: * images/icons/macemacs_256.png, images/icons/macemacs_512.png: Renamed to emacs16_mac.png, emacs24_mac.png, emacs32_mac.png, emacs48_mac.png, emacs256_mac.png, and emacs512_mac.png, - respectively, to avoid file-name clashes in 8+3 (a.k.a. DOS) - namespace. + respectively. 2007-12-08 Ulrich Mueller <ulm@gentoo.org> (tiny change) diff --git a/etc/schema/dbdyntbl.rnc b/etc/schema/dbdyntbl.rnc index 8e859145fd0..4ade70bbe2e 100644 --- a/etc/schema/dbdyntbl.rnc +++ b/etc/schema/dbdyntbl.rnc @@ -2,7 +2,7 @@ # allows the table model to be selected dynamically based on the # definitions of cals.table.module and exchange.table.module. # -# To use this copy, docbook.rnc to docbook-dyntbl.rnc replacing +# To use this, copy docbook.rnc to docbook-dyntbl.rnc replacing # "dbcalstbl.rnc" by "dbdyntbl.rnc". Then, you can override the # choice of table model by doing # From b9a0d5af8fb35a8234b9efd76cff090f3f9d75b1 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 11:01:36 +0000 Subject: [PATCH 160/172] Renamed xhtml-basic-form.rnc to xhtml-bform.rnc; all users fixed.. --- etc/schema/{xhtml-basic-form.rnc => xhtml-bform.rnc} | 0 etc/schema/xhtml-form.rnc | 2 +- etc/schema/xhtml.rnc | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename etc/schema/{xhtml-basic-form.rnc => xhtml-bform.rnc} (100%) diff --git a/etc/schema/xhtml-basic-form.rnc b/etc/schema/xhtml-bform.rnc similarity index 100% rename from etc/schema/xhtml-basic-form.rnc rename to etc/schema/xhtml-bform.rnc diff --git a/etc/schema/xhtml-form.rnc b/etc/schema/xhtml-form.rnc index f5544190b01..99a0474afbe 100644 --- a/etc/schema/xhtml-form.rnc +++ b/etc/schema/xhtml-form.rnc @@ -2,7 +2,7 @@ # Unlike the DTD implementation, this builds on the basic-form module -include "xhtml-basic-form.rnc" { +include "xhtml-bform.rnc" { select = element select { select.attlist, (option | optgroup)+ } } form.attlist &= diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc index 3218cd71e5b..a99f0e0e8ed 100644 --- a/etc/schema/xhtml.rnc +++ b/etc/schema/xhtml.rnc @@ -22,11 +22,11 @@ include "xhtml-bdo.rnc" include "xhtml-pres.rnc" include "xhtml-edit.rnc" include "xhtml-applet.rnc" -# include "xhtml-basic-form.rnc" +# include "xhtml-bform.rnc" include "xhtml-form.rnc" include "xhtml-style.rnc" include "xhtml-script.rnc" -# include "xhtml-basic-table.rnc" +# include "xhtml-btable.rnc" include "xhtml-table.rnc" include "xhtml-csismap.rnc" include "xhtml-events.rnc" From 1ff6d7244765c2068fb1282bdc199f080ba94eaa Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 11:08:24 +0000 Subject: [PATCH 161/172] Renamed xhtml-basic-table.rnc to xhtml-btable.rnc; all users changed. --- etc/schema/{xhtml-basic-table.rnc => xhtml-btable.rnc} | 0 etc/schema/xhtml-table.rnc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename etc/schema/{xhtml-basic-table.rnc => xhtml-btable.rnc} (100%) diff --git a/etc/schema/xhtml-basic-table.rnc b/etc/schema/xhtml-btable.rnc similarity index 100% rename from etc/schema/xhtml-basic-table.rnc rename to etc/schema/xhtml-btable.rnc diff --git a/etc/schema/xhtml-table.rnc b/etc/schema/xhtml-table.rnc index 70055b1598f..129d7b6742c 100644 --- a/etc/schema/xhtml-table.rnc +++ b/etc/schema/xhtml-table.rnc @@ -3,7 +3,7 @@ # This builds on the basic tables module, unlike with the DTD # implementation. -include "xhtml-basic-table.rnc" { +include "xhtml-btable.rnc" { table = element table { table.attlist, From 102e02ce3ae92b31436a3858a2087799783e09b7 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 11:14:02 +0000 Subject: [PATCH 162/172] Renamed xhtml-list.rnc to xhtml-lst.rnc; all users changed. --- etc/schema/{xhtml-list.rnc => xhtml-lst.rnc} | 0 etc/schema/xhtml.rnc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename etc/schema/{xhtml-list.rnc => xhtml-lst.rnc} (100%) diff --git a/etc/schema/xhtml-list.rnc b/etc/schema/xhtml-lst.rnc similarity index 100% rename from etc/schema/xhtml-list.rnc rename to etc/schema/xhtml-lst.rnc diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc index a99f0e0e8ed..76d951696c2 100644 --- a/etc/schema/xhtml.rnc +++ b/etc/schema/xhtml.rnc @@ -10,7 +10,7 @@ include "xhtml-attribs.rnc" include "xhtml-frames.rnc" include "xhtml-text.rnc" include "xhtml-hypertext.rnc" -include "xhtml-list.rnc" +include "xhtml-lst.rnc" include "xhtml-image.rnc" include "xhtml-ssismap.rnc" include "xhtml-base.rnc" From 966d7b437add52e69c5171a2e357b629cb304050 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 11:27:32 +0000 Subject: [PATCH 163/172] Renamed xhtml-target.rnc to xhtml-tgt.rnc; all users changed. --- etc/schema/{xhtml-target.rnc => xhtml-tgt.rnc} | 0 etc/schema/xhtml.rnc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename etc/schema/{xhtml-target.rnc => xhtml-tgt.rnc} (100%) diff --git a/etc/schema/xhtml-target.rnc b/etc/schema/xhtml-tgt.rnc similarity index 100% rename from etc/schema/xhtml-target.rnc rename to etc/schema/xhtml-tgt.rnc diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc index 76d951696c2..edd4881bf26 100644 --- a/etc/schema/xhtml.rnc +++ b/etc/schema/xhtml.rnc @@ -31,7 +31,7 @@ include "xhtml-table.rnc" include "xhtml-csismap.rnc" include "xhtml-events.rnc" include "xhtml-inlstyle.rnc" -include "xhtml-target.rnc" +include "xhtml-tgt.rnc" include "xhtml-iframe.rnc" include "xhtml-nameident.rnc" include "xhtml-legacy.rnc" From 30361feeba69e643550298efc507822a769b8c00 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <eliz@gnu.org> Date: Sat, 15 Dec 2007 11:37:25 +0000 Subject: [PATCH 164/172] Renamed xhtml-style.rnc to xhtml-xstyle.rnc; all users changed. --- etc/ChangeLog | 14 +++++++++++--- etc/schema/{xhtml-style.rnc => xhtml-xstyle.rnc} | 0 etc/schema/xhtml.rnc | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) rename etc/schema/{xhtml-style.rnc => xhtml-xstyle.rnc} (100%) diff --git a/etc/ChangeLog b/etc/ChangeLog index 0979acb6ee5..19011436d3b 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,11 +1,19 @@ 2007-12-15 Eli Zaretskii <eliz@gnu.org> - * schema/docbook-dyntbl.rnc, schema/docbook-dyntbl.rnc: Renamed to - docbk-dyntbl.rnc and docbk-soextbl.rnc, respectively. - The following files renamed to avoid file-name clashes in 8+3 (a.k.a. DOS) namespace: + * schema/xhtml-basic-form.rnc: Renamed to xhtml-bform.rnc. + * schema/xhtml-basic-table.rnc: Renamed to xhtml-btable.rnc. + * schema/xhtml-list.rnc: Renamed to xhtml-lst.rnc. + * schema/xhtml-target.rnc: Renamed to xhtml-tgt.rnc. + * schema/xhtml-style.rnc: Renamed to xhtml-xstyle.rnc. + * schema/xhtml-form.rnc, schema/xhtml-table.rnc, schema/xhtml.rnc: + Updated accordingly. + + * schema/docbook-dyntbl.rnc, schema/docbook-dyntbl.rnc: Renamed to + docbk-dyntbl.rnc and docbk-soextbl.rnc, respectively. + * images/icons/macemacs_16.png, images/icons/macemacs_24.png: * images/icons/macemacs_32.png, images/icons/macemacs_48.png: * images/icons/macemacs_256.png, images/icons/macemacs_512.png: diff --git a/etc/schema/xhtml-style.rnc b/etc/schema/xhtml-xstyle.rnc similarity index 100% rename from etc/schema/xhtml-style.rnc rename to etc/schema/xhtml-xstyle.rnc diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc index edd4881bf26..c85cb144e25 100644 --- a/etc/schema/xhtml.rnc +++ b/etc/schema/xhtml.rnc @@ -24,7 +24,7 @@ include "xhtml-edit.rnc" include "xhtml-applet.rnc" # include "xhtml-bform.rnc" include "xhtml-form.rnc" -include "xhtml-style.rnc" +include "xhtml-xstyle.rnc" include "xhtml-script.rnc" # include "xhtml-btable.rnc" include "xhtml-table.rnc" From 8696223d6b568b89d358f4ee5762c74bfa784f16 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:29:42 +0000 Subject: [PATCH 165/172] ("scandinavian-postfix"): Doc fix. --- leim/quail/latin-post.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leim/quail/latin-post.el b/leim/quail/latin-post.el index 7d366a4652e..cb8a938a10e 100644 --- a/leim/quail/latin-post.el +++ b/leim/quail/latin-post.el @@ -1253,7 +1253,7 @@ Doubling the postfix separates the letter and postfix: e.g. aee -> ae (quail-define-package "scandinavian-postfix" "Latin-1" "SC<" t "Scandinavian input method with postfix modifiers -Supported languages are Swidish, Norwegian, Danish, and Finnish. +Supported languages are Swedish, Norwegian, Danish, and Finnish. ae -> ,Af(B oe -> ,Ax(B From 1ebeeed0587b52eb5d3cf465264a1970683752e8 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:31:18 +0000 Subject: [PATCH 166/172] Many doc fixes. ("danish-alt-postfix") ("esperanto-alt-postfix", "finnish-alt-postfix") ("german-alt-postfix", "icelandic-alt-postfix") ("norwegian-alt-postfix", "scandinavian-alt-postfix") ("spanish-alt-postfix", "swedish-alt-postfix"): Deleted; they were identical to the non-alt versions. --- leim/ChangeLog | 12 ++ leim/quail/latin-alt.el | 398 ++++------------------------------------ 2 files changed, 48 insertions(+), 362 deletions(-) diff --git a/leim/ChangeLog b/leim/ChangeLog index 2beefa938ee..5f118f55fc4 100644 --- a/leim/ChangeLog +++ b/leim/ChangeLog @@ -1,3 +1,15 @@ +2007-12-15 Richard Stallman <rms@gnu.org> + + * quail/latin-post.el ("scandinavian-postfix"): Doc fix. + + * quail/latin-alt.el: Many doc fixes. + ("danish-alt-postfix") + ("esperanto-alt-postfix", "finnish-alt-postfix") + ("german-alt-postfix", "icelandic-alt-postfix") + ("norwegian-alt-postfix", "scandinavian-alt-postfix") + ("spanish-alt-postfix", "swedish-alt-postfix"): + Deleted; they were identical to the non-alt versions. + 2007-10-31 Glenn Morris <rgm@gnu.org> * Makefile.in (install): Change ownership of installed files. diff --git a/leim/quail/latin-alt.el b/leim/quail/latin-alt.el index 85b3bd598d5..30b3598fcba 100644 --- a/leim/quail/latin-alt.el +++ b/leim/quail/latin-alt.el @@ -25,10 +25,18 @@ ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. -;; Author: TAKAHASHI Naoto <ntakahas@etl.go.jp> +;; Author (of latin-post.el): TAKAHASHI Naoto <ntakahas@etl.go.jp> ;;; Commentary: +;; These input methods differ from those in latin-post.el +;; in that comma is not special (use / instead), +;; and // is not special either (so you can enter a slash +;; by typing //). + +;; At least, that's what I could see by comparing the first few +;; of these with latin-post.el. + ;;; Code: (require 'quail) @@ -36,6 +44,9 @@ (quail-define-package "latin-1-alt-postfix" "Latin-1" "1<" t "Latin-1 character input method with postfix modifiers +This input method differs from `latin-1-postfix' in that +comma is not special (use slash instead), and `//' is not +special (so you can use that to enter a slash). | postfix | examples ------------+---------+---------- @@ -49,9 +60,9 @@ others | /<> | s/ -> ,A_(B ?/ -> ,A?(B !/ -> ,A!(B | various | << -> ,A+(B >> -> ,A;(B o_ -> ,A:(B a_ -> ,A*(B -It would be natural to use comma for cedillas, but that would be -inconvenient in practice because commas are needed very often after a -letter. +It seems natural to use comma for cedillas, but that is +inconvenient in practice because commas are needed very +often after a letter. Doubling the postfix separates the letter and postfix: e.g. a'' -> a' " nil t nil nil nil nil nil nil nil nil t) @@ -199,6 +210,8 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' (quail-define-package "latin-2-alt-postfix" "Latin-2" "2<" t "Latin-2 character input method with postfix modifiers +This input method differs from `latin-2-postfix' in that +comma and period are not special (use ` instead). | postfix | examples ------------+---------+---------- @@ -215,8 +228,8 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' stroke | / | d/ -> ,Bp(B others | / | s/ -> ,B_(B -It would be natural to use period and comma for dots/rings and -cedillas/ogoneks, but that would inconvenient in practice, because +It seems natural to use period and comma for dots/rings and +cedillas/ogoneks, but that is inconvenient in practice, because periods and commas are needed very often after a letter. Doubling the postfix separates the letter and postfix: e.g. a'' -> a' @@ -391,6 +404,9 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' (quail-define-package "latin-3-alt-postfix" "Latin-3" "3<" t "Latin-3 character input method with postfix modifiers +This input method differs from `latin-3-postfix' in that +comma is not special (use ` instead), and period is not +special (use slash instead). | postfix | examples ------------+---------+---------- @@ -561,6 +577,9 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' (quail-define-package "latin-4-alt-postfix" "Latin-4" "4<" t "Latin-4 characters input method with postfix modifiers +This input method differs from `latin-4-postfix' in that +comma is not special (use ` instead), and period is not +special (use ~ instead). | postfix | examples ------------+---------+---------- @@ -577,8 +596,8 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' nordic | / | a/ -> ,De(B e/ -> ,Df(B o/ -> ,Dx(B others | / | s/ -> ,D_(B n/ -> ,D?(B k/ -> ,D"(B -It would be natural to use period and comma for dots and -cedillas/ogoneks, but that would inconvenient in practice, because +It seems natural to use period and comma for dots and +cedillas/ogoneks, but that is inconvenient in practice, because periods and commas are needed very often after a letter. Doubling the postfix separates the letter and postfix: e.g. a'' -> a' @@ -755,6 +774,9 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' (quail-define-package "latin-5-alt-postfix" "Latin-5" "5<" t "Latin-5 characters input method with postfix modifiers +This input method differs from `latin-5-postfix' in that +comma is not special (use ` instead), and period is not +special (use / instead). | postfix | examples ------------+---------+---------- @@ -769,8 +791,8 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' nordic | / | a/ -> ,Me(B e/ -> ,Mf(B o/ -> ,Mx(B others | / | s/ -> ,M_(B -It would be natural to use period and comma for dots and cedillas, but -that would inconvenient in practice, because periods and commas are +It seems natural to use period and comma for dots and cedillas, but +that is inconvenient in practice, because periods and commas are needed very often after a letter. Doubling the postfix separates the letter and postfix: e.g. a'' -> a' @@ -904,119 +926,7 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' ("y\"\"" ["y\""]) ) -(quail-define-package - "danish-alt-postfix" "Latin-1" "DA<" t - "Danish input method (rule: AE -> ,AF(B, OE -> ,AX(B, AA -> ,AE(B, E' -> ,AI(B) -Doubling the postfix separates the letter and postfix: e.g. aee -> ae -" - nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AE" ?,AF(B) - ("ae" ?,Af(B) - ("OE" ?,AX(B) - ("oe" ?,Ax(B) - ("AA" ?,AE(B) - ("aa" ?,Ae(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("AAA" ["AA"]) - ("aaa" ["aa"]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ) - -(quail-define-package - "esperanto-alt-postfix" "Latin-3" "EO<" t - "Esperanto input method with postfix modifiers - -A following ^ or x will produce an accented character, -e.g. c^ -> ,Cf(B gx -> ,Cx(B u^ -> ,C}(B. - -Doubling the postfix separates the letter and postfix, -e.g. a'' -> a'. -" nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("Cx" ?,CF(B) - ("C^" ?,CF(B) - ("cx" ?,Cf(B) - ("c^" ?,Cf(B) - ("Gx" ?,CX(B) - ("G^" ?,CX(B) - ("gx" ?,Cx(B) - ("g^" ?,Cx(B) - ("Hx" ?,C&(B) - ("H^" ?,C&(B) - ("hx" ?,C6(B) - ("h^" ?,C6(B) - ("Jx" ?,C,(B) - ("J^" ?,C,(B) - ("jx" ?,C<(B) - ("j^" ?,C<(B) - ("Sx" ?,C^(B) - ("S^" ?,C^(B) - ("sx" ?,C~(B) - ("s^" ?,C~(B) - ("Ux" ?,C](B) - ("U^" ?,C](B) - ("ux" ?,C}(B) - ("u^" ?,C}(B) - - ("Cxx" ["Cx"]) - ("C^^" ["C^"]) - ("cxx" ["cx"]) - ("c^^" ["c^"]) - ("Gxx" ["Gx"]) - ("G^^" ["G^"]) - ("gxx" ["gx"]) - ("g^^" ["g^"]) - ("Hxx" ["Hx"]) - ("H^^" ["H^"]) - ("hxx" ["hx"]) - ("h^^" ["h^"]) - ("Jxx" ["Jx"]) - ("J^^" ["J^"]) - ("jxx" ["jx"]) - ("j^^" ["j^"]) - ("Sxx" ["Sx"]) - ("S^^" ["S^"]) - ("sxx" ["sx"]) - ("s^^" ["s^"]) - ("Uxx" ["Ux"]) - ("U^^" ["U^"]) - ("uxx" ["ux"]) - ("u^^" ["u^"]) - ) - -(quail-define-package - "finnish-alt-postfix" "Latin-1" "FI<" t - "Finnish (Suomi) input method - -AE -> ,AD(B -AEE -> AE -OE -> ,AV(B -OEE -> OE -" - nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AE" ?,AD(B) - ("ae" ?,Ad(B) - ("OE" ?,AV(B) - ("oe" ?,Av(B) - - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ) (quail-define-package "french-alt-postfix" "French" "FR<" t @@ -1093,100 +1003,7 @@ Par exemple: e'' -> e' (">>>" [">>"]) ) -(quail-define-package - "german-alt-postfix" "German" "DE<" t - "German (Deutsch) input method -ae -> ,Ad(B -aee -> ae -oe -> ,Av(B -oee -> oe -ue -> ,A|(B -uee -> ue -sz -> ,A_(B -szz -> sz -" - nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AE" ?,AD(B) - ("ae" ?,Ad(B) - ("OE" ?,AV(B) - ("oe" ?,Av(B) - ("UE" ?,A\(B) - ("ue" ?,A|(B) - ("sz" ?,A_(B) - - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("UEE" ["UE"]) - ("uee" ["ue"]) - ("szz" ["sz"]) - ) - -(quail-define-package - "icelandic-alt-postfix" "Latin-1" "IS<" t - "Icelandic (,AM(Bslenska) input method with postfix modifiers - -A' -> ,AA(B -E' -> ,AI(B -I' -> ,AM(B -O' -> ,AS(B -U' -> ,AZ(B -Y' -> ,A](B -AE -> ,AF(B -OE -> ,AV(B -D/ -> ,AP(B (eth) -T/ -> ,A^(B (thorn) - -Doubling the postfix separates the letter and postfix: e.g. a'' -> a' -" nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("A'" ?,AA(B) - ("a'" ?,Aa(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - ("I'" ?,AM(B) - ("i'" ?,Am(B) - ("O'" ?,AS(B) - ("o'" ?,As(B) - ("U'" ?,AZ(B) - ("u'" ?,Az(B) - ("Y'" ?,A](B) - ("y'" ?,A}(B) - ("AE" ?,AF(B) - ("ae" ?,Af(B) - ("OE" ?,AV(B) - ("oe" ?,Av(B) - ("D/" ?,AP(B) - ("d/" ?,Ap(B) - ("T/" ?,A^(B) - ("t/" ?,A~(B) - - ("A''" ["A'"]) - ("a''" ["a'"]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ("I''" ["I'"]) - ("i''" ["i'"]) - ("O''" ["O'"]) - ("o''" ["o'"]) - ("U''" ["U'"]) - ("u''" ["u'"]) - ("Y''" ["Y'"]) - ("y''" ["y'"]) - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("D//" ["D/"]) - ("d//" ["d/"]) - ("T//" ["T/"]) - ("t//" ["t/"]) - ) (quail-define-package "italian-alt-postfix" "Latin-1" "IT<" t @@ -1259,157 +1076,12 @@ Doubling the postfix separates the letter and postfix: e.g. a`` -> a` ("a__" ["a_"]) ) -(quail-define-package - "norwegian-alt-postfix" "Latin-1" "NO<" t - "Norwegian (Norsk) input method (rule: AE->,AF(B, OE->,AX(B, AA->,AE(B, E'->,AI(B) - -Doubling the postfix separates the letter and postfix: e.g. aee -> ae -" - nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AE" ?,AF(B) - ("ae" ?,Af(B) - ("OE" ?,AX(B) - ("oe" ?,Ax(B) - ("AA" ?,AE(B) - ("aa" ?,Ae(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("AAA" ["AA"]) - ("aaa" ["aa"]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ) - -(quail-define-package - "scandinavian-alt-postfix" "Latin-1" "SC<" t - "Scandinavian input method with postfix modifiers -Supported languages are Swedish, Norwegian, Danish, and Finnish. - -ae -> ,Af(B -oe -> ,Ax(B -aa -> ,Ae(B -a\" -> ,Ad(B -o\" -> ,Av(B -e' -> ,Ai(B - -Doubling the postfix separates the letter and postfix: -aee -> ae o\"\" -> o\" etc. -" nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AE" ?,AF(B) - ("ae" ?,Af(B) - ("OE" ?,AX(B) - ("oe" ?,Ax(B) - ("AA" ?,AE(B) - ("aa" ?,Ae(B) - ("A\"" ?,AD(B) - ("a\"" ?,Ad(B) - ("O\"" ?,AV(B) - ("o\"" ?,Av(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("AAA" ["AA"]) - ("aaa" ["aa"]) - ("A\"\"" ["A\""]) - ("a\"\"" ["a\""]) - ("O\"\"" ["O\""]) - ("o\"\"" ["o\""]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ) - -(quail-define-package - "spanish-alt-postfix" "Spanish" "ES<" t - "Spanish (Espa,Aq(Bol) input method with postfix modifiers - -A' -> ,AA(B -E' -> ,AI(B -I' -> ,AM(B -O' -> ,AS(B -U' -> ,AZ(B -N~ -> ,AQ(B -!/ -> ,A!(B -?/ -> ,A?(B - -Doubling the postfix separates the letter and postfix: -a'' -> a' n~~ -> n~, etc. -" nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("A'" ?,AA(B) - ("a'" ?,Aa(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - ("I'" ?,AM(B) - ("i'" ?,Am(B) - ("O'" ?,AS(B) - ("o'" ?,As(B) - ("U'" ?,AZ(B) - ("u'" ?,Az(B) - ("N~" ?,AQ(B) - ("n~" ?,Aq(B) - ("?/" ?,A?(B) - ("!/" ?,A!(B) - - ("A''" ["A'"]) - ("a''" ["a'"]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ("I''" ["I'"]) - ("i''" ["i'"]) - ("O''" ["O'"]) - ("o''" ["o'"]) - ("U''" ["U'"]) - ("u''" ["u'"]) - ("N~~" ["N~"]) - ("n~~" ["n~"]) - ("?//" ["?/"]) - ("!//" ["!/"]) - ) - -(quail-define-package - "swedish-alt-postfix" "Latin-1" "SV<" t - "Swedish (Svenska) input method (rule: AA -> ,AE(B, AE -> ,AD(B, OE -> ,AV(B, E' -> ,AI(B) - -Doubling the postfix separates the letter and postfix: e.g. aee -> ae -" nil t nil nil nil nil nil nil nil nil t) - -(quail-define-rules - ("AA" ?,AE(B) - ("aa" ?,Ae(B) - ("AE" ?,AD(B) - ("ae" ?,Ad(B) - ("OE" ?,AV(B) - ("oe" ?,Av(B) - ("E'" ?,AI(B) - ("e'" ?,Ai(B) - - ("AAA" ["AA"]) - ("aaa" ["aa"]) - ("AEE" ["AE"]) - ("aee" ["ae"]) - ("OEE" ["OE"]) - ("oee" ["oe"]) - ("E''" ["E'"]) - ("e''" ["e'"]) - ) (quail-define-package "turkish-latin-3-alt-postfix" "Turkish" "TR3<<" t "Turkish (T,A|(Brk,Ag(Be) input method with postfix modifiers. +This input method differs from `turkish-latin-3-postfix' in that +comma is not special (use ` instead). This is for those who use Latin-3 (ISO-8859-3) for Turkish. If you use Latin-5 (ISO-8859-9), you should use \"turkish-alt-postfix\" instead. @@ -1472,6 +1144,8 @@ Doubling the postfix separates the letter and postfix: e.g. a^^ -> a^ (quail-define-package "turkish-alt-postfix" "Turkish" "TR,A+(B" t "Turkish (T,A|(Brk,Ag(Be) input method with postfix modifiers. +This input method differs from `turkish-postfix' in that +comma is not special (use ` instead). This is for those who use Latin-5 (ISO-8859-9) for Turkish. If you use Latin-3 (ISO-8859-3), you should use From f5e0def798c3e77ea8212f0b18c15b06456b1773 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:32:17 +0000 Subject: [PATCH 167/172] (menu-bar-describe-menu): Remove dots from menu text. --- lisp/menu-bar.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 525ed0dd7af..a6d64c4007d 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1213,7 +1213,7 @@ mail status in mode line")) :visible default-enable-multibyte-characters :help "Display multilingual environment settings")) (define-key menu-bar-describe-menu [describe-coding-system-briefly] - '(menu-item "Describe Coding System (Briefly)..." + '(menu-item "Describe Coding System (Briefly)" describe-current-coding-system-briefly :visible default-enable-multibyte-characters)) (define-key menu-bar-describe-menu [describe-coding-system] From d4a629de23fa30fabaa3a5d74b909dffb5a8f590 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:33:43 +0000 Subject: [PATCH 168/172] (fancy-splash-help-echo): Var deleted. (fancy-splash-insert): Get help-echo from (startup-echo-area-message). (fancy-about-screen): Don't display fancy-splash-help-echo. --- lisp/startup.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lisp/startup.el b/lisp/startup.el index ad09ff2e834..82b6a449025 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1288,8 +1288,6 @@ Each element in the list should be a list of strings or pairs ;; These are temporary storage areas for the splash screen display. -(defvar fancy-splash-help-echo nil) - (defun fancy-splash-insert (&rest args) "Insert text into the current buffer, with faces. Arguments from ARGS should be either strings; functions called @@ -1323,7 +1321,7 @@ a face or button specification." (funcall it) it)) 'face current-face - 'help-echo fancy-splash-help-echo)))) + 'help-echo (startup-echo-area-message))))) (setq args (cdr args))))) @@ -1505,8 +1503,6 @@ splash screen in another window." (dolist (text fancy-about-text) (apply #'fancy-splash-insert text) (insert "\n")) - (unless (current-message) - (message fancy-splash-help-echo)) (set-buffer-modified-p nil) (goto-char (point-min)) (force-mode-line-update)) From 274bcfe0da6a0fcd91088c09b60fa771bb1b591d Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:34:37 +0000 Subject: [PATCH 169/172] (Info-clone-buffer): Renamed from Info-clone-buffer-hook. Use changed. --- lisp/info.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/info.el b/lisp/info.el index 07bce5bd487..fb652af1ead 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -3467,7 +3467,7 @@ Advanced commands: (setq widen-automatically nil) (setq desktop-save-buffer 'Info-desktop-buffer-misc-data) (add-hook 'kill-buffer-hook 'Info-kill-buffer nil t) - (add-hook 'clone-buffer-hook 'Info-clone-buffer-hook nil t) + (add-hook 'clone-buffer-hook 'Info-clone-buffer nil t) (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) (add-hook 'isearch-mode-hook 'Info-isearch-start nil t) (set (make-local-variable 'isearch-search-fun-function) @@ -3488,7 +3488,8 @@ Advanced commands: Info-tag-table-buffer (kill-buffer Info-tag-table-buffer))) -(defun Info-clone-buffer-hook () +;; Placed on `clone-buffer-hook'. +(defun Info-clone-buffer () (when (bufferp Info-tag-table-buffer) (setq Info-tag-table-buffer (with-current-buffer Info-tag-table-buffer (clone-buffer)))) From d83b2f141513bad557e2cf0e7751e7cfdf1e975e Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:39:21 +0000 Subject: [PATCH 170/172] (find-function-after-hook): Add :type. --- lisp/ChangeLog | 13 +++++++++++++ lisp/emacs-lisp/find-func.el | 1 + 2 files changed, 14 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 697fd4d3e31..1de9482c041 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,16 @@ +2007-12-15 Richard Stallman <rms@gnu.org> + + * emacs-lisp/find-func.el (find-function-after-hook): Add :type. + + * info.el (Info-clone-buffer): Renamed from Info-clone-buffer-hook. + Use changed. + + * startup.el (fancy-splash-help-echo): Var deleted. + (fancy-splash-insert): Get help-echo from (startup-echo-area-message). + (fancy-about-screen): Don't display fancy-splash-help-echo. + + * menu-bar.el (menu-bar-describe-menu): Remove dots from menu text. + 2007-12-12 Thien-Thi Nguyen <ttn@gnuvola.org> * progmodes/cc-vars.el (defcustom-c-stylevar): Rewrite. diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el index ede196721ae..fde70a173cc 100644 --- a/lisp/emacs-lisp/find-func.el +++ b/lisp/emacs-lisp/find-func.el @@ -135,6 +135,7 @@ See `find-function' and `find-variable'." "Hook run after finding symbol definition. See the functions `find-function' and `find-variable'." + :type 'hook :group 'find-function :version "20.3") From a2586785fb5d84e457a4489cfbc3d6d604c1d410 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" <rms@gnu.org> Date: Sat, 15 Dec 2007 22:45:39 +0000 Subject: [PATCH 171/172] (Auto Save): Clarify definition of auto-saving. --- man/ChangeLog | 4 ++++ man/files.texi | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/man/ChangeLog b/man/ChangeLog index 3393712ba0a..7a3253b31c5 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,7 @@ +2007-12-15 Richard Stallman <rms@gnu.org> + + * files.texi (Auto Save): Clarify definition of auto-saving. + 2007-11-28 Katsumi Yamaoka <yamaoka@jpl.org> * gnus.texi (Fancy Mail Splitting): Fix description of splitting based diff --git a/man/files.texi b/man/files.texi index dd2b445b054..bc865db1067 100644 --- a/man/files.texi +++ b/man/files.texi @@ -997,10 +997,11 @@ visit files under version control. @cindex mode, Auto Save @cindex crashes - Emacs saves all the visited files from time to time (based on counting -your keystrokes) without being asked. This is called @dfn{auto-saving}. -It prevents you from losing more than a limited amount of work if the -system crashes. + Emacs saves all the visited files from time to time (based on +counting your keystrokes) without being asked, in separate files so as +not to alter the files you actually use. This is called +@dfn{auto-saving}. It prevents you from losing more than a limited +amount of work if the system crashes. When Emacs determines that it is time for auto-saving, it considers each buffer, and each is auto-saved if auto-saving is enabled for it From bbbe940b6d5834189ea6d48d70a2e8f113cf53e9 Mon Sep 17 00:00:00 2001 From: Miles Bader <miles@gnu.org> Date: Sun, 16 Dec 2007 04:31:33 +0000 Subject: [PATCH 172/172] Merge from gnus--devo--0 Revision: emacs@sv.gnu.org/emacs--devo--0--patch-955 --- doc/misc/ChangeLog | 4 ++ doc/misc/gnus.texi | 2 +- lisp/ChangeLog | 4 ++ lisp/gnus/ChangeLog | 39 +++++++++++++ lisp/gnus/gnus-art.el | 124 ++++++++++++++++++++++------------------- lisp/gnus/gnus-sum.el | 10 ++-- lisp/gnus/gnus-util.el | 24 +++++--- lisp/gnus/mm-decode.el | 31 +++++++++++ lisp/pgg.el | 32 ++++++----- 9 files changed, 184 insertions(+), 86 deletions(-) diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 89e4974490d..8e4eab56b15 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,7 @@ +2007-12-14 Sven Joachim <svenjoac@gmx.de> + + * gnus.texi (Score Variables): Fix typo. + 2007-12-07 Michael Albinus <michael.albinus@gmx.de> * dbus.texi (Synchronous Methods): Adapt dbus-call-method. diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 8ec39ce81fe..4a165c62b25 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -20529,7 +20529,7 @@ Suffix to add to the group name to arrive at the score file name @vindex gnus-score-uncacheable-files @cindex score cache All score files are normally cached to avoid excessive re-loading of -score files. However, if this might make your Emacs grow big and +score files. However, this might make your Emacs grow big and bloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of @file{all.SCORE}, while it might be a good idea to not cache diff --git a/lisp/ChangeLog b/lisp/ChangeLog index fffb1e03f60..fb82a128413 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -18,6 +18,10 @@ * calc/calc.el (calc-set-mode-line): Use `math-lang-name' to set language name. +2007-12-10 Katsumi Yamaoka <yamaoka@jpl.org> + + * pgg.el (pgg-run-at-time, pgg-cancel-timer): Use eval-and-compile. + 2007-12-10 Stefan Monnier <monnier@iro.umontreal.ca> * server.el (server-select-display): Fix important typo. diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index cda28979cb1..d8bb4876269 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,38 @@ +2007-12-15 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-art.el (article-verify-x-pgp-sig): Add reference to X-PGP-Sig + format document. + (gnus-mime-delete-part): Don't write description line if empty. + (gnus-article-encrypt-body): Add confirmation for gnus-novice-user. + +2007-12-14 Johan Bockg,Ae(Brd <bojohan@gnu.org> + + * gnus-sum.el (gnus-summary-mark-unread-as-read) + (gnus-summary-mark-read-and-unread-as-read) + (gnus-summary-mark-current-read-and-unread-as-read) + (gnus-summary-mark-unread-as-ticked): Doc fix. + `gnus-mark-article-hook', not `gnus-summary-mark-article-hook'. + +2007-12-14 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-sum.el (gnus-summary-prev-article): Fix doc string. Reported by + Christoph Conrad <christoph.conrad@gmx.de>. + +2007-12-14 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-util.el (gnus-y-or-n-p, gnus-yes-or-no-p): Alias to y-or-n-p and + yes-or-no-p. + +2007-12-11 Katsumi Yamaoka <yamaoka@jpl.org> + + * mm-decode.el (mm-add-meta-html-tag): New function. + (mm-save-part-to-file, mm-pipe-part): Use it + + * gnus-art.el (gnus-article-browse-delete-temp-files): Use + gnus-y-or-n-p instead of y-or-n-p. + (gnus-article-browse-html-parts): Work with message/external-body; use + mm-add-meta-html-tag. + 2007-12-11 Glenn Morris <rgm@gnu.org> * gnus-cache.el: Require gnus-sum not just when compiling. @@ -74,6 +109,10 @@ * spam.el (gnus-extract-address-components): Declare as functions. +2007-12-10 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (gnus-article-browse-html-parts): Decode CTE. + 2007-12-09 Glenn Morris <rgm@gnu.org> * gnus-uu.el (gnus-uu-yenc-article): Use insert-buffer-substring. diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index d8f03ff2cb8..e984372543d 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -2782,9 +2782,9 @@ summary buffer." (or how (setq how gnus-article-browse-delete-temp))) (when (and (eq how 'ask) - (y-or-n-p (format - "Delete all %s temporary HTML file(s)? " - (length gnus-article-browse-html-temp-list))) + (gnus-y-or-n-p (format + "Delete all %s temporary HTML file(s)? " + (length gnus-article-browse-html-temp-list))) (setq how t))) (dolist (file gnus-article-browse-html-temp-list) (when (and (file-exists-p file) @@ -2802,61 +2802,63 @@ summary buffer." "View all \"text/html\" parts from LIST. Recurse into multiparts." ;; Internal function used by `gnus-article-browse-html-article'. - (let ((showed)) + (let (type file charset tmp-file showed) ;; Find and show the html-parts. (dolist (handle list) ;; If HTML, show it: - (when (listp handle) - (cond ((and (bufferp (car handle)) - (string-match "text/html" (car (mm-handle-type handle)))) - (let ((tmp-file (mm-make-temp-file - ;; Do we need to care for 8.3 filenames? - "mm-" nil ".html")) - (charset (mail-content-type-get (mm-handle-type handle) - 'charset))) - (if charset - ;; Add a meta html tag to specify charset. - (mm-with-unibyte-buffer - (insert (with-current-buffer (mm-handle-buffer handle) - (if (eq charset 'gnus-decoded) - (mm-encode-coding-string - (buffer-string) - (setq charset 'utf-8)) - (buffer-string)))) - (setq charset (format "\ -<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">" - charset)) - (goto-char (point-min)) - (let ((case-fold-search t)) - (cond (;; Don't modify existing meta tag. - (re-search-forward "\ -<meta[\t\n\r ]+http-equiv=\"content-type\"[^>]+>" - nil t)) - ((re-search-forward "<head>[\t\n\r ]*" nil t) - (insert charset "\n")) - (t - (re-search-forward "\ -<html\\(?:[\t\n\r ]+[^>]+\\|[\t\n\r ]*\\)>[\t\n\r ]*" - nil t) - (insert "<head>\n" charset "\n</head>\n")))) + (cond ((not (listp handle))) + ((or (equal (car (setq type (mm-handle-type handle))) "text/html") + (and (equal (car type) "message/external-body") + (setq file (or (mail-content-type-get type 'name) + (mail-content-type-get + (mm-handle-disposition handle) + 'filename))) + (or (mm-handle-cache handle) + (condition-case code + (progn (mm-extern-cache-contents handle) t) + (error + (gnus-message 3 "%s" (error-message-string code)) + (when (>= gnus-verbose 3) (sit-for 2)) + nil))) + (progn + (setq handle (mm-handle-cache handle) + type (mm-handle-type handle)) + (equal (car type) "text/html")))) + (when (or (setq charset (mail-content-type-get type 'charset)) + (not file)) + (setq tmp-file (mm-make-temp-file + ;; Do we need to care for 8.3 filenames? + "mm-" nil ".html"))) + (if charset + ;; Add a meta html tag to specify charset. + (mm-with-unibyte-buffer + (insert (if (eq charset 'gnus-decoded) + (mm-encode-coding-string (mm-get-part handle) + (setq charset 'utf-8)) + (mm-get-part handle))) + (if (or (mm-add-meta-html-tag handle charset) + (not file)) (mm-write-region (point-min) (point-max) - tmp-file nil nil nil 'binary t)) - (mm-save-part-to-file handle tmp-file)) - (add-to-list 'gnus-article-browse-html-temp-list tmp-file) - (add-hook 'gnus-summary-prepare-exit-hook - 'gnus-article-browse-delete-temp-files) - (add-hook 'gnus-exit-gnus-hook - (lambda () - (gnus-article-browse-delete-temp-files t))) - ;; FIXME: Warn if there's an <img> tag? - (browse-url-of-file tmp-file) - (setq showed t))) - ;; If multipart, recurse - ((and (stringp (car handle)) - (string-match "^multipart/" (car handle)) - (setq showed - (or showed - (gnus-article-browse-html-parts handle)))))))) + tmp-file nil nil nil 'binary t) + (setq tmp-file nil))) + (when tmp-file + (mm-save-part-to-file handle tmp-file))) + (when tmp-file + (add-to-list 'gnus-article-browse-html-temp-list tmp-file)) + (add-hook 'gnus-summary-prepare-exit-hook + 'gnus-article-browse-delete-temp-files) + (add-hook 'gnus-exit-gnus-hook + (lambda () + (gnus-article-browse-delete-temp-files t))) + ;; FIXME: Warn if there's an <img> tag? + (browse-url-of-file (or tmp-file (expand-file-name file))) + (setq showed t)) + ;; If multipart, recurse + ((and (stringp (car handle)) + (string-match "^multipart/" (car handle)) + (setq showed + (or showed + (gnus-article-browse-html-parts handle))))))) showed)) ;; FIXME: Documentation in texi/gnus.texi missing. @@ -3916,6 +3918,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is (defun article-verify-x-pgp-sig () "Verify X-PGP-Sig." + ;; <ftp://ftp.isc.org/pub/pgpcontrol/FORMAT> (interactive) (if (gnus-buffer-live-p gnus-original-article-buffer) (let ((sig (with-current-buffer gnus-original-article-buffer @@ -4724,8 +4727,9 @@ Deleting parts may malfunction or destroy the article; continue? ")) (handles gnus-article-mime-handles) (none "(none)") (description - (mail-decode-encoded-word-string (or (mm-handle-description data) - none))) + (let ((desc (mm-handle-description data))) + (when desc + (mail-decode-encoded-word-string desc)))) (filename (or (mail-content-type-get (mm-handle-disposition data) 'filename) none)) @@ -4743,7 +4747,8 @@ Deleting parts may malfunction or destroy the article; continue? ")) "| Type: " type "\n" "| Filename: " filename "\n" "| Size (encoded): " bsize " Byte\n" - "| Description: " description "\n" + (when description + (concat "| Description: " description "\n")) "`----\n")) (setcdr data (cdr (mm-make-handle @@ -8003,6 +8008,11 @@ For example: gnus-article-encrypt-protocol-alist nil t)) current-prefix-arg)) + ;; User might hit `K E' instead of `K e', so prompt once. + (when (and gnus-article-encrypt-protocol + gnus-novice-user) + (unless (gnus-y-or-n-p "Really encrypt article(s)? ") + (error "Encrypt aborted."))) (let ((func (cdr (assoc protocol gnus-article-encrypt-protocol-alist)))) (unless func (error "Can't find the encrypt protocol %s" protocol)) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 2f4ccb7307c..62068d85a80 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -7658,7 +7658,7 @@ If BACKWARD, the previous article is selected instead of the next." (gnus-summary-article-subject)))) (defun gnus-summary-prev-article (&optional unread subject) - "Select the article after the current one. + "Select the article before the current one. If UNREAD is non-nil, only unread articles are selected." (interactive "P") (gnus-summary-next-article unread subject t)) @@ -10830,12 +10830,12 @@ The difference between N and the number of marks cleared is returned." (gnus-summary-mark-forward (- n) gnus-unread-mark)) (defun gnus-summary-mark-unread-as-read () - "Intended to be used by `gnus-summary-mark-article-hook'." + "Intended to be used by `gnus-mark-article-hook'." (when (memq gnus-current-article gnus-newsgroup-unreads) (gnus-summary-mark-article gnus-current-article gnus-read-mark))) (defun gnus-summary-mark-read-and-unread-as-read (&optional new-mark) - "Intended to be used by `gnus-summary-mark-article-hook'." + "Intended to be used by `gnus-mark-article-hook'." (let ((mark (gnus-summary-article-mark))) (when (or (gnus-unread-mark-p mark) (gnus-read-mark-p mark)) @@ -10843,7 +10843,7 @@ The difference between N and the number of marks cleared is returned." (or new-mark gnus-read-mark))))) (defun gnus-summary-mark-current-read-and-unread-as-read (&optional new-mark) - "Intended to be used by `gnus-summary-mark-article-hook'." + "Intended to be used by `gnus-mark-article-hook'." (let ((mark (gnus-summary-article-mark))) (when (or (gnus-unread-mark-p mark) (gnus-read-mark-p mark)) @@ -10851,7 +10851,7 @@ The difference between N and the number of marks cleared is returned." (or new-mark gnus-read-mark))))) (defun gnus-summary-mark-unread-as-ticked () - "Intended to be used by `gnus-summary-mark-article-hook'." + "Intended to be used by `gnus-mark-article-hook'." (when (memq gnus-current-article gnus-newsgroup-unreads) (gnus-summary-mark-article gnus-current-article gnus-ticked-mark))) diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 7b36c07da62..56aacf0d5a6 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -337,15 +337,23 @@ Symbols are also allowed; their print names are used instead." ;; Two silly functions to ensure that all `y-or-n-p' questions clear ;; the echo area. -(defun gnus-y-or-n-p (prompt) - (prog1 - (y-or-n-p prompt) - (message ""))) +;; +;; Do we really need these aliases? Workarounds for bugs in the corresponding +;; Emacs functions? Maybe these bug are no longer present in any supported +;; (X)Emacs version? Alias them to the original functions and see if anyone +;; reports a problem. If not, replace with original functions. --rsteib +;; +;; (defun gnus-y-or-n-p (prompt) +;; (prog1 +;; (y-or-n-p prompt) +;; (message ""))) +;; (defun gnus-yes-or-no-p (prompt) +;; (prog1 +;; (yes-or-no-p prompt) +;; (message ""))) -(defun gnus-yes-or-no-p (prompt) - (prog1 - (yes-or-no-p prompt) - (message ""))) +(defalias 'gnus-y-or-n-p 'y-or-n-p) +(defalias 'gnus-yes-or-no-p 'yes-or-no-p) ;; By Frank Schmitt <ich@Frank-Schmitt.net>. Allows to have ;; age-depending date representations. (e.g. just the time if it's diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index 9de9b3d354e..e2c23d9db5a 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1239,9 +1239,39 @@ PROMPT overrides the default one used to ask user for a file name." (mm-save-part-to-file handle file) file)))) +(defun mm-add-meta-html-tag (handle &optional charset) + "Add meta html tag to specify CHARSET of HANDLE in the current buffer. +CHARSET defaults to the one HANDLE specifies. Existing meta tag that +specifies charset will not be modified. Return t if meta tag is added +or replaced." + (when (equal (mm-handle-media-type handle) "text/html") + (when (or charset + (setq charset (mail-content-type-get (mm-handle-type handle) + 'charset))) + (setq charset (format "\ +<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">" charset)) + (let ((case-fold-search t)) + (goto-char (point-min)) + (if (re-search-forward "\ +<meta\\s-+http-equiv=[\"']?content-type[\"']?\\s-+content=[\"']\ +text/\\(\\sw+\\)\\(?:\;\\s-*charset=\\(.+?\\)\\)?[\"'][^>]*>" nil t) + (if (and (match-beginning 2) + (string-match "\\`html\\'" (match-string 1))) + ;; Don't modify existing meta tag. + nil + ;; Replace it with the one specifying charset. + (replace-match charset) + t) + (if (re-search-forward "<head>\\s-*" nil t) + (insert charset "\n") + (re-search-forward "<html\\(?:\\s-+[^>]+\\|\\s-*\\)>\\s-*" nil t) + (insert "<head>\n" charset "\n</head>\n")) + t))))) + (defun mm-save-part-to-file (handle file) (mm-with-unibyte-buffer (mm-insert-part handle) + (mm-add-meta-html-tag handle) (let ((current-file-modes (default-file-modes))) (set-default-file-modes mm-attachment-file-modes) (unwind-protect @@ -1258,6 +1288,7 @@ PROMPT overrides the default one used to ask user for a file name." (read-string "Shell command on MIME part: " mm-last-shell-command))) (mm-with-unibyte-buffer (mm-insert-part handle) + (mm-add-meta-html-tag handle) (let ((coding-system-for-write 'binary)) (shell-command-on-region (point-min) (point-max) command nil))))) diff --git a/lisp/pgg.el b/lisp/pgg.el index 74b6ed7cb22..26911974ea6 100644 --- a/lisp/pgg.el +++ b/lisp/pgg.el @@ -42,12 +42,10 @@ ;;; (eval-when-compile - (unless (featurep 'xemacs) - (defalias 'pgg-run-at-time 'run-at-time) - (defalias 'pgg-cancel-timer 'cancel-timer)) - - (when (featurep 'xemacs) - (defmacro pgg-run-at-time-1 (time repeat function args) + ;; Define it as a null macro for Emacs in order to suppress a byte + ;; compile warning that Emacs 21 issues. + (defmacro pgg-run-at-time-1 (time repeat function args) + (when (featurep 'xemacs) (if (condition-case nil (let ((delete-itimer 'delete-itimer) (itimer-driver-start 'itimer-driver-start) @@ -105,19 +103,23 @@ itimer (append (list itimer function) args))))) 1e-9 (if time (max time 1e-9) 1e-9) - nil t itimers ,repeat ,function ,args)))) + nil t itimers ,repeat ,function ,args)))))) - (defun pgg-run-at-time (time repeat function &rest args) - "Emulating function run as `run-at-time'. +(eval-and-compile + (if (featurep 'xemacs) + (progn + (defun pgg-run-at-time (time repeat function &rest args) + "Emulating function run as `run-at-time'. TIME should be nil meaning now, or a number of seconds from now. Return an itimer object which can be used in either `delete-itimer' or `cancel-timer'." - (pgg-run-at-time-1 time repeat function args)) - (defun pgg-cancel-timer (timer) - "Emulate cancel-timer for xemacs." - (let ((delete-itimer 'delete-itimer)) - (funcall delete-itimer timer))) - )) + (pgg-run-at-time-1 time repeat function args)) + (defun pgg-cancel-timer (timer) + "Emulate cancel-timer for xemacs." + (let ((delete-itimer 'delete-itimer)) + (funcall delete-itimer timer)))) + (defalias 'pgg-run-at-time 'run-at-time) + (defalias 'pgg-cancel-timer 'cancel-timer))) (defun pgg-invoke (func scheme &rest args) (progn