Armin van Harten posted this code to comp.lang.mumps. I
received permission to share it with M Computing
readers. Knowledge of German is useful, but not required. A
machine readable copy can be obtained by saving the source
code for this page. Code is used
entirely at the risk and responsibility of the person making the
copy.
-Kate Schell, Executive Editor
LIB LIB ;string routinen;LIB;LIB;Diverse Stringroutinen;van Harten;micro - M; [ Rev.: 20.09.96 ] Q ; no direct entry ; UP1(%00) ; -- FUNCTION: first char of each word uppercase, rest lowercase -- ; in :%00 ; N UPC,LOC,X,%000 S UPC="ABCDEFGHIJKLMNOPQRSTUVWXYZ???[\]",LOC="abcdefghijklmnopqrstuvwxyz???{|}" S %00=$TR(%00,UPC,LOC) S %000=$TR(%00,"-,.'"," ") ; valid delimiters " -,.'" S X=1 F S $E(%00,X)=$TR($E(%00,X),LOC,UPC),X=$F(%000," ",X) Q:'X Q %00 ; UP(%00) ; -- FUNCTION: translate all to uppercase -- ; in :%00 Q $TR(%00,"abcdefghijklmnopqrstuvwxyz???{|}","ABCDEFGHIJKLMNOPQRSTUVWXYZ???[\]") ; CTRL(%00) ; -- FUNCTION: remove control char's -- ;IN: %00 ;OUT: %00 Q $TR(%00,$C(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31),"") ; LOW(%00) ; -- FUNCTION: translate to lowercase -- ; in : %00 Q $TR(%00,"ABCDEFGHIJKLMNOPQRSTUVWXYZ???[\]","abcdefghijklmnopqrstuvwxyz???{|}") ; NUM(%00) ; -- FUNCTION: convert to numeric from: nnn,nnn.dd or.nnn.nnn,dd format -- ;IN :%00 ;OUT :%00 S %00=$TR(%00,", ",".") S:($L(%00,".")>2) %00=$TR($P(%00,".",1,$L(%00,".")-1),".","")_"."_$P(%00,".",$L(%00,".")) S %00=+%00 ;force numeric Q %00 ; NFILL(%00,%L) ; -- FUNCTION: fill with leading zeros up to fixed length -- ; in: %00=numeric, %L=fieldlength ; N (%00,%L,%ERR) S %00=$$NUM(%00) ; standardize Q:$L(%00)=%L %00 ; ok! ; I $L(%00)>%L Q "" ; error , par. mismatch Q $TR($J(%00,%L)," ","0") ; convert ; WRAP(TXT,XW,I) ; -- ROUTINE: linewrap -- ; in : TXT = original textline ; : XW = linewidth ; out : I = no. outputlines ; : XW = if line doesnt fit in XW, XW contains min. poss. linewidth ; N J,%0T I $L(TXT)'>XW S TXT(1)=TXT,I=1 Q ; no need to wrap ; S %0T=TXT F I=1:1 D Q:'$L(%0T) . I $L(%0T)<XW S TXT(I)=%0T,%0T="" Q ; rest . F J=XW:-1:0 Q:$E(%0T,J)=" " ; find new lineend . S TXT(I)=$S(J=0:TXT,1:$E(%0T,1,J)) ; cut . S %0T=$S(J=0:"",1:$E(%0T,J+1,$L(%0T))) ;update buffer . S XW=$S($L(TXT(I))>XW:$L(TXT(I)),1:XW) ;update linewidth . Q Q ; CLIPB(%00) ; -- FUNCTION: clip leading and trailing blanks -- ; in :%00 N I,J Q:'$L(%00) "" ; no chars I %00?1." " Q "" ; blankstring F I=1:1:$L(%00) Q:$E(%00,I)'=" " ; leading blanks up to .byte I F J=$L(%00):-1:I Q:$E(%00,J)'=" " ; trailing blanks down to byte J Q $E(%00,I,J) ; clip ; CLIP(%00,%0A) ; -- FUNCTION: clip leading and trailing %0A's -- ; in : %00 ; %0A single char (any char) N I,J Q:'$L(%00) I '$L($TR(%00,%0A,"")) Q "" F I=1:1:$L(%00) Q:$E(%00,I)'=%0A F J=$L(%00):-1:I Q:$E(%00,J)'=%0A Q $E(%00,I,J) ; clip ; UML(%00) ; -- FUNCTION: ersetze umlaute durch vokale (? ->AE,..) ; this routine solves a very german problem, quite nice ; in: %00 N X,I,Y,A,B,P,PA,L S X="AE,OE,UE,ae,oe,ue,sz,AE,OE,UE,ae,oe,ue,sz",Y="???????[\]{|}~" F I=1:1:$L(Y) S A=$E(Y,I),B=$P(X,",",I) D:%00[A . ; -- replace ju. -- . S (P,PA)=1,X="",L=$L(%00),LA=$L(A) . F J=0:0 S P=$F(%00,A,P) Q:'P S X=X_$E(%00,PA,P-LA-1)_B,PA=P . S %00=X_$E(%00,PA,L) . Q Q %00 ; REPL(%00,%0A,%0B) ; -- FUNCTION: replace string %0A with string %0B in string %00, VH -- ; in :%00,%0A,%0B N D,DA,F Q:'$L(%0A) %00 Q:%00'[%0A %00 S F=$F(%00,%0A),DA=$L(%0A),D=$L(%0B)-DA F S $E(%00,F-DA,F-1)=%0B,F=$F(%00,%0A,F+D) Q:'F Q %00 ;
Armin van Harten, has a degree in Meteorology and is a certified physician. He has 20 Years of experience in data processing as an analyst and developer and has used M since 1983. He has started the Institute of Medical Data Processing in Wetzlar and is hoping to become successful. He currently works part-time as a supervising doctor in a balneotherapeutic center for psoriasis treatment. Email: vanharten@aol.com