Function: mailcap-parse-mailcap
mailcap-parse-mailcap is a byte-compiled function defined in
mailcap.el.gz.
Signature
(mailcap-parse-mailcap FNAME &optional SOURCE)
Documentation
Parse out the mailcap file specified by FNAME.
If SOURCE, mark the entry with this as the source.
Source Code
;; Defined in /usr/src/emacs/lisp/net/mailcap.el.gz
(defun mailcap-parse-mailcap (fname &optional source)
"Parse out the mailcap file specified by FNAME.
If SOURCE, mark the entry with this as the source."
(let (major ; The major mime type (image/audio/etc)
minor ; The minor mime type (gif, basic, etc)
save-pos ; Misc saved positions used in parsing
viewer ; How to view this mime type
info ; Misc info about this mime type
)
(with-temp-buffer
(insert-file-contents fname)
(set-syntax-table mailcap-parse-args-syntax-table)
(mailcap-replace-regexp "#.*" "") ; Remove all comments
(mailcap-replace-regexp "\\\\[ \t]*\n" " ") ; And collapse spaces
(mailcap-replace-regexp "\n+" "\n") ; And blank lines
(goto-char (point-max))
(skip-chars-backward " \t\n")
(delete-region (point) (point-max))
(while (not (bobp))
(skip-chars-backward " \t\n")
(beginning-of-line)
(setq save-pos (point)
info nil)
(skip-chars-forward "^/; \t\n")
(downcase-region save-pos (point))
(setq major (buffer-substring save-pos (point)))
(skip-chars-forward " \t")
(setq minor "")
(when (eq (char-after) ?/)
(forward-char)
(skip-chars-forward " \t")
(setq save-pos (point))
(skip-chars-forward "^; \t\n")
(downcase-region save-pos (point))
(setq minor
(cond
((eq ?* (or (char-after save-pos) 0)) ".*")
((= (point) save-pos) ".*")
(t (regexp-quote (buffer-substring save-pos (point)))))))
(skip-chars-forward " \t")
;;; Got the major/minor chunks, now for the viewers/etc
;;; The first item _must_ be a viewer, according to the
;;; RFC for mailcap files (#1524)
(setq viewer "")
(when (eq (char-after) ?\;)
(forward-char)
(skip-chars-forward " \t")
(setq save-pos (point))
(skip-chars-forward "^;\n")
;; skip \;
(while (eq (char-before) ?\\)
(backward-delete-char 1)
(forward-char)
(skip-chars-forward "^;\n"))
(if (eq (or (char-after save-pos) 0) ?')
(setq viewer (progn
(narrow-to-region (1+ save-pos) (point))
(goto-char (point-min))
(prog1
(read (current-buffer))
(goto-char (point-max))
(widen))))
(setq viewer (buffer-substring save-pos (point)))))
(setq save-pos (point))
(end-of-line)
(unless (equal viewer "")
(setq info (nconc (list (cons 'viewer viewer)
(cons 'type (concat major "/"
(if (string= minor ".*")
"*" minor))))
(mailcap-parse-mailcap-extras save-pos (point))))
(mailcap-mailcap-entry-passes-test info)
;; Record where the data came from.
(when source
(setq info (nconc info (list (cons 'source source)))))
(mailcap-add-mailcap-entry major minor info))
(beginning-of-line)))))