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