1 #!/usr/bin/emacs --script
3 ;; Insert style boilerplate if it's not already there
5 ;; Breaking the string in half keeps emacs
6 ;; from trying to interpret the local variable
7 ;; settings e.g. when it reads the lisp source code
9 (defun insert-style-boilerplate () (interactive)
11 (goto-char (point-min))
12 (if (eq nil (search-forward "coding-style-patch-verification"
14 (let ((junk 0)) (goto-char (point-max))
17 * fd.io coding-style-patch-verification: ON
20 * eval: (c-set-style \"gnu\")
24 ;; (cons xxx <list>) means insert xxx at the head of <list>
25 ;; Build a sorted list of *INDENT-OFF* lines, by searching
26 ;; backwards. The initial (setq indent-offset-list nil)
27 ;; results in (cdr <last-cell>) nil, which makes it a proper list
29 (defun find-indent-offs () (interactive)
31 (if (boundp 'indent-offset-list)
32 (makunbound 'indent-offset-list))
33 (setq indent-offset-list nil)
34 (goto-char (point-max))
35 (while (search-backward "*INDENT-OFF*" (point-min) t)
36 (move-beginning-of-line nil)
37 (setq indent-offset-list (cons (point) indent-offset-list))
40 ;; Insert indent-off ... indent-on brackets around
41 ;; a certain xxx_foreach macro, etc. which "indent"
42 ;; completely screws up. Doesn't handle nesting, of which there
43 ;; are few examples (fortunately).
45 (defun fix-initializer (what) (interactive)
48 (goto-char (point-min))
49 (while (search-forward-regexp what (point-max) t)
50 (move-beginning-of-line nil)
52 (let ((index 0)(pointval 0))
53 (while (and (< pointval (point))(elt indent-offset-list index))
54 (setq pointval (elt indent-offset-list index))
55 (setq index (1+ index)))
56 (if (not (eq pointval (point)))
60 (c-indent-line-or-region)
61 (insert "/* *INDENT-OFF* */")
65 (move-end-of-line nil)
67 (c-indent-line-or-region)
68 (insert "/* *INDENT-ON* */")
70 (search-forward "*INDENT-ON*"))))))
72 (defun fix-pool-foreach () (interactive)
73 (fix-initializer "pool_foreach *("))
75 (defun fix-pool-foreach-index () (interactive)
76 (fix-initializer "pool_foreach_index *("))
78 (defun fix-hash-foreach () (interactive)
79 (fix-initializer "hash_foreach *("))
81 (defun fix-hash-foreach-pair () (interactive)
82 (fix-initializer "hash_foreach_pair *("))
84 (defun fix-hash-foreach-mem () (interactive)
85 (fix-initializer "hash_foreach_mem *("))
87 (defun fix-clib-fifo-foreach () (interactive)
88 (fix-initializer "clib_fifo_foreach *("))
90 (defun fix-clib-bitmap-foreach () (interactive)
91 (fix-initializer "clib_bitmap_foreach *("))
93 (defun fix-foreach-ip-interface-address () (interactive)
94 (fix-initializer "foreach_ip_interface_address *("))
96 (defun fix-vlib-register-thread () (interactive)
97 (fix-initializer "VLIB_REGISTER_THREAD *("))
99 (defun fix-vlib-cli-command () (interactive)
100 (fix-initializer "VLIB_CLI_COMMAND *("))
102 (defun fix-vlib-register-node () (interactive)
103 (fix-initializer "VLIB_REGISTER_NODE *("))
105 (defun fix-reply-macro2 () (interactive)
106 (fix-initializer "REPLY_MACRO2 *("))
108 (defun fix-vnet-device-class () (interactive)
109 (fix-initializer "VNET_DEVICE_CLASS *("))
111 (defun fix-vnet-hw-interface-class () (interactive)
112 (fix-initializer "VNET_HW_INTERFACE_CLASS *("))
114 (defun fix-clib-packed () (interactive)
115 (fix-initializer "CLIB_PACKED *("))
116 (defun fix-vl-api-packed () (interactive)
117 (fix-initializer "VL_API_PACKED *("))
119 ;; Driver routine which runs the set of functions
120 ;; defined above, as well as the bottom boilerplate function
122 (defun fd-io-styleify () (interactive)
124 (fix-pool-foreach-index)
126 (fix-hash-foreach-pair)
127 (fix-hash-foreach-mem)
128 (fix-foreach-ip-interface-address)
129 (fix-clib-fifo-foreach)
130 (fix-clib-bitmap-foreach)
131 (fix-vlib-register-thread)
132 (fix-vlib-cli-command)
133 (fix-vlib-register-node)
135 (fix-vnet-device-class)
136 (fix-vnet-hw-interface-class)
139 (insert-style-boilerplate)
140 (if (boundp 'indent-offset-list)
141 (makunbound 'indent-offset-list)))
143 ;; When run as a script, this sexp
144 ;; walks the list of files supplied on the command line.
146 ;; (elt argv index) returns nil if you M-x eval-buffer
147 ;; or M-x load-file the file, so we won't accidentally
148 ;; evaluate (save-buffers-kill-emacs)...
150 (let ((file-index 0))
151 (if (elt argv file-index)
152 (while (elt argv file-index)
153 (find-file (elt argv file-index))
155 (message "Done %s..." (elt argv file-index))
156 (setq file-index (1+ file-index))))
159 (message "Save and quit...")
160 (save-buffers-kill-emacs t))))