| 1 |  ;"16-Feb-1999, 16:54:35
 | 
|---|
| 2 |  ;"Routine Save for all M[UMPS] Library Functions
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;" Unless otherwise noted, the code below
 | 
|---|
| 5 |  ;" was approved in document X11/95-11
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ;" If corrections have been applied,
 | 
|---|
| 8 |  ;" first the original line appears,
 | 
|---|
| 9 |  ;" with three semicolons at the beginning of the line.
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;" Then the source of the correction is acknowledged,
 | 
|---|
| 12 |  ;" then the corrected line appears, followed by a
 | 
|---|
| 13 |  ;" line containing three semicolons.
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  ;"Downloaded from http://www.jacquardsystems.com/Examples/lib/mlibfunc.rs
 | 
|---|
| 16 |  ;"on 5/21/07
 | 
|---|
| 17 | FORMAT(V,S) ;
 | 
|---|
| 18 |         ;
 | 
|---|
| 19 |         ;" The code below was approved in document X11/SC13/TG2/1999-1
 | 
|---|
| 20 |         ;
 | 
|---|
| 21 |         New lo,mask,out,p,pos,spec,up,v1,v2,val,x
 | 
|---|
| 22 |         ;
 | 
|---|
| 23 |         Set lo="abcdefghijklmnopqrstuvwxyz"
 | 
|---|
| 24 |         Set up="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
|---|
| 25 |         ;
 | 
|---|
| 26 |         ;" Array spec() contains the formatting directives
 | 
|---|
| 27 |         ;
 | 
|---|
| 28 |         ;" First set defaults
 | 
|---|
| 29 |         ;
 | 
|---|
| 30 |         Set spec("CS")="$" ;" Currency symbol
 | 
|---|
| 31 |         Set spec("DC")="." ;" Decimal separator
 | 
|---|
| 32 |         Set spec("EC")="*" ;" Error character
 | 
|---|
| 33 |         Set spec("SL")="," ;" Separator characters > 1
 | 
|---|
| 34 |         Set spec("FS")=" " ;" Fill string
 | 
|---|
| 35 |         ;
 | 
|---|
| 36 |         ;" Other specifiers may be
 | 
|---|
| 37 |         ;"  FM = Format Mask
 | 
|---|
| 38 |         ;"  FO = Fill On/Off
 | 
|---|
| 39 |         ;"  SR = Separator characters < 1
 | 
|---|
| 40 |         ;
 | 
|---|
| 41 |         ;" Then Inherit properties from System,
 | 
|---|
| 42 |         ;" overwriting the defaults
 | 
|---|
| 43 |         ;
 | 
|---|
| 44 |         Set x="" For  Set x=$Order(^$System($System,"FORMAT",x)) Quit:x=""  Do
 | 
|---|
| 45 |         . Set spec(x)=^$System($System,"FORMAT",x)
 | 
|---|
| 46 |         . Quit
 | 
|---|
| 47 |         ;
 | 
|---|
| 48 |         ;" Then Inherit properties from current process
 | 
|---|
| 49 |         ;" overwriting the system and the defaults
 | 
|---|
| 50 |         ;
 | 
|---|
| 51 |         Set x="" For  Set x=$Order(^$Job($Job,"FORMAT",x)) Quit:x=""  Do
 | 
|---|
| 52 |         . Set spec(x)=^$Job($Job,"FORMAT",x)
 | 
|---|
| 53 |         . Quit
 | 
|---|
| 54 |         ;
 | 
|---|
| 55 |         ;" Then look at actual parameters
 | 
|---|
| 56 |         ;" overwriting anything else
 | 
|---|
| 57 |         ;
 | 
|---|
| 58 |         Set S=$Get(S) For  Quit:S=""  Do
 | 
|---|
| 59 |         . New e,i,str,v
 | 
|---|
| 60 |         . Set x=$Piece(S,"=",1)
 | 
|---|
| 61 |         . Set i=$Length(x)+2,str=0,v=""
 | 
|---|
| 62 |         . Set:x="" i=1
 | 
|---|
| 63 |         . For i=i:1:$Length(S)+1 Do  Quit:'i
 | 
|---|
| 64 |         . . Set e=$Extract(S_":",i)
 | 
|---|
| 65 |         . . If 'str,e=":" Set S=$Extract(S,i+1,$Length(S)),i=0 Quit
 | 
|---|
| 66 |         . . Set v=v_e Quit:e'=""""
 | 
|---|
| 67 |         . . Set str=1-str
 | 
|---|
| 68 |         . . Quit
 | 
|---|
| 69 |         . If i>$Length(S) Set S=""
 | 
|---|
| 70 |         . If x'="",v'="" Set @("spec($Translate(x,lo,up))="_v) Quit
 | 
|---|
| 71 |         . Set $ECode=",M28,"
 | 
|---|
| 72 |         . Quit
 | 
|---|
| 73 |         ;
 | 
|---|
| 74 |         ;" Make certain that DC and EC are non-empty
 | 
|---|
| 75 |         ;" and not longer than 1 character
 | 
|---|
| 76 |         ;
 | 
|---|
| 77 |         Set spec("DC")=$Extract(spec("DC")_".",1)
 | 
|---|
| 78 |         Set spec("EC")=$Extract(spec("EC")_"*",1)
 | 
|---|
| 79 |         ;
 | 
|---|
| 80 |         Set val=$Get(V),(mask,out)=$Get(spec("FM"))
 | 
|---|
| 81 |         If mask="" Quit val
 | 
|---|
| 82 |         ;
 | 
|---|
| 83 |         ;" Currency string
 | 
|---|
| 84 |         ;
 | 
|---|
| 85 |         Set x=spec("CS")
 | 
|---|
| 86 |         Set pos=0 For  Set pos=$Find(mask,"c",pos) Quit:pos<1  Do
 | 
|---|
| 87 |         . Set $Extract(out,pos-1)=$Extract(x,1)
 | 
|---|
| 88 |         . Set x=$Extract(x,2,$Length(x))_$Extract(x,1)
 | 
|---|
| 89 |         . Quit
 | 
|---|
| 90 |         ;
 | 
|---|
| 91 |         ;" Sign
 | 
|---|
| 92 |         ;
 | 
|---|
| 93 |         Set x=$Select(val>0:"+",val<0:"-",1:" ")
 | 
|---|
| 94 |         Set pos=0 For  Set pos=$Find(mask,"+",pos) Quit:pos<1  Do
 | 
|---|
| 95 |         . Set $Extract(out,pos-1)=x
 | 
|---|
| 96 |         . Quit
 | 
|---|
| 97 |         Set pos=0 For  Set pos=$Find(mask,"-",pos) Quit:pos<1  Do
 | 
|---|
| 98 |         . Set $Extract(out,pos-1)=$Select(x="-":x,1:" ")
 | 
|---|
| 99 |         . Quit
 | 
|---|
| 100 |         If x'="-" Set out=$Translate(out,"()","  ")
 | 
|---|
| 101 |         ;
 | 
|---|
| 102 |         ;" Decimal separator
 | 
|---|
| 103 |         ;
 | 
|---|
| 104 |         Set pos=$Find(mask,"d")
 | 
|---|
| 105 |         Do:pos'<1
 | 
|---|
| 106 |         . Set $Extract(out,pos-1)=spec("DC")
 | 
|---|
| 107 |         . For  Set pos=$Find(mask,"d",pos) Quit:pos<1  Do
 | 
|---|
| 108 |         . . Set $Extract(out,pos-1)=spec("EC")
 | 
|---|
| 109 |         . . Quit
 | 
|---|
| 110 |         . Quit
 | 
|---|
| 111 |         ;
 | 
|---|
| 112 |         ;" Right (default, format letter "n") or
 | 
|---|
| 113 |         ;" left (format letter "l") adjustment?
 | 
|---|
| 114 |         ;
 | 
|---|
| 115 |         If mask["l",mask["n" Set $ECode=",M28,"
 | 
|---|
| 116 |         ;
 | 
|---|
| 117 |         ;" Left and Right Separators
 | 
|---|
| 118 |         ;
 | 
|---|
| 119 |         Set v1=$Piece(val,".",1),v2=$Piece(val,".",2)
 | 
|---|
| 120 |         Set v1=$Translate(v1,"-")
 | 
|---|
| 121 |         If mask'["l" Do
 | 
|---|
| 122 |         . Set x="" For p=1:1:$Length(v1) Set x=$Extract(v1,p)_x
 | 
|---|
| 123 |         . Set v1=x
 | 
|---|
| 124 |         . Quit
 | 
|---|
| 125 |         ;
 | 
|---|
| 126 |         Set pos=$Find(mask,"d") Set:pos<1 pos=$Length(mask)+2
 | 
|---|
| 127 |         ;
 | 
|---|
| 128 |         ;" Integer part and Left separators
 | 
|---|
| 129 |         ;
 | 
|---|
| 130 |         Set x=spec("SL")
 | 
|---|
| 131 |         Set p(1)=pos-2,p(2)=-1,p(3)=1
 | 
|---|
| 132 |         Set:mask["l" p(1)=1,p(2)=1,p(3)=pos-2
 | 
|---|
| 133 |         For p=p(1):p(2):p(3) Do
 | 
|---|
| 134 |         . If "fln"[$Extract(mask,p) Do
 | 
|---|
| 135 |         . . Set $Extract(out,p)=$Extract(v1,1)
 | 
|---|
| 136 |         . . Set v1=$Extract(v1,2,$Length(v1))_spec("FS")
 | 
|---|
| 137 |         . . If $Translate(v1,spec("FS"))="" Set x=spec("FS")
 | 
|---|
| 138 |         . . Quit
 | 
|---|
| 139 |         . If $Extract(mask,p)="s" Do
 | 
|---|
| 140 |         . . Set $Extract(out,p)=$Extract(x,1)
 | 
|---|
| 141 |         . . Set x=$Extract(x,2,$Length(x))_$Extract(x,1)
 | 
|---|
| 142 |         . Quit
 | 
|---|
| 143 |         ;
 | 
|---|
| 144 |         ;" Fractional part and Right separators
 | 
|---|
| 145 |         ;
 | 
|---|
| 146 |         Set x=$Get(spec("SR"),spec("SL"))
 | 
|---|
| 147 |         Set:v2="" v2=0
 | 
|---|
| 148 |         For p=pos:1:$Length(mask) Do
 | 
|---|
| 149 |         . If "fn"[$Extract(mask,p) Do
 | 
|---|
| 150 |         . . Set $Extract(out,p)=$Extract(v2,1)
 | 
|---|
| 151 |         . . Set v2=$Extract(v2,2,$Length(v2))_"0"
 | 
|---|
| 152 |         . . Quit
 | 
|---|
| 153 |         . If $Extract(mask,p)="s" Do
 | 
|---|
| 154 |         . . Set $Extract(out,p)=$Extract(x,1)
 | 
|---|
| 155 |         . . Set x=$Extract(x,2,$Length(x))_$Extract(x,1)
 | 
|---|
| 156 |         . . Quit
 | 
|---|
| 157 |         . Quit
 | 
|---|
| 158 |         ;
 | 
|---|
| 159 |         ;" Fill String
 | 
|---|
| 160 |         ;
 | 
|---|
| 161 |         Set x=$Get(spec("FS"))
 | 
|---|
| 162 |         For p=1:1:$l(mask) Do
 | 
|---|
| 163 |         . Quit:"nf"'[$Extract(mask,p)
 | 
|---|
| 164 |         . Quit:$Extract(out,p)'=" "
 | 
|---|
| 165 |         . Set $Extract(out,p)=$Extract(x,1)
 | 
|---|
| 166 |         . Set x=$Extract(x,2,$Length(x))_$Extract(x,1)
 | 
|---|
| 167 |         . Quit
 | 
|---|
| 168 |         ;
 | 
|---|
| 169 |         ;" Justification
 | 
|---|
| 170 |         ;
 | 
|---|
| 171 |         For x="+ | +","- | -","( | ("," )|) " Do
 | 
|---|
| 172 |         . New find,repl
 | 
|---|
| 173 |         . Set find=$Piece(x,"|",1),repl=$Piece(x,"|",2)
 | 
|---|
| 174 |         . For  Quit:out'[find  Do
 | 
|---|
| 175 |         . . Set out=$Piece(out,find,1)_repl_$Piece(out,find,2,$l(out)+2)
 | 
|---|
| 176 |         . . Quit
 | 
|---|
| 177 |         . Quit
 | 
|---|
| 178 |         ;
 | 
|---|
| 179 |         Quit out
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  ;===
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | CRC16(string,seed) ;
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  ;" The code below was approved in document X11/1998-32
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ;" Polynomial x**16 + x**15 + x**2 + x**0
 | 
|---|
| 189 |  NEW I,J,R
 | 
|---|
| 190 |  IF '$DATA(seed) SET R=0
 | 
|---|
| 191 |  ELSE  IF seed'<0,seed'>65535 SET R=seed\1
 | 
|---|
| 192 |  ELSE  SET $ECODE=",M28,"
 | 
|---|
| 193 |  FOR I=1:1:$LENGTH(string) DO
 | 
|---|
| 194 |  . SET R=$$XOR($ASCII(string,I),R,8)
 | 
|---|
| 195 |  . FOR J=0:1:7 DO
 | 
|---|
| 196 |  . . IF R#2 SET R=$$XOR(R\2,40961,16)
 | 
|---|
| 197 |  . . ELSE  SET R=R\2
 | 
|---|
| 198 |  . . QUIT
 | 
|---|
| 199 |  . QUIT
 | 
|---|
| 200 |  QUIT R
 | 
|---|
| 201 | XOR(a,b,w) NEW I,M,R
 | 
|---|
| 202 |  SET R=b,M=1
 | 
|---|
| 203 |  FOR I=1:1:w DO
 | 
|---|
| 204 |  . SET:a\M#2 R=R+$SELECT(R\M#2:-M,1:M)
 | 
|---|
| 205 |  . SET M=M+M
 | 
|---|
| 206 |  . QUIT
 | 
|---|
| 207 |  QUIT R
 | 
|---|
| 208 |  ;===
 | 
|---|
| 209 |  ;
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 | CRC32(string,seed) ;
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 |  ;" The code below was approved in document X11/1998-32
 | 
|---|
| 214 |  ;
 | 
|---|
| 215 |  ;" Polynomial X**32 + X**26 + X**23 + X**22 +
 | 
|---|
| 216 |  ;"          + X**16 + X**12 + X**11 + X**10 +
 | 
|---|
| 217 |  ;"          + X**8  + X**7  + X**5  + X**4 +
 | 
|---|
| 218 |  ;"          + X**2  + X     + 1
 | 
|---|
| 219 |  NEW I,J,R
 | 
|---|
| 220 |  IF '$DATA(seed) SET R=4294967295
 | 
|---|
| 221 |  ELSE  IF seed'<0,seed'>4294967295 SET R=4294967295-seed
 | 
|---|
| 222 |  ELSE  SET $ECODE=",M28,"
 | 
|---|
| 223 |  FOR I=1:1:$LENGTH(string) DO
 | 
|---|
| 224 |  . SET R=$$XOR($ASCII(string,I),R,8)
 | 
|---|
| 225 |  . FOR J=0:1:7 DO
 | 
|---|
| 226 |  . . IF R#2 SET R=$$XOR(R\2,3988292384,32)
 | 
|---|
| 227 |  . . ELSE  SET R=R\2
 | 
|---|
| 228 |  . . QUIT
 | 
|---|
| 229 |  . QUIT
 | 
|---|
| 230 |  QUIT 4294967295-R
 | 
|---|
| 231 | XOR(a,b,w) NEW I,M,R
 | 
|---|
| 232 |  SET R=b,M=1
 | 
|---|
| 233 |  FOR I=1:1:w DO
 | 
|---|
| 234 |  . SET:a\M#2 R=R+$SELECT(R\M#2:-M,1:M)
 | 
|---|
| 235 |  . SET M=M+M
 | 
|---|
| 236 |  . QUIT
 | 
|---|
| 237 |  QUIT R
 | 
|---|
| 238 |  ;" ===
 | 
|---|
| 239 |  ;
 | 
|---|
| 240 |  ;
 | 
|---|
| 241 | CRCCCITT(string,seed) ;
 | 
|---|
| 242 |  ;
 | 
|---|
| 243 |  ;" The code below was approved in document X11/1998-32
 | 
|---|
| 244 |  ;
 | 
|---|
| 245 |  ;" Polynomial x**16 + x**12 + x**5 + x**0
 | 
|---|
| 246 |  NEW I,J,R
 | 
|---|
| 247 |  IF '$DATA(seed) SET R=65535
 | 
|---|
| 248 |  ELSE  IF seed'<0,seed'>65535 SET R=seed\1
 | 
|---|
| 249 |  ELSE  SET $ECODE=",M28,"
 | 
|---|
| 250 |  FOR I=1:1:$LENGTH(string) DO
 | 
|---|
| 251 |  . SET R=$$XOR($ASCII(string,I)*256,R,16)
 | 
|---|
| 252 |  . FOR J=0:1:7 DO
 | 
|---|
| 253 |  . . SET R=R+R
 | 
|---|
| 254 |  . . QUIT:R<65536
 | 
|---|
| 255 |  . . SET R=$$XOR(4129,R-65536,13)
 | 
|---|
| 256 |  . . QUIT
 | 
|---|
| 257 |  . QUIT
 | 
|---|
| 258 |  QUIT R
 | 
|---|
| 259 | XOR(a,b,w) NEW I,M,R
 | 
|---|
| 260 |  SET R=b,M=1
 | 
|---|
| 261 |  FOR I=1:1:w DO
 | 
|---|
| 262 |  . SET:a\M#2 R=R+$SELECT(R\M#2:-M,1:M)
 | 
|---|
| 263 |  . SET M=M+M
 | 
|---|
| 264 |  . QUIT
 | 
|---|
| 265 |  QUIT R
 | 
|---|
| 266 |  ;" ===
 | 
|---|
| 267 |  ;
 | 
|---|
| 268 |  ;
 | 
|---|
| 269 | LOWER(A,CHARMOD) NEW lo,up,x,y
 | 
|---|
| 270 |  ;
 | 
|---|
| 271 |  ;" The code below was approved in document X11/1998-21
 | 
|---|
| 272 |  ;
 | 
|---|
| 273 |  SET x=$GET(CHARMOD)
 | 
|---|
| 274 |  SET lo="abcdefghijklmnopqrstuvwxyz"
 | 
|---|
| 275 |  SET up="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
|---|
| 276 |  IF x?1"^"1E.E DO
 | 
|---|
| 277 |  . SET x=$EXTRACT(x,2,$LENGTH(x))
 | 
|---|
| 278 |  . IF x?1"|".E DO
 | 
|---|
| 279 |  . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
 | 
|---|
| 280 |  . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
 | 
|---|
| 281 |  . . SET x=$REVERSE($PIECE(x,"|",1))
 | 
|---|
| 282 |  . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 283 |  . . QUIT
 | 
|---|
| 284 |  . ELSE  SET x=$GET(^$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 285 |  . QUIT
 | 
|---|
| 286 |  IF x="" SET x=^$JOB($JOB,"CHARACTER")
 | 
|---|
| 287 |  SET x=$GET(^$CHARACTER(x,"LOWER"))
 | 
|---|
| 288 |  IF x="" QUIT $TRANSLATE(A,up,lo)
 | 
|---|
| 289 |  SET @("x="_x_"(A)")
 | 
|---|
| 290 |  QUIT x
 | 
|---|
| 291 |  ;" ===
 | 
|---|
| 292 |  ;
 | 
|---|
| 293 |  ;
 | 
|---|
| 294 | PATCODE(A,PAT,CHARMOD) NEW x,y
 | 
|---|
| 295 |  ;
 | 
|---|
| 296 |  ;" The code below was approved in document X11/1998-21
 | 
|---|
| 297 |  ;
 | 
|---|
| 298 |  SET x=$GET(CHARMOD)
 | 
|---|
| 299 |  IF x?1"^"1E.E DO
 | 
|---|
| 300 |  . SET x=$EXTRACT(x,2,$LENGTH(x))
 | 
|---|
| 301 |  . IF x?1"|".E DO
 | 
|---|
| 302 |  . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
 | 
|---|
| 303 |  . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
 | 
|---|
| 304 |  . . SET x=$REVERSE($PIECE(x,"|",1))
 | 
|---|
| 305 |  . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 306 |  . . QUIT
 | 
|---|
| 307 |  . ELSE  SET x=$GET(^$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 308 |  . QUIT
 | 
|---|
| 309 |  IF x="" SET x=^$JOB($JOB,"CHARACTER")
 | 
|---|
| 310 |  SET x=$GET(^$CHARACTER(x,"PATCODE",PAT))
 | 
|---|
| 311 |  IF x="" QUIT 0
 | 
|---|
| 312 |  SET @("x="_x_"(A)")
 | 
|---|
| 313 |  QUIT x
 | 
|---|
| 314 |  ;" ===
 | 
|---|
| 315 |  ;
 | 
|---|
| 316 |  ;
 | 
|---|
| 317 | UPPER(A,CHARMOD) NEW lo,up,x,y
 | 
|---|
| 318 |  ;
 | 
|---|
| 319 |  ;" The code below was approved in document X11/1998-21
 | 
|---|
| 320 |  ;
 | 
|---|
| 321 |  SET x=$GET(CHARMOD)
 | 
|---|
| 322 |  SET lo="abcdefghijklmnopqrstuvwxyz"
 | 
|---|
| 323 |  SET up="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
|---|
| 324 |  IF x?1"^"1E.E DO
 | 
|---|
| 325 |  . SET x=$EXTRACT(x,2,$LENGTH(x))
 | 
|---|
| 326 |  . IF x?1"|".E DO
 | 
|---|
| 327 |  . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
 | 
|---|
| 328 |  . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
 | 
|---|
| 329 |  . . SET x=$REVERSE($PIECE(x,"|",1))
 | 
|---|
| 330 |  . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 331 |  . . QUIT
 | 
|---|
| 332 |  . ELSE  SET x=$GET(^$GLOBAL(x,"CHARACTER"))
 | 
|---|
| 333 |  . QUIT
 | 
|---|
| 334 |  IF x="" SET x=^$JOB($JOB,"CHARACTER")
 | 
|---|
| 335 |  SET x=$GET(^$CHARACTER(x,"UPPER"))
 | 
|---|
| 336 |  IF x="" QUIT $TRANSLATE(A,lo,up)
 | 
|---|
| 337 |  SET @("x="_x_"(A)")
 | 
|---|
| 338 |  QUIT x
 | 
|---|
| 339 |  ;" ===
 | 
|---|
| 340 |  ;
 | 
|---|
| 341 |  ;
 | 
|---|
| 342 | 
 | 
|---|
| 343 | 
 | 
|---|
| 344 | 
 | 
|---|
| 345 | 
 | 
|---|
| 346 | 
 | 
|---|
| 347 | 
 | 
|---|