Move emacs stuff to extras/
[vpp.git] / extras / emacs / fix-coding-style.el
diff --git a/extras/emacs/fix-coding-style.el b/extras/emacs/fix-coding-style.el
new file mode 100755 (executable)
index 0000000..0bb6348
--- /dev/null
@@ -0,0 +1,162 @@
+#!/usr/bin/emacs --script
+
+;; Insert style boilerplate if it's not already there
+;;
+;; Breaking the string in half keeps emacs
+;; from trying to interpret the local variable
+;; settings e.g. when it reads the lisp source code
+
+(defun insert-style-boilerplate () (interactive)
+       (save-excursion 
+         (goto-char (point-min))
+         (if (eq nil (search-forward "coding-style-patch-verification" 
+                                     (point-max) t))
+             (let ((junk 0)) (goto-char (point-max))
+              (insert "
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Var" "iables:
+ * eval: (c-set-style \"gnu\")
+ * End:
+ */")))))
+
+;; (cons xxx <list>) means insert xxx at the head of <list>
+;; Build a sorted list of *INDENT-OFF* lines, by searching
+;; backwards. The initial (setq indent-offset-list nil)
+;; results in (cdr <last-cell>) nil, which makes it a proper list
+
+(defun find-indent-offs () (interactive)
+       (save-excursion
+         (if (boundp 'indent-offset-list)
+             (makunbound 'indent-offset-list))
+         (setq indent-offset-list nil)
+         (goto-char (point-max))
+         (while (search-backward "*INDENT-OFF*" (point-min) t)
+           (move-beginning-of-line nil)
+           (setq indent-offset-list (cons (point) indent-offset-list))
+           (previous-line))))
+
+;; Insert indent-off ... indent-on brackets around
+;; a certain xxx_foreach macro, etc. which "indent"
+;; completely screws up. Doesn't handle nesting, of which there
+;; are few examples (fortunately).
+
+(defun fix-initializer (what) (interactive)
+       (find-indent-offs)
+       (save-excursion 
+         (goto-char (point-min))
+         (while (search-forward-regexp what (point-max) t)
+           (move-beginning-of-line nil)
+           (previous-line)
+           (let ((index 0)(pointval 0))
+             (while (and (< pointval (point))(elt indent-offset-list index))
+               (setq pointval (elt indent-offset-list index))
+               (setq index (1+ index)))
+             (if (not (eq pointval (point)))
+                 (let ((junk 0))
+                   (next-line)
+                   (open-line 1)
+                   (c-indent-line-or-region)
+                   (insert "/* *INDENT-OFF* */")
+                   (search-forward "{")
+                   (backward-char)
+                   (forward-sexp)
+                   (move-end-of-line nil)
+                   (newline 1)
+                   (c-indent-line-or-region)
+                   (insert "/* *INDENT-ON* */")
+                   (find-indent-offs))
+               (search-forward "*INDENT-ON*"))))))
+
+(defun fix-pool-foreach () (interactive)
+       (fix-initializer "pool_foreach *("))
+
+(defun fix-pool-foreach-index () (interactive)
+       (fix-initializer "pool_foreach_index *("))
+
+(defun fix-hash-foreach () (interactive)
+       (fix-initializer "hash_foreach *("))
+
+(defun fix-hash-foreach-pair () (interactive)
+       (fix-initializer "hash_foreach_pair *("))
+
+(defun fix-hash-foreach-mem () (interactive)
+       (fix-initializer "hash_foreach_mem *("))
+
+(defun fix-clib-fifo-foreach () (interactive)
+       (fix-initializer "clib_fifo_foreach *("))
+
+(defun fix-clib-bitmap-foreach () (interactive)
+       (fix-initializer "clib_bitmap_foreach *("))
+
+(defun fix-foreach-ip-interface-address () (interactive)
+       (fix-initializer "foreach_ip_interface_address *("))
+
+(defun fix-vlib-register-thread () (interactive)
+       (fix-initializer "VLIB_REGISTER_THREAD *("))
+
+(defun fix-vlib-cli-command () (interactive)
+       (fix-initializer "VLIB_CLI_COMMAND *("))
+
+(defun fix-vlib-register-node () (interactive)
+       (fix-initializer "VLIB_REGISTER_NODE *("))
+
+(defun fix-reply-macro2 () (interactive)
+       (fix-initializer "REPLY_MACRO2 *("))
+
+(defun fix-vnet-device-class () (interactive)
+       (fix-initializer "VNET_DEVICE_CLASS *("))
+
+(defun fix-vnet-hw-interface-class () (interactive)
+       (fix-initializer "VNET_HW_INTERFACE_CLASS *("))
+
+(defun fix-clib-packed () (interactive)
+       (fix-initializer "CLIB_PACKED *("))
+(defun fix-vl-api-packed () (interactive)
+       (fix-initializer "VL_API_PACKED *("))
+
+;; Driver routine which runs the set of functions
+;; defined above, as well as the bottom boilerplate function
+
+(defun fd-io-styleify () (interactive)
+       (fix-pool-foreach)
+       (fix-pool-foreach-index)
+       (fix-hash-foreach)
+       (fix-hash-foreach-pair)
+       (fix-hash-foreach-mem)
+       (fix-foreach-ip-interface-address)
+       (fix-clib-fifo-foreach)
+       (fix-clib-bitmap-foreach)
+       (fix-vlib-register-thread)
+       (fix-vlib-cli-command)
+       (fix-vlib-register-node)
+       (fix-reply-macro2)
+       (fix-vnet-device-class)
+       (fix-vnet-hw-interface-class)
+       (fix-clib-packed)
+       (fix-vl-api-packed)
+       (insert-style-boilerplate)
+       (if (boundp 'indent-offset-list)
+           (makunbound 'indent-offset-list)))
+
+;; When run as a script, this sexp
+;; walks the list of files supplied on the command line.
+;; 
+;; (elt argv index) returns nil if you M-x eval-buffer
+;; or M-x load-file the file, so we won't accidentally
+;; evaluate (save-buffers-kill-emacs)...
+
+(let ((file-index 0))
+  (if (elt argv file-index)
+      (while (elt argv file-index)
+        (find-file (elt argv file-index))
+        (fd-io-styleify)
+        (message "Done %s..." (elt argv file-index))
+        (setq file-index (1+ file-index))))
+  (if (> file-index 0)
+      (let ((junk 0))
+        (message "Save and quit...")
+        (save-buffers-kill-emacs t))))
+  
+