
;
;  Help for making olc
;

(defvar mac-olc-path "/afs/athena.mit.edu/astaff/project/macathena/MIT/CAppsources/olc/ui/")
(defvar mac-olc-proto (concat mac-olc-path "protos.h"))

(define-abbrev global-abbrev-table "1olc" (substring mac-olc-path 0 -1) nil)

(setq foo "\\([ \t\n]*[^ \t\n]+[ \t\n*]+\\)*\\([a-zA-Z0-9_]+\\)[ \t\n]*(")
 

(defun get-c-function-name ()
  (if (looking-at "\\([^( \t\n]+[ \t\n*]+\\)*\\([a-zA-Z0-9_]+\\)[ \t\n]*(")
      (progn
	(goto-char (match-end 0))
	(buffer-substring (match-beginning 2) (match-end 2)))))

(defun find-prototype-end ()
  (search-forward ");")
  (skip-chars-forward " \t\n"))


(defun prototype ()
  (interactive)
  (save-excursion
    (save-restriction 
      (let ((beg (point))
	    (end (progn
		   (search-forward "\n{" (+ (point) 200))
		   (- (point) 1))))
	(narrow-to-region beg end)
	(goto-char beg)
	(let ((fproto (buffer-substring beg end))
	      (fname (get-c-function-name)))
	  (if (not fname)
	      (error "Can't find function name")
	    (set-buffer (find-file-noselect (concat mac-olc-path mac-olc-proto)))
	    (goto-char (point-min))
	    (if (re-search-forward (concat "[ \t\n*]" (regexp-quote fname) "[ \t\n]*(")
				   (point-max) t)
		(progn
		  (beginning-of-line)
		  (let ((p (point)))
		    (find-prototype-end)
		    (delete-region p (point)))))
	    (insert fproto)
	    (search-backward ")")
	    (forward-char 1)
	    (insert ";\n")))))))
		
	    
	      
(defun find-c-func ()
  (interactive)
  (forward-char 1)
  (re-search-forward "^[^\n \t].*(")
  (beginning-of-line))

(defun ansify ()
  (interactive)
  (or (get-c-function-name)
      (error "Can't find function near point"))
  (save-restriction 
    (narrow-to-region (point) (progn (search-forward "\n{") (- (point) 2)))
    (delete-region (point-min) (progn (goto-char (point-min)) (end-of-line) (point)))
    (while (not (eobp))
      (delete-char 1)
      (while (looking-at "[ \t\n]") (delete-char 1))
      (end-of-line)
      (search-backward ";")
      (delete-region (point) (progn (end-of-line) (point)))
      (insert ", "))
    (backward-delete-char 2)
    (insert ")"))
  (beginning-of-line))
    


(global-set-key "\C-xn" 'find-c-func)
(global-set-key "\C-xp" 'prototype)
(global-set-key "\C-xa" 'ansify)

