;;; I will continue to upgrade hide-ifdef-mode
;;; with your contributions.
-;;; Change Log:
-;;;
-;;; Revision 1.7 88/02/16 03:12:58 liberte
-;;; Fixed comments and doc strings.
-;;; Added optional prefix arg for ifdef motion commands.
-;;;
-;;; Revision 1.6 88/02/05 00:36:18 liberte
-;;; Bug fixes.
-;;; 1. A multi-line comment that starts on an #ifdef line
-;;; now ends on that line.
-;;; 2. Fix bad function name: hide-hif-ifdef-toggle-read-only
-;;; 3. Make ifdef-block hiding work outside of ifdefs.
-;;;
-;;; Revision 1.5 88/01/31 23:19:31 liberte
-;;; Major clean up.
-;;; Prefix internal names with "hif-".
-;;;
-;;; Revision 1.4 88/01/30 14:09:38 liberte
-;;; Add hide-ifdef-hiding and hide-ifdef-mode to minor-mode-alist.
-;;;
-;;; Revision 1.3 88/01/29 00:38:19 liberte
-;;; Fix three bugs.
-;;; 1. Function "defined" is just like lookup.
-;;; 2. Skip to newline or cr in case text is hidden.
-;;; 3. Use car of token list if just one symbol.
-;;;
-;;; Revision 1.2 88/01/28 23:32:46 liberte
-;;; Use hide-ifdef-mode-prefix-key.
-;;; Copy current-local-map so other buffers do not get
-;;; hide-ifdef-mode bindings.
-;;;
-
;;; Code:
(defvar hide-ifdef-mode-submap nil
)
; pattern to match initial identifier, !, &&, ||, (, or ).
-(defconst hif-token-regexp "^\\(!\\|&&\\|||\\|[()]\\|\\w+\\)")
+; Added ==, + and -: garyo@avs.com 8/9/94
+(defconst hif-token-regexp "^\\(!\\|&&\\|||\\|[!=]=\\|[()+-]\\|\\w+\\)")
(defconst hif-end-of-comment "\\*/")
(cond
((string-equal token "||") 'or)
((string-equal token "&&") 'and)
+ ((string-equal token "==") 'equal)
+ ((string-equal token "!=") 'hif-notequal)
((string-equal token "!") 'not)
((string-equal token "defined") 'hif-defined)
((string-equal token "(") 'lparen)
((string-equal token ")") 'rparen)
+ ((string-equal token "+") 'hif-plus)
+ ((string-equal token "-") 'hif-minus)
(t (intern token)))
token-list))))
-
(t (error "Bad #if expression: %s" expr-string)))))
(set-syntax-table current-syntax-table))
(nreverse token-list)))
;;;-----------------------------------------------------------------
;;; Translate C preprocessor #if expressions using recursive descent.
;;; This parser is limited to the operators &&, ||, !, and "defined".
+;;; Added ==, !=, +, and -. Gary Oberbrunner, garyo@avs.com, 8/9/94
(defun hif-parse-if-exp (token-list)
"Parse the TOKEN-LIST. Return translated list in prefix form."
(defun hif-term ()
"Parse a term of the form
- term : factor | term '&&' factor."
- (let ((result (hif-factor)))
+ term : eq-expr | term '&&' eq-expr."
+ (let ((result (hif-eq-expr)))
(while (eq token 'and)
(hif-nexttoken)
- (setq result (list 'and result (hif-factor))))
+ (setq result (list 'and result (hif-eq-expr))))
result))
+(defun hif-eq-expr ()
+ "Parse a term of the form
+ eq-expr : math | eq-expr '=='|'!=' math."
+ (let ((result (hif-math))
+ (eq-token nil))
+ (while (or (eq token 'equal) (eq token 'hif-notequal))
+ (setq eq-token token)
+ (hif-nexttoken)
+ (setq result (list eq-token result (hif-math))))
+ result))
+
+(defun hif-math ()
+ "Parse an expression of the form
+ math : factor | math '+|-' factor."
+ (let ((result (hif-factor))
+ (math-op nil))
+ (while (or (eq token 'hif-plus) (eq token 'hif-minus))
+ (setq math-op token)
+ (hif-nexttoken)
+ (setq result (list math-op result (hif-factor))))
+ result))
+
(defun hif-factor ()
"Parse a factor of the form
factor : '!' factor | '(' expr ')' | 'defined(' id ')' | id."
))
))
+(defun hif-mathify (val)
+ "Treat VAL as a number: if it's t or nil, use 1 or 0."
+ (cond ((eq val t)
+ 1)
+ ((null val)
+ 0)
+ (t val)))
+
+(defun hif-plus (a b)
+ "Like ordinary plus but treat t and nil as 1 and 0."
+ (+ (hif-mathify a) (hif-mathify b)))
+(defun hif-minus (a b)
+ "Like ordinary minus but treat t and nil as 1 and 0."
+ (- (hif-mathify a) (hif-mathify b)))
+(defun hif-notequal (a b)
+ "Like (not (equal A B)) but as one symbol."
+ (not (equal a b)))
+
;;;----------- end of parser -----------------------
(defun hide-ifdef-define (var)
"Define a VAR so that #ifdef VAR would be included."
(interactive "SDefine what? ")
- (hif-set-var var t)
+ (hif-set-var var 1)
(if hide-ifdef-hiding (hide-ifdefs)))
(defun hide-ifdef-undef (var)