mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Merged with upstream. Updated M (aka MUMPS) detection to use the new bayesian / samples method.
This commit is contained in:
23
samples/M/GMRGPNB0.m
Normal file
23
samples/M/GMRGPNB0.m
Normal file
@@ -0,0 +1,23 @@
|
||||
GMRGPNB0 ;CISC/JH/RM-NARRATIVE BUILDER FOR TEXT GENERATOR (cont.) ;6/20/91
|
||||
;;3.0;Text Generator;;Jan 24, 1996
|
||||
TEXT ; ENTRY WITH GMRGA SET TO POINT AT WHICH WANT TO START BUILDING TEXT
|
||||
S (GMRGE0,GMRGADD)=""
|
||||
Q:'$D(^GMR(124.3,GMRGPDA,1,"ALIST",GMRGA0))&GMRGCSW Q:('$D(^GMR(124.3,"B",GMRGA0,GMRGPDA))&'$D(^GMR(124.3,GMRGPDA,1,"B",GMRGA0)))&'GMRGCSW D NOW^%DTC
|
||||
S GMRGB0=$O(^GMR(124.3,GMRGPDA,1,"B",GMRGA0,0)) I GMRGB0>0 S GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=$S(GMRGCSW=1:%,1:GMRGPDT) D STAT^GMRGRUT0 S GMRGF0=GMRGSTAT,GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=GMRGPDT D STAT^GMRGRUT0
|
||||
I GMRGB0>0 S GMRGE0=$S($P(GMRGSTAT,"^",3)=1:"",$P(GMRGSTAT,"^")=$P(GMRGF0,"^"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,0)):$P(^(0),"^",2),1:""),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,+$P(GMRGSTAT,"^"),0)):$P(^(0),"^",4),1:""))
|
||||
I S GMRGADD=$S($P(GMRGSTAT,"^",3)=1:"",$P(GMRGSTAT,"^")=$P(GMRGF0,"^"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,"ADD")):"1;"_GMRGB0_";0",1:""),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,$P(GMRGSTAT,"^"),"ADD")):"1;"_GMRGB0_";2;"_$P(GMRGSTAT,"^"),1:""))
|
||||
S GMRGE0(0)=$S($D(^GMRD(124.2,GMRGA0,0)):^(0),1:""),GMRGE0(4)=$S($D(^GMRD(124.2,GMRGA0,4)):^(4),1:""),GMRGE0(5)=$S($D(^GMRD(124.2,GMRGA0,5)):^(5),1:"") Q:$P(GMRGE0(0),"^",2)=3&GMRGSSW
|
||||
I "S"[$P(GMRGE0(0),"^",8)!GMRGSSW D SNT^GMRGPNB1 Q
|
||||
S GMRGNAR=GMRGPAR_"^"_$P(GMRGE0(0),"^",8)_"^"_GMRGSPC_"^^"_GMRGRM,GMRGNAR(0)=$P(GMRGE0(0),"^")_"^"_GMRGE0,GMRGNAR("LEAD")=GMRGE0(4),GMRGNAR("TRAIL")=GMRGE0(5) D STORETXT^GMRGRUT1
|
||||
S GMRGSPC=GMRGSPC+3
|
||||
F GMRGD0=0:0 S GMRGD0=$O(^GMRD(124.2,GMRGA0,1,GMRGD0)) Q:GMRGD0'>0 D RECUR
|
||||
Q:'GMRGADD
|
||||
S GMRGNAR=GMRGPAR_"^T^"_GMRGSPC_"^^"_GMRGRM,GMRGNAR("LEAD")="Additional Text: ",GMRGNAR("TRAIL")=""
|
||||
S GMRGNAR(0)=$S('$P(GMRGADD,";",3):^GMR(124.3,GMRGPDA,1,$P(GMRGADD,";",2),"ADD"),1:^GMR(124.3,GMRGPDA,1,$P(GMRGADD,";",2),2,$P(GMRGADD,";",4),"ADD")) D STORETXT^GMRGRUT1
|
||||
Q
|
||||
RECUR ;
|
||||
Q:'$$ALIST^GMRGRUT0(GMRGPDA,GMRGA0,+$G(^GMRD(124.2,+GMRGA0,1,+GMRGD0,0)))
|
||||
S ^TMP($J,"GMRGPLVL",GMRGPLVL)=GMRGA0_"^"_GMRGD0_"^"_GMRGSPC_"^"_GMRGSSW_"^"_GMRGADD,GMRGPLVL=GMRGPLVL+1,GMRGA0=$S($D(^GMRD(124.2,GMRGA0,1,GMRGD0,0)):$P(^(0),"^"),1:"")
|
||||
D TEXT
|
||||
S GMRGPLVL=GMRGPLVL-1,GMRGI0=^TMP($J,"GMRGPLVL",GMRGPLVL),GMRGA0=$P(GMRGI0,"^"),GMRGD0=$P(GMRGI0,"^",2),GMRGSPC=$P(GMRGI0,"^",3),GMRGSSW=$P(GMRGI0,"^",4),GMRGADD=$P(GMRGI0,"^",5)
|
||||
Q
|
||||
2460
samples/M/MDB.m
Normal file
2460
samples/M/MDB.m
Normal file
File diff suppressed because it is too large
Load Diff
34
samples/M/PRCAAPR.m
Normal file
34
samples/M/PRCAAPR.m
Normal file
@@ -0,0 +1,34 @@
|
||||
PRCAAPR ;WASH-ISC@ALTOONA,PA/RGY-PATIENT ACCOUNT PROFILE (CONT) ;3/9/94 8:41 AM
|
||||
V ;;4.5;Accounts Receivable;**198,221**;Mar 20, 1995
|
||||
;;Per VHA Directive 10-93-142, this routine should not be modified.
|
||||
EN(PRCATY) ;
|
||||
NEW DIC,X,Y,DEBT,PRCADB,DA,PRCA,COUNT,OUT,SEL,BILL,BAT,TRAN,DR,DXS,DTOUT,DIROUT,DIRUT,DUOUT
|
||||
ASK N DPTNOFZY,DPTNOFZK S (DPTNOFZY,DPTNOFZK)=1
|
||||
K OUT S COUNT=0 R !,"Select DEBTOR NAME or BILL NUMBER: ",X:DTIME I "^"[$E(X) S $P(DEBT,"^",2)="" G Q
|
||||
S X=$$UPPER^VALM1(X)
|
||||
S Y=$S($O(^PRCA(430,"B",X,0)):$O(^(0)),$O(^PRCA(430,"D",X,0)):$O(^(0)),1:-1)
|
||||
I Y>0 S DEBT=$P($G(^PRCA(430,Y,0)),"^",9) I DEBT S PRCADB=$P($G(^RCD(340,DEBT,0)),"^"),^DISV(DUZ,"^PRCA(430,")=Y,$P(DEBT,"^",2)=$$NAM^RCFN01(DEBT) D COMP,EN1^PRCAATR(Y) G:$D(DTOUT) Q G ASK
|
||||
S DIC="^RCD(340,",DIC(0)="E" D ^DIC G:Y<0 ASK
|
||||
S ^DISV(DUZ,"^RCD(340,")=+Y,PRCADB=$P(Y,"^",2),DEBT=+Y_"^"_$P(@("^"_$P(PRCADB,";",2)_+PRCADB_",0)"),"^")
|
||||
D COMP,HDR^PRCAAPR1,HDR2^PRCAAPR1,DIS^PRCAAPR1 G:'$D(DTOUT) ASK
|
||||
Q K ^TMP("PRCAAPR",$J) Q
|
||||
COMP ;Compile patient bills
|
||||
K ^TMP("PRCAAPR",$J)
|
||||
NEW STAT,STAT1,CNT,Y
|
||||
S STAT1=0
|
||||
F CNT=1:1 S STAT1=+$S(PRCATY="ALL":$O(^PRCA(430,"AS",+DEBT,STAT1)),1:$O(^PRCA(430.3,"AC",+$P(PRCATY,",",CNT),0))) Q:'STAT1 F BILL=0:0 S BILL=$O(^PRCA(430,"AS",+DEBT,STAT1,BILL)) Q:'BILL D COMP1
|
||||
I PRCADB[";DPT(" F BILL=0:0 S BILL=$O(^PRCA(430,"E",+PRCADB,BILL)) Q:'BILL I PRCATY="ALL"!((","_PRCATY_",")[(","_$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),"^",8),0)),"^",3)_",")) D COMP1
|
||||
F BAT=0:0 S BAT=$O(^RCY(344,"AC",PRCADB,BAT)) Q:'BAT F TRAN=0:0 S TRAN=$O(^RCY(344,"AC",PRCADB,BAT,TRAN)) Q:'TRAN I $G(^RCY(344,BAT,1,TRAN,0))]"",$P(^(0),"^",5)="" D COMP2
|
||||
Q
|
||||
COMP1 S STAT=$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),"^",8),0)),"^",3) Q:STAT=""
|
||||
S X=$G(^PRCA(430,BILL,7)),Y=$P(X,"^")+$P(X,"^",2)+$P(X,"^",3)+$P(X,"^",4)+$P(X,"^",5)
|
||||
I $P(^PRCA(430,BILL,0),"^",2)=$O(^PRCA(430.2,"AC",33,0)) S Y=-Y
|
||||
S Y=$S($P(^PRCA(430,BILL,0),"^",2)=$O(^PRCA(430.2,"AC",33,0))&(STAT'=112):0,$P(^PRCA(430,BILL,0),"^",9)'=+DEBT:0,",102,107,112,"[(","_STAT_","):Y,1:0)
|
||||
S ^TMP("PRCAAPR",$J,"C")=$G(^TMP("PRCAAPR",$J,"C"))+Y
|
||||
S ^TMP("PRCAAPR",$J,"C",STAT)=$G(^TMP("PRCAAPR",$J,"C",STAT))+Y_"^"_STAT,^(STAT,BILL)=$P(X,"^",1,5)
|
||||
Q
|
||||
COMP2 ;Compile payments
|
||||
S Y=$P(^RCY(344,BAT,1,TRAN,0),"^",4)
|
||||
S ^TMP("PRCAAPR",$J,"C")=$G(^TMP("PRCAAPR",$J,"C"))-Y
|
||||
S ^TMP("PRCAAPR",$J,"C",99)=$G(^TMP("PRCAAPR",$J,"C",99))-Y_"^99",^TMP("PRCAAPR",$J,"C",99,$P(^RCY(344,BAT,0),"^")_"-"_TRAN)=$P(^RCY(344,BAT,1,TRAN,0),"^",4)
|
||||
Q
|
||||
203
samples/M/PXAI.m
Normal file
203
samples/M/PXAI.m
Normal file
@@ -0,0 +1,203 @@
|
||||
PXAI ;ISL/JVS,ISA/KWP,ESW - PCE DRIVING RTN FOR 'DATA2PCE' API ;6/20/03 11:15am
|
||||
;;1.0;PCE PATIENT CARE ENCOUNTER;**15,74,69,102,111,112,130,164,168**;Aug 12, 1996;Build 14
|
||||
Q
|
||||
;
|
||||
;+ 1 2 3 4 5 6 7 8 9
|
||||
DATA2PCE(PXADATA,PXAPKG,PXASOURC,PXAVISIT,PXAUSER,PXANOT,ERRRET,PXAPREDT,PXAPROB,PXACCNT) ;+API to pass data for add/edit/delete to PCE.
|
||||
;+ PXADATA (required)
|
||||
;+ PXAPKG (required)
|
||||
;+ PXASOURC (required)
|
||||
;+ PXAVISIT (optional) is pointer to a visit for which the data is to
|
||||
;+ be related. If the visit is not known then there must be
|
||||
;+ the ENCOUNTER nodes needed to lookup/create the visit.
|
||||
;+ PXAUSER (optional) this is a pointer to the user adding the data.
|
||||
;+ PXANOT (optional) set to 1 if errors are to be displayed to the screen should only be set while writing and debugging the initial code.
|
||||
;+ ERRRET (optional) passed by reference. If present will return PXKERROR
|
||||
;+ array elements to the caller.
|
||||
;+ PXAPREDT (optional) Set to 1 if you want to edit the Primary Provider
|
||||
;+ only use if for the moment that editing is being done. (dangerous)
|
||||
;+ PXAPROB (optional) A dotted variable name. When errors and
|
||||
;+ warnings occur, They will be passed back in the form
|
||||
;+ of an array with the general description of the problem.
|
||||
;+ IF ERROR1 - (GENERAL ERRORS)
|
||||
;+ PXAPROB($J,SUBSCRIPT,"ERROR1",PASSED IN 'FILE',PASSED IN FIELD,
|
||||
;+ SUBSCRIPT FROM PXADATA)
|
||||
;+ PXAPROB(23432234,2,"ERROR1","PROVIDER","NAME",7)="BECAUSE..."
|
||||
;+ IF WARNING2 - (GENERAL WARNINGS)
|
||||
;+ PXAPROB($J,SUBSCRIPT,"WARNING2",PASSED IN 'FILE',PASSED IN FIELD,
|
||||
;+ SUBSCRIPT FROM PXADATA)
|
||||
;+ PXAPROB(23432234,3,"WARNING2","PROCEDURE","QTY",3)="BECAUSE..."
|
||||
;+ IF WARNING3 - (WARNINGS FOR SERVICE CONNECTION)
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"AO")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"EC")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"IR")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"SC")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"MST")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"HNC")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"CV")=REASON
|
||||
;+ PXAPROB($J,1,"WARNING3","ENCOUNTER",1,"SHAD")=REASON
|
||||
;+ IF ERROR4 - (PROBLEM LIST ERRORS)
|
||||
;+ PXAPROB($J,6,"ERROR4","PX/DL",(SUBSCRIPT FROM PXADATA))=REASON
|
||||
;+ PXACCNT (optional) passed by reference. Returns the PFSS Account Reference if known.
|
||||
; Returned as null if the PFSS Account Reference is located in the Order file(#100)
|
||||
;+
|
||||
;+
|
||||
;+ Returns:
|
||||
;+ 1 if no errors and process completely
|
||||
;+ -1 if errors occurred but processed completely as possible
|
||||
;+ -2 if could not get a visit
|
||||
;+ -3 if called incorrectly
|
||||
;
|
||||
NEW ;--NEW VARIABLES
|
||||
N NOVSIT,PXAK,DFN,PXAERRF,PXADEC,PXELAP,PXASUB
|
||||
N PATIENT,VALQUIET,PRIMFND
|
||||
K PXAERROR,PXKERROR,PXAERR,PRVDR
|
||||
S PXASUB=0,VALQUIET=1
|
||||
; needs to look up if not passed.
|
||||
I '$G(PXAVISIT),'$D(@PXADATA@("ENCOUNTER")) Q -3
|
||||
I $G(PXAUSER)<1 S PXAUSER=DUZ
|
||||
;
|
||||
K ^TMP("PXK",$J),^TMP("DIERR",$J),^TMP("PXAIADDPRV",$J)
|
||||
SOR ;--SOURCE
|
||||
I PXAPKG=+PXAPKG S PXAPKG=PXAPKG
|
||||
E S PXAPKG=$$PKG2IEN^VSIT(PXAPKG)
|
||||
I PXASOURC=+PXASOURC S PXASOURC=PXASOURC
|
||||
E S PXASOURC=$$SOURCE^PXAPIUTL(PXASOURC)
|
||||
;
|
||||
D TMPSOURC^PXAPIUTL(PXASOURC) ;-SAVES & CREATES ^TMP("PXK",$J,"SOR")
|
||||
VST ;--VISIT
|
||||
;--KILL VISIT
|
||||
I $G(PXAVISIT) D VPTR^PXAIVSTV I $G(PXAERRF) D ERR Q -2
|
||||
D VST^PXAIVST
|
||||
I $G(PXAVISIT)<0 Q -2
|
||||
I $G(PXAERRF) D ERR K PXAERR Q -2
|
||||
PRV ;--PROVIDER
|
||||
S PATIENT=$P($G(^AUPNVSIT(PXAVISIT,0)),"^",5)
|
||||
S (PXAK,PRIMFND)=0
|
||||
F S PXAK=$O(@PXADATA@("PROVIDER",PXAK)) Q:(PRIMFND)!(PXAK="") D
|
||||
.I $D(@PXADATA@("PROVIDER",PXAK,"PRIMARY")) D
|
||||
..S PRIMFND=$G(@PXADATA@("PROVIDER",PXAK,"PRIMARY"))
|
||||
I 'PRIMFND D ;Check for each provider's status as Primary or Secondary
|
||||
.S PXAK=0 F S PXAK=$O(@PXADATA@("PROVIDER",PXAK)) Q:PXAK="" D
|
||||
..I '$D(@PXADATA@("PROVIDER",PXAK,"PRIMARY")) D PROVDRST
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("PROVIDER",PXAK)) Q:PXAK="" D
|
||||
. D PRV^PXAIPRV I $G(PXAERRF) D ERR
|
||||
K PRI ;--FLAG FOR PRIMARY PROVIDER
|
||||
K PXAERR
|
||||
POV ;--DIAGNOSIS
|
||||
S (PXAK,PRIMFND)=0
|
||||
F S PXAK=$O(@PXADATA@("DX/PL",PXAK)) Q:(PXAK="") D Q:PRIMFND
|
||||
.I +$G(@PXADATA@("DX/PL",PXAK,"PRIMARY"))=1 D
|
||||
..S PRIMFND=$G(@PXADATA@("DX/PL",PXAK,"DIAGNOSIS"))
|
||||
I $D(@PXADATA@("DX/PL")) D POVPRM(PXAVISIT,PRIMFND,.PXADATA) D
|
||||
.S PXAK=0 F S PXAK=$O(@PXADATA@("DX/PL",PXAK)) Q:PXAK="" D
|
||||
..D POV^PXAIPOV I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
CPT ;--PROCEDURE
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("PROCEDURE",PXAK)) Q:PXAK="" D
|
||||
. D CPT^PXAICPT I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
EDU ;--PATIENT EDUCATION
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("PATIENT ED",PXAK)) Q:PXAK="" D
|
||||
. D EDU^PXAIPED I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
EXAM ;--EXAMINATION
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("EXAM",PXAK)) Q:PXAK="" D
|
||||
. D EXAM^PXAIXAM I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
HF ;--HEALTH FACTOR
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("HEALTH FACTOR",PXAK)) Q:PXAK="" D
|
||||
. D HF^PXAIHF I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
IMM ;--IMMUNIZATION
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("IMMUNIZATION",PXAK)) Q:PXAK="" D
|
||||
. D IMM^PXAIIMM I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
SKIN ;--SKIN TEST
|
||||
S PXAK=0 F S PXAK=$O(@PXADATA@("SKIN TEST",PXAK)) Q:PXAK="" D
|
||||
. D SKIN^PXAISK I $G(PXAERRF) D ERR
|
||||
K PXAERR
|
||||
;
|
||||
;
|
||||
D OTHER^PXAIPRV
|
||||
;
|
||||
;
|
||||
I $D(^TMP("PXK",$J)) D
|
||||
. D EN1^PXKMAIN
|
||||
. M ERRRET=PXKERROR
|
||||
. D PRIM^PXAIPRV K PRVDR
|
||||
. D EVENT^PXKMAIN
|
||||
S PXACCNT=$P($G(^AUPNVSIT(PXAVISIT,0)),"^",26) ;PX*1.0*164 ;Sets the PFSS Account Reference, if any
|
||||
K ^TMP("PXK",$J),PXAERR,PXKERROR
|
||||
Q $S($G(PXAERRF):-1,1:1)
|
||||
;
|
||||
;
|
||||
EXIT ;--EXIT AND CLEAN UP
|
||||
D EVENT^PXKMAIN
|
||||
K ^TMP("PXK",$J),PRVDR
|
||||
K PXAERR
|
||||
Q
|
||||
;-----------------SUBROUTINES-----------------------
|
||||
ERR ;
|
||||
;
|
||||
;
|
||||
I '$D(PXADI("DIALOG")) Q
|
||||
N NODE,SCREEN
|
||||
S PXAERR(1)=$G(PXADATA),PXAERR(2)=$G(PXAPKG),PXAERR(3)=$G(PXASOURC)
|
||||
S PXAERR(4)=$G(PXAVISIT),PXAERR(5)=$G(PXAUSER)_" "_$P($G(^VA(200,PXAUSER,0)),"^",1)
|
||||
I $G(PXANOT)=1 D EXTERNAL
|
||||
E D INTERNAL
|
||||
D ARRAY^PXAICPTV
|
||||
K PXADI("DIALOG")
|
||||
Q
|
||||
;
|
||||
EXTERNAL ;---SEND ERRORS TO SCREEN
|
||||
W !,"-----------------------------------------------------------------"
|
||||
D BLD^DIALOG($G(PXADI("DIALOG")),.PXAERR,"","SCREEN","F")
|
||||
D MSG^DIALOG("ESW","",50,10,"SCREEN")
|
||||
;
|
||||
Q
|
||||
INTERNAL ;---SET ERRORS TO GLOBAL ARRAY
|
||||
S NODE=PXADATA
|
||||
D BLD^DIALOG($G(PXADI("DIALOG")),.PXAERR,.PXAERR,NODE,"F")
|
||||
S NODE=$NA(@PXADATA@("DIERR",$J)) D MSG^DIALOG("ESW","",50,10,NODE)
|
||||
Q
|
||||
;
|
||||
PROVDRST ; Check provider status (Primary or Secondary)
|
||||
N PRVIEN,DETS,DIC,DR,DA,DIQ,PRI,PRVPRIM
|
||||
I $G(PXAK)="" QUIT
|
||||
S PRVIEN=0
|
||||
F S PRVIEN=$O(^AUPNVPRV("AD",PXAVISIT,PRVIEN)) Q:PRVIEN="" D
|
||||
.S DETS=$G(^AUPNVPRV(PRVIEN,0))
|
||||
.I $P(DETS,U)=$G(@PXADATA@("PROVIDER",PXAK,"NAME")) D
|
||||
..S DIC=9000010.06,DR=.04,DA=PRVIEN
|
||||
..S DIQ="PRVPRIM(",DIQ(0)="EI" D EN^DIQ1
|
||||
..S PRI=$E($G(PRVPRIM(9000010.06,DA,DR,"E")),1,1)
|
||||
..S @PXADATA@("PROVIDER",PXAK,"PRIMARY")=$S(PRI="P":1,1:0)
|
||||
Q
|
||||
POVPRM(VISIT,PRIMFND,POVARR) ;
|
||||
N PRVIEN,DETS,STOP,LPXAK,ORDX,NDX,ORDXP
|
||||
S PRVIEN=0
|
||||
;create array of existing DX; ORDX - pointer to ^ICD9(
|
||||
F S PRVIEN=$O(^AUPNVPOV("AD",PXAVISIT,PRVIEN)) Q:PRVIEN="" D
|
||||
.S DETS=$G(^AUPNVPOV(PRVIEN,0)),ORDX=$P(DETS,U)
|
||||
.S ORDX(ORDX)=PRVIEN I $P(DETS,U,12)="P" S ORDXP(ORDX)=""
|
||||
; create array of passed DX; NDX - pointer to ^ICD9(
|
||||
S PXAK=0 F S PXAK=$O(@POVARR@("DX/PL",PXAK)) Q:PXAK="" D
|
||||
.S NDX=$G(@POVARR@("DX/PL",PXAK,"DIAGNOSIS")) S NDX(NDX)=PXAK
|
||||
; force entry of originally primary diagnosis with "S" flag
|
||||
I PRIMFND S ORDX="" D
|
||||
.F S ORDX=$O(ORDXP(ORDX)) Q:ORDX="" I PRIMFND'=ORDX D
|
||||
..I $D(NDX(ORDX)) S @POVARR@("DX/PL",NDX(ORDX),"PRIMARY")=0
|
||||
..E D
|
||||
...S LPXAK=$O(@POVARR@("DX/PL",""),-1)
|
||||
...S @POVARR@("DX/PL",LPXAK+1,"DIAGNOSIS")=ORDX
|
||||
...S @POVARR@("DX/PL",LPXAK+1,"PRIMARY")=0
|
||||
Q
|
||||
;
|
||||
112
samples/M/WVBRNOT.m
Normal file
112
samples/M/WVBRNOT.m
Normal file
@@ -0,0 +1,112 @@
|
||||
WVBRNOT ;HCIOFO/FT,JR IHS/ANMC/MWR - BROWSE NOTIFICATIONS; ;7/30/98 11:02
|
||||
;;1.0;WOMEN'S HEALTH;;Sep 30, 1998
|
||||
;;* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER *
|
||||
;; CALLED BY OPTION: "WV BROWSE NOTIFICATIONS" TO BROWSE AND EDIT
|
||||
;; NOTIFICATIONS.
|
||||
;
|
||||
;---> VARIABLES:
|
||||
;---> WVA: 1=ALL PATIENTS, 0=ONE PATIENT
|
||||
;---> WVDFN: DFN OF SELECTED PATIENT
|
||||
;---> DATES: WVBEGDT=BEGINNING DATE, WVENDDT=ENDING DATE
|
||||
;---> WVB: d=DELINQUENT, o=OPEN, q=queued, a=ALL (includes CLOSED).
|
||||
;---> SORT SEQUENCE IN WVC: 1=DATE, PATIENT, PRIORITY
|
||||
;---> 2=PATIENT, DATE, PRIORITY
|
||||
;---> 3=PRIORITY, DATE, PATIENT
|
||||
;---> USE NODES 3 & 4 IN ^TMP GLOBAL.
|
||||
;
|
||||
D SETVARS^WVUTL5
|
||||
D ^WVBRNOT2 G:WVPOP EXIT
|
||||
D SORT
|
||||
D COPYGBL
|
||||
D ^WVBRNOT1
|
||||
;
|
||||
EXIT ;EP
|
||||
D KILLALL^WVUTL8
|
||||
Q
|
||||
;
|
||||
;
|
||||
SORT ;EP
|
||||
;---> SORT AND STORE ARRAY IN ^TMP("WV",$J
|
||||
K ^TMP("WV",$J)
|
||||
;---> WVBEGDT1=ONE SECOND BEFORE BEGIN DATE.
|
||||
;---> WVENDDT1=THE LAST SECOND OF END DATE.
|
||||
S WVBEGDT1=WVBEGDT-.0001,WVENDDT1=WVENDDT+.9999
|
||||
;
|
||||
;**************************
|
||||
;---> WVA=1: ALL PATIENTS
|
||||
I WVA D Q
|
||||
.;---> BY DATE GET EITHER ALL OR OPEN ONLY.
|
||||
.N WVDFN,WVIEN,Y
|
||||
.S WVXREF=$S(WVB="a":"D",WVB="q":"APRT",1:"AOPEN")
|
||||
.S WVDATE=WVBEGDT1
|
||||
.F S WVDATE=$O(^WV(790.4,WVXREF,WVDATE)) Q:'WVDATE!(WVDATE>WVENDDT1) D
|
||||
..S WVIEN=0
|
||||
..F S WVIEN=$O(^WV(790.4,WVXREF,WVDATE,WVIEN)) Q:'WVIEN D
|
||||
...Q:'$D(^WV(790.4,WVIEN,0))
|
||||
...S Y=^WV(790.4,WVIEN,0),WVDFN=$P(Y,U)
|
||||
...;---> QUIT IF SELECTING FOR ONE CASE MANAGER AND THIS DOESN'T MATCH.
|
||||
...I 'WVE Q:$P(^WV(790,WVDFN,0),U,10)'=WVCMGR
|
||||
...;---> QUIT IF LISTING "DELINQUENT" AND THIS PROCDURE IS NOT DELINQ.
|
||||
...I WVB="d" Q:$P(Y,U,13)'<DT!($P(Y,U,13)="")
|
||||
...D STORE
|
||||
;
|
||||
;**************************
|
||||
;---> WVA=0: ONE PATIENT
|
||||
N WVIEN,Y S WVIEN=0
|
||||
F S WVIEN=$O(^WV(790.4,"B",WVDFN,WVIEN)) Q:'WVIEN D
|
||||
.S Y=^WV(790.4,WVIEN,0)
|
||||
.;---> QUIT IF NOT WITHIN DATE RANGE.
|
||||
.S WVDATE=$P(Y,U,2)
|
||||
.Q:WVDATE'>WVBEGDT1!(WVDATE>WVENDDT1)
|
||||
.;---> QUIT IF "QUEUED" AND THIS NOTIFICATION IS NOT QUEUED.
|
||||
.I WVB="q" Q:'$P(Y,U,11) Q:'$D(^WV(790.4,"APRT",$P(Y,U,11),WVIEN))
|
||||
.;---> QUIT IF "DELINQUENT" OR OPEN ONLY AND THIS ENTRY IS CLOSED.
|
||||
.Q:"do"[WVB&($P(Y,U,14)="c")
|
||||
.I WVB="d" Q:$P(Y,U,13)'<DT!($P(Y,U,13)="")
|
||||
.D STORE
|
||||
Q
|
||||
;
|
||||
STORE ;EP
|
||||
;--->WVDATE IS ALREADY SET FROM LL SORT ABOVE. ;---> DATE
|
||||
S WVCHRT=$$SSN^WVUTL1(WVDFN)_" " ;---> SSN#
|
||||
S WVNAME=$$NAME^WVUTL1(WVDFN) ;---> NAME
|
||||
S WVACC=$P(Y,U,6) ;---> ACCESSION#
|
||||
I WVACC]"" S WVACC=$P(^WV(790.1,WVACC,0),U)
|
||||
S WVSTAT=$$STATUS^WVUTL4 ;---> STATUS
|
||||
S WVPRIO=9
|
||||
S:$P(Y,U,4)]"" WVPRIO=$P(^WV(790.404,$P(Y,U,4),0),U,2) ;---> PRIORITY
|
||||
;
|
||||
S X=WVCHRT_U_WVNAME_U_WVDATE_U_WVACC_U_WVSTAT_U_WVPRIO_U_WVIEN
|
||||
I WVC=1 S ^TMP("WV",$J,3,WVDATE,WVNAME,WVPRIO,WVIEN)=X Q
|
||||
I WVC=2 S ^TMP("WV",$J,3,WVNAME,WVDATE,WVPRIO,WVIEN)=X Q
|
||||
I WVC=3 S ^TMP("WV",$J,3,WVPRIO,WVDATE,WVNAME,WVIEN)=X
|
||||
Q
|
||||
;
|
||||
COPYGBL ;EP
|
||||
;---> COPY ^TMP("WV",$J,3 TO ^TMP("WV",$J,4 TO MAKE IT FLAT.
|
||||
N I,M,N,P,Q
|
||||
S N=0,I=0
|
||||
F S N=$O(^TMP("WV",$J,3,N)) Q:N="" D
|
||||
.S M=0
|
||||
.F S M=$O(^TMP("WV",$J,3,N,M)) Q:M="" D
|
||||
..S P=0
|
||||
..F S P=$O(^TMP("WV",$J,3,N,M,P)) Q:P="" D
|
||||
...S Q=0
|
||||
...F S Q=$O(^TMP("WV",$J,3,N,M,P,Q)) Q:Q="" D
|
||||
....S I=I+1,^TMP("WV",$J,4,I)=^TMP("WV",$J,3,N,M,P,Q)
|
||||
Q
|
||||
;
|
||||
;
|
||||
DEQUEUE ;EP
|
||||
;---> TASKMAN QUEUE OF PRINTOUT.
|
||||
D SETVARS^WVUTL5,SORT,COPYGBL,^WVBRNOT1,EXIT
|
||||
Q
|
||||
;
|
||||
FOLLOW(WVDFN) ;EP
|
||||
;---> CALLED FROM PROCEDURE FOLLOWUP MENU.
|
||||
D SETVARS^WVUTL5
|
||||
S WVA=0,WVB="o",WVBEGDT=(DT-50000),WVC=1,WVE=1,WVENDDT=DT
|
||||
D DEVICE^WVBRNOT2 Q:WVPOP
|
||||
S WVLOOP=1
|
||||
D SORT,COPYGBL,^WVBRNOT1
|
||||
Q
|
||||
171
samples/M/ZDIOUT1.m
Normal file
171
samples/M/ZDIOUT1.m
Normal file
@@ -0,0 +1,171 @@
|
||||
ZDIOUT1 ; Experimental FileMan file output to host file
|
||||
;---------------------------------------------------------------------------
|
||||
; Copyright 2011 The Open Source Electronic Health Record Agent
|
||||
;
|
||||
; Licensed under the Apache License, Version 2.0 (the "License");
|
||||
; you may not use this file except in compliance with the License.
|
||||
; You may obtain a copy of the License at
|
||||
;
|
||||
; http://www.apache.org/licenses/LICENSE-2.0
|
||||
;
|
||||
; Unless required by applicable law or agreed to in writing, software
|
||||
; distributed under the License is distributed on an "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
; See the License for the specific language governing permissions and
|
||||
; limitations under the License.
|
||||
;---------------------------------------------------------------------------
|
||||
N W "Experimental FileMan file output to host file",!
|
||||
D ASKFILE Q:FILE["^"
|
||||
D ASKDIR Q:DIR["^"
|
||||
D SAVEFILE(FILE,DIR)
|
||||
Q
|
||||
SAVEFILE(FILE,DIR) ; Save FILE to given host directory
|
||||
I '$$SLASH(DIR) Q
|
||||
N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,"Not a valid file number: "_FILE)
|
||||
S IO=DIR_$P($E(FGR,2,$L(FGR)),"(")_"+"_$$FILENAME(FILE,FGR)_".txt"
|
||||
W IO,!
|
||||
C IO O IO:("WNS"):1 E U $P W "Cannot open """_IO_""" for write!",! Q
|
||||
D FILE("",FILE,FGR)
|
||||
C IO
|
||||
Q
|
||||
PRNFILE(FILE,IO) ; Print FILE, optionally to IO device
|
||||
S:'$D(IO) IO=$P
|
||||
N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,"Not a valid file number: "_FILE)
|
||||
D FILE("",FILE,FGR)
|
||||
Q
|
||||
PRNENTRY(FILE,I,IO) ; Print FILE record #I, optionally to IO device
|
||||
S:'$D(IO) IO=$P
|
||||
N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,"Not a valid file number: "_FILE)
|
||||
N DD D DDCR(FILE,.DD)
|
||||
D ENTITY("",FILE,.DD,$$EGR(FGR,I))
|
||||
Q
|
||||
PRNDD(FILE,IO) ; Print DD for FILE, optionally to IO device
|
||||
S:'$D(IO) IO=$P
|
||||
; DD(FILE) is a file#0 whose entries define fields of FILE
|
||||
N FGR S FGR=$NA(^DD(FILE))
|
||||
I '$D(@FGR) W "Not a valid file number: "_FILE,! Q
|
||||
D FILE("",0,FGR)
|
||||
Q
|
||||
;---------------------------------------------------------------------------
|
||||
; Private implementation entry points below.
|
||||
; References cite the VA FileMan 22.0 Programmer Manual.
|
||||
;
|
||||
ASKFILE ; Ask for file number
|
||||
R !,"File#: ",FILE G:FILE="" ASKFILE Q:FILE["^" S FILE=+FILE
|
||||
S FGR=$$FGR(FILE)
|
||||
I '$$CHECK(FGR," (Not a valid file number)") G ASKFILE
|
||||
W " ",$$FILENAME(FILE,FGR)
|
||||
Q
|
||||
ASKDIR ; Ask for host dir
|
||||
R !,!,"Host output directory: ",DIR,! Q:DIR["^" G:'$$SLASH(DIR) ASKDIR
|
||||
Q
|
||||
SLASH(DIR) ; Validate trailing slash
|
||||
I $E(DIR,$L(DIR))?1(1"/",1"\") Q 1
|
||||
E U $P W "Output directory must end in a slash!" Q 0
|
||||
FGR(FILE) ; Get FILE Global Root
|
||||
Q $$ROOT^DILFD(FILE,"",1)
|
||||
EGR(FGR,I) ; Get ENTRY Global Root
|
||||
Q $NA(@FGR@(I))
|
||||
CHECK(V,MSG) ; Validate non-empty value
|
||||
I V="" W MSG,! Q 0
|
||||
Q 1
|
||||
DDCR(FILE,DD) ; X-ref global subscript location to DD field
|
||||
; The DD field definition 0-node has ^-pieces "^^^S;P^" where
|
||||
; "S;P" is the node Subscript and Piece within the node value (14.9.2).
|
||||
N F S F="" F S F=$O(^DD(FILE,F)) Q:F="" D:+F
|
||||
. N F4,S,P S F4=$P(^DD(FILE,F,0),"^",4),S=$P(F4,";",1),P=$P(F4,";",2) Q:S=" "
|
||||
. S DD(S,F)=P ; Subscript S contains field F at piece P
|
||||
Q
|
||||
FILE(D,FILE,FGR) ; Write all entries in a file
|
||||
; TODO: Sort entries by .01 or KEY to ensure consistent order
|
||||
N DD D DDCR(FILE,.DD)
|
||||
N I S I="" F S I=$O(@FGR@(I)) Q:I="" D
|
||||
. I +I D
|
||||
. . D ENTITY(D,FILE,.DD,$$EGR(FGR,I))
|
||||
. E D ; TODO: Handle known non-entry subscripts such as "B"
|
||||
. . D SUBS(D,$$EGR(FGR,I),I)
|
||||
Q
|
||||
WP(D,FGR) ; Write a word-processing value
|
||||
; A word processing field is actually a file in which each entry has a
|
||||
; .01 field containing the line of text, and the type of the field has "W".
|
||||
U IO W D,";",$$VALUE(@FGR@(0)),! ; TODO: Preserve date from ^(0)
|
||||
N I S I="" F S I=$O(@FGR@(I)) Q:I="" D:+I ; TODO: Other subscripts?
|
||||
. U IO W D,$$VALUE(@FGR@(I,0)),!
|
||||
U IO W D,";",!
|
||||
Q
|
||||
ENTITY(D,FILE,DD,EGR) ; Write a file entry
|
||||
U IO W D,"ENTITY"_$C(9)_";;"_$$FILENAME(FILE,FGR)_"^"_$S(FILE=0:"",1:FILE)_" ;"_EGR,!
|
||||
U IO W D_$C(9)_";",!
|
||||
; Add key tag with field .01 value (14.9.2).
|
||||
; TODO: Use indexing cross-references or KEY file entries for key tags?
|
||||
; TODO: Escape key values, handle pointers?
|
||||
U IO W D,"KA"_$C(9)_";;",$P(@EGR@(0),"^"),!
|
||||
U IO W D_$C(9)_";",!
|
||||
N S S S="" F S S=$O(@EGR@(S)) Q:S="" D ; Find DD fields at S.
|
||||
. I $D(DD(S))<10 D ; TODO: Field defs like "DEL" not in ^DD(0)
|
||||
. . D SUBS(D,$NA(@EGR@(S)),S)
|
||||
. N F S F="" F S F=$O(DD(S,F)) Q:F="" D
|
||||
. . D FIELD(D,FILE,F,$NA(@EGR@(S)),DD(S,F))
|
||||
Q
|
||||
;
|
||||
SUBS(D,G,S) ; Write an extraneous subscript
|
||||
U IO W D,"SUBS"_$C(9)_";;"_S,!
|
||||
I $D(@G)#10 U IO W D_$C(9),$$VALUE(@G),!
|
||||
I $D(@G)\10 U IO W D_$C(9),"; OMITTED CHILDREN",!
|
||||
U IO W D_$C(9),";",!
|
||||
Q
|
||||
FIELD(D,FILE,F,EGRF,P) ; Write a field
|
||||
; The DD field definition 0-node has ^-pieces "NAME^TYPE^" (14.9.2).
|
||||
N FD S FD=^DD(FILE,F,0)
|
||||
N NAME S NAME=$P(FD,"^",1)
|
||||
N TYPE S TYPE=$P(FD,"^",2)
|
||||
; TYPE starts with a subfile number if the field is a multiple (14.9.2)
|
||||
N SUBFILE S SUBFILE=+TYPE
|
||||
I SUBFILE D
|
||||
. D FIELDSUB
|
||||
E D
|
||||
. D FIELDONE
|
||||
Q
|
||||
FIELDTAG ; Write tag for a field
|
||||
U IO W D,"F"_$TR(F,".","P")_$C(9)_";;"_NAME_"^"_F_" ;"_TYPE,!
|
||||
Q
|
||||
FIELDSUB ; Write a multiple-valued field
|
||||
D FIELDTAG
|
||||
I $D(@EGRF)#10 U IO W D_$C(9),"; OMITTED SELF",!
|
||||
; Word-processing values are files whose .01 field type has "W".
|
||||
I $P($G(^DD(SUBFILE,.01,0)),"^",2)["W" D
|
||||
. D WP(D_$C(9),EGRF)
|
||||
E D
|
||||
. D FILE(D_$C(9),SUBFILE,EGRF) U IO W D_$C(9),";",!
|
||||
Q
|
||||
FIELDONE ; Write a single-valued field
|
||||
N V S V=$$FIELDVAL(EGRF,P) Q:V=""
|
||||
N EV ; Some TYPEs have an external-format value
|
||||
N T S T=TYPE
|
||||
I T["F" S TYPE=TYPE_";"_"Free Text"
|
||||
I T["N" S TYPE=TYPE_";"_"Numeric"
|
||||
I T["K" S TYPE=TYPE_";"_"MUMPS Code"
|
||||
I T["P" S TYPE=TYPE_";"_"Pointer",EV=1
|
||||
I T["V" S TYPE=TYPE_";"_"Variable Pointer",EV=1
|
||||
I T["S" S TYPE=TYPE_";"_"Set of Codes",EV=1
|
||||
I T["D" S TYPE=TYPE_";"_"Date",EV=1
|
||||
I $D(EV) S V=V_"^"_$$EXTERNAL^DILFD(FILE,F,"",V)
|
||||
D FIELDTAG
|
||||
U IO W D_$C(9),$$VALUE(V),!
|
||||
I $D(@EGRF)\10 U IO W D_$C(9),"; OMITTED CHILDREN",!
|
||||
U IO W D_$C(9),";",!
|
||||
Q
|
||||
FIELDVAL(EGRF,P) ; Extract piece P of node value holding field
|
||||
I +P Q $P(@EGRF,"^",P)
|
||||
I $E(P,1)="E" Q $E(@EGRF,$P($E(P,2,$L(P)),",",1),$P(P,",",2))
|
||||
Q ";UNKNOWN ""GLOBAL SUBSCRIPT LOCATION"" PIECE """_P_""""
|
||||
;
|
||||
FILENAME(FILE,FGR) ; Lookup the name of given FILE# (or subfile#)
|
||||
I FILE=0 Q $P(@FGR@(0),"^") ; DD
|
||||
Q $O(^DD(FILE,0,"NM","")) ; TODO: Reliable? Any documented API?
|
||||
VALUE(V) ; Write value line to output
|
||||
; TODO: If value starts in one of " $ ; or contains non-printing
|
||||
; characters then it must be escaped for evaluation on RHS of SET.
|
||||
; TODO: Caller must define indentation level with a comment if
|
||||
; the first character of the first value is a tab or space.
|
||||
Q V
|
||||
1864
samples/M/_zewdAPI.m
Normal file
1864
samples/M/_zewdAPI.m
Normal file
File diff suppressed because it is too large
Load Diff
256
samples/M/_zewdDemo.m
Normal file
256
samples/M/_zewdDemo.m
Normal file
@@ -0,0 +1,256 @@
|
||||
%zewdDemo ; Tutorial page functions
|
||||
;
|
||||
; Product: Enterprise Web Developer (Build 910)
|
||||
; Build Date: Wed, 25 Apr 2012 17:59:25
|
||||
;
|
||||
;
|
||||
; ----------------------------------------------------------------------------
|
||||
; | Enterprise Web Developer for GT.M and m_apache |
|
||||
; | Copyright (c) 2004-12 M/Gateway Developments Ltd, |
|
||||
; | Reigate, Surrey UK. |
|
||||
; | All rights reserved. |
|
||||
; | |
|
||||
; | http://www.mgateway.com |
|
||||
; | Email: rtweed@mgateway.com |
|
||||
; | |
|
||||
; | This program is free software: you can redistribute it and/or modify |
|
||||
; | it under the terms of the GNU Affero General Public License as |
|
||||
; | published by the Free Software Foundation, either version 3 of the |
|
||||
; | License, or (at your option) any later version. |
|
||||
; | |
|
||||
; | This program is distributed in the hope that it will be useful, |
|
||||
; | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
; | GNU Affero General Public License for more details. |
|
||||
; | |
|
||||
; | You should have received a copy of the GNU Affero General Public License |
|
||||
; | along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
; ----------------------------------------------------------------------------
|
||||
;
|
||||
getLanguage(sessid)
|
||||
;
|
||||
s language=$$getRequestValue^%zewdAPI("ewd_Language",sessid)
|
||||
d setSessionValue^%zewdAPI("ewd_Language",language,sessid)
|
||||
d setSessionValue^%zewdAPI("url","www.mgateway.com",sessid)
|
||||
d setSessionValue^%zewdAPI("imageTest",2,sessid)
|
||||
d setSessionValue^%zewdAPI("tmp_testing",1234567,sessid)
|
||||
QUIT ""
|
||||
;
|
||||
login(sessid)
|
||||
;
|
||||
n username,password
|
||||
;
|
||||
s username=$$getTextValue^%zewdAPI("username",sessid)
|
||||
s password=$$getPasswordValue^%zewdAPI("password",sessid)
|
||||
;d trace^%zewdAPI("in login - username="_username_" ; password="_password)
|
||||
i username'="ROB" QUIT "invalid username"
|
||||
i password'="ROB" QUIT "invalid password"
|
||||
QUIT ""
|
||||
;
|
||||
logine(sessid)
|
||||
;
|
||||
n error,username,password,message,textid
|
||||
;
|
||||
s error=""
|
||||
s message=$$errorMessage^%zewdAPI("invalid login attempt",sessid)
|
||||
s username=$$getTextValue^%zewdAPI("username",sessid)
|
||||
s password=$$getPasswordValue^%zewdAPI("password",sessid)
|
||||
;
|
||||
i '$d(^ewdDemo("tutorial","authentication")) d QUIT $$errorMessage^%zewdAPI(error,sessid)
|
||||
. i username'="ROB" s error=message q
|
||||
. i password'="ROB" s error=message q
|
||||
;
|
||||
i username="" QUIT message
|
||||
i '$d(^ewdDemo("tutorial","authentication",username)) QUIT message
|
||||
i password'=$p(^ewdDemo("tutorial","authentication",username),"~",1) QUIT message
|
||||
QUIT ""
|
||||
;
|
||||
getUsernames(sessid) ;
|
||||
;
|
||||
n user
|
||||
;
|
||||
i '$d(^ewdDemo("tutorial","authentication")) d QUIT ""
|
||||
. d clearList^%zewdAPI("user",sessid)
|
||||
. d appendToList^%zewdAPI("user","Select a user..","nul",sessid)
|
||||
. d appendToList^%zewdAPI("user","ROB","ROB",sessid)
|
||||
;
|
||||
s user=""
|
||||
d clearList^%zewdAPI("user",sessid)
|
||||
d appendToList^%zewdAPI("user","Select a user..","",sessid)
|
||||
f s user=$o(^ewdDemo("tutorial","authentication",user)) q:user="" d
|
||||
. d appendToList^%zewdAPI("user",user,user,sessid)
|
||||
;
|
||||
QUIT ""
|
||||
;
|
||||
addUsername(sessid)
|
||||
;
|
||||
n newUsername
|
||||
;
|
||||
s newUsername=$$getTextValue^%zewdAPI("newUsername",sessid)
|
||||
i newUsername="" QUIT "You must enter a username"
|
||||
i $d(^ewdDemo("tutorial","authentication",newUsername)) QUIT newUsername_" already exists"
|
||||
d setTextValue^%zewdAPI("user",newUsername,sessid)
|
||||
QUIT ""
|
||||
;
|
||||
testValue(sessid)
|
||||
;
|
||||
n user,pass
|
||||
;
|
||||
s user=$$getSelectValue^%zewdAPI("user",sessid)
|
||||
;d trace^%zewdAPI("user="_user)
|
||||
QUIT ""
|
||||
;
|
||||
getPassword(sessid)
|
||||
;
|
||||
n user,pass
|
||||
;
|
||||
s user=$$getSelectValue^%zewdAPI("user",sessid)
|
||||
s pass=$g(^ewdDemo("tutorial","authentication",user))
|
||||
s pass=$p(pass,"~",1)
|
||||
i user="ROB",pass="" s pass="ROB"
|
||||
d setTextValue^%zewdAPI("pass",pass,sessid)
|
||||
QUIT ""
|
||||
;
|
||||
setPassword(sessid)
|
||||
;
|
||||
n user,pass
|
||||
;
|
||||
s user=$$getSelectValue^%zewdAPI("user",sessid)
|
||||
s pass=$$getTextValue^%zewdAPI("pass",sessid)
|
||||
i pass="" QUIT "You must enter a password"
|
||||
s ^ewdDemo("tutorial","authentication",user)=pass
|
||||
QUIT ""
|
||||
;
|
||||
getObjDetails(sessid)
|
||||
i '$$sessionNameExists^%zewdAPI("person.username",sessid) d
|
||||
. d setSessionValue^%zewdAPI("person.username","Rob",sessid)
|
||||
. d setSessionValue^%zewdAPI("person.password","secret!",sessid)
|
||||
. d setSessionValue^%zewdAPI("person.userType","g",sessid)
|
||||
. d setCheckboxOn^%zewdAPI("person.permissions","w",sessid)
|
||||
. d setCheckboxOn^%zewdAPI("person.permissions","e",sessid)
|
||||
. d clearList^%zewdAPI("person.language",sessid)
|
||||
. d appendToList^%zewdAPI("person.language","English","en",sessid)
|
||||
. d appendToList^%zewdAPI("person.language","French","fr",sessid)
|
||||
. d appendToList^%zewdAPI("person.language","German","d",sessid)
|
||||
. d appendToList^%zewdAPI("person.language","Italian","it",sessid)
|
||||
. d setMultipleSelectOn^%zewdAPI("person.language","en",sessid)
|
||||
. d setMultipleSelectOn^%zewdAPI("person.language","d",sessid)
|
||||
. d clearTextArea^%zewdAPI("person.comments",sessid)
|
||||
. s textarea(1)="This is a line of text"
|
||||
. s textarea(2)="This is the second line"
|
||||
. d createTextArea^%zewdAPI("person.comments",.textarea,sessid)
|
||||
. d setSessionValue^%zewdAPI("wld.%KEY.MGWLPN","EXTC",sessid)
|
||||
QUIT ""
|
||||
;
|
||||
setObjDetails(sessid)
|
||||
QUIT ""
|
||||
;
|
||||
getDetails(sessid)
|
||||
;
|
||||
n user,pass,data,expireDate,userType,selected,textarea,confirmText
|
||||
;
|
||||
;d trace^%zewdAPI("got here!!")
|
||||
s browser=$$getServerValue^%zewdAPI("HTTP_USER_AGENT",sessid)
|
||||
d setSessionValue^%zewdAPI("browser",browser,sessid)
|
||||
s user=$$getTextValue^%zewdAPI("user",sessid)
|
||||
s data=""
|
||||
i user'="" s data=$g(^ewdDemo("tutorial","authentication",user))
|
||||
;d trace^%zewdAPI("user="_user_" ; data="_data)
|
||||
s pass=$p(data,"~",1)
|
||||
i user="ROB",pass="" d QUIT ""
|
||||
. d setTextValue^%zewdAPI("pass","ROB",sessid)
|
||||
. d setRadioOn^%zewdAPI("userType","a",sessid)
|
||||
. d initialiseCheckbox^%zewdAPI("permissions",sessid)
|
||||
. d setCheckboxOn^%zewdAPI("permissions","w",sessid)
|
||||
. d setCheckboxOn^%zewdAPI("permissions","e",sessid)
|
||||
. d setCheckboxOn^%zewdAPI("permissions","s",sessid)
|
||||
. d createLanguageList(sessid)
|
||||
. d setMultipleSelectOn^%zewdAPI("language","en",sessid)
|
||||
. d setMultipleSelectOn^%zewdAPI("language","d",sessid)
|
||||
. d clearTextArea^%zewdAPI("comments",sessid)
|
||||
. s textarea(1)="This is a line of text"
|
||||
. s textarea(2)="This is the second line"
|
||||
. d createTextArea^%zewdAPI("comments",.textarea,sessid)
|
||||
;
|
||||
d setTextValue^%zewdAPI("pass",pass,sessid)
|
||||
;d trace^%zewdAPI("data="_data)
|
||||
s userType=$p(data,"~",2)
|
||||
i userType="" s userType="g"
|
||||
d setRadioOn^%zewdAPI("userType",userType,sessid)
|
||||
d initialiseCheckbox^%zewdAPI("permissions",sessid)
|
||||
i user'="" m selected=^ewdDemo("tutorial","authentication",user,"permissions")
|
||||
d setCheckboxValues^%zewdAPI("permissions",.selected,sessid)
|
||||
d createLanguageList(sessid)
|
||||
k selected
|
||||
i user'="" m selected=^ewdDemo("tutorial","authentication",user,"language")
|
||||
d setMultipleSelectValues^%zewdAPI("language",.selected,sessid)
|
||||
d clearTextArea^%zewdAPI("comments",sessid)
|
||||
i user'="" m textarea=^ewdDemo("tutorial","authentication",user,"comments")
|
||||
d createTextArea^%zewdAPI("comments",.textarea,sessid)
|
||||
;
|
||||
QUIT ""
|
||||
;
|
||||
createLanguageList(sessid)
|
||||
;
|
||||
n attr
|
||||
d clearList^%zewdAPI("language",sessid)
|
||||
d appendToList^%zewdAPI("language","English","en",sessid)
|
||||
s attr("style")="color:red"
|
||||
d appendToList^%zewdAPI("language","French","fr",sessid,.attr)
|
||||
d appendToList^%zewdAPI("language","German","d",sessid,.attr)
|
||||
s attr("style")="color:green"
|
||||
d appendToList^%zewdAPI("language","Italian","it",sessid,.attr)
|
||||
s attr("style")="color:green"
|
||||
d appendToList^%zewdAPI("language","Spanish","esp",sessid,.attr)
|
||||
d appendToList^%zewdAPI("language","Portuguese","por",sessid)
|
||||
d appendToList^%zewdAPI("language","Danish","den",sessid)
|
||||
d appendToList^%zewdAPI("language","Swedish","swe",sessid)
|
||||
d appendToList^%zewdAPI("language","Norwegian","nor",sessid)
|
||||
d initialiseMultipleSelect^%zewdAPI("language",sessid)
|
||||
QUIT
|
||||
;
|
||||
setDetails(sessid)
|
||||
;
|
||||
n error,expireDate,user,pass,userType,selected,comments,warning
|
||||
;
|
||||
s user=$$getTextValue^%zewdAPI("user",sessid)
|
||||
s pass=$$getTextValue^%zewdAPI("pass",sessid)
|
||||
i pass="" d QUIT "You must enter a password"
|
||||
. d setFieldError^%zewdAPI("pass",sessid)
|
||||
i pass="xxx" d setFieldError^%zewdAPI("testField",sessid) QUIT "test error"
|
||||
s userType=$$getRadioValue^%zewdAPI("userType",sessid)
|
||||
s ^ewdDemo("tutorial","authentication",user)=pass_"~"_userType
|
||||
k ^ewdDemo("tutorial","authentication",user,"permissions")
|
||||
d getCheckboxValues^%zewdAPI("permissions",.selected,sessid)
|
||||
m ^ewdDemo("tutorial","authentication",user,"permissions")=selected
|
||||
k ^ewdDemo("tutorial","authentication",user,"language")
|
||||
k selected
|
||||
d getMultipleSelectValues^%zewdAPI("language",.selected,sessid)
|
||||
m ^ewdDemo("tutorial","authentication",user,"language")=selected
|
||||
k ^ewdDemo("tutorial","authentication",user,"comments")
|
||||
d getTextArea^%zewdAPI("comments",.comments,sessid)
|
||||
m ^ewdDemo("tutorial","authentication",user,"comments")=comments
|
||||
;s warning="Record successfully updated"
|
||||
;d setWarning^%zewdAPI(warning,sessid)
|
||||
;
|
||||
QUIT ""
|
||||
;
|
||||
testAjaxForm(sessid)
|
||||
;
|
||||
i $$getRequestValue^%zewdAPI("testField1",sessid)="" d QUIT "field1 must not be null"
|
||||
. d setFieldError^%zewdAPI("testField1",sessid)
|
||||
i $$getRequestValue^%zewdAPI("testField2",sessid)="" d QUIT "javascript: x=1 ; document.getElementById('testField3').value = x"
|
||||
. d setFieldError^%zewdAPI("testField2",sessid)
|
||||
i $$getRequestValue^%zewdAPI("testField3",sessid)="" d QUIT "field3 must not be null"
|
||||
. d setFieldError^%zewdAPI("testField3",sessid)
|
||||
;
|
||||
QUIT ""
|
||||
;
|
||||
getVersion() ;
|
||||
QUIT $zv
|
||||
;
|
||||
getTime(sessid)
|
||||
;
|
||||
d setSessionValue^%zewdAPI("dateTime",$$inetDate^%zewdAPI($h),sessid)
|
||||
QUIT ""
|
||||
;
|
||||
25
samples/M/arrays.m
Normal file
25
samples/M/arrays.m
Normal file
@@ -0,0 +1,25 @@
|
||||
start ; create student data
|
||||
set student("name","first")="Linus"
|
||||
set student("name","last")="Torvalds"
|
||||
set student("language")="C"
|
||||
set student("classes","monday")="Algebra"
|
||||
set student("classes","tuesday")="Geometry"
|
||||
set student("classes","wednesday")="English"
|
||||
set student("classes","thursday")="French"
|
||||
set student("classes","friday")="Jujitsu"
|
||||
zwrite student
|
||||
write $order(student)
|
||||
|
||||
write !,"Student array top level",!
|
||||
set x=""
|
||||
for do quit:x=""
|
||||
. set x=$order(student(x))
|
||||
. write x,!
|
||||
|
||||
write !,"Student classes ",!
|
||||
set x=""
|
||||
for do quit:x=""
|
||||
. set x=$order(student("classes",x))
|
||||
. write:x'="" x," : ",student("classes",x),!
|
||||
|
||||
quit
|
||||
45
samples/M/base64.m
Normal file
45
samples/M/base64.m
Normal file
@@ -0,0 +1,45 @@
|
||||
;
|
||||
; This file is part of DataBallet.
|
||||
; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>
|
||||
;
|
||||
; DataBallet is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; DataBallet is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with DataBallet. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
encode(message)
|
||||
;
|
||||
; Return base64 with URL and Filename safe alphabet (RFC 4648)
|
||||
;
|
||||
new base64,todrop,i
|
||||
|
||||
; Populate safe alphabet values on first use only.
|
||||
if '$data(base64safe) do
|
||||
. for i=0:1:25 set base64safe(i)=$zchar(65+i),base64safe(i+26)=$zchar(97+i)
|
||||
. for i=52:1:61 set base64safe(i)=$zchar(i-4)
|
||||
. set base64safe(62)="-",base64safe(63)="_"
|
||||
|
||||
; Pad message with 0 to ensure number of bytes is a multiple of 3.
|
||||
set todrop=0
|
||||
for quit:($zlength(message)#3)=0 set message=message_$zchar(0) set todrop=todrop+1
|
||||
|
||||
; Base64 encode the message
|
||||
set base64=""
|
||||
for i=1:3:$zlength(message) do
|
||||
. set base64=base64_base64safe($zascii(message,i)\4)
|
||||
. set base64=base64_base64safe(($zascii(message,i)#4*16)+($zascii(message,i+1)\16))
|
||||
. set base64=base64_base64safe(($zascii(message,i+1)#16*4)+($zascii(message,i+2)\64))
|
||||
. set base64=base64_base64safe($zascii(message,i+2)#64)
|
||||
|
||||
set:todrop'=0 base64=$zextract(base64,1,$zlength(base64)-todrop)
|
||||
|
||||
quit base64
|
||||
74
samples/M/digest.m
Normal file
74
samples/M/digest.m
Normal file
@@ -0,0 +1,74 @@
|
||||
;
|
||||
; GT.M Digest Extension
|
||||
; Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
; GT.M™ is a trademark of Fidelity Information Services, Inc.
|
||||
|
||||
; "GT.M™ is a vetted industrial strength, transaction processing application
|
||||
; platform consisting of a key-value database engine optimized for extreme
|
||||
; transaction processing throughput & business continuity."
|
||||
; -- http://sourceforge.net/projects/fis-gtm/
|
||||
|
||||
|
||||
|
||||
; GT.M Digest Extension
|
||||
;
|
||||
; This simple OpenSSL based digest extension is a rewrite of OpenSSL
|
||||
; EVP_DigestInit usage example with additional M wrapper.
|
||||
; See http://www.openssl.org/docs/crypto/EVP_DigestInit.html for details.
|
||||
;
|
||||
; The return value from $&digest.init() is 0, usually when an invalid digest
|
||||
; algorithm was specification. Anyway, properly used, should never fail.
|
||||
;
|
||||
; Please feel free to contact me if you have any questions or comments,
|
||||
; Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
|
||||
|
||||
digest(m,a) ; returns digest in ASCII HEX, all-in-one
|
||||
n c,d
|
||||
s c=$&digest.init(a)
|
||||
d &digest.update(.c,.m)
|
||||
d &digest.final(.c,.d)
|
||||
q d
|
||||
|
||||
|
||||
init(alg) ; returns context handler, for alg try "md5", "sha256", etc
|
||||
; 0 is returned when an error occurs (e.g. unknown digest)
|
||||
q $&digest.init(alg)
|
||||
|
||||
update(ctx,msg) ; updates digest (ctx) by message msg
|
||||
d &digest.update(.ctx,.msg)
|
||||
q
|
||||
|
||||
final(ctx,digest) ; returns hex encoded message digest in digest
|
||||
; frees memory allocated for the ctx also
|
||||
d &digest.final(.ctx,.digest)
|
||||
q
|
||||
|
||||
|
||||
; digest algorithms availability depends on libcrypto (OpenSSL) configuration
|
||||
|
||||
md4(m) q $$digest(.m,"md4")
|
||||
md5(m) q $$digest(.m,"md5")
|
||||
sha(m) q $$digest(.m,"sha")
|
||||
sha1(m) q $$digest(.m,"sha1")
|
||||
sha224(m) q $$digest(.m,"sha224")
|
||||
sha256(m) q $$digest(.m,"sha256")
|
||||
sha512(m) q $$digest(.m,"sha512")
|
||||
dss1(m) q $$digest(.m,"dss1")
|
||||
ripemd160(m) q $$digest(.m,"ripemd160")
|
||||
42
samples/M/dynamicscoping.m
Normal file
42
samples/M/dynamicscoping.m
Normal file
@@ -0,0 +1,42 @@
|
||||
;------------------------------------
|
||||
; These first two routines illustrate
|
||||
; the dynamic scope of variables in M
|
||||
;------------------------------------
|
||||
triangle1(x) ;;
|
||||
set sum=0
|
||||
for do quit:x'>1
|
||||
. set sum=sum+x
|
||||
. set x=x-1
|
||||
quit sum
|
||||
|
||||
main1() ;;
|
||||
set sum=1500
|
||||
set x=6
|
||||
write "sum before=",sum,!
|
||||
set y=$$triangle1(x)
|
||||
write "sum after=",sum,!
|
||||
write "triangle of ",x," is ",y,!
|
||||
quit
|
||||
|
||||
|
||||
;------------------------------------
|
||||
; These next two routines illustrate
|
||||
; the use of the NEW command to make
|
||||
; variables limited to the local scope
|
||||
;------------------------------------
|
||||
triangle2(x) ;;
|
||||
new sum ; <-- HERE !!
|
||||
set sum=0
|
||||
for do quit:x'>1
|
||||
. set sum=sum+x
|
||||
. set x=x-1
|
||||
quit sum
|
||||
|
||||
main2() ;;
|
||||
set sum=1500
|
||||
set x=6
|
||||
write "sum before=",sum,!
|
||||
set y=$$triangle2(x)
|
||||
write "sum after=",sum,!
|
||||
write "triangle of ",x," is ",y,!
|
||||
quit
|
||||
9
samples/M/fibonacci.m
Normal file
9
samples/M/fibonacci.m
Normal file
@@ -0,0 +1,9 @@
|
||||
start ; compute the Fibonacci series
|
||||
set (a,b)=1
|
||||
for i=1:1 do quit:term>100
|
||||
. set term=a+b
|
||||
. write !,term
|
||||
. set a=b
|
||||
. set b=term
|
||||
write !,"Result= ",term,!
|
||||
quit
|
||||
19
samples/M/forloop.m
Normal file
19
samples/M/forloop.m
Normal file
@@ -0,0 +1,19 @@
|
||||
start1 ; entry label
|
||||
set a=1
|
||||
set b=20
|
||||
set c=2
|
||||
set sum=0
|
||||
for i=a:c do quit:'(i<b)
|
||||
. set sum=sum+i
|
||||
. write i," : ",sum,!
|
||||
quit
|
||||
|
||||
start2 ; entry label
|
||||
set a=1
|
||||
set b=20
|
||||
set c=2
|
||||
set sum=0
|
||||
for i=a:c:b do
|
||||
. set sum=sum+i
|
||||
. write i," : ",sum,!
|
||||
quit
|
||||
19
samples/M/functions.m
Normal file
19
samples/M/functions.m
Normal file
@@ -0,0 +1,19 @@
|
||||
; This function computes a factorial
|
||||
|
||||
|
||||
factorial(n) ;;
|
||||
new f
|
||||
set f=n
|
||||
for do quit:n'>1
|
||||
. set n=n-1
|
||||
. set f=f*n
|
||||
. write n," : ",f,!
|
||||
quit f
|
||||
|
||||
|
||||
|
||||
main() ;;
|
||||
set x=5
|
||||
set y=$$factorial(x)
|
||||
write "Factorial of ",x," = ",y,!
|
||||
quit
|
||||
3
samples/M/helloworld.m
Normal file
3
samples/M/helloworld.m
Normal file
@@ -0,0 +1,3 @@
|
||||
label1 ; This is a label
|
||||
write "Hello World !",!
|
||||
quit
|
||||
35
samples/M/ifelse.m
Normal file
35
samples/M/ifelse.m
Normal file
@@ -0,0 +1,35 @@
|
||||
if1 ; simple if statement
|
||||
set a=5
|
||||
set b=10
|
||||
set c=25
|
||||
if (a<b) set c=b
|
||||
write c,!
|
||||
quit
|
||||
|
||||
if2 ; if statements contrasted
|
||||
set a=5
|
||||
set b=10
|
||||
if (a<b) write "variable a=",a," is smaller than b=",b,!
|
||||
if (a>b) write "variable a=",a," is larger than b=",b,!
|
||||
quit
|
||||
|
||||
if3 ; if statement with else clause
|
||||
set a=5
|
||||
set b=10
|
||||
if (a<b) write "variable a=",a," is smaller than b=",b,!
|
||||
else write "variable a=",a," is larger than b=",b,!
|
||||
quit
|
||||
|
||||
if4 ; if statement with else clause and bodies
|
||||
set a=5
|
||||
set b=10
|
||||
set c=10
|
||||
if (a<b) do
|
||||
. write "variable a=",a," is smaller than b=",b,!
|
||||
. set c=c+a
|
||||
else do
|
||||
. write "variable a=",a," is larger than b=",b,!
|
||||
. set c=c+b
|
||||
write "c=",c,!
|
||||
quit
|
||||
|
||||
22
samples/M/indirectfunctions.m
Normal file
22
samples/M/indirectfunctions.m
Normal file
@@ -0,0 +1,22 @@
|
||||
start ; exercise
|
||||
set ^car("make")="toyota"
|
||||
set ^car("model")="corolla"
|
||||
set ^car("mileage")="$$compute^mileage"
|
||||
|
||||
write !,"Regular computation",!
|
||||
write "make = ",^car("make"),!
|
||||
write "model = ",^car("model"),!
|
||||
write "mileage = ",@^car("mileage")@(150,4),!
|
||||
|
||||
write !,"Pesimist computation",!
|
||||
set ^car("mileage")="$$computepesimist^mileage"
|
||||
write "make = ",^car("make"),!
|
||||
write "model = ",^car("model"),!
|
||||
write "mileage = ",@^car("mileage")@(150,4),!
|
||||
|
||||
write !,"Optimist computation",!
|
||||
set ^car("mileage")="$$computeoptimist^mileage"
|
||||
write "make = ",^car("make"),!
|
||||
write "model = ",^car("model"),!
|
||||
write "mileage = ",@^car("mileage")@(150,4),!
|
||||
|
||||
76
samples/M/md5.m
Normal file
76
samples/M/md5.m
Normal file
@@ -0,0 +1,76 @@
|
||||
;
|
||||
; MD5 Implementation in M
|
||||
; Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
; It works in GT.M with ZCHSET=M, but please, don't use it. It's only a joke.
|
||||
; Serves well as a reverse engineering example on obtaining boolean functions
|
||||
; from integer addition, modulo and division.
|
||||
|
||||
|
||||
md5(msg)
|
||||
; http://en.wikipedia.org/wiki/MD5
|
||||
n m,r,k,h,i,j,a,b,c,d,f,g,w,t,p,q
|
||||
s r(0)=7,r(1)=12,r(2)=17,r(3)=22,r(4)=7,r(5)=12,r(6)=17,r(7)=22,r(8)=7,r(9)=12,r(10)=17,r(11)=22,r(12)=7,r(13)=12,r(14)=17,r(15)=22,r(16)=5,r(17)=9,r(18)=14,r(19)=20,r(20)=5,r(21)=9,r(22)=14,r(23)=20,r(24)=5,r(25)=9,r(26)=14,r(27)=20,r(28)=5,r(29)=9,r(30)=14,r(31)=20,r(32)=4,r(33)=11,r(34)=16,r(35)=23,r(36)=4,r(37)=11,r(38)=16,r(39)=23,r(40)=4,r(41)=11,r(42)=16,r(43)=23,r(44)=4,r(45)=11,r(46)=16,r(47)=23,r(48)=6,r(49)=10,r(50)=15,r(51)=21,r(52)=6,r(53)=10,r(54)=15,r(55)=21,r(56)=6,r(57)=10,r(58)=15,r(59)=21,r(60)=6,r(61)=10,r(62)=15,r(63)=21
|
||||
s k(0)=3614090360,k(1)=3905402710,k(2)=606105819,k(3)=3250441966,k(4)=4118548399,k(5)=1200080426,k(6)=2821735955,k(7)=4249261313,k(8)=1770035416,k(9)=2336552879,k(10)=4294925233,k(11)=2304563134,k(12)=1804603682,k(13)=4254626195,k(14)=2792965006,k(15)=1236535329,k(16)=4129170786,k(17)=3225465664,k(18)=643717713,k(19)=3921069994,k(20)=3593408605,k(21)=38016083,k(22)=3634488961,k(23)=3889429448,k(24)=568446438,k(25)=3275163606,k(26)=4107603335,k(27)=1163531501,k(28)=2850285829,k(29)=4243563512,k(30)=1735328473,k(31)=2368359562,k(32)=4294588738,k(33)=2272392833,k(34)=1839030562,k(35)=4259657740,k(36)=2763975236,k(37)=1272893353,k(38)=4139469664,k(39)=3200236656,k(40)=681279174,k(41)=3936430074,k(42)=3572445317,k(43)=76029189,k(44)=3654602809,k(45)=3873151461,k(46)=530742520,k(47)=3299628645,k(48)=4096336452,k(49)=1126891415,k(50)=2878612391,k(51)=4237533241,k(52)=1700485571,k(53)=2399980690,k(54)=4293915773,k(55)=2240044497,k(56)=1873313359,k(57)=4264355552,k(58)=2734768916,k(59)=1309151649,k(60)=4149444226,k(61)=3174756917,k(62)=718787259,k(63)=3951481745
|
||||
s h(0)=1732584193,h(1)=4023233417,h(2)=2562383102,h(3)=271733878
|
||||
s $p(m,$c(0),(55-$l(msg))#64+1)="",m=msg_$c(128)_m_$$n64($l(msg)*8),p=1,q=0
|
||||
f q:q d
|
||||
. f j=0:1:15 s w(j)=$$read(.m,.p)
|
||||
. i w(0)<0 s q=1 q
|
||||
. s a=h(0),b=h(1),c=h(2),d=h(3)
|
||||
. f i=0:1:63 d
|
||||
.. i i<16 d
|
||||
... s f=$$or($$and(b,c),$$and($$not(b),d)),g=i
|
||||
.. e i i<32 d
|
||||
... s f=$$or($$and(d,b),$$and($$not(d),c)),g=(5*i+1)#16
|
||||
.. e i i<48 d
|
||||
... s f=$$xor($$xor(b,c),d),g=(3*i+5)#16
|
||||
.. e s f=$$xor(c,$$or(b,$$not(d))),g=(7*i)#16
|
||||
.. s t=d,d=c,c=b,b=(b+$$rotate((a+f+k(i)+w(g))#4294967296,r(i)))#4294967296,a=t
|
||||
. s h(0)=(h(0)+a)#4294967296,h(1)=(h(1)+b)#4294967296,h(2)=(h(2)+c)#4294967296,h(3)=(h(3)+d)#4294967296
|
||||
q $$n32h(h(0))_$$n32h(h(1))_$$n32h(h(2))_$$n32h(h(3))
|
||||
|
||||
not(a) ; 32bit
|
||||
q 4294967295-a
|
||||
|
||||
xor(a,b) ; 32bit
|
||||
n x,i s x=0 f i=1:1:32 s x=(x\2)+(((a+b)#2)*2147483648),a=a\2,b=b\2
|
||||
q x
|
||||
|
||||
and(a,b) ; 32bit
|
||||
n x,i s x=0 f i=1:1:32 s x=(x\2)+((((a#2)+(b#2))\2)*2147483648),a=a\2,b=b\2
|
||||
q x
|
||||
|
||||
or(a,b) ; 32bit
|
||||
q $$not($$and($$not(.a),$$not(.b)))
|
||||
|
||||
rotate(a,n) ; 32bit, rol
|
||||
n c s c=a*(2**n)
|
||||
q c#4294967296+(c\4294967296)
|
||||
|
||||
read(b,i)
|
||||
n n,j s n=0 f j=3:-1:0 s n=256*n+$a($e(b,i+j))
|
||||
s i=i+4
|
||||
q n
|
||||
|
||||
n64(n)
|
||||
n s,i f i=1:1:8 s $e(s,i)=$c(n#256),n=n\256
|
||||
q s
|
||||
|
||||
n32h(n)
|
||||
n h,s,i s h="0123456789abcdef" f i=1:2:8 s $e(s,i+1)=$e(h,n#16+1),n=n\16,$e(s,i)=$e(h,n#16+1),n=n\16
|
||||
q s
|
||||
9
samples/M/mileage.m
Normal file
9
samples/M/mileage.m
Normal file
@@ -0,0 +1,9 @@
|
||||
compute(miles,gallons)
|
||||
quit miles/gallons
|
||||
|
||||
computepesimist(miles,gallons)
|
||||
quit miles/(gallons+1)
|
||||
|
||||
computeoptimist(miles,gallons)
|
||||
quit (miles+1)/gallons
|
||||
|
||||
319
samples/M/mumtris.m
Normal file
319
samples/M/mumtris.m
Normal file
@@ -0,0 +1,319 @@
|
||||
;
|
||||
; Mumtris
|
||||
; Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
; Mumtris
|
||||
; This is a tetris game in MUMPS, for GT.M, have fun.
|
||||
;
|
||||
; Resize your terminal (e.g. maximize your PuTTY window), restart GT.M so that
|
||||
; it can report true size of your terminal, and d ^mumtris.
|
||||
;
|
||||
; Try setting ansi=0 for GT.M compatible cursor positioning.
|
||||
;
|
||||
; NOTICE: Mumtris uses "active waiting" for making delays lower that 1s.
|
||||
; That means that one of your CPU will be used at 99%. It's not a bug,
|
||||
; the Mumtris and GT.M will be fully responsive. Take care when
|
||||
; running on production system ;-)
|
||||
;
|
||||
|
||||
mumtris
|
||||
n ansi,e,n,w,h,gr,fl,hl,sc,lv,lc,sb,st,ml,dh,dw,mx,my,mt,r,y,x,t10m,c,ne,i,q
|
||||
|
||||
s ansi=1 ; use (faster) ANSI CSI instead of USE $P:X=x positioning
|
||||
s w=10 ; matrix width
|
||||
s h=22 ; matrix height (see below)
|
||||
s gr=1 ; grid
|
||||
s fl=1 ; fill
|
||||
s hl=1 ; help
|
||||
s sc=0 ; score
|
||||
s lv=1 ; level
|
||||
s lc=0 ; lines cleared at current level
|
||||
s sb=70 ; step base
|
||||
s st=$$step ; current step
|
||||
s ml=3 ; move/rotate hold limit (without fall)
|
||||
|
||||
d dev ; defines dw, dh (device width, device height)
|
||||
s h=dh-2 ; comment out to disable auto height
|
||||
s mx=dw/2-(3*w/2) ; matrix left coordinate
|
||||
s my=dh/2-(h/2)-1 ; matrix top coordinate
|
||||
s mt="3 5_9 8 2_9 .2_02 /5 \2 2_ 2_2 6_/2 |8_|2_| 6_0 /2 \ /2 \|2 |2 \/5 \3 2_\_2 2_ \2 |/2 3_/0/4 Y4 \2 |2 /2 Y Y2 \2 |2 |2 | \/2 |\3_ \0\4_|2_2 /4_/|2_|_|2 /2_|2 |2_|2 |2_/4_2 >08 \/9 3 \/9 9 2 \/0" ; Mumtris
|
||||
|
||||
u $p:noecho
|
||||
u $p:escape
|
||||
d cls
|
||||
|
||||
d intro
|
||||
|
||||
d elements
|
||||
s ne=$r(e)+1 ; new element
|
||||
d change,new(),preview
|
||||
d score(),help,redraw
|
||||
|
||||
s (i,q)=0
|
||||
f q:q d
|
||||
. d pos(0,0)
|
||||
. s c=$$key
|
||||
. i c=1 d exit s q=1 q
|
||||
. s i=$s('c:0,1:i+1)
|
||||
. s:i'<ml (i,c)=0
|
||||
. i c'=3,$$fall d lock,clear,change,preview i $$new d over,exit s q=1 q ; short-circuit and in first if
|
||||
. d redraw
|
||||
q
|
||||
|
||||
key() ; 0 - timeout, 1 - exit, 2 - harddrop, 3 - other char
|
||||
n q,c,d,ex,hd
|
||||
s (q,d,ex,hd)=0
|
||||
n i
|
||||
n l s l=1
|
||||
f q:q d
|
||||
. r *c:0
|
||||
. i c<0&'d d
|
||||
.. f i=1:1:st*t10m r *c:0 q:c>-1 i $h
|
||||
. i c<0 s q=1 q
|
||||
. s d=2
|
||||
. i c=27 d q:q
|
||||
.. i $l($zb)=1 s (q,ex)=1 q
|
||||
.. s c=$a($e($zb,3))
|
||||
.. d:c=65 rotate
|
||||
.. d:c=66 fall(1)
|
||||
.. d:c=67 right
|
||||
.. d:c=68 left
|
||||
. i c=70!(c=102) s fl=fl+1#3 d preview
|
||||
. s:c=71!(c=103) gr='gr
|
||||
. i c=72!(c=104) s hl='hl d help
|
||||
. d:c=73!(c=105) rotate
|
||||
. d:c=74!(c=106) left
|
||||
. d:c=75!(c=107) fall(1)
|
||||
. d:c=76!(c=108) right
|
||||
. s:c=81!(c=113) (q,ex)=1
|
||||
. i c=32 d drop s hd=1
|
||||
q $s(ex:1,hd:2,d:3,1:0)
|
||||
|
||||
redraw
|
||||
d matrix
|
||||
d stack
|
||||
d draw(n,r,y,x)
|
||||
q
|
||||
|
||||
ticks
|
||||
n x,h,b,e,q
|
||||
s h=$h,(b,e,q)=0 f i=1:1:1000000000 r *x:0 i h'=$h s h=$h d q:q
|
||||
. i 'b s b=i
|
||||
. e s e=i,q=1
|
||||
s t10m=(e-b)\100
|
||||
q
|
||||
|
||||
change
|
||||
s n=ne
|
||||
s ne=$r(e)+1
|
||||
s x=0,y=0,r=1
|
||||
q
|
||||
|
||||
new()
|
||||
s r=1,x=w/2-2,y=1-e(n,r)
|
||||
q:$q $$collision(r,y,x) q
|
||||
|
||||
drop
|
||||
n i
|
||||
s i=0 f q:$$fall s i=i+2
|
||||
d score(i)
|
||||
q
|
||||
|
||||
rotate
|
||||
n k
|
||||
s k=r#e(n)+1
|
||||
q:$$collision(k,y,x)
|
||||
s r=k
|
||||
q
|
||||
|
||||
fall(k)
|
||||
n c
|
||||
i $$collision(r,y+1,x) q:$q 1 q
|
||||
s y=y+1
|
||||
d:$g(k) score(1)
|
||||
q:$q 0 q
|
||||
|
||||
right q:$$collision(r,y,x+1) s x=x+1 q
|
||||
left q:$$collision(r,y,x-1) s x=x-1 q
|
||||
|
||||
collision(r,y,x)
|
||||
n i,j,q
|
||||
s q=0
|
||||
f i=1:1:4 q:q f j=1:1:4 q:q s:$g(e(n,r,j,i))&($g(n(y+j,x+i))!(y+j>h!(x+i>w!(x+i<1)))) q=1
|
||||
q q
|
||||
|
||||
lock
|
||||
n i,j
|
||||
f i=1:1:4 q:q f j=1:1:4 q:q s:$g(e(n,r,j,i)) n(y+j,x+i)=1
|
||||
q
|
||||
|
||||
clear
|
||||
n c,i,j,q
|
||||
s c=0
|
||||
f j=h:-1:1 d
|
||||
. s q=0
|
||||
. f i=1:1:w i '$g(n(j,i)) s q=1 q
|
||||
. q:q
|
||||
. f i=j:-1:1 k n(i) m n(i)=n(i-1)
|
||||
. s j=j+1,c=c+1
|
||||
. d redraw
|
||||
i c d
|
||||
. d score($s(c=4:800,1:i*200-100*lv))
|
||||
. s lc=lc+c
|
||||
. i lv*10'>lc d score(,1) s lc=0
|
||||
q
|
||||
|
||||
exit
|
||||
n s
|
||||
s s=mt_"09 Piotr Koper <piotr.koper@gmail.com>09 8 h2tps:2/github.com/pkoper"
|
||||
d cls d write(.s,dh/2-3,dw/2-24) h 1 r *s:0 r *s:4
|
||||
d cls u $p:echo
|
||||
q
|
||||
|
||||
intro
|
||||
n s
|
||||
s s=mt_"9 9 8 Mumtris for GT.M0"
|
||||
d cls h 1 d write(.s,dh/2-3,dw/2-24) h 1
|
||||
d ticks
|
||||
d cls
|
||||
r s:0
|
||||
q
|
||||
|
||||
cls
|
||||
d pos(0,0,1)
|
||||
q
|
||||
|
||||
pos(y,x,c)
|
||||
i ansi d
|
||||
. ; workaround for ANSI driver: NL in some safe place (1,1)
|
||||
. w $c(27)_"[1;1f",!,$c(27)_"["_(y\1+1)_";"_(x\1+1)_"f"
|
||||
. w:$g(c) $c(27)_"[2J"
|
||||
e d
|
||||
. u $p:(x=x:y=y)
|
||||
. u:$g(c) $p:clearscreen
|
||||
q
|
||||
|
||||
over
|
||||
n s
|
||||
s s="2 8_9 9 6 8_0 /2 5_/5_4 5_3 4_3 \5_2 \3_2 2_ 9_2_0/3 \2 3_\2_2 \2 /5 \_/ 2_ \3 /3 |3 \2 \/ 2/ 2_ \_2 2_ \0\4 \_\2 \/ 2_ \|2 Y Y2 \2 3_/2 /4 |4 \3 /\2 3_/|2 | \/0 \6_2 (4_2 /2_|_|2 /\3_2 > \7_2 /\_/2 \3_2 >2_|08 \/5 \/6 \/5 \/9 \/9 \/0"
|
||||
d cls,write(.s,dh/2-3,dw/2-32) h 1 r *s:0 r *s:2
|
||||
q
|
||||
|
||||
write(s,y,x)
|
||||
n i,j,l,c,d
|
||||
d pos(y,x)
|
||||
s l=$l(s) f i=1:1:l d
|
||||
. s c=$e(s,i)
|
||||
. i c?1N d
|
||||
.. i 'c s y=y+1 d pos(y,x) q
|
||||
.. s d=$e(s,i+1) f j=1:1:c w d
|
||||
.. s i=i+1
|
||||
. e w c
|
||||
d pos(0,0)
|
||||
q
|
||||
|
||||
help
|
||||
n i,x,l,j
|
||||
s i=9 f x="MOVE: LEFT, RIGHT","TURN: UP","DROP: SPACE","","FILL: F","GRID: G","HELP: H","","QUIT: ESC, Q" d pos(dh/2-(h/2)+i,dw/2+(3*w/2+3)) d s i=i+1
|
||||
. i hl w x
|
||||
. e s l=$l(x) f j=1:1:l w " "
|
||||
q
|
||||
|
||||
fill() q $s(fl=1:"[#]",fl=2:"[+]",1:"[ ]")
|
||||
|
||||
draw(n,r,y,x,o)
|
||||
n i,j
|
||||
s x=3*x+mx+1,y=y+my
|
||||
f i=1:1:4 i y+i>my f j=1:1:4 d pos(y+i-1,3*(j-1)+x) w $s($g(e(n,r,i,j)):$$fill,$g(o):" ",1:"")
|
||||
q
|
||||
|
||||
step() q 0.85**lv*sb+(0.1*lv)
|
||||
|
||||
score(s,l)
|
||||
s:$g(s) sc=sc+s
|
||||
i $g(l) s lv=lv+l,st=$$step
|
||||
d pos(dh/2-(h/2)+2,dw/2+(3*w/2+3)) w "SCORE: ",sc
|
||||
d pos(dh/2-(h/2)+3,dw/2+(3*w/2+3)) w "LEVEL: ",lv
|
||||
q
|
||||
|
||||
preview
|
||||
d draw(ne,1,4-e(ne,1),-5,1)
|
||||
q
|
||||
|
||||
stack
|
||||
n i,j,x,y
|
||||
s x=mx+1,y=my
|
||||
f i=1:1:h f j=1:1:w i $g(n(i,j)) d pos(y+i-1,3*(j-1)+x) w $$fill
|
||||
q
|
||||
|
||||
matrix
|
||||
n i,j
|
||||
f i=0:1:h-1 d
|
||||
. d pos(my+i,mx) w "|" f j=1:1:w w $s(gr:" . ",1:" ")
|
||||
. w "|"
|
||||
d pos(my+h,mx) w "|" f j=1:1:w*3 w "~"
|
||||
w "|",!
|
||||
q
|
||||
|
||||
dev
|
||||
n x,i
|
||||
zsh "d":x
|
||||
s i="" f s i=$o(x("D",i)) q:i="" d:(x("D",i)[$p)
|
||||
. s dw=$p($p(x("D",i),"WIDTH=",2)," ",1),dh=$p($p(x("D",i),"LENG=",2)," ",1)
|
||||
q
|
||||
|
||||
elements
|
||||
; e - elements
|
||||
; e(elemId) - rotateVersions
|
||||
; e(elemId,rotateVersion) - bottom coordinate
|
||||
; e(elemId,rotateVersion,y,x) - point
|
||||
;
|
||||
s e=7
|
||||
; ____
|
||||
s e(1)=2,e(1,1)=2
|
||||
s (e(1,1,2,1),e(1,1,2,2),e(1,1,2,3),e(1,1,2,4))=1
|
||||
s (e(1,2,1,2),e(1,2,2,2),e(1,2,3,2),e(1,2,4,2))=1
|
||||
; |__
|
||||
s e(2)=4,e(2,1)=2
|
||||
s (e(2,1,1,1),e(2,1,2,1),e(2,1,2,2),e(2,1,2,3))=1
|
||||
s (e(2,2,1,2),e(2,2,1,3),e(2,2,2,2),e(2,2,3,2))=1
|
||||
s (e(2,3,2,1),e(2,3,2,2),e(2,3,2,3),e(2,3,3,3))=1
|
||||
s (e(2,4,1,2),e(2,4,2,2),e(2,4,3,1),e(2,4,3,2))=1
|
||||
; __|
|
||||
s e(3)=4,e(3,1)=2
|
||||
s (e(3,1,1,3),e(3,1,2,1),e(3,1,2,2),e(3,1,2,3))=1
|
||||
s (e(3,2,1,2),e(3,2,2,2),e(3,2,3,2),e(3,2,3,3))=1
|
||||
s (e(3,3,2,1),e(3,3,2,2),e(3,3,2,3),e(3,3,3,1))=1
|
||||
s (e(3,4,1,1),e(3,4,1,2),e(3,4,2,2),e(3,4,3,2))=1
|
||||
; ||
|
||||
s e(4)=1,e(4,1)=2
|
||||
s (e(4,1,1,1),e(4,1,1,2),e(4,1,2,1),e(4,1,2,2))=1
|
||||
; _-
|
||||
s e(5)=2,e(5,1)=3
|
||||
s (e(5,1,2,2),e(5,1,2,3),e(5,1,3,1),e(5,1,3,2))=1
|
||||
s (e(5,2,1,2),e(5,2,2,2),e(5,2,2,3),e(5,2,3,3))=1
|
||||
; _|_
|
||||
s e(6)=4,e(6,1)=2
|
||||
s (e(6,1,1,2),e(6,1,2,1),e(6,1,2,2),e(6,1,2,3))=1
|
||||
s (e(6,2,1,2),e(6,2,2,2),e(6,2,2,3),e(6,2,3,2))=1
|
||||
s (e(6,3,2,1),e(6,3,2,2),e(6,3,2,3),e(6,3,3,2))=1
|
||||
s (e(6,4,1,2),e(6,4,2,1),e(6,4,2,2),e(6,4,3,2))=1
|
||||
; -_
|
||||
s e(7)=2,e(7,1)=3
|
||||
s (e(7,1,2,1),e(7,1,2,2),e(7,1,3,2),e(7,1,3,3))=1
|
||||
s (e(7,2,1,2),e(7,2,2,1),e(7,2,2,2),e(7,2,3,1))=1
|
||||
q
|
||||
17
samples/M/nesting.m
Normal file
17
samples/M/nesting.m
Normal file
@@ -0,0 +1,17 @@
|
||||
start1 ; entry label
|
||||
set ax=1
|
||||
set bx=20
|
||||
set cx=2
|
||||
set ay=1
|
||||
set by=20
|
||||
set cy=2
|
||||
set sumx=0
|
||||
set sqrx=0
|
||||
set sumxy=0
|
||||
for x=ax:cx:bx do
|
||||
. set sumx=sumx+x
|
||||
. set sqrx=sqrx+(x*x)
|
||||
. for y=ay:cy:by do
|
||||
.. set sumxy=sumxy+(x*y)
|
||||
.. if (sumxy<100) do
|
||||
... write sumxy,!
|
||||
511
samples/M/pcre.m
Normal file
511
samples/M/pcre.m
Normal file
@@ -0,0 +1,511 @@
|
||||
;
|
||||
; GT.M PCRE Extension
|
||||
; Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
; GT.M™ is a trademark of Fidelity Information Services, Inc.
|
||||
|
||||
; "GT.M™ is a vetted industrial strength, transaction processing application
|
||||
; platform consisting of a key-value database engine optimized for extreme
|
||||
; transaction processing throughput & business continuity."
|
||||
; -- http://sourceforge.net/projects/fis-gtm/
|
||||
|
||||
|
||||
|
||||
; GT.M PCRE Extension
|
||||
;
|
||||
; This extension tries to deliver the best possible PCRE interface for the
|
||||
; M world by providing a support for PCRE with M arrays, stringified parameter
|
||||
; names, simplified API, locales, exceptions and Perl5 Global Match.
|
||||
;
|
||||
; See pcreexamples.m for comprehensive examples on ^pcre routines usage and
|
||||
; beginner level tips on match limits, exception handling and UTF-8 in GT.M.
|
||||
;
|
||||
; Try out the best known book on regular expressions: http://regex.info/
|
||||
; For more information on PCRE see: http://pcre.org/
|
||||
;
|
||||
; Please feel free to contact me if you have any questions or comments,
|
||||
; Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
|
||||
|
||||
pcre ;GT.M PCRE Extension
|
||||
;1.0;Initial release;pkoper
|
||||
q
|
||||
|
||||
|
||||
version()
|
||||
q $&pcre.version()
|
||||
|
||||
config(name)
|
||||
; name is one of: (case insensitive)
|
||||
; "UTF8", "NEWLINE", "LINK_SIZE", "POSIX_MALLOC_THRESHOLD",
|
||||
; "MATCH_LIMIT", "MATCH_LIMIT_RECURSION", "STACKRECURSE",
|
||||
; "BSR", "UNICODE_PROPERTIES", "JIT", "JITTARGET"
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n erropt,isstring,s,n,code
|
||||
s code=$&pcre.config(.name,.erropt,.isstring,.s,.n)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q $s(isstring:s,1:n)
|
||||
|
||||
compile(pattern,options,locale,mlimit,reclimit)
|
||||
; options is case insensitive and optional string with "|" joined:
|
||||
; "ANCHORED", "CASELESS", "DOLLAR_ENDONLY", "DOTALL", "EXTENDED",
|
||||
; "FIRSTLINE", "MULTILINE", "NO_AUTO_CAPTURE", "DUPNAMES",
|
||||
; "UNGREEDY", "BSR_ANYCRLF", "BSR_UNICODE", "JAVASCRIPT_COMPAT",
|
||||
; "NL_ANY", "NL_ANYCRLF", "NL_CR", "NL_CRLF","NL_LF",
|
||||
; "UTF8", "UCP", "NO_UTF8_CHECK"
|
||||
;
|
||||
; locale is an optional Unix locale name used for pcre_maketables(),
|
||||
; cases:
|
||||
; undefined or "":
|
||||
; pcre_maketables() will not be called
|
||||
; "ENV" (case insensitive):
|
||||
; use locale in program environment defined by the
|
||||
; environment variables LANG or LC_*
|
||||
; specified:
|
||||
; "pl_PL.iso88592", "pl_PL.utf8", "C", ...
|
||||
; see locale(1), locale(2) and the output of command:
|
||||
; $ locale -a
|
||||
; Debian tip: use
|
||||
; $ dpkg-reconfigure locales
|
||||
; to enable or set system-wide locale
|
||||
;
|
||||
; mlimit (optional) limits the number of internal matching function
|
||||
; calls in pcre_exec() execution, see PCRE manual for details
|
||||
;
|
||||
; reclimit (optional) limit for the depth of recursion when calling
|
||||
; the internal matching function in a pcre_exec() execution,
|
||||
; see PCRE manual for details
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n erropt,ref,err,erroffset,code
|
||||
s code=$&pcre.compile(.pattern,$g(options),.erropt,.ref,.err,.erroffset,$g(locale),$g(mlimit,0),$g(reclimit,0))
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q ref
|
||||
|
||||
exec(ref,subject,options,startoffset,length)
|
||||
; options is case insensitive and optional string with "|" joined:
|
||||
; "ANCHORED", "BSR_ANYCRLF", "BSR_UNICODE",
|
||||
; "NL_ANY", "NL_ANYCRLF", "NL_CR", "NL_CRLF", "NL_LF",
|
||||
; "NOTBOL", "NOTEOL", "NOTEMPTY", "NOTEMPTY_ATSTART",
|
||||
; "NO_START_OPTIMIZE", "NO_UTF8_CHECK",
|
||||
; "PARTIAL_SOFT", "PARTIAL_HARD"
|
||||
;
|
||||
; startoffset is in octets, starts with 1 (like in M) (optional)
|
||||
;
|
||||
; length is subject length in octets, not chars (optional)
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n erropt,code,start
|
||||
s start=$g(startoffset,1)-1
|
||||
s code=$&pcre.exec(.ref,.subject,$g(length,$zl(subject)),start,$g(options),.erropt)
|
||||
s:code<0 $ec=",U"_(-code)_","
|
||||
q code
|
||||
|
||||
ovector(ref,i) ; return i-element from ovector
|
||||
d protect
|
||||
;
|
||||
n n,code
|
||||
s code=$&pcre.ovector(.ref,.i,.n)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
;s $ec=",U123,"
|
||||
q n
|
||||
|
||||
ovecsize(ref) ; return ovecsize
|
||||
d protect
|
||||
;
|
||||
n n,code
|
||||
s code=$&pcre.ovecsize(.ref,.n)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q n
|
||||
|
||||
fullinfo(ref,name)
|
||||
; name is one of: (case insensitive)
|
||||
; "OPTIONS", "SIZE", "CAPTURECOUNT", "BACKREFMAX", "FIRSTBYTE",
|
||||
; "FIRSTTABLE", "LASTLITERAL", "NAMEENTRYSIZE", "NAMECOUNT",
|
||||
; "STUDYSIZE", "OKPARTIAL", "JCHANGED", "HASCRORLF", "MINLENGTH",
|
||||
; "JIT", "JITSIZE"
|
||||
; for NAME* options see also $$nametable^pcre()
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n erropt,isstring,s,n,code
|
||||
s code=$&pcre.fullinfo(.ref,.name,.erropt,.isstring,.s,.n)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q $s(isstring:s,1:n)
|
||||
|
||||
nametable(ref,i,n) ; returns index (n) and name, or { 0, "" } for invalid i
|
||||
; i is indexed from 1
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n s,code
|
||||
s code=$&pcre.nametable(.ref,.i,.n,.s)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q s
|
||||
|
||||
substring(ref,i,begin,end)
|
||||
s begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)
|
||||
; ovector contains octet indexed data not UNICODE chars, so $ze is used
|
||||
q:'begin ""
|
||||
q $s($g(o,0):begin_","_end,1:$ze(subject,begin,end))
|
||||
|
||||
store(ref,i,n,o,key) ; same as above but stores captured data in n array
|
||||
n begin,end
|
||||
s begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)
|
||||
q:'begin
|
||||
s key=$g(key,i)
|
||||
s:o n(key,0)=begin,n(key,1)=end
|
||||
s n(key)=$ze(subject,begin,end)
|
||||
q
|
||||
|
||||
gstore(ref,i,n,round,byref,o,key) ; store for global match
|
||||
n begin,end
|
||||
s begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)
|
||||
q:'begin
|
||||
s key=$g(key,i)
|
||||
i byref d
|
||||
. s:o n(key,round,0)=begin,n(key,round,1)=end
|
||||
. s n(key,round)=$ze(subject,begin,end)
|
||||
e d
|
||||
. s:o n(round,key,0)=begin,n(round,key,1)=end
|
||||
. s n(round,key)=$ze(subject,begin,end)
|
||||
q
|
||||
|
||||
test(subject,pattern,options,locale,mlimit,reclimit)
|
||||
; see $$compile^pcre for options, locale, mlimit and reclimit
|
||||
;
|
||||
d protect
|
||||
n ref,l
|
||||
s ref=$$compile(.pattern,$g(options),$g(locale),$g(mlimit,0),$g(reclimit,0))
|
||||
s l=$$exec(.ref,.subject)
|
||||
d free(.ref)
|
||||
q l
|
||||
|
||||
match(subject,pattern,match,capture,options,locale,mlimit,reclimit)
|
||||
; see $$compile^pcre for options, locale, mlimit and reclimit
|
||||
;
|
||||
; capture is case insensitive and optional string with "|" joined
|
||||
; names or indexes to be capture
|
||||
;
|
||||
; extended options:
|
||||
; "NAMED_ONLY" - capture only named groups
|
||||
; "OVECTOR" - return additional ovector data
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n namedonly,ovector,ref,o,l,i,j,s,c,begin
|
||||
;
|
||||
s options=$g(options),(namedonly,ovector)=0
|
||||
f i=1:1:$l(options,"|") d
|
||||
. s o=$zco($p(options,"|",i),"u")
|
||||
. i o="NAMED_ONLY" s namedonly=1,$p(options,"|",i)=""
|
||||
. i o="OVECTOR" s ovector=1,$p(options,"|",i)=""
|
||||
s:namedonly options=options_"|NO_AUTO_CAPTURE"
|
||||
;
|
||||
k match
|
||||
s ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))
|
||||
s l=$$exec(.ref,.subject)
|
||||
i $d(capture) d
|
||||
. s c="|"_capture_"|"
|
||||
. ; ovector indexed data
|
||||
. i 'namedonly f i=0:1:l-1 d:c[("|"_i_"|") store(.ref,.i,.match,.ovector)
|
||||
. ; named matches data
|
||||
. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s="" d:c[("|"_s_"|") store(.ref,.j,.match,.ovector,.s)
|
||||
e d
|
||||
. i 'namedonly f i=0:1:l-1 d store(.ref,.i,.match,.ovector)
|
||||
. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s="" d store(.ref,.j,.match,.ovector,.s)
|
||||
d free(.ref)
|
||||
q:$q l q
|
||||
|
||||
global(subject,pattern,match,capture,options,locale,mlimit,reclimit)
|
||||
; options is the same as for match^pcre, extended options:
|
||||
; "OVECTOR" - return additional ovector data
|
||||
; "GROUPED" - group the result in match array by pattern groups
|
||||
; "NAMED_ONLY" - capture only named patterns
|
||||
;
|
||||
; see pcredemo.c and pcreccp.cc from PCRE for comments on procedure
|
||||
; for Perl like global matching
|
||||
;
|
||||
d protect
|
||||
;
|
||||
n ref,c,o,ovector,byref,namedonly,utf8,crlf,start,end,matches,empty,skip,round,i,j,s,n,q
|
||||
k match
|
||||
;
|
||||
; determine additional options and remove them before calling the compile^pcre
|
||||
s options=$g(options),(ovector,byref,namedonly)=0
|
||||
f i=1:1:$l(options,"|") d
|
||||
. s o=$zco($p(options,"|",i),"u")
|
||||
. i o="NAMED_ONLY" s namedonly=1,$p(options,"|",i)=""
|
||||
. i o="GROUPED" s byref=1,$p(options,"|",i)=""
|
||||
. i o="OVECTOR" s ovector=1,$p(options,"|",i)=""
|
||||
s:namedonly options=options_"|NO_AUTO_CAPTURE"
|
||||
;
|
||||
; compile the pattern
|
||||
s ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))
|
||||
;
|
||||
s:$d(capture) c="|"_capture_"|"
|
||||
s byref=$g(byref,0)
|
||||
;
|
||||
; check pattern options for UTF8 and double char new line
|
||||
s o="|"_$$fullinfo(.ref,"OPTIONS")_"|"
|
||||
s utf8=$s(o["|UTF8|":1,1:0)
|
||||
s crlf=$s(o["|NL_CRLF|":1,o["|NL_ANY|":1,o["|NL_ANYCRLF|":1,1:0)
|
||||
;
|
||||
; if none check the PCRE build options
|
||||
i crlf=0 d
|
||||
. s o=$$config("NEWLINE")
|
||||
. s crlf=$s(o="NL_CRLF":1,o="NL_ANY":1,o="NL_ANYCRLF":1,1:0)
|
||||
;
|
||||
s (start,round,i)=1,(empty,skip,q)=0
|
||||
s end=$l(subject)+1
|
||||
f d q:start>end!q
|
||||
. i empty d
|
||||
.. s matches=$$exec(.ref,.subject,"NOTEMPTY_ATSTART|ANCHORED",.start) ; unwind this call to optimize
|
||||
.. q:matches ; quit this do, leave empty=1, store the matches
|
||||
..
|
||||
.. ; advance if no match & clear empty
|
||||
.. s start=start+1
|
||||
.. i start>end s q=1 q
|
||||
..
|
||||
.. ; skip LF if CR was before and CRLF mode
|
||||
.. s:crlf&(($ze(subject,start-1)=$c(13))&($ze(subject,start)=$c(10))) start=start+1
|
||||
..
|
||||
.. ; skip if in a middle of UTF char
|
||||
.. i utf8 f q:start'<end!($zbitand($c(0)_$ze(subject,start),$c(0)_$c(192))=$c(0)_$c(128)) s start=start+1
|
||||
..
|
||||
.. ; take into account skipped chars
|
||||
.. s skip=1,empty=0
|
||||
. e d
|
||||
.. s matches=$$exec(.ref,.subject,,.start)
|
||||
.. i 'matches s q=1 q
|
||||
.
|
||||
. q:q
|
||||
. i skip s skip=0 q
|
||||
.
|
||||
. i $d(c) d
|
||||
.. ; ovector indexed data
|
||||
.. i 'namedonly f i=0:1:matches-1 d:c[("|"_i_"|") gstore(.ref,.i,.match,.round,.byref,.ovector)
|
||||
.. ; named matches data
|
||||
.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s="" d:c[("|"_s_"|") gstore(.ref,.n,.match,.round,.byref,.ovector,.s)
|
||||
. e d
|
||||
.. i 'namedonly f i=0:1:matches-1 d gstore(.ref,.i,.match,.round,.byref,.ovector)
|
||||
.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s="" d gstore(.ref,.n,.match,.round,.byref,.ovector,.s)
|
||||
. s round=round+1
|
||||
.
|
||||
. s start=$$ovector(.ref,1)+1
|
||||
. s empty=(($$ovector(.ref,0)+1)=start)
|
||||
d free(.ref)
|
||||
q:$q round-1 q
|
||||
|
||||
|
||||
replace(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)
|
||||
; see $$match^pcre and $$compile^pcre for options, locale, mlimit and
|
||||
; reclimit
|
||||
;
|
||||
; subst is a string to replace with all occurrences of matched data
|
||||
; \n (like \1, \2, ..) is a back ref for the n-th captured group
|
||||
; \{name} is back ref for a named captured data
|
||||
; \\ is replaced with \
|
||||
;
|
||||
; first is the n-th match in the subject where the substitution begins,
|
||||
; 1 .. n-1 matches are not substituted
|
||||
; defaults to 1
|
||||
;
|
||||
; last is the n-th match in the subject where the substitution ends,
|
||||
; n+1 .. matches are not substituted
|
||||
; defaults to 0 (no limit)
|
||||
;
|
||||
n ref,o,n,i,j,begin,end,offset,backref,boffset,value,s
|
||||
s ref=$$compile(.pattern,,$g(locale),$g(mlimit,0),$g(reclimit,0))
|
||||
;
|
||||
; prepare back reference stack
|
||||
d global^pcre(.subst,"\\(?:(?<ref>(?:\d+|\\))|{(?<ref>[^}]+)})",.backref,,"ovector|dupnames")
|
||||
;
|
||||
s options=$g(options)_"|ovector"
|
||||
; silently remove "NAMED_ONLY" and "GROUPPED" options
|
||||
f i=1:1:$l(options,"|") d
|
||||
. s o=$zco($p(options,"|",i),"u")
|
||||
. s:o="NAMED_ONLY"!(o="GROUPED") $p(options,"|",i)=""
|
||||
q:'$$global(.subject,.pattern,.n,,.options,$g(locale),$g(mlimit,0),$g(reclimit,0)) subject
|
||||
;
|
||||
; perform the substitution on matched subject parts
|
||||
s first=$g(first,1),last=$g(last,0)
|
||||
s offset=0,i=""
|
||||
f s i=$o(n(i)) q:i="" d:i'<first q:last>0&(i'<last)
|
||||
.
|
||||
. ; replace back refs in subst (s) with captured data
|
||||
. s s=subst,boffset=0,j=""
|
||||
. f s j=$o(backref(j)) q:j="" d
|
||||
..
|
||||
.. ; determine the back ref type and get the value
|
||||
.. ; silently ignore invalid refs
|
||||
.. s value=$s(backref(j,"ref")="\":"\\",1:$g(n(i,backref(j,"ref"))))
|
||||
..
|
||||
.. ; replace back ref with the value
|
||||
.. s begin=backref(j,0,0)
|
||||
.. s end=backref(j,0,1)
|
||||
.. s $ze(s,begin+boffset,end+boffset)=value
|
||||
.. s boffset=boffset-(end+1-begin)+$l(value)
|
||||
.
|
||||
. ; replace matched data with prepared s
|
||||
. s begin=n(i,0,0)
|
||||
. s end=n(i,0,1)
|
||||
.
|
||||
. s $ze(subject,begin+offset,end+offset)=s
|
||||
.
|
||||
. ; substitute empty matches also (Perl style)
|
||||
. ;
|
||||
. ; perl -e '$_ = "aa"; s/(b*|a)/Xy/g; print "$_\n"'
|
||||
. ; w $$replace^pcre("aa","(b*|a)","Xy")
|
||||
. ;
|
||||
. ; perl -e '$_ = "aa"; s/(b*|aa)/Xy/g; print "$_\n"'
|
||||
. ; w $$replace^pcre("aa","(b*|aa)","Xy")
|
||||
. ;
|
||||
. ; perl -e '$_ = "aaa"; s/(b*|aa)/Xy/g; print "$_\n"'
|
||||
. ; w $$replace^pcre("aaa","(b*|aa)","Xy")
|
||||
. ;
|
||||
. s:begin>end $ze(subject,begin+offset,begin+offset+1)=s_$ze(subject,begin+offset,begin+offset+1)
|
||||
.
|
||||
. s offset=offset-(end+1-begin)+$l(s)
|
||||
q:$q subject q
|
||||
|
||||
free(ref)
|
||||
d protect
|
||||
n code
|
||||
s code=$&pcre.free(.ref)
|
||||
s:code $ec=",U"_(-code)_","
|
||||
q
|
||||
|
||||
stackusage()
|
||||
; return the approximate amount of stack (in bytes) used per
|
||||
; recursion in pcre_exec()
|
||||
q -$&pcre.stackusage()
|
||||
|
||||
|
||||
; Exception Handling
|
||||
;
|
||||
; Error conditions are handled by setting the $zc to user codes, see labels
|
||||
; at the end of this file. When neither $zt nor $et are set by the user,
|
||||
; the default handler (trap^pcre) is used within $zt mechanism.
|
||||
;
|
||||
; The default handler will write out the details of the exception, and
|
||||
; depending on the caller type, it will re raise the exception. This will
|
||||
; lead to:
|
||||
; a) writing the exception details, when called from the GT.M prompt,
|
||||
; b) writing the exception details, the M code place when the pcre routine
|
||||
; was called, and terminating the GT.M image.
|
||||
;
|
||||
; The user should define own exception handler using $zt or $et, see
|
||||
; pcreexample.m for example exception handlers.
|
||||
;
|
||||
|
||||
protect ; try setup $zt with default handler
|
||||
;
|
||||
; "n protect" in the $zt is a marker for trap^pcre
|
||||
s:'$l($et)&(($zt="B")!'$l($zt)) $zt="n protect d trap zg "_($zl-2)
|
||||
q
|
||||
|
||||
trap(stack)
|
||||
; see U* labels at the bottom of this file, some lvns are mandatory
|
||||
; all exceptions are passed through if we wasn't called from direct mode
|
||||
;
|
||||
n zl,ref,msg,place
|
||||
;
|
||||
; take the $zl if in default handler setup by protect^trap
|
||||
s zl=$p($zt,"n protect d trap zg ",2)
|
||||
;
|
||||
; clear the $zt
|
||||
s $zt=""
|
||||
;
|
||||
; source location from either stack argument, zl (default handler), or $st-2
|
||||
s place=$st($g(stack,$g(zl,$st-1)-1),"PLACE")
|
||||
;
|
||||
; clear location if called from direct mode
|
||||
s:place["^GTM$DMOD" place=""
|
||||
;
|
||||
s ref=$p($ec,",",$l($ec,",")-1)
|
||||
i $l($t(@ref)) d
|
||||
. u $p
|
||||
. w @$p($t(@ref),";",2)
|
||||
. ; %PCRE-E-COMPILE additional message
|
||||
. w:ref="U16392"&$g(erroffset) " in "_$e($g(pattern),1,erroffset)_" <-- HERE"
|
||||
. w !
|
||||
. ; write the location it has any meaning
|
||||
. w:$l(place) "%PCRE-I-RTSLOC, At M source location ",place,!
|
||||
e d
|
||||
. w $p($zs,",",3,4),!
|
||||
. w "%GTM-I-RTSLOC, At M source location ",$p($zs,",",2),!
|
||||
;
|
||||
; re raise the exception if in a default handler and not called from the direct mode
|
||||
s:$l(place)&$g(zl,0) $ec=$ec
|
||||
q
|
||||
|
||||
; XC API specific
|
||||
;
|
||||
U16384 ;"%PCRE-E-ARGSMALL, Actual argument count is too small"
|
||||
U16385 ;"%PCRE-E-OPTNAME, Unknown option name "_$p($g(erropt),"|")
|
||||
U16386 ;"%PCRE-E-OBJLIMIT, Maximum number of objects exceeded"
|
||||
U16387 ;"%PCRE-E-INVREF, Invalid object reference"
|
||||
U16388 ;"%PCRE-E-INTBUF, Internal buffer too small"
|
||||
U16389 ;"%PCRE-E-MALLOC, Could not allocate memory"
|
||||
U16390 ;"%PCRE-E-STUDY, Pattern study failed: "_$g(err,"unknown reason")
|
||||
U16391 ;"%PCRE-E-LOCALE, Invalid locale name "_$g(locale)
|
||||
U16392 ;"%PCRE-E-COMPILE, Pattern compilation failed, "_$g(err,"unknown reason")
|
||||
U16393 ;"%PCRE-E-LENGTH, Invalid length value specified"
|
||||
|
||||
; PCRE specific
|
||||
;
|
||||
; NOTES:
|
||||
;
|
||||
; U16401 exception is never raised; when pcre_exec() returns -1
|
||||
; (i.e. NOMATCH) the pcre.exec returns 0, so no exception will
|
||||
; ever raise, NOMATCH is not an uncommon situation
|
||||
;
|
||||
; U16388 is raised when pcre_exec() returns 0, i.e. the ovector
|
||||
; was too small; considering that ovector size is not controlled
|
||||
; in M world, it is an exception here
|
||||
;
|
||||
U16401 ;"%PCRE-E-NOMATCH, The subject string did not match the pattern"
|
||||
U16402 ;"%PCRE-E-NULL, Either compiled code or subject was passed as NULL, or ovector was NULL"
|
||||
U16403 ;"%PCRE-E-BADOPTION, An unrecognized bit was set in the options argument"
|
||||
U16404 ;"%PCRE-E-BADMAGIC, The magic number is not present in compiled code"
|
||||
U16405 ;"%PCRE-E-UNKNOWNOPCODE, While running the pattern match, an unknown item was encountered in the compiled pattern"
|
||||
U16406 ;"%PCRE-E-NOMEMORY, Call via pcre_malloc() or pcre_stack_malloc() failed"
|
||||
U16407 ;"%PCRE-E-NOSUBSTRING, No substring"
|
||||
U16408 ;"%PCRE-E-MATCHLIMIT, Match limit was reached"
|
||||
U16409 ;"%PCRE-E-CALLOUT, Callout function wanted to yield a distinctive error code"
|
||||
U16410 ;"%PCRE-E-BADUTF8, A string that contains an invalid UTF-8 byte sequence was passed as a subject"
|
||||
U16411 ;"%PCRE-E-BADUTF8OFFSET, The value of startoffset did not point to the beginning of a UTF-8 character or the end of the subject"
|
||||
U16412 ;"%PCRE-E-PARTIAL, The subject string did not match, but it did match partially"
|
||||
U16414 ;"%PCRE-E-INTERNAL, An unexpected internal error has occurred"
|
||||
U16415 ;"%PCRE-E-BADCOUNT, The value of the ovecsize argument is negative"
|
||||
U16416 ;"%PCRE-E-DFAUITEM, Unsupported item in the pattern, for e.g. \C o a back reference"
|
||||
U16417 ;"%PCRE-E-DFAUCOND, Unsupported condition item, for e.g. a back reference for a condition, or a test for recursion in a specific group"
|
||||
U16418 ;"%PCRE-E-DFAUMLIMIT, Match limits are unsupported for DTA matching"
|
||||
U16419 ;"%PCRE-E-DFAWSSIZE, Out of space in the workspace vector"
|
||||
U16420 ;"%PCRE-E-DFARECURSE, The output vector was not large enough while processing recursive subpattern"
|
||||
U16421 ;"%PCRE-E-RECURSIONLIMIT, The internal recursion limit was reached"
|
||||
U16423 ;"%PCRE-E-BADNEWLINE, An invalid combination of NL_xxx options was given"
|
||||
U16424 ;"%PCRE-E-BADOFFSET, The startoffset was negative or greater than the length of the value in length"
|
||||
U16425 ;"%PCRE-E-SHORTUTF8, The subject string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set"
|
||||
U16426 ;"%PCRE-E-RECURSELOOP, A recursion loop within the pattern was detected"
|
||||
U16427 ;"%PCRE-E-JITSTACKLIMIT, The memory available for the just-in-time processing stack is not large enough"
|
||||
622
samples/M/pcreexamples.m
Normal file
622
samples/M/pcreexamples.m
Normal file
@@ -0,0 +1,622 @@
|
||||
;
|
||||
; GT.M PCRE Extension
|
||||
; Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as
|
||||
; published by the Free Software Foundation, either version 3 of the
|
||||
; License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
|
||||
|
||||
; GT.M PCRE Extension Examples
|
||||
;
|
||||
; see pcre.m for comments on routines parameters and all possible values for
|
||||
; the options
|
||||
;
|
||||
pcreexamples ;GT.M PCRE Extension Examples
|
||||
;1.0;Initial release;pkoper
|
||||
d routines
|
||||
q
|
||||
|
||||
|
||||
; GT.M PCRE Extension API
|
||||
; The shining examples
|
||||
;
|
||||
|
||||
test
|
||||
; Test the subject for the match
|
||||
w $$test^pcre("The quick brown fox jumps over the lazy dog","fox"),!
|
||||
w $$test^pcre("The quick brown fox jumps over the lazy dog","FoX","caseless"),!
|
||||
q
|
||||
|
||||
match
|
||||
n n
|
||||
; Simple match
|
||||
w $$match^pcre("The quick brown fox jumps over the lazy dog"," (\w+) ",.n),! zwr
|
||||
|
||||
; Match with a named groups
|
||||
w $$match^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+) (?<second>\w+)",.n),! zwr
|
||||
|
||||
; Match with a named group and limit the output to only the "second"
|
||||
w $$match^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+) (?<second>\w+)",.n,"second"),! zwr
|
||||
|
||||
; Match with a named group with only named patterns
|
||||
w $$match^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+) (?<second>\w+)",.n,,"named_only"),! zwr
|
||||
q
|
||||
|
||||
global
|
||||
n n
|
||||
; Global match
|
||||
w $$global^pcre("The quick brown fox jumps over the lazy dog","(\w+)",.n),! zwr
|
||||
|
||||
; Global match with a named groups
|
||||
w $$global^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)",.n),! zwr
|
||||
|
||||
; Global match with grouped captured data
|
||||
w $$global^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)",.n,,"grouped"),! zwr
|
||||
|
||||
; Global match with grouped captured data and only named patterns
|
||||
w $$global^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)",.n,,"grouped|named_only"),! zwr
|
||||
q
|
||||
|
||||
replace
|
||||
; Just the replace
|
||||
w $$replace^pcre("The quick brown fox jumps over the lazy dog","brown","yellow"),!
|
||||
|
||||
; Change the word order
|
||||
w $$replace^pcre("The quick brown fox jumps over the lazy dog","(\w+)\s+(\w+)","\2 \1"),!
|
||||
|
||||
; Change the word order with named groups
|
||||
w $$replace^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)","\{second} \{first}"),!
|
||||
|
||||
; Escape the \ sequence
|
||||
w $$replace^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)","\{second} \\{first}"),!
|
||||
|
||||
; More \ chars
|
||||
w $$replace^pcre("The quick brown fox jumps over the lazy dog","(?<first>\w+)\s+(?<second>\w+)","\\\{second} \\\\{first}"),!
|
||||
q
|
||||
|
||||
|
||||
|
||||
; PCRE API
|
||||
; Low level PCRE API examples
|
||||
;
|
||||
api
|
||||
n subject,pattern,options,offset,ref,count,i,begin,end,s,name,n
|
||||
|
||||
; Setup exception trap as in myexception2^pcreexamples
|
||||
s $zt="d trap^pcre("_$st_") zg "_$zl_":apitrap^pcreexamples"
|
||||
|
||||
s subject="The quick brown fox "_$c(10)_"jumps over the lazy dog"
|
||||
s pattern="(?<all>(.*?(?<red>F\S+).*?)(?<high>\w+))"
|
||||
|
||||
; options are case insensitive, as well as all stringified option
|
||||
; names for all functions in this extension
|
||||
s options="CASELESS|multiLINE|NL_CrLf|NO_AUTO_CAPTURE|dotall"
|
||||
s offset=5 ; start the match with "quick"
|
||||
|
||||
; Compile the pattern
|
||||
s ref=$$compile^pcre(.pattern,.options) ; pass by the reference
|
||||
|
||||
; Run the match
|
||||
s count=$$exec^pcre(.ref,.subject,,.offset)
|
||||
w "count: ",count,!
|
||||
|
||||
; To access the ovector array $$ovector^pcre and $$ovecsize^pcre can
|
||||
; be used.
|
||||
;
|
||||
; ovector array size is always (n + 1) * 3, where n is a number of
|
||||
; possible capture strings in the submitted pattern for the
|
||||
; $$compile^pcre(). The exact number of usable pairs of integers in
|
||||
; ovector array is by the $$exec^pcre().
|
||||
;
|
||||
w "ovecsize: ",$$ovecsize^pcre(.ref),!
|
||||
|
||||
; Get the captured data in an old way
|
||||
f i=0:1:count-1 d
|
||||
. s begin=$$ovector^pcre(.ref,i*2)+1
|
||||
. s end=$$ovector^pcre(.ref,i*2+1)
|
||||
. s s=$ze(subject,begin,end)
|
||||
. w i,": ",s,!
|
||||
|
||||
; See what's in the nametable
|
||||
;
|
||||
; $$nametable^pcre returns i-th element of nametable array, where the
|
||||
; index of the ovector array is passed by the reference in n, and the
|
||||
; return value is a name.
|
||||
;
|
||||
f i=1:1 s name=$$nametable^pcre(.ref,.i,.n) q:name="" d
|
||||
. s begin=$$ovector^pcre(.ref,n*2)+1 ; the returned subject index in n
|
||||
. s end=$$ovector^pcre(.ref,n*2+1)
|
||||
. s s=$ze(subject,begin,end)
|
||||
. w name,": ",s,!
|
||||
|
||||
; Use $$substring^pcre() to get the captured string instead of playing
|
||||
; with $$ovector^pcre().
|
||||
f i=0:1:count-1 w i,": ",$$substring^pcre(.ref,.i),!
|
||||
|
||||
; .. and get the begin and the end index of the captured data in the
|
||||
; subject, as a side effect.
|
||||
f i=0:1:count-1 d
|
||||
. w i,": ",$$substring^pcre(.ref,.i,.begin,.end),!
|
||||
. w "begin: ",begin,!
|
||||
. w "end: ",end,!
|
||||
|
||||
; Get some details on compiled pattern
|
||||
w "options: ",$$fullinfo^pcre(.ref,"OPTIONS"),!
|
||||
w "capture count: ",$$fullinfo^pcre(.ref,"CAPTURECOUNT"),!
|
||||
w "jit: ",$$fullinfo^pcre(.ref,"JIT"),!
|
||||
w "min length: ",$$fullinfo^pcre(.ref,"MINLENGTH"),!
|
||||
|
||||
; Free the data internally allocated for the PCRE structures
|
||||
;
|
||||
d free^pcre(.ref)
|
||||
|
||||
; Finally, raise an example exception
|
||||
;
|
||||
; see "Exception Handler Examples"
|
||||
;
|
||||
w $t(api+4^pcreexamples),!
|
||||
w $$compile^pcre("aa)bb"),!
|
||||
w "should never be written, the %PCRE-E-COMPILE should be raised",!
|
||||
q
|
||||
|
||||
apitrap
|
||||
w "apitrap^pcreexamples",!
|
||||
q
|
||||
|
||||
|
||||
|
||||
|
||||
; Perl5 Global Match Compatibility
|
||||
;
|
||||
; Global match as with /g switch on regular expressions in Perl5 is supported.
|
||||
;
|
||||
; See $$global^pcre and $$replace^pcre examples.
|
||||
|
||||
|
||||
; Compatibility Case: Empty Matches
|
||||
;
|
||||
|
||||
; Global Match
|
||||
;
|
||||
p5global
|
||||
w "$ perl -e '$_ = ""aa""; print ""1: $1\n"" while /(b*|aa)/mg'",!
|
||||
zsy "perl -e ""\$_ = \""aa\""; print \""1: \$1\n\"" while /(b*|aa)/mg"""
|
||||
d global^pcre("aa","b*|aa",.n) zwr
|
||||
q
|
||||
|
||||
; Global Replace
|
||||
;
|
||||
p5replace
|
||||
w "$ perl -e '$_ = ""aa""; s/(b*|a)/Xy/g; print ""$_\n""'",!
|
||||
zsy "perl -e ""\$_ = \""aa\""; s/(b*|a)/Xy/g; print \""\$_\n\"""""
|
||||
w $$replace^pcre("aa","(b*|a)","Xy"),!
|
||||
|
||||
w "$ perl -e '$_ = ""aa""; s/(b*|aa)/Xy/g; print ""$_\n""'",!
|
||||
zsy "perl -e ""\$_ = \""aa\""; s/(b*|aa)/Xy/g; print \""\$_\n\"""""
|
||||
w $$replace^pcre("aa","(b*|aa)","Xy"),!
|
||||
|
||||
w "$ perl -e '$_ = ""aaa""; s/(b*|aa)/Xy/g; print ""$_\n""'",!
|
||||
zsy "perl -e ""\$_ = \""aaa\""; s/(b*|aa)/Xy/g; print \""\$_\n\"""""
|
||||
w $$replace^pcre("aaa","(b*|aa)","Xy"),!
|
||||
q
|
||||
|
||||
|
||||
; Compatibility Case: New Line Characters
|
||||
;
|
||||
|
||||
; Multi-line with LF
|
||||
;
|
||||
p5lf
|
||||
w "perl -e '$_ = ""aa\nbb""; print ""1: $1\n"" while /(.*)/mg'",!
|
||||
zsy "perl -e ""\$_ = \""aa\nbb\""; print \""1: \$1\n\"" while /(.*)/mg"""
|
||||
d global^pcre("aa"_$c(10)_"bb",".*",.n,,"multiline|nl_lf") zwr
|
||||
q
|
||||
|
||||
; Various New Line Specs
|
||||
;
|
||||
p5nl
|
||||
d global^pcre("aa"_$c(13)_$c(10)_"bb",".*",.n,,"multiline|nl_lf") zwr
|
||||
d global^pcre("aa"_$c(13)_$c(10)_"bb",".*",.n,,"multiline|nl_cr") zwr
|
||||
d global^pcre("aa"_$c(13)_$c(10)_"bb",".*",.n,,"multiline|nl_crlf") zwr
|
||||
q
|
||||
|
||||
|
||||
|
||||
; PCRE library version
|
||||
;
|
||||
version
|
||||
w $$version^pcre,!
|
||||
q
|
||||
|
||||
; PCRE compile time defaults
|
||||
;
|
||||
newline
|
||||
w $$config^pcre("NEWLINE"),!
|
||||
q
|
||||
|
||||
utf8support
|
||||
w $$config^pcre("UTF8"),!
|
||||
q
|
||||
|
||||
; Stack Usage
|
||||
;
|
||||
; PCRE's stack usage discover procedure
|
||||
;
|
||||
stackusage
|
||||
w $$stackusage^pcre,!
|
||||
q
|
||||
|
||||
|
||||
|
||||
; Locale Support Examples
|
||||
;
|
||||
; Polish language has been used as an example for I18N support in PCRE.
|
||||
;
|
||||
|
||||
; The example word "dąb" (encoded here in UTF-8) is an "oak" in Polish.
|
||||
;
|
||||
; The second letter in "dąb" is <aogonek> (I18N) which is:
|
||||
; $c(177) in ISO8859-2,
|
||||
; $c(261) in UTF-8,
|
||||
; see http://en.wikipedia.org/wiki/Polish_code_pages for complete listing
|
||||
;
|
||||
|
||||
; Note of $CHAR(n) in different GT.M character modes:
|
||||
;
|
||||
; In UTF-8 mode $c(177) will return two octet encoded UTF-8 char is
|
||||
; probably not an expected result when working with single octet ISO
|
||||
; encoded chars.
|
||||
;
|
||||
; Use $zch(177) to create single octet ISO char, but be prepared for
|
||||
; %GTM-E-BADCHAR errors. Also the result of $l(), $a() and others might
|
||||
; be not what is expected.
|
||||
;
|
||||
|
||||
|
||||
; Locale: C or POSIX (i.e. no localization)
|
||||
;
|
||||
nolocale
|
||||
w $zchset,!
|
||||
w $$match^pcre("d"_$zch(177)_"b","\w{3}",.n,,,),! zwr
|
||||
q
|
||||
|
||||
; Locale: ISO
|
||||
;
|
||||
isolocale
|
||||
w $zchset,!
|
||||
w $$match^pcre("d"_$zch(177)_"b","\w{3}",.n,,,"pl_PL"),! zwr
|
||||
q
|
||||
|
||||
; Locale: UTF-8
|
||||
;
|
||||
utflocale
|
||||
; M and UTF-8 mode
|
||||
w $$match^pcre("d"_$zch(196)_$zch(133)_"b","\w{3}",.n,,"UTF8|UCP","pl_PL.UTF8"),! zwr
|
||||
|
||||
; UTF-8 mode only
|
||||
w $$match^pcre("d"_$c(261)_"b","\w{3}",.n,,"UTF8|UCP","pl_PL.UTF8"),! zwr
|
||||
q
|
||||
|
||||
; Locale: environment ($LANG, $LC_CTYPE)
|
||||
;
|
||||
; Set the GT.M environment for LANG="pl_PL" or LANG="pl_PL.UTF8" to obtain
|
||||
; different results.
|
||||
;
|
||||
envlocale
|
||||
w $ztrnlnm("LANG"),!
|
||||
w $ztrnlnm("LC_CTYPE"),!
|
||||
w $$match^pcre("d"_$c(177)_"b","\w{3}",.n,,,"env"),! zwr
|
||||
w $$match^pcre("d"_$zch(196)_$zch(133)_"b","\w{3}",.n,,"UTF8|UCP","pl_PL.UTF8"),! zwr
|
||||
q
|
||||
|
||||
|
||||
; Notes on GT.M in UTF-8
|
||||
;
|
||||
; Enabling native support for UTF-8 in GT.M requires:
|
||||
; 1) libicu
|
||||
; 2) environment:
|
||||
; gtm_chset=UTF-8
|
||||
; gtm_icu_version=4.8
|
||||
; 3) recompiled object files for UTF-8
|
||||
;
|
||||
;
|
||||
; Instructions for UTF-8 in Debian 6
|
||||
;
|
||||
; 1) Install libicu (libicu48)
|
||||
; $ apt-get install libicu48
|
||||
; 2) append environment setup to GT.M's user .bash_profile
|
||||
; export gtm_chset=UTF-8
|
||||
; export gtm_icu_version=4.8
|
||||
; 3) remove *.o files from the GT.M installation directory
|
||||
; $ rm /opt/gtm/*.o
|
||||
; 4) allow GT.M's user to write new object files
|
||||
; $ chown gtm /opt/gtm
|
||||
;
|
||||
;
|
||||
; Startup errors in UTF-8 mode
|
||||
;
|
||||
; %GTM-E-INVOBJ, Cannot ZLINK object file due to unexpected format
|
||||
; %GTM-I-TEXT, Object compiled with CHSET=M which is different from $ZCHSET
|
||||
;
|
||||
; The above errors are written by the GT.M at the startup when the environment
|
||||
; has the correct setup for the UTF-8, but GT.M can't use already existing
|
||||
; object files for execution, because they were compiled for the M charset.
|
||||
; Remove all GT.M's object files like in step 3) in the "Instructions for
|
||||
; UTF-8 in Debian 6" above.
|
||||
;
|
||||
|
||||
|
||||
|
||||
; Match Limits
|
||||
;
|
||||
; PCRE has built-in limits on internal matching and recursion.
|
||||
;
|
||||
; Those limits prevent the PCRE engine from a very long runs, especially
|
||||
; when there would be no matches and all possible paths in the match
|
||||
; tree must be checked.
|
||||
;
|
||||
; Functions using $$compile^pcre and the $$compile^pcre itself allows
|
||||
; setting MATCH_LIMIT and MATCH_LIMIT_RECURSION in optional arguments
|
||||
; named mlimit and reclimit:
|
||||
;
|
||||
; $$compile^pcre(pattern,options,locale,mlimit,reclimit)
|
||||
; $$match^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)
|
||||
; $$global^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)
|
||||
; $$replace^pcre(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)
|
||||
;
|
||||
; If the mlimit or reclimit are not specified, the PCRE library
|
||||
; compilation time defaults are used.
|
||||
;
|
||||
limits
|
||||
w "Compile time (default) MATCH_LIMIT is: ",$$config^pcre("MATCH_LIMIT"),!
|
||||
w "Compile time (default) MATCH_LIMIT_RECURSION is: ",$$config^pcre("MATCH_LIMIT"),!
|
||||
q
|
||||
|
||||
; Example pattern with a very long run time
|
||||
;
|
||||
longrun
|
||||
w $$match^pcre("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(\D+|<\d+>)*[!?]",.n),! zwr
|
||||
w "should never be written, the %PCRE-E-MATCHLIMIT should be raised",!
|
||||
q
|
||||
|
||||
; Equal to the longrun^pcreexamples, but corrected pattern
|
||||
;
|
||||
shortrun
|
||||
w $$match^pcre("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","((?>\D+)|<\d+>)*[!?]",.n),! zwr
|
||||
q
|
||||
|
||||
; Enforced mlimit
|
||||
;
|
||||
enforcedlimit
|
||||
w $$match^pcre("aaaaaa","(.)(.)",.n,,,,2),! zwr
|
||||
w "should never be written, the %PCRE-E-MATCHLIMIT should be raised",!
|
||||
q
|
||||
|
||||
|
||||
|
||||
; Exception Handling
|
||||
;
|
||||
; Error conditions are handled by setting the $zc to user codes, see labels at
|
||||
; the end of this file. When neither $zt nor $et are set by the user, the
|
||||
; default handler (trap^pcre) is used within $zt mechanism.
|
||||
;
|
||||
; The default handler will write out the details of the exception, and
|
||||
; depending on the caller type, it will re raise the exception. This will lead
|
||||
; to:
|
||||
; a) writing the exception details, when called from the GT.M prompt,
|
||||
; b) writing the exception details, the M code place when the pcre routine
|
||||
; was called, and terminating the GT.M image.
|
||||
;
|
||||
; The user should define own exception handler using $zt or $et, see
|
||||
; pcreexamples.m for example exception handlers.
|
||||
;
|
||||
|
||||
|
||||
; Exception Handler Examples
|
||||
;
|
||||
|
||||
; No handler
|
||||
;
|
||||
nohandler
|
||||
s ($ec,$et,$zt)=""
|
||||
s x=$$compile^pcre("a)b")
|
||||
w "will never be written",!
|
||||
q
|
||||
;
|
||||
; GTM>d nohandler^pcreexamples
|
||||
; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE
|
||||
; %PCRE-I-RTSLOC, At M source location nohandler+2^pcreexamples
|
||||
; %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)
|
||||
; %GTM-I-RTSLOC, At M source location trap+32^pcre
|
||||
; $ (GT.M image has been terminated)
|
||||
;
|
||||
|
||||
|
||||
; Simple handler
|
||||
;
|
||||
myexception1
|
||||
s $zt="zg "_$zl_":mytrap1^pcreexamples"
|
||||
s x=$$compile^pcre("a)b")
|
||||
w "will never be written",!
|
||||
q
|
||||
|
||||
mytrap1
|
||||
w "it's a trap",!
|
||||
w $ec,!
|
||||
s $ec=""
|
||||
q
|
||||
;
|
||||
; GTM>d myexception1^pcreexamples
|
||||
; it's a trap
|
||||
; ,U16392,
|
||||
; GTM>
|
||||
;
|
||||
|
||||
|
||||
; Simple handler with pcre exception details
|
||||
;
|
||||
myexception2
|
||||
s $zt="d trap^pcre("_$st_") zg "_$zl_":mytrap2^pcreexamples"
|
||||
s x=$$compile^pcre("a)b")
|
||||
w "will never be written",!
|
||||
q
|
||||
|
||||
mytrap2
|
||||
w "it's a trap",!
|
||||
w $ec,!
|
||||
s $ec=""
|
||||
q
|
||||
;
|
||||
; GTM>d myexception2^pcreexamples
|
||||
; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE
|
||||
; %PCRE-I-RTSLOC, At M source location myexception2+2^pcreexamples
|
||||
; it's a trap
|
||||
; ,U16392,
|
||||
; GTM>
|
||||
;
|
||||
; In this example the trap^pcre is called with optional argument (level
|
||||
; of M execution stack), for which trap^pcre will produce the
|
||||
; %PCRE-I-RTSLOC details.
|
||||
;
|
||||
; DETAILS:
|
||||
; The trap^pcre is executed in the stack frame where the error condition
|
||||
; occurred, that gives the trap^pcre routine an access to the local
|
||||
; variables like locale (locale name) or err (PCRE error message).
|
||||
; The following zg command drops stack frames up to the current frame
|
||||
; (the frame where the s $zt=.. is used), and executes the mytrap label,
|
||||
; where locale or err is not available.
|
||||
;
|
||||
|
||||
|
||||
; Simple handler with limited pcre exception details
|
||||
;
|
||||
myexception3
|
||||
s $zt="zg "_$zl_":mytrap3^pcreexamples"
|
||||
s x=$$compile^pcre("a)b")
|
||||
w "will never be written",!
|
||||
q
|
||||
|
||||
mytrap3
|
||||
d trap^pcre($st)
|
||||
w "it's a trap",!
|
||||
w $ec,!
|
||||
s $ec=""
|
||||
q
|
||||
;
|
||||
; GTM>d myexception3^pcreexamples
|
||||
; %PCRE-E-COMPILE, Pattern compilation failed, unknown reason
|
||||
; %PCRE-I-RTSLOC, At M source location myexception3+2^pcreexamples
|
||||
; it's a trap
|
||||
; ,U16392,
|
||||
; GTM>
|
||||
;
|
||||
; DETAILS:
|
||||
; The trap^pcre is executed in the stack frame where the compile^pcre
|
||||
; was called. The deeper stack frames has already been dropped by the
|
||||
; zg command, so the err local variable is not available in this
|
||||
; context. Thats why trap^pcre doesn't know the exact reason why the
|
||||
; %PCRE-E-COMPILE was raised.
|
||||
;
|
||||
|
||||
|
||||
; Note on $st() and repeated exceptions
|
||||
;
|
||||
; The $st() function returns information connected with $ec codes in
|
||||
; a stack manner. That means that when once the $ec was set at n-th
|
||||
; execution level, any future exceptions at that level won't change
|
||||
; the $st() output for that level unless $ec is cleared.
|
||||
;
|
||||
; Always clear $ec when the exception handling is done.
|
||||
;
|
||||
|
||||
|
||||
; Execute all of the routines in this file
|
||||
;
|
||||
routines
|
||||
w ">> test^pcreexamples",!
|
||||
d test^pcreexamples
|
||||
|
||||
w !,">> match^pcreexamples",!
|
||||
d match^pcreexamples
|
||||
|
||||
w !,">> global^pcreexamples",!
|
||||
d global^pcreexamples
|
||||
|
||||
w !,">> replace^pcreexamples",!
|
||||
d replace^pcreexamples
|
||||
|
||||
w !,">> p5global^pcreexamples",!
|
||||
d p5global^pcreexamples
|
||||
|
||||
w !,">> p5replace^pcreexamples",!
|
||||
d p5replace^pcreexamples
|
||||
|
||||
w !,">> p5lf^pcreexamples",!
|
||||
d p5lf^pcreexamples
|
||||
|
||||
w !,">> p5nl^pcreexamples",!
|
||||
d p5nl^pcreexamples
|
||||
|
||||
w !,">> version^pcreexamples",!
|
||||
d version^pcreexamples
|
||||
|
||||
w !,">> newline^pcreexamples",!
|
||||
d newline^pcreexamples
|
||||
|
||||
w !,">> utf8support^pcreexamples",!
|
||||
d utf8support^pcreexamples
|
||||
|
||||
w !,">> stackusage^pcreexamples",!
|
||||
d stackusage^pcreexamples
|
||||
|
||||
w !,">> nolocale^pcreexamples",!
|
||||
d nolocale^pcreexamples
|
||||
|
||||
w !,">> isolocale^pcreexamples",!
|
||||
d isolocale^pcreexamples
|
||||
|
||||
w !,">> utflocale^pcreexamples",!
|
||||
d utflocale^pcreexamples
|
||||
|
||||
w !,">> envlocale^pcreexamples",!
|
||||
d envlocale^pcreexamples
|
||||
|
||||
w !,">> limits^pcreexamples",!
|
||||
d limits^pcreexamples
|
||||
|
||||
w !,">> longrun^pcreexamples",!
|
||||
w "(skipped, uncomment to raise the exception)",!
|
||||
; d longrun^pcreexamples
|
||||
|
||||
w !,">> shortrun^pcreexamples",!
|
||||
d shortrun^pcreexamples
|
||||
|
||||
w !,">> enforcedlimit^pcreexamples",!
|
||||
w "(skipped, uncomment to raise the exception)",!
|
||||
; d enforcedlimit^pcreexamples
|
||||
|
||||
w !,">> nohandler^pcreexamples",!
|
||||
w "(skipped, uncomment to raise the exception)",!
|
||||
; d nohandler^pcreexamples
|
||||
|
||||
w !,">> myexception1^pcreexamples",!
|
||||
d myexception1^pcreexamples
|
||||
|
||||
w !,">> myexception2^pcreexamples",!
|
||||
d myexception2^pcreexamples
|
||||
|
||||
w !,">> myexception3^pcreexamples",!
|
||||
d myexception3^pcreexamples
|
||||
q
|
||||
46
samples/M/postconditional.m
Normal file
46
samples/M/postconditional.m
Normal file
@@ -0,0 +1,46 @@
|
||||
;
|
||||
; M code examples contrasting postconditionals with IF-commands
|
||||
;
|
||||
post1 ; postconditional in set command
|
||||
set a=5
|
||||
set b=10
|
||||
set c=25
|
||||
I 0 ;purposely set $TEST to false
|
||||
write "$TEST special variable (before post-condition)=",$TEST
|
||||
set:(a<b) c=b
|
||||
write "$TEST special variable (after post-condition) =",$TEST
|
||||
write "c =",c,!
|
||||
quit
|
||||
;
|
||||
post2 ; postconditional in write command
|
||||
set a=5
|
||||
set b=10
|
||||
I 0 ;purposely set $TEST to false
|
||||
write "$TEST special variable (before post-condition)=",$TEST
|
||||
write:(a<b) "variable a=",a," is smaller than b=",b,!
|
||||
write "$TEST special variable (after post-condition) =",$TEST
|
||||
write:(a>b) "variable a=",a," is larger than b=",b,!
|
||||
write "$TEST special variable (after post-condition) =",$TEST
|
||||
quit
|
||||
;
|
||||
if1 ; if command
|
||||
set a=5
|
||||
set b=10
|
||||
set c=25
|
||||
I 0 ;purposely set $TEST to false
|
||||
write "$TEST special variable (before IF)=",$TEST
|
||||
if (a<b) set c=b
|
||||
write "$TEST special variable (after IF) =",$TEST
|
||||
write c,!
|
||||
quit
|
||||
;
|
||||
if2 ; postconditional in write command
|
||||
set a=5
|
||||
set b=10
|
||||
I 0 ;purposely set $TEST to false
|
||||
write "$TEST special variable (before IF)=",$TEST
|
||||
if (a<b) write "variable a=",a," is smaller than b=",b,!
|
||||
write "$TEST special variable (after IF) =",$TEST
|
||||
if (a>b) write "variable a=",a," is larger than b=",b,!
|
||||
write "$TEST special variable (after IF) =",$TEST
|
||||
quit
|
||||
6
samples/M/primes.m
Normal file
6
samples/M/primes.m
Normal file
@@ -0,0 +1,6 @@
|
||||
; part of Keith Lynch's .signature; it prints a table of primes,
|
||||
; including code to format it neatly into columns -- DPBS
|
||||
; -- M Technology and MUMPS Language FAQ, Part 1/2
|
||||
;
|
||||
|
||||
f p=2,3:2 s q=1 x "f f=3:2 q:f*f>p!'q s q=p#f" w:q p,?$x\8+1*8
|
||||
49
samples/M/url.m
Normal file
49
samples/M/url.m
Normal file
@@ -0,0 +1,49 @@
|
||||
;
|
||||
; This file is part of DataBallet.
|
||||
; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>
|
||||
;
|
||||
; DataBallet is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU Affero General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; DataBallet is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU Affero General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU Affero General Public License
|
||||
; along with DataBallet. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
decode(val)
|
||||
;
|
||||
; Decoded a URL Encoded string
|
||||
;
|
||||
new decoded,c,i
|
||||
|
||||
set decoded=""
|
||||
for i=1:1:$zlength(val) do
|
||||
. set c=$zextract(val,i,i)
|
||||
. if c="+" set decoded=decoded_" "
|
||||
. else if c'="%" set decoded=decoded_c
|
||||
. else set decoded=decoded_$zchar($$FUNC^%HD($zextract(val,i+1,i+2))) set i=i+2
|
||||
quit decoded
|
||||
|
||||
encode(val)
|
||||
;
|
||||
; Encoded a string for URL usage
|
||||
;
|
||||
new encoded,c,i
|
||||
set encoded=""
|
||||
|
||||
; Populate safe char only the first time
|
||||
if '$data(safechar) for i=45,46,95,126,48:1:57,65:1:90,97:1:122 set safechar($zchar(i))=""
|
||||
|
||||
for i=1:1:$zlength(val) do
|
||||
. set c=$zextract(val,i,i)
|
||||
. if $data(safechar(c)) set encoded=encoded_c
|
||||
. else if c=" " set encoded=encoded_"+"
|
||||
. else set encoded=encoded_"%"_$$FUNC^%DH($zascii(c),2)
|
||||
|
||||
quit encoded
|
||||
1949
samples/M/zmwire.m
Normal file
1949
samples/M/zmwire.m
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user