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 |
|
---|