changeset 6979:3086be8e7683

Provide cmacexp. (c-macro-prompt-p): Renamed from c-macro-always-prompt-p. (c-macro-cppflags): Var renamed from c-macro-default-cppflags. (c-macro-expand): Don't handle C-u C-u specially. Compute message here in var mymsg. Clear buffer-auto-save-file-name. (c-macro-display-buffer): Now takes no argument. Use point-max to get large number. (c-macro-default-message, c-macro-eval): Functions deleted. (c-macro-expansion): Use startinstring as the char to insert.
author Richard M. Stallman <rms@gnu.org>
date Wed, 20 Apr 1994 06:12:03 +0000
parents 8cc5f63e8907
children ef1b2bd0b19e
files lisp/progmodes/cmacexp.el
diffstat 1 files changed, 74 insertions(+), 175 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/cmacexp.el	Wed Apr 20 05:32:33 1994 +0000
+++ b/lisp/progmodes/cmacexp.el	Wed Apr 20 06:12:03 1994 +0000
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1992 Free Software Foundation, Inc.
 
 ;; Author: Francesco Potorti` <pot@cnuce.cnr.it>
-;; Version: $Id: cmacexp.el,v 1.9 1994/02/07 05:40:46 rms Exp rms $
+;; Version: $Id: cmacexp.el,v 1.10 1994/02/25 06:27:24 rms Exp rms $
 ;; Adapted-By: ESR
 ;; Keywords: c
 
@@ -23,35 +23,23 @@
 ;; along with GNU Emacs; see the file COPYING.  If not, write to
 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
-;;; Commentary:
+;; USAGE =============================================================
 
 ;; In C mode C-M-x is bound to c-macro-expand.  The result of the
-;; expansion is put in a separate buffer.  A user option
+;; expansion is put in a separate buffer.  The buffer is put in
+;; view-mode if the Inge Frick's view.el is installed.  A user option
 ;; allows the window displaying the buffer to be optimally sized.
 ;;
 ;; When called with a C-u prefix, c-macro-expand replaces the selected
-;; region with the expansion.  With two C-u's the user is offered to
-;; change the flags to the preprocessor (while the results of the
-;; expansion go to a separate buffer).  Preprocessor arguments default
-;; to the last ones entered.  Both the preprocessor name and the
-;; initial flag defaults can be set by the user.  Setting
-;; c-macro-always-prompt to a non-nil value allows one to be always
-;; prompted for the flags, regardless of the prefix used.
+;; region with the expansion.  Both the preprocessor name and the
+;; initial flag can be set by the user.  If c-macro-prompt-p
+;; is set to a non-nil value the user is offered to change the flags
+;; to the preprocessor each time c-macro-expand is invoked.
+;; Preprocessor arguments default to the last ones entered.
+;; If c-macro-prompt is nil, one must use M-x set-variable to set a
+;; different value for c-macro-cppflags.
 
 ;; A c-macro-expansion function is provided for non-interactive use.
-;; A still experimental function c-macro-eval is provided.  It aims at
-;; evaluating the contents of a region by using calc (by Dave
-;; Gillespie).  Select a region and type C-x C-e (if you followed the
-;; suggestions in the INSTALLATION section) or type M-x c-ma RET v
-;; RET.  If you have calc installed, the computed value of the
-;; expression will appear in the message area.  If you give an
-;; interactive C-u prefix the computed value will be shown in signed,
-;; unsigned, hex and boolean representations.  Two C-u's allow to
-;; change the preprocessor flags via prompt.  c-macro-eval works well
-;; for constant expressions, but see the BUG section.
-
-;; A patch to calc 2.02 has been written by Dave Gillespie.  It can
-;; be downloaded via anonymous ftp at fly.cnuce.cnr.it:pub/calc.diff.
 
 ;; INSTALLATION ======================================================
 
@@ -61,9 +49,11 @@
 ;; To make a directory ~/emacs be in front of your load-path:
 ;;(setq load-path (cons (expand-file-name "~/emacs") load-path))
 ;;
-;; Suggested keybindings (work only in c-mode):
-;;(define-key c-mode-map "\C-\M-x" 'c-macro-expand)
-;;(define-key c-mode-map "\C-x\C-e" 'c-macro-eval)
+;; Suggested keybinding (work only in c-mode):
+;;(if (boundp 'c-mode-map)
+;;  (define-key c-mode-map "\C-x\C-e" 'c-macro-expand))
+;;(if (boundp 'c++-mode-map)
+;;  (define-key c++-mode-map "\C-x\C-e" 'c-macro-expand))
 ;;
 ;; If you want the *Macroexpansion* window to be not higher than
 ;; necessary: 
@@ -74,18 +64,11 @@
 ;; strip the comments):
 ;;(setq c-macro-preprocessor "gpp -C")
 ;;
-;; If you often use a particular set of flags, and want them to be
-;; the default:
-;;(setq c-macro-default-cppflags "-I /usr/include/local -DDEBUG"
+;; If you often use a particular set of flags:
+;;(setq c-macro-cppflags "-I /usr/include/local -DDEBUG"
 ;;
-;; If you always want the "Preprocessor arguments: " prompt,
-;; regardless of the arguments provided:
-;;(setq c-macro-always-prompt-p t)
-;;
-;; If you want to experiment with the C constant expressions
-;; evaluation feature:
-;;(autoload 'c-macro-eval "cmacexp"
-;;  "C constant expressions evaluation.  Requires calc.  Experimental." t)
+;; If you want the "Preprocessor arguments: " prompt:
+;;(setq c-macro-prompt-p t)
 
 ;; BUG REPORTS =======================================================
 
@@ -108,31 +91,29 @@
 ;; ACKNOWLEDGEMENTS ==================================================
 
 ;; A lot of thanks to Don Maszle who did a great work of testing, bug
-;; reporting and suggestion of new features and to Dave Gillespie for
-;; his suggestions about calc.  This work has been partially inspired by
-;; Don Maszle and Jonathan Segal's.
+;; reporting and suggestion of new features and to Inge Fricks for her
+;; help with view.el.  This work has been partially inspired by Don
+;; Maszle and Jonathan Segal's.
+
+;; By the way, I recommend you Inge Frick's view.el.  It works like
+;; the standard view, but *it is not recursive* and has some more
+;; commands.  Moreover it is a minor mode, so you preserve all your
+;; major mode keybindings (well, not always :).  Mail me to obtain a
+;; copy, or get it by anonymous ftp in fly.cnuce.cnr.it:pub/view.el.
 
 ;; BUGS ==============================================================
 
-;; calc 2.02 does not handle the C operators "->", ".", "*" (as a
-;; prefix), the composite assignement operators "+=" etc.  It cannot
-;; handle the "," operator and will be confused by ";".  Almost all
-;; these can be defined as no-ops using the Calc's Syntax Tables
-;; feature.  The built-in calc functions will cause problems in
-;; certain circumstances.  c-macro-eval behaves correctly only on
-;; expressions not containing such operators.  Does not distinguish
-;; among integer and real division.
-
 ;; If the start point of the region is inside a macro definition the
 ;; macro expansion is often inaccurate.
 
-;;; Code:
+
+(provide 'cmacexp)
 
 (defvar c-macro-shrink-window-p nil
   "*Non-nil means shrink the *Macroexpansion* window to fit its contents.")
 
-(defvar c-macro-always-prompt-p nil
-  "*Non-nil means always prompt for preprocessor arguments.")
+(defvar c-macro-prompt-p nil
+  "*Non-nil makes c-macro-expand prompt for preprocessor arguments.")
 
 (defvar c-macro-preprocessor "/lib/cpp -C" "\
 The preprocessor used by the cmacexp package.
@@ -140,33 +121,37 @@
 If you change this, be sure to preserve the -C (don't strip comments)
 option, or to set an equivalent one.")
 
-(defvar c-macro-default-cppflags ""
-  "Default cpp flags used by c-macro-expand.")
+(defvar c-macro-cppflags ""
+  "*Preprocessor flags used by c-macro-expand.")
 
 (defconst c-macro-buffer-name "*Macroexpansion*")
 
-(defun c-macro-expand (start end &optional flag) "\
+(defun c-macro-expand (start end subst) "\
 Expand all C macros occurring in the region using c-macro-preprocessor.
 Normally display output in temp buffer.
 Prefix arg means replace the region with it.
-Prompt for a string of arguments to the preprocessor, (e.g.
--DDEBUG -I ./include) when prefixed with two C-u's.
+Prompt for a string of arguments to the preprocessor
+\(e.g. -DDEBUG -I ./include) if the user option c-macro-prompt-p is non-nil.
 
-It is intended for interactive use only.
-For non interactive use, see the c-macro-expansion function."
+Noninteractive args are START, END, SUBST.
+For use inside programs see also c-macro-expansion."
 
   (interactive "r\nP")
-  (let* ((subst (and flag (not (equal flag '(16)))))
-	 (inbuf (current-buffer))
-	 (displaybuf (if subst
-			 (get-buffer c-macro-buffer-name)
-		       (get-buffer-create c-macro-buffer-name)))
-	 (expansion ""))
+  (let ((inbuf (current-buffer))
+	(displaybuf (if subst
+			(get-buffer c-macro-buffer-name)
+		      (get-buffer-create c-macro-buffer-name)))
+	(expansion "")
+	(mymsg ""))
     ;; Build the command string.
-    (if (or c-macro-always-prompt-p (equal flag '(16)))
-	(setq c-macro-default-cppflags
+    (if c-macro-prompt-p
+	(setq c-macro-cppflags
 	      (read-string "Preprocessor arguments: "
-			   c-macro-default-cppflags)))
+			   c-macro-cppflags)))
+    (setq mymsg (format "Invoking %s%s%s on region..."
+			c-macro-preprocessor
+			(if (string= "" c-macro-cppflags) "" " ")
+			c-macro-cppflags))
     ;; Decide where to display output.
     (if (and subst
 	     (and buffer-read-only (not inhibit-read-only))
@@ -179,12 +164,11 @@
 	  (or displaybuf
 	      (setq displaybuf (get-buffer-create c-macro-buffer-name)))))
     ;; Expand the macro and output it.
-    (if (interactive-p) (message (c-macro-default-message)))
-    (setq expansion
-	  (c-macro-expansion start end
-			     (concat c-macro-preprocessor " "
-				     c-macro-default-cppflags)))
-    (message (concat (c-macro-default-message) "done"))
+    (message mymsg)
+    (setq expansion (c-macro-expansion start end
+				       (concat c-macro-preprocessor " "
+					       c-macro-cppflags)))
+    (message (concat mymsg "done"))
     (if subst
 	(let ((exchange (= (point) start)))
 	  (delete-region start end)
@@ -199,16 +183,16 @@
       (set-buffer-modified-p nil)
       (if (string= "" expansion)
 	  (message "Null expansion")
-	(c-macro-display-buffer inbuf))
+	(c-macro-display-buffer))
       (setq buffer-read-only t)
+      (setq buffer-auto-save-file-name nil)
       (bury-buffer displaybuf))))
 
 
 ;; Display the current buffer in a window which is either just large
 ;; enough to contain the entire buffer, or half the size of the
-;; screen, whichever is smaller.  Put the current buffer in view-mode
-;; if the Inge Frick's view-mode is installed, with buffer to return
-;; to set to RETBUF (if sensible). Do not select the new window.
+;; screen, whichever is smaller.  Do not select the new
+;; window.
 ;;
 ;; Several factors influence window resizing so that the window is
 ;; sized optimally if it is created anew, and so that it is messed
@@ -218,7 +202,7 @@
 ;; buffer, it is never shrunk, but possibly expanded.  Finally, if the
 ;; variable c-macro-shrink-window-p is nil the window size is *never*
 ;; changed.
-(defun c-macro-display-buffer (retbuf)
+(defun c-macro-display-buffer ()
 
   (goto-char (point-min))
   (c-mode)
@@ -244,17 +228,17 @@
 	    (setq maxheight (/ (screen-height) 2))
 	    (enlarge-window (- (min maxheight
 				    (max minheight
-					 (+ 2 (vertical-motion 1000000))))
+					 (+ 2 (vertical-motion (point-max)))))
 			       (window-height)))
 	    (goto-char (point-min))
 	    (select-window oldwin))))))
 
 
 (defun c-macro-expansion (start end cppcommand) "\
-Expands the region between START and END in the current buffer using
-the shell command CPPCOMMAND (e.g. \"/lib/cpp -C -DDEBUG\").  Be sure
-to use a -C (don't strip comments) or equivalent option.
-Returns the output as a string."
+Run a preprocessor on region and return the output as a string.
+Expand the region between START and END in the current buffer using
+the shell command CPPCOMMAND (e.g. \"/lib/cpp -C -DDEBUG\").
+Be sure to use a -C (don't strip comments) or equivalent option."
 
 ;; Copy the current buffer's contents to a temporary hidden buffer.
 ;; Delete from END to end of buffer.  Insert a preprocessor #line
@@ -305,7 +289,7 @@
 					 ;comment nor after quote
 		(progn
 		  (goto-char (match-end 0))
-;;		  (setq linenum (count-lines 1 (point)))
+;;;		  (setq linenum (count-lines 1 (point)))
 		  (setq linelist
 			;; This used to be a #line command
 			;; but it's not guaranteed that the output
@@ -330,9 +314,11 @@
 			(startincomment (nth 4 startstat))
 			(startafterquote (nth 5 startstat)))
 		   (concat (if startafterquote " ")
-			   (cond (startinstring "\"") (startincomment "*/"))
+			   (cond (startinstring (char-to-string startinstring))
+				 (startincomment "*/"))
 			   (format "\n???!!!???!!!!")
-			   (cond (startinstring "\"") (startincomment "/*"))
+			   (cond (startinstring (char-to-string startinstring))
+				 (startincomment "/*"))
 			   (if startafterquote "\\")))
 		 linelist))
 	  (insert (car linelist))
@@ -353,91 +339,4 @@
       ;; Cleanup.
       (kill-buffer outbuf))))
 
-
-;; Experimental.  With an argument, print signed, unsigned, hex and
-;; boolean representations.
-(defun c-macro-eval (start end &optional flag) "\
-Expand region using cpp and evaluate it using calc.
-Interactively print value in minibuffer and push it on the kill ring.
-With a C-u argument shows the evaluation in a variety of formats.
-With two C-u's prompts the user for a string of flags to the preprocessor.
-
-Non interactively returns value of region between START and END
-as a string.  Several formats are used if optional FLAG is non-nil."
-
-  (interactive "r\nP")
-  (or (fboundp 'calc-eval)
-      (require 'calc))
-  (if (or c-macro-always-prompt-p (equal flag '(16)))
-      (setq c-macro-default-cppflags
-	    (read-string "Preprocessor arguments: "
-			 c-macro-default-cppflags)))
-
-  ;; Expand the region.
-  (if (interactive-p) (message (c-macro-default-message)))
-  (let ((evaluation
-	 (c-macro-expansion start end
-			    (concat c-macro-preprocessor " "
-				    c-macro-default-cppflags)))
-	(evalbuf (get-buffer-create " *Macro Evaluation*")))
-    (unwind-protect
-	(save-excursion
-	  (set-buffer evalbuf)
-	  (setq buffer-read-only nil)
-	  (erase-buffer)
-	  (insert evaluation)
-
-	  ;; Evaluate expression(s).
-	  (if (interactive-p)
-	      (message "Invoking calc..."))
-	  (setq evaluation
-		(let ((calc-eval-error t))
-		  (calc-eval (list (buffer-string) 'calc-language 'c))))
-	  (erase-buffer)
-	  (cond
-	   (flag
-	    (insert (calc-eval (list evaluation
-				     'calc-language 'c
-				     'calc-simplify-mode 'binary))
-		    "(u)" " == "
-		    (calc-eval (list evaluation
-				     'calc-language 'c
-				     'calc-word-size (- calc-word-size)
-				     'calc-simplify-mode 'binary))
-		    "(d)" " == "
-		    (calc-eval (list evaluation
-				     'calc-language 'c
-				     'calc-number-radix 16
-				     'calc-simplify-mode 'binary))
-		    "(x)")
-	    (save-excursion
-	      (insert " == " (calc-eval (list evaluation
-					      'calc-language 'c
-					      'calc-number-radix 16
-					      'calc-simplify-mode 'binary))))
-	    (while (re-search-forward "0x\\([^,]+\\)\\(, \\|\\'\\)" nil t)
-	      (if (string= "0"
-			   (buffer-substring (match-beginning 1)
-					     (match-end 1)))
-		  (replace-match "FALSE\\2")
-		(replace-match "TRUE\\2"))))
-	   (t
-	    (insert evaluation)))
-
-	  ;; Output the evaluation.
-	  (if (interactive-p)
-	      (progn
-		(copy-region-as-kill 1 (point-max))
-		(message (buffer-string)))
-	    (buffer-string)))
-      (kill-buffer evalbuf))))
-
-(defun c-macro-default-message ()
-  (format "Invoking %s%s%s on region..."
-	  c-macro-preprocessor
-	  (if (string= "" c-macro-default-cppflags) "" " ")
-	  c-macro-default-cppflags))
-
-(provide 'cmacexp)
-
-;;; cmacexp.el ends here.
+;;; cmacexp.el ends here