]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/cc-cmds.el
(c-defun-name): Make it work for "struct foo bar [] = { ...".
[gnu-emacs] / lisp / progmodes / cc-cmds.el
index 86715acea14615df74192b46d6b0243ff0aa6da8..8e7df4c95a69db4ee683abfa6323efdff3c16a5c 100644 (file)
@@ -1704,17 +1704,16 @@ with a brace block."
 
        ;; Pick out the defun name, according to the type of defun.
        (cond
+         ;; struct, union, enum, or similar:
         ((and (looking-at c-type-prefix-key)
               (progn (c-forward-token-2 2) ; over "struct foo "
-                     (eq (char-after) ?\{)))
-         ;; struct, union, enum, or similar:
-         (c-backward-syntactic-ws)
-         (setq name-end (point))
-         (buffer-substring-no-properties
-          (progn
-            (c-backward-token-2 2)
-            (point))
-          name-end))
+                     (or (eq (char-after) ?\{)
+                         (looking-at c-symbol-key)))) ; "struct foo bar ..."
+         (save-match-data (c-forward-token-2))
+         (when (eq (char-after) ?\{)
+           (c-backward-token-2)
+           (looking-at c-symbol-key))
+         (match-string-no-properties 0))
 
         ((looking-at "DEFUN\\_>")
          ;; DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory, ...) ==> Ffile_name_directory
@@ -3096,9 +3095,10 @@ non-nil."
                    (c-parsing-error nil)
                    ;; shut up any echo msgs on indiv lines
                    (c-echo-syntactic-information-p nil)
-                   (macro-start
+                   (ml-macro-start     ; Start pos of multi-line macro.
                     (and (c-save-buffer-state ()
                            (save-excursion (c-beginning-of-macro)))
+                         (eq (char-before (c-point 'eol)) ?\\)
                          start))
                    (c-fix-backslashes nil)
                    syntax)
@@ -3113,24 +3113,28 @@ non-nil."
                        (c-progress-update)
                        ;; skip empty lines
                        (unless (or (looking-at "\\s *$")
-                                   (and macro-start (looking-at "\\s *\\\\$")))
+                                   (and ml-macro-start (looking-at "\\s *\\\\$")))
                          ;; Get syntax and indent.
                          (c-save-buffer-state nil
                            (setq syntax (c-guess-basic-syntax)))
                          (c-indent-line syntax t t))
 
-                       (if (assq 'cpp-macro syntax) ; New macro?
-                           (setq macro-start (point))
-                         (when (and macro-start ; End of old macro?
-                                    c-auto-align-backslashes
-                                    (not (eq (char-before (c-point 'eol)) ?\\)))
-                           ;; Fixup macro backslashes.
-                           (c-backslash-region macro-start (c-point 'bonl) nil)
-                           (setq macro-start nil)))
+                       (if ml-macro-start
+                           ;; End of current multi-line macro?
+                           (when (and c-auto-align-backslashes
+                                      (not (eq (char-before (c-point 'eol)) ?\\)))
+                             ;; Fixup macro backslashes.
+                             (c-backslash-region ml-macro-start (c-point 'bonl) nil)
+                             (setq ml-macro-start nil))
+                         ;; New multi-line macro?
+                         (if (and (assq 'cpp-macro syntax)
+                                  (eq (char-before (c-point 'eol)) ?\\))
+                           (setq ml-macro-start (point))))
+
                        (forward-line))
 
-                     (if (and macro-start c-auto-align-backslashes)
-                         (c-backslash-region macro-start (c-point 'bopl) nil t)))
+                     (if (and ml-macro-start c-auto-align-backslashes)
+                         (c-backslash-region ml-macro-start (c-point 'bopl) nil t)))
                  (set-marker endmark nil)
                  (c-progress-fini 'c-indent-region))
                (c-echo-parsing-error quiet))