summaryrefslogtreecommitdiff
path: root/lisp/cedet/ede/srecode.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/cedet/ede/srecode.el')
-rw-r--r--lisp/cedet/ede/srecode.el106
1 files changed, 106 insertions, 0 deletions
diff --git a/lisp/cedet/ede/srecode.el b/lisp/cedet/ede/srecode.el
new file mode 100644
index 00000000000..c53fe99239f
--- /dev/null
+++ b/lisp/cedet/ede/srecode.el
@@ -0,0 +1,106 @@
+;;; ede-srecode.el --- EDE utilities on top of SRecoder
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <eric@siege-engine.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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.
+
+;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; EDE utilities for using SRecode to generate project files, such as
+;; Makefiles.
+
+(require 'srecode)
+
+(declare-function srecode-create-dictionary "srecode/dictionary")
+(declare-function srecode-dictionary-set-value "srecode/dictionary")
+(declare-function srecode-load-tables-for-mode "srecode/find")
+(declare-function srecode-table "srecode/find")
+(declare-function srecode-template-get-table "srecode/find")
+(declare-function srecode-insert-fcn "srecode/insert")
+(declare-function srecode-resolve-arguments "srecode/map")
+(declare-function srecode-map-update-map "srecode/map")
+
+;;; Code:
+(defun ede-srecode-setup ()
+ "Update various paths to get SRecode to identify our macros."
+ (let* ((lib (locate-library "ede.el" t))
+ (ededir (file-name-directory lib))
+ (tmpdir (file-name-as-directory
+ (expand-file-name "templates" ededir))))
+ (when (not tmpdir)
+ (error "Unable to location EDE Templates directory"))
+
+ ;; Rig up the map.
+ (require 'srecode/map)
+ (require 'srecode/find)
+ (add-to-list 'srecode-map-load-path tmpdir)
+ (srecode-map-update-map t)
+
+ ;; We don't call this unless we need it. Load in the templates.
+ (srecode-load-tables-for-mode 'makefile-mode)
+ (srecode-load-tables-for-mode 'makefile-mode 'ede)
+
+ ;; @todo - autoconf files.
+
+ ))
+
+(defmacro ede-srecode-insert-with-dictionary (template &rest forms)
+ "Insert TEMPLATE after executing FORMS with a dictionary.
+TEMPLATE should specify a context by using a string format of:
+ context:templatename
+Locally binds the variable DICT to a dictionary which can be
+updated in FORMS."
+ `(let* ((dict (srecode-create-dictionary))
+ (temp (srecode-template-get-table (srecode-table)
+ ,template
+ nil
+ 'ede))
+ )
+ (when (not temp)
+ (error "EDE template %s for %s not found!"
+ ,template major-mode))
+ (srecode-resolve-arguments temp dict)
+
+ ;; Now execute forms for updating DICT.
+ (progn ,@forms)
+
+ (srecode-insert-fcn temp dict)
+ ))
+
+(defun ede-srecode-insert (template &rest dictionary-entries)
+ "Insert at the current point TEMPLATE.
+TEMPLATE should specify a context by using a string format of:
+ context:templatename
+Add DICTIONARY-ENTRIES into the dictionary before insertion.
+Note: Just like `srecode-insert', but templates found in 'ede app."
+ (require 'srecode/insert)
+ (ede-srecode-insert-with-dictionary template
+
+ ;; Add in optional dictionary entries.
+ (while dictionary-entries
+ (srecode-dictionary-set-value dict
+ (car dictionary-entries)
+ (car (cdr dictionary-entries)))
+ (setq dictionary-entries
+ (cdr (cdr dictionary-entries))))
+
+ ))
+
+(provide 'ede-srecode)
+
+;;; ede-srecode.el ends here