|
|
1.1 ! root 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)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.