summaryrefslogtreecommitdiff
path: root/templates/auto-insert/.yas-setup.el
blob: ed5d6b94b05828ca0f9a21567472d214f71eb6bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
;;; .yas-setup.el --- Utility functions for c-mode   -*- lexical-binding: t; -*-

;; Copyright (C) 2018  Benj Bellon

;; Author: Benj Bellon <benj@benj-ad1>
;; Keywords: c

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; As description

;;; Code:
(require 'dash)

(defun fetch-project-path (root-dir)
  "Retrieve path from project's root-dir to file as list.
NOTE: The closest parent root-dir is considered the root.
ROOT-DIR: the root directory with no path delimiters."
  (let* ((full-path (locate-dominating-file buffer-file-name root-dir)))
    (if full-path
	(let* ((proj-root-dir (nth 1 (reverse (split-string full-path "/"))))
	      (full-path-list (cons proj-root-dir
				    (-flatten (cdr (-split-on proj-root-dir (split-string buffer-file-name "/")))))))

	  ;; turn dashes into underscores
	  (mapcar (lambda (x) (replace-regexp-in-string "-" "_" x))
		  full-path-list))
      nil)
    ))

(defun build-include-guard-header (root-dir)
  "Create a full include guard header for c files.
If the path cannot be found, just use the filename.
ROOT-DIR: the root directory with no path delimiters.
FORMAT: PROJDIR_FULL_PATH_TO_FILE_H"
  (if (fetch-project-path root-dir)
      (let* ((path-no-file (reverse (cdr (reverse (fetch-project-path root-dir)))))
	     (file-no-ext (car (split-string (car (reverse (fetch-project-path root-dir))) "\\." t))))
	(concat
	 (mapconcat 'identity
		    (mapcar 'upcase
			    (reverse (cons file-no-ext (reverse path-no-file)))) "_")
	 "_H")
	)
    ;; no lazy evaluation, so just do it here
    (concat
     (upcase
      (car (-filter (lambda (x) (not (s-blank? x)))
		    (split-string
		     (car (reverse (split-string buffer-file-name "/")))
		     "\\."))))
     "_H")
    ))

(defun git-include-guard-path ()
  "Build include guard headers for git projects."
  (build-include-guard-header ".git"))

(provide '.yas-setup)
;;; .yas-setup.el ends here