X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/68dff3ca9ce655658060e3b2da2936c67effb79d..5988691b0425d1952aa32734ee4eb0fb8341faf9:/lisp/progmodes/cmacexp.el diff --git a/lisp/progmodes/cmacexp.el b/lisp/progmodes/cmacexp.el index 0a77340418..27fe81e451 100644 --- a/lisp/progmodes/cmacexp.el +++ b/lisp/progmodes/cmacexp.el @@ -1,9 +1,8 @@ ;;; cmacexp.el --- expand C macros in a region -;; Copyright (C) 1992, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1994, 1996, 2000 Free Software Foundation, Inc. -;; Author: Francesco Potorti` -;; Version: $Id: cmacexp.el,v 1.21 1996/01/14 07:34:30 erik Exp rms $ +;; Author: Francesco Potorti` ;; Adapted-By: ESR ;; Keywords: c @@ -24,6 +23,8 @@ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. +;;; Commentary: + ;; USAGE ============================================================= ;; In C mode C-C C-e is bound to c-macro-expand. The result of the @@ -46,7 +47,7 @@ ;; Put the following in your ~/.emacs file. ;; If you want the *Macroexpansion* window to be not higher than -;; necessary: +;; necessary: ;;(setq c-macro-shrink-window-flag t) ;; ;; If you use a preprocessor other than /lib/cpp (be careful to set a @@ -63,7 +64,7 @@ ;; BUG REPORTS ======================================================= ;; Please report bugs, suggestions, complaints and so on to -;; pot@cnuce.cnr.it (Francesco Potorti`). +;; pot@gnu.org (Francesco Potorti`). ;; IMPROVEMENTS OVER emacs 18.xx cmacexp.el ========================== @@ -85,30 +86,54 @@ ;; If the start point of the region is inside a macro definition the ;; macro expansion is often inaccurate. +;;; Code: (require 'cc-mode) (provide 'cmacexp) -(defvar c-macro-shrink-window-flag nil - "*Non-nil means shrink the *Macroexpansion* window to fit its contents.") - -(defvar c-macro-prompt-flag nil - "*Non-nil makes `c-macro-expand' prompt for preprocessor arguments.") - -(defvar c-macro-preprocessor - ;; Cannot rely on standard directory on MS-DOS to find CPP. - (if (eq system-type 'ms-dos) "cpp -C" "/lib/cpp -C") +(defgroup c-macro nil + "Expand C macros in a region." + :group 'c) + + +(defcustom c-macro-shrink-window-flag nil + "*Non-nil means shrink the *Macroexpansion* window to fit its contents." + :type 'boolean + :group 'c-macro) + +(defcustom c-macro-prompt-flag nil + "*Non-nil makes `c-macro-expand' prompt for preprocessor arguments." + :type 'boolean + :group 'c-macro) + +(defcustom c-macro-preprocessor + ;; Cannot rely on standard directory on MS-DOS to find CPP. In + ;; fact, cannot rely on having cpp.exe, either, in latest GCC + ;; versions. + (cond ((eq system-type 'ms-dos) "gcc -E -C -o - -") + ;; Solaris has it in an unusual place. + ((and (string-match "^[^-]*-[^-]*-\\(solaris\\|sunos5\\)" + system-configuration) + (file-exists-p "/opt/SUNWspro/SC3.0.1/bin/acomp")) + "/opt/SUNWspro/SC3.0.1/bin/acomp -C -E") + ((file-exists-p "/usr/ccs/lib/cpp") "/usr/ccs/lib/cpp -C") + (t "/lib/cpp -C")) "The preprocessor used by the cmacexp package. If you change this, be sure to preserve the `-C' (don't strip comments) -option, or to set an equivalent one.") +option, or to set an equivalent one." + :type 'string + :group 'c-macro) -(defvar c-macro-cppflags "" - "*Preprocessor flags used by `c-macro-expand'.") +(defcustom c-macro-cppflags "" + "*Preprocessor flags used by `c-macro-expand'." + :type 'string + :group 'c-macro) (defconst c-macro-buffer-name "*Macroexpansion*") +;;;###autoload (defun c-macro-expand (start end subst) "Expand C macros in the region, using the C preprocessor. Normally display output in temp buffer, but @@ -186,7 +211,7 @@ For use inside Lisp programs, see also `c-macro-expansion'." (let ((oldwinheight (window-height)) (alreadythere ;the window was already there (get-buffer-window (current-buffer))) - (popped nil)) ;the window popped changing the layout + (popped nil)) ;the window popped changing the layout (or alreadythere (progn (display-buffer (current-buffer) t) @@ -202,7 +227,7 @@ For use inside Lisp programs, see also `c-macro-expansion'." (setq minheight (if alreadythere (window-height) window-min-height)) - (setq maxheight (/ (screen-height) 2)) + (setq maxheight (/ (frame-height) 2)) (enlarge-window (- (min maxheight (max minheight (+ 2 (vertical-motion (point-max))))) @@ -228,7 +253,7 @@ Optional arg DISPLAY non-nil means show messages in the echo area." ;; Preprocess the buffer contents, then look for all the lines stored ;; in linelist starting from end of buffer. The last line so found is ;; where START was, so return the substring from point to end of -;; buffer. +;; buffer. (let ((inbuf (current-buffer)) (outbuf (get-buffer-create " *C Macro Expansion*")) (filename (if (and buffer-file-name @@ -240,28 +265,31 @@ Optional arg DISPLAY non-nil means show messages in the echo area." c-macro-preprocessor (if (string= "" c-macro-cppflags) "" " ") c-macro-cppflags)) - (uniquestring "???!!!???!!! start of c-macro expansion ???!!!???!!!") + (uniquestring "??? !!! ??? start of c-macro expansion ??? !!! ???") (startlinenum 0) (linenum 0) (startstat ()) (startmarker "") (exit-status 0) - (tempname (make-temp-name (or (getenv "TMPDIR") (getenv "TEMP") - (getenv "TMP") "/tmp/")))) + (tempname (make-temp-file + (expand-file-name "cmacexp" + (or small-temporary-file-directory + temporary-file-directory))))) (unwind-protect (save-excursion (save-restriction (widen) - (set-buffer outbuf) - (setq buffer-read-only nil) - (erase-buffer) - (set-syntax-table c-mode-syntax-table) + (let ((in-syntax-table (syntax-table))) + (set-buffer outbuf) + (setq buffer-read-only nil) + (erase-buffer) + (set-syntax-table in-syntax-table)) (insert-buffer-substring inbuf 1 end)) ;; We have copied inbuf to outbuf. Point is at end of - ;; outbuf. Insert a space at the end, so cpp can correctly - ;; parse a token ending at END. - (insert " ") + ;; outbuf. Inset a newline at the end, so cpp can correctly + ;; parse a token ending at END. + (insert "\n") ;; Save sexp status and line number at START. (setq startstat (parse-partial-sexp 1 start)) @@ -359,4 +387,5 @@ Optional arg DISPLAY non-nil means show messages in the echo area." ;; Cleanup. (kill-buffer outbuf)))) +;;; arch-tag: 4f20253c-71ef-4e6d-a774-19087060910e ;;; cmacexp.el ends here