Mercurial > emacs
diff lisp/progmodes/cc-defs.el @ 89909:68c22ea6027c
Sync to HEAD
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 16 Apr 2004 12:51:06 +0000 |
parents | 375f2633d815 |
children | d8411455de48 |
line wrap: on
line diff
--- a/lisp/progmodes/cc-defs.el Thu Apr 15 01:08:34 2004 +0000 +++ b/lisp/progmodes/cc-defs.el Fri Apr 16 12:51:06 2004 +0000 @@ -100,12 +100,12 @@ font-lock-keywords))) (cc-load "cc-fix"))) -(cc-external-require 'cl) +(eval-when-compile (require 'cl)) ;;; Variables also used at compile time. -(defconst c-version "5.30.5" +(defconst c-version "5.30.8" "CC Mode version number.") (defconst c-version-sym (intern c-version)) @@ -115,10 +115,10 @@ "Non-nil for all buffers with a major mode derived from CC Mode. Otherwise, this variable is nil. I.e. this variable is non-nil for `c-mode', `c++-mode', `objc-mode', `java-mode', `idl-mode', -`pike-mode', and any other non-CC Mode mode that calls -`c-initialize-cc-mode' (e.g. `awk-mode'). The value is the mode -symbol itself (i.e. `c-mode' etc) of the original CC Mode mode, or -just t if it's not known.") +`pike-mode', `awk-mode', and any other non-CC Mode mode that calls +`c-initialize-cc-mode'. The value is the mode symbol itself +\(i.e. `c-mode' etc) of the original CC Mode mode, or just t if it's +not known.") (make-variable-buffer-local 'c-buffer-is-cc-mode) ;; Have to make `c-buffer-is-cc-mode' permanently local so that it @@ -1001,8 +1001,8 @@ (defun c-make-keywords-re (adorn list &optional mode) "Make a regexp that matches all the strings the list. -Duplicates in the list are removed. The regexp may contain zero or -more submatch expressions. +Duplicates in the list are removed. The resulting regexp may contain +zero or more submatch expressions. If ADORN is non-nil there will be at least one submatch and the first matches the whole keyword, and the regexp will also not match a prefix @@ -1010,6 +1010,7 @@ variable `c-nonsymbol-key' is used to make the adornment. The optional MODE specifies the language to get it in. The default is the current language (taken from `c-buffer-is-cc-mode')." + (let (unique) (dolist (elt list) (unless (member elt unique) @@ -1017,6 +1018,27 @@ (setq list unique)) (if list (let ((re (c-regexp-opt list))) + + ;; Emacs < 21 and XEmacs (all versions so far) has a buggy + ;; regexp-opt that doesn't always cope with strings containing + ;; newlines. This kludge doesn't handle shy parens correctly + ;; so we can't advice regexp-opt directly with it. + (let (fail-list) + (while list + (and (string-match "\n" (car list)) ; To speed it up a little. + (not (string-match (concat "\\`\\(" re "\\)\\'") + (car list))) + (setq fail-list (cons (car list) fail-list))) + (setq list (cdr list))) + (when fail-list + (setq re (concat re + "\\|" + (mapconcat 'regexp-quote + (sort fail-list + (lambda (a b) + (> (length a) (length b)))) + "\\|"))))) + ;; Add our own grouping parenthesis around re instead of ;; passing adorn to `regexp-opt', since in XEmacs it makes the ;; top level grouping "shy". @@ -1026,10 +1048,12 @@ (c-get-lang-constant 'c-nonsymbol-key nil mode) "\\|$\\)") re)) + ;; Produce a regexp that matches nothing. (if adorn "\\(\\<\\>\\)" "\\<\\>"))) + (put 'c-make-keywords-re 'lisp-indent-function 1) @@ -1564,4 +1588,5 @@ (cc-provide 'cc-defs) +;;; arch-tag: 3bb2629d-dd84-4ff0-ad39-584be0fe3cda ;;; cc-defs.el ends here