Annotation of freem/mlib/%ulstring.m, revision 1.1
1.1 ! snw 1: %ulstring ; STRING library - version 0.5.0.1
! 2: ;
! 3: ; Unless otherwise noted, the code below
! 4: ; was approved in document X11/95-11
! 5: ;
! 6: ; If corrections have been applied,
! 7: ; first the original line appears,
! 8: ; with three semicolons at the beginning of the line.
! 9: ;
! 10: ; Then the source of the correction is acknowledged,
! 11: ; then the corrected line appears, followed by a
! 12: ; line containing three semicolons.
! 13: ;
! 14: ;
! 15: ;
! 16: PRODUCE(IN,SPEC,MAX) ;
! 17: NEW VALUE,AGAIN,P1,P2,I,COUNT
! 18: SET VALUE=IN,COUNT=0
! 19: FOR DO QUIT:'AGAIN
! 20: . SET AGAIN=0
! 21: . SET I=""
! 22: . FOR SET I=$ORDER(SPEC(I)) QUIT:I="" DO QUIT:COUNT<0
! 23: . . QUIT:$GET(SPEC(I,1))=""
! 24: . . QUIT:'($DATA(SPEC(I,2))#2)
! 25: . . FOR QUIT:VALUE'[SPEC(I,1) DO QUIT:COUNT<0
! 26: . . . SET P1=$PIECE(VALUE,SPEC(I,1),1)
! 27: . . . SET P2=$PIECE(VALUE,SPEC(I,1),2,$LENGTH(VALUE))
! 28: . . . SET VALUE=P1_SPEC(I,2)_P2,AGAIN=1
! 29: . . . SET COUNT=COUNT+1
! 30: . . . IF $DATA(MAX),COUNT>MAX SET COUNT=-1,AGAIN=0
! 31: . . . QUIT
! 32: . . QUIT
! 33: . QUIT
! 34: QUIT VALUE
! 35: ;===
! 36: ;
! 37: ;
! 38: REPLACE(IN,SPEC) ;
! 39: NEW L,MASK,K,I,LT,F,VALUE
! 40: SET L=$LENGTH(IN),MASK=$JUSTIFY("",L)
! 41: SET I="" FOR SET I=$ORDER(SPEC(I)) QUIT:I="" DO
! 42: . QUIT:'($DATA(SPEC(I,1))#2)
! 43: . QUIT:SPEC(I,1)=""
! 44: . QUIT:'($DATA(SPEC(I,2))#2)
! 45: . SET LT=$LENGTH(SPEC(I,1))
! 46: . SET F=0 FOR SET F=$FIND(IN,SPEC(I,1),F) QUIT:F<1 DO
! 47: . . QUIT:$E(MASK,F-LT,F-1)["X"
! 48: . . SET VALUE(F-LT)=SPEC(I,2)
! 49: . . SET $EXTRACT(MASK,F-LT,F-1)=$TRANSLATE($JUSTIFY("",LT)," ","X")
! 50: . . QUIT
! 51: . QUIT
! 52: SET VALUE="" FOR K=1:1:L DO
! 53: . IF $EXTRACT(MASK,K)=" " SET VALUE=VALUE_$EXTRACT(IN,K) QUIT
! 54: . SET:$DATA(VALUE(K)) VALUE=VALUE_VALUE(K)
! 55: . QUIT
! 56: QUIT VALUE
! 57: ;===
! 58: ;
! 59: ;
! 60: FORMAT(V,L) ;
! 61: ;
! 62: ; The code below was approved in document X11/SC13/1998-10
! 63: ;
! 64: NEW C,CD,CM,CS,DP,E,EX,FL,FM,FO,GL,GV1,GV2,GVL,GVM,GX,I,J,K,ST,TV,TY,V1,V2,VP
! 65: ;
! 66: ; Load up Format Directives from ^$FORMAT or ^SYSTEM("FORMAT")
! 67: DO:'$DATA(^$FORMAT) %INFORM
! 68: SET (FM,K)="",EX=0,EXS="EXS"
! 69: ;
! 70: ; Extract the working values from the command string
! 71: DO %PRELOAD
! 72: ;
! 73: ; Process the directives
! 74: DO %EVALU8
! 75: ;
! 76: ; Error Handling
! 77: DO:EX %ERROR
! 78: XECUTE:$LENGTH(EXS) "K "_EXS
! 79: QUIT K
! 80: ;
! 81: ; CM - Command Array
! 82: ; CS - Command String
! 83: ; DP - Decimal Pointer
! 84: ; EX - Exit Flag
! 85: ; EXS - KILL Exit String
! 86: ; FL - Field Length
! 87: ; FM - Format String
! 88: ; FO - Format Option Array
! 89: ; K - Return Output String
! 90: ; L - List of Directives
! 91: ; ST - String Extraction String
! 92: ; V - Input Value
! 93: ;
! 94: %PRELOAD ; Load the defaults prior to the application of directives
! 95: SET K=""
! 96: ; Load System Defaults
! 97: FOR SET K=$ORDER(^$SYSTEM("FORMAT",K)) QUIT:K="" DO
! 98: . SET FO(K)=^$SYSTEM("FORMAT",K)
! 99: . QUIT
! 100: ; Load Process Defaults
! 101: FOR SET K=$ORDER(^$FORMAT(K)) QUIT:K="" SET FO(K)=^$FORMAT(K)
! 102: SET (CS,L)=$GET(L)
! 103: ; Load Argument Overrides from the List of Directives
! 104: ; 1. Tokenize the Laterals
! 105: DO:L[""""
! 106: . SET CS=""
! 107: . FOR J=2:2:$LENGTH(L,"""") DO
! 108: . . SET ST=$GET(ST)+1,ST(ST)=$PIECE(L,"""",J)
! 109: . . SET:ST(ST)="" ST(ST)=""""
! 110: . . SET CS=CS_$PIECE(L,"""",J-1)_"%%"_ST_"%%"
! 111: . . QUIT
! 112: . SET CS=CS_$PIECE(L,"""",J+1)
! 113: . QUIT
! 114: ; 2. Evaluate the Directives
! 115: NEW C,L,X
! 116: FOR J=1:1:$LENGTH(CS,":") DO QUIT:EX
! 117: . SET CD=$PIECE(CS,":",J)
! 118: . SET X=$PIECE(CD,"="),TV=$PIECE(CD,"=",2,999)
! 119: . IF X="" SET EX=1 QUIT
! 120: . ; Uppercase Symbol Names Only
! 121: . SET TY=$TRANSLATE(X,"abcdefghijklm","ABCDEFGHIJKLM")
! 122: . SET TY=$TRANSLATE(TY,"nopqrstuvwxyz","NOPQRSTUVWXYZ")
! 123: . D
! 124: . . ; To bullet proof, Establish an error trap to %ERREX
! 125: . . IF ($LENGTH(TV,"%%")>1) DO %LOADTV SET FO(TY)=TV QUIT
! 126: . . IF TV="" SET FO(TY)="" QUIT
! 127: . . ; 3. Set the Directive in the FO array
! 128: . . SET FO(TY)=@TV
! 129: . . QUIT
! 130: . QUIT
! 131: ; 4) Construct a KILL Exit String for directives not in default list
! 132: NEW C,E
! 133: SET (C,E)=""
! 134: FOR SET C=$ORDER(FO(C)) QUIT:C="" SET @C=FO(C),E=E_C_","
! 135: SET EXS=E_"EXS"
! 136: SET:$DATA(FM) FL=$LENGTH(FM)
! 137: QUIT
! 138: ;
! 139: ; DC - Decimal Character
! 140: ; DP - Decimal Position
! 141: ; EX - Abnormal Condition Exit
! 142: ; FL - Format Length
! 143: ; FM - Format Mask
! 144: ; GV1 - Integer Portion
! 145: ; GV2 - Fractional Portion
! 146: ; K - Output Buffer
! 147: ; NOD - No Decimal
! 148: ; SV - Sign Value (1 = Positive, 0 = Negative)
! 149: ; V - Input Value
! 150: %EVALU8 ; Evaluate the input for loading into the output string
! 151: NEW NOD
! 152: SET SV=1
! 153: SET NOD='(FM["d")
! 154: SET:V<0 SV=0
! 155: SET V1=$PIECE(V,"."),V2=$PIECE(V,".",2),(GV1,GV2)=""
! 156: DO:FM'=""
! 157: . SET FL=$LENGTH(FM),DP=$FIND(FM,"d")-1
! 158: . SET:(DP<1) DP=$LENGTH(FM)
! 159: . QUIT
! 160: NEW C
! 161: DO %GETV1,%GETV2:'(NOD!EX)
! 162: QUIT:EX
! 163: ;
! 164: SET K=GV1_DC_GV2
! 165: SET:NOD K=GV1
! 166: IF $GET(FC)'="" SET:K[" " K=$TRANSLATE(K," ",FC)
! 167: SET:$LENGTH(K)'=FL EX=1
! 168: QUIT
! 169: ;
! 170: %GETV1 ; Get the integer portion of the value and lay it in GV1
! 171: NEW CP,SP
! 172: IF $GET(SL)'="" NEW SC SET SC=SL
! 173: ; 1) Set the Integer Portion of the Mask (GVM) and Length (GVL)
! 174: SET GVM=$PIECE(FM,"d"),GVL=$LENGTH(GVM),GL=0
! 175: ; 2) Get the absolute value of V1
! 176: SET:$EXTRACT(V1)="-" V1=$EXTRACT(V1,2,999)
! 177: ; 3) Establish Blank Mask, GV1
! 178: SET GV1=$J("",GVL),VP=$LENGTH(V1),(CP,SP)=1
! 179: ;
! 180: ; Rounding of Integer (NO DECIMAL PORTION)
! 181: SET:$PIECE(FM,"d",2)="" V1=$EXTRACT((V+.5)\1,1,$LENGTH(V1))
! 182: ; 4) Extract value for each position in the mask and set it
! 183: FOR L=GVL:-1:1 SET C=$EXTRACT(GVM,L) DO QUIT:EX
! 184: . SET GX=0
! 185: . DO %TRANSV1
! 186: . QUIT:GX!EX
! 187: . ;
! 188: . SET:GC'=" " $EXTRACT(GV1,L)=GC
! 189: . QUIT
! 190: SET:VP EX=1
! 191: QUIT
! 192: ;
! 193: %GETV2 ; Get the fractional portion of the value and lay it in GV2
! 194: NEW CP,SP
! 195: IF $GET(SR)'="" NEW SC SET SC=SR
! 196: SET GVM=$PIECE(FM,"d",2),GVL=$LENGTH(GVM),GL=0,SP=1
! 197: DO:GVL<$LENGTH(V2) ; Rounding of Decimal
! 198: . NEW J,N
! 199: . SET N=$EXTRACT($TRANSLATE($J("",GVL)," ",0)_5_$TRANSLATE($J("",$LENGTH(V2))," ",0),1,$LENGTH(V2))
! 200: . SET V2=$EXTRACT(V2+N,1,$LENGTH(V2))
! 201: . QUIT
! 202: SET GV2=$J("",GVL),VP=1,CP=1
! 203: FOR L=1:1:GVL SET C=$EXTRACT(GVM,L) DO QUIT:EX
! 204: . SET GX=0
! 205: . DO %TRANSV2
! 206: . QUIT:GX!EX
! 207: . ;
! 208: . SET:GC'=" " $EXTRACT(GV2,L)=GC
! 209: . QUIT
! 210: QUIT
! 211: ;
! 212: ; C - Current Mask Character from the FM
! 213: ; CP - Character Position
! 214: ; L - Position within
! 215: ; VP - Value Position
! 216: ; (integer - Right to Left, fraction - Left to Right)
! 217: %TRANSV1 ; Translate the value into the mask
! 218: SET (GC,GL)=" "
! 219: QUIT:"x "[C
! 220: ;
! 221: ; Value Completed, Apply Currency/Float/etc, if requested
! 222: IF 'VP DO
! 223: . IF "c"[C DO QUIT
! 224: . . SET:$GET(CP)="" CP=$LENGTH(CS)
! 225: . . SET GC=$EXTRACT(CS,CP),CP=CP-1
! 226: . . SET:CP<1 CP=$LENGTH(CS)
! 227: . . QUIT
! 228: . IF GVM["f" DO QUIT
! 229: . . NEW F,I,LI,LX,X,Q
! 230: . . SET X=" ",LI=L,LX=0
! 231: . . DO ; Identify the Value Represented
! 232: . . . IF GVM["+"!(GVM["-") DO QUIT
! 233: . . . . SET:GVM["+" X="+"
! 234: . . . . SET:V<0 X="-"
! 235: . . . . QUIT
! 236: . . . IF GVM["(" DO:V<0 QUIT
! 237: . . . . SET X=" ",LX=1
! 238: . . . . QUIT
! 239: . . . QUIT
! 240: . . FOR I=L:1:GVL SET Q=$EXTRACT(GV1,I) QUIT:Q?1N QUIT:("("_DC)[Q DO
! 241: . . . SET F=$EXTRACT(GVM,I),LI=I
! 242: . . . SET:"fs("[F $EXTRACT(GV1,I)=X
! 243: . . . QUIT
! 244: . . SET BYE=1
! 245: . . SET:LX $EXTRACT(GV1,LI)="("
! 246: . . QUIT
! 247: . QUIT
! 248: IF C="+" SET GC="+" SET:'SV GC="-" SET GL=GC QUIT
! 249: IF C="-" SET:'SV GC="-" SET GL=GC QUIT
! 250: IF C="(" SET:'SV GC="(" SET GL=GC QUIT
! 251: IF C=")" SET:'SV GC=")" SET GL=GC QUIT
! 252: DO:VP
! 253: . IF C="c" DO QUIT
! 254: . . SET:$GET(CP)="" CP=$LENGTH(CS)
! 255: . . SET GC=$EXTRACT(CS,CP),CP=CP-1
! 256: . . SET:CP<1 SP=$LENGTH(CS)
! 257: . . QUIT
! 258: . IF "fn+-"[C SET GC=$EXTRACT(V1,VP),VP=VP-1 QUIT
! 259: . IF C="s" DO QUIT
! 260: . . SET:$GET(SP)="" SP=$LENGTH(SC)
! 261: . . SET GC=$EXTRACT(SC,SP),SP=SP-1
! 262: . . SET:SP<1 SP=$LENGTH(SC)
! 263: . . QUIT
! 264: . QUIT
! 265: QUIT
! 266: ;
! 267: ; "c" - Currency
! 268: ; "f" - Floating
! 269: ; "n" - Numeric
! 270: ; "s" - Separator
! 271: ; "+-()" - Sign Representations
! 272: ;
! 273: %TRANSV2 ; Translate the value into the mask
! 274: SET GC=" "
! 275: QUIT:"x "[C
! 276: ;
! 277: DO:VP
! 278: . IF "f"[C DO QUIT
! 279: . . SET:$GET(CP)="" CP=1
! 280: . . SET GC=$EXTRACT(CS,CP),CP=CP+1
! 281: . . SET:CP>$LENGTH(CS) CP=1
! 282: . . QUIT
! 283: . IF C="n" DO QUIT
! 284: . . SET GC=$EXTRACT(V2,VP),VP=VP+1
! 285: . . SET:VP>$LENGTH(V2) VP=0
! 286: . . QUIT
! 287: . IF C="s" DO QUIT
! 288: . . SET GC=$EXTRACT(SC,SP),SP=SP+1
! 289: . . SET:SP<$LENGTH(SP) SP=1
! 290: . . QUIT
! 291: . QUIT
! 292: IF "c"[C DO QUIT
! 293: . SET:$GET(CP)="" CP=1
! 294: . SET GC=$EXTRACT(CS,CP)
! 295: . SET:CP>$LENGTH(CS) GC=" "
! 296: . SET CP=CP+1
! 297: . QUIT
! 298: IF C="+" SET GC="+" SET:'SV GC="-" SET GL=GC QUIT
! 299: IF C="-" SET:'SV GC="-" SET GL=GC QUIT
! 300: IF C="(" SET:'SV GC="(" SET GL=GC QUIT
! 301: IF C=")" SET:'SV GC=")" SET GL=GC QUIT
! 302: QUIT
! 303: ;
! 304: %ERREX ; Error Exit point
! 305: DO %ERROR
! 306: QUIT K
! 307: ;
! 308: ; EC - Error Coded String (1 character or longer)
! 309: ; EL - Error Code Length
! 310: ; FL - Field Length
! 311: ; K - Output String, The Error Message goes here.
! 312: %ERROR ; %ERROR HANDLING
! 313: NEW C,E,EL,L
! 314: SET:$GET(FL)<1 FL=$$%FLDLNG(0)
! 315: SET E=$GET(EC),K="",L=1
! 316: SET:E="" E="*"
! 317: SET EL=$LENGTH(E)
! 318: FOR I=1:1:FL SET C=$EXTRACT(E,L),L=L+1 SET:L>EL L=1 SET K=K_C
! 319: QUIT
! 320: ;
! 321: %LOADTV ; Do the translation of the temporary value with the string
! 322: NEW X
! 323: SET X=""
! 324: FOR M=1:2:$LENGTH(TV,"%%") DO
! 325: . SET X=X_$PIECE(TV,"%%",M)
! 326: . SET N=$PIECE(TV,"%%",M+1)
! 327: . SET:N X=X_ST(N)
! 328: . QUIT
! 329: SET TV=X
! 330: QUIT
! 331: ;
! 332: %FLDLNG(F) ; FIELD LENGTH Callable from Just About Anywhere
! 333: SET F=$GET(F)
! 334: QUIT:F F
! 335: ;
! 336: SET F=$LENGTH($GET(FO("FM")))
! 337: IF 'F DO
! 338: . SET F=$GET(FO("FL"))
! 339: . IF 'F DO
! 340: . . SET F=$LENGTH($GET(^$FORMAT("FM")))
! 341: . . IF 'F DO
! 342: . . . SET F=$GET(^$FORMAT("FL"))
! 343: . . . IF 'F DO
! 344: . . . . SET F=$LENGTH($GET(^$SYSTEM("FORMAT","FM")))
! 345: . . . . IF 'F SET F=$GET(^$SYSTEM("FORMAT","FL"))
! 346: . . . . QUIT
! 347: . . . QUIT
! 348: . . QUIT
! 349: . QUIT
! 350: SET:'F F=10
! 351: QUIT F
! 352: ;
! 353: ; Format Default Load
! 354: ;
! 355: %INFORM ; Load up the defaults
! 356: NEW K,X
! 357: SET K="",X="FORMAT"
! 358: IF '$DATA(^$FORMAT) DO QUIT:$DATA(^$SYSTEM(X))
! 359: . IF '$DATA(^$SYSTEM(X)) DO QUIT
! 360: . . SET ^$FORMAT("SC")=",",^$FORMAT("DC")="."
! 361: . . SET ^$FORMAT("CS")="$",^$FORMAT("EC")="*"
! 362: . . QUIT
! 363: . MERGE ^$FORMAT=^$SYSTEM("FORMAT")
! 364: . QUIT
! 365: ; IF ^SYSTEM DOES NOT EXIST, CREATE IT
! 366: DO:'$DATA(^$SYSTEM(X))
! 367: . MERGE ^$SYSTEM("FORMAT")=^$FORMAT
! 368: . QUIT
! 369: QUIT
! 370: ;
! 371: ;===
! 372: ;
! 373: ;
! 374: CRC16(string,seed) ;
! 375: ;
! 376: ; The code below was approved in document X11/1998-32
! 377: ;
! 378: ; Polynomial x**16 + x**15 + x**2 + x**0
! 379: NEW I,J,R
! 380: IF '$DATA(seed) SET R=0
! 381: ELSE IF seed'<0,seed'>65535 SET R=seed\1
! 382: ELSE SET $ECODE=",M28,"
! 383: FOR I=1:1:$LENGTH(string) DO
! 384: . SET R=$$%XOR($ASCII(string,I),R,8)
! 385: . FOR J=0:1:7 DO
! 386: . . IF R#2 SET R=$$%XOR(R\2,40961,16)
! 387: . . ELSE SET R=R\2
! 388: . . QUIT
! 389: . QUIT
! 390: QUIT R
! 391: %XOR(a,b,w) NEW I,M,R
! 392: SET R=b,M=1
! 393: FOR I=1:1:w DO
! 394: . SET:a\M#2 R=R+$SELECT(R\M#2:-M,1:M)
! 395: . SET M=M+M
! 396: . QUIT
! 397: QUIT R
! 398: ;===
! 399: ;
! 400: ;
! 401: CRC32(string,seed) ;
! 402: ;
! 403: ; The code below was approved in document X11/1998-32
! 404: ;
! 405: ; Polynomial X**32 + X**26 + X**23 + X**22 +
! 406: ; + X**16 + X**12 + X**11 + X**10 +
! 407: ; + X**8 + X**7 + X**5 + X**4 +
! 408: ; + X**2 + X + 1
! 409: NEW I,J,R
! 410: IF '$DATA(seed) SET R=4294967295
! 411: ELSE IF seed'<0,seed'>4294967295 SET R=seed\1
! 412: ELSE SET $ECODE=",M28,"
! 413: FOR I=1:1:$LENGTH(string) DO
! 414: . SET R=$$%XOR($ASCII(string,I),R,8)
! 415: . FOR J=0:1:7 DO
! 416: . . IF R#2 SET R=$$%XOR(R\2,3988292384,32)
! 417: . . ELSE SET R=R\2
! 418: . . QUIT
! 419: . QUIT
! 420: QUIT 4294967295-R
! 421: ; ===
! 422: ;
! 423: ;
! 424: CRCCCITT(string,seed) ;
! 425: ;
! 426: ; The code below was approved in document X11/1998-32
! 427: ;
! 428: ; Polynomial x**16 + x**12 + x**5 + x**0
! 429: NEW I,J,R
! 430: IF '$DATA(seed) SET R=65535
! 431: ELSE IF seed'<0,seed'>65535 SET R=seed\1
! 432: ELSE SET $ECODE=",M28,"
! 433: FOR I=1:1:$LENGTH(string) DO
! 434: . SET R=$$%XOR($ASCII(string,I)*256,R,16)
! 435: . FOR J=0:1:7 DO
! 436: . . SET R=R+R
! 437: . . QUIT:R<65536
! 438: . . SET R=$$%XOR(4129,R-65536,13)
! 439: . . QUIT
! 440: . QUIT
! 441: QUIT R
! 442: ; ===
! 443: ;
! 444: ;
! 445: LOWER(A,CHARMOD) NEW lo,up,x,y
! 446: ;
! 447: ; The code below was approved in document X11/1998-21
! 448: ;
! 449: SET x=$GET(CHARMOD)
! 450: SET lo="abcdefghijklmnopqrstuvwxyz"
! 451: SET up="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
! 452: QUIT $TRANSLATE(A,up,lo)
! 453: IF x?1"^"1E.E DO
! 454: . SET x=$EXTRACT(x,2,$LENGTH(x))
! 455: . IF x?1"|".E DO
! 456: . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
! 457: . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
! 458: . . SET x=$REVERSE($PIECE(x,"|",1))
! 459: . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
! 460: . . QUIT
! 461: . ELSE SET x=$GET(^$GLOBAL(x,"CHARACTER"))
! 462: . QUIT
! 463: IF x="" SET x=^$JOB($JOB,"CHARACTER")
! 464: SET x=$GET(^$CHARACTER(x,"LOWER"))
! 465: IF x="" QUIT $TRANSLATE(A,up,lo)
! 466: SET @("x="_x_"(A)")
! 467: QUIT x
! 468: ; ===
! 469: ;
! 470: ;
! 471: PATCODE(A,PAT,CHARMOD) NEW x,y
! 472: ;
! 473: ; The code below was approved in document X11/1998-21
! 474: ;
! 475: SET x=$GET(CHARMOD)
! 476: IF x?1"^"1E.E DO
! 477: . SET x=$EXTRACT(x,2,$LENGTH(x))
! 478: . IF x?1"|".E DO
! 479: . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
! 480: . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
! 481: . . SET x=$REVERSE($PIECE(x,"|",1))
! 482: . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
! 483: . . QUIT
! 484: . ELSE SET x=$GET(^$GLOBAL(x,"CHARACTER"))
! 485: . QUIT
! 486: IF x="" SET x=^$JOB($JOB,"CHARACTER")
! 487: SET x=$GET(^$CHARACTER(x,"PATCODE",PAT))
! 488: IF x="" QUIT 0
! 489: SET @("x="_x_"(A)")
! 490: QUIT x
! 491: ; ===
! 492: ;
! 493: ;
! 494: UPPER(A,CHARMOD) NEW lo,up,x,y
! 495: ;
! 496: ; The code below was approved in document X11/1998-21
! 497: ;
! 498: SET x=$GET(CHARMOD)
! 499: SET lo="abcdefghijklmnopqrstuvwxyz"
! 500: SET up="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
! 501: QUIT $TRANSLATE(A,lo,up)
! 502: IF x?1"^"1E.E DO
! 503: . SET x=$EXTRACT(x,2,$LENGTH(x))
! 504: . IF x?1"|".E DO
! 505: . . SET x=$REVERSE($EXTRACT(x,2,$LENGTH(x)))
! 506: . . SET y=$REVERSE($PIECE(x,"|",2,$LENGTH(x)+2))
! 507: . . SET x=$REVERSE($PIECE(x,"|",1))
! 508: . . SET x=$GET(^|y|$GLOBAL(x,"CHARACTER"))
! 509: . . QUIT
! 510: . ELSE SET x=$GET(^$GLOBAL(x,"CHARACTER"))
! 511: . QUIT
! 512: IF x="" SET x=^$JOB($JOB,"CHARACTER")
! 513: SET x=$GET(^$CHARACTER(x,"UPPER"))
! 514: IF x="" QUIT $TRANSLATE(A,lo,up)
! 515: SET @("x="_x_"(A)")
! 516: QUIT x
! 517: ; ===
! 518: ;
! 519: ;
! 520:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>