| [0b990d] | 1 | ;;
 | 
|---|
 | 2 | ;; SC.el: stuff for formatting files in the SC libraries
 | 
|---|
 | 3 | ;;
 | 
|---|
 | 4 | ;; Copyright (C) 1996 Limit Point Systems, Inc.
 | 
|---|
 | 5 | ;;
 | 
|---|
 | 6 | ;; Author: Curtis Janssen <cljanss@ca.sandia.gov>
 | 
|---|
 | 7 | ;; Maintainer: SNL
 | 
|---|
 | 8 | ;;
 | 
|---|
 | 9 | ;; This file is part of MPQC.
 | 
|---|
 | 10 | ;;
 | 
|---|
 | 11 | ;; MPQC is free software; you can redistribute it and/or modify
 | 
|---|
 | 12 | ;; it under the terms of the GNU General Public License as published by
 | 
|---|
 | 13 | ;; the Free Software Foundation; either version 2, or (at your option)
 | 
|---|
 | 14 | ;; any later version.
 | 
|---|
 | 15 | ;;
 | 
|---|
 | 16 | ;; MPQC is distributed in the hope that it will be useful,
 | 
|---|
 | 17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
 | 18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
 | 19 | ;; GNU General Public License for more details.
 | 
|---|
 | 20 | ;;
 | 
|---|
 | 21 | ;; You should have received a copy of the GNU General Public License
 | 
|---|
 | 22 | ;; along with the MPQC; see the file COPYING.  If not, write to
 | 
|---|
 | 23 | ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
|---|
 | 24 | ;;
 | 
|---|
 | 25 | ;; The U.S. Government is granted a limited license as per AL 91-7.
 | 
|---|
 | 26 | ;;
 | 
|---|
 | 27 | 
 | 
|---|
 | 28 | (require 'cc-mode)
 | 
|---|
 | 29 | (cond ((> emacs-major-version 19) (c-initialize-cc-mode)))
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | (setq clj-c-basic-half-offset 2)
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | (defun clj-adaptive-block-open (langelem)
 | 
|---|
 | 34 |   ;; when substatement is on semantics list, return
 | 
|---|
 | 35 |   ;; -(c-basic-offset - clj-c-basic-half-offset) to give a
 | 
|---|
 | 36 |   ;; total offset of clj-c-basic-half-offset,
 | 
|---|
 | 37 |   ;; otherwise return clj-c-basic-half-offset
 | 
|---|
 | 38 |   (if (assq 'substatement c-semantics)
 | 
|---|
 | 39 |       (+ clj-c-basic-half-offset (- c-basic-offset))
 | 
|---|
 | 40 |     clj-c-basic-half-offset))
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | (defun clj-lineup-math (langelem)
 | 
|---|
 | 43 |   ;; line up math statement-cont so that stuff after the "+", "-", etc
 | 
|---|
 | 44 |   ;; lines up with the stuff after the equals
 | 
|---|
 | 45 |   (save-excursion
 | 
|---|
 | 46 |     (let ((adjustment (progn
 | 
|---|
 | 47 |                         (beginning-of-line)
 | 
|---|
 | 48 |                         (skip-chars-forward " \t" (c-point 'eol))
 | 
|---|
 | 49 |                         (- (current-column)
 | 
|---|
 | 50 |                            (progn (skip-chars-forward " \t+-/*" (c-point 'eol))
 | 
|---|
 | 51 |                                   (current-column)))))
 | 
|---|
 | 52 |           (curcol (progn
 | 
|---|
 | 53 |                     (goto-char (cdr langelem))
 | 
|---|
 | 54 |                     (current-column))))
 | 
|---|
 | 55 |       (skip-chars-forward "^=" (c-point 'eol))
 | 
|---|
 | 56 |       (if (/= (following-char) ?=)
 | 
|---|
 | 57 |           ;; there's no equal sign on the line
 | 
|---|
 | 58 |           c-basic-offset
 | 
|---|
 | 59 |         ;; calculate indentation column after equals and ws and sign
 | 
|---|
 | 60 |         (forward-char 1)
 | 
|---|
 | 61 |         (skip-chars-forward " \t-")
 | 
|---|
 | 62 |         (+ (- (current-column) curcol) adjustment))
 | 
|---|
 | 63 |       )))
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 | (defun clj-adaptive-block-close (langelem)
 | 
|---|
 | 66 |   ;; these closes blocks in a way that is consistent with the way
 | 
|---|
 | 67 |   ;; clj-adaptive-statement-block-intro indents the first statement
 | 
|---|
 | 68 |   (- (clj-adaptive-statement-block-intro langelem)
 | 
|---|
 | 69 |      (- c-basic-offset clj-c-basic-half-offset))
 | 
|---|
 | 70 | )
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 | (defun clj-adaptive-statement-block-intro (langelem)
 | 
|---|
 | 73 |   ;; this lines up the first statement in a block by a full basic
 | 
|---|
 | 74 |   ;; offset, unless we are lining up to a "{" which is already
 | 
|---|
 | 75 |   ;; half indented
 | 
|---|
 | 76 |   (save-excursion
 | 
|---|
 | 77 |     (progn
 | 
|---|
 | 78 |       (goto-char (cdr langelem))
 | 
|---|
 | 79 |       (if (/= (following-char) ?{)
 | 
|---|
 | 80 |           ;; next char is not a "{"
 | 
|---|
 | 81 |           c-basic-offset
 | 
|---|
 | 82 |         ;; use remainder of half offset
 | 
|---|
 | 83 |         (- c-basic-offset clj-c-basic-half-offset))
 | 
|---|
 | 84 |       )))
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 | (defun clj-condensed-adaptive-statement-block-intro (langelem)
 | 
|---|
 | 87 |   ;; this lines up the first statement in a block by a full basic
 | 
|---|
 | 88 |   ;; offset, unless we are lining up to a "{" which is already
 | 
|---|
 | 89 |   ;; indented
 | 
|---|
 | 90 |   (save-excursion
 | 
|---|
 | 91 |     (progn
 | 
|---|
 | 92 |       (goto-char (cdr langelem))
 | 
|---|
 | 93 |       (if (/= (following-char) ?{)
 | 
|---|
 | 94 |           ;; next char is not a "{"
 | 
|---|
 | 95 |           c-basic-offset
 | 
|---|
 | 96 |         ;; we're already indendted
 | 
|---|
 | 97 |         0)
 | 
|---|
 | 98 |       )))
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 | (defun clj-condensed-adaptive-block-close (langelem)
 | 
|---|
 | 101 |   ;; these closes blocks in a way that is consistent with the way
 | 
|---|
 | 102 |   ;; clj-condensed-adaptive-statement-block-intro indents the first statement
 | 
|---|
 | 103 |   (clj-condensed-adaptive-statement-block-intro langelem)
 | 
|---|
 | 104 | )
 | 
|---|
 | 105 | 
 | 
|---|
 | 106 | ;;
 | 
|---|
 | 107 | ;; this is the style to use when editting Ed's files
 | 
|---|
 | 108 | ;;
 | 
|---|
 | 109 | (c-add-style "ETS" '((c-basic-offset . 2)
 | 
|---|
 | 110 |                      (c-offsets-alist . ((access-label      . -)
 | 
|---|
 | 111 |                                          (inclass           . ++)
 | 
|---|
 | 112 |                                          (label             . 0)
 | 
|---|
 | 113 |                                          ))
 | 
|---|
 | 114 |                      )
 | 
|---|
 | 115 |              )
 | 
|---|
 | 116 | 
 | 
|---|
 | 117 | ;;
 | 
|---|
 | 118 | ;; this is the style to use when editing Curt's files
 | 
|---|
 | 119 | ;;
 | 
|---|
 | 120 | (c-add-style "CLJ" '(
 | 
|---|
 | 121 |     (c-offsets-alist . (
 | 
|---|
 | 122 |         (block-open      . clj-adaptive-block-open)
 | 
|---|
 | 123 |         (statement       . c-lineup-runin-statements)
 | 
|---|
 | 124 |         (statement-cont  . clj-lineup-math)
 | 
|---|
 | 125 |         (statement-block-intro . clj-adaptive-statement-block-intro)
 | 
|---|
 | 126 |         (defun-block-intro . 2)
 | 
|---|
 | 127 |         (inher-intro . 2)
 | 
|---|
 | 128 |         (access-label . -2)
 | 
|---|
 | 129 |         (block-close . clj-adaptive-block-close)
 | 
|---|
 | 130 |         (member-init-intro . 2)
 | 
|---|
 | 131 |         )
 | 
|---|
 | 132 |     ))
 | 
|---|
 | 133 | )
 | 
|---|
 | 134 | 
 | 
|---|
 | 135 | ;;
 | 
|---|
 | 136 | ;; Curt's other style
 | 
|---|
 | 137 | ;;
 | 
|---|
 | 138 | (c-add-style "CLJ-CONDENSED" '(
 | 
|---|
 | 139 |     ;(c-echo-syntactic-information-p . t)
 | 
|---|
 | 140 |     (c-basic-offset . 2)
 | 
|---|
 | 141 |     (c-offsets-alist . (
 | 
|---|
 | 142 |        (statement-block-intro . clj-condensed-adaptive-statement-block-intro)
 | 
|---|
 | 143 |        (statement-cont . c-lineup-math)
 | 
|---|
 | 144 |        (inclass . ++)
 | 
|---|
 | 145 |        (access-label . -)
 | 
|---|
 | 146 |        (block-close . clj-condensed-adaptive-statement-block-intro)
 | 
|---|
 | 147 |        (substatement-open . +)
 | 
|---|
 | 148 |        (block-open . +)
 | 
|---|
 | 149 |        )
 | 
|---|
 | 150 |     ))
 | 
|---|
 | 151 | )
 | 
|---|
 | 152 | 
 | 
|---|
 | 153 | (defun clj-condensed-style ()
 | 
|---|
 | 154 |   "Change to condensed C indentation"
 | 
|---|
 | 155 |   (interactive)
 | 
|---|
 | 156 |   (c-set-style "CLJ-CONDENSED")
 | 
|---|
 | 157 |   )
 | 
|---|
 | 158 | (defun clj-style ()
 | 
|---|
 | 159 |   "Change to insane C indentation"
 | 
|---|
 | 160 |   (interactive)
 | 
|---|
 | 161 |   (c-set-style "CLJ")
 | 
|---|
 | 162 |   )
 | 
|---|
 | 163 | (defun ets-style ()
 | 
|---|
 | 164 |   "Change to sensible C indentation"
 | 
|---|
 | 165 |   (interactive)
 | 
|---|
 | 166 |   (c-set-style "ETS")
 | 
|---|
 | 167 |   )
 | 
|---|
 | 168 | 
 | 
|---|
 | 169 | (define-key c-mode-map "\C-ce" 'ets-style)
 | 
|---|
 | 170 | (define-key c-mode-map "\C-cj" 'clj-style)
 | 
|---|
 | 171 | (define-key c-mode-map "\C-cc" 'clj-condensed-style)
 | 
|---|
 | 172 | (define-key c-mode-map "\C-j"  'reindent-then-newline-and-indent)
 | 
|---|
 | 173 | (define-key c-mode-map "\C-m"  'newline-and-indent)
 | 
|---|
 | 174 | 
 | 
|---|
 | 175 | (define-key c++-mode-map "\C-ce" 'ets-style)
 | 
|---|
 | 176 | (define-key c++-mode-map "\C-cj" 'clj-style)
 | 
|---|
 | 177 | (define-key c++-mode-map "\C-cc" 'clj-condensed-style)
 | 
|---|
 | 178 | (define-key c++-mode-map "\C-j"  'reindent-then-newline-and-indent)
 | 
|---|
 | 179 | (define-key c++-mode-map "\C-m"  'newline-and-indent)
 | 
|---|
 | 180 | 
 | 
|---|
 | 181 | (define-key java-mode-map "\C-ce" 'ets-style)
 | 
|---|
 | 182 | (define-key java-mode-map "\C-cj" 'clj-style)
 | 
|---|
 | 183 | (define-key java-mode-map "\C-cc" 'clj-condensed-style)
 | 
|---|
 | 184 | (define-key java-mode-map "\C-j"  'reindent-then-newline-and-indent)
 | 
|---|
 | 185 | (define-key java-mode-map "\C-m"  'newline-and-indent)
 | 
|---|
 | 186 | 
 | 
|---|
 | 187 | ;;
 | 
|---|
 | 188 | ;; stuff for CLJ's compile hacks
 | 
|---|
 | 189 | ;;
 | 
|---|
 | 190 | 
 | 
|---|
 | 191 | (defun compile-modify-path (thisdir)
 | 
|---|
 | 192 |   (let ((tmpdir (expand-file-name thisdir)))
 | 
|---|
 | 193 |     (setq thisdir "")
 | 
|---|
 | 194 |     (while (>= (length tmpdir) (length sc-src-dir))
 | 
|---|
 | 195 |       (if (string= (substring tmpdir 0 (length sc-src-dir)) sc-src-dir)
 | 
|---|
 | 196 |           (let ()
 | 
|---|
 | 197 |             (setq thisdir (concat thisdir sc-arch-dir))
 | 
|---|
 | 198 |             (setq tmpdir (substring tmpdir (length sc-src-dir) nil))
 | 
|---|
 | 199 |             )
 | 
|---|
 | 200 |         (let ()
 | 
|---|
 | 201 |           (setq thisdir (concat thisdir (substring tmpdir 0 1)))
 | 
|---|
 | 202 |           (setq tmpdir (substring tmpdir 1 nil))
 | 
|---|
 | 203 |           )
 | 
|---|
 | 204 |         )
 | 
|---|
 | 205 |       )
 | 
|---|
 | 206 |     (setq thisdir (concat thisdir tmpdir))
 | 
|---|
 | 207 |     )
 | 
|---|
 | 208 |   thisdir
 | 
|---|
 | 209 | )
 | 
|---|
 | 210 | 
 | 
|---|
 | 211 | ;;
 | 
|---|
 | 212 | ;; stuff for inserting copyleft notices
 | 
|---|
 | 213 | ;;
 | 
|---|
 | 214 | 
 | 
|---|
 | 215 | (defvar copyleft-owner "Limit Point Systems, Inc."
 | 
|---|
 | 216 |   "This is the owner of the copyleft.  Defaults to LPS.")
 | 
|---|
 | 217 | 
 | 
|---|
 | 218 | (defun set-copyleft-owner (owner)
 | 
|---|
 | 219 |   "Set the copyleft-owner variable."
 | 
|---|
 | 220 |   (interactive (list (read-from-minibuffer "Copyleft Owner: "
 | 
|---|
 | 221 |                                            copyleft-owner nil nil nil)))
 | 
|---|
 | 222 |   (setq copyleft-owner owner))
 | 
|---|
 | 223 | 
 | 
|---|
 | 224 | (defvar copyleft-author user-full-name
 | 
|---|
 | 225 |   "This is the author of the file.  Defaults to the user editing the file.")
 | 
|---|
 | 226 | 
 | 
|---|
 | 227 | (defun set-copyleft-author (author)
 | 
|---|
 | 228 |   "Set the copyleft-author variable."
 | 
|---|
 | 229 |   (interactive (list (read-from-minibuffer "Author: "
 | 
|---|
 | 230 |                                            copyleft-author nil nil nil)))
 | 
|---|
 | 231 |   (setq copyleft-author author))
 | 
|---|
 | 232 | 
 | 
|---|
 | 233 | (defvar copyleft-address user-mail-address
 | 
|---|
 | 234 |   "This is the email address of the author of the file.  Defaults to the
 | 
|---|
 | 235 |    address of the user editing the file.")
 | 
|---|
 | 236 | 
 | 
|---|
 | 237 | (defun set-copyleft-address (address)
 | 
|---|
 | 238 |   "Set the copyleft-address variable."
 | 
|---|
 | 239 |   (interactive (list (read-from-minibuffer "E-mail address: "
 | 
|---|
 | 240 |                                            copyleft-address nil nil nil)))
 | 
|---|
 | 241 |   (setq copyleft-address address))
 | 
|---|
 | 242 | 
 | 
|---|
 | 243 | (defvar copyleft-maintainer "LPS"
 | 
|---|
 | 244 |   "This is the official maintaner of the file. Defaults to LPS")
 | 
|---|
 | 245 | 
 | 
|---|
 | 246 | (defun set-copyleft-maintainer (maintainer)
 | 
|---|
 | 247 |   "Set the copyleft-maintainer variable."
 | 
|---|
 | 248 |   (interactive (list (read-from-minibuffer "Maintainer: "
 | 
|---|
 | 249 |                                            copyleft-maintainer nil nil nil)))
 | 
|---|
 | 250 |   (setq copyleft-maintainer maintainer))
 | 
|---|
 | 251 | 
 | 
|---|
 | 252 | (defvar copyleft-default-comment-start "#"
 | 
|---|
 | 253 |   "The default symbol to use to begin a comment. Defaults to \"#\".")
 | 
|---|
 | 254 | 
 | 
|---|
 | 255 | (defvar copyleft-default-comment-cont "#"
 | 
|---|
 | 256 |   "The default symbol to use to continue a comment. Defaults to \"#\".")
 | 
|---|
 | 257 | 
 | 
|---|
 | 258 | (defvar copyleft-default-comment-end "#"
 | 
|---|
 | 259 |   "The default symbol to use to end a comment. Defaults to \"#\".")
 | 
|---|
 | 260 | 
 | 
|---|
 | 261 | (defun copyleft-set-comments (start cont end)
 | 
|---|
 | 262 |   "Set the comment symbols.
 | 
|---|
 | 263 | 
 | 
|---|
 | 264 |    (copyleft-set-comments START CONT END)"
 | 
|---|
 | 265 |   (interactive (list (read-from-minibuffer "Comment start: "
 | 
|---|
 | 266 |                               copyleft-default-comment-start nil nil nil)
 | 
|---|
 | 267 |                      (read-from-minibuffer "Comment continue: "
 | 
|---|
 | 268 |                               copyleft-default-comment-cont nil nil nil)
 | 
|---|
 | 269 |                      (read-from-minibuffer "Comment end: "
 | 
|---|
 | 270 |                               copyleft-default-comment-end nil nil nil)
 | 
|---|
 | 271 |                      ))
 | 
|---|
 | 272 | 
 | 
|---|
 | 273 |   (setq copyleft-default-comment-start start)
 | 
|---|
 | 274 |   (setq copyleft-default-comment-cont cont)
 | 
|---|
 | 275 |   (setq copyleft-default-comment-end end)
 | 
|---|
 | 276 | )
 | 
|---|
 | 277 | 
 | 
|---|
 | 278 | (defun insert-copyleft ()
 | 
|---|
 | 279 |   "Insert the notice."
 | 
|---|
 | 280 |   (interactive)
 | 
|---|
 | 281 |   (set-window-point (display-buffer (current-buffer)) (point-min))
 | 
|---|
 | 282 |   (cond ((eq major-mode 'c++-mode)
 | 
|---|
 | 283 |          (setq comment-start "//")
 | 
|---|
 | 284 |          (setq comment-cont "//")
 | 
|---|
 | 285 |          (setq comment-end "//")
 | 
|---|
 | 286 |          )
 | 
|---|
 | 287 |         ((eq major-mode 'c-mode)
 | 
|---|
 | 288 |          (setq comment-start "/*")
 | 
|---|
 | 289 |          (setq comment-cont " *")
 | 
|---|
 | 290 |          (setq comment-end " */")
 | 
|---|
 | 291 |          )
 | 
|---|
 | 292 |         ((eq major-mode 'emacs-lisp-mode)
 | 
|---|
 | 293 |          (setq comment-start ";;")
 | 
|---|
 | 294 |          (setq comment-cont ";;")
 | 
|---|
 | 295 |          (setq comment-end ";;")
 | 
|---|
 | 296 |          )
 | 
|---|
 | 297 |         ((eq major-mode 'makefile-mode)
 | 
|---|
 | 298 |          (setq comment-start "#")
 | 
|---|
 | 299 |          (setq comment-cont "#")
 | 
|---|
 | 300 |          (setq comment-end "#")
 | 
|---|
 | 301 |          )
 | 
|---|
 | 302 |         ('t
 | 
|---|
 | 303 |          (setq comment-start copyleft-default-comment-start)
 | 
|---|
 | 304 |          (setq comment-cont copyleft-default-comment-cont)
 | 
|---|
 | 305 |          (setq comment-end copyleft-default-comment-end)
 | 
|---|
 | 306 |          )
 | 
|---|
 | 307 |         )
 | 
|---|
 | 308 | 
 | 
|---|
 | 309 |   (setq description (read-from-minibuffer "Description: "))
 | 
|---|
 | 310 | 
 | 
|---|
 | 311 |   (insert comment-start "\n")
 | 
|---|
 | 312 |   (insert comment-cont " " (file-name-nondirectory buffer-file-name) 
 | 
|---|
 | 313 |       (cond ((not (string= description "")) (concat " --- " description "\n"))
 | 
|---|
 | 314 |             ('t "\n")))
 | 
|---|
 | 315 |   (insert comment-cont "\n")
 | 
|---|
 | 316 |   (insert comment-cont " Copyright (C) "
 | 
|---|
 | 317 |           (substring (current-time-string) 20) " "
 | 
|---|
 | 318 |           copyleft-owner "\n")
 | 
|---|
 | 319 |   (insert comment-cont "\n")
 | 
|---|
 | 320 |   (insert comment-cont " Author: " copyleft-author " <" copyleft-address ">\n")
 | 
|---|
 | 321 |   (insert comment-cont " Maintainer: " copyleft-maintainer "\n")
 | 
|---|
 | 322 |   (insert comment-cont "\n")
 | 
|---|
 | 323 |   (insert comment-cont " This file is part of the SC Toolkit.\n")
 | 
|---|
 | 324 |   (insert comment-cont "\n")
 | 
|---|
 | 325 | 
 | 
|---|
 | 326 |   (insert comment-cont " The SC Toolkit is free software; you can redistribute it and/or modify\n")
 | 
|---|
 | 327 |   (insert comment-cont " it under the terms of the GNU Library General Public License as published by\n")
 | 
|---|
 | 328 |   (insert comment-cont " the Free Software Foundation; either version 2, or (at your option)\n")
 | 
|---|
 | 329 |   (insert comment-cont " any later version.\n")
 | 
|---|
 | 330 |   (insert comment-cont "\n")
 | 
|---|
 | 331 | 
 | 
|---|
 | 332 |   (insert comment-cont " The SC Toolkit is distributed in the hope that it will be useful,\n")
 | 
|---|
 | 333 |   (insert comment-cont " but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
 | 
|---|
 | 334 |   (insert comment-cont " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n")
 | 
|---|
 | 335 |   (insert comment-cont " GNU Library General Public License for more details.\n")
 | 
|---|
 | 336 |   (insert comment-cont "\n")
 | 
|---|
 | 337 | 
 | 
|---|
 | 338 |   (insert comment-cont " You should have received a copy of the GNU Library General Public License\n")
 | 
|---|
 | 339 |   (insert comment-cont " along with the SC Toolkit; see the file COPYING.LIB.  If not, write to\n")
 | 
|---|
 | 340 |   (insert comment-cont " the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.\n")
 | 
|---|
 | 341 |   (insert comment-cont "\n")
 | 
|---|
 | 342 | 
 | 
|---|
 | 343 |   (insert comment-cont " The U.S. Government is granted a limited license as per AL 91-7.\n")
 | 
|---|
 | 344 |   (insert comment-end "\n")
 | 
|---|
 | 345 | )
 | 
|---|
 | 346 | 
 | 
|---|
 | 347 | (define-key c-mode-map "\C-ci" 'insert-copyleft)
 | 
|---|
 | 348 | (define-key c++-mode-map "\C-ci" 'insert-copyleft)
 | 
|---|
 | 349 | (define-key java-mode-map "\C-ci" 'insert-copyleft)
 | 
|---|