Function: hif-find-define

hif-find-define is an interactive and byte-compiled function defined in hideif.el.gz.

Signature

(hif-find-define &optional MIN MAX)

Documentation

Parse texts and retrieve all defines within the region MIN and MAX.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/hideif.el.gz
(defun hif-find-define (&optional min max)
  "Parse texts and retrieve all defines within the region MIN and MAX."
  (interactive)
  (and min (goto-char min))
  (and (re-search-forward hif-define-regexp max t)
       (or
        (let* ((defining (string= "define" (match-string 2)))
               (name (and (re-search-forward hif-macroref-regexp max t)
                          (match-string 1)))
               (parmlist (or (and (match-string 3) ; First arg id found
                                  (delq 'hif-space
                                   (hif-parse-macro-arglist (match-string 2))))
                             (and (match-string 2) ; empty arglist
                                  (list nil)))))
          (if defining
              ;; Ignore name (still need to return 't), or define the name
              (or (and hide-ifdef-exclude-define-regexp
                       (string-match hide-ifdef-exclude-define-regexp
                                     name))

                  (let* ((start (point))
                         (end   (progn (hif-end-of-line) (point)))
                         (hif-simple-token-only nil) ; Dynamic binding
                         (tokens
                          (and name
                               (prog1 t
                                 (cl-incf hif-verbose-define-count)
                                 ;; only show 1/50 to not slow down to much
                                 (if (and hide-ifdef-verbose
                                          (= (% hif-verbose-define-count 50) 1))
                                     (message "[Line %d] defining %S"
                                              (line-number-at-pos (point))
                                              (substring-no-properties name))))
                               ;; `hif-simple-token-only' is set/clear
                               ;; only in this block
                               (condition-case nil
                                   ;; Prevent C statements like
                                   ;; 'do { ... } while (0)'
                                   (hif-tokenize start end)
                                 (error
                                  ;; We can't just return nil here since
                                  ;; this will stop hideif from searching
                                  ;; for more #defines.
                                  (setq hif-simple-token-only t)
                                  (replace-regexp-in-string
                                   "^[ \t]*\\|[ \t]*$"  ""
                                   (buffer-substring-no-properties
                                    start end))))))
                         ;; For simple tokens we save only the parsed result;
                         ;; otherwise we save the tokens and parse it after
                         ;; parameter replacement
                         (expr (and tokens
                                    ;; `hif-simple-token-only' is checked only
                                    ;; here.
                                    (or (and hif-simple-token-only
                                             (listp tokens)
                                             (= (length tokens) 1)
                                             (hif-parse-exp tokens))
                                        `(hif-define-macro ,parmlist
                                                           ,tokens))))
                         (SA (and name
                                  (assq (intern name) hide-ifdef-env))))
                    (and name
                         (if SA
                             (or (setcdr SA expr) t)
                           ;; Lazy evaluation, eval only if `hif-lookup' find it.
                           ;; Define it anyway, even if nil it's still in list
                           ;; and therefore considered defined.
                           (push (cons (intern name) expr) hide-ifdef-env)))))
            ;; #undef
            (and name
                 (intern-soft name)
                 (hif-undefine-symbol (intern name)))
            t)))
       t))