Function: cperl-xsub-scan
cperl-xsub-scan is a byte-compiled function defined in
cperl-mode.el.gz.
Signature
(cperl-xsub-scan)
Documentation
Scan for XS subroutines.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/cperl-mode.el.gz
(defun cperl-xsub-scan ()
"Scan for XS subroutines."
(require 'imenu)
(let ((index-alist '())
index index1 name package prefix)
(goto-char (point-min))
;; Search for the function
(progn ;;save-match-data
(while (re-search-forward
;; FIXME: Should XS code be unicode aware? Recent C
;; compilers (Gcc 10+) are, but I guess this isn't used
;; much. -- haj, 2021-09-14
"^\\([ \t]*MODULE\\>[^\n]*\\<PACKAGE[ \t]*=[ \t]*\\([a-zA-Z_][a-zA-Z_0-9:]*\\)\\>\\|\\([a-zA-Z_][a-zA-Z_0-9]*\\)(\\|[ \t]*BOOT:\\)"
nil t)
(cond
((match-beginning 2) ; SECTION
(setq package (buffer-substring (match-beginning 2) (match-end 2)))
(goto-char (match-beginning 0))
(skip-chars-forward " \t")
(forward-char 1)
(if (looking-at "[^\n]*\\<PREFIX[ \t]*=[ \t]*\\([a-zA-Z_][a-zA-Z_0-9]*\\)\\>")
(setq prefix (buffer-substring (match-beginning 1) (match-end 1)))
(setq prefix nil)))
((not package) nil) ; C language section
((match-beginning 3) ; XSUB
(goto-char (1+ (match-beginning 3)))
(setq index (cperl-imenu-name-and-position))
(setq name (buffer-substring (match-beginning 3) (match-end 3)))
(if (and prefix (string-match (concat "^" prefix) name))
(setq name (substring name (length prefix))))
(cond ((string-match "::" name) nil)
(t
(setq index1 (cons (concat package "::" name) (cdr index)))
(push index1 index-alist)))
(setcar index name)
(push index index-alist))
(t ; BOOT: section
;; (beginning-of-line)
(setq index (cperl-imenu-name-and-position))
(setcar index (concat package "::BOOT:"))
(push index index-alist)))))
index-alist))