Function: bibtex-prepare-new-entry
bibtex-prepare-new-entry is a byte-compiled function defined in
bibtex.el.gz.
Signature
(bibtex-prepare-new-entry INDEX)
Documentation
Prepare a new BibTeX entry with index INDEX.
INDEX is a list (KEY CROSSREF-KEY ENTRY-TYPE).
Move point where the entry KEY should be placed.
If bibtex-maintain-sorted-entries is non-nil, perform a binary
search to look for place for KEY. This requires that buffer is sorted,
see bibtex-validate.
Return t if preparation was successful or nil if entry KEY already exists.
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/bibtex.el.gz
(defun bibtex-prepare-new-entry (index)
"Prepare a new BibTeX entry with index INDEX.
INDEX is a list (KEY CROSSREF-KEY ENTRY-TYPE).
Move point where the entry KEY should be placed.
If `bibtex-maintain-sorted-entries' is non-nil, perform a binary
search to look for place for KEY. This requires that buffer is sorted,
see `bibtex-validate'.
Return t if preparation was successful or nil if entry KEY already exists."
(bibtex-init-sort) ; Needed by `bibtex-lessp'.
(let ((key (nth 0 index))
key-exist)
(cond ((or (null key)
(and (stringp key)
(string-equal key ""))
(and (not (setq key-exist (bibtex-search-entry key)))
(not bibtex-maintain-sorted-entries)))
(bibtex-move-outside-of-entry))
;; if key-exist is non-nil due to the previous cond clause
;; then point will be at beginning of entry named key.
(key-exist)
(t ; `bibtex-maintain-sorted-entries' is non-nil
(let* ((case-fold-search t)
(left (save-excursion (bibtex-beginning-of-first-entry)))
(bounds (save-excursion (goto-char (point-max))
(bibtex-skip-to-valid-entry t)))
(right (if bounds (cdr bounds) (point-min)))
(found (if (>= left right) left))
actual-index new)
(save-excursion
;; Binary search
(while (not found)
(goto-char (/ (+ left right) 2))
(bibtex-skip-to-valid-entry t)
(setq actual-index (bibtex-entry-index))
(cond ((bibtex-lessp index actual-index)
(setq new (bibtex-beginning-of-entry))
(if (equal right new)
(setq found right)
(setq right new)))
(t
(bibtex-end-of-entry)
(bibtex-skip-to-valid-entry)
(setq new (point))
(if (equal left new)
(setq found right)
(setq left new))))))
(goto-char found)
(bibtex-beginning-of-entry)
(setq actual-index (save-excursion (bibtex-entry-index)))
(when (or (not actual-index)
(bibtex-lessp actual-index index))
;; buffer contains no valid entries or
;; greater than last entry --> append
(bibtex-end-of-entry)
(unless (bobp) (newline (forward-line 2)))
(beginning-of-line)))))
(unless key-exist t)))