montnaro@moose.crd.ge.com (Skip Montanaro) (12/20/90)
I know more elaborate systems have been developed, but here's a short and
fast protoizer I just wrote in ELisp to convert some C code to use function
prototypes. It works about as well as the mark-c-function command does.
I tend to define (old-style) C functions in a very consistent manner,
something like:
static void next_state(s, last, next)
fpstate s;
fpstate *last;
fpstate *next;
{
...
}
so it's no big deal to pick out the header (declarator) of a function
definition after executing mark-c-function. The ELisp at the end of this
note converts the above function definition into:
static void next_state(fpstate s, fpstate *last, fpstate *next)
{
...
}
and places
static void next_state(fpstate s, fpstate *last, fpstate *next);
at the end of a buffer named *protos*. A couple flush-line commands cleans
out the junk (like leading comments and static functions). The rest can
usually be inserted into a .h file.
A simple keyboard macro serves to walk you through a buffer, one function at
a time:
(fset 'proto-step "\C-[xold-to-proto\C-M\C-[\C-[(sit-for 0)\C-M\C-X\C-X")
Skip (montanaro@crdgw1.ge.com)
- ----------
(defun old-to-proto ()
(interactive)
(mark-c-function)
(let ((s (progn
(next-line 1)
(beginning-of-line)
(point)))
(e (save-excursion
(search-forward "{")
(backward-char 1)
(point))))
(let ((hdr (buffer-substring s e)))
(delete-region s e)
(save-excursion
(get-buffer-create "*protos*")
(set-buffer "*protos*")
(end-of-buffer)
(save-excursion (insert hdr))
(save-excursion (replace-regexp "(.*)
+" "("))
(save-excursion (replace-regexp ";" ","))
(save-excursion (replace-regexp ",
+" ": "))
(save-excursion (replace-string "," ");"))
(save-excursion (replace-string ":" ","))
(save-excursion (replace-string ");" ")"))
(save-excursion (replace-string ")" ");"))
(save-excursion (replace-regexp "( *)" "(void)"))
(setq hdr (buffer-substring (point) (- (point-max) 2))))
(insert hdr "\n"))))