emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/progmodes/cc-cmds.el


From: Alan Mackenzie
Subject: [Emacs-diffs] Changes to emacs/lisp/progmodes/cc-cmds.el
Date: Fri, 02 Dec 2005 07:30:39 -0500

Index: emacs/lisp/progmodes/cc-cmds.el
diff -c emacs/lisp/progmodes/cc-cmds.el:1.41 
emacs/lisp/progmodes/cc-cmds.el:1.42
*** emacs/lisp/progmodes/cc-cmds.el:1.41        Sun Sep 25 23:58:28 2005
--- emacs/lisp/progmodes/cc-cmds.el     Fri Dec  2 12:30:35 2005
***************
*** 1,6 ****
  ;;; cc-cmds.el --- user level commands for CC Mode
  
! ;; Copyright (C) 1985,1987,1992-2003, 2004, 2005 Free Software Foundation, 
Inc.
  
  ;; Authors:    1998- Martin Stjernholm
  ;;             1992-1999 Barry A. Warsaw
--- 1,7 ----
  ;;; cc-cmds.el --- user level commands for CC Mode
  
! ;; Copyright (C) 1985,1987,1992-2003, 2004, 2005 Free Software Foundation,
! ;; Inc.
  
  ;; Authors:    1998- Martin Stjernholm
  ;;             1992-1999 Barry A. Warsaw
***************
*** 24,30 ****
  ;; GNU General Public License for more details.
  
  ;; You should have received a copy of the GNU General Public License
! ;; 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.
  
--- 25,31 ----
  ;; GNU General Public License for more details.
  
  ;; You should have received a copy of the GNU General Public License
! ;; along with this program; see the file COPYING.  If not, write to
  ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  ;; Boston, MA 02110-1301, USA.
  
***************
*** 45,56 ****
  (cc-require 'cc-engine)
  
  ;; Silence the compiler.
! (cc-bytecomp-defvar delete-key-deletes-forward) ; XEmacs 20+
! (cc-bytecomp-defun delete-forward-p)  ; XEmacs 21+
! (cc-bytecomp-obsolete-fun insert-and-inherit) ; Marked obsolete in XEmacs 19
  (cc-bytecomp-defvar filladapt-mode)   ; c-fill-paragraph contains a kludge
                                        ; which looks at this.
! 
  
  (defvar c-fix-backslashes t)
  
--- 46,56 ----
  (cc-require 'cc-engine)
  
  ;; Silence the compiler.
! (cc-bytecomp-defun delete-forward-p)  ; XEmacs
  (cc-bytecomp-defvar filladapt-mode)   ; c-fill-paragraph contains a kludge
                                        ; which looks at this.
! (cc-bytecomp-defun c-forward-subword)
! (cc-bytecomp-defun c-backward-subword)
  
  (defvar c-fix-backslashes t)
  
***************
*** 64,71 ****
  is otherwise empty \(ignoring any line continuation backslash), but
  that's not done if IGNORE-POINT-POS is non-nil.  Returns the amount of
  indentation change \(in columns)."
-   ;;
-   ;; This function does not do any hidden buffer changes.
  
    (let ((line-cont-backslash (save-excursion
                               (end-of-line)
--- 64,69 ----
***************
*** 134,146 ****
      shift-amt))
  
  (defun c-newline-and-indent (&optional newline-arg)
!   "Inserts a newline and indents the new line.
  This function fixes line continuation backslashes if inside a macro,
  and takes care to set the indentation before calling
  `indent-according-to-mode', so that lineup functions like
  `c-lineup-dont-change' works better."
-   ;;
-   ;; This function does not do any hidden buffer changes.
  
    ;; TODO: Backslashes before eol in comments and literals aren't
    ;; kept intact.
--- 132,142 ----
      shift-amt))
  
  (defun c-newline-and-indent (&optional newline-arg)
!   "Insert a newline and indent the new line.
  This function fixes line continuation backslashes if inside a macro,
  and takes care to set the indentation before calling
  `indent-according-to-mode', so that lineup functions like
  `c-lineup-dont-change' works better."
  
    ;; TODO: Backslashes before eol in comments and literals aren't
    ;; kept intact.
***************
*** 221,234 ****
                   (c-save-buffer-state nil
                     (c-guess-basic-syntax)))))
      (if (not (consp arg))
!       (message "syntactic analysis: %s" syntax)
        (indent-for-comment)
        (insert-and-inherit (format "%s" syntax))
        ))
    (c-keep-region-active))
  
  (defun c-syntactic-information-on-region (from to)
!   "Inserts a comment with the syntactic analysis on every line in the region."
    (interactive "*r")
    (save-excursion
      (save-restriction
--- 217,246 ----
                   (c-save-buffer-state nil
                     (c-guess-basic-syntax)))))
      (if (not (consp arg))
!       (let (elem pos ols)
!         (message "Syntactic analysis: %s" syntax)
!         (unwind-protect
!             (progn
!               (while syntax
!                 (setq elem (pop syntax))
!                 (when (setq pos (c-langelem-pos elem))
!                   (push (c-put-overlay pos (1+ pos)
!                                        'face 'highlight)
!                         ols))
!                 (when (setq pos (c-langelem-2nd-pos elem))
!                   (push (c-put-overlay pos (1+ pos)
!                                        'face 'secondary-selection)
!                         ols)))
!               (sit-for 10))
!           (while ols
!             (c-delete-overlay (pop ols)))))
        (indent-for-comment)
        (insert-and-inherit (format "%s" syntax))
        ))
    (c-keep-region-active))
  
  (defun c-syntactic-information-on-region (from to)
!   "Insert a comment with the syntactic analysis on every line in the region."
    (interactive "*r")
    (save-excursion
      (save-restriction
***************
*** 239,244 ****
--- 251,273 ----
        (forward-line)))))
  
  
+ (defun c-update-modeline ()
+   (let ((fmt (format "/%s%s%s%s"
+                    (if c-electric-flag "l" "")
+                    (if (and c-electric-flag c-auto-newline)
+                        "a" "")
+                    (if c-hungry-delete-key "h" "")
+                    (if (and
+                         ;; cc-subword might not be loaded.
+                         (boundp 'c-subword-mode)
+                         (symbol-value 'c-subword-mode))
+                        "w"
+                      ""))))
+     (setq c-submode-indicators
+         (if (> (length fmt) 1)
+             fmt))
+     (force-mode-line-update)))
+ 
  (defun c-toggle-syntactic-indentation (&optional arg)
    "Toggle syntactic indentation.
  Optional numeric ARG, if supplied, turns on syntactic indentation when
***************
*** 249,260 ****
  functions and the electric keys indent according to the syntactic
  context keys, when applicable.
  
! When it's turned off, the electric keys does no reindentation, the
! indentation functions indents every new line to the same level as the
! previous nonempty line, and \\[c-indent-command] adjusts the
! indentation in seps specified `c-basic-offset'.  The indentation style
! has no effect in this mode, nor any of the indentation associated
! variables, e.g. `c-special-indent-hook'.
  
  This command sets the variable `c-syntactic-indentation'."
    (interactive "P")
--- 278,289 ----
  functions and the electric keys indent according to the syntactic
  context keys, when applicable.
  
! When it's turned off, the electric keys don't reindent, the indentation
! functions indents every new line to the same level as the previous
! nonempty line, and \\[c-indent-command] adjusts the indentation in steps
! specified by `c-basic-offset'.  The indentation style has no effect in
! this mode, nor any of the indentation associated variables,
! e.g. `c-special-indent-hook'.
  
  This command sets the variable `c-syntactic-indentation'."
    (interactive "P")
***************
*** 262,291 ****
        (c-calculate-state arg c-syntactic-indentation))
    (c-keep-region-active))
  
! (defun c-toggle-auto-state (&optional arg)
    "Toggle auto-newline feature.
  Optional numeric ARG, if supplied, turns on auto-newline when
  positive, turns it off when negative, and just toggles it when zero or
  left out.
  
! When the auto-newline feature is enabled (as evidenced by the `/a' or
! `/ah' on the modeline after the mode name) newlines are automatically
! inserted after special characters such as brace, comma, semi-colon,
! and colon."
    (interactive "P")
!   (setq c-auto-newline (c-calculate-state arg c-auto-newline))
    (c-update-modeline)
    (c-keep-region-active))
  
  (defun c-toggle-hungry-state (&optional arg)
    "Toggle hungry-delete-key feature.
  Optional numeric ARG, if supplied, turns on hungry-delete when
  positive, turns it off when negative, and just toggles it when zero or
  left out.
  
! When the hungry-delete-key feature is enabled (as evidenced by the
! `/h' or `/ah' on the modeline after the mode name) the delete key
! gobbles all preceding whitespace in one fell swoop."
    (interactive "P")
    (setq c-hungry-delete-key (c-calculate-state arg c-hungry-delete-key))
    (c-update-modeline)
--- 291,326 ----
        (c-calculate-state arg c-syntactic-indentation))
    (c-keep-region-active))
  
! (defun c-toggle-auto-newline (&optional arg)
    "Toggle auto-newline feature.
  Optional numeric ARG, if supplied, turns on auto-newline when
  positive, turns it off when negative, and just toggles it when zero or
  left out.
  
! Turning on auto-newline automatically enables electric indentation.
! 
! When the auto-newline feature is enabled (indicated by \"/la\" on the
! modeline after the mode name) newlines are automatically inserted
! after special characters such as brace, comma, semi-colon, and colon."
    (interactive "P")
!   (setq c-auto-newline
!       (c-calculate-state arg (and c-auto-newline c-electric-flag)))
!   (if c-auto-newline (setq c-electric-flag t))
    (c-update-modeline)
    (c-keep-region-active))
  
+ (defalias 'c-toggle-auto-state 'c-toggle-auto-newline)
+ (make-obsolete 'c-toggle-auto-state 'c-toggle-auto-newline)
+ 
  (defun c-toggle-hungry-state (&optional arg)
    "Toggle hungry-delete-key feature.
  Optional numeric ARG, if supplied, turns on hungry-delete when
  positive, turns it off when negative, and just toggles it when zero or
  left out.
  
! When the hungry-delete-key feature is enabled (indicated by \"/h\" on
! the modeline after the mode name) the delete key gobbles all preceding
! whitespace in one fell swoop."
    (interactive "P")
    (setq c-hungry-delete-key (c-calculate-state arg c-hungry-delete-key))
    (c-update-modeline)
***************
*** 297,323 ****
  hungry-delete when positive, turns them off when negative, and just
  toggles them when zero or left out.
  
! See `c-toggle-auto-state' and `c-toggle-hungry-state' for details."
    (interactive "P")
    (setq c-auto-newline (c-calculate-state arg c-auto-newline))
    (setq c-hungry-delete-key (c-calculate-state arg c-hungry-delete-key))
    (c-update-modeline)
    (c-keep-region-active))
  
  
  ;; Electric keys
  
  (defun c-electric-backspace (arg)
    "Delete the preceding character or whitespace.
! If `c-hungry-delete-key' is non-nil, as evidenced by the \"/h\" or
! \"/ah\" string on the mode line, then all preceding whitespace is
! consumed.  If however a prefix argument is supplied, or
! `c-hungry-delete-key' is nil, or point is inside a literal then the
! function in the variable `c-backspace-function' is called."
    (interactive "*P")
!   (if (or (not c-hungry-delete-key)
!         arg
!         (c-in-literal))
        (funcall c-backspace-function (prefix-numeric-value arg))
      (c-hungry-backspace)))
  
--- 332,369 ----
  hungry-delete when positive, turns them off when negative, and just
  toggles them when zero or left out.
  
! See `c-toggle-auto-newline' and `c-toggle-hungry-state' for details."
    (interactive "P")
    (setq c-auto-newline (c-calculate-state arg c-auto-newline))
    (setq c-hungry-delete-key (c-calculate-state arg c-hungry-delete-key))
    (c-update-modeline)
    (c-keep-region-active))
  
+ (defun c-toggle-electric-state (&optional arg)
+   "Toggle the electric indentation feature.
+ Optional numeric ARG, if supplied, turns on electric indentation when
+ positive, turns it off when negative, and just toggles it when zero or
+ left out."
+   (interactive "P")
+   (setq c-electric-flag (c-calculate-state arg c-electric-flag))
+   (c-update-modeline)
+   (c-keep-region-active))
+ 
  
  ;; Electric keys
  
  (defun c-electric-backspace (arg)
    "Delete the preceding character or whitespace.
! If `c-hungry-delete-key' is non-nil (indicated by \"/h\" on the mode
! line) then all preceding whitespace is consumed.  If however a prefix
! argument is supplied, or `c-hungry-delete-key' is nil, or point is
! inside a literal then the function in the variable
! `c-backspace-function' is called."
    (interactive "*P")
!   (if (c-save-buffer-state ()
!       (or (not c-hungry-delete-key)
!           arg
!           (c-in-literal)))
        (funcall c-backspace-function (prefix-numeric-value arg))
      (c-hungry-backspace)))
  
***************
*** 334,348 ****
  
  (defun c-electric-delete-forward (arg)
    "Delete the following character or whitespace.
! If `c-hungry-delete-key' is non-nil, as evidenced by the \"/h\" or
! \"/ah\" string on the mode line, then all following whitespace is
! consumed.  If however a prefix argument is supplied, or
! `c-hungry-delete-key' is nil, or point is inside a literal then the
! function in the variable `c-delete-function' is called."
    (interactive "*P")
!   (if (or (not c-hungry-delete-key)
!         arg
!         (c-in-literal))
        (funcall c-delete-function (prefix-numeric-value arg))
      (c-hungry-delete-forward)))
  
--- 380,395 ----
  
  (defun c-electric-delete-forward (arg)
    "Delete the following character or whitespace.
! If `c-hungry-delete-key' is non-nil (indicated by \"/h\" on the mode
! line) then all following whitespace is consumed.  If however a prefix
! argument is supplied, or `c-hungry-delete-key' is nil, or point is
! inside a literal then the function in the variable `c-delete-function'
! is called."
    (interactive "*P")
!   (if (c-save-buffer-state ()
!       (or (not c-hungry-delete-key)
!           arg
!           (c-in-literal)))
        (funcall c-delete-function (prefix-numeric-value arg))
      (c-hungry-delete-forward)))
  
***************
*** 361,403 ****
  (defun c-electric-delete (arg)
    "Deletes preceding or following character or whitespace.
  This function either deletes forward as `c-electric-delete-forward' or
! backward as `c-electric-backspace', depending on the configuration:
! 
! If the function `delete-forward-p' is defined (XEmacs 21) and returns
! non-nil, it deletes forward.  Else, if the variable
! `delete-key-deletes-forward' is defined (XEmacs 20) and is set to
! non-nil, it deletes forward.  Otherwise it deletes backward.
! 
! Note: This is the way in XEmacs 20 and later to choose the correct
! action for the [delete] key, whichever key that means.  In other
! flavors this function isn't used, instead it's left to the user to
! bind [delete] to either \\[c-electric-delete-forward] or 
\\[c-electric-backspace] as appropriate
! \(the keymap `function-key-map' is useful for that).  Emacs 21 handles
! that automatically, though."
    (interactive "*P")
!   (if (or (and (fboundp 'delete-forward-p) ;XEmacs 21
!              (delete-forward-p))
!         (and (boundp 'delete-key-deletes-forward) ;XEmacs 20
!              delete-key-deletes-forward))
        (c-electric-delete-forward arg)
      (c-electric-backspace arg)))
  
  (defun c-electric-pound (arg)
!   "Electric pound (`#') insertion.
! Inserts a `#' character specially depending on the variable
! `c-electric-pound-behavior'.  If a numeric ARG is supplied, or if
! point is inside a literal or a macro, nothing special happens."
    (interactive "*P")
!   (if (or arg
!         (not (memq 'alignleft c-electric-pound-behavior))
!         (save-excursion
!           (skip-chars-backward " \t")
!           (not (bolp)))
!         (save-excursion
!           (and (= (forward-line -1) 0)
!                (progn (end-of-line)
!                       (eq (char-before) ?\\))))
!         (c-in-literal))
        ;; do nothing special
        (self-insert-command (prefix-numeric-value arg))
      ;; place the pound character at the left edge
--- 408,461 ----
  (defun c-electric-delete (arg)
    "Deletes preceding or following character or whitespace.
  This function either deletes forward as `c-electric-delete-forward' or
! backward as `c-electric-backspace', depending on the configuration: If
! the function `delete-forward-p' is defined and returns non-nil, it
! deletes forward.  Otherwise it deletes backward.
! 
! Note: This is the way in XEmacs to choose the correct action for the
! \[delete] key, whichever key that means.  Other flavors don't use this
! function to control that."
    (interactive "*P")
!   (if (and (fboundp 'delete-forward-p)
!          (delete-forward-p))
        (c-electric-delete-forward arg)
      (c-electric-backspace arg)))
  
+ ;; This function is only used in XEmacs.
+ (defun c-hungry-delete ()
+   "Delete a non-whitespace char, or all whitespace up to the next 
non-whitespace char.
+ The direction of deletion depends on the configuration: If the
+ function `delete-forward-p' is defined and returns non-nil, it deletes
+ forward using `c-hungry-delete-forward'.  Otherwise it deletes
+ backward using `c-hungry-backspace'.
+ 
+ Note: This is the way in XEmacs to choose the correct action for the
+ \[delete] key, whichever key that means.  Other flavors don't use this
+ function to control that."
+   (interactive)
+   (if (and (fboundp 'delete-forward-p)
+          (delete-forward-p))
+       (c-hungry-delete-forward)
+     (c-hungry-backspace)))
+ 
  (defun c-electric-pound (arg)
!   "Insert a \"#\".
! If `c-electric-flag' is set, handle it specially according to the variable
! `c-electric-pound-behavior'.  If a numeric ARG is supplied, or if point is
! inside a literal or a macro, nothing special happens."
    (interactive "*P")
!   (if (c-save-buffer-state ()
!       (or arg
!           (not c-electric-flag)
!           (not (memq 'alignleft c-electric-pound-behavior))
!           (save-excursion
!             (skip-chars-backward " \t")
!             (not (bolp)))
!           (save-excursion
!             (and (= (forward-line -1) 0)
!                  (progn (end-of-line)
!                         (eq (char-before) ?\\))))
!           (c-in-literal)))
        ;; do nothing special
        (self-insert-command (prefix-numeric-value arg))
      ;; place the pound character at the left edge
***************
*** 410,652 ****
           (goto-char (- (point-max) pos)))
        )))
  
  (defun c-electric-brace (arg)
    "Insert a brace.
  
! If the auto-newline feature is turned on, as evidenced by the \"/a\"
! or \"/ah\" string on the mode line, newlines are inserted before and
! after braces based on the value of `c-hanging-braces-alist'.
! 
! Also, the line is re-indented unless a numeric ARG is supplied, the
! brace is inserted inside a literal, or `c-syntactic-indentation' is
! nil.
  
- This function does various newline cleanups based on the value of
- `c-cleanup-list'."
    (interactive "*P")
!   (let* ((safepos (c-safe-position (point) (c-parse-state)))
!        (literal (c-in-literal safepos))
!        ;; We want to inhibit blinking the paren since this will be
!        ;; most disruptive.  We'll blink it ourselves later on.
!        (old-blink-paren blink-paren-function)
!        blink-paren-function)
!     (cond
!      ((or literal arg)
!       (self-insert-command (prefix-numeric-value arg)))
!      ((not (looking-at "[ \t]*\\\\?$"))
!       (self-insert-command (prefix-numeric-value arg))
!       (if c-syntactic-indentation
!         (indent-according-to-mode)))
!      (t
!       (let* ((syms
!             ;; This is the list of brace syntactic symbols that can
!             ;; hang.  If any new ones are added to c-offsets-alist,
!             ;; they should be added here as well.
!             '(class-open class-close defun-open defun-close
!               inline-open inline-close
!               brace-list-open brace-list-close
!               brace-list-intro brace-entry-open
!               block-open block-close
!               substatement-open statement-case-open
!               extern-lang-open extern-lang-close
!               namespace-open namespace-close
!               module-open module-close
!                 composition-open composition-close
!               inexpr-class-open inexpr-class-close
!               ;; `statement-cont' is here for the case with a brace
!               ;; list opener inside a statement.  C.f. CASE B.2 in
!               ;; `c-guess-continued-construct'.
!               statement-cont))
!            (insertion-point (point))
!            (preserve-p (and (not (bobp))
!                             (eq ?\  (char-syntax (char-before)))))
!            ;; shut this up too
!            (c-echo-syntactic-information-p nil)
!            delete-temp-newline syntax newlines)
!       ;; only insert a newline if there is non-whitespace behind us
!       (when (save-excursion
!               (skip-chars-backward " \t")
!               (not (bolp)))
!         (c-newline-and-indent)
!         ;; Set markers around the newline and indention inserted
!         ;; above.  We insert the start marker here and not before
!         ;; the call to kludge around a misfeature in expand-abbrev:
!         ;; If the line contains e.g. "else" then expand-abbrev will
!         ;; be called when c-newline-and-indent inserts the newline.
!         ;; That function first removes the abbrev "else" and then
!         ;; inserts the expansion, which is an identical "else" in
!         ;; this case.  So the marker that we put after "else" would
!         ;; end up before it.
!         (setq delete-temp-newline
!               (cons (save-excursion
!                       (end-of-line 0)
!                       (if (eq (char-before) ?\\)
!                           ;; Ignore a line continuation.
!                           (backward-char))
!                       (skip-chars-backward " \t")
!                       (copy-marker (point) t))
!                     (point-marker))))
!       (unwind-protect
!           (progn
!             (if (eq last-command-char ?{)
!                 (setq c-state-cache (cons (point) c-state-cache)))
!             (self-insert-command (prefix-numeric-value arg))
!             (c-save-buffer-state ((c-syntactic-indentation-in-macros t)
!                                   (c-auto-newline-analysis t))
!               ;; Turn on syntactic macro analysis to help with auto
!               ;; newlines only.
!               (setq syntax (c-guess-basic-syntax)))
!             (setq newlines
!                   (and
!                    c-auto-newline
!                    (or (c-lookup-lists
!                         syms
!                         ;; Substitute inexpr-class and class-open or
!                         ;; class-close with inexpr-class-open or
!                         ;; inexpr-class-close.
!                         (if (assq 'inexpr-class syntax)
!                             (cond ((assq 'class-open syntax)
!                                    '((inexpr-class-open)))
!                                   ((assq 'class-close syntax)
!                                    '((inexpr-class-close)))
!                                   (t syntax))
!                           syntax)
!                         c-hanging-braces-alist)
!                        '(ignore before after))))
!             ;; Do not try to insert newlines around a special
!             ;; (Pike-style) brace list.
!             (if (and c-special-brace-lists
!                      (save-excursion
!                        (c-save-buffer-state nil
!                          (c-safe (if (= (char-before) ?{)
!                                      (forward-char -1)
!                                    (c-forward-sexp -1))
!                                  (c-looking-at-special-brace-list)))))
!                 (setq newlines nil))
!             ;; If syntax is a function symbol, then call it using the
!             ;; defined semantics.
!             (if (and (not (consp (cdr newlines)))
!                      (functionp (cdr newlines)))
!                 (let ((c-syntactic-context syntax))
!                   (setq newlines
!                         (funcall (cdr newlines)
!                                  (car newlines)
!                                  insertion-point))))
!             ;; does a newline go before the open brace?
!             (when (memq 'before newlines)
!               ;; we leave the newline we've put in there before,
!               ;; but we need to re-indent the line above
!               (when delete-temp-newline
!                 (set-marker (car delete-temp-newline) nil)
!                 (set-marker (cdr delete-temp-newline) nil)
!                 (setq delete-temp-newline nil))
!               (when c-syntactic-indentation
!                 (let ((pos (- (point-max) (point)))
!                       (here (point)))
!                   (forward-line -1)
!                   (indent-according-to-mode)
!                   (goto-char (- (point-max) pos))
!                   ;; if the buffer has changed due to the
!                   ;; indentation, we need to recalculate syntax for
!                   ;; the current line.
!                   (if (/= (point) here)
!                       (c-save-buffer-state
!                           ((c-syntactic-indentation-in-macros t)
!                            (c-auto-newline-analysis t))
!                         ;; Turn on syntactic macro analysis to help
!                         ;; with auto newlines only.
!                         (setq syntax (c-guess-basic-syntax))))))))
!         ;; must remove the newline we just stuck in (if we really did it)
!         (when delete-temp-newline
!           (save-excursion
!             (delete-region (car delete-temp-newline)
!                            (cdr delete-temp-newline))
!             (goto-char (car delete-temp-newline))
!             (set-marker (car delete-temp-newline) nil)
!             (set-marker (cdr delete-temp-newline) nil)
!             ;; if there is whitespace before point, then preserve
!             ;; at least one space.
!             (just-one-space)
!             (if (not preserve-p)
!                 (delete-char -1)))))
!       (if (not (memq 'before newlines))
!           ;; since we're hanging the brace, we need to recalculate
!           ;; syntax.
!           (c-save-buffer-state ((c-syntactic-indentation-in-macros t)
!                                 (c-auto-newline-analysis t))
!             ;; Turn on syntactic macro analysis to help with auto
!             ;; newlines only.
!             (setq syntax (c-guess-basic-syntax))))
!       (when c-syntactic-indentation
!         ;; Now adjust the line's indentation.  Don't update the state
!         ;; cache since c-guess-basic-syntax isn't called when
!         ;; c-syntactic-context is set.
!         (let* ((c-syntactic-context syntax))
!           (indent-according-to-mode)))
!       ;; Do all appropriate clean ups
!       (let ((here (point))
!             (pos (- (point-max) (point)))
!             mbeg mend tmp)
!         ;; clean up empty defun braces
!         (if (and c-auto-newline
!                  (memq 'empty-defun-braces c-cleanup-list)
!                  (eq last-command-char ?\})
!                  (c-intersect-lists '(defun-close class-close inline-close)
!                                     syntax)
!                  (progn
!                    (forward-char -1)
!                    (c-skip-ws-backward)
!                    (eq (char-before) ?\{))
!                  ;; make sure matching open brace isn't in a comment
!                  (not (c-in-literal)))
!             (delete-region (point) (1- here)))
!         ;; clean up brace-else-brace and brace-elseif-brace
!         (when (and c-auto-newline
!                    (eq last-command-char ?\{))
!           (cond
!            ((and (memq 'brace-else-brace c-cleanup-list)
!                  (re-search-backward
!                   (concat "}"
!                           "\\([ \t\n]\\|\\\\\n\\)*"
!                           "else"
!                           "\\([ \t\n]\\|\\\\\n\\)*"
!                           "{")
!                   nil t)
!                  (progn
!                    (setq mbeg (match-beginning 0)
!                          mend (match-end 0))
!                    (eq (match-end 0) here)))
!             (delete-region mbeg mend)
!             (insert-and-inherit "} else {"))
!            ((and (memq 'brace-elseif-brace c-cleanup-list)
!                  (progn
!                    (goto-char (1- here))
!                    (setq mend (point))
!                    (c-skip-ws-backward)
!                    (setq mbeg (point))
!                    (eq (char-before) ?\)))
!                  (zerop (c-save-buffer-state nil (c-backward-token-2 1 t)))
!                  (eq (char-after) ?\()
!                  (progn
!                    (setq tmp (point))
!                    (re-search-backward
!                     (concat "}"
!                             "\\([ \t\n]\\|\\\\\n\\)*"
!                             "else"
!                             "\\([ \t\n]\\|\\\\\n\\)+"
!                             "if"
!                             "\\([ \t\n]\\|\\\\\n\\)*")
!                     nil t))
!                  (eq (match-end 0) tmp))
!             (delete-region mbeg mend)
!             (goto-char mbeg)
!             (insert ?\ ))))
!         (goto-char (- (point-max) pos))
!         )
!       ;; does a newline go after the brace?
!       (if (memq 'after newlines)
!           (c-newline-and-indent))
!       )))
      ;; blink the paren
      (and (eq last-command-char ?\})
         (not executing-kbd-macro)
--- 468,799 ----
           (goto-char (- (point-max) pos)))
        )))
  
+ (defun c-point-syntax ()
+   ;; Return the syntactic context of the construct at point.  (This is NOT
+   ;; nec. the same as the s.c. of the line point is on).  N.B. This won't work
+   ;; between the `#' of a cpp thing and what follows (see c-opt-cpp-prefix).
+   (c-save-buffer-state (;; shut this up too
+       (c-echo-syntactic-information-p nil)
+       syntax)
+     (c-tentative-buffer-changes
+       ;; insert a newline to isolate the construct at point for syntactic
+       ;; analysis.
+       (insert-char ?\n 1)
+       ;; In AWK (etc.) or in a macro, make sure this CR hasn't changed
+       ;; the syntax.  (There might already be an escaped NL there.)
+       (when (or (c-at-vsemi-p (1- (point)))
+               (let ((pt (point)))
+                 (save-excursion
+                   (backward-char)
+                   (and (c-beginning-of-macro)
+                        (progn (c-end-of-macro)
+                               (< (point) pt))))))
+       (backward-char)
+       (insert-char ?\\ 1)
+       (forward-char))
+       (let ((c-syntactic-indentation-in-macros t)
+           (c-auto-newline-analysis t))
+       ;; Turn on syntactic macro analysis to help with auto
+       ;; newlines only.
+       (setq syntax (c-guess-basic-syntax))
+       nil))
+     syntax))
+ 
+ (defun c-brace-newlines (syntax)
+   ;; A brace stands at point.  SYNTAX is the syntactic context of this brace
+   ;; (not necessarily the same as the S.C. of the line it is on).  Return
+   ;; NEWLINES, the list containing some combination of the symbols `before'
+   ;; and `after' saying where newlines should be inserted.
+   (c-save-buffer-state
+       ((syms
+       ;; This is the list of brace syntactic symbols that can hang.
+       ;; If any new ones are added to c-offsets-alist, they should be
+       ;; added here as well.
+       '(class-open class-close defun-open defun-close
+                    inline-open inline-close
+                    brace-list-open brace-list-close
+                    brace-list-intro brace-entry-open
+                    block-open block-close
+                    substatement-open statement-case-open
+                    extern-lang-open extern-lang-close
+                    namespace-open namespace-close
+                    module-open module-close
+                    composition-open composition-close
+                    inexpr-class-open inexpr-class-close
+                    ;; `statement-cont' is here for the case with a brace
+                    ;; list opener inside a statement.  C.f. CASE B.2 in
+                    ;; `c-guess-continued-construct'.
+                    statement-cont))
+        ;; shut this up too
+        (c-echo-syntactic-information-p nil)
+        symb-newlines)              ; e.g. (substatement-open . (after))
+     
+     (setq symb-newlines
+         ;; Do not try to insert newlines around a special
+         ;; (Pike-style) brace list.
+         (if (and c-special-brace-lists
+                  (save-excursion
+                    (c-safe (if (= (char-before) ?{)
+                                (forward-char -1)
+                              (c-forward-sexp -1))
+                            (c-looking-at-special-brace-list))))
+             nil
+           ;; Seek the matching entry in c-hanging-braces-alist.
+           (or (c-lookup-lists
+                syms
+                ;; Substitute inexpr-class and class-open or
+                ;; class-close with inexpr-class-open or
+                ;; inexpr-class-close.
+                (if (assq 'inexpr-class syntax)
+                    (cond ((assq 'class-open syntax)
+                           '((inexpr-class-open)))
+                          ((assq 'class-close syntax)
+                           '((inexpr-class-close)))
+                          (t syntax))
+                  syntax)
+                c-hanging-braces-alist)
+               '(ignore before after)))) ; Default, when not in c-h-b-l.
+ 
+     ;; If syntax is a function symbol, then call it using the
+     ;; defined semantics.
+     (if (and (not (consp (cdr symb-newlines)))
+            (functionp (cdr symb-newlines)))
+       (let ((c-syntactic-context syntax))
+         (funcall (cdr symb-newlines)
+                  (car symb-newlines)
+                  (point)))
+       (cdr symb-newlines))))
+ 
+ (defun c-try-one-liner ()
+   ;; Point is just after a newly inserted }.  If the non-whitespace
+   ;; content of the braces is a single line of code, compact the whole
+   ;; construct to a single line, if this line isn't too long.  The Right
+   ;; Thing is done with comments.
+   ;;
+   ;; Point will be left after the }, regardless of whether the clean-up is
+   ;; done.  Return NON-NIL if the clean-up happened, NIL if it didn't.
+ 
+   (let ((here (point))
+       (pos (- (point-max) (point)))
+       mbeg1 mend1 mbeg4 mend4
+       eol-col cmnt-pos cmnt-col cmnt-gap)
+ 
+     (when
+       (save-excursion
+         (save-restriction
+           ;; Avoid backtracking over a very large block.  The one we
+           ;; deal with here can never be more than three lines.
+           (narrow-to-region (save-excursion
+                               (forward-line -2)
+                               (point))
+                             (point))
+           (and (c-safe (c-backward-sexp))
+                (progn
+                  (forward-char)
+                  (narrow-to-region (point) (1- here)) ; innards of {.}
+                  (looking-at
+                   (cc-eval-when-compile
+                     (concat
+                      "\\("            ; (match-beginning 1)
+                      "[ \t]*\\([\r\n][ \t]*\\)?" ; WS with opt. NL
+                      "\\)"            ; (match-end 1)
+                      "[^ \t\r\n]+\\([ \t]+[^ \t\r\n]+\\)*" ; non-WS
+                      "\\("            ; (match-beginning 4)
+                      "[ \t]*\\([\r\n][ \t]*\\)?" ; WS with opt. NL
+                      "\\)\\'")))))))  ; (match-end 4) at EOB.
+ 
+       (if (c-tentative-buffer-changes
+           (setq mbeg1 (match-beginning 1) mend1 (match-end 1)
+                 mbeg4 (match-beginning 4) mend4 (match-end 4))
+           (backward-char)             ; back over the `}'
+           (save-excursion
+             (setq cmnt-pos (and (c-backward-single-comment)
+                                 (- (point) (- mend1 mbeg1)))))
+           (delete-region mbeg4 mend4)
+           (delete-region mbeg1 mend1)
+           (setq eol-col (save-excursion (end-of-line) (current-column)))
+ 
+           ;; Necessary to put the closing brace before any line
+           ;; oriented comment to keep it syntactically significant.
+           ;; This isn't necessary for block comments, but the result
+           ;; looks nicer anyway.
+           (when cmnt-pos
+             (delete-char 1)           ; the `}' has blundered into a comment
+             (goto-char cmnt-pos)
+             (setq cmnt-col (1+ (current-column)))
+             (setq cmnt-pos (1+ cmnt-pos)) ; we're inserting a `}'
+             (c-skip-ws-backward)
+             (insert-char ?\} 1)       ; reinsert the `}' before the comment.
+             (setq cmnt-gap (- cmnt-col (current-column)))
+             (when (zerop cmnt-gap)
+               (insert-char ?\  1)     ; Put a space before a bare comment.
+               (setq cmnt-gap 1)))
+ 
+           (or (null c-max-one-liner-length)
+               (zerop c-max-one-liner-length)
+               (<= eol-col c-max-one-liner-length)
+               ;; Can we trim space before comment to make the line fit?
+               (and cmnt-gap
+                    (< (- eol-col cmnt-gap) c-max-one-liner-length)
+                    (progn (goto-char cmnt-pos)
+                           (backward-delete-char-untabify
+                            (- eol-col c-max-one-liner-length))
+                           t))))
+         (goto-char (- (point-max) pos))))))
+ 
  (defun c-electric-brace (arg)
    "Insert a brace.
  
! If `c-electric-flag' is non-nil, the brace is not inside a literal and a
! numeric ARG hasn't been supplied, the command performs several electric
! actions:
! 
! \(a) If the auto-newline feature is turned on (indicated by \"/ln\" on
! the mode line) newlines are inserted before and after the brace as
! directed by the settings in `c-hanging-braces-alist'.
! 
! \(b) Any auto-newlines are indented.  The original line is also
! reindented unless `c-syntactic-indentation' is nil.
! 
! \(c) If auto-newline is turned on, various newline cleanups based on the
! settings of `c-cleanup-list' are done."
  
    (interactive "*P")
!   (let (safepos literal
!       ;; We want to inhibit blinking the paren since this would be
!       ;; most disruptive.  We'll blink it ourselves later on.
!       (old-blink-paren blink-paren-function)
!       blink-paren-function)
! 
!     (c-save-buffer-state ()
!       (setq safepos (c-safe-position (point) (c-parse-state))
!           literal (c-in-literal safepos)))
! 
!     ;; Insert the brace.  Note that expand-abbrev might reindent
!     ;; the line here if there's a preceding "else" or something.
!     (self-insert-command (prefix-numeric-value arg))
! 
!     (when (and c-electric-flag (not literal) (not arg))
!       (if (not (looking-at "[ \t]*\\\\?$"))
!         (if c-syntactic-indentation
!             (indent-according-to-mode))
! 
!       (let ( ;; shut this up too
!             (c-echo-syntactic-information-p nil)
!             newlines
!             ln-syntax br-syntax syntax) ; Syntactic context of the original 
line,
!                       ; of the brace itself, of the line the brace ends up on.
!         (c-save-buffer-state ((c-syntactic-indentation-in-macros t)
!                               (c-auto-newline-analysis t))
!           (setq ln-syntax (c-guess-basic-syntax)))
!         (if c-syntactic-indentation
!             (c-indent-line ln-syntax))
! 
!         (when c-auto-newline
!           (backward-char)
!           (setq br-syntax (c-point-syntax)
!                 newlines (c-brace-newlines br-syntax))
! 
!           ;; Insert the BEFORE newline, if wanted, and reindent the newline.
!           (if (and (memq 'before newlines)
!                    (> (current-column) (current-indentation)))
!               (if c-syntactic-indentation
!                   ;; Only a plain newline for now - it's indented
!                   ;; after the cleanups when the line has its final
!                   ;; appearance.
!                   (newline)
!                 (c-newline-and-indent)))
!           (forward-char)
! 
!           ;; `syntax' is the syntactic context of the line which ends up
!           ;; with the brace on it.
!           (setq syntax (if (memq 'before newlines) br-syntax ln-syntax))
! 
!           ;; Do all appropriate clean ups
!           (let ((here (point))
!                 (pos (- (point-max) (point)))
!                 mbeg mend
!                 )
! 
!             ;; `}': clean up empty defun braces
!             (when (c-save-buffer-state ()
!                     (and (memq 'empty-defun-braces c-cleanup-list)
!                          (eq last-command-char ?\})
!                          (c-intersect-lists '(defun-close class-close 
inline-close)
!                                             syntax)
!                          (progn
!                            (forward-char -1)
!                            (c-skip-ws-backward)
!                            (eq (char-before) ?\{))
!                          ;; make sure matching open brace isn't in a comment
!                          (not (c-in-literal))))
!               (delete-region (point) (1- here))
!               (setq here (- (point-max) pos)))
!             (goto-char here)
! 
!             ;; `}': compact to a one-liner defun?
!             (save-match-data
!               (when
!                   (and (eq last-command-char ?\})
!                        (memq 'one-liner-defun c-cleanup-list)
!                        (c-intersect-lists '(defun-close) syntax)
!                        (c-try-one-liner))
!                 (setq here (- (point-max) pos))))
! 
!             ;; `{': clean up brace-else-brace and brace-elseif-brace
!             (when (eq last-command-char ?\{)
!               (cond
!                ((and (memq 'brace-else-brace c-cleanup-list)
!                      (re-search-backward
!                       (concat "}"
!                               "\\([ \t\n]\\|\\\\\n\\)*"
!                               "else"
!                               "\\([ \t\n]\\|\\\\\n\\)*"
!                               "{"
!                               "\\=")
!                       nil t))
!                 (delete-region mbeg mend)
!                 (insert-and-inherit "} else {"))
!                ((and (memq 'brace-elseif-brace c-cleanup-list)
!                      (progn
!                        (goto-char (1- here))
!                        (setq mend (point))
!                        (c-skip-ws-backward)
!                        (setq mbeg (point))
!                        (eq (char-before) ?\)))
!                      (zerop (c-save-buffer-state nil (c-backward-token-2 1 
t)))
!                      (eq (char-after) ?\()
!                     ; (progn
!                       ; (setq tmp (point))
!                        (re-search-backward
!                         (concat "}"
!                                 "\\([ \t\n]\\|\\\\\n\\)*"
!                                 "else"
!                                 "\\([ \t\n]\\|\\\\\n\\)+"
!                                 "if"
!                                 "\\([ \t\n]\\|\\\\\n\\)*"
!                                 "\\=")
!                         nil t);)
!                      ;(eq (match-end 0) tmp);
!                        )
!                 (delete-region mbeg mend)
!                 (goto-char mbeg)
!                 (insert ?\ ))))
! 
!             (goto-char (- (point-max) pos))
! 
!             ;; Indent the line after the cleanups since it might
!             ;; very well indent differently due to them, e.g. if
!             ;; c-indent-one-line-block is used together with the
!             ;; one-liner-defun cleanup.
!             (when c-syntactic-indentation
!               (c-indent-line)))
! 
!           ;; does a newline go after the brace?
!           (if (memq 'after newlines)
!               (c-newline-and-indent))
!           ))))
! 
      ;; blink the paren
      (and (eq last-command-char ?\})
         (not executing-kbd-macro)
***************
*** 659,990 ****
  (defun c-electric-slash (arg)
    "Insert a slash character.
  
  Indent the line as a comment, if:
  
!   1. The slash is second of a `//' line oriented comment introducing
       token and we are on a comment-only-line, or
  
!   2. The slash is part of a `*/' token that closes a block oriented
       comment.
  
  If a numeric ARG is supplied, point is inside a literal, or
! `c-syntactic-indentation' is nil, indentation is inhibited."
    (interactive "*P")
!   (let* ((ch (char-before))
!        (literal (c-in-literal))
!        (indentp (and c-syntactic-indentation
!                      (not arg)
                       (eq last-command-char ?/)
!                      (or (and (eq ch ?/)
!                               (not literal))
!                          (and (eq ch ?*)
!                               literal))
!                      ))
!        ;; shut this up
!        (c-echo-syntactic-information-p nil))
      (self-insert-command (prefix-numeric-value arg))
      (if indentp
        (indent-according-to-mode))))
  
  (defun c-electric-star (arg)
    "Insert a star character.
! If the star is the second character of a C style comment introducing
! construct, and we are on a comment-only-line, indent line as comment.
! If a numeric ARG is supplied, point is inside a literal, or
! `c-syntactic-indentation' is nil, indentation is inhibited."
    (interactive "*P")
    (self-insert-command (prefix-numeric-value arg))
!   ;; if we are in a literal, or if arg is given do not re-indent the
    ;; current line, unless this star introduces a comment-only line.
!   (if (and c-syntactic-indentation
!          (not arg)
!          (eq (c-in-literal) 'c)
!          (eq (char-before) ?*)
!          (save-excursion
!            (forward-char -1)
!            (skip-chars-backward "*")
!            (if (eq (char-before) ?/)
!                (forward-char -1))
!            (skip-chars-backward " \t")
!            (bolp)))
        (let (c-echo-syntactic-information-p) ; shut this up
        (indent-according-to-mode))
      ))
  
  (defun c-electric-semi&comma (arg)
    "Insert a comma or semicolon.
- When the auto-newline feature is turned on, as evidenced by the \"/a\"
- or \"/ah\" string on the mode line, a newline might be inserted.  See
- the variable `c-hanging-semi&comma-criteria' for how newline insertion
- is determined.
- 
- When a semicolon is inserted, the line is re-indented unless a numeric
- arg is supplied, point is inside a literal, or
- `c-syntactic-indentation' is nil.
  
! Based on the value of `c-cleanup-list', this function cleans up commas
! following brace lists and semicolons following defuns."
    (interactive "*P")
!   (let* ((lim (c-most-enclosing-brace (c-parse-state)))
!        (literal (c-in-literal lim))
         (here (point))
         ;; shut this up
         (c-echo-syntactic-information-p nil))
!     (if (or literal arg)
!       (self-insert-command (prefix-numeric-value arg))
!       ;; do some special stuff with the character
!       (self-insert-command (prefix-numeric-value arg))
!       ;; do all cleanups and newline insertions if c-auto-newline is
!       ;; turned on
!       (if (or (not c-auto-newline)
!             (not (looking-at "[ \t]*\\\\?$")))
!         (if c-syntactic-indentation
!             (indent-according-to-mode))
!       ;; clean ups
!       (let ((pos (- (point-max) (point))))
!         (if (and (or (and
!                       (eq last-command-char ?,)
!                       (memq 'list-close-comma c-cleanup-list))
!                      (and
!                       (eq last-command-char ?\;)
!                       (memq 'defun-close-semi c-cleanup-list)))
!                  (progn
!                    (forward-char -1)
!                    (c-skip-ws-backward)
!                    (eq (char-before) ?}))
!                  ;; make sure matching open brace isn't in a comment
!                  (not (c-in-literal lim)))
!             (delete-region (point) here))
!         (goto-char (- (point-max) pos)))
!       ;; re-indent line
!       (if c-syntactic-indentation
!           (indent-according-to-mode))
!       ;; check to see if a newline should be added
!       (let ((criteria c-hanging-semi&comma-criteria)
!             answer add-newline-p)
!         (while criteria
!           (setq answer (funcall (car criteria)))
!           ;; only nil value means continue checking
!           (if (not answer)
!               (setq criteria (cdr criteria))
!             (setq criteria nil)
!             ;; only 'stop specifically says do not add a newline
!             (setq add-newline-p (not (eq answer 'stop)))
!             ))
!         (if add-newline-p
!             (c-newline-and-indent))
!         )))))
  
  (defun c-electric-colon (arg)
    "Insert a colon.
  
! If the auto-newline feature is turned on, as evidenced by the \"/a\"
! or \"/ah\" string on the mode line, newlines are inserted before and
! after colons based on the value of `c-hanging-colons-alist'.
! 
! Also, the line is re-indented unless a numeric ARG is supplied, the
! colon is inserted inside a literal, or `c-syntactic-indentation' is
! nil.
  
- This function cleans up double colon scope operators based on the
- value of `c-cleanup-list'."
    (interactive "*P")
    (let* ((bod (c-point 'bod))
!        (literal (c-in-literal bod))
         newlines is-scope-op
         ;; shut this up
         (c-echo-syntactic-information-p nil))
!     (cond
!      ((or literal arg)
!       (self-insert-command (prefix-numeric-value arg)))
!      ((not (looking-at "[ \t]*\\\\?$"))
!       (self-insert-command (prefix-numeric-value arg))
!       (if c-syntactic-indentation
!         (indent-according-to-mode)))
!      (t
!       ;; insert the colon, then do any specified cleanups
!       (self-insert-command (prefix-numeric-value arg))
!       (let ((pos (- (point-max) (point)))
!           (here (point)))
!       (if (and c-auto-newline
!                (memq 'scope-operator c-cleanup-list)
!                (eq (char-before) ?:)
!                (progn
!                  (forward-char -1)
!                  (c-skip-ws-backward)
!                  (eq (char-before) ?:))
!                (not (c-in-literal))
!                (not (eq (char-after (- (point) 2)) ?:)))
!           (progn
!             (delete-region (point) (1- here))
!             (setq is-scope-op t)))
!       (goto-char (- (point-max) pos)))
!       ;; indent the current line if it's done syntactically.
!       (if c-syntactic-indentation
!         ;; Cannot use the same syntax analysis as we find below,
!         ;; since that's made with c-syntactic-indentation-in-macros
!         ;; always set to t.
!         (indent-according-to-mode))
!       (c-save-buffer-state
!           ((c-syntactic-indentation-in-macros t)
!            (c-auto-newline-analysis t)
!            ;; Turn on syntactic macro analysis to help with auto newlines
!            ;; only.
!            (syntax (c-guess-basic-syntax))
!            (elem syntax))
!       ;; Translate substatement-label to label for this operation.
!       (while elem
!         (if (eq (car (car elem)) 'substatement-label)
!             (setcar (car elem) 'label))
!         (setq elem (cdr elem)))
!       ;; some language elements can only be determined by checking
!       ;; the following line.  Lets first look for ones that can be
!       ;; found when looking on the line with the colon
!       (setq newlines
!             (and c-auto-newline
!                  (or (c-lookup-lists '(case-label label access-label)
!                                      syntax c-hanging-colons-alist)
!                      (c-lookup-lists '(member-init-intro inher-intro)
!                                      (progn
!                                        (insert ?\n)
!                                        (unwind-protect
!                                            (c-guess-basic-syntax)
!                                          (delete-char -1)))
!                                      c-hanging-colons-alist)))))
!       ;; does a newline go before the colon?  Watch out for already
!       ;; non-hung colons.  However, we don't unhang them because that
!       ;; would be a cleanup (and anti-social).
!       (if (and (memq 'before newlines)
!              (not is-scope-op)
!              (save-excursion
!                (skip-chars-backward ": \t")
!                (not (bolp))))
!         (let ((pos (- (point-max) (point))))
!           (forward-char -1)
!           (c-newline-and-indent)
!           (goto-char (- (point-max) pos))))
!       ;; does a newline go after the colon?
!       (if (and (memq 'after (cdr-safe newlines))
!              (not is-scope-op))
!         (c-newline-and-indent))
!       ))))
  
  (defun c-electric-lt-gt (arg)
!   "Insert a less-than, or greater-than character.
! The line will be re-indented if the character inserted is the second
! of a C++ style stream operator and the buffer is in C++ mode.
! Exceptions are when a numeric argument is supplied, point is inside a
! literal, or `c-syntactic-indentation' is nil, in which case the line
! will not be re-indented."
    (interactive "*P")
!   (let ((indentp (and c-syntactic-indentation
!                     (not arg)
!                     (eq (char-before) last-command-char)
!                     (not (c-in-literal))))
!       ;; shut this up
!       (c-echo-syntactic-information-p nil))
      (self-insert-command (prefix-numeric-value arg))
!     (if indentp
!       (indent-according-to-mode))))
  
  (defun c-electric-paren (arg)
    "Insert a parenthesis.
  
! Some newline cleanups are done if appropriate; see the variable
! `c-cleanup-list'.
  
! Also, the line is re-indented unless a numeric ARG is supplied, the
! parenthesis is inserted inside a literal, or `c-syntactic-indentation'
! is nil."
    (interactive "*P")
!   (let ((literal (c-in-literal (c-point 'bod)))
        ;; shut this up
        (c-echo-syntactic-information-p nil))
!     (if (or arg literal)
!       (self-insert-command (prefix-numeric-value arg))
!       ;; do some special stuff with the character
!       (let* (;; We want to inhibit blinking the paren since this will
!            ;; be most disruptive.  We'll blink it ourselves
!            ;; afterwards.
!            (old-blink-paren blink-paren-function)
!            blink-paren-function
!            (noblink (eq last-input-event ?\()))
!       (self-insert-command (prefix-numeric-value arg))
!       (if c-syntactic-indentation
!           (indent-according-to-mode))
!       (when (looking-at "[ \t]*\\\\?$")
!         (when c-auto-newline
!           ;; Do all appropriate clean ups
!           (let ((here (point))
!                 (pos (- (point-max) (point)))
!                 mbeg mend)
!             ;; clean up brace-elseif-brace
!             (if (and (memq 'brace-elseif-brace c-cleanup-list)
!                      (eq last-command-char ?\()
!                      (re-search-backward
!                       (concat "}"
!                               "\\([ \t\n]\\|\\\\\n\\)*"
!                               "else"
!                               "\\([ \t\n]\\|\\\\\n\\)+"
!                               "if"
!                               "\\([ \t\n]\\|\\\\\n\\)*"
!                               "(")
!                       nil t)
!                      (save-excursion
!                        (setq mbeg (match-beginning 0)
!                              mend (match-end 0))
!                        (= mend here))
!                      (not (c-in-literal)))
!                 (progn
!                   (delete-region mbeg mend)
!                   (insert-and-inherit "} else if ("))
!               ;; clean up brace-catch-brace
!               (goto-char here)
!               (if (and (memq 'brace-catch-brace c-cleanup-list)
!                        (eq last-command-char ?\()
!                        (re-search-backward
!                         (concat "}"
!                                 "\\([ \t\n]\\|\\\\\n\\)*"
!                                 "catch"
!                                 "\\([ \t\n]\\|\\\\\n\\)*"
!                                 "(")
!                         nil t)
!                        (save-excursion
!                          (setq mbeg (match-beginning 0)
!                                mend (match-end 0))
!                          (= mend here))
!                        (not (c-in-literal)))
!                   (progn
!                     (delete-region mbeg mend)
!                     (insert-and-inherit "} catch ("))))
!             (goto-char (- (point-max) pos))
!             )))
!       (let (beg (end (1- (point))))
!         (cond ((and (memq 'space-before-funcall c-cleanup-list)
!                     (eq last-command-char ?\()
!                     (save-excursion
!                       (backward-char)
!                       (skip-chars-backward " \t")
!                       (setq beg (point))
!                       (c-on-identifier)))
!                (save-excursion
!                  (delete-region beg end)
!                  (goto-char beg)
!                  (insert ?\ )))
!               ((and (memq 'compact-empty-funcall c-cleanup-list)
!                     (eq last-command-char ?\))
!                     (save-excursion
!                       (c-safe (backward-char 2))
!                       (when (looking-at "()")
!                         (setq end (point))
!                         (skip-chars-backward " \t")
!                         (setq beg (point))
!                         (c-on-identifier))))
!                (delete-region beg end))))
!       (and (not executing-kbd-macro)
!            old-blink-paren
!            (not noblink)
!            (funcall old-blink-paren))))))
  
  (defun c-electric-continued-statement ()
    "Reindent the current line if appropriate.
--- 806,1270 ----
  (defun c-electric-slash (arg)
    "Insert a slash character.
  
+ If the slash is inserted immediately after the comment prefix in a c-style
+ comment, the comment might get closed by removing whitespace and possibly
+ inserting a \"*\".  See the variable `c-cleanup-list'.
+ 
  Indent the line as a comment, if:
  
!   1. The slash is second of a \"//\" line oriented comment introducing
       token and we are on a comment-only-line, or
  
!   2. The slash is part of a \"*/\" token that closes a block oriented
       comment.
  
  If a numeric ARG is supplied, point is inside a literal, or
! `c-syntactic-indentation' is nil or `c-electric-flag' is nil, indentation
! is inhibited."
    (interactive "*P")
!   (let ((literal (c-save-buffer-state () (c-in-literal)))
!       indentp
!       ;; shut this up
!       (c-echo-syntactic-information-p nil))
! 
!     ;; comment-close-slash cleanup?  This DOESN'T need `c-electric-flag' or
!     ;; `c-syntactic-indentation' set.
!     (when (and (not arg)
!              (eq literal 'c)
!              (memq 'comment-close-slash c-cleanup-list)
!              (eq last-command-char ?/)
!       ; (eq c-block-comment-ender "*/") ; C-style comments ALWAYS end in */
!              (save-excursion
!                (back-to-indentation)
!                (looking-at (concat c-current-comment-prefix "[ \t]*$"))))
!       (end-of-line)
!       (delete-horizontal-space)
!       (or (eq (char-before) ?*) (insert-char ?* 1))) ; Do I need a t (retain 
sticky properties) here?
! 
!     (setq indentp (and (not arg)
!                      c-syntactic-indentation
!                      c-electric-flag
                       (eq last-command-char ?/)
!                      (eq (char-before) (if literal ?* ?/))))
      (self-insert-command (prefix-numeric-value arg))
      (if indentp
        (indent-according-to-mode))))
  
  (defun c-electric-star (arg)
    "Insert a star character.
! If `c-electric-flag' and `c-syntactic-indentation' are both non-nil, and
! the star is the second character of a C style comment starter on a
! comment-only-line, indent the line as a comment.  If a numeric ARG is
! supplied, point is inside a literal, or `c-syntactic-indentation' is nil,
! this indentation is inhibited."
! 
    (interactive "*P")
    (self-insert-command (prefix-numeric-value arg))
!   ;; if we are in a literal, or if arg is given do not reindent the
    ;; current line, unless this star introduces a comment-only line.
!   (if (c-save-buffer-state ()
!       (and c-syntactic-indentation
!            c-electric-flag
!            (not arg)
!            (eq (c-in-literal) 'c)
!            (eq (char-before) ?*)
!            (save-excursion
!              (forward-char -1)
!              (skip-chars-backward "*")
!              (if (eq (char-before) ?/)
!                  (forward-char -1))
!              (skip-chars-backward " \t")
!              (bolp))))
        (let (c-echo-syntactic-information-p) ; shut this up
        (indent-according-to-mode))
      ))
  
  (defun c-electric-semi&comma (arg)
    "Insert a comma or semicolon.
  
! If `c-electric-flag' is non-nil, point isn't inside a literal and a
! numeric ARG hasn't been supplied, the command performs several electric
! actions:
! 
! \(a) When the auto-newline feature is turned on (indicated by \"/ln\" on
! the mode line) a newline might be inserted.  See the variable
! `c-hanging-semi&comma-criteria' for how newline insertion is determined.
! 
! \(b) Any auto-newlines are indented.  The original line is also
! reindented unless `c-syntactic-indentation' is nil.
! 
! \(c) If auto-newline is turned on, a comma following a brace list or a
! semicolon following a defun might be cleaned up, depending on the
! settings of `c-cleanup-list'."
    (interactive "*P")
!   (let* (lim literal c-syntactic-context
         (here (point))
         ;; shut this up
         (c-echo-syntactic-information-p nil))
! 
!     (c-save-buffer-state ()
!       (setq lim (c-most-enclosing-brace (c-parse-state))
!           literal (c-in-literal lim)))
! 
!     (self-insert-command (prefix-numeric-value arg))
! 
!     (if (and c-electric-flag (not literal) (not arg))
!       ;; do all cleanups and newline insertions if c-auto-newline is on.
!       (if (or (not c-auto-newline)
!               (not (looking-at "[ \t]*\\\\?$")))
!           (if c-syntactic-indentation
!               (c-indent-line))
!         ;; clean ups: list-close-comma or defun-close-semi
!         (let ((pos (- (point-max) (point))))
!           (if (c-save-buffer-state ()
!                 (and (or (and
!                           (eq last-command-char ?,)
!                           (memq 'list-close-comma c-cleanup-list))
!                          (and
!                           (eq last-command-char ?\;)
!                           (memq 'defun-close-semi c-cleanup-list)))
!                      (progn
!                        (forward-char -1)
!                        (c-skip-ws-backward)
!                        (eq (char-before) ?}))
!                      ;; make sure matching open brace isn't in a comment
!                      (not (c-in-literal lim))))
!               (delete-region (point) here))
!           (goto-char (- (point-max) pos)))
!         ;; reindent line
!         (when c-syntactic-indentation
!           (setq c-syntactic-context (c-guess-basic-syntax))
!           (c-indent-line c-syntactic-context))
!         ;; check to see if a newline should be added
!         (let ((criteria c-hanging-semi&comma-criteria)
!               answer add-newline-p)
!           (while criteria
!             (setq answer (funcall (car criteria)))
!             ;; only nil value means continue checking
!             (if (not answer)
!                 (setq criteria (cdr criteria))
!               (setq criteria nil)
!               ;; only 'stop specifically says do not add a newline
!               (setq add-newline-p (not (eq answer 'stop)))
!               ))
!           (if add-newline-p
!               (c-newline-and-indent))
!           )))))
  
  (defun c-electric-colon (arg)
    "Insert a colon.
  
! If `c-electric-flag' is non-nil, the colon is not inside a literal and a
! numeric ARG hasn't been supplied, the command performs several electric
! actions:
! 
! \(a) If the auto-newline feature is turned on (indicated by \"/ln\" on
! the mode line) newlines are inserted before and after the colon based on
! the settings in `c-hanging-colons-alist'.
! 
! \(b) Any auto-newlines are indented.  The original line is also
! reindented unless `c-syntactic-indentation' is nil.
! 
! \(c) If auto-newline is turned on, whitespace between two colons will be
! \"cleaned up\" leaving a scope operator, if this action is set in
! `c-cleanup-list'."
  
    (interactive "*P")
    (let* ((bod (c-point 'bod))
!        (literal (c-save-buffer-state () (c-in-literal bod)))
         newlines is-scope-op
         ;; shut this up
         (c-echo-syntactic-information-p nil))
!     (self-insert-command (prefix-numeric-value arg))
!     ;; Any electric action?
!     (if (and c-electric-flag (not literal) (not arg))
!       ;; Unless we're at EOL, only re-indentation happens.
!       (if (not (looking-at "[ \t]*\\\\?$"))
!           (if c-syntactic-indentation
!               (indent-according-to-mode))
! 
!         ;; scope-operator clean-up?
!         (let ((pos (- (point-max) (point)))
!               (here (point)))
!           (if (c-save-buffer-state () ; Why do we need this? [ACM, 2003-03-12]
!                 (and c-auto-newline
!                      (memq 'scope-operator c-cleanup-list)
!                      (eq (char-before) ?:)
!                      (progn
!                        (forward-char -1)
!                        (c-skip-ws-backward)
!                        (eq (char-before) ?:))
!                      (not (c-in-literal))
!                      (not (eq (char-after (- (point) 2)) ?:))))
!               (progn
!                 (delete-region (point) (1- here))
!                 (setq is-scope-op t)))
!           (goto-char (- (point-max) pos)))
! 
!         ;; indent the current line if it's done syntactically.
!         (if c-syntactic-indentation
!             ;; Cannot use the same syntax analysis as we find below,
!             ;; since that's made with c-syntactic-indentation-in-macros
!             ;; always set to t.
!             (indent-according-to-mode))
! 
!         ;; Calculate where, if anywhere, we want newlines.
!         (c-save-buffer-state
!             ((c-syntactic-indentation-in-macros t)
!              (c-auto-newline-analysis t)
!              ;; Turn on syntactic macro analysis to help with auto newlines
!              ;; only.
!              (syntax (c-guess-basic-syntax))
!              (elem syntax))
!           ;; Translate substatement-label to label for this operation.
!           (while elem
!             (if (eq (car (car elem)) 'substatement-label)
!                 (setcar (car elem) 'label))
!             (setq elem (cdr elem)))
!           ;; some language elements can only be determined by checking
!           ;; the following line.  Lets first look for ones that can be
!           ;; found when looking on the line with the colon
!           (setq newlines
!                 (and c-auto-newline
!                      (or (c-lookup-lists '(case-label label access-label)
!                                          syntax c-hanging-colons-alist)
!                          (c-lookup-lists '(member-init-intro inher-intro)
!                                          (progn
!                                            (insert ?\n)
!                                            (unwind-protect
!                                                (c-guess-basic-syntax)
!                                              (delete-char -1)))
!                                          c-hanging-colons-alist)))))
!         ;; does a newline go before the colon?  Watch out for already
!         ;; non-hung colons.  However, we don't unhang them because that
!         ;; would be a cleanup (and anti-social).
!         (if (and (memq 'before newlines)
!                  (not is-scope-op)
!                  (save-excursion
!                    (skip-chars-backward ": \t")
!                    (not (bolp))))
!             (let ((pos (- (point-max) (point))))
!               (forward-char -1)
!               (c-newline-and-indent)
!               (goto-char (- (point-max) pos))))
!         ;; does a newline go after the colon?
!         (if (and (memq 'after (cdr-safe newlines))
!                  (not is-scope-op))
!             (c-newline-and-indent))
!         ))))
  
  (defun c-electric-lt-gt (arg)
!   "Insert a \"<\" or \">\" character.
! If the current language uses angle bracket parens (e.g. template
! arguments in C++), try to find out if the inserted character is a
! paren and give it paren syntax if appropriate.
! 
! If `c-electric-flag' and `c-syntactic-indentation' are both non-nil, the
! line will be reindented if the inserted character is a paren or if it
! finishes a C++ style stream operator in C++ mode.  Exceptions are when a
! numeric argument is supplied, or the point is inside a literal."
! 
    (interactive "*P")
!   (let ((c-echo-syntactic-information-p nil)
!       final-pos close-paren-inserted)
! 
      (self-insert-command (prefix-numeric-value arg))
!     (setq final-pos (point))
! 
!     (c-save-buffer-state (c-parse-and-markup-<>-arglists
!                         c-restricted-<>-arglists
!                         <-pos)
! 
!       (when c-recognize-<>-arglists
!       (if (eq last-command-char ?<)
!           (when (and (progn
!                        (backward-char)
!                        (= (point)
!                           (progn
!                             (c-beginning-of-current-token)
!                             (point))))
!                      (progn
!                        (c-backward-token-2)
!                        (looking-at c-opt-<>-sexp-key)))
!             (c-mark-<-as-paren (1- final-pos)))
! 
!         ;; It's a ">".  Check if there's an earlier "<" which either has
!         ;; open paren syntax already or that can be recognized as an arglist
!         ;; together with this ">".  Note that this won't work in cases like
!         ;; "template <x, a < b, y>" but they ought to be rare.
! 
!         (save-restriction
!           ;; Narrow to avoid that `c-forward-<>-arglist' below searches past
!           ;; our position.
!           (narrow-to-region (point-min) final-pos)
! 
!           (while (and
!                   (progn
!                     (goto-char final-pos)
!                     (c-syntactic-skip-backward "^<;}" nil t)
!                     (eq (char-before) ?<))
!                   (progn
!                     (backward-char)
!                     ;; If the "<" already got open paren syntax we know we
!                     ;; have the matching closer.  Handle it and exit the
!                     ;; loop.
!                     (if (looking-at "\\s\(")
!                         (progn
!                           (c-mark->-as-paren (1- final-pos))
!                           (setq close-paren-inserted t)
!                           nil)
!                       t))
! 
!                   (progn
!                     (setq <-pos (point))
!                     (c-backward-syntactic-ws)
!                     (c-simple-skip-symbol-backward))
!                   (or (looking-at c-opt-<>-sexp-key)
!                       (not (looking-at c-keywords-regexp)))
! 
!                   (let ((c-parse-and-markup-<>-arglists t)
!                         c-restricted-<>-arglists
!                         (containing-sexp
!                          (c-most-enclosing-brace (c-parse-state))))
!                     (when (and containing-sexp
!                                (progn (goto-char containing-sexp)
!                                       (eq (char-after) ?\())
!                                (not (eq (get-text-property (point) 'c-type)
!                                         'c-decl-arg-start)))
!                       (setq c-restricted-<>-arglists t))
!                     (goto-char <-pos)
!                     (c-forward-<>-arglist nil))
! 
!                   ;; Loop here if the "<" we found above belongs to a nested
!                   ;; angle bracket sexp.  When we start over we'll find the
!                   ;; previous or surrounding sexp.
!                   (if (< (point) final-pos)
!                       t
!                     (setq close-paren-inserted t)
!                     nil)))))))
!     (goto-char final-pos)
! 
!     ;; Indent the line if appropriate.
!     (when (and c-electric-flag c-syntactic-indentation)
!       (backward-char)
!       (when (prog1 (or (looking-at "\\s\(\\|\\s\)")
!                      (and (c-major-mode-is 'c++-mode)
!                           (progn
!                             (c-beginning-of-current-token)
!                             (looking-at "<<\\|>>"))
!                           (= (match-end 0) final-pos)))
!             (goto-char final-pos))
!       (indent-according-to-mode)))
! 
!     (when (and close-paren-inserted
!              (not executing-kbd-macro)
!              blink-paren-function)
!       ;; Note: Most paren blink functions, such as the standard
!       ;; `blink-matching-open', currently doesn't handle paren chars
!       ;; marked with text properties very well.  Maybe we should avoid
!       ;; this call for the time being?
!       (funcall blink-paren-function))))
  
  (defun c-electric-paren (arg)
    "Insert a parenthesis.
  
! If `c-syntactic-indentation' and `c-electric-flag' are both non-nil, the
! line is reindented unless a numeric ARG is supplied, or the parenthesis
! is inserted inside a literal.
! 
! Whitespace between a function name and the parenthesis may get added or
! removed; see the variable `c-cleanup-list'.
  
! Also, if `c-electric-flag' and `c-auto-newline' are both non-nil, some
! newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
    (interactive "*P")
!   (let ((literal (c-save-buffer-state () (c-in-literal)))
        ;; shut this up
        (c-echo-syntactic-information-p nil))
!     (self-insert-command (prefix-numeric-value arg))
! 
!     (if (and (not arg) (not literal))
!       (let* ( ;; We want to inhibit blinking the paren since this will
!              ;; be most disruptive.  We'll blink it ourselves
!              ;; afterwards.
!              (old-blink-paren blink-paren-function)
!              blink-paren-function)
!         (if (and c-syntactic-indentation c-electric-flag)
!             (indent-according-to-mode))
! 
!         ;; If we're at EOL, check for new-line clean-ups.
!         (when (and c-electric-flag c-auto-newline
!                    (looking-at "[ \t]*\\\\?$"))
! 
!           ;; clean up brace-elseif-brace
!           (when
!               (and (memq 'brace-elseif-brace c-cleanup-list)
!                    (eq last-command-char ?\()
!                    (re-search-backward
!                     (concat "}"
!                             "\\([ \t\n]\\|\\\\\n\\)*"
!                             "else"
!                             "\\([ \t\n]\\|\\\\\n\\)+"
!                             "if"
!                             "\\([ \t\n]\\|\\\\\n\\)*"
!                             "("
!                             "\\=")
!                     nil t)
!                    (not  (c-save-buffer-state () (c-in-literal))))
!             (delete-region (match-beginning 0) (match-end 0))
!             (insert-and-inherit "} else if ("))
! 
!           ;; clean up brace-catch-brace
!           (when
!               (and (memq 'brace-catch-brace c-cleanup-list)
!                    (eq last-command-char ?\()
!                    (re-search-backward
!                     (concat "}"
!                             "\\([ \t\n]\\|\\\\\n\\)*"
!                             "catch"
!                             "\\([ \t\n]\\|\\\\\n\\)*"
!                             "("
!                             "\\=")
!                     nil t)
!                    (not  (c-save-buffer-state () (c-in-literal))))
!             (delete-region (match-beginning 0) (match-end 0))
!             (insert-and-inherit "} catch (")))
! 
!         ;; Check for clean-ups at function calls.  These two DON'T need
!         ;; `c-electric-flag' or `c-syntactic-indentation' set.
!         ;; Point is currently just after the inserted paren.
!         (let (beg (end (1- (point))))
!           (cond
! 
!            ;; space-before-funcall clean-up?
!            ((and (memq 'space-before-funcall c-cleanup-list)
!                  (eq last-command-char ?\()
!                  (save-excursion
!                    (backward-char)
!                    (skip-chars-backward " \t")
!                    (setq beg (point))
!                    (c-save-buffer-state () (c-on-identifier))))
!             (save-excursion
!               (delete-region beg end)
!               (goto-char beg)
!               (insert ?\ )))
! 
!            ;; compact-empty-funcall clean-up?
!                 ((c-save-buffer-state ()
!                    (and (memq 'compact-empty-funcall c-cleanup-list)
!                         (eq last-command-char ?\))
!                         (save-excursion
!                           (c-safe (backward-char 2))
!                           (when (looking-at "()")
!                             (setq end (point))
!                             (skip-chars-backward " \t")
!                             (setq beg (point))
!                             (c-on-identifier)))))
!                  (delete-region beg end))))
!         (and (eq last-input-event ?\))
!              (not executing-kbd-macro)
!              old-blink-paren
!              (funcall old-blink-paren))))))
  
  (defun c-electric-continued-statement ()
    "Reindent the current line if appropriate.
***************
*** 995,1010 ****
  
  The line is reindented if there is nothing but whitespace before the
  keyword on the line, the keyword is not inserted inside a literal, and
! `c-syntactic-indentation' is non-nil."
    (let (;; shut this up
        (c-echo-syntactic-information-p nil))
!     (when (and c-syntactic-indentation
!              (not (eq last-command-char ?_))
!              (= (save-excursion
!                   (skip-syntax-backward "w")
!                   (point))
!                 (c-point 'boi))
!              (not (c-in-literal (c-point 'bod))))
        ;; Have to temporarily insert a space so that
        ;; c-guess-basic-syntax recognizes the keyword.  Follow the
        ;; space with a nonspace to avoid messing up any whitespace
--- 1275,1292 ----
  
  The line is reindented if there is nothing but whitespace before the
  keyword on the line, the keyword is not inserted inside a literal, and
! `c-electric-flag' and `c-syntactic-indentation' are both non-nil."
    (let (;; shut this up
        (c-echo-syntactic-information-p nil))
!     (when (c-save-buffer-state ()
!           (and c-electric-flag
!                c-syntactic-indentation
!                (not (eq last-command-char ?_))
!                (= (save-excursion
!                     (skip-syntax-backward "w")
!                     (point))
!                   (c-point 'boi))
!                (not (c-in-literal (c-point 'bod)))))
        ;; Have to temporarily insert a space so that
        ;; c-guess-basic-syntax recognizes the keyword.  Follow the
        ;; space with a nonspace to avoid messing up any whitespace
***************
*** 1016,1051 ****
        (delete-char -2)))))
  
  
- ;; better movement routines for ThisStyleOfVariablesCommonInCPlusPlus
- ;; originally contributed by address@hidden
  (defun c-forward-into-nomenclature (&optional arg)
!   "Move forward to end of a nomenclature section or word.
! With arg, do it arg times."
    (interactive "p")
!   (let ((case-fold-search nil))
!     (if (> arg 0)
!       (re-search-forward
!        (cc-eval-when-compile
!          (concat "\\W*\\([" c-upper "]*[" c-lower c-digit "]*\\)"))
!        (point-max) t arg)
!       (while (and (< arg 0)
!                 (re-search-backward
!                  (cc-eval-when-compile
!                    (concat
!                     "\\(\\(\\W\\|[" c-lower c-digit "]\\)[" c-upper "]+"
!                     "\\|\\W\\w+\\)"))
!                  (point-min) 0))
!       (forward-char 1)
!       (setq arg (1+ arg)))))
!   (c-keep-region-active))
  
  (defun c-backward-into-nomenclature (&optional arg)
!   "Move backward to beginning of a nomenclature section or word.
! With optional ARG, move that many times.  If ARG is negative, move
! forward."
    (interactive "p")
!   (c-forward-into-nomenclature (- arg))
!   (c-keep-region-active))
  
  (defun c-scope-operator ()
    "Insert a double colon scope operator at point.
--- 1298,1316 ----
        (delete-char -2)))))
  
  
  (defun c-forward-into-nomenclature (&optional arg)
!   "Compatibility alias for `c-forward-subword'."
    (interactive "p")
!   (require 'cc-subword)
!   (c-forward-subword arg))
! (make-obsolete 'c-forward-into-nomenclature 'c-forward-subword)
  
  (defun c-backward-into-nomenclature (&optional arg)
!   "Compatibility alias for `c-backward-subword'."
    (interactive "p")
!   (require 'cc-subword)
!   (c-backward-subword arg))
! (make-obsolete 'c-backward-into-nomenclature 'c-backward-subword)
  
  (defun c-scope-operator ()
    "Insert a double colon scope operator at point.
***************
*** 1246,1251 ****
--- 1511,1518 ----
    ;; following one is chosen instead (if there is any).  The end
    ;; position is at the next line, providing there is one before the
    ;; declaration.
+   ;;
+   ;; This function might do hidden buffer changes.
    (save-excursion
  
      ;; Note: Some code duplication in `c-beginning-of-defun' and
***************
*** 1369,1374 ****
--- 1636,2239 ----
        (push-mark (cdr decl-limits) nil t))))
  
  
+ (defun c-in-comment-line-prefix-p ()
+   ;; Point is within a comment.  Is it also within a comment-prefix?
+   ;; Space at BOL which precedes a comment-prefix counts as part of it.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (let ((here (point)))
+     (save-excursion
+       (beginning-of-line)
+       (skip-chars-forward " \t")
+       (and (looking-at c-current-comment-prefix)
+          (/= (match-beginning 0) (match-end 0))
+          (< here (match-end 0))))))
+ 
+ (defun c-narrow-to-comment-innards (range)
+   ;; Narrow to the "inside" of the comment (block) defined by range, as
+   ;; follows:
+   ;; 
+   ;; A c-style block comment has its opening "/*" and its closing "*/" (if
+   ;; present) removed.  A c++-style line comment retains its opening "//" but
+   ;; has any final NL removed.  If POINT is currently outwith these innards,
+   ;; move it to the appropriate boundary.
+   ;; 
+   ;; This narrowing simplifies the sentence movement functions, since it
+   ;; eliminates awkward things at the boundaries of the comment (block).
+   ;;
+   ;; This function might do hidden buffer changes.
+   (let* ((lit-type (c-literal-type range))
+        (beg (if (eq lit-type 'c) (+ (car range) 2) (car range)))
+        (end (if (eq lit-type 'c)
+                 (if (and (eq (char-before (cdr range)) ?/)
+                          (eq (char-before (1- (cdr range))) ?*))
+                     (- (cdr range) 2)
+                   (point-max))
+               (if (eq (cdr range) (point-max))
+                   (point-max)
+                 (- (cdr range) 1)))))
+     (if (> (point) end)
+       (goto-char end))                ; This would be done automatically by 
...
+     (if (< (point) beg)
+       (goto-char beg))        ;  ... narrow-to-region but is not documented.
+     (narrow-to-region beg end)))
+ 
+ (defun c-beginning-of-sentence-in-comment (range)
+   ;; Move backwards to the "beginning of a sentence" within the comment
+   ;; defined by RANGE, a cons of its starting and ending positions.  If we
+   ;; find a BOS, return NIL.  Otherwise, move point to just before the start
+   ;; of the comment and return T.
+   ;;
+   ;; The BOS is either text which follows a regexp match of sentence-end,
+   ;; or text which is a beginning of "paragraph".  
+   ;; Comment-prefixes are treated like WS when calculating BOSes or BOPs.
+   ;;
+   ;; This code was adapted from GNU Emacs's forward-sentence in paragraphs.el.
+   ;; It is not a general function, but is intended only for calling from
+   ;; c-move-over-sentence.  Not all preconditions have been explicitly stated.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-match-data
+     (let ((start-point (point)))
+       (save-restriction
+       (c-narrow-to-comment-innards range) ; This may move point back.
+       (let* ((here (point))
+              last
+              (here-filler        ; matches WS and comment-prefices at point.
+               (concat "\\=\\(^[ \t]*\\(" c-current-comment-prefix "\\)"
+                       "\\|[ \t\n\r\f]\\)*"))
+              (prefix-at-bol-here ; matches WS and prefix at BOL, just before 
point
+               (concat "^[ \t]*\\(" c-current-comment-prefix "\\)[ 
\t\n\r\f]*\\="))
+              ;; First, find the previous paragraph start, if any.
+              (par-beg ; point where non-WS/non-prefix text of paragraph 
starts.
+               (save-excursion
+                 (forward-paragraph -1) ; uses cc-mode values of
+                                       ; paragraph-\(start\|separate\)
+                 (if (> (re-search-forward here-filler nil t) here)
+                     (goto-char here))
+                 (when (>= (point) here)
+                   (forward-paragraph -2)
+                   (if (> (re-search-forward here-filler nil t) here)
+                       (goto-char here)))
+                 (point))))
+ 
+         ;; Now seek successively earlier sentence ends between PAR-BEG and
+         ;; HERE, until the "start of sentence" following it is earlier than
+         ;; HERE, or we hit PAR-BEG.  Beware of comment prefices!
+         (while (and (re-search-backward (c-sentence-end) par-beg 'limit)
+                     (setq last (point))
+                     (goto-char (match-end 0)) ; tentative beginning of 
sentence
+                     (or (>= (point) here)
+                         (and (not (bolp)) ; Found a non-blank comment-prefix?
+                              (save-excursion
+                                (if (re-search-backward prefix-at-bol-here nil 
t)
+                                    (/= (match-beginning 1) (match-end 1)))))
+                         (progn        ; Skip the crud to find a real b-o-s.
+                           (if (c-in-comment-line-prefix-p)
+                               (beginning-of-line))
+                           (re-search-forward here-filler) ; always succeeds.
+                           (>= (point) here))))
+           (goto-char last))
+         (re-search-forward here-filler)))
+ 
+       (if (< (point) start-point)
+         nil
+       (goto-char (car range))
+       t))))
+ 
+ (defun c-end-of-sentence-in-comment (range)
+   ;; Move forward to the "end of a sentence" within the comment defined by
+   ;; RANGE, a cons of its starting and ending positions (enclosing the opening
+   ;; comment delimiter and the terminating */ or newline).  If we find an EOS,
+   ;; return NIL.  Otherwise, move point to just after the end of the comment
+   ;; and return T.
+   ;;
+   ;; The EOS is just after the non-WS part of the next match of the regexp
+   ;; sentence-end.  Typically, this is just after one of [.!?].  If there is
+   ;; no sentence-end match following point, any WS before the end of the
+   ;; comment will count as EOS, providing we're not already in it.
+   ;;
+   ;; This code was adapted from GNU Emacs's forward-sentence in paragraphs.el.
+   ;; It is not a general function, but is intended only for calling from
+   ;; c-move-over-sentence.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-match-data
+     (let ((start-point (point))
+         ;; (lit-type (c-literal-type range))  ; Commented out, 2005/11/23, ACM
+         )
+       (save-restriction
+       (c-narrow-to-comment-innards range) ; This might move point forwards.
+       (let* ((here (point))
+              (par-end ; EOL position of last text in current/next paragraph.
+               (save-excursion
+                 ;; The cc-mode values of paragraph-\(start\|separate\), set
+                 ;; in c-setup-paragraph-variables, are used in the
+                 ;; following.
+                 (forward-paragraph 1)
+                 (if (eq (preceding-char) ?\n) (forward-char -1))
+                 (when (<= (point) here) ; can happen, e.g., when HERE is at 
EOL.
+                   (goto-char here)
+                   (forward-paragraph 2)
+                   (if (eq (preceding-char) ?\n) (forward-char -1)))
+                 (point)))
+ 
+              last
+              (prefix-at-bol-here
+               (concat "^[ \t]*\\(" c-current-comment-prefix "\\)\\=")))
+         ;; Go forward one "comment-prefix which looks like sentence-end"
+         ;; each time round the following:
+         (while (and (re-search-forward (c-sentence-end) par-end 'limit)
+                     (progn
+                       (setq last (point))
+                       (skip-chars-backward " \t\n")
+                       (or (and (not (bolp))
+                                (re-search-backward prefix-at-bol-here nil t)
+                                (/= (match-beginning 1) (match-end 1)))
+                           (<= (point) here))))
+           (goto-char last))
+ 
+         ;; Take special action if we're up against the end of a comment (of
+         ;; either sort): Leave point just after the last non-ws text.
+         (if (eq (point) (point-max))
+             (while (or (/= (skip-chars-backward " \t\n") 0)
+                        (and (re-search-backward prefix-at-bol-here nil t)
+                             (/= (match-beginning 1) (match-end 1))))))))
+ 
+       (if (> (point) start-point)
+             nil
+           (goto-char (cdr range))
+           t))))
+ 
+ (defun c-beginning-of-sentence-in-string (range)
+   ;; Move backwards to the "beginning of a sentence" within the string defined
+   ;; by RANGE, a cons of its starting and ending positions (enclosing the
+   ;; string quotes).  If we find a BOS, return NIL.  Otherwise, move point to
+   ;; just before the start of the string and return T.
+   ;;
+   ;; The BOS is either the text which follows a regexp match of sentence-end
+   ;; or text which is a beginning of "paragraph".  For the purposes of
+   ;; determining paragraph boundaries, escaped newlines are treated as
+   ;; ordinary newlines.
+   ;;
+   ;; This code was adapted from GNU Emacs's forward-sentence in paragraphs.el.
+   ;; It is not a general function, but is intended only for calling from
+   ;; c-move-over-sentence.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-match-data
+     (let* ((here (point)) last
+          (end (1- (cdr range)))
+          (here-filler            ; matches WS and escaped newlines at point.
+           "\\=\\([ \t\n\r\f]\\|\\\\[\n\r]\\)*")
+          ;; Enhance paragraph-start and paragraph-separate also to recognise
+          ;; blank lines terminated by escaped EOLs.  IT MAY WELL BE that
+          ;; these values should be customizable user options, or something.
+          (paragraph-start c-string-par-start)
+          (paragraph-separate c-string-par-separate)
+ 
+          (par-beg            ; beginning of current (or previous) paragraph.
+           (save-excursion
+             (save-restriction
+               (narrow-to-region (1+ (car range)) end)
+               (forward-paragraph -1)  ; uses above values of
+                                       ; paragraph-\(start\|separate\)
+               (if (> (re-search-forward here-filler nil t) here)
+                   (goto-char here))
+               (when (>= (point) here)
+                 (forward-paragraph -2)
+                 (if (> (re-search-forward here-filler nil t) here)
+                     (goto-char here)))
+               (point)))))
+       ;; Now see if we can find a sentence end after PAR-BEG.
+       (while (and (re-search-backward c-sentence-end-with-esc-eol par-beg 
'limit)
+                 (setq last (point))
+                 (goto-char (match-end 0))
+                 (or (> (point) end)
+                     (progn
+                       (re-search-forward
+                        here-filler end t) ; always succeeds.  Use end rather
+                                       ; than here, in case point starts
+                                       ; beyond the closing quote.
+                       (>= (point) here))))
+       (goto-char last))
+       (re-search-forward here-filler here t)
+       (if (< (point) here)
+         nil
+       (goto-char (car range))
+       t))))
+ 
+ (defun c-end-of-sentence-in-string (range)
+   ;; Move forward to the "end of a sentence" within the string defined by
+   ;; RANGE, a cons of its starting and ending positions.  If we find an EOS,
+   ;; return NIL.  Otherwise, move point to just after the end of the string
+   ;; and return T.
+   ;;
+   ;; The EOS is just after the non-WS part of the next match of the regexp
+   ;; sentence-end.  Typically, this is just after one of [.!?].  If there is
+   ;; no sentence-end match following point, any WS before the end of the
+   ;; string will count as EOS, providing we're not already in it.
+   ;;
+   ;; This code was adapted from GNU Emacs's forward-sentence in paragraphs.el.
+   ;; It is not a general function, but is intended only for calling from
+   ;; c-move-over-sentence.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-match-data
+     (let* ((here (point))
+          last
+          ;; Enhance paragraph-start and paragraph-separate to recognise
+          ;; blank lines terminated by escaped EOLs.
+          (paragraph-start c-string-par-start)
+          (paragraph-separate c-string-par-separate)
+ 
+          (par-end     ; EOL position of last text in current/next paragraph.
+           (save-excursion
+             (save-restriction
+               (narrow-to-region (car range) (1- (cdr range)))
+               ;; The above values of paragraph-\(start\|separate\) are used
+               ;; in the following.
+               (forward-paragraph 1)
+               (setq last (point))
+               ;; (re-search-backward filler-here nil t) would find an empty
+               ;; string.  Therefore we simulate it by the following:
+               (while (or (/= (skip-chars-backward " \t\n\r\f") 0)
+                          (re-search-backward "\\\\\\($\\)\\=" nil t)))
+               (unless (> (point) here)
+                 (goto-char last)
+                 (forward-paragraph 1)
+                 (while (or (/= (skip-chars-backward " \t\n\r\f") 0)
+                            (re-search-backward "\\\\\\($\\)\\=" nil t))))
+               (point)))))
+       ;; Try to go forward a sentence.
+       (when (re-search-forward c-sentence-end-with-esc-eol par-end 'limit)
+       (setq last (point))
+       (while (or (/= (skip-chars-backward " \t\n") 0)
+                  (re-search-backward "\\\\\\($\\)\\=" nil t))))
+       ;; Did we move a sentence, or did we hit the end of the string?
+       (if (> (point) here)
+         nil
+       (goto-char (cdr range))
+       t))))
+ 
+ (defun c-ascertain-preceding-literal ()
+   ;; Point is not in a literal (i.e. comment or string (include AWK regexp)).
+   ;; If a literal is the next thing (aside from whitespace) to be found before
+   ;; point, return a cons of its start.end positions (enclosing the
+   ;; delimiters).  Otherwise return NIL.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-excursion
+     (c-collect-line-comments
+      (let ((here (point))
+          pos)
+        (if (c-backward-single-comment)
+          (cons (point) (progn (c-forward-single-comment) (point)))
+        (save-restriction
+          ;; to prevent `looking-at' seeing a " at point.
+          (narrow-to-region (point-min) here)
+          (when
+              (or
+               ;; An EOL can act as an "open string" terminator in AWK.
+               (looking-at c-ws*-string-limit-regexp)
+               (and (not (bobp))
+                    (progn (backward-char)
+                           (looking-at c-string-limit-regexp))))
+            (goto-char (match-end 0))  ; just after the string terminator.
+            (setq pos (point))
+            (c-safe (c-backward-sexp 1) ; move back over the string.
+                    (cons (point) pos)))))))))
+ 
+ (defun c-ascertain-following-literal ()
+   ;; Point is not in a literal (i.e. comment or string (include AWK regexp)).
+   ;; If a literal is the next thing (aside from whitespace) following point,
+   ;; return a cons of its start.end positions (enclosing the delimiters).
+   ;; Otherwise return NIL.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-excursion
+     (c-collect-line-comments
+      (let (pos)
+        (c-skip-ws-forward)
+        (if (looking-at c-string-limit-regexp) ; string-delimiter.
+          (cons (point) (or (c-safe (progn (c-forward-sexp 1) (point)))
+                            (point-max)))
+        (setq pos (point))
+        (if (c-forward-single-comment)
+            (cons pos (point))))))))
+ 
+ (defun c-after-statement-terminator-p () ; Should we pass in LIM here?
+   ;; Does point immediately follow a statement "terminator"?  A virtual
+   ;; semicolon is regarded here as such.  So is a an opening brace ;-)
+   ;;
+   ;; This function might do hidden buffer changes.
+   (or (save-excursion
+       (backward-char)
+       (and (looking-at "[;{}]")
+            (not (and c-special-brace-lists ; Pike special brace lists.
+                      (eq (char-after) ?{)
+                      (c-looking-at-special-brace-list)))))
+       (c-at-vsemi-p)
+       ;; The following (for macros) is not strict about exactly where we are
+       ;; wrt white space at the end of the macro.  Doesn't seem to matter too
+       ;; much.  ACM 2004/3/29.
+       (let (eom)
+       (save-excursion
+         (if (c-beginning-of-macro)
+             (setq eom (progn (c-end-of-macro)
+                              (point)))))
+       (when eom
+         (save-excursion
+           (c-forward-comments)
+           (>= (point) eom))))))
+ 
+ (defun c-back-over-illiterals (macro-start)
+   ;; Move backwards over code which isn't a literal (i.e. comment or string),
+   ;; stopping before reaching BOB or a literal or the boundary of a
+   ;; preprocessor statement or the "beginning of a statement".  MACRO-START is
+   ;; the position of the '#' beginning the current preprocessor directive, or
+   ;; NIL if we're not in such.
+   ;;
+   ;; Return a cons (A.B), where
+   ;;   A is NIL if we moved back to a BOS (and know it), T otherwise (we
+   ;;     didn't move, or we hit a literal, or we're not sure about BOS).
+   ;;   B is MACRO-BOUNDARY if we are about to cross the boundary out of or
+   ;;     into a macro, otherwise LITERAL if we've hit a literal, otherwise NIL
+   ;;
+   ;;   The total collection of returned values is as follows:
+   ;;     (nil . nil): Found a BOS whilst remaining inside the illiterals.
+   ;;     (t . literal): No BOS found: only a comment/string.  We _might_ be at
+   ;;                    a BOS - the caller must check this.
+   ;;     (nil . macro-boundary): only happens with non-nil macro-start.  We've
+   ;;                             moved and reached the opening # of the macro.
+   ;;     (t . macro-boundary): Every other circumstance in which we're at a
+   ;;                           macro-boundary.  We might be at a BOS.
+   ;;
+   ;; Point is left either at the beginning-of-statement, or at the last non-ws
+   ;; code before encountering the literal/BOB or macro-boundary.
+   ;;
+   ;; Note that this function moves within either preprocessor commands
+   ;; (macros) or normal code, but will not cross a boundary between the two,
+   ;; or between two distinct preprocessor commands.
+   ;;
+   ;; Stop before `{' and after `;', `{', `}' and `};' when not followed by `}'
+   ;; or `)', but on the other side of the syntactic ws.  Move by sexps and
+   ;; move into parens.  Also stop before `#' when it's at boi on a line.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-match-data
+     (let ((here (point))
+         last) ; marks the position of non-ws code, what'll be BOS if, say, a
+                                       ; semicolon precedes it.
+       (catch 'done
+       (while t ;; We go back one "token" each iteration of the loop.
+         (setq last (point))
+         (cond
+         ;; Stop at the token after a comment.
+          ((c-backward-single-comment) ; Also functions as backwards-ws.
+           (goto-char last)
+           (throw 'done '(t . literal)))
+ 
+         ;; If we've gone back over a LF, we might have moved into or out of
+         ;; a preprocessor line.
+          ((and (save-excursion
+                  (beginning-of-line)
+                  (re-search-forward "\\(^\\|[^\\]\\)[\n\r]" last t))
+                (if macro-start
+                    (< (point) macro-start)
+                  (c-beginning-of-macro)))
+           (goto-char last)
+           ;; Return a car of NIL ONLY if we've hit the opening # of a macro.
+           (throw 'done (cons (or (eq (point) here)
+                                  (not macro-start))
+                              'macro-boundary)))
+ 
+          ;; Have we found a virtual semicolon?  If so, stop, unless the next
+          ;; statement is where we started from.
+          ((and (c-at-vsemi-p)
+                (< last here)
+                (not (memq (char-after last) '(?\) ?})))) ; we've moved back 
from ) or }
+           (goto-char last)
+           (throw 'done '(nil . nil)))
+ 
+          ;; Hit the beginning of the buffer/region?
+          ((bobp)
+           (if (/= here last)
+               (goto-char last))
+           (throw 'done '(nil . nil)))
+ 
+          ;; Move back a character.
+          ((progn (backward-char) nil))
+ 
+          ;; Stop at "{" (unless it's a PIKE special brace list.)
+          ((eq (char-after) ?\{)
+           (if (and c-special-brace-lists
+                    (c-looking-at-special-brace-list))
+               (skip-syntax-backward "w_") ; Speedup only.
+             (if (/= here last)
+                 (goto-char last))
+             (throw 'done '(nil . nil))))
+ 
+          ;; Have we reached the start of a macro?  This always counts as
+          ;; BOS.  (N.B. I don't think (eq (point) here) can ever be true
+          ;; here.  FIXME!!! ACM 2004/3/29)
+          ((and macro-start (eq (point) macro-start))
+           (throw 'done (cons (eq (point) here) 'macro-boundary)))
+ 
+          ;; Stop at token just after "}" or ";".
+          ((looking-at "[;}]")
+           ;; If we've gone back over ;, {, or }, we're done.
+           (if (or (= here last)
+                   (memq (char-after last) '(?\) ?}))) ; we've moved back from 
) or }
+               (if (and (eq (char-before) ?}) ; If };, treat them as a unit.
+                        (eq (char-after) ?\;))
+                   (backward-char))
+             (goto-char last)   ; To the statement starting after the ; or }.
+             (throw 'done '(nil . nil))))
+ 
+          ;; Stop at the token after a string.
+          ((looking-at c-string-limit-regexp) ; Just gone back over a string 
terminator?
+           (goto-char last)
+           (throw 'done '(t . literal)))
+        
+          ;; Nothing special: go back word characters.
+          (t (skip-syntax-backward "w_")) ; Speedup only.
+          ))))))
+ 
+ (defun c-forward-over-illiterals (macro-end allow-early-stop)
+   ;; Move forwards over code, stopping before reaching EOB or a literal
+   ;; (i.e. a comment/string) or the boundary of a preprocessor statement or
+   ;; the "end of a statement".  MACRO-END is the position of the EOL/EOB which
+   ;; terminates the current preprocessor directive, or NIL if we're not in
+   ;; such.
+   ;;
+   ;; ALLOW-EARLY-STOP is non-nil if it is permissible to return without moving
+   ;; forward at all, should we encounter a `{'.  This is an ugly kludge, but
+   ;; seems unavoidable.  Depending on the context this function is called
+   ;; from, we _sometimes_ need to stop there.  Currently (2004/4/3),
+   ;; ALLOW-EARLY-STOP is applied only to open braces, not to virtual
+   ;; semicolons, or anything else.
+   ;;
+   ;; Return a cons (A.B), where
+   ;;   A is NIL if we moved forward to an EOS, or stay at one (when
+   ;;     ALLOW-EARLY-STOP is set), T otherwise (we hit a literal).
+   ;;   B is 'MACRO-BOUNDARY if we are about to cross the boundary out of or
+   ;;     into a macro, otherwise 'LITERAL if we've hit a literal, otherwise 
NIL
+   ;;
+   ;; Point is left either after the end-of-statement, or at the last non-ws
+   ;; code before encountering the literal, or the # of the preprocessor
+   ;; statement, or at EOB [or just after last non-WS stuff??].
+   ;;
+   ;; As a clarification of "after the end-of-statement", if a comment or
+   ;; whitespace follows a completed AWK statement, that statement is treated
+   ;; as ending just after the last non-ws character before the comment.
+   ;; 
+   ;; Note that this function moves within either preprocessor commands
+   ;; (macros) or normal code, but not both within the same invocation.
+   ;;
+   ;; Stop before `{', `}', and `#' when it's at boi on a line, but on the
+   ;; other side of the syntactic ws, and after `;', `}' and `};'.  Only
+   ;; stop before `{' if at top level or inside braces, though.  Move by
+   ;; sexps and move into parens.  Also stop at eol of lines with `#' at
+   ;; the boi.
+   ;;
+   ;; This function might do hidden buffer changes.
+   (let ((here (point))
+       last)
+     (catch 'done
+       (while t ;; We go one "token" forward each time round this loop.
+       (setq last (point))
+ 
+       ;; If we've moved forward to a virtual semicolon, we're done.
+       (if (and (> last here) ; Should we check ALLOW-EARLY-STOP, here? 
2004/4/3
+                (c-at-vsemi-p))
+           (throw 'done '(nil . nil)))
+ 
+       (c-skip-ws-forward)
+       (cond
+        ;; Gone past the end of a macro?
+        ((and macro-end (> (point) macro-end))
+         (goto-char last)
+         (throw 'done (cons (eq (point) here) 'macro-boundary)))
+ 
+        ;; About to hit a comment?
+        ((save-excursion (c-forward-single-comment))
+         (goto-char last)
+         (throw 'done '(t . literal)))
+ 
+        ;; End of buffer?
+        ((eobp)
+         (if (/= here last)
+             (goto-char last))
+         (throw 'done '(nil . nil)))
+ 
+        ;; If we encounter a '{', stop just after the previous token.
+        ((and (eq (char-after) ?{)
+              (not (and c-special-brace-lists
+                        (c-looking-at-special-brace-list)))
+              (or allow-early-stop (/= here last))
+              (save-excursion  ; Is this a check that we're NOT at top level?
+ ;;;; NO!  This seems to check that (i) EITHER we're at the top level; OR (ii) 
The next enclosing
+ ;;;; level of bracketing is a '{'.  HMM.  Doesn't seem to make sense.
+ ;;;; 2003/8/8 This might have something to do with the GCC extension 
"Statement Expressions", e.g.
+ ;;;; while ({stmt1 ; stmt2 ; exp ;}).  This form excludes such Statement 
Expressions.
+                (or (not (c-safe (up-list -1) t))
+                    (= (char-after) ?{))))
+         (goto-char last)
+         (throw 'done '(nil . nil)))
+ 
+        ;; End of a PIKE special brace list?  If so, step over it and continue.
+        ((and c-special-brace-lists
+              (eq (char-after) ?})
+              (save-excursion
+                (and (c-safe (up-list -1) t)
+                     (c-looking-at-special-brace-list))))
+         (forward-char)
+         (skip-syntax-forward "w_"))   ; Speedup only.
+ 
+        ;; Have we got a '}' after having moved?  If so, stop after the
+        ;; previous token.
+        ((and (eq (char-after) ?})
+              (/= here last))
+         (goto-char last)
+         (throw 'done '(nil . nil)))
+ 
+        ;; Stop if we encounter a preprocessor line.
+        ((and (not macro-end)
+              (eq (char-after) ?#)
+              (= (point) (c-point 'boi)))
+         (goto-char last)
+         ;(throw 'done (cons (eq (point) here) 'macro-boundary))) ; Changed 
2003/3/26
+         (throw 'done '(t . macro-boundary)))
+ 
+        ;; Stop after a ';', '}', or "};"
+        ((looking-at ";\\|};?")
+         (goto-char (match-end 0))
+         (throw 'done '(nil . nil)))
+ 
+        ;; Found a string (this subsumes AWK regexps)?
+        ((looking-at c-string-limit-regexp)
+         (goto-char last)
+         (throw 'done '(t . literal)))
+ 
+        (t
+         (forward-char)          ; Can't fail - we checked (eobp) earlier on.
+         (skip-syntax-forward "w_")    ; Speedup only.
+         (when (and macro-end (> (point) macro-end))
+           (goto-char last)
+           (throw 'done (cons (eq (point) here) 'macro-boundary))))
+        )))))
+ 
+ (defun c-one-line-string-p (range)
+   ;; Is the literal defined by RANGE a string contained in a single line?
+   ;;
+   ;; This function might do hidden buffer changes.
+   (save-excursion
+     (goto-char (car range))
+     (and (looking-at c-string-limit-regexp)
+        (progn (skip-chars-forward "^\n" (cdr range))
+               (eq (point) (cdr range))))))
+ 
  (defun c-beginning-of-statement (&optional count lim sentence-flag)
    "Go to the beginning of the innermost C statement.
  With prefix arg, go back N - 1 statements.  If already at the
***************
*** 1382,1699 ****
  to search for the syntactic context, and a flag saying whether to do
  sentence motion in or near comments and multiline strings.
  
! Note that `c-beginning-of-statement-1' is usually better to use from
! programs.  It has much more well defined semantics than this one,
! which is intended for interactive use and might therefore change to be
! more \"DWIM:ey\"."
    (interactive (list (prefix-numeric-value current-prefix-arg)
                     nil t))
!   (c-save-buffer-state
!       ((count (or count 1))
!        here
!        (range (c-collect-line-comments (c-literal-limits lim))))
!     (while (and (/= count 0)
!               (or (not lim) (> (point) lim)))
!       (setq here (point))
!       (if (and (not range) sentence-flag)
!         (save-excursion
!           ;; Find the comment next to point if we're not in one.
!           (if (> count 0)
!               (if (c-backward-single-comment)
!                   (setq range (cons (point)
!                                     (progn (c-forward-single-comment)
!                                            (point))))
!                 (c-skip-ws-backward)
!                 (setq range (point))
!                 (setq range
!                       (if (eq (char-before) ?\")
!                           (c-safe (c-backward-sexp 1)
!                                   (cons (point) range)))))
!             (c-skip-ws-forward)
!             (if (eq (char-after) ?\")
!                 (setq range (cons (point)
!                                   (progn
!                                     (c-forward-sexp 1)
!                                     (point))))
!               (setq range (point))
!               (setq range (if (c-forward-single-comment)
!                               (cons range (point))
!                             nil))))
!           (setq range (c-collect-line-comments range))))
!       (if (and (< count 0) (= here (point-max)))
!         ;; Special case because eob might be in a literal.
!         (setq range nil))
!       (if range
!         (if (and sentence-flag
!                  (or (/= (char-syntax (char-after (car range))) ?\")
!                      ;; Only visit a string if it spans more than one line.
!                      (save-excursion
!                        (goto-char (car range))
!                        (skip-chars-forward "^\n" (cdr range))
!                        (< (point) (cdr range)))))
!             (let* ((lit-type (c-literal-type range))
!                    (line-prefix (concat "[ \t]*\\("
!                                         c-current-comment-prefix
!                                         "\\)[ \t]*"))
!                    (beg (if (eq lit-type 'string)
!                             (1+ (car range))
!                           (save-excursion
!                             (goto-char (car range))
!                             (max (progn
!                                    (looking-at comment-start-skip)
!                                    (match-end 0))
!                                  (progn
!                                    (looking-at line-prefix)
!                                    (match-end 0))))))
!                    (end (- (cdr range) (if (eq lit-type 'c) 2 1)))
!                    (beg-of-para (if (eq lit-type 'string)
!                                     (lambda ())
!                                   (lambda ()
!                                     (beginning-of-line)
!                                     (if (looking-at line-prefix)
!                                         (goto-char (match-end 0)))))))
!               (save-restriction
!                 ;; Move by sentence, but not past the limit of the
!                 ;; literal, narrowed to the appropriate
!                 ;; paragraph(s).
!                 (narrow-to-region (save-excursion
!                                     (let ((pos (min here end)))
!                                       (goto-char pos)
!                                       (forward-paragraph -1)
!                                       (if (looking-at paragraph-separate)
!                                           (forward-line))
!                                       (when (> (point) beg)
!                                         (funcall beg-of-para)
!                                         (when (>= (point) pos)
!                                           (forward-paragraph -2)
!                                           (funcall beg-of-para)))
!                                       (max (point) beg)))
!                                   end)
!                 (c-safe (forward-sentence (if (< count 0) 1 -1)))
!                 (if (and (memq lit-type '(c c++))
!                          ;; Check if we stopped due to a comment
!                          ;; prefix and not a sentence end.
!                          (/= (point) (point-min))
!                          (/= (point) (point-max))
!                          (save-excursion
!                            (beginning-of-line)
!                            (looking-at line-prefix))
!                          (>= (point) (match-beginning 0))
!                          (/= (match-beginning 1) (match-end 1))
!                          (or (< (point) (match-end 0))
!                              (and
!                               (= (point) (match-end 0))
!                               ;; The comment prefix may contain
!                               ;; characters that is regarded as end
!                               ;; of sentence.
!                               (or (eolp)
!                                   (and
!                                    (save-excursion
!                                      (forward-paragraph -1)
!                                      (< (point) (match-beginning 0)))
!                                    (save-excursion
!                                      (beginning-of-line)
!                                      (or (not (re-search-backward
!                                                (sentence-end)
!                                                (c-point 'bopl)
!                                                t))
!                                          (< (match-end 0)
!                                             (c-point 'eol)))))))))
!                     (setq count (+ count (if (< count 0) -1 1)))
!                   (if (< count 0)
!                       (progn
!                         ;; In block comments, if there's only
!                         ;; horizontal ws between the text and the
!                         ;; comment ender, stop before it.  Stop after
!                         ;; the ender if there's either nothing or
!                         ;; newlines between.
!                         (when (and (eq lit-type 'c)
!                                    (eq (point) (point-max)))
!                           (widen)
!                           (when (or (= (skip-chars-backward " \t") 0)
!                                     (eq (point) (point-max))
!                                     (bolp))
!                             (goto-char (cdr range)))))
!                     (when (and (eq (point) (point-min))
!                                (looking-at "[ \t]*\\\\?$"))
!                       ;; Stop before instead of after the comment
!                       ;; starter if nothing follows it.
!                       (widen)
!                       (goto-char (car range))
!                       (if (and (eq lit-type 'string) (/= (point) here))
!                           (setq count (1+ count)
!                                 range nil))))))
!               ;; See if we should escape the literal.
!               (if (> count 0)
!                   (if (< (point) here)
!                       (setq count (1- count))
!                     (goto-char (car range))
!                     (setq range nil))
!                 (if (> (point) here)
!                     (setq count (1+ count))
!                   (goto-char (cdr range))
!                   (setq range nil))))
!           (goto-char (if (> count 0) (car range) (cdr range)))
!           (setq range nil))
!       (goto-char here)
!       (if (> count 0)
!           (condition-case nil
!               ;; Stop before `{' and after `;', `{', `}' and `};'
!               ;; when not followed by `}' or `)', but on the other
!               ;; side of the syntactic ws.  Move by sexps and move
!               ;; into parens.  Also stop before `#' when it's at boi
!               ;; on a line.
!               (let ((literal-pos (not sentence-flag))
!                     last last-below-line)
!                 (catch 'done
!                   (while t
!                     (setq last (point))
!                     (when (and (or (eq (char-after) ?\{)
!                                    (and (eq (char-after) ?#)
!                                         (eq (point) (c-point 'boi)))
!                                    )
!                                (/= here last))
!                       (unless (and c-special-brace-lists
!                                    (eq (char-after) ?{)
!                                    (c-looking-at-special-brace-list))
!                         (if (and (eq (char-after) ?#)
!                                  (numberp last-below-line)
!                                  (not (eq last-below-line here)))
!                             (goto-char last-below-line))
!                         (throw 'done t)))
!                     ;; Don't know why I added the following, but it
!                     ;; doesn't work when point is preceded by a line
!                     ;; style comment. /mast
!                     ;;(c-skip-ws-backward)
!                     (if literal-pos
!                         (c-backward-comments)
!                       (when (c-backward-single-comment)
!                         ;; Record position of first comment.
!                         (save-excursion
!                           (c-forward-single-comment)
!                           (setq literal-pos (point)))
!                         (c-backward-comments)))
!                     (unless last-below-line
!                       (if (save-excursion
!                             (re-search-forward "\\(^\\|[^\\]\\)$" last t))
!                           (setq last-below-line last)))
!                     (cond ((bobp)     ; Must handle bob specially.
!                            (if (= here last)
!                                (throw 'done t)
!                              (goto-char last)
!                              (throw 'done t)))
!                           ((progn (backward-char)
!                                   (looking-at "[;{}]"))
!                            (if (and c-special-brace-lists
!                                     (eq (char-after) ?{)
!                                     (c-looking-at-special-brace-list))
!                                (skip-syntax-backward "w_") ; Speedup only.
!                              (if (or (= here last)
!                                      (memq (char-after last) '(?\) ?})))
!                                  (if (and (eq (char-before) ?})
!                                           (eq (char-after) ?\;))
!                                      (backward-char))
!                                (goto-char last)
!                                (throw 'done t))))
!                           ((= (char-syntax (char-after)) ?\")
!                            (let ((end (point)))
!                              (forward-char)
!                              (c-backward-sexp)
!                              (save-excursion
!                                (skip-chars-forward "^\n" end)
!                                (when (< (point) end)
!                                  ;; Break at multiline string.
!                                  (setq literal-pos (1+ end))
!                                  (throw 'done t)))))
!                           (t (skip-syntax-backward "w_")) ; Speedup only.
!                           )))
!                 (if (and (numberp literal-pos)
!                          (< (point) literal-pos))
!                     ;; We jumped over a comment or string that
!                     ;; should be investigated.
!                     (goto-char literal-pos)
!                   (setq count (1- count))))
!             (error
!              (goto-char (point-min))
!              (setq count 0)))
!         (condition-case nil
!             ;; Stop before `{', `}', and `#' when it's at boi on a
!             ;; line, but on the other side of the syntactic ws, and
!             ;; after `;', `}' and `};'.  Only stop before `{' if at
!             ;; top level or inside braces, though.  Move by sexps
!             ;; and move into parens.  Also stop at eol of lines
!             ;; with `#' at the boi.
!             (let ((literal-pos (not sentence-flag))
!                   last)
!               (catch 'done
!                 (while t
!                   (setq last (point))
!                   (if literal-pos
!                       (c-forward-comments)
!                     (if (progn
!                           (c-skip-ws-forward)
!                           ;; Record position of first comment.
!                           (setq literal-pos (point))
!                           (c-forward-single-comment))
!                         (c-forward-comments)
!                       (setq literal-pos nil)))
!                   (cond ((and (eq (char-after) ?{)
!                               (not (and c-special-brace-lists
!                                         (c-looking-at-special-brace-list)))
!                               (/= here last)
!                               (save-excursion
!                                 (or (not (c-safe (up-list -1) t))
!                                     (= (char-after) ?{))))
!                          (goto-char last)
!                          (throw 'done t))
!                         ((and c-special-brace-lists
!                               (eq (char-after) ?})
!                               (save-excursion
!                                 (and (c-safe (up-list -1) t)
!                                      (c-looking-at-special-brace-list))))
!                          (forward-char 1)
!                          (skip-syntax-forward "w_")) ; Speedup only.
!                         ((and (eq (char-after) ?})
!                               (/= here last))
!                          (goto-char last)
!                          (throw 'done t))
! ;                       ((and (eq (char-after) ?#)
! ;                             (= (point) (c-point 'boi)))
! ;                        (if (= here last)
! ;                            (or (re-search-forward "\\(^\\|[^\\]\\)$" nil t)
! ;                                (goto-char (point-max)))
! ;                          (goto-char last))
! ;                        (throw 'done t))
!                         ((looking-at ";\\|};?")
!                          (goto-char (match-end 0))
!                          (throw 'done t))
!                         ((= (char-syntax (char-after)) ?\")
!                          (let ((beg (point)))
!                            (c-forward-sexp)
!                            (save-excursion
!                              (skip-chars-backward "^\n" beg)
!                              (when (> (point) beg)
!                                ;; Break at multiline string.
!                                (setq literal-pos beg)
!                                (throw 'done t)))))
!                         (t
!                          (forward-char 1)
!                          (skip-syntax-forward "w_")) ; Speedup only.
!                         )))
!               (if (and (numberp literal-pos)
!                        (> (point) literal-pos))
!                   ;; We jumped over a comment that should be investigated.
!                   (goto-char literal-pos)
!                 (setq count (1+ count))))
!           (error
!            (goto-char (point-max))
!            (setq count 0)))
!         ))
!       ;; If we haven't moved we're near a buffer limit.
!       (when (and (not (zerop count)) (= (point) here))
!       (goto-char (if (> count 0) (point-min) (point-max)))
!       (setq count 0))))
!   (c-keep-region-active))
  
  (defun c-end-of-statement (&optional count lim sentence-flag)
    "Go to the end of the innermost C statement.
--- 2247,2339 ----
  to search for the syntactic context, and a flag saying whether to do
  sentence motion in or near comments and multiline strings.
  
! Note that for use in programs, `c-beginning-of-statement-1' is
! usually better.  It has much better defined semantics than this one,
! which is intended for interactive use, and might therefore change to
! be more \"DWIM:ey\"."
    (interactive (list (prefix-numeric-value current-prefix-arg)
                     nil t))
!   (if (< count 0)
!       (c-end-of-statement (- count) lim sentence-flag)
!     (c-save-buffer-state
!       ((count (or count 1))
!        last ; start point for going back ONE chunk.  Updated each chunk 
movement.
!        (macro-fence
!         (save-excursion (and (not (bobp)) (c-beginning-of-macro) (point))))
!        res                            ; result from sub-function call
!        not-bos                        ; "not beginning-of-statement"
!        (range (c-collect-line-comments (c-literal-limits lim)))) ; 
(start.end) of current literal or NIL
! 
!       ;; Go back one statement at each iteration of the following loop.
!       (while (and (/= count 0)
!                 (or (not lim) (> (point) lim)))
!       ;; Go back one "chunk" each time round the following loop, stopping
!       ;; when we reach a statement boundary, etc.
!       (setq last (point))
!       (while
!           (cond ; Each arm of this cond returns NIL on reaching a desired
!                 ; statement boundary, non-NIL otherwise.
!            ((bobp)
!             (setq count 0)
!             nil)
! 
!            (range                ; point is within or approaching a literal.
!             (cond
!              ;; Single line string or sentence-flag is null => skip the
!              ;; entire literal.
!              ((or (null sentence-flag)
!                   (c-one-line-string-p range))
!               (goto-char (car range))
!               (setq range (c-ascertain-preceding-literal))
!               ;; N.B. The following is essentially testing for an AWK regexp
!               ;; at BOS:
!               ;; Was the previous non-ws thing an end of statement?
!               (save-excursion
!                 (if macro-fence
!                     (c-backward-comments)
!                   (c-backward-syntactic-ws))
!                 (not (or (bobp) (c-after-statement-terminator-p)))))
! 
!              ;; Comment inside a statement or a multi-line string.
!              (t (when (setq res ; returns non-nil when we go out of the 
literal
!                             (if (eq (c-literal-type range) 'string)
!                                 (c-beginning-of-sentence-in-string range)
!                               (c-beginning-of-sentence-in-comment range)))
!                   (setq range (c-ascertain-preceding-literal)))
!                 res)))
! 
!            ;; Non-literal code.
!            (t (setq res (c-back-over-illiterals macro-fence))
!               (setq not-bos          ; "not reached beginning-of-statement".
!                     (or (= (point) last)
!                         (memq (char-after) '(?\) ?\}))
!                         (and
!                          (car res)
!                          ;; We're at a tentative BOS.  The next form goes
!                          ;; back over WS looking for an end of previous
!                          ;; statement.
!                          (not (save-excursion
!                                 (if macro-fence
!                                     (c-backward-comments)
!                                   (c-backward-syntactic-ws))
!                                 (or (bobp) 
(c-after-statement-terminator-p)))))))
!               ;; Are we about to move backwards into or out of a
!               ;; preprocessor command?  If so, locate it's beginning.
!               (when (eq (cdr res) 'macro-boundary)
!                 (save-excursion
!                   (beginning-of-line)
!                   (setq macro-fence
!                         (and (not (bobp))
!                              (progn (c-skip-ws-backward) 
(c-beginning-of-macro))
!                              (point)))))
!               ;; Are we about to move backwards into a literal?
!               (when (memq (cdr res) '(macro-boundary literal))
!                 (setq range (c-ascertain-preceding-literal)))
!               not-bos))
!         (setq last (point)))
! 
!       (if (/= count 0) (setq count (1- count))))
!       (c-keep-region-active))))
  
  (defun c-end-of-statement (&optional count lim sentence-flag)
    "Go to the end of the innermost C statement.
***************
*** 1708,1715 ****
  sentence motion in or near comments and multiline strings."
    (interactive (list (prefix-numeric-value current-prefix-arg)
                     nil t))
!   (c-beginning-of-statement (- (or count 1)) lim sentence-flag)
!   (c-keep-region-active))
  
  
  ;; set up electric character functions to work with pending-del,
--- 2348,2424 ----
  sentence motion in or near comments and multiline strings."
    (interactive (list (prefix-numeric-value current-prefix-arg)
                     nil t))
!   (setq count (or count 1))
!   (if (< count 0) (c-beginning-of-statement (- count) lim sentence-flag)
! 
!     (c-save-buffer-state
!       (here ; start point for going forward ONE statement.  Updated each 
statement.
!        (macro-fence
!         (save-excursion
!           (and (not (eobp)) (c-beginning-of-macro)
!                (progn (c-end-of-macro) (point)))))
!        res
!        (range (c-collect-line-comments (c-literal-limits lim)))) ; 
(start.end) of current literal or NIL
! 
!       ;; Go back/forward one statement at each iteration of the following 
loop.
!       (while (and (/= count 0)
!                 (or (not lim) (< (point) lim)))
!       (setq here (point))             ; ONLY HERE is HERE updated
! 
!       ;; Go forward one "chunk" each time round the following loop, stopping
!       ;; when we reach a statement boundary, etc.
!       (while
!           (cond    ; Each arm of this cond returns NIL on reaching a desired
!                    ; statement boundary, non-NIL otherwise.
!            ((eobp)
!             (setq count 0)
!             nil)
! 
!            (range                     ; point is within a literal.
!             (cond
!              ;; sentence-flag is null => skip the entire literal.
!              ;; or a Single line string.
!              ((or (null sentence-flag)
!                   (c-one-line-string-p range))
!               (goto-char (cdr range))
!               (setq range (c-ascertain-following-literal))
!               ;; Is there a virtual semicolon here (e.g. for AWK)?
!               (not (c-at-vsemi-p)))
! 
!              ;; Comment or multi-line string.
!              (t (when (setq res ; gets non-nil when we go out of the literal
!                             (if (eq (c-literal-type range) 'string)
!                                 (c-end-of-sentence-in-string range)
!                               (c-end-of-sentence-in-comment range)))
!                   (setq range (c-ascertain-following-literal)))
!                 ;; If we've just come forward out of a literal, check for
!                 ;; vsemi.  (N.B. AWK can't have a vsemi after a comment, but
!                 ;; some other language may do in the future)
!                 (and res
!                      (not (c-at-vsemi-p))))))
! 
!            ;; Non-literal code.
!            (t (setq res (c-forward-over-illiterals macro-fence
!                                                    (> (point) here)))
!               ;; Are we about to move forward into or out of a
!               ;; preprocessor command?
!               (when (eq (cdr res) 'macro-boundary)
!                 (save-excursion
!                   (end-of-line)
!                   (setq macro-fence
!                         (and (not (eobp))
!                              (progn (c-skip-ws-forward)
!                                     (c-beginning-of-macro))
!                              (progn (c-end-of-macro)
!                                     (point))))))
!               ;; Are we about to move forward into a literal?
!               (when (memq (cdr res) '(macro-boundary literal))
!                 (setq range (c-ascertain-following-literal)))
!               (car res))))
! 
!       (if (/= count 0) (setq count (1- count))))
!       (c-keep-region-active))))
!                              
  
  
  ;; set up electric character functions to work with pending-del,
***************
*** 1737,1742 ****
--- 2446,2452 ----
  
  
  (defun c-calc-comment-indent (entry)
+   ;; This function might do hidden buffer changes.
    (if (symbolp entry)
        (setq entry (or (assq entry c-indent-comment-alist)
                      (assq 'other c-indent-comment-alist)
***************
*** 1760,1766 ****
                   (let ((lim (c-literal-limits (c-point 'bol) t)))
                     (when (consp lim)
                       (goto-char (car lim))
!                      (when (looking-at "/[/*]")
                         ;; Found comment to align with.
                         (if (bolp)
                             ;; Do not pad with one space if we're at bol.
--- 2470,2476 ----
                   (let ((lim (c-literal-limits (c-point 'bol) t)))
                     (when (consp lim)
                       (goto-char (car lim))
!                      (when (looking-at "/[/*]") ; FIXME!!!  Adapt for AWK! 
(ACM, 2005/11/18)
                         ;; Found comment to align with.
                         (if (bolp)
                             ;; Do not pad with one space if we're at bol.
***************
*** 1835,1849 ****
  A prefix argument acts as a repeat count.  With a negative argument,
  move forward to the end of the containing preprocessor conditional.
  
! `#elif' is treated like `#else' followed by `#if', so the function
! stops at them when going backward, but not when going forward."
    (interactive "p")
    (c-forward-conditional (- count) -1)
    (c-keep-region-active))
    
  (defun c-up-conditional-with-else (count)
!   "Move back to the containing preprocessor conditional, including `#else'.
! Just like `c-up-conditional', except it also stops at `#else'
  directives."
    (interactive "p")
    (c-forward-conditional (- count) -1 t)
--- 2545,2560 ----
  A prefix argument acts as a repeat count.  With a negative argument,
  move forward to the end of the containing preprocessor conditional.
  
! \"#elif\" is treated like \"#else\" followed by \"#if\", so the
! function stops at them when going backward, but not when going
! forward."
    (interactive "p")
    (c-forward-conditional (- count) -1)
    (c-keep-region-active))
    
  (defun c-up-conditional-with-else (count)
!   "Move back to the containing preprocessor conditional, including \"#else\".
! Just like `c-up-conditional', except it also stops at \"#else\"
  directives."
    (interactive "p")
    (c-forward-conditional (- count) -1 t)
***************
*** 1854,1868 ****
  A prefix argument acts as a repeat count.  With a negative argument,
  move backward into the previous preprocessor conditional.
  
! `#elif' is treated like `#else' followed by `#if', so the function
! stops at them when going forward, but not when going backward."
    (interactive "p")
    (c-forward-conditional count 1)
    (c-keep-region-active))
  
  (defun c-down-conditional-with-else (count)
!   "Move forward into the next preprocessor conditional, including `#else'.
! Just like `c-down-conditional', except it also stops at `#else'
  directives."
    (interactive "p")
    (c-forward-conditional count 1 t)
--- 2565,2580 ----
  A prefix argument acts as a repeat count.  With a negative argument,
  move backward into the previous preprocessor conditional.
  
! \"#elif\" is treated like \"#else\" followed by \"#if\", so the
! function stops at them when going forward, but not when going
! backward."
    (interactive "p")
    (c-forward-conditional count 1)
    (c-keep-region-active))
  
  (defun c-down-conditional-with-else (count)
!   "Move forward into the next preprocessor conditional, including \"#else\".
! Just like `c-down-conditional', except it also stops at \"#else\"
  directives."
    (interactive "p")
    (c-forward-conditional count 1 t)
***************
*** 1881,1896 ****
  A prefix argument acts as a repeat count.  With a negative argument,
  move backward across a preprocessor conditional.
  
! `#elif' is treated like `#else' followed by `#if', except that the
! nesting level isn't changed when tracking subconditionals.
  
  The optional argument TARGET-DEPTH specifies the wanted nesting depth
  after each scan.  I.e. if TARGET-DEPTH is -1, the function will move
  out of the enclosing conditional.  A non-integer non-nil TARGET-DEPTH
  counts as -1.
  
! If the optional argument WITH-ELSE is non-nil, `#else' directives are
! treated as conditional clause limits.  Normally they are ignored."
    (interactive "p")
    (let* ((forward (> count 0))
         (increment (if forward -1 1))
--- 2593,2608 ----
  A prefix argument acts as a repeat count.  With a negative argument,
  move backward across a preprocessor conditional.
  
! \"#elif\" is treated like \"#else\" followed by \"#if\", except that
! the nesting level isn't changed when tracking subconditionals.
  
  The optional argument TARGET-DEPTH specifies the wanted nesting depth
  after each scan.  I.e. if TARGET-DEPTH is -1, the function will move
  out of the enclosing conditional.  A non-integer non-nil TARGET-DEPTH
  counts as -1.
  
! If the optional argument WITH-ELSE is non-nil, \"#else\" directives
! are treated as conditional clause limits.  Normally they are ignored."
    (interactive "p")
    (let* ((forward (> count 0))
         (increment (if forward -1 1))
***************
*** 1996,2010 ****
    just inserts a tab character, or the equivalent number of spaces,
    depending on the variable `indent-tabs-mode'."
  
!   (interactive "p")
    (let ((indent-function
         (if c-syntactic-indentation
             (symbol-function 'indent-according-to-mode)
           (lambda ()
             (let ((c-macro-start c-macro-start)
!                  (steps (cond ((not current-prefix-arg) 1)
!                               ((equal current-prefix-arg '(4)) -1)
!                               (t arg))))
               (c-shift-line-indentation (* steps c-basic-offset))
               (when (and c-auto-align-backslashes
                          (save-excursion
--- 2708,2722 ----
    just inserts a tab character, or the equivalent number of spaces,
    depending on the variable `indent-tabs-mode'."
  
!   (interactive "P")
    (let ((indent-function
         (if c-syntactic-indentation
             (symbol-function 'indent-according-to-mode)
           (lambda ()
             (let ((c-macro-start c-macro-start)
!                  (steps (if (equal arg '(4))
!                             -1
!                           (prefix-numeric-value arg))))
               (c-shift-line-indentation (* steps c-basic-offset))
               (when (and c-auto-align-backslashes
                          (save-excursion
***************
*** 2014,2020 ****
                 ;; Realign the line continuation backslash if inside a macro.
                 (c-backslash-region (point) (point) nil t)))
             ))))
!     (if (and c-syntactic-indentation current-prefix-arg)
        ;; If c-syntactic-indentation and got arg, always indent this
        ;; line as C and shift remaining lines of expression the same
        ;; amount.
--- 2726,2732 ----
                 ;; Realign the line continuation backslash if inside a macro.
                 (c-backslash-region (point) (point) nil t)))
             ))))
!     (if (and c-syntactic-indentation arg)
        ;; If c-syntactic-indentation and got arg, always indent this
        ;; line as C and shift remaining lines of expression the same
        ;; amount.
***************
*** 2029,2035 ****
                             shift-amt))
          (save-excursion
            (if (eq c-tab-always-indent t)
!               (beginning-of-line))
            (setq beg (point))
            (c-forward-sexp 1)
            (setq end (point))
--- 2741,2747 ----
                             shift-amt))
          (save-excursion
            (if (eq c-tab-always-indent t)
!               (beginning-of-line))    ; FIXME!!! What is this here for?  ACM 
2005/10/31
            (setq beg (point))
            (c-forward-sexp 1)
            (setq end (point))
***************
*** 2040,2046 ****
              (indent-code-rigidly beg end shift-amt "#")))
        ;; Else use c-tab-always-indent to determine behavior.
        (cond
!        ;; CASE 1: indent when at column zero or in lines indentation,
         ;; otherwise insert a tab
         ((not c-tab-always-indent)
        (if (save-excursion
--- 2752,2758 ----
              (indent-code-rigidly beg end shift-amt "#")))
        ;; Else use c-tab-always-indent to determine behavior.
        (cond
!        ;; CASE 1: indent when at column zero or in line's indentation,
         ;; otherwise insert a tab
         ((not c-tab-always-indent)
        (if (save-excursion
***************
*** 2054,2060 ****
         ;; CASE 3: if in a literal, insert a tab, but always indent the
         ;; line
         (t
!       (if (c-in-literal)
            (funcall c-insert-tab-function))
        (funcall indent-function)
        )))))
--- 2766,2772 ----
         ;; CASE 3: if in a literal, insert a tab, but always indent the
         ;; line
         (t
!       (if (c-save-buffer-state () (c-in-literal))
            (funcall c-insert-tab-function))
        (funcall indent-function)
        )))))
***************
*** 2135,2141 ****
                    ;; shut up any echo msgs on indiv lines
                    (c-echo-syntactic-information-p nil)
                    (in-macro (and c-auto-align-backslashes
!                                  (save-excursion (c-beginning-of-macro))
                                   start))
                    (c-fix-backslashes nil)
                    syntax)
--- 2847,2854 ----
                    ;; shut up any echo msgs on indiv lines
                    (c-echo-syntactic-information-p nil)
                    (in-macro (and c-auto-align-backslashes
!                                  (c-save-buffer-state ()
!                                    (save-excursion (c-beginning-of-macro)))
                                   start))
                    (c-fix-backslashes nil)
                    syntax)
***************
*** 2181,2188 ****
  (defun c-fn-region-is-active-p ()
    ;; Function version of the macro for use in places that aren't
    ;; compiled, e.g. in the menus.
-   ;;
-   ;; This function does not do any hidden buffer changes.
    (c-region-is-active-p))
  
  (defun c-indent-line-or-region ()
--- 2894,2899 ----
***************
*** 2199,2205 ****
  (defvar c-progress-info nil)
  
  (defun c-progress-init (start end context)
-   ;; This function does not do any hidden buffer changes.
    (cond
     ;; Be silent
     ((not c-progress-interval))
--- 2910,2915 ----
***************
*** 2221,2227 ****
     ))
  
  (defun c-progress-update ()
-   ;; This function does not do any hidden buffer changes.
    (if (not (and c-progress-info c-progress-interval))
        nil
      (let ((now (nth 1 (current-time)))
--- 2931,2936 ----
***************
*** 2238,2244 ****
        )))
  
  (defun c-progress-fini (context)
-   ;; This function does not do any hidden buffer changes.
    (if (not c-progress-interval)
        nil
      (if (or (eq context (aref c-progress-info 3))
--- 2947,2952 ----
***************
*** 2399,2405 ****
        (set-marker point-pos nil))))
  
  (defun c-append-backslashes-forward (to-mark column point-pos)
-   ;; This function does not do any hidden buffer changes.
    (let ((state (parse-partial-sexp (c-point 'bol) (point))))
      (if column
        (while
--- 3107,3112 ----
***************
*** 2473,2479 ****
           (bolp))))))                  ; forward-line has funny behavior at 
eob.
  
  (defun c-delete-backslashes-forward (to-mark point-pos)
-   ;; This function does not do any hidden buffer changes.
    (while
        (and (<= (point) to-mark)
           (progn
--- 3180,3185 ----
***************
*** 2518,2523 ****
--- 3224,3231 ----
    ;; comment.  Return a cons of the prefix string and the column where
    ;; it ends.  If fill-prefix is set, it'll override.  Note that this
    ;; function also uses the value of point in some heuristics.
+   ;;
+   ;; This function might do hidden buffer changes.
  
    (let* ((here (point))
         (prefix-regexp (concat "[ \t]*\\("
***************
*** 2877,2883 ****
    ;; If APPLY-OUTSIDE-LITERAL is nil then the function will be called
    ;; only if the point turns out to be inside a comment or a string.
    ;;
!   ;; This function does not do any hidden buffer changes.
  
    (let (fill
        ;; beg and end limits the region to narrow.  end is a marker.
--- 3585,3591 ----
    ;; If APPLY-OUTSIDE-LITERAL is nil then the function will be called
    ;; only if the point turns out to be inside a comment or a string.
    ;;
!   ;; Note that this function does not do any hidden buffer changes.
  
    (let (fill
        ;; beg and end limits the region to narrow.  end is a marker.
***************
*** 2892,2897 ****
--- 3600,3609 ----
        ;; hanging.  In that case it's set to the number of spaces
        ;; that should be between the text and the ender.
        hang-ender-stuck
+       ;; auto-fill-spaces is the exact sequence of whitespace between a
+       ;; comment's last word and the comment ender, temporarily replaced
+       ;; with 'x's before calling FUN when FILL-PARAGRAPH is nil.  
+       auto-fill-spaces
        (here (point))
        (c-lit-limits c-lit-limits)
        (c-lit-type c-lit-type))
***************
*** 2902,2930 ****
      (if (and buffer-undo-list (not (eq buffer-undo-list t)))
        (setq buffer-undo-list (cons (point) buffer-undo-list)))
  
!     (save-restriction
!       ;; Widen to catch comment limits correctly.
!       (widen)
!       (unless c-lit-limits
!       (setq c-lit-limits (c-literal-limits nil fill-paragraph)))
!       (setq c-lit-limits (c-collect-line-comments c-lit-limits))
!       (unless c-lit-type
!       (setq c-lit-type (c-literal-type c-lit-limits))))
  
!     (save-excursion
!       (unless (c-safe (backward-char)
!                     (forward-paragraph)
!                     (>= (point) here))
!       (goto-char here)
!       (forward-paragraph))
!       (setq end (point-marker)))
!     (save-excursion
!       (unless (c-safe (forward-char)
!                     (backward-paragraph)
!                     (<= (point) here))
!       (goto-char here)
!       (backward-paragraph))
!       (setq beg (point)))
  
      (unwind-protect
        (progn
--- 3614,3643 ----
      (if (and buffer-undo-list (not (eq buffer-undo-list t)))
        (setq buffer-undo-list (cons (point) buffer-undo-list)))
  
!     (c-save-buffer-state ()
!       (save-restriction
!       ;; Widen to catch comment limits correctly.
!       (widen)
!       (unless c-lit-limits
!         (setq c-lit-limits (c-literal-limits nil fill-paragraph)))
!       (setq c-lit-limits (c-collect-line-comments c-lit-limits))
!       (unless c-lit-type
!         (setq c-lit-type (c-literal-type c-lit-limits))))
  
!       (save-excursion
!       (unless (c-safe (backward-char)
!                       (forward-paragraph)
!                       (>= (point) here))
!         (goto-char here)
!         (forward-paragraph))
!       (setq end (point-marker)))
!       (save-excursion
!       (unless (c-safe (forward-char)
!                       (backward-paragraph)
!                       (<= (point) here))
!         (goto-char here)
!         (backward-paragraph))
!       (setq beg (point))))
  
      (unwind-protect
        (progn
***************
*** 2965,3037 ****
                             ;; own.  Keep it that way.
                             (set-marker end (point))))
  
!               (if fill-paragraph
!                   ;; The comment ender should hang.  Replace all
!                   ;; cruft between it and the last word with one or
!                   ;; two 'x' and include it in the region.  We'll
!                   ;; change them back to spaces afterwards.  This
!                   ;; isn't done when auto filling, since that'd
!                   ;; effectively make it impossible to insert extra
!                   ;; spaces before the comment ender.
!                   (let* ((ender-start (save-excursion
!                                         (goto-char (cdr c-lit-limits))
!                                         (skip-syntax-backward "^w ")
!                                         (point)))
!                          (point-rel (- ender-start here))
!                          spaces)
  
!                     (save-excursion
!                       (goto-char (cdr c-lit-limits))
!                       (setq tmp-post (point-marker))
!                       (insert ?\n)
!                       (set-marker end (point))
!                       (forward-line -1)
!                       (if (and (looking-at (concat "[ \t]*\\(\\("
!                                                    c-current-comment-prefix
!                                                    "\\)[ \t]*\\)"))
!                                (eq ender-start (match-end 0)))
!                           ;; The comment ender is prefixed by nothing
!                           ;; but a comment line prefix.  Remove it
!                           ;; along with surrounding ws.
!                           (setq spaces (- (match-end 1) (match-end 2)))
!                         (goto-char ender-start))
!                       (skip-chars-backward " \t\r\n")
  
!                       (if (/= (point) ender-start)
!                           (progn
!                             (if (<= here (point))
!                                 ;; Don't adjust point below if it's
!                                 ;; before the string we replace.
!                                 (setq point-rel -1))
!                             ;; Keep one or two spaces between the
!                             ;; text and the ender, depending on how
!                             ;; many there are now.
!                             (unless spaces
!                               (setq spaces (- ender-start (point))))
                              (setq spaces
                                    (max
                                     (min spaces
                                          (if sentence-end-double-space 2 1))
!                                    1))
!                             ;; Insert the filler first to keep marks right.
!                             (insert-char ?x spaces t)
!                             (delete-region (point) (+ ender-start spaces))
!                             (setq hang-ender-stuck spaces)
!                             (setq point-rel
!                                   (and (>= point-rel 0)
!                                        (- (point) (min point-rel spaces)))))
!                         (setq point-rel nil)))
! 
!                     (if point-rel
!                         ;; Point was in the middle of the string we
!                         ;; replaced above, so put it back in the same
!                         ;; relative position, counting from the end.
!                         (goto-char point-rel)))
! 
!                 ;; We're doing auto filling.  Just move the marker
!                 ;; to the comment end to ignore any code after the
!                 ;; comment.
!                 (move-marker end (cdr c-lit-limits)))))
  
            (when (<= beg (car c-lit-limits))
              ;; The region includes the comment starter.
--- 3678,3753 ----
                             ;; own.  Keep it that way.
                             (set-marker end (point))))
  
!               ;; The comment ender should hang.  Replace all space between
!               ;; it and the last word either by one or two 'x's (when
!               ;; FILL-PARAGRAPH is non-nil), or a row of x's the same width
!               ;; as the whitespace (when auto filling), and include it in
!               ;; the region.  We'll change them back to whitespace
!               ;; afterwards.  The effect of this is to glue the comment
!               ;; ender to the last word in the comment during filling.
!               (let* ((ender-start (save-excursion
!                                     (goto-char (cdr c-lit-limits))
!                                     (skip-syntax-backward "^w ")
!                                     (point)))
!                      (ender-column (save-excursion
!                                      (goto-char ender-start)
!                                      (current-column)))
!                      (point-rel (- ender-start here))
!                      spaces)
  
!                 (save-excursion
!                   (goto-char (cdr c-lit-limits))
!                   (setq tmp-post (point-marker))
!                   (insert ?\n)
!                   (set-marker end (point))
!                   (forward-line -1)   ; last line of the comment
!                   (if (and (looking-at (concat "[ \t]*\\(\\("
!                                                c-current-comment-prefix
!                                                "\\)[ \t]*\\)"))
!                            (eq ender-start (match-end 0)))
!                       ;; The comment ender is prefixed by nothing
!                       ;; but a comment line prefix.  Remove it
!                       ;; along with surrounding ws.
!                       (setq spaces (- (match-end 1) (match-end 2)))
!                     (goto-char ender-start))
!                   (skip-chars-backward " \t\r\n") ; Surely this can be
!                                       ; " \t"? "*/" is NOT alone on the line 
(ACM, 2005/8/18)
  
!                   (if (/= (point) ender-start)
!                       (progn
!                         (if (<= here (point))
!                             ;; Don't adjust point below if it's
!                             ;; before the string we replace.
!                             (setq point-rel -1))
!                         ;; Keep one or two spaces between the
!                         ;; text and the ender, depending on how
!                         ;; many there are now.
!                         (unless spaces
!                           (setq spaces (- ender-column (current-column))))
!                         (setq auto-fill-spaces (c-delete-and-extract-region
!                                                 (point) ender-start))
!                         ;; paragraph filling condenses multiple spaces to
!                         ;; single or double spaces.  auto-fill doesn't.
!                         (if fill-paragraph
                              (setq spaces
                                    (max
                                     (min spaces
                                          (if sentence-end-double-space 2 1))
!                                    1)))
!                         ;; Insert the filler first to keep marks right.
!                         (insert-char ?x spaces t)
!                         (setq hang-ender-stuck spaces)
!                         (setq point-rel
!                               (and (>= point-rel 0)
!                                    (- (point) (min point-rel spaces)))))
!                     (setq point-rel nil)))
! 
!                 (if point-rel
!                     ;; Point was in the middle of the string we
!                     ;; replaced above, so put it back in the same
!                     ;; relative position, counting from the end.
!                     (goto-char point-rel)))
!               ))
  
            (when (<= beg (car c-lit-limits))
              ;; The region includes the comment starter.
***************
*** 3068,3081 ****
            ;; inside macros is bogus to begin with since the line
            ;; continuation backslashes aren't handled).
            (save-excursion
!             (c-beginning-of-macro)
!             (beginning-of-line)
!             (if (> (point) beg)
!                 (setq beg (point)))
!             (c-end-of-macro)
!             (forward-line)
!             (if (< (point) end)
!                 (set-marker end (point)))))
  
           (t                           ; Other code.
            ;; Try to avoid comments and macros in the paragraph to
--- 3784,3798 ----
            ;; inside macros is bogus to begin with since the line
            ;; continuation backslashes aren't handled).
            (save-excursion
!             (c-save-buffer-state ()
!               (c-beginning-of-macro)
!               (beginning-of-line)
!               (if (> (point) beg)
!                   (setq beg (point)))
!               (c-end-of-macro)
!               (forward-line)
!               (if (< (point) end)
!                   (set-marker end (point))))))
  
           (t                           ; Other code.
            ;; Try to avoid comments and macros in the paragraph to
***************
*** 3192,3198 ****
          (goto-char tmp-post)
          (skip-syntax-backward "^w ")
          (forward-char (- hang-ender-stuck))
!         (insert-char ?\  hang-ender-stuck t)
          (delete-char hang-ender-stuck)
          (goto-char here))
        (set-marker tmp-post nil))
--- 3909,3918 ----
          (goto-char tmp-post)
          (skip-syntax-backward "^w ")
          (forward-char (- hang-ender-stuck))
!         (if (or fill-paragraph (not auto-fill-spaces))
!             (insert-char ?\  hang-ender-stuck t)
!           (insert auto-fill-spaces)
!           (setq here (- here (- hang-ender-stuck (length auto-fill-spaces)))))
          (delete-char hang-ender-stuck)
          (goto-char here))
        (set-marker tmp-post nil))
***************
*** 3233,3240 ****
  (defun c-do-auto-fill ()
    ;; Do automatic filling if not inside a context where it should be
    ;; ignored.
-   ;;
-   ;; This function does not do any hidden buffer changes.
    (let ((c-auto-fill-prefix
         ;; The decision whether the line should be broken is actually
         ;; done in c-indent-new-comment-line, which do-auto-fill
--- 3953,3958 ----
***************
*** 3274,3304 ****
        (c-lit-limits c-lit-limits)
        (c-lit-type c-lit-type)
        (c-macro-start c-macro-start))
!     (when (not (eq c-auto-fill-prefix t))
!       ;; Called from do-auto-fill.
!       (unless c-lit-limits
!       (setq c-lit-limits (c-literal-limits nil nil t)))
!       (unless c-lit-type
!       (setq c-lit-type (c-literal-type c-lit-limits)))
!       (if (memq (cond ((c-query-and-set-macro-start) 'cpp)
!                     ((null c-lit-type) 'code)
!                     (t c-lit-type))
!               c-ignore-auto-fill)
!         (setq fill-prefix t)          ; Used as flag in the cond.
!       (if (and (null c-auto-fill-prefix)
!                (eq c-lit-type 'c)
!                (<= (c-point 'bol) (car c-lit-limits)))
!           ;; The adaptive fill function has generated a prefix, but
!           ;; we're on the first line in a block comment so it'll be
!           ;; wrong.  Ignore it to guess a better one below.
!           (setq fill-prefix nil)
!         (when (and (eq c-lit-type 'c++)
!                    (not (string-match "\\`[ \t]*//" (or fill-prefix ""))))
!           ;; Kludge: If the function that adapted the fill prefix
!           ;; doesn't produce the required comment starter for line
!           ;; comments, then we ignore it.
!           (setq fill-prefix nil)))
!       ))
      (cond ((eq fill-prefix t)
           ;; A call from do-auto-fill which should be ignored.
           )
--- 3992,4027 ----
        (c-lit-limits c-lit-limits)
        (c-lit-type c-lit-type)
        (c-macro-start c-macro-start))
! 
!     (c-save-buffer-state ()
!       (when (not (eq c-auto-fill-prefix t))
!       ;; Called from do-auto-fill.
!       (unless c-lit-limits
!         (setq c-lit-limits (c-literal-limits nil nil t)))
!       (unless c-lit-type
!         (setq c-lit-type (c-literal-type c-lit-limits)))
!       (if (memq (cond ((c-query-and-set-macro-start) 'cpp)
!                       ((null c-lit-type) 'code)
!                       (t c-lit-type))
!                 c-ignore-auto-fill)
!           (setq fill-prefix t)        ; Used as flag in the cond.
!         (if (and (null c-auto-fill-prefix)
!                  (eq c-lit-type 'c)
!                  (<= (c-point 'bol) (car c-lit-limits)))
!             ;; The adaptive fill function has generated a prefix, but
!             ;; we're on the first line in a block comment so it'll be
!             ;; wrong.  Ignore it to guess a better one below.
!             (setq fill-prefix nil)
!           (when (and (eq c-lit-type 'c++)
!                      (not (string-match (concat "\\`[ \t]*"
!                                                 c-line-comment-starter)
!                                         (or fill-prefix ""))))
!             ;; Kludge: If the function that adapted the fill prefix
!             ;; doesn't produce the required comment starter for line
!             ;; comments, then we ignore it.
!             (setq fill-prefix nil)))
!         )))
! 
      (cond ((eq fill-prefix t)
           ;; A call from do-auto-fill which should be ignored.
           )
***************
*** 3306,3312 ****
           ;; A fill-prefix overrides anything.
           (funcall do-line-break)
           (insert-and-inherit fill-prefix))
!         ((progn
             (unless c-lit-limits
               (setq c-lit-limits (c-literal-limits)))
             (unless c-lit-type
--- 4029,4035 ----
           ;; A fill-prefix overrides anything.
           (funcall do-line-break)
           (insert-and-inherit fill-prefix))
!         ((c-save-buffer-state ()
             (unless c-lit-limits
               (setq c-lit-limits (c-literal-limits)))
             (unless c-lit-type
***************
*** 3440,3470 ****
  comment prefix (see the `c-comment-prefix-regexp' and
  `c-block-comment-prefix' variables for details).  The end of a
  C++-style line comment doesn't count as inside it."
    (interactive "*")
!   (let* ((c-lit-limits (c-literal-limits nil nil t))
!        (c-lit-type (c-literal-type c-lit-limits))
         (c-macro-start c-macro-start))
!     (if (or (eq c-lit-type 'c)
!           (and (eq c-lit-type 'c++)
!                (< (save-excursion
!                     (skip-chars-forward " \t")
!                     (point))
!                   (1- (cdr (setq c-lit-limits
!                                  (c-collect-line-comments c-lit-limits))))))
!           (and (or (not (looking-at "\\s *$"))
!                    (eq (char-before) ?\\))
!                (c-query-and-set-macro-start)
!                (<= (save-excursion
!                      (goto-char c-macro-start)
!                      (if (looking-at c-opt-cpp-start)
!                          (goto-char (match-end 0)))
!                      (point))
!                   (point))))
        (let ((comment-multi-line t)
              (fill-prefix nil))
          (c-indent-new-comment-line nil t))
        (delete-horizontal-space)
        (newline)
        ;; c-indent-line may look at the current indentation, so let's
        ;; start out with the same indentation as the previous line.
        (let ((col (save-excursion
--- 4163,4200 ----
  comment prefix (see the `c-comment-prefix-regexp' and
  `c-block-comment-prefix' variables for details).  The end of a
  C++-style line comment doesn't count as inside it."
+ 
    (interactive "*")
!   (let* (c-lit-limits c-lit-type
         (c-macro-start c-macro-start))
! 
!     (if (c-save-buffer-state ()
!         (setq c-lit-limits (c-literal-limits nil nil t)
!               c-lit-type (c-literal-type c-lit-limits))
!         (or (eq c-lit-type 'c)
!             (and (eq c-lit-type 'c++)
!                  (< (save-excursion
!                       (skip-chars-forward " \t")
!                       (point))
!                     (1- (cdr (setq c-lit-limits (c-collect-line-comments
!                                                  c-lit-limits))))))
!             (and (or (not (looking-at "\\s *$"))
!                      (eq (char-before) ?\\))
!                  (c-query-and-set-macro-start)
!                  (<= (save-excursion
!                        (goto-char c-macro-start)
!                        (if (looking-at c-opt-cpp-start)
!                            (goto-char (match-end 0)))
!                        (point))
!                      (point)))))
! 
        (let ((comment-multi-line t)
              (fill-prefix nil))
          (c-indent-new-comment-line nil t))
+ 
        (delete-horizontal-space)
        (newline)
+ 
        ;; c-indent-line may look at the current indentation, so let's
        ;; start out with the same indentation as the previous line.
        (let ((col (save-excursion
***************
*** 3473,3478 ****
--- 4203,4209 ----
                               (= (forward-line -1) 0)))
                   (current-indentation))))
        (indent-to col))
+ 
        (indent-according-to-mode))))
  
  (defun c-context-open-line ()




reply via email to

[Prev in Thread] Current Thread [Next in Thread]