diff --git a/origami-parsers.el b/origami-parsers.el index d034cd2..812bf59 100644 --- a/origami-parsers.el +++ b/origami-parsers.el @@ -115,44 +115,13 @@ position in the CONTENT." build-nodes cdr)))) -;; Added support for C-Makros -(defun origami-build-pair-tree-makro-c (create open openM close closeM positions) - (cl-labels ((build (positions) - ;; this is so horrible, but fast - (let (acc beg (should-continue t)) - (while (and should-continue positions) - (cond ((or (equal (caar positions) open) - (equal (caar positions) openM)) - (if beg ;go down a level - (let* ((res (build positions)) - (new-pos (car res)) - (children (cdr res))) - (setq positions (cdr new-pos)) - (setq acc (cons (funcall create beg (cdar new-pos) (length open) children) - acc)) - (setq beg nil)) - ;; begin a new pair - (setq beg (cdar positions)) - (setq positions (cdr positions)))) - ( (or (equal (caar positions) closeM) - (equal (caar positions) close)) - (if beg - (progn ;close with no children - (setq acc (cons (funcall create beg (cdar positions) (length close) nil) - acc)) - (setq positions (cdr positions)) - (setq beg nil)) - (setq should-continue nil))))) - (cons positions (reverse acc))))) - (cdr (build positions)))) - (defun origami-build-pair-tree (create open close positions) (cl-labels ((build (positions) ;; this is so horrible, but fast (let (acc beg (should-continue t)) (while (and should-continue positions) (cond ((equal (caar positions) open) - (if beg ;go down a level + (if beg ;go down a level (let* ((res (build positions)) (new-pos (car res)) (children (cdr res))) @@ -165,7 +134,7 @@ position in the CONTENT." (setq positions (cdr positions)))) ((equal (caar positions) close) (if beg - (progn ;close with no children + (progn ;close with no children (setq acc (cons (funcall create beg (cdar positions) (length close) nil) acc)) (setq positions (cdr positions)) @@ -174,13 +143,6 @@ position in the CONTENT." (cons positions (reverse acc))))) (cdr (build positions)))) -;; Support for C-Makros -(defun origami-c-with-makros-parser (create) - (lambda (content) - (let ((positions (origami-get-positions content "#ifdef\\|#endif\\|[{}]"))) - (origami-build-pair-tree-makro-c - create "{" "#ifdef" "}" "#endif" positions)))) - ;;; TODO: tag these nodes? have ability to manipulate nodes that are ;;; tagged? in a scoped fashion? (defun origami-javadoc-parser (create) @@ -203,6 +165,20 @@ position in the CONTENT." (if (listp face) face (list face))))))))) (origami-build-pair-tree create "{" "}" positions)))) +(defun origami-c-macro-parser (create) + (lambda (content) + (let ((positions (origami-get-positions content "#ifdef\\|#endif"))) + (origami-build-pair-tree create "#ifdef" "#endif" positions)))) + +(defun origami-c-parser (create) + (let ((c-style (origami-c-style-parser create)) + (macros (origami-c-macro-parser create))) + (lambda (content) + (origami-fold-children + (origami-fold-shallow-merge + (origami-fold-root-node (funcall c-style content)) + (origami-fold-root-node (funcall macros content))))))) + (defun origami-java-parser (create) (let ((c-style (origami-c-style-parser create)) (javadoc (origami-javadoc-parser create))) @@ -246,8 +222,8 @@ position in the CONTENT." (defcustom origami-parser-alist `((java-mode . origami-java-parser) - (c-mode . origami-c-with-makros-parser) - (c++-mode . origami-c-with-makros-parser) + (c-mode . origami-c-parser) + (c++-mode . origami-c-parser) (perl-mode . origami-c-style-parser) (cperl-mode . origami-c-style-parser) (js-mode . origami-c-style-parser)