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
|