Annotation of 43BSD/contrib/emacs/lisp/mail-utils.el, revision 1.1

1.1     ! root        1: ;; Utility functions used both by rmail and rnews
        !             2: 
        !             3: ;; Copyright (C) 1985 Richard M. Stallman.
        !             4: 
        !             5: ;; This file is part of GNU Emacs.
        !             6: 
        !             7: ;; GNU Emacs is distributed in the hope that it will be useful,
        !             8: ;; but WITHOUT ANY WARRANTY.  No author or distributor
        !             9: ;; accepts responsibility to anyone for the consequences of using it
        !            10: ;; or for whether it serves any particular purpose or works at all,
        !            11: ;; unless he says so in writing.  Refer to the GNU Emacs General Public
        !            12: ;; License for full details.
        !            13: 
        !            14: ;; Everyone is granted permission to copy, modify and redistribute
        !            15: ;; GNU Emacs, but only under the conditions described in the
        !            16: ;; GNU Emacs General Public License.   A copy of this license is
        !            17: ;; supposed to have been given to you along with GNU Emacs so you
        !            18: ;; can know your rights and responsibilities.  It should be in a
        !            19: ;; file named COPYING.  Among other things, the copyright notice
        !            20: ;; and this notice must be preserved on all copies.
        !            21: 
        !            22: 
        !            23: (provide 'mail-utils)
        !            24:                     
        !            25: (defun mail-string-delete (string start end)
        !            26:   "Returns a string containing all of STRING except the part
        !            27: from START (inclusive) to END (exclusive)."
        !            28:   (if (null end) (substring string 0 start)
        !            29:     (concat (substring string 0 start)
        !            30:            (substring string end nil))))
        !            31: 
        !            32: (defun mail-strip-quoted-names (address)
        !            33:   "Delete comments and quoted strings in an address list ADDRESS.
        !            34: Also delete leading/trailing whitespace and replace FOO <BAR> with just BAR.
        !            35: Return a modified address list."
        !            36:   (let (pos)
        !            37:     (string-match "\\`[ \t\n]*" address)
        !            38:     ;; strip surrounding whitespace
        !            39:     (setq address (substring address
        !            40:                             (match-end 0)
        !            41:                             (string-match "[ \t\n]*\\'" address
        !            42:                                           (match-end 0))))
        !            43:     ;; strip rfc822 comments
        !            44:     (while (setq pos (string-match 
        !            45:                       ;; This doesn't hack rfc822 nested comments
        !            46:                       ;;  `(xyzzy (foo) whinge)' properly.  Big deal.
        !            47:                       "[ \t]*(\\([^)\"\\]\\|\\\\.\\|\\\\\n\\)*)"
        !            48:                       address))
        !            49:       (setq address
        !            50:            (mail-string-delete address
        !            51:                                pos (match-end 0))))
        !            52:     ;; strip `quoted' names (This is supposed to hack `"Foo Bar" <bar@host>')
        !            53:     (setq pos 0)
        !            54:     (while (setq pos (string-match
        !            55:                       "[ \t]*\"\\([^\"\\]\\|\\\\.\\|\\\\\n\\)*\"[ \t]*"
        !            56:                       address pos))
        !            57:       ;; If the next thing is "@", we have "foo bar"@host.  Leave it.
        !            58:       (if (and (> (length address) (match-end 0))
        !            59:               (= (aref address (match-end 0)) ?@))
        !            60:          (setq pos (match-end 0))
        !            61:        (setq address
        !            62:              (mail-string-delete address
        !            63:                                  pos (match-end 0)))))
        !            64:     ;; Retain only part of address in <> delims, if there is such a thing.
        !            65:     (while (setq pos (string-match "\\(,\\|^\\)[^,\n]*<\\([^>,\n]*>\\)" address))
        !            66:       (let ((junk-beg (match-end 1))
        !            67:            (junk-end (match-beginning 2))
        !            68:            (close (match-end 0)))
        !            69:        (setq address (mail-string-delete address (1- close) close))
        !            70:        (setq address (mail-string-delete address junk-beg junk-end))))
        !            71:     address))
        !            72:   
        !            73: ; rmail-dont-reply-to-names is defined in loaddefs
        !            74: (defun rmail-dont-reply-to (userids)
        !            75:   "Returns string of mail addresses USERIDS sans any recipients
        !            76: that are elements of  rmail-dont-reply-to-names.
        !            77: Usenet paths ending in an element of that list are removed also."
        !            78:   (if (null rmail-dont-reply-to-names)
        !            79:       (setq rmail-dont-reply-to-names
        !            80:            (concat "info-\\|"
        !            81:                    (regexp-quote (or (getenv "USER")
        !            82:                                      (getenv "LOGNAME")))
        !            83:                    "\\>")))
        !            84:   (let ((match (concat "\\(^\\|,\\)[ \t\n]*\\([^,\n]*!\\|\\)\\("
        !            85:                       rmail-dont-reply-to-names
        !            86:                       "\\)"))
        !            87:        (case-fold-search t)
        !            88:        pos epos)
        !            89:     (while (setq pos (string-match match userids))
        !            90:       (if (> pos 0) (setq pos (1+ pos)))
        !            91:       (setq epos
        !            92:            (if (string-match "[ \t\n,]+" userids (match-end 0))
        !            93:                (match-end 0)
        !            94:              (length userids)))
        !            95:       (setq userids
        !            96:            (mail-string-delete
        !            97:              userids pos epos)))
        !            98:     ;; get rid of any trailing commas
        !            99:     (if (setq pos (string-match "[ ,\t\n]*\\'" userids))
        !           100:        (setq userids (substring userids 0 pos)))
        !           101:     ;; remove leading spaces. they bother me.
        !           102:     (if (string-match "\\s *" userids)
        !           103:        (substring userids (match-end 0))
        !           104:       userids)))
        !           105: 
        !           106: (defun mail-fetch-field (field-name &optional last all)
        !           107:   "Return the value of the header field FIELD.
        !           108: The buffer is expected to be narrowed to just the headers of the message.
        !           109: If 2nd arg LAST is non-nil, use the last such field if there are several.
        !           110: If 3rd arg ALL is non-nil, concatenate all such fields, with commas between."
        !           111:   (save-excursion
        !           112:     (goto-char (point-min))
        !           113:     (let ((case-fold-search t)
        !           114:          (name (concat "^" (regexp-quote field-name) "[ \t]*:[ \t]*")))
        !           115:       (goto-char (point-min))
        !           116:       (if all
        !           117:          (let ((value ""))
        !           118:            (while (re-search-forward name nil t)
        !           119:              (let ((opoint (point)))
        !           120:                (while (progn (forward-line 1)
        !           121:                              (looking-at "[ \t]")))
        !           122:                (setq value (concat value
        !           123:                                    (if (string= value "") "" ", ")
        !           124:                                    (buffer-substring opoint (1- (point)))))))
        !           125:            (and (not (string= value "")) value))
        !           126:        (if (re-search-forward name nil t)
        !           127:            (progn
        !           128:              (if last (while (re-search-forward name nil t)))
        !           129:              (let ((opoint (point)))
        !           130:                (while (progn (forward-line 1)
        !           131:                              (looking-at "[ \t]")))
        !           132:                (buffer-substring opoint (1- (point))))))))))
        !           133: 
        !           134: ;; Parse a list of tokens separated by commas.
        !           135: ;; It runs from point to the end of the visible part of the buffer.
        !           136: ;; Whitespace before or after tokens is ignored,
        !           137: ;; but whitespace within tokens is kept.
        !           138: (defun mail-parse-comma-list ()
        !           139:   (let (accumulated
        !           140:        beg)
        !           141:     (skip-chars-forward " ")
        !           142:     (while (not (eobp))
        !           143:       (setq beg (point))
        !           144:       (skip-chars-forward "^,")
        !           145:       (skip-chars-backward " ")
        !           146:       (setq accumulated
        !           147:            (cons (buffer-substring beg (point))
        !           148:                  accumulated))
        !           149:       (skip-chars-forward "^,")
        !           150:       (skip-chars-forward ", "))
        !           151:     accumulated))
        !           152: 
        !           153: (defun mail-comma-list-regexp (labels)
        !           154:   (let (pos)
        !           155:     (setq pos (or (string-match "[^ \t]" labels) 0))
        !           156:     ;; Remove leading and trailing whitespace.
        !           157:     (setq labels (substring labels pos (string-match "[ \t]*$" labels pos)))
        !           158:     ;; Change each comma to \|, and flush surrounding whitespace.
        !           159:     (while (setq pos (string-match "[ \t]*,[ \t]*" labels))
        !           160:       (setq labels
        !           161:            (concat (substring labels 0 pos)
        !           162:                    "\\|"
        !           163:                    (substring labels (match-end 0))))))
        !           164:   labels)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.