| 1 | XMXUTIL1 ;ISC-SF/GMB-Date & String Utilities ;04/17/2002  14:14
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 |  ; All entry points covered by DBIA 2735.
 | 
|---|
| 4 | ENCODEUP(XMSUBJ) ; Change ^ to ~U~
 | 
|---|
| 5 |  F  Q:XMSUBJ'[U  S XMSUBJ=$P(XMSUBJ,U)_"~U~"_$P(XMSUBJ,U,2,999)
 | 
|---|
| 6 |  Q XMSUBJ
 | 
|---|
| 7 | DECODEUP(XMSUBJ) ; Change ~U~ to ^
 | 
|---|
| 8 |  F  Q:XMSUBJ'["~U~"  S XMSUBJ=$P(XMSUBJ,"~U~")_U_$P(XMSUBJ,"~U~",2,999)
 | 
|---|
| 9 |  Q XMSUBJ
 | 
|---|
| 10 | SCRUB(XMSTRING) ; Strip ctrl chars and leading/trailing blanks
 | 
|---|
| 11 |  S:$E(XMSTRING,1)=" "!($E(XMSTRING,$L(XMSTRING))=" ") XMSTRING=$$STRIP(XMSTRING)
 | 
|---|
| 12 |  S:XMSTRING?.E1C.E XMSTRING=$$CTRL(XMSTRING)
 | 
|---|
| 13 |  Q XMSTRING
 | 
|---|
| 14 | STRIP(XMSTRING) ; Strip leading and trailing blanks from a string
 | 
|---|
| 15 |  N I
 | 
|---|
| 16 |  I $E(XMSTRING,1)=" " D
 | 
|---|
| 17 |  . F I=2:1 Q:$E(XMSTRING,I)'=" "
 | 
|---|
| 18 |  . S XMSTRING=$E(XMSTRING,I,999)
 | 
|---|
| 19 |  I $E(XMSTRING,$L(XMSTRING))=" " D
 | 
|---|
| 20 |  . F I=$L(XMSTRING):-1 Q:$E(XMSTRING,I)'=" "
 | 
|---|
| 21 |  . S XMSTRING=$E(XMSTRING,1,I)
 | 
|---|
| 22 |  Q XMSTRING
 | 
|---|
| 23 | MAXBLANK(XMSTRING) ; Reduce 3 or more consecutive blanks in a string to 2
 | 
|---|
| 24 |  F  Q:XMSTRING'["   "  D
 | 
|---|
| 25 |  . S XMSTRING=$P(XMSTRING,"   ",1)_"  "_$P(XMSTRING,"   ",2,999)
 | 
|---|
| 26 |  Q XMSTRING
 | 
|---|
| 27 | CTRL(XMSTRING) ; Strip control characters from a string
 | 
|---|
| 28 |  N I
 | 
|---|
| 29 |  S I=1
 | 
|---|
| 30 |  F  Q:XMSTRING'?.E1C.E  D
 | 
|---|
| 31 |  . F I=I:1 Q:$E(XMSTRING,I)?1C
 | 
|---|
| 32 |  . S XMSTRING=$E(XMSTRING,1,I-1)_$E(XMSTRING,I+1,999)
 | 
|---|
| 33 |  Q XMSTRING
 | 
|---|
| 34 | MELD(XMSTRING,XMNUMBER,XMLEN) ; Function right-justifies a string and
 | 
|---|
| 35 |  ; left-justifies a number in a combined string of a given length.
 | 
|---|
| 36 |  ; The string will be truncated, if necessary.
 | 
|---|
| 37 |  ; e.g. $$MELD("I just love Lotus, don't you?",123,22) returns:
 | 
|---|
| 38 |  ;             "I just love Lotus  123"
 | 
|---|
| 39 |  Q:$G(XMNUMBER)="" $E($$LJ^XLFSTR(XMSTRING,XMLEN),1,XMLEN)
 | 
|---|
| 40 |  S XMLEN=XMLEN-$L(XMNUMBER)-2
 | 
|---|
| 41 |  Q $E($$LJ^XLFSTR(XMSTRING,XMLEN),1,XMLEN)_"  "_XMNUMBER
 | 
|---|
| 42 | TSTAMP() ; Timestamp
 | 
|---|
| 43 |  N X
 | 
|---|
| 44 |  S X=$H
 | 
|---|
| 45 |  Q X*86400+$P(X,",",2)
 | 
|---|
| 46 | MMDT(XMDT) ; (MailMan Date/Time) Given FM date/time, return external.
 | 
|---|
| 47 |  ; time is optional
 | 
|---|
| 48 |  Q:XMDT'=+XMDT XMDT
 | 
|---|
| 49 |  Q $$FMTE^XLFDT($E(XMDT,1,12),"2Z")  ; return mm/dd/yy@hh:mm
 | 
|---|
| 50 |  N MMDT ; return dd mmm yy hh:mm
 | 
|---|
| 51 |  I $E(XMDT,4,5)="00" S $E(XMDT,4,5)="01"
 | 
|---|
| 52 |  I $E(XMDT,6,7)="00" S $E(XMDT,6,7)="01"
 | 
|---|
| 53 |  S MMDT=$E(XMDT,6,7)_" "_$P("Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec",U,$E(XMDT,4,5))_" "_$E(XMDT,2,3)
 | 
|---|
| 54 |  S XMDT=$P(XMDT,".",2)_"0000"
 | 
|---|
| 55 |  Q:'XMDT MMDT
 | 
|---|
| 56 |  Q MMDT_" "_$E(XMDT,1,2)_":"_$E(XMDT,3,4)
 | 
|---|
| 57 | INDT(XMDT) ; (InterNet Date/Time) Given FM date/time, return dd mmm yyyy hh:mm:ss +-hhmm (zone)
 | 
|---|
| 58 |  I $E(XMDT,4,5)="00" S $E(XMDT,4,5)="01"
 | 
|---|
| 59 |  I $E(XMDT,6,7)="00" S $E(XMDT,6,7)="01"
 | 
|---|
| 60 |  S XMDT=$$FMTE^XLFDT(XMDT,"1S")
 | 
|---|
| 61 |  ; Convert "Jun 28, 1955@10:10:00" to "28 Jun 1955 10:10:00"
 | 
|---|
| 62 |  S XMDT=+$P(XMDT," ",2)_" "_$P(XMDT," ",1)_" "_+$P(XMDT," ",3)_" "_$S(XMDT["@":$P(XMDT,"@",2),1:"00:00:00")
 | 
|---|
| 63 |  Q XMDT_" "_^XMB("TIMEDIFF")_" ("_^XMB("TIMEZONE")_")"
 | 
|---|
| 64 | CONVERT(X,XMTIME) ; Function to convert Internet dates to FM (returns -1 if error)
 | 
|---|
| 65 |  ; X         Internet date
 | 
|---|
| 66 |  ; XMTIME    =1 Convert time, too; =0 convert date only
 | 
|---|
| 67 |  ; Formats:  Tuesday, 28 June 1955 17:30:45 PDT
 | 
|---|
| 68 |  ;           Tue, 28 Jun 1955 17:30:45 PDT
 | 
|---|
| 69 |  ;           Tue 28 Jun 1955 17:30:45 PDT
 | 
|---|
| 70 |  ;           28 Jun 1955 17:30:45 -0900 (PST)  <== MailMan standard
 | 
|---|
| 71 |  ;           28 Jun 55 17:30 PST            <== Previous MailMan standard
 | 
|---|
| 72 |  ;           Tue Jun 28 17:30:45 PDT 1955
 | 
|---|
| 73 |  ;           28-JUN-1955 17:30:45 -0400
 | 
|---|
| 74 |  ;           6/28/55 17:30
 | 
|---|
| 75 |  ;           JUN 28 17:30 1955
 | 
|---|
| 76 |  N %DT,Y,XMD,XMT
 | 
|---|
| 77 |  I $E(X)=" "!($E(X)=$C(9)) F  S X=$E(X,2,99) Q:$E(X)'=$C(9)&($E(X)'=" ")  ; remove leading blanks or tabs
 | 
|---|
| 78 |  I X?.E2" ".E D  ; reduce all consecutive blanks to 1 blank
 | 
|---|
| 79 |  . N I S I=1
 | 
|---|
| 80 |  . F  S I=$F(X,"  ",I) Q:I=0  S X=$E(X,1,I-2)_$E(X,I,99),I=I-1
 | 
|---|
| 81 |  I X?3.A.E D
 | 
|---|
| 82 |  . I X?3.A1", ".E!(X?3.A1" "3.A.E)!(X?3.A1" "1.2N1" "3.A.E) S X=$P(X," ",2,99) ; remove leading day of week
 | 
|---|
| 83 |  I $P(X," ",3)[":" D
 | 
|---|
| 84 |  . S XMD=$P(X," ",1,2)_" "_$P(X," ",$L(X," ")) ; time is before year
 | 
|---|
| 85 |  . S XMT=$P(X," ",3,$L(X," ")-1)
 | 
|---|
| 86 |  E  D
 | 
|---|
| 87 |  . S XMD=$P(X," ",1,3) ; year is before time
 | 
|---|
| 88 |  . I XMD[":" D
 | 
|---|
| 89 |  . . S XMD=$P(X," ",1) ; "28-JUN-1955 17:30:45 -0400" or "6/28/55 17:30"
 | 
|---|
| 90 |  . . S XMT=$P(X," ",2,99)
 | 
|---|
| 91 |  . E  S XMT=$P(X," ",4,99)
 | 
|---|
| 92 |  I $G(XMTIME) Q $$TIMETOO(XMD,XMT)
 | 
|---|
| 93 |  S X=XMD
 | 
|---|
| 94 |  D ^%DT
 | 
|---|
| 95 |  Q Y
 | 
|---|
| 96 | TIMETOO(XMD,XMT) ; For internal MailMan use only.  Combine date and time, adjusting for difference from GMT.
 | 
|---|
| 97 |  N XMHH,XMMM,X,Y
 | 
|---|
| 98 |  I $L(XMT," ")>1 D  Q:XMMM=-1 -1
 | 
|---|
| 99 |  . N XMYT           ; 17:30:45 -0800 (PST)
 | 
|---|
| 100 |  . S XMYT=$TR($P(XMT," ",2),"()")
 | 
|---|
| 101 |  . D ZONEDIFF(XMYT,.XMHH,.XMMM)
 | 
|---|
| 102 |  E  D
 | 
|---|
| 103 |  . S (XMHH,XMMM)=0  ; 17:30:45
 | 
|---|
| 104 |  S XMT=$P(XMT," ",1)
 | 
|---|
| 105 |  S:$L($P(XMT,":"))=1 XMT="0"_XMT
 | 
|---|
| 106 |  S XMT=$E(XMT,1,5)  ; FM will only handle hh:mm, not :ss
 | 
|---|
| 107 |  S:XMT="00:00" XMT="00:01" ; if midnight, add a minute
 | 
|---|
| 108 |  S X=XMD_"@"_XMT
 | 
|---|
| 109 |  S %DT="T" D ^%DT Q:Y=-1 -1
 | 
|---|
| 110 |  I 'XMHH,'XMMM Q Y
 | 
|---|
| 111 |  Q $$FMADD^XLFDT(Y,"",XMHH,XMMM)
 | 
|---|
| 112 | ZONEDIFF(XMYT,XMHH,XMMM) ; Given a time zone or time difference from GMT,
 | 
|---|
| 113 |  ; calculates the hours and minutes difference between that zone and ours
 | 
|---|
| 114 |  ; XMYT    IN:  Your Time zone or Time difference from GMT
 | 
|---|
| 115 |  ; XMHH    OUT: The time difference between us in hours
 | 
|---|
| 116 |  ; XMMM    OUT: The time difference between us in minutes
 | 
|---|
| 117 |  ; XMYTHH  Your Time difference from GMT in hours
 | 
|---|
| 118 |  ; XMYTMM  Your Time difference from GMT in minutes
 | 
|---|
| 119 |  ; XMMT    My Time difference from GMT
 | 
|---|
| 120 |  ; XMMTHH  My Time difference from GMT in hours
 | 
|---|
| 121 |  ; XMMTMM  My Time difference from GMT in minutes
 | 
|---|
| 122 |  N XMMT,XMYTHH,XMYTMM,XMMTHH,XMMTMM
 | 
|---|
| 123 |  S XMMT=^XMB("TIMEDIFF")
 | 
|---|
| 124 |  I XMYT=^XMB("TIMEZONE")!(XMYT=XMMT) S (XMHH,XMMM)=0 Q
 | 
|---|
| 125 |  I XMYT?3A S XMYT=$$GMTDIFF(XMYT) I XMYT="" S XMMM=-1 Q
 | 
|---|
| 126 |  S XMYTHH=XMYT\100
 | 
|---|
| 127 |  S XMYTMM=XMYT-(XMYTHH*100)
 | 
|---|
| 128 |  S XMMTHH=XMMT\100
 | 
|---|
| 129 |  S XMMTMM=XMMT-(XMMTHH*100)
 | 
|---|
| 130 |  S XMHH=XMMTHH-XMYTHH
 | 
|---|
| 131 |  S XMMM=XMMTMM-XMYTMM
 | 
|---|
| 132 |  Q
 | 
|---|
| 133 |  ; Also, remember, FM will not handle a 1-digit year
 | 
|---|
| 134 |  ; If this becomes a problem:
 | 
|---|
| 135 |  I $L($P(X," ",3))=1 S $P(X," ",3)="0"_$P(X," ",3)
 | 
|---|
| 136 |  ; *****************************************************
 | 
|---|
| 137 | GMTDIFF(XMZONE) ; Given time zone, returns standard internet time difference from GMT
 | 
|---|
| 138 |  ; XMZONE   3-char time zone name (PST, EDT, etc.)
 | 
|---|
| 139 |  ; returns difference in hours and minutes (+-hhmm) from GMT
 | 
|---|
| 140 |  ;          e.g. -0230, +1600
 | 
|---|
| 141 |  ; If time zone can't be found, returns null string
 | 
|---|
| 142 |  N XMIEN
 | 
|---|
| 143 |  S XMIEN=$O(^XMB(4.4,"B",XMZONE,0)) Q:'XMIEN ""
 | 
|---|
| 144 |  S XMDIFF=$P($G(^XMB(4.4,XMIEN,0)),U,3) Q:XMIEN="" ""
 | 
|---|
| 145 |  Q $$TIMEDIFF(XMDIFF)
 | 
|---|
| 146 | TIMEDIFF(XMDIFF) ; Given time difference, returns standard internet time difference.
 | 
|---|
| 147 |  ; XMDIFF   Difference (in hours) from GMT
 | 
|---|
| 148 |  ;          e.g. -2.5 => -0230
 | 
|---|
| 149 |  ;                16  => +1600
 | 
|---|
| 150 |  N XMSIGN
 | 
|---|
| 151 |  I XMDIFF<0 S XMSIGN="-",XMDIFF=-XMDIFF
 | 
|---|
| 152 |  E  S XMSIGN="+"
 | 
|---|
| 153 |  S XMDIFF=XMDIFF\1*100+(XMDIFF#1*60\1)
 | 
|---|
| 154 |  Q XMSIGN_$$RJ^XLFSTR(XMDIFF,4,"0")
 | 
|---|
| 155 | CONFIRM(XMDUZ,XMZ,XMIM) ; For internal MailMan use only.  Send confirmation message to sender.
 | 
|---|
| 156 |  N XMPARM,XMTO
 | 
|---|
| 157 |  S XMPARM(1)=XMIM("SUBJ")
 | 
|---|
| 158 |  S XMPARM(2)=XMV("NAME") S:XMDUZ'=DUZ XMPARM(2)=XMPARM(2)_$$EZBLD^DIALOG(38008,XMV("DUZ NAME")) ; (Surrogate: |1|)
 | 
|---|
| 159 |  ;S XMPARM(3)=$S($D(^XMB(3.9,XMZ,5)):$P(^(5),U),1:XMZ)
 | 
|---|
| 160 |  S XMTO=XMIM("FROM")
 | 
|---|
| 161 |  S XMTO=$S(+XMTO=XMTO:XMTO,1:$$RCPTTO(XMZ))
 | 
|---|
| 162 |  D TASKBULL^XMXBULL(XMDUZ,"XMRDACK",.XMPARM,"",XMTO)
 | 
|---|
| 163 |  Q
 | 
|---|
| 164 | RCPTTO(XMZ) ; For internal MailMan use only.  Return-receipt-to a remote address.
 | 
|---|
| 165 |  N XMI,XMREC,XMHDR,XMTO
 | 
|---|
| 166 |  S XMI=0,XMHDR=""
 | 
|---|
| 167 |  F  S XMI=$O(^XMB(3.9,XMZ,2,XMI)) Q:XMI'<1!'XMI  S XMREC=^(XMI,0) D  Q:$D(XMTO)
 | 
|---|
| 168 |  . Q:XMREC=""
 | 
|---|
| 169 |  . S XMHDR=$P(XMREC,":") Q:XMHDR=""
 | 
|---|
| 170 |  . S XMHDR=$$UP^XLFSTR(XMHDR)
 | 
|---|
| 171 |  . I XMHDR="RETURN-RECEIPT-TO" S XMTO=$$SCRUB($P(XMREC,":",2,99)) Q
 | 
|---|
| 172 |  S:'$D(XMTO) XMTO=$P(^XMB(3.9,XMZ,0),U,2)
 | 
|---|
| 173 |  Q $$REMADDR^XMXADDR3(XMTO)
 | 
|---|