diff options
| -rw-r--r-- | lisp/mail/mail-extr.el | 663 |
1 files changed, 322 insertions, 341 deletions
diff --git a/lisp/mail/mail-extr.el b/lisp/mail/mail-extr.el index d6a1f9ffe1c..f88f2565691 100644 --- a/lisp/mail/mail-extr.el +++ b/lisp/mail/mail-extr.el | |||
| @@ -511,24 +511,20 @@ by translating things like \"foo!bar!baz@host\" into \"baz@bar.UUCP\"." | |||
| 511 | (defconst mail-extr-address-domain-literal-syntax-table (make-syntax-table)) | 511 | (defconst mail-extr-address-domain-literal-syntax-table (make-syntax-table)) |
| 512 | (defconst mail-extr-address-text-comment-syntax-table (make-syntax-table)) | 512 | (defconst mail-extr-address-text-comment-syntax-table (make-syntax-table)) |
| 513 | (defconst mail-extr-address-text-syntax-table (make-syntax-table)) | 513 | (defconst mail-extr-address-text-syntax-table (make-syntax-table)) |
| 514 | (mapcar | 514 | (mapc |
| 515 | (function | 515 | (lambda (pair) |
| 516 | (lambda (pair) | 516 | (let ((syntax-table (symbol-value (car pair)))) |
| 517 | (let ((syntax-table (symbol-value (car pair)))) | 517 | (dolist (item (cdr pair)) |
| 518 | (mapcar | 518 | (if (eq 2 (length item)) |
| 519 | (function | 519 | ;; modifying syntax of a single character |
| 520 | (lambda (item) | 520 | (modify-syntax-entry (car item) (car (cdr item)) syntax-table) |
| 521 | (if (eq 2 (length item)) | 521 | ;; modifying syntax of a range of characters |
| 522 | ;; modifying syntax of a single character | 522 | (let ((char (nth 0 item)) |
| 523 | (modify-syntax-entry (car item) (car (cdr item)) syntax-table) | 523 | (bound (nth 1 item)) |
| 524 | ;; modifying syntax of a range of characters | 524 | (syntax (nth 2 item))) |
| 525 | (let ((char (nth 0 item)) | 525 | (while (<= char bound) |
| 526 | (bound (nth 1 item)) | 526 | (modify-syntax-entry char syntax syntax-table) |
| 527 | (syntax (nth 2 item))) | 527 | (setq char (1+ char)))))))) |
| 528 | (while (<= char bound) | ||
| 529 | (modify-syntax-entry char syntax syntax-table) | ||
| 530 | (setq char (1+ char))))))) | ||
| 531 | (cdr pair))))) | ||
| 532 | '((mail-extr-address-syntax-table | 528 | '((mail-extr-address-syntax-table |
| 533 | (?\000 ?\037 "w") ;control characters | 529 | (?\000 ?\037 "w") ;control characters |
| 534 | (?\040 " ") ;SPC | 530 | (?\040 " ") ;SPC |
| @@ -618,11 +614,6 @@ by translating things like \"foo!bar!baz@host\" into \"baz@bar.UUCP\"." | |||
| 618 | ;; Utility functions and macros. | 614 | ;; Utility functions and macros. |
| 619 | ;; | 615 | ;; |
| 620 | 616 | ||
| 621 | (defsubst mail-extr-delete-char (n) | ||
| 622 | ;; in v19, delete-char is compiled as a function call, but delete-region | ||
| 623 | ;; is byte-coded, so it's much much faster. | ||
| 624 | (delete-region (point) (+ (point) n))) | ||
| 625 | |||
| 626 | (defsubst mail-extr-skip-whitespace-forward () | 617 | (defsubst mail-extr-skip-whitespace-forward () |
| 627 | ;; v19 fn skip-syntax-forward is more tasteful, but not byte-coded. | 618 | ;; v19 fn skip-syntax-forward is more tasteful, but not byte-coded. |
| 628 | (skip-chars-forward " \t\n\r\240")) | 619 | (skip-chars-forward " \t\n\r\240")) |
| @@ -639,14 +630,14 @@ by translating things like \"foo!bar!baz@host\" into \"baz@bar.UUCP\"." | |||
| 639 | (goto-char (point-min)) | 630 | (goto-char (point-min)) |
| 640 | ;; undo \ quoting | 631 | ;; undo \ quoting |
| 641 | (while (search-forward "\\" nil t) | 632 | (while (search-forward "\\" nil t) |
| 642 | (mail-extr-delete-char -1) | 633 | (delete-char -1) |
| 643 | (or (eobp) | 634 | (or (eobp) |
| 644 | (forward-char 1)))))) | 635 | (forward-char 1)))))) |
| 645 | 636 | ||
| 646 | (defsubst mail-extr-nuke-char-at (pos) | 637 | (defsubst mail-extr-nuke-char-at (pos) |
| 647 | (save-excursion | 638 | (save-excursion |
| 648 | (goto-char pos) | 639 | (goto-char pos) |
| 649 | (mail-extr-delete-char 1) | 640 | (delete-char 1) |
| 650 | (insert ?\ ))) | 641 | (insert ?\ ))) |
| 651 | 642 | ||
| 652 | (put 'mail-extr-nuke-outside-range | 643 | (put 'mail-extr-nuke-outside-range |
| @@ -655,27 +646,28 @@ by translating things like \"foo!bar!baz@host\" into \"baz@bar.UUCP\"." | |||
| 655 | (defmacro mail-extr-nuke-outside-range (list-symbol | 646 | (defmacro mail-extr-nuke-outside-range (list-symbol |
| 656 | beg-symbol end-symbol | 647 | beg-symbol end-symbol |
| 657 | &optional no-replace) | 648 | &optional no-replace) |
| 658 | ;; LIST-SYMBOL names a variable holding a list of buffer positions | 649 | "Delete all elements outside BEG..END in LIST. |
| 659 | ;; BEG-SYMBOL and END-SYMBOL name variables delimiting a range | 650 | LIST-SYMBOL names a variable holding a list of buffer positions |
| 660 | ;; Each element of LIST-SYMBOL which lies outside of the range is | 651 | BEG-SYMBOL and END-SYMBOL name variables delimiting a range |
| 661 | ;; deleted from the list. | 652 | Each element of LIST-SYMBOL which lies outside of the range is |
| 662 | ;; Unless NO-REPLACE is true, at each of the positions in LIST-SYMBOL | 653 | deleted from the list. |
| 663 | ;; which lie outside of the range, one character at that position is | 654 | Unless NO-REPLACE is true, at each of the positions in LIST-SYMBOL |
| 664 | ;; replaced with a SPC. | 655 | which lie outside of the range, one character at that position is |
| 656 | replaced with a SPC." | ||
| 665 | (or (memq no-replace '(t nil)) | 657 | (or (memq no-replace '(t nil)) |
| 666 | (error "no-replace must be t or nil, evaluable at macroexpand-time")) | 658 | (error "no-replace must be t or nil, evaluable at macroexpand-time")) |
| 667 | (` (let ((temp (, list-symbol)) | 659 | `(let ((temp ,list-symbol) |
| 668 | ch) | 660 | ch) |
| 669 | (while temp | 661 | (while temp |
| 670 | (setq ch (car temp)) | 662 | (setq ch (car temp)) |
| 671 | (cond ((or (> ch (, end-symbol)) | 663 | (when (or (> ch ,end-symbol) |
| 672 | (< ch (, beg-symbol))) | 664 | (< ch ,beg-symbol)) |
| 673 | (,@ (if no-replace | 665 | ,@(if no-replace |
| 674 | nil | 666 | nil |
| 675 | (` ((mail-extr-nuke-char-at ch))))) | 667 | `((mail-extr-nuke-char-at ch))) |
| 676 | (setcar temp nil))) | 668 | (setcar temp nil)) |
| 677 | (setq temp (cdr temp))) | 669 | (setq temp (cdr temp))) |
| 678 | (setq (, list-symbol) (delq nil (, list-symbol)))))) | 670 | (setq ,list-symbol (delq nil ,list-symbol)))) |
| 679 | 671 | ||
| 680 | (defun mail-extr-demarkerize (marker) | 672 | (defun mail-extr-demarkerize (marker) |
| 681 | ;; if arg is a marker, destroys the marker, then returns the old value. | 673 | ;; if arg is a marker, destroys the marker, then returns the old value. |
| @@ -909,27 +901,25 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 909 | ;; If multiple @s and a :, but no < and >, insert around buffer. | 901 | ;; If multiple @s and a :, but no < and >, insert around buffer. |
| 910 | ;; Example: @foo.bar.dom,@xxx.yyy.zzz:mailbox@aaa.bbb.ccc | 902 | ;; Example: @foo.bar.dom,@xxx.yyy.zzz:mailbox@aaa.bbb.ccc |
| 911 | ;; This commonly happens on the UUCP "From " line. Ugh. | 903 | ;; This commonly happens on the UUCP "From " line. Ugh. |
| 912 | (cond ((and (> (length @-pos) 1) | 904 | (when (and (> (length @-pos) 1) |
| 913 | (eq 1 (length colon-pos)) ;TODO: check if between last two @s | 905 | (eq 1 (length colon-pos)) ;TODO: check if between last two @s |
| 914 | (not \;-pos) | 906 | (not \;-pos) |
| 915 | (not <-pos)) | 907 | (not <-pos)) |
| 916 | (goto-char (point-min)) | 908 | (goto-char (point-min)) |
| 917 | (mail-extr-delete-char 1) | 909 | (delete-char 1) |
| 918 | (setq <-pos (list (point))) | 910 | (setq <-pos (list (point))) |
| 919 | (insert ?<))) | 911 | (insert ?<)) |
| 920 | 912 | ||
| 921 | ;; If < but no >, insert > in rightmost possible position | 913 | ;; If < but no >, insert > in rightmost possible position |
| 922 | (cond ((and <-pos | 914 | (when (and <-pos (null >-pos)) |
| 923 | (null >-pos)) | 915 | (goto-char (point-max)) |
| 924 | (goto-char (point-max)) | 916 | (setq >-pos (list (point))) |
| 925 | (setq >-pos (list (point))) | 917 | (insert ?>)) |
| 926 | (insert ?>))) | ||
| 927 | 918 | ||
| 928 | ;; If > but no <, replace > with space. | 919 | ;; If > but no <, replace > with space. |
| 929 | (cond ((and >-pos | 920 | (when (and >-pos (null <-pos)) |
| 930 | (null <-pos)) | 921 | (mail-extr-nuke-char-at (car >-pos)) |
| 931 | (mail-extr-nuke-char-at (car >-pos)) | 922 | (setq >-pos nil)) |
| 932 | (setq >-pos nil))) | ||
| 933 | 923 | ||
| 934 | ;; Turn >-pos and <-pos into non-lists | 924 | ;; Turn >-pos and <-pos into non-lists |
| 935 | (setq >-pos (car >-pos) | 925 | (setq >-pos (car >-pos) |
| @@ -937,15 +927,15 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 937 | 927 | ||
| 938 | ;; Trim other punctuation lists of items outside < > pair to handle | 928 | ;; Trim other punctuation lists of items outside < > pair to handle |
| 939 | ;; stupid MTAs. | 929 | ;; stupid MTAs. |
| 940 | (cond (<-pos ; don't need to check >-pos also | 930 | (when <-pos ; don't need to check >-pos also |
| 941 | ;; handle bozo software that violates RFC 822 by sticking | 931 | ;; handle bozo software that violates RFC 822 by sticking |
| 942 | ;; punctuation marks outside of a < > pair | 932 | ;; punctuation marks outside of a < > pair |
| 943 | (mail-extr-nuke-outside-range @-pos <-pos >-pos t) | 933 | (mail-extr-nuke-outside-range @-pos <-pos >-pos t) |
| 944 | ;; RFC 822 says nothing about these two outside < >, but | 934 | ;; RFC 822 says nothing about these two outside < >, but |
| 945 | ;; remove those positions from the lists to make things | 935 | ;; remove those positions from the lists to make things |
| 946 | ;; easier. | 936 | ;; easier. |
| 947 | (mail-extr-nuke-outside-range !-pos <-pos >-pos t) | 937 | (mail-extr-nuke-outside-range !-pos <-pos >-pos t) |
| 948 | (mail-extr-nuke-outside-range %-pos <-pos >-pos t))) | 938 | (mail-extr-nuke-outside-range %-pos <-pos >-pos t)) |
| 949 | 939 | ||
| 950 | ;; Check for : that indicates GROUP list and for : part of | 940 | ;; Check for : that indicates GROUP list and for : part of |
| 951 | ;; ROUTE-ADDR spec. | 941 | ;; ROUTE-ADDR spec. |
| @@ -982,19 +972,18 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 982 | (setq group-\;-pos temp)))) | 972 | (setq group-\;-pos temp)))) |
| 983 | 973 | ||
| 984 | ;; Nuke unmatched GROUP syntax characters. | 974 | ;; Nuke unmatched GROUP syntax characters. |
| 985 | (cond ((and group-:-pos (not group-\;-pos)) | 975 | (when (and group-:-pos (not group-\;-pos)) |
| 986 | ;; *** Do I really need to erase it? | 976 | ;; *** Do I really need to erase it? |
| 987 | (mail-extr-nuke-char-at group-:-pos) | 977 | (mail-extr-nuke-char-at group-:-pos) |
| 988 | (setq group-:-pos nil))) | 978 | (setq group-:-pos nil)) |
| 989 | (cond ((and group-\;-pos (not group-:-pos)) | 979 | (when (and group-\;-pos (not group-:-pos)) |
| 990 | ;; *** Do I really need to erase it? | 980 | ;; *** Do I really need to erase it? |
| 991 | (mail-extr-nuke-char-at group-\;-pos) | 981 | (mail-extr-nuke-char-at group-\;-pos) |
| 992 | (setq group-\;-pos nil))) | 982 | (setq group-\;-pos nil)) |
| 993 | 983 | ||
| 994 | ;; Handle junk like ";@host.company.dom" that sendmail adds. | 984 | ;; Handle junk like ";@host.company.dom" that sendmail adds. |
| 995 | ;; **** should I remember comment positions? | 985 | ;; **** should I remember comment positions? |
| 996 | (cond | 986 | (when group-\;-pos |
| 997 | (group-\;-pos | ||
| 998 | ;; this is fine for now | 987 | ;; this is fine for now |
| 999 | (mail-extr-nuke-outside-range !-pos group-:-pos group-\;-pos t) | 988 | (mail-extr-nuke-outside-range !-pos group-:-pos group-\;-pos t) |
| 1000 | (mail-extr-nuke-outside-range @-pos group-:-pos group-\;-pos t) | 989 | (mail-extr-nuke-outside-range @-pos group-:-pos group-\;-pos t) |
| @@ -1018,7 +1007,7 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1018 | ;; *** The entire handling of GROUP addresses seems rather lame. | 1007 | ;; *** The entire handling of GROUP addresses seems rather lame. |
| 1019 | ;; *** It deserves a complete rethink, except that these addresses | 1008 | ;; *** It deserves a complete rethink, except that these addresses |
| 1020 | ;; *** are hardly ever seen. | 1009 | ;; *** are hardly ever seen. |
| 1021 | )) | 1010 | ) |
| 1022 | 1011 | ||
| 1023 | ;; Any commas must be between < and : of ROUTE-ADDR. Nuke any | 1012 | ;; Any commas must be between < and : of ROUTE-ADDR. Nuke any |
| 1024 | ;; others. | 1013 | ;; others. |
| @@ -1032,57 +1021,55 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1032 | ;; handled above. | 1021 | ;; handled above. |
| 1033 | 1022 | ||
| 1034 | ;; Locate PHRASE part of ROUTE-ADDR. | 1023 | ;; Locate PHRASE part of ROUTE-ADDR. |
| 1035 | (cond (<-pos | 1024 | (when <-pos |
| 1036 | (goto-char <-pos) | 1025 | (goto-char <-pos) |
| 1037 | (mail-extr-skip-whitespace-backward) | 1026 | (mail-extr-skip-whitespace-backward) |
| 1038 | (setq phrase-end (point)) | 1027 | (setq phrase-end (point)) |
| 1039 | (goto-char (or ;;group-:-pos | 1028 | (goto-char (or ;;group-:-pos |
| 1040 | (point-min))) | 1029 | (point-min))) |
| 1041 | (mail-extr-skip-whitespace-forward) | 1030 | (mail-extr-skip-whitespace-forward) |
| 1042 | (if (< (point) phrase-end) | 1031 | (if (< (point) phrase-end) |
| 1043 | (setq phrase-beg (point)) | 1032 | (setq phrase-beg (point)) |
| 1044 | (setq phrase-end nil)))) | 1033 | (setq phrase-end nil))) |
| 1045 | 1034 | ||
| 1046 | ;; handle ROUTE-ADDRS with real ROUTEs. | 1035 | ;; handle ROUTE-ADDRS with real ROUTEs. |
| 1047 | ;; If there are multiple @s, then we assume ROUTE-ADDR syntax, and | 1036 | ;; If there are multiple @s, then we assume ROUTE-ADDR syntax, and |
| 1048 | ;; any % or ! must be semantically meaningless. | 1037 | ;; any % or ! must be semantically meaningless. |
| 1049 | ;; TODO: do this processing into canonicalization buffer | 1038 | ;; TODO: do this processing into canonicalization buffer |
| 1050 | (cond (route-addr-:-pos | 1039 | (when route-addr-:-pos |
| 1051 | (setq !-pos nil | 1040 | (setq !-pos nil |
| 1052 | %-pos nil | 1041 | %-pos nil |
| 1053 | >-pos (copy-marker >-pos) | 1042 | >-pos (copy-marker >-pos) |
| 1054 | route-addr-:-pos (copy-marker route-addr-:-pos)) | 1043 | route-addr-:-pos (copy-marker route-addr-:-pos)) |
| 1055 | (goto-char >-pos) | 1044 | (goto-char >-pos) |
| 1056 | (insert-before-markers ?X) | 1045 | (insert-before-markers ?X) |
| 1057 | (goto-char (car @-pos)) | 1046 | (goto-char (car @-pos)) |
| 1058 | (while (setq @-pos (cdr @-pos)) | 1047 | (while (setq @-pos (cdr @-pos)) |
| 1059 | (mail-extr-delete-char 1) | 1048 | (delete-char 1) |
| 1060 | (setq %-pos (cons (point-marker) %-pos)) | 1049 | (setq %-pos (cons (point-marker) %-pos)) |
| 1061 | (insert "%") | 1050 | (insert "%") |
| 1062 | (goto-char (1- >-pos)) | 1051 | (goto-char (1- >-pos)) |
| 1063 | (save-excursion | 1052 | (save-excursion |
| 1064 | (insert-buffer-substring extraction-buffer | 1053 | (insert-buffer-substring extraction-buffer |
| 1065 | (car @-pos) route-addr-:-pos) | 1054 | (car @-pos) route-addr-:-pos) |
| 1066 | (delete-region (car @-pos) route-addr-:-pos)) | 1055 | (delete-region (car @-pos) route-addr-:-pos)) |
| 1067 | (or (cdr @-pos) | 1056 | (or (cdr @-pos) |
| 1068 | (setq saved-@-pos (list (point))))) | 1057 | (setq saved-@-pos (list (point))))) |
| 1069 | (setq @-pos saved-@-pos) | 1058 | (setq @-pos saved-@-pos) |
| 1070 | (goto-char >-pos) | 1059 | (goto-char >-pos) |
| 1071 | (mail-extr-delete-char -1) | 1060 | (delete-char -1) |
| 1072 | (mail-extr-nuke-char-at route-addr-:-pos) | 1061 | (mail-extr-nuke-char-at route-addr-:-pos) |
| 1073 | (mail-extr-demarkerize route-addr-:-pos) | 1062 | (mail-extr-demarkerize route-addr-:-pos) |
| 1074 | (setq route-addr-:-pos nil | 1063 | (setq route-addr-:-pos nil |
| 1075 | >-pos (mail-extr-demarkerize >-pos) | 1064 | >-pos (mail-extr-demarkerize >-pos) |
| 1076 | %-pos (mapcar 'mail-extr-demarkerize %-pos)))) | 1065 | %-pos (mapcar 'mail-extr-demarkerize %-pos))) |
| 1077 | 1066 | ||
| 1078 | ;; de-listify @-pos | 1067 | ;; de-listify @-pos |
| 1079 | (setq @-pos (car @-pos)) | 1068 | (setq @-pos (car @-pos)) |
| 1080 | 1069 | ||
| 1081 | ;; TODO: remove comments in the middle of an address | 1070 | ;; TODO: remove comments in the middle of an address |
| 1082 | 1071 | ||
| 1083 | (save-excursion | 1072 | (with-current-buffer canonicalization-buffer |
| 1084 | (set-buffer canonicalization-buffer) | ||
| 1085 | |||
| 1086 | (widen) | 1073 | (widen) |
| 1087 | (erase-buffer) | 1074 | (erase-buffer) |
| 1088 | (insert-buffer-substring extraction-buffer) | 1075 | (insert-buffer-substring extraction-buffer) |
| @@ -1097,8 +1084,7 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1097 | (narrow-to-region first-real-pos last-real-pos) | 1084 | (narrow-to-region first-real-pos last-real-pos) |
| 1098 | ;; ****** Oh no! What if the address is completely empty! | 1085 | ;; ****** Oh no! What if the address is completely empty! |
| 1099 | ;; *** Is this correct? | 1086 | ;; *** Is this correct? |
| 1100 | (narrow-to-region (point-max) (point-max)) | 1087 | (narrow-to-region (point-max) (point-max)))) |
| 1101 | )) | ||
| 1102 | 1088 | ||
| 1103 | (and @-pos %-pos | 1089 | (and @-pos %-pos |
| 1104 | (mail-extr-nuke-outside-range %-pos (point-min) @-pos)) | 1090 | (mail-extr-nuke-outside-range %-pos (point-min) @-pos)) |
| @@ -1110,118 +1096,119 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1110 | ;; Error condition:?? (and %-pos (not @-pos)) | 1096 | ;; Error condition:?? (and %-pos (not @-pos)) |
| 1111 | 1097 | ||
| 1112 | ;; WARNING: THIS CODE IS DUPLICATED BELOW. | 1098 | ;; WARNING: THIS CODE IS DUPLICATED BELOW. |
| 1113 | (cond ((and %-pos | 1099 | (when (and %-pos (not @-pos)) |
| 1114 | (not @-pos)) | 1100 | (goto-char (car %-pos)) |
| 1115 | (goto-char (car %-pos)) | 1101 | (delete-char 1) |
| 1116 | (mail-extr-delete-char 1) | 1102 | (setq @-pos (point)) |
| 1117 | (setq @-pos (point)) | 1103 | (insert "@") |
| 1118 | (insert "@") | 1104 | (setq %-pos (cdr %-pos))) |
| 1119 | (setq %-pos (cdr %-pos)))) | 1105 | |
| 1120 | 1106 | (when (and mail-extr-mangle-uucp !-pos) | |
| 1121 | (if mail-extr-mangle-uucp | 1107 | ;; **** I don't understand this save-restriction and the |
| 1122 | (cond (!-pos | 1108 | ;; narrow-to-region inside it. Why did I do that? |
| 1123 | ;; **** I don't understand this save-restriction and the | 1109 | (save-restriction |
| 1124 | ;; narrow-to-region inside it. Why did I do that? | 1110 | (cond ((and @-pos |
| 1125 | (save-restriction | 1111 | mail-extr-@-binds-tighter-than-!) |
| 1126 | (cond ((and @-pos | 1112 | (goto-char @-pos) |
| 1127 | mail-extr-@-binds-tighter-than-!) | 1113 | (setq %-pos (cons (point) %-pos) |
| 1128 | (goto-char @-pos) | 1114 | @-pos nil) |
| 1129 | (setq %-pos (cons (point) %-pos) | 1115 | (delete-char 1) |
| 1130 | @-pos nil) | 1116 | (insert "%") |
| 1131 | (mail-extr-delete-char 1) | 1117 | (setq insert-point (point-max))) |
| 1132 | (insert "%") | 1118 | (mail-extr-@-binds-tighter-than-! |
| 1133 | (setq insert-point (point-max))) | 1119 | (setq insert-point (point-max))) |
| 1134 | (mail-extr-@-binds-tighter-than-! | 1120 | (%-pos |
| 1135 | (setq insert-point (point-max))) | 1121 | (setq insert-point (car (last %-pos)) |
| 1136 | (%-pos | 1122 | saved-%-pos (mapcar 'mail-extr-markerize %-pos) |
| 1137 | (setq insert-point (car (last %-pos)) | 1123 | %-pos nil |
| 1138 | saved-%-pos (mapcar 'mail-extr-markerize %-pos) | 1124 | @-pos (mail-extr-markerize @-pos))) |
| 1139 | %-pos nil | 1125 | (@-pos |
| 1140 | @-pos (mail-extr-markerize @-pos))) | 1126 | (setq insert-point @-pos) |
| 1141 | (@-pos | 1127 | (setq @-pos (mail-extr-markerize @-pos))) |
| 1142 | (setq insert-point @-pos) | 1128 | (t |
| 1143 | (setq @-pos (mail-extr-markerize @-pos))) | 1129 | (setq insert-point (point-max)))) |
| 1144 | (t | 1130 | (narrow-to-region (point-min) insert-point) |
| 1145 | (setq insert-point (point-max)))) | 1131 | (setq saved-!-pos (car !-pos)) |
| 1146 | (narrow-to-region (point-min) insert-point) | 1132 | (while !-pos |
| 1147 | (setq saved-!-pos (car !-pos)) | 1133 | (goto-char (point-max)) |
| 1148 | (while !-pos | 1134 | (cond ((and (not @-pos) |
| 1149 | (goto-char (point-max)) | 1135 | (not (cdr !-pos))) |
| 1150 | (cond ((and (not @-pos) | 1136 | (setq @-pos (point)) |
| 1151 | (not (cdr !-pos))) | 1137 | (insert-before-markers "@ ")) |
| 1152 | (setq @-pos (point)) | 1138 | (t |
| 1153 | (insert-before-markers "@ ")) | 1139 | (setq %-pos (cons (point) %-pos)) |
| 1154 | (t | 1140 | (insert-before-markers "% "))) |
| 1155 | (setq %-pos (cons (point) %-pos)) | 1141 | (backward-char 1) |
| 1156 | (insert-before-markers "% "))) | 1142 | (insert-buffer-substring |
| 1157 | (backward-char 1) | 1143 | (current-buffer) |
| 1158 | (insert-buffer-substring | 1144 | (if (nth 1 !-pos) |
| 1159 | (current-buffer) | 1145 | (1+ (nth 1 !-pos)) |
| 1160 | (if (nth 1 !-pos) | 1146 | (point-min)) |
| 1161 | (1+ (nth 1 !-pos)) | 1147 | (car !-pos)) |
| 1162 | (point-min)) | 1148 | (delete-char 1) |
| 1163 | (car !-pos)) | 1149 | (or (save-excursion |
| 1164 | (mail-extr-delete-char 1) | 1150 | (mail-extr-safe-move-sexp -1) |
| 1165 | (or (save-excursion | 1151 | (mail-extr-skip-whitespace-backward) |
| 1166 | (mail-extr-safe-move-sexp -1) | 1152 | (eq ?. (preceding-char))) |
| 1167 | (mail-extr-skip-whitespace-backward) | 1153 | (insert-before-markers |
| 1168 | (eq ?. (preceding-char))) | 1154 | (if (save-excursion |
| 1169 | (insert-before-markers | 1155 | (mail-extr-skip-whitespace-backward) |
| 1170 | (if (save-excursion | 1156 | (eq ?. (preceding-char))) |
| 1171 | (mail-extr-skip-whitespace-backward) | 1157 | "" |
| 1172 | (eq ?. (preceding-char))) | 1158 | ".") |
| 1173 | "" | 1159 | "uucp")) |
| 1174 | ".") | 1160 | (setq !-pos (cdr !-pos)))) |
| 1175 | "uucp")) | 1161 | (and saved-%-pos |
| 1176 | (setq !-pos (cdr !-pos)))) | 1162 | (setq %-pos (append (mapcar 'mail-extr-demarkerize |
| 1177 | (and saved-%-pos | 1163 | saved-%-pos) |
| 1178 | (setq %-pos (append (mapcar 'mail-extr-demarkerize | 1164 | %-pos))) |
| 1179 | saved-%-pos) | 1165 | (setq @-pos (mail-extr-demarkerize @-pos)) |
| 1180 | %-pos))) | 1166 | (narrow-to-region (1+ saved-!-pos) (point-max))) |
| 1181 | (setq @-pos (mail-extr-demarkerize @-pos)) | ||
| 1182 | (narrow-to-region (1+ saved-!-pos) (point-max))))) | ||
| 1183 | 1167 | ||
| 1184 | ;; WARNING: THIS CODE IS DUPLICATED ABOVE. | 1168 | ;; WARNING: THIS CODE IS DUPLICATED ABOVE. |
| 1185 | (cond ((and %-pos | 1169 | (when (and %-pos (not @-pos)) |
| 1186 | (not @-pos)) | 1170 | (goto-char (car %-pos)) |
| 1187 | (goto-char (car %-pos)) | 1171 | (delete-char 1) |
| 1188 | (mail-extr-delete-char 1) | 1172 | (setq @-pos (point)) |
| 1189 | (setq @-pos (point)) | 1173 | (insert "@") |
| 1190 | (insert "@") | 1174 | (setq %-pos (cdr %-pos))) |
| 1191 | (setq %-pos (cdr %-pos)))) | 1175 | |
| 1192 | 1176 | (when (setq %-pos (nreverse %-pos)) ; implies @-pos valid | |
| 1193 | (setq %-pos (nreverse %-pos)) | 1177 | (setq temp %-pos) |
| 1194 | (cond (%-pos ; implies @-pos valid | 1178 | (catch 'truncated |
| 1195 | (setq temp %-pos) | 1179 | (while temp |
| 1196 | (catch 'truncated | 1180 | (goto-char (or (nth 1 temp) |
| 1197 | (while temp | 1181 | @-pos)) |
| 1198 | (goto-char (or (nth 1 temp) | 1182 | (mail-extr-skip-whitespace-backward) |
| 1199 | @-pos)) | 1183 | (save-excursion |
| 1200 | (mail-extr-skip-whitespace-backward) | 1184 | (mail-extr-safe-move-sexp -1) |
| 1201 | (save-excursion | 1185 | (setq domain-pos (point)) |
| 1202 | (mail-extr-safe-move-sexp -1) | 1186 | (mail-extr-skip-whitespace-backward) |
| 1203 | (setq domain-pos (point)) | 1187 | (setq \.-pos (eq ?. (preceding-char)))) |
| 1204 | (mail-extr-skip-whitespace-backward) | 1188 | (when (and \.-pos |
| 1205 | (setq \.-pos (eq ?. (preceding-char)))) | 1189 | ;; #### string consing |
| 1206 | (cond ((and \.-pos | 1190 | (let ((s (intern-soft |
| 1207 | ;; #### string consing | 1191 | (buffer-substring domain-pos (point)) |
| 1208 | (let ((s (intern-soft | 1192 | mail-extr-all-top-level-domains))) |
| 1209 | (buffer-substring domain-pos (point)) | 1193 | (and s (get s 'domain-name)))) |
| 1210 | mail-extr-all-top-level-domains))) | 1194 | (narrow-to-region (point-min) (point)) |
| 1211 | (and s (get s 'domain-name)))) | 1195 | (goto-char (car temp)) |
| 1212 | (narrow-to-region (point-min) (point)) | 1196 | (delete-char 1) |
| 1213 | (goto-char (car temp)) | 1197 | (setq @-pos (point)) |
| 1214 | (mail-extr-delete-char 1) | 1198 | (setcdr temp nil) |
| 1215 | (setq @-pos (point)) | 1199 | (setq %-pos (delq @-pos %-pos)) |
| 1216 | (setcdr temp nil) | 1200 | (insert "@") |
| 1217 | (setq %-pos (delq @-pos %-pos)) | 1201 | (throw 'truncated t)) |
| 1218 | (insert "@") | 1202 | (setq temp (cdr temp))))) |
| 1219 | (throw 'truncated t))) | ||
| 1220 | (setq temp (cdr temp)))))) | ||
| 1221 | (setq mbox-beg (point-min) | 1203 | (setq mbox-beg (point-min) |
| 1222 | mbox-end (if %-pos (car %-pos) | 1204 | mbox-end (if %-pos (car %-pos) |
| 1223 | (or @-pos | 1205 | (or @-pos |
| 1224 | (point-max))))) | 1206 | (point-max)))) |
| 1207 | |||
| 1208 | (when @-pos | ||
| 1209 | ;; Make the domain-name part lowercase since it's case | ||
| 1210 | ;; insensitive anyway. | ||
| 1211 | (downcase-region (1+ @-pos) (point-max)))) | ||
| 1225 | 1212 | ||
| 1226 | ;; Done canonicalizing address. | 1213 | ;; Done canonicalizing address. |
| 1227 | ;; We are now back in extraction-buffer. | 1214 | ;; We are now back in extraction-buffer. |
| @@ -1295,10 +1282,10 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1295 | (setq quote-end (- (point) 2)) | 1282 | (setq quote-end (- (point) 2)) |
| 1296 | (save-excursion | 1283 | (save-excursion |
| 1297 | (backward-char 1) | 1284 | (backward-char 1) |
| 1298 | (mail-extr-delete-char 1) | 1285 | (delete-char 1) |
| 1299 | (goto-char quote-beg) | 1286 | (goto-char quote-beg) |
| 1300 | (or (eobp) | 1287 | (or (eobp) |
| 1301 | (mail-extr-delete-char 1))) | 1288 | (delete-char 1))) |
| 1302 | (mail-extr-undo-backslash-quoting quote-beg quote-end) | 1289 | (mail-extr-undo-backslash-quoting quote-beg quote-end) |
| 1303 | (or (eq ?\ (char-after (point))) | 1290 | (or (eq ?\ (char-after (point))) |
| 1304 | (insert " ")) | 1291 | (insert " ")) |
| @@ -1308,16 +1295,16 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1308 | (if (memq (char-after (1+ (point))) '(?_ ?=)) | 1295 | (if (memq (char-after (1+ (point))) '(?_ ?=)) |
| 1309 | (progn | 1296 | (progn |
| 1310 | (forward-char 1) | 1297 | (forward-char 1) |
| 1311 | (mail-extr-delete-char 1) | 1298 | (delete-char 1) |
| 1312 | (insert ?\ )) | 1299 | (insert ?\ )) |
| 1313 | (if \.-ends-name | 1300 | (if \.-ends-name |
| 1314 | (narrow-to-region (point-min) (point)) | 1301 | (narrow-to-region (point-min) (point)) |
| 1315 | (mail-extr-delete-char 1) | 1302 | (delete-char 1) |
| 1316 | (insert " "))) | 1303 | (insert " "))) |
| 1317 | ;; (setq mailbox-name-processed-flag t) | 1304 | ;; (setq mailbox-name-processed-flag t) |
| 1318 | ) | 1305 | ) |
| 1319 | ((memq (char-syntax char) '(?. ?\\)) | 1306 | ((memq (char-syntax char) '(?. ?\\)) |
| 1320 | (mail-extr-delete-char 1) | 1307 | (delete-char 1) |
| 1321 | (insert " ") | 1308 | (insert " ") |
| 1322 | ;; (setq mailbox-name-processed-flag t) | 1309 | ;; (setq mailbox-name-processed-flag t) |
| 1323 | ) | 1310 | ) |
| @@ -1339,16 +1326,15 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1339 | 1326 | ||
| 1340 | ;; Copy the contents of the individual fields that | 1327 | ;; Copy the contents of the individual fields that |
| 1341 | ;; might hold name data to the beginning. | 1328 | ;; might hold name data to the beginning. |
| 1342 | (mapcar | 1329 | (mapc |
| 1343 | (function | 1330 | (lambda (field-pattern) |
| 1344 | (lambda (field-pattern) | 1331 | (when |
| 1345 | (cond | 1332 | (save-excursion |
| 1346 | ((save-excursion | 1333 | (re-search-forward field-pattern nil t)) |
| 1347 | (re-search-forward field-pattern nil t)) | 1334 | (insert-buffer-substring (current-buffer) |
| 1348 | (insert-buffer-substring (current-buffer) | 1335 | (match-beginning 1) |
| 1349 | (match-beginning 1) | 1336 | (match-end 1)) |
| 1350 | (match-end 1)) | 1337 | (insert " "))) |
| 1351 | (insert " "))))) | ||
| 1352 | (list mail-extr-x400-encoded-address-given-name-pattern | 1338 | (list mail-extr-x400-encoded-address-given-name-pattern |
| 1353 | mail-extr-x400-encoded-address-surname-pattern | 1339 | mail-extr-x400-encoded-address-surname-pattern |
| 1354 | mail-extr-x400-encoded-address-full-name-pattern)) | 1340 | mail-extr-x400-encoded-address-full-name-pattern)) |
| @@ -1396,47 +1382,46 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1396 | ;; Initial code by Jamie Zawinski <jwz@lucid.com> | 1382 | ;; Initial code by Jamie Zawinski <jwz@lucid.com> |
| 1397 | ;; *** Make it work when there's a suffix as well. | 1383 | ;; *** Make it work when there's a suffix as well. |
| 1398 | (goto-char (point-min)) | 1384 | (goto-char (point-min)) |
| 1399 | (cond ((and mail-extr-guess-middle-initial | 1385 | (when (and mail-extr-guess-middle-initial |
| 1400 | (not disable-initial-guessing-flag) | 1386 | (not disable-initial-guessing-flag) |
| 1401 | (eq 3 (- mbox-end mbox-beg)) | 1387 | (eq 3 (- mbox-end mbox-beg)) |
| 1402 | (progn | 1388 | (progn |
| 1403 | (goto-char (point-min)) | 1389 | (goto-char (point-min)) |
| 1404 | (looking-at mail-extr-two-name-pattern))) | 1390 | (looking-at mail-extr-two-name-pattern))) |
| 1405 | (setq fi (char-after (match-beginning 0)) | 1391 | (setq fi (char-after (match-beginning 0)) |
| 1406 | li (char-after (match-beginning 3))) | 1392 | li (char-after (match-beginning 3))) |
| 1407 | (save-excursion | 1393 | (with-current-buffer canonicalization-buffer |
| 1408 | (set-buffer canonicalization-buffer) | 1394 | ;; char-equal is ignoring case here, so no need to upcase |
| 1409 | ;; char-equal is ignoring case here, so no need to upcase | 1395 | ;; or downcase. |
| 1410 | ;; or downcase. | 1396 | (let ((case-fold-search t)) |
| 1411 | (let ((case-fold-search t)) | 1397 | (and (char-equal fi (char-after mbox-beg)) |
| 1412 | (and (char-equal fi (char-after mbox-beg)) | 1398 | (char-equal li (char-after (1- mbox-end))) |
| 1413 | (char-equal li (char-after (1- mbox-end))) | 1399 | (setq mi (char-after (1+ mbox-beg)))))) |
| 1414 | (setq mi (char-after (1+ mbox-beg)))))) | 1400 | (when (and mi |
| 1415 | (cond ((and mi | 1401 | ;; TODO: use better table than syntax table |
| 1416 | ;; TODO: use better table than syntax table | 1402 | (eq ?w (char-syntax mi))) |
| 1417 | (eq ?w (char-syntax mi))) | 1403 | (goto-char (match-beginning 3)) |
| 1418 | (goto-char (match-beginning 3)) | 1404 | (insert (upcase mi) ". "))) |
| 1419 | (insert (upcase mi) ". "))))) | ||
| 1420 | 1405 | ||
| 1421 | ;; Nuke name if it is the same as mailbox name. | 1406 | ;; Nuke name if it is the same as mailbox name. |
| 1422 | (let ((buffer-length (- (point-max) (point-min))) | 1407 | (let ((buffer-length (- (point-max) (point-min))) |
| 1423 | (i 0) | 1408 | (i 0) |
| 1424 | (names-match-flag t)) | 1409 | (names-match-flag t)) |
| 1425 | (cond ((and (> buffer-length 0) | 1410 | (when (and (> buffer-length 0) |
| 1426 | (eq buffer-length (- mbox-end mbox-beg))) | 1411 | (eq buffer-length (- mbox-end mbox-beg))) |
| 1427 | (goto-char (point-max)) | 1412 | (goto-char (point-max)) |
| 1428 | (insert-buffer-substring canonicalization-buffer | 1413 | (insert-buffer-substring canonicalization-buffer |
| 1429 | mbox-beg mbox-end) | 1414 | mbox-beg mbox-end) |
| 1430 | (while (and names-match-flag | 1415 | (while (and names-match-flag |
| 1431 | (< i buffer-length)) | 1416 | (< i buffer-length)) |
| 1432 | (or (eq (downcase (char-after (+ i (point-min)))) | 1417 | (or (eq (downcase (char-after (+ i (point-min)))) |
| 1433 | (downcase | 1418 | (downcase |
| 1434 | (char-after (+ i buffer-length (point-min))))) | 1419 | (char-after (+ i buffer-length (point-min))))) |
| 1435 | (setq names-match-flag nil)) | 1420 | (setq names-match-flag nil)) |
| 1436 | (setq i (1+ i))) | 1421 | (setq i (1+ i))) |
| 1437 | (delete-region (+ (point-min) buffer-length) (point-max)) | 1422 | (delete-region (+ (point-min) buffer-length) (point-max)) |
| 1438 | (if names-match-flag | 1423 | (if names-match-flag |
| 1439 | (narrow-to-region (point) (point)))))) | 1424 | (narrow-to-region (point) (point))))) |
| 1440 | 1425 | ||
| 1441 | ;; Nuke name if it's just one word. | 1426 | ;; Nuke name if it's just one word. |
| 1442 | (goto-char (point-min)) | 1427 | (goto-char (point-min)) |
| @@ -1448,8 +1433,7 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1448 | (setq value-list | 1433 | (setq value-list |
| 1449 | (cons (list (if (not (= (point-min) (point-max))) | 1434 | (cons (list (if (not (= (point-min) (point-max))) |
| 1450 | (buffer-string)) | 1435 | (buffer-string)) |
| 1451 | (save-excursion | 1436 | (with-current-buffer canonicalization-buffer |
| 1452 | (set-buffer canonicalization-buffer) | ||
| 1453 | (if (not (= (point-min) (point-max))) | 1437 | (if (not (= (point-min) (point-max))) |
| 1454 | (buffer-string)))) | 1438 | (buffer-string)))) |
| 1455 | value-list)) | 1439 | value-list)) |
| @@ -1492,12 +1476,11 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1492 | (skip-chars-forward "^({[\"'`") | 1476 | (skip-chars-forward "^({[\"'`") |
| 1493 | (let ((cbeg (point))) | 1477 | (let ((cbeg (point))) |
| 1494 | (set-syntax-table mail-extr-address-text-comment-syntax-table) | 1478 | (set-syntax-table mail-extr-address-text-comment-syntax-table) |
| 1495 | (cond ((memq (following-char) '(?\' ?\`)) | 1479 | (if (memq (following-char) '(?\' ?\`)) |
| 1496 | (search-forward "'" nil 'move | 1480 | (search-forward "'" nil 'move |
| 1497 | (if (eq ?\' (following-char)) 2 1))) | 1481 | (if (eq ?\' (following-char)) 2 1)) |
| 1498 | (t | 1482 | (or (mail-extr-safe-move-sexp 1) |
| 1499 | (or (mail-extr-safe-move-sexp 1) | 1483 | (goto-char (point-max)))) |
| 1500 | (goto-char (point-max))))) | ||
| 1501 | (set-syntax-table mail-extr-address-text-syntax-table) | 1484 | (set-syntax-table mail-extr-address-text-syntax-table) |
| 1502 | (when (eq (char-after cbeg) ?\() | 1485 | (when (eq (char-after cbeg) ?\() |
| 1503 | ;; Delete the comment itself. | 1486 | ;; Delete the comment itself. |
| @@ -1522,44 +1505,43 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1522 | ;;(while (re-search-forward mail-extr-bad-dot-pattern nil t) | 1505 | ;;(while (re-search-forward mail-extr-bad-dot-pattern nil t) |
| 1523 | ;; (replace-match "\\1 \\2" t)) | 1506 | ;; (replace-match "\\1 \\2" t)) |
| 1524 | 1507 | ||
| 1525 | (cond ((not (search-forward " " nil t)) | 1508 | (unless (search-forward " " nil t) |
| 1526 | (goto-char (point-min)) | 1509 | (goto-char (point-min)) |
| 1527 | (cond ((search-forward "_" nil t) | 1510 | (cond ((search-forward "_" nil t) |
| 1528 | ;; Handle the *idiotic* use of underlines as spaces. | 1511 | ;; Handle the *idiotic* use of underlines as spaces. |
| 1529 | ;; Example: fml@foo.bar.dom (First_M._Last) | 1512 | ;; Example: fml@foo.bar.dom (First_M._Last) |
| 1530 | (goto-char (point-min)) | 1513 | (goto-char (point-min)) |
| 1531 | (while (search-forward "_" nil t) | 1514 | (while (search-forward "_" nil t) |
| 1532 | (replace-match " " t))) | 1515 | (replace-match " " t))) |
| 1533 | ((search-forward "." nil t) | 1516 | ((search-forward "." nil t) |
| 1534 | ;; Fix . used as space | 1517 | ;; Fix . used as space |
| 1535 | ;; Example: danj1@cb.att.com (daniel.jacobson) | 1518 | ;; Example: danj1@cb.att.com (daniel.jacobson) |
| 1536 | (goto-char (point-min)) | 1519 | (goto-char (point-min)) |
| 1537 | (while (re-search-forward mail-extr-bad-dot-pattern nil t) | 1520 | (while (re-search-forward mail-extr-bad-dot-pattern nil t) |
| 1538 | (replace-match "\\1 \\2" t)))))) | 1521 | (replace-match "\\1 \\2" t))))) |
| 1539 | 1522 | ||
| 1540 | ;; Loop over the words (and other junk) in the name. | 1523 | ;; Loop over the words (and other junk) in the name. |
| 1541 | (goto-char (point-min)) | 1524 | (goto-char (point-min)) |
| 1542 | (while (not name-done-flag) | 1525 | (while (not name-done-flag) |
| 1543 | 1526 | ||
| 1544 | (cond (word-found-flag | 1527 | (when word-found-flag |
| 1545 | ;; Last time through this loop we skipped over a word. | 1528 | ;; Last time through this loop we skipped over a word. |
| 1546 | (setq last-word-beg this-word-beg) | 1529 | (setq last-word-beg this-word-beg) |
| 1547 | (setq drop-last-word-if-trailing-flag | 1530 | (setq drop-last-word-if-trailing-flag |
| 1548 | drop-this-word-if-trailing-flag) | 1531 | drop-this-word-if-trailing-flag) |
| 1549 | (setq word-found-flag nil))) | 1532 | (setq word-found-flag nil)) |
| 1550 | 1533 | ||
| 1551 | (cond (begin-again-flag | 1534 | (when begin-again-flag |
| 1552 | ;; Last time through the loop we found something that | 1535 | ;; Last time through the loop we found something that |
| 1553 | ;; indicates we should pretend we are beginning again from | 1536 | ;; indicates we should pretend we are beginning again from |
| 1554 | ;; the start. | 1537 | ;; the start. |
| 1555 | (setq word-count 0) | 1538 | (setq word-count 0) |
| 1556 | (setq last-word-beg nil) | 1539 | (setq last-word-beg nil) |
| 1557 | (setq drop-last-word-if-trailing-flag nil) | 1540 | (setq drop-last-word-if-trailing-flag nil) |
| 1558 | (setq mixed-case-flag nil) | 1541 | (setq mixed-case-flag nil) |
| 1559 | (setq lower-case-flag nil) | 1542 | (setq lower-case-flag nil) |
| 1560 | ;; (setq upper-case-flag nil) | 1543 | ;; (setq upper-case-flag nil) |
| 1561 | (setq begin-again-flag nil) | 1544 | (setq begin-again-flag nil)) |
| 1562 | )) | ||
| 1563 | 1545 | ||
| 1564 | ;; Initialize for this iteration of the loop. | 1546 | ;; Initialize for this iteration of the loop. |
| 1565 | (mail-extr-skip-whitespace-forward) | 1547 | (mail-extr-skip-whitespace-forward) |
| @@ -1625,7 +1607,7 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1625 | (cond ((memq (following-char) '(?\' ?\`)) | 1607 | (cond ((memq (following-char) '(?\' ?\`)) |
| 1626 | (or (search-forward "'" nil t | 1608 | (or (search-forward "'" nil t |
| 1627 | (if (eq ?\' (following-char)) 2 1)) | 1609 | (if (eq ?\' (following-char)) 2 1)) |
| 1628 | (mail-extr-delete-char 1))) | 1610 | (delete-char 1))) |
| 1629 | (t | 1611 | (t |
| 1630 | (or (mail-extr-safe-move-sexp 1) | 1612 | (or (mail-extr-safe-move-sexp 1) |
| 1631 | (goto-char (point-max))))) | 1613 | (goto-char (point-max))))) |
| @@ -1718,7 +1700,7 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1718 | (eq ?\ (preceding-char)) | 1700 | (eq ?\ (preceding-char)) |
| 1719 | (eq (following-char) ?&) | 1701 | (eq (following-char) ?&) |
| 1720 | (eq (1+ (point)) (point-max))) | 1702 | (eq (1+ (point)) (point-max))) |
| 1721 | (mail-extr-delete-char 1) | 1703 | (delete-char 1) |
| 1722 | (capitalize-region | 1704 | (capitalize-region |
| 1723 | (point) | 1705 | (point) |
| 1724 | (progn | 1706 | (progn |
| @@ -1801,24 +1783,24 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1801 | ;; here at all. Actually I guess it would be best to map patterns | 1783 | ;; here at all. Actually I guess it would be best to map patterns |
| 1802 | ;; like foo.hoser@xerox.com into foo@hoser.xerox.com, but I don't | 1784 | ;; like foo.hoser@xerox.com into foo@hoser.xerox.com, but I don't |
| 1803 | ;; actually know that that is what's going on. | 1785 | ;; actually know that that is what's going on. |
| 1804 | (cond ((not suffix-flag) | 1786 | (unless suffix-flag |
| 1805 | (goto-char (point-min)) | 1787 | (goto-char (point-min)) |
| 1806 | (let ((case-fold-search t)) | 1788 | (let ((case-fold-search t)) |
| 1807 | (if (looking-at "[-A-Za-z_]+[. ]\\(PARC\\|ADOC\\)\\'") | 1789 | (if (looking-at "[-A-Za-z_]+[. ]\\(PARC\\|ADOC\\)\\'") |
| 1808 | (erase-buffer))))) | 1790 | (erase-buffer)))) |
| 1809 | 1791 | ||
| 1810 | ;; If last name first put it at end (but before suffix) | 1792 | ;; If last name first put it at end (but before suffix) |
| 1811 | (cond (last-name-comma-flag | 1793 | (when last-name-comma-flag |
| 1812 | (goto-char (point-min)) | 1794 | (goto-char (point-min)) |
| 1813 | (search-forward ",") | 1795 | (search-forward ",") |
| 1814 | (setq name-end (1- (point))) | 1796 | (setq name-end (1- (point))) |
| 1815 | (goto-char (or suffix-flag (point-max))) | 1797 | (goto-char (or suffix-flag (point-max))) |
| 1816 | (or (eq ?\ (preceding-char)) | 1798 | (or (eq ?\ (preceding-char)) |
| 1817 | (insert ?\ )) | 1799 | (insert ?\ )) |
| 1818 | (insert-buffer-substring (current-buffer) (point-min) name-end) | 1800 | (insert-buffer-substring (current-buffer) (point-min) name-end) |
| 1819 | (goto-char name-end) | 1801 | (goto-char name-end) |
| 1820 | (skip-chars-forward "\t ,") | 1802 | (skip-chars-forward "\t ,") |
| 1821 | (narrow-to-region (point) (point-max)))) | 1803 | (narrow-to-region (point) (point-max))) |
| 1822 | 1804 | ||
| 1823 | ;; Delete leading and trailing junk characters. | 1805 | ;; Delete leading and trailing junk characters. |
| 1824 | ;; *** This is probably completely unneeded now. | 1806 | ;; *** This is probably completely unneeded now. |
| @@ -1851,14 +1833,13 @@ ADDRESS may be a string or a buffer. If it is a buffer, the visible | |||
| 1851 | 1833 | ||
| 1852 | (defconst mail-extr-all-top-level-domains | 1834 | (defconst mail-extr-all-top-level-domains |
| 1853 | (let ((ob (make-vector 739 0))) | 1835 | (let ((ob (make-vector 739 0))) |
| 1854 | (mapcar | 1836 | (mapc |
| 1855 | (function | 1837 | (lambda (x) |
| 1856 | (lambda (x) | 1838 | (put (intern (downcase (car x)) ob) |
| 1857 | (put (intern (downcase (car x)) ob) | 1839 | 'domain-name |
| 1858 | 'domain-name | 1840 | (if (nth 2 x) |
| 1859 | (if (nth 2 x) | 1841 | (format (nth 2 x) (nth 1 x)) |
| 1860 | (format (nth 2 x) (nth 1 x)) | 1842 | (nth 1 x)))) |
| 1861 | (nth 1 x))))) | ||
| 1862 | '( | 1843 | '( |
| 1863 | ;; ISO 3166 codes: | 1844 | ;; ISO 3166 codes: |
| 1864 | ("ad" "Andorra") | 1845 | ("ad" "Andorra") |