CIAUEDT ;MSC/IND/DKM - Screen-oriented line editor;14-Aug-2006 09:35;DKM
;;1.2;CIA UTILITIES;;Mar 20, 2007
;;Copyright 2000-2006, Medsphere Systems Corporation
;=================================================================
; Inputs:
; CIADATA = Data to edit
; CIALEN = Maximum length of data
; CIAX = Starting column position
; CIAY = Starting row position
; CIAVALD = List of valid inputs (optional)
; CIADISV = DISV node to save under (optional)
; CIATERM = Valid input terminators (default=<CR>)
; CIAABRT = Valid input abort characters (default=none)
; CIARM = Right margin setting (default=IOM or 80)
; CIAQUIT = Exit code (returned)
; CIAOPT = Input options
; C = Mark <CR> with ~
; E = Echo off
; H = Horizontal scroll
; I = No timeout
; L = Lowercase only
; O = Overwrite mode
; Q = Quiet mode
; R = Reverse video
; T = Auto-terminate
; U = Uppercase only
; V = Up/down cursor keys terminate input
; X = Suppress auto-erase
; Outputs:
; Return value = Edited data
;=================================================================
ENTRY(CIADATA,CIALEN,CIAX,CIAY,CIAVALD,CIAOPT,CIADISV,CIATERM,CIAABRT,CIARM,CIAQUIT) ;
N CIAZ,CIAZ1,CIAZ2,CIASAVE,CIAINS,CIAAE,CIABUF,CIATAB,CIAPOS,CIAEON,CIALEFT,CIABEL,CIAMAX,CIARVON,CIARVOFF,CIAC,CIAW
S CIAVALD=$G(CIAVALD),CIAOPT=$$UP^XLFSTR($G(CIAOPT)),CIABEL=$S(CIAOPT'["Q":$C(7),1:""),CIADISV=$G(CIADISV)
S:$G(CIATERM)="" CIATERM=$C(13) ; Valid line terminators
S CIAABRT=$G(CIAABRT) ; Valid input abort keys
S CIARVON=$C(27,91,55,109),CIARVOFF=$C(27,91,109) ; Reverse video control
S CIAINS=CIAOPT'["O" ; Default mode = insert
S CIAAE=CIAOPT'["X" ; Auto-erase option
S CIAEON=CIAOPT'["E" ; No echo option
I CIAOPT["I"!'$D(DTIME) N DTIME S DTIME=99999999 ; Suppress timeout option
S CIABUF=""
S CIARM=$G(CIARM,$G(IOM,80)) ; Display width
S CIATAB=$C(9) ; Tab character
S CIAX=$G(CIAX,$X),CIAY=$G(CIAY,$Y),CIAW=CIARM-CIAX
S:CIAW'>0 CIAW=1
S:'$G(CIALEN) CIALEN=CIAW ; Default field width
S CIAMAX=$S(CIAOPT["H":250,1:CIALEN) ; Maximum data length
S (CIASAVE,CIADATA)=$E($G(CIADATA),1,CIAMAX) ; Truncate data if too long
I $$NEWERR^%ZTER N $ET S $ET=""
S @$$TRAP^CIAUOS("ERROR^CIAUEDT")
D RM^CIAUOS(0)
X ^%ZOSF("EOFF")
F Q:CIADATA'[CIATAB S CIAZ=$P(CIADATA,CIATAB),CIADATA=CIAZ_$J("",8-($L(CIAZ)#8))_$P(CIADATA,CIATAB,2,999)
RESTART D RESET
AGAIN F CIAQUIT=0:0 Q:CIAQUIT D NXT S CIAAE=0
X ^%ZOSF("EON")
W $$XY^CIAU(CIAX,CIAY),$S(CIAOPT["R":CIARVOFF,1:"")
I CIADISV'="" Q:"^^"[CIADATA CIADATA S:CIADATA=" " CIADATA=$G(^DISV(DUZ,CIADISV))
S:CIADISV'="" ^DISV(DUZ,CIADISV)=CIADATA
Q CIADATA ; Return to calling routine
NXT D POSCUR() ; Position cursor
R *CIAC:DTIME ; Next character typed
I CIAC=27 D ESC Q:'CIAC
I CIAC<1!(CIAABRT[$C(CIAC)) S CIADATA=U,CIAQUIT=1 Q
I CIATERM[$C(CIAC) D TERM Q
I CIAC<28 D:CIAC'=27 @("CTL"_$C(CIAC+64)) Q
I CIAC=127!(CIAC=240) D CTLH Q
I CIAC>64,CIAC<91,CIAOPT["L" S CIAC=CIAC+32
E I CIAC>96,CIAC<123,CIAOPT["U" S CIAC=CIAC-32
I $L(CIAVALD),CIAVALD'[$C(CIAC) D RAISE^CIAUOS()
D:CIAAE CTLK,POSCUR() ; Erase buffer if auto erase on
D INSW($C(CIAC))
S CIAQUIT=CIAPOS=CIALEN&(CIAOPT["T")
Q
CTLA S CIAINS='CIAINS ; Toggle insert mode
Q
CTLB D MOVETO(0) ; Move cursor to beginning
Q
CTLX S CIADATA=CIASAVE ; Restore buffer to original
G RESET
CTLE D MOVETO($L(CIADATA)) ; Move cursor to end
Q
CTLI D INSW($J("",8-(CIAPOS#8))) ; Insert expanded tab
Q
CTLJ F CIAZ=CIAPOS:-1:1 Q:$A(CIADATA,CIAZ)'=32 ; Find previous nonspace
F CIAZ=CIAZ:-1:1 Q:$A(CIADATA,CIAZ)=32 ; Find previous space
S CIABUF=$E(CIADATA,CIAZ,CIAPOS) ; Save deleted portion
S CIADATA=$E(CIADATA,1,CIAZ-1)_$E(CIADATA,CIAPOS+1,CIALEN) ; Remove word
D MOVETO(CIAZ-1)
Q
CTLK S CIABUF=CIADATA ; Save buffer
S CIADATA="" ; Erase buffer
D RESET
Q
CTLL S CIABUF=$E(CIADATA,CIAPOS+1,CIALEN) ; Save deleted portion
S CIADATA=$E(CIADATA,1,CIAPOS) ; Truncate at current position
D DSPLY(CIAPOS)
Q
CTLM D POSCUR(CIAPOS),INSW("~"):CIAOPT["C",MOVETO(CIAPOS-$X+CIAX+CIAW)
Q
CTLR D INSW(CIABUF) ; Insert at current position
Q
CTLT D CTLL
Q
CTLU S CIABUF=$E(CIADATA,1,CIAPOS) ; Save deleted portion
S CIADATA=$E(CIADATA,CIAPOS+1,CIALEN) ; Remove to left of cursor
D RESET
Q
CTLH I 'CIAPOS W CIABEL Q
D LEFT
CTLD S CIADATA=$E(CIADATA,1,CIAPOS)_$E(CIADATA,CIAPOS+2,CIAMAX) ; Delete character to left
D DSPLY(CIAPOS,1)
Q
TERM S CIAQUIT=2
Q
ESC R *CIAZ:1
R:CIAZ>0 *CIAZ:1
S CIAC=0
G UP:CIAZ=65,DOWN:CIAZ=66,RIGHT:CIAZ=67,LEFT:CIAZ=68 ;Execute code
S CIAC=27
Q
DSPLY(CIAP1,CIAP2) ;
Q:'CIAEON ; Refresh buffer display starting at position CIAP1
N CIAZ,CIAZ1
S CIAP1=+$G(CIAP1,CIALEFT),CIAZ=$E(CIADATA,CIAP1+1,CIALEFT+CIALEN),CIAP2=$S($D(CIAP2):CIAP2+$L(CIAZ),1:CIALEN-CIAP1+CIALEFT)
S:CIAP2>CIALEN CIAP2=CIALEN
S CIAZ=CIAZ_$J("",CIAP2-$L(CIAZ))
F D Q:CIAZ=""
.D POSCUR(CIAP1)
.S CIAZ1=CIARM-$X
.S:CIAZ1<1 CIAZ1=1
.W $E(CIAZ,1,CIAZ1)
.S CIAZ=$E(CIAZ,CIAZ1+1,999),CIAP1=CIAP1+CIAZ1
Q
INSW(CIATXT) ;
S:CIAPOS>$L(CIADATA) CIADATA=CIADATA_$J("",CIAPOS-$L(CIADATA)) ; Pad if past end of buffer
S CIADATA=$E($E(CIADATA,1,CIAPOS)_CIATXT_$E(CIADATA,CIAPOS+2-CIAINS,CIAMAX),1,CIAMAX)
D DSPLY(CIAPOS,0),MOVETO(CIAPOS+$L(CIATXT))
Q
POSCUR(CIAP) ;
N CIAZX,CIAZY
S CIAP=+$G(CIAP,CIAPOS),CIAZX=CIAP-CIALEFT,CIAZY=CIAZX\CIAW+CIAY,CIAZX=CIAZX#CIAW+CIAX
W $$XY^CIAU(CIAZX,CIAZY)
Q
MOVETO(CIAP) ;
I CIAP>CIAMAX!(CIAP<0) W CIABEL Q
S CIAPOS=CIAP,CIAP=CIALEFT
S:CIAPOS<CIALEFT CIALEFT=CIAPOS-CIAW-1
S:CIALEFT+CIALEN<CIAPOS CIALEFT=CIAPOS-CIAW+1
S:CIALEFT'<CIAMAX CIALEFT=CIAMAX-CIAW
S:CIALEFT<0 CIALEFT=0
D DSPLY():CIALEFT'=CIAP,POSCUR()
Q
UP I CIAOPT["V" S CIAQUIT=3
E D MOVETO(CIAPOS-CIAW)
Q
DOWN I CIAOPT["V" S CIAQUIT=4
E D MOVETO(CIAPOS+CIAW)
Q
RIGHT D MOVETO(CIAPOS+1)
Q
LEFT D MOVETO(CIAPOS-1)
Q
RESET W $S(CIAOPT["R":CIARVON,1:CIARVOFF)
S (CIAPOS,CIALEFT)=0 ; Current edit offset
D DSPLY() ; Refresh display
Q
ERROR W CIABEL ; Sound bell
S @$$TRAP^CIAUOS("ERROR^CIAUEDT")
G AGAIN
CIAUEDT ;MSC/IND/DKM - Screen-oriented line editor;14-Aug-2006 09:35;DKM
+1 ;;1.2;CIA UTILITIES;;Mar 20, 2007
+2 ;;Copyright 2000-2006, Medsphere Systems Corporation
+3 ;=================================================================
+4 ; Inputs:
+5 ; CIADATA = Data to edit
+6 ; CIALEN = Maximum length of data
+7 ; CIAX = Starting column position
+8 ; CIAY = Starting row position
+9 ; CIAVALD = List of valid inputs (optional)
+10 ; CIADISV = DISV node to save under (optional)
+11 ; CIATERM = Valid input terminators (default=<CR>)
+12 ; CIAABRT = Valid input abort characters (default=none)
+13 ; CIARM = Right margin setting (default=IOM or 80)
+14 ; CIAQUIT = Exit code (returned)
+15 ; CIAOPT = Input options
+16 ; C = Mark <CR> with ~
+17 ; E = Echo off
+18 ; H = Horizontal scroll
+19 ; I = No timeout
+20 ; L = Lowercase only
+21 ; O = Overwrite mode
+22 ; Q = Quiet mode
+23 ; R = Reverse video
+24 ; T = Auto-terminate
+25 ; U = Uppercase only
+26 ; V = Up/down cursor keys terminate input
+27 ; X = Suppress auto-erase
+28 ; Outputs:
+29 ; Return value = Edited data
+30 ;=================================================================
ENTRY(CIADATA,CIALEN,CIAX,CIAY,CIAVALD,CIAOPT,CIADISV,CIATERM,CIAABRT,CIARM,CIAQUIT) ;
+1 NEW CIAZ,CIAZ1,CIAZ2,CIASAVE,CIAINS,CIAAE,CIABUF,CIATAB,CIAPOS,CIAEON,CIALEFT,CIABEL,CIAMAX,CIARVON,CIARVOFF,CIAC,CIAW
+2 SET CIAVALD=$GET(CIAVALD)
SET CIAOPT=$$UP^XLFSTR($GET(CIAOPT))
SET CIABEL=$SELECT(CIAOPT'["Q":$CHAR(7),1:"")
SET CIADISV=$GET(CIADISV)
+3 ; Valid line terminators
IF $GET(CIATERM)=""
SET CIATERM=$CHAR(13)
+4 ; Valid input abort keys
SET CIAABRT=$GET(CIAABRT)
+5 ; Reverse video control
SET CIARVON=$CHAR(27,91,55,109)
SET CIARVOFF=$CHAR(27,91,109)
+6 ; Default mode = insert
SET CIAINS=CIAOPT'["O"
+7 ; Auto-erase option
SET CIAAE=CIAOPT'["X"
+8 ; No echo option
SET CIAEON=CIAOPT'["E"
+9 ; Suppress timeout option
IF CIAOPT["I"!'$DATA(DTIME)
NEW DTIME
SET DTIME=99999999
+10 SET CIABUF=""
+11 ; Display width
SET CIARM=$GET(CIARM,$GET(IOM,80))
+12 ; Tab character
SET CIATAB=$CHAR(9)
+13 SET CIAX=$GET(CIAX,$X)
SET CIAY=$GET(CIAY,$Y)
SET CIAW=CIARM-CIAX
+14 IF CIAW'>0
SET CIAW=1
+15 ; Default field width
IF '$GET(CIALEN)
SET CIALEN=CIAW
+16 ; Maximum data length
SET CIAMAX=$SELECT(CIAOPT["H":250,1:CIALEN)
+17 ; Truncate data if too long
SET (CIASAVE,CIADATA)=$EXTRACT($GET(CIADATA),1,CIAMAX)
+18 IF $$NEWERR^%ZTER
NEW $ETRAP
SET $ETRAP=""
+19 SET @$$TRAP^CIAUOS("ERROR^CIAUEDT")
+20 DO RM^CIAUOS(0)
+21 XECUTE ^%ZOSF("EOFF")
+22 FOR
IF CIADATA'[CIATAB
QUIT
SET CIAZ=$PIECE(CIADATA,CIATAB)
SET CIADATA=CIAZ_$JUSTIFY("",8-($LENGTH(CIAZ)#8))_$PIECE(CIADATA,CIATAB,2,999)
RESTART DO RESET
AGAIN FOR CIAQUIT=0:0
IF CIAQUIT
QUIT
DO NXT
SET CIAAE=0
+1 XECUTE ^%ZOSF("EON")
+2 WRITE $$XY^CIAU(CIAX,CIAY),$SELECT(CIAOPT["R":CIARVOFF,1:"")
+3 IF CIADISV'=""
IF "^^"[CIADATA
QUIT CIADATA
IF CIADATA=" "
SET CIADATA=$GET(^DISV(DUZ,CIADISV))
+4 IF CIADISV'=""
SET ^DISV(DUZ,CIADISV)=CIADATA
+5 ; Return to calling routine
QUIT CIADATA
NXT ; Position cursor
DO POSCUR()
+1 ; Next character typed
READ *CIAC:DTIME
+2 IF CIAC=27
DO ESC
IF 'CIAC
QUIT
+3 IF CIAC<1!(CIAABRT[$CHAR(CIAC))
SET CIADATA=U
SET CIAQUIT=1
QUIT
+4 IF CIATERM[$CHAR(CIAC)
DO TERM
QUIT
+5 IF CIAC<28
IF CIAC'=27
DO @("CTL"_$CHAR(CIAC+64))
QUIT
+6 IF CIAC=127!(CIAC=240)
DO CTLH
QUIT
+7 IF CIAC>64
IF CIAC<91
IF CIAOPT["L"
SET CIAC=CIAC+32
+8 IF '$TEST
IF CIAC>96
IF CIAC<123
IF CIAOPT["U"
SET CIAC=CIAC-32
+9 IF $LENGTH(CIAVALD)
IF CIAVALD'[$CHAR(CIAC)
DO RAISE^CIAUOS()
+10 ; Erase buffer if auto erase on
IF CIAAE
DO CTLK
DO POSCUR()
+11 DO INSW($CHAR(CIAC))
+12 SET CIAQUIT=CIAPOS=CIALEN&(CIAOPT["T")
+13 QUIT
CTLA ; Toggle insert mode
SET CIAINS='CIAINS
+1 QUIT
CTLB ; Move cursor to beginning
DO MOVETO(0)
+1 QUIT
CTLX ; Restore buffer to original
SET CIADATA=CIASAVE
+1 GOTO RESET
CTLE ; Move cursor to end
DO MOVETO($LENGTH(CIADATA))
+1 QUIT
CTLI ; Insert expanded tab
DO INSW($JUSTIFY("",8-(CIAPOS#8)))
+1 QUIT
CTLJ ; Find previous nonspace
FOR CIAZ=CIAPOS:-1:1
IF $ASCII(CIADATA,CIAZ)'=32
QUIT
+1 ; Find previous space
FOR CIAZ=CIAZ:-1:1
IF $ASCII(CIADATA,CIAZ)=32
QUIT
+2 ; Save deleted portion
SET CIABUF=$EXTRACT(CIADATA,CIAZ,CIAPOS)
+3 ; Remove word
SET CIADATA=$EXTRACT(CIADATA,1,CIAZ-1)_$EXTRACT(CIADATA,CIAPOS+1,CIALEN)
+4 DO MOVETO(CIAZ-1)
+5 QUIT
CTLK ; Save buffer
SET CIABUF=CIADATA
+1 ; Erase buffer
SET CIADATA=""
+2 DO RESET
+3 QUIT
CTLL ; Save deleted portion
SET CIABUF=$EXTRACT(CIADATA,CIAPOS+1,CIALEN)
+1 ; Truncate at current position
SET CIADATA=$EXTRACT(CIADATA,1,CIAPOS)
+2 DO DSPLY(CIAPOS)
+3 QUIT
CTLM DO POSCUR(CIAPOS)
IF CIAOPT["C"
DO INSW("~")
DO MOVETO(CIAPOS-$X+CIAX+CIAW)
+1 QUIT
CTLR ; Insert at current position
DO INSW(CIABUF)
+1 QUIT
CTLT DO CTLL
+1 QUIT
CTLU ; Save deleted portion
SET CIABUF=$EXTRACT(CIADATA,1,CIAPOS)
+1 ; Remove to left of cursor
SET CIADATA=$EXTRACT(CIADATA,CIAPOS+1,CIALEN)
+2 DO RESET
+3 QUIT
CTLH IF 'CIAPOS
WRITE CIABEL
QUIT
+1 DO LEFT
CTLD ; Delete character to left
SET CIADATA=$EXTRACT(CIADATA,1,CIAPOS)_$EXTRACT(CIADATA,CIAPOS+2,CIAMAX)
+1 DO DSPLY(CIAPOS,1)
+2 QUIT
TERM SET CIAQUIT=2
+1 QUIT
ESC READ *CIAZ:1
+1 IF CIAZ>0
READ *CIAZ:1
+2 SET CIAC=0
+3 ;Execute code
IF CIAZ=65
GOTO UP
IF CIAZ=66
GOTO DOWN
IF CIAZ=67
GOTO RIGHT
IF CIAZ=68
GOTO LEFT
+4 SET CIAC=27
+5 QUIT
DSPLY(CIAP1,CIAP2) ;
+1 ; Refresh buffer display starting at position CIAP1
IF 'CIAEON
QUIT
+2 NEW CIAZ,CIAZ1
+3 SET CIAP1=+$GET(CIAP1,CIALEFT)
SET CIAZ=$EXTRACT(CIADATA,CIAP1+1,CIALEFT+CIALEN)
SET CIAP2=$SELECT($DATA(CIAP2):CIAP2+$LENGTH(CIAZ),1:CIALEN-CIAP1+CIALEFT)
+4 IF CIAP2>CIALEN
SET CIAP2=CIALEN
+5 SET CIAZ=CIAZ_$JUSTIFY("",CIAP2-$LENGTH(CIAZ))
+6 FOR
Begin DoDot:1
+7 DO POSCUR(CIAP1)
+8 SET CIAZ1=CIARM-$X
+9 IF CIAZ1<1
SET CIAZ1=1
+10 WRITE $EXTRACT(CIAZ,1,CIAZ1)
+11 SET CIAZ=$EXTRACT(CIAZ,CIAZ1+1,999)
SET CIAP1=CIAP1+CIAZ1
End DoDot:1
IF CIAZ=""
QUIT
+12 QUIT
INSW(CIATXT) ;
+1 ; Pad if past end of buffer
IF CIAPOS>$LENGTH(CIADATA)
SET CIADATA=CIADATA_$JUSTIFY("",CIAPOS-$LENGTH(CIADATA))
+2 SET CIADATA=$EXTRACT($EXTRACT(CIADATA,1,CIAPOS)_CIATXT_$EXTRACT(CIADATA,CIAPOS+2-CIAINS,CIAMAX),1,CIAMAX)
+3 DO DSPLY(CIAPOS,0)
DO MOVETO(CIAPOS+$LENGTH(CIATXT))
+4 QUIT
POSCUR(CIAP) ;
+1 NEW CIAZX,CIAZY
+2 SET CIAP=+$GET(CIAP,CIAPOS)
SET CIAZX=CIAP-CIALEFT
SET CIAZY=CIAZX\CIAW+CIAY
SET CIAZX=CIAZX#CIAW+CIAX
+3 WRITE $$XY^CIAU(CIAZX,CIAZY)
+4 QUIT
MOVETO(CIAP) ;
+1 IF CIAP>CIAMAX!(CIAP<0)
WRITE CIABEL
QUIT
+2 SET CIAPOS=CIAP
SET CIAP=CIALEFT
+3 IF CIAPOS<CIALEFT
SET CIALEFT=CIAPOS-CIAW-1
+4 IF CIALEFT+CIALEN<CIAPOS
SET CIALEFT=CIAPOS-CIAW+1
+5 IF CIALEFT'<CIAMAX
SET CIALEFT=CIAMAX-CIAW
+6 IF CIALEFT<0
SET CIALEFT=0
+7 IF CIALEFT'=CIAP
DO DSPLY()
DO POSCUR()
+8 QUIT
UP IF CIAOPT["V"
SET CIAQUIT=3
+1 IF '$TEST
DO MOVETO(CIAPOS-CIAW)
+2 QUIT
DOWN IF CIAOPT["V"
SET CIAQUIT=4
+1 IF '$TEST
DO MOVETO(CIAPOS+CIAW)
+2 QUIT
RIGHT DO MOVETO(CIAPOS+1)
+1 QUIT
LEFT DO MOVETO(CIAPOS-1)
+1 QUIT
RESET WRITE $SELECT(CIAOPT["R":CIARVON,1:CIARVOFF)
+1 ; Current edit offset
SET (CIAPOS,CIALEFT)=0
+2 ; Refresh display
DO DSPLY()
+3 QUIT
ERROR ; Sound bell
WRITE CIABEL
+1 SET @$$TRAP^CIAUOS("ERROR^CIAUEDT")
+2 GOTO AGAIN