home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / gnu / emacs-18.59-bin.lha / lib / emacs / 18.59 / lisp / cmacexp.el < prev    next >
Lisp/Scheme  |  1989-05-31  |  2KB  |  46 lines

  1.  
  2. (defun c-macro-expand (beg end)
  3.   "Display the result of expanding all C macros occurring in the region.
  4. The expansion is entirely correct because it uses the C preprocessor."
  5.   (interactive "r")
  6.   (let ((outbuf (get-buffer-create "*Macroexpansion*"))
  7.     (tempfile "%%macroexpand%%")
  8.     process
  9.     last-needed)
  10.     (save-excursion
  11.       (set-buffer outbuf)
  12.       (erase-buffer))
  13.     (setq process (start-process "macros" outbuf "/lib/cpp"))
  14.     (set-process-sentinel process '(lambda (&rest x)))
  15.     (save-restriction
  16.       (widen)
  17.       (save-excursion
  18.     (goto-char beg)
  19.     (beginning-of-line)
  20.     (setq last-needed (point))
  21.     (if (re-search-backward "^[ \t]*#" nil t)
  22.         (progn
  23.           ;; Skip continued lines.
  24.           (while (progn (end-of-line) (= (preceding-char) ?\\))
  25.         (forward-line 1))
  26.           ;; Skip the last line of the macro definition we found.
  27.           (forward-line 1)
  28.           (setq last-needed (point)))))
  29.       (write-region (point-min) last-needed tempfile nil 'nomsg)
  30.       (process-send-string process (concat "#include \"" tempfile "\"\n"))
  31.       (process-send-string process "\n")
  32.       (process-send-region process beg end)
  33.       (process-send-string process "\n")
  34.       (process-send-eof process))
  35.     (while (eq (process-status process) 'run)
  36.       (accept-process-output))
  37.     (delete-file tempfile)
  38.     (save-excursion
  39.       (set-buffer outbuf)
  40.       (goto-char (point-max))
  41.       (re-search-backward "\n# [12] \"\"")
  42.       (forward-line 2)
  43.       (while (eolp) (delete-char 1))
  44.       (delete-region (point-min) (point)))
  45.     (display-buffer outbuf)))
  46.