Function: Info-read-subfile
Info-read-subfile is a byte-compiled function defined in info.el.gz.
Signature
(Info-read-subfile NODEPOS)
Source Code
;; Defined in /usr/src/emacs/lisp/info.el.gz
;; Note that on entry to this function the current-buffer must be the
;; *info* buffer; not the info tags buffer.
(defun Info-read-subfile (nodepos)
;; NODEPOS is either a position in bytes (in the Info file as a whole,
;; not relative to a subfile) or the name of a subfile.
(let (lastfilepos
lastfilename)
(if (numberp nodepos)
(with-current-buffer (marker-buffer Info-tag-table-marker)
(goto-char (point-min))
(or (looking-at "\^_")
(search-forward "\n\^_"))
(forward-line 2)
(catch 'foo
(while (not (looking-at "\^_"))
(if (not (eolp))
(let ((beg (point))
thisfilepos thisfilename)
(search-forward ": ")
(setq thisfilename (buffer-substring beg (- (point) 2)))
(setq thisfilepos (read (current-buffer)))
;; read in version 19 stops at the end of number.
;; Advance to the next line.
(forward-line 1)
(if (> thisfilepos nodepos)
(throw 'foo t))
(setq lastfilename thisfilename)
(setq lastfilepos thisfilepos))
(forward-line 1)))))
(setq lastfilename nodepos)
(setq lastfilepos 0))
;; Assume previous buffer is in Info-mode.
;; (set-buffer (get-buffer "*info*"))
(or (equal Info-current-subfile lastfilename)
(let ((inhibit-read-only t))
(setq buffer-file-name nil)
(widen)
(erase-buffer)
(info-insert-file-contents lastfilename)
(set-buffer-modified-p nil)
(setq Info-current-subfile lastfilename)))
;; Widen in case we are in the same subfile as before.
(widen)
(goto-char (point-min))
;; Skip the summary segment for `Info-search'.
(if (looking-at "\^_")
(forward-char 1)
(search-forward "\n\^_"))
(if (numberp nodepos)
;; Our caller ('Info-find-node-2') wants the (zero-based) byte
;; offset corresponding to NODEPOS, from the beginning of the
;; subfile. This is especially important if NODEPOS is for an
;; anchor reference, because for those the position is all we
;; have.
(+ (- nodepos lastfilepos) (bufferpos-to-filepos (point) 'exact)))))