The first function simply toggles the characters at the point between “.” and “->”. Not terribly useful.
The second function is a little more interesting. You can put the point by a struct-type variable which is or isn’t a pointer and this function will toggle both the “*” and all of the “.”s and “->”s in the function.
Send me any suggestions for improvements.
(defun c-toggle-dot-pointer () (interactive) (cond ((looking-at "\\.") (replace-string "." "->" nil (point) (+ (point) 1))) ((looking-at "\\->") (replace-string "->" "." nil (point) (+ (point) 2))))) (defun c-toggle-dot-pointer-in-defun () (interactive) (atomic-change-group (save-excursion (let ((is-ptr nil) (var-under-cursor) (end-of-func)) (when (eq (char-after) ?*) (delete-char 1) (setf is-ptr t)) (if (looking-at "[a-zA-Z0-9_]+") ;then (setf var-under-cursor (match-string 0)) ;else (error "not variable")) (save-excursion (c-end-of-defun) (setf end-of-func (point))) (if is-ptr ;then (replace-string (concat var-under-cursor "->") (concat var-under-cursor ".") nil (point) end-of-func) ;else (insert "*") (replace-string (concat var-under-cursor ".") (concat var-under-cursor "->") nil (point) end-of-func))))))
I posted this on EmacsWiki:
http://www.emacswiki.org/cgi-bin/emacs/c-toggle-dot-pointer.el