VZEditor/PATCHED/open.asm
2025-04-02 08:44:47 +09:00

2138 lines
30 KiB
NASM

;****************************
; 'open.asm'
;****************************
include vz.inc
;--- External symbols ---
wseg
extrn ctab :byte
extrn curdrv :byte
extrn dirchr :byte
extrn lastcmd :byte
extrn macmode :byte
extrn nm_env :byte
extrn nm_log :byte
extrn nm_path :byte
extrn nm_vz :byte
extrn ntab :byte
extrn tchdir :byte
extrn promode :byte
extrn fldsz :byte
extrn binlist :word
extrn curdir :word
extrn defpath :word
extrn dspsw :word
extrn edtsw :word
extrn envseg :word
extrn extlist :word
extrn sbuf :word
extrn fbuf :word
extrn xbuf :word
extrn lbuf :word
extrn lbuf_end :word
extrn lbufsz :word
extrn macrobuf :word
extrn nbuf :word
extrn pathbuf :word
extrn pathp :word
extrn reffile :word
extrn retval :word
extrn syssw :word
extrn textc :word
extrn tmpbuf3 :word
extrn w_act :word
extrn w_back :word
extrn w_busy :word
extrn w_free :word
extrn logtbl :word
extrn logtblsz :word
extrn actwkp :word
extrn w_act0 :word
extrn w_back0 :word
endws
extrn chgpath :near
extrn dispask :near
extrn disperr :near
extrn dispmsg :near
extrn dspscr :near
extrn fclose :near
extrn filer :near
extrn getdosscrn :near
extrn getpool :near
extrn isdigit :near
extrn iskanji :near
extrn isupper :near
extrn ld_wact :near
extrn maptext :near
extrn nextpool :near
extrn putdosscrn :near
extrn quit_vz :near
extrn scannum :near
extrn schmacro :near
extrn setcmdwindow :near
extrn setdoswindow :near
extrn setenvvar :near
extrn setfnckey :near
extrn setrefdir :near
extrn setwnum :near
extrn se_command :near
extrn se_console :near
extrn skipchar :near
extrn skipspc :near
extrn skipstr :near
extrn sprintf :near
; extrn stack_cs :near
; extrn stack_gs :near
extrn strcpy :near
extrn strcmp :near
extrn strlen :near
extrn strlwr :near
extrn strskip :near
extrn strupr :near
extrn tclose :near
extrn tclose2 :near
extrn tolower :near
extrn topen :near
extrn topen1 :near
extrn toupper :near
extrn tsave :near
; extrn tsave1 :near
extrn tsave2 :near
extrn windgets :near
extrn windgetsc :near
extrn wndcls :near
extrn wrdcpy :near
extrn wrdicmp :near
extrn settcp :near
extrn getnum :near
extrn toptext :near
extrn endtext :near
extrn restcp :near
extrn putnum :near
extrn memmove :near
extrn setnum :near
extrn isdnumb :near
extrn setabsp :near
extrn chk_fldual :near
extrn get_optkwd :near
extrn get_histsym :near
extrn wnd_reset :near
extrn write_goption :near
extrn histcpy_w :near
extrn set_opnopt :near
extrn chpath :near
extrn skipline :near
extrn do_evmac :near
extrn run_evmac :near
extrn chkline1 :near
dseg
;--- Local work ---
getdirp dw 0 ; default dir ptr
putextp dw 0 ; put ext ptr
GDATA getnamp, dw, 0 ; get name ptr
GDATA getextp, dw, 0 ; get ext ptr
GDATA frompool, db, 0 ; 1=get path from pool, 2=new file
GDATA fromref, db, 0
GDATA parsef, db, 0 ; parse result bit
GDATA addlogf, db, 0
readbuf db 0
pro_crlf db CR,LF
nm_pro db '@',0
fullpath db 0
endds
cseg
assume ds:nothing
;--- New files ---
;<-- CY :error
public se_new
se_new proc
mov dl,W_NEW
jmps opnnew
se_new endp
;--- Open files ---
;--> CY :error
public se_open,se_open2,se_open3,ini_open
ini_open:
test promode,PRO_AUTO
_ifn z
movseg ds,ss
movseg es,ss
mov si,offset cgroup:nm_pro
call selfile1
jnc se_open3
_endif
se_open proc
open1: mov dl,W_READ
opnnew: call infile
jc open9
se_open2:
call selfile
jc open1
se_open3:
clr ax ; ##16
mov w_act0,ax
mov w_back0,ax
_repeat
mov bp,w_free
tst bp
jz toomany
call topen
open2: jc open_x ; from "se_load"
call dspscr
open3: call nextfile
_until c
IFNDEF NOFILER
call chk_fldual
jnz open3
ENDIF
call wnd_reset
clc
open9: VZ_RET
open_x:
cmp dl,E_PATH
je open1
stc
VZ_RET
toomany:
mov dl,E_OPEN
call disperr
VZ_RET
se_open endp
;--- Load file ---
public se_load
se_load proc
tstb [bp].wnum
jz open1
call preclose
jc load9
_ifn z
call tsave2
jc load9
_endif
test macmode,1
jnz load2
tstb frompool
_ifn z
clr cx
_else
load2: mov dl,W_READ
call infile
jc load9
_endif
call selfile
jc load2
call tclose2
call ld_wact
call topen1 ; ##16
jmp open2
load9: VZ_RET
se_load endp
;--- Close file ---
public se_close
se_close proc
tstb [bp].wnum
jmpl z,se_console ; ##152.19
call preclose
jc close9
_ifn z
call tsave2
jc close9
_endif
call prof_close
call tclose
tstw w_act
jz close1
call dspscr
clc
close9: VZ_RET
close1:
call putdosscrn
call getdosscrn
call setcmdwindow
call setdoswindow
test syssw,SW_QUIT
jnz close9
IFNDEF NOFILER
tstb frompool
jmpl z,se_open
ENDIF
clr cx
jmp se_open2
se_close endp
;--- Save file ---
public se_save
se_save proc
mov dl,W_WRITE
tstb [bp].blkm
_ifn z
_repeat
call infile
jc save9
_while cxz
clr si
jmps save2
_endif
tstb [bp].tchf
js save_x
mov dl,W_WRITE
call rename
jc save9
save2: call tsave
pushf
call dspscr
popf
save9: VZ_RET
save_x:
mov dl,M_RDONLY
call dispmsg
stc
VZ_RET
se_save endp
;--- Append file ---
public se_append
se_append proc
; tstb [bp].blkm
;_if z
; tstb [bp].tchf
; js save_x
;_endif
apnd1: mov dl,W_APPEND
call infile
jc apnd9
call selfile
jc apnd1
call tsave
apnd8: pushf ; ##153.45
call dspscr
popf
apnd9: VZ_RET
se_append endp
;--- Quit ---
ismodify proc
push bp
mov bp,w_busy
clr ax
_repeat
push ax
call precls1
pop ax
cmp [bp].tchf,TCH_MOD
_if e
mov ax,1
_endif
mov bp,[bp].w_next
tst bp
_until z
mov retval,ax
tst ax
pop bp
VZ_RET
ismodify endp
public se_quit,se_exit,closeall
se_quit proc
call ismodify
jz quit3
mov dl,M_QSAVEM
call dispask
jc quit9
jz quit3
mov bp,w_busy
_repeat
cmp [bp].tchf,TCH_MOD
_if e
call maptext
; mov ds,[bp].ttops ; ##151.05
call tsave2
jc apnd8 ; ##153.45
_endif
mov bp,[bp].w_next
tst bp
_until z
quit3:
test syssw,SW_QUIT
_if z
mov retval,0
mov dl,M_QQUIT
call dispask
jbe quit9
_endif
quit4:
test promode,PRO_WRITE
_ifn z
call se_writeref
_endif
assume ds:cgroup
closeall:
movseg ds,ss
quit5: call ld_wact
jz quit6
tstb [bp].wnum
_if z
mov ax,w_back ; ##151.06
tst ax
jz quit6
xchg ax,bp
mov w_act,bp
mov w_back,ax
_endif
call fclose
call wndcls
jmp quit5
quit6:
call setwnum
mov w_act,0
jmp quit_vz
quit9: stc
VZ_RET
se_quit endp
se_exit proc
call ismodify
_ifn z
mov dl,M_ABANDON
call dispask
jbe quit9
_endif
jmp quit4
se_exit endp
assume ds:nothing
;--- Rename ---
public se_rename
se_rename proc
mov dl,W_RENAME
call rename
_ifn c
test [bp].largf,FL_RENAME
stc
_ifn z
test [bp].largf,FL_HEADX+FL_TAILX
_ifn z
call settcp
call getnum
call toptext
call endtext
call restcp
call putnum
_endif
call setnewname
clc
_endif
pushf
call checkpath
popf
_endif
VZ_RET
se_rename endp
rename proc
push ds
movseg ds,ss
movseg es,ss
lea si,[bp].path
mov di,nbuf
push di
call strcpy
inc di ; ##153.54
stosb
pop si
_repeat
mov cx,PATHSZ
call windgetsc
_while cxz
_ifn c
lea si,[bp].path
mov di,nbuf
call wrdicmp
_ifn c
or [bp].largf,FL_RENAME
_endif
clc
_endif
pop ds
VZ_RET
rename endp
public setnewname
setnewname proc
and [bp].largf,not FL_RENAME
push ds
movseg ds,ss
movseg es,ss
mov si,nbuf
lea di,[bp].path
push di
call makefulpath
pop di
call casepath
call cutpath
call settab ; ##151.07, ##156.116
pop ds
VZ_RET
setnewname endp
;--- Input file name ---
;--> DX :message No.
infile proc
push dx
call setfnckey
pop dx
mov si,fbuf
mov cx,PATHSZ
call windgets
VZ_RET
infile endp
;--- Pre-Close ---
preclose proc
cmp [bp].tchf,TCH_MOD
_ifn e
stz
jmps precls1
_endif
mov dl,M_QSAVE
call dispask
_ifn c
precls1:
pushf
mov al,EV_CLOSE
call do_evmac
_if c
call run_evmac
_endif
popf
_endif
VZ_RET
preclose endp
;--- Check path name ---
;--> AX :return value
public checkpath
checkpath proc
push ds
movseg ds,ss
lea dx,[bp].path
msdos F_ATTR,0
mov ah,lastcmd
_ifn c
mov al,ENOPATH
test cx,FA_LABEL+FA_DIREC
jnz chkp1
mov al,EACCES
mov dl,M_RDONLY
test cx,FA_RDONLY
jnz chkp3
mov al,0
mov dl,M_EXIST
cmp ah,CM_NEWFILE
je chkp3
cmp ah,CM_RENAME
je chkp3
_endif
chkp1:
cmp al,ENOFILE
jb chkp8
_if e
mov dl,M_NEW
cmp ah,CM_NEWFILE
jb chkp3
jmps chkp8
_endif
mov dl,M_PATHERR
chkp3: push ax
call dispmsg
pop ax
chkp8: cbw
mov retval,ax
pop ds
clc
VZ_RET
checkpath endp
;--- Select file ---
;--> CX :input length
;<-- CY :escape
selfile proc
movseg ds,ss
movseg es,ss
clr si
clr dl
mov fromref,dl
jcxz sfile1
mov si,fbuf
selfile1:
call readref
jc sfile9
cmp al,'>'
_if e
call read_curdir
_endif
IFNDEF NOFILER
call parsepath2
jc sfile1
ENDIF
mov pathp,si
mov al,FALSE
clc
jmps sfile8
sfile1:
IFNDEF NOFILER
call postparse
; call stack_cs
call filer
; call stack_gs
_ifn c
tst al
jnz sfile_e
_endif
mov al,TRUE
ELSE
clr al
stc
ENDIF
sfile8: mov frompool,al
sfile9: VZ_RET
sfile_e:
inc sp
inc sp
jmp se_command
selfile endp
;--- Read next file ---
;--> CY :no more files
nextfile proc
push ds
movseg ds,ss
IFNDEF NOFILER
tstb frompool
_ifn z
call nextpool
_else
ENDIF
mov si,pathp
call skipchar
_ifn c
mov pathp,si
_endif
IFNDEF NOFILER
_endif
ENDIF
pop ds
VZ_RET
nextfile endp
endcs
eseg
;--- Parse path name ---
;-->
; DS:SI :input string
;<--
; CY :end of line
; DL :result bit (VZ_PRS_xxx)
; BX :file name ptr
; CX :file ext ptr
; SI :next ptr
public parsepath
parsepath proc
push di
clr dl
mov bx,si
pars1:
mov di,si ; ##153.31
lodsb
cmp al,SPC
jbe pars5
call iskanji ; ##152.20
_if c
inc si
jmps pars2
_endif
cmp al,':'
je prs_drv
call isslash
je prs_dir
cmp al,'.'
je prs_ext
cmp al,'+' ; ##1.5
je pars5
cmp al,','
je pars5
cmp al,'*'
je prs_wld
cmp al,'?'
je prs_wld
pars2: test dl,VZ_PRS_EXT
_if z
or dl,VZ_PRS_NAME
_endif
test dl,VZ_PRS_ENDDIR
jz pars1
and dl,not byte ptr VZ_PRS_ENDDIR
mov bx,di ; ##153.31
jmp pars1
prs_drv:or dl,VZ_PRS_DRV+VZ_PRS_ENDDIR+VZ_PRS_ROOT
jmps prsdir2
prs_dir:
tst dl
_if z
or dl,VZ_PRS_ROOT
_endif
prsdir1:or dl,VZ_PRS_DIR+VZ_PRS_ENDDIR
prsdir2:and dl,not (VZ_PRS_NAME+VZ_PRS_EXT)
jmp pars1
prs_ext:
cmp byte ptr [si],'.'
_if e
lodsb
jmp prsdir1
_endif
or dl,VZ_PRS_EXT
mov cx,di ; ##153.31
test dl,VZ_PRS_ENDDIR
jz pars1
prs_wld:or dl,VZ_PRS_WILD
jmp pars2
pars5:
pop di
test dl,VZ_PRS_EXT ; ##156.114
_if z
mov cx,si
_endif
test dl,VZ_PRS_ENDDIR
jz pars8
mov bx,si
parsedir:
and dl,VZ_PRS_DRV+VZ_PRS_DIR+VZ_PRS_ROOT
dec bx
mov cx,bx
pars8: mov parsef,dl
VZ_RET
parsepath endp
endes
cseg
;--- Make full path ---
;-->
; DS:SI :source
; ES:DI :destin.
public makefulpath
makefulpath proc
lodsw
; call toupper
cmp ah,':'
_ifn e
dec si
dec si
call getcurdrv
_else
stosw
_endif
mov dl,al
mov al,[si]
call isslash
_ifn e
and dl,1Fh ; ##100.01
push si
call addsep
call cpycurdir
call addsep
pop si
_endif
_repeat
cmp word ptr [si],'..'
_if e
inc si
inc si
dec di
_repeat
dec di
mov al,es:[di]
call isslash
_until e
_endif
lodsb
cmp al,'.' ; ##153.40
_if e
stosb
lodsb
cmp al,SPC
jbe mkful2
_endif
call iskanji ; ##152.20
_if c
stosb
lodsb
jmps mkful1
_endif
call isslash
_if e
mov al,dirchr
_endif
mkful1: stosb
cmp al,SPC
_until be
mkful2: dec di
mov byte ptr es:[di],0
VZ_RET
makefulpath endp
;--- Set path case ---
;--> ES:DI :path ptr
public casepath
casepath proc
push ds
mov si,di
movseg ds,es
test dspsw,DSP_PATHCASE
_if z
call strupr
_else
call strlwr
_endif
pop ds
VZ_RET
casepath endp
;--- Cut path name ---
public cutpath
cutpath proc
push ds
movseg ds,ss
movseg es,ss
lea si,[bp].path
mov di,curdir
mov cx,PATHSZ
test dspsw,DSP_FULPATH
_if z
push si
cmpsw
_if e
pop ax
push si
repe cmpsb
mov ax,es:[di-2]
tst ah
_if z
call isslash
_if e
dec si
_else
mov al,[si-1]
call isslash
jne cutp1
_endif
pop ax
push si
_endif
_endif
cutp1:
pop si
_endif
mov [bp].namep,si
push si
call strlen
pop si
mov cx,ax
cutp2: cmp cx,25 ; ##16
jb cutp5
cutp3: lodsb
dec cx
jz cutp4
call isslash
jne cutp3
jmp cutp2
cutp4: dec si
cutp5: mov [bp].labelp,si
pop ds
VZ_RET
cutpath endp
assume ds:cgroup
;--- Set path ---
;<-- DI :pathbuf
public setpath
setpath proc
movseg ds,ss
movseg es,ss
mov di,pathbuf
push di
mov si,offset cgroup:nm_path
call setenvvar
_ifn c
clr si
_endif
mov getdirp,si
mov putextp,0
pop di
push di
IFNDEF NOFILER
tstb frompool
_ifn z
; mov al,TRUE
call getpool
_else
ENDIF
mov si,pathp
call makefulpath
cmp byte ptr es:[di-1],'+' ; for .LNK
_if e
dec di
mov byte ptr es:[di],0
_endif
IFNDEF NOFILER
_endif
ENDIF
pop di
push di
call casepath
pop di
VZ_RET
setpath endp
;--- Search File ---
;<--
; NC :find (DI=pathbuf)
; CY :not found
public searchfile
searchfile proc
movseg ds,ss
movseg es,ss
mov dx,tmpbuf3
msdos F_SETDTA
mov di,pathbuf
push di
tstb frompool
jmpln z,findfile
mov si,pathp
call parsepath
test dl,VZ_PRS_EXT
_if z
call skipstr
dec di
mov putextp,di
_endif
test dl,VZ_PRS_ROOT
_ifn z
mov getdirp,0
_endif
schfile1:
mov di,putextp
tst di
_ifn z
mov ax,'*.'
stosw
clr al
stosb
_endif
mov bh,-1
mov ah,F_FINDDIR
_repeat
pop di
push di
mov dl,FA_SYSTEM+FA_HIDDEN
call finddir
_break c
mov di,putextp
tst di
jz findfile
mov si,tmpbuf3
add si,dta_pack
_repeat
lodsb
tst al
jz noext
cmp al,'.'
_until e
call searchext
tst ch
_if z
mov di,binlist
tstb [di]
jz schfile2
call searchext1
tst ch
jnz schfile2
mov ch,-2
_endif
cmp ch,bh
_if b
mov bh,ch
mov di,putextp
dec si
call wrdcpy
_endif
schfile2:
mov ah,F_NEXTDIR
_until
cmp bh,-1
je nextpath
findfile:
pop di
mov si,di
call casepath
clc
VZ_RET
noext: stosb
jmps findfile
nextpath:
mov si,getdirp
mov ds,envseg
tst si
jz nofile
call skipspc
jc nofile
call wrdcpy
movseg ds,ss
mov getdirp,si
call addsep
mov si,pathp
call wrdcpy
tstw putextp
_ifn z
mov putextp,di
_endif
jmp schfile1
nofile:
pop di
stc
VZ_RET
searchfile endp
assume ds:nothing
;--- Find directory ---
;-->
; AH : F_FINDDIR or F_NEXTDIR
; DL : find attr
; DI : find path name
public finddir
finddir proc
pushm <ax,cx,dx>
mov cl,dl
and cl,FA_DIREC+FA_SYSTEM+FA_HIDDEN
clr ch
mov dx,di
int 21h
cld
popm <dx,cx,ax>
VZ_RET
finddir endp
;--- Set TAB size by .EXT ---
public settab
settab proc
push ds
movseg ds,ss
lea si,[bp].path
call parsepath ; ##152.24
mov si,cx
mov cl,ntab
clr ch
mov [bp].extword,0
test dl,VZ_PRS_EXT
jz stab8
inc si
mov ax,[si]
call toupper
tst ah
_ifn e
xchg al,ah
call toupper
_endif
mov [bp].extword,ax
test edtsw,EDT_AUTOWD
_ifn z
mov al,[si]
call isdigit
_if c
push si
lodsb
call scannum
pop si
_ifn c
cmp dl,10
_if ae
mov ch,dl
mov [bp].fsiz,ch
jmps stab8
_endif
_endif
_endif
_endif
call searchext
stab8: mov [bp].exttyp,ch
; mov [bp].tabr,cl ; ##156.116
pop ds
VZ_RET
settab endp
;--- Search EXT ---
;--> DS:SI :ext ptr
;<--
; ES:DI :find ext ptr
; CH :ext No.
; CL :ntab or ctab
searchext proc
mov di,extlist
searchext1:
movseg es,ss
pushm <bx,si>
clr ch
schext1:mov al,es:[di]
inc di
cmp al,SPC
jb schext0
cmp al,'.'
jne schext1
inc ch
clr dh
push di
mov al,es:[di]
call isupper
_if c
inc dh
_endif
call wrdicmp
pop ax
jnc schext1
mov di,ax
tst dh
jz schext9
mov cl,ctab
; or ch,80h ; .C .H flag
jmps schext9
schext0:clr ch
schext9:popm <si,bx>
VZ_RET
searchext endp
public isbinary
isbinary proc
pushm <ax,dx,di,es>
mov di,binlist
tstb ss:[di]
_ifn z
call searchext1
_endif
popm <es,di,dx,ax>
VZ_RET
isbinary endp
endcs
eseg
;--- Add '\' if neccesary ---
;-->
; ES:DI :result path ptr
public addsep
addsep proc
mov al,es:[di-1]
call isslash
jne addsep1
push bx ; ##152.20
clr bx
dec bx
_repeat
dec bx
mov al,es:[di+bx]
call iskanji
_while c
test bl,1
pop bx
jz addsp9
addsep1:mov al,dirchr
stosb
addsp9: VZ_RET
addsep endp
;--- Is slash ? ---
public isslash
isslash proc
cmp al,'\'
je islsh9
cmp al,'/'
islsh9: VZ_RET
isslash endp
;--- After parse path ---
; SI :input path ptr
; DL,BX,CL :from parsepath
public parsepath1
parsepath1 proc
_ifn cxz
call parsepath2
_else
clr si
_endif
postparse:
mov pathp,si
tst si
_if z
clr bx
clr cx
clr dl
_endif
mov parsef,dl
mov getnamp,bx
test dl,VZ_PRS_EXT
_if z
clr cx
_endif
mov getextp,cx
VZ_RET
parsepath1 endp
parsepath2 proc
push si
call parsepath
mov di,si
pop si
test dl,VZ_PRS_NAME
_ifn z
test dl,VZ_PRS_WILD
jz isdir
_endif
stc
VZ_RET
parsepath2 endp
;--- Is directory ---
;--> SI :path ptr
;<-- CY :dir
isdir proc
push cx
push dx
mov dx,si
msdos F_ATTR,0
pop dx
_ifn c
test cx,FA_DIREC
_ifn z
pop cx
mov bx,di
or dl,VZ_PRS_DIR
call parsedir
stc
VZ_RET
_endif
_endif
pop cx
clc
VZ_RET
isdir endp
assume ds:cgroup
;--- Get current dir ---
;--> DI :save ptr
;<-- AL :drive symbol
public getcurdir,getcurdir1
getcurdir proc
mov di,curdir
getcurdir1:
push ds
movseg ds,ss
movseg es,ss
call getcurdrv
mov curdrv,al
push ax
msdos F_SWITCHAR,0
mov al,'/'
cmp dl,al
_if e
mov al,'\'
_endif
mov ah,dl
mov word ptr dirchr,ax
stosb
clr dl
call cpycurdir
pop ax
pop ds
VZ_RET
getcurdir endp
assume ds:nothing
getcurdrv proc
msdos F_CURDRV
add al,'A'
test dspsw,DSP_PATHCASE
_ifn z
add al,'a'-'A'
_endif
mov ah,':'
stosw
VZ_RET
getcurdrv endp
cpycurdir proc
push ds
mov si,di
movseg ds,es
msdos F_CURDIR
jc cpycd9
mov ah,dirchr
cpydr1:
_repeat
lodsb
call iskanji
_if c
inc si
jmps cpydr1
_endif
test dspsw,DSP_PATHCASE
_ifn z
call tolower
_endif
call isslash
_if e
mov al,ah
_endif
mov [si-1],al
tst al
_until z
dec si
mov di,si
clc
cpycd9: pop ds
VZ_RET
cpycurdir endp
endes
cseg
assume ds:cgroup
;------------------------------------------------
; Profile manager
;------------------------------------------------
;
;----- Read profile -----
;-->
; SI :path ptr
; CY :error
public readref
readref proc
lodsb
cmp al,'@'
_ifn e
dec si
clc
VZ_RET
_endif
push si
call chkline1 ;;
pop si
lodsb
cmp al,'@'
_ifn e
dec si
_endif
pushm <ax,si>
call parsepath
popm <si,ax>
cmp dl,VZ_PRS_EXT
_if e
mov dl,VZ_PRS_DIR
mov bx,cx
_endif
mov di,pathbuf
push di
test dl,VZ_PRS_DIR
_ifn z
IFNDEF NOFILER
push [bx-1]
mov byte ptr [bx-1],0
push dx
call chgpath
pop dx
pop [bx-1]
ENDIF
; call strcpy
jmps rref1
_endif
cmp al,'@'
je rref0
test dl,VZ_PRS_NAME
_if z
mov si,reffile
_endif
call strcpy
mov cl,dl
pop dx
msdos F_OPEN,O_READ
jnc rref2
mov di,dx
push di
mov dl,cl
rref0: mov si,defpath
call strcpy
call addsep
rref1:
mov si,bx
test dl,VZ_PRS_NAME
_if z
mov si,reffile
_endif
call strcpy
call getcurdir
pop dx
msdos F_OPEN,O_READ
jc rref9
rref2:
mov bx,ax
rref3:
mov dx,lbuf
inc dx
inc dx
push dx
mov cx,2
rref4: msdos F_READ
cmp ax,cx
jc rref_x
mov si,dx
lodsb
cmp al,SPC
jb rref4
cmp al,':'
_if e
call read_history
rref_x:
pop ax
jnc rref3
msdos F_CLOSE
stc
VZ_RET
_endif
inc dx
inc dx
mov cx,lbuf_end
sub cx,dx
msdos F_READ
push ax
msdos F_CLOSE
pop cx
inc cx
inc cx
pop si
push si
_ifn cxz
_repeat
lodsb
cmp al,SPC
_if b
mov byte ptr [si-1],SPC
_endif
_loop
_endif
mov byte ptr [si],0
pop si
_repeat
call skipspc
jc rref9
cmp al,'-'
_break ne
inc si
lodsb
clr bp
call set_opnopt
_until
clc
mov fromref,TRUE
rref9:
mov pathp,si
VZ_RET
readref endp
read_curdir proc
inc si
push si
_repeat
lodsb
cmp al,SPC
_until be
mov byte ptr [si-1],0
pop ax
push si
mov si,ax
call chpath
call getcurdir
pop si
call skipchar
mov pathp,si
VZ_RET
read_curdir endp
;----- Write profile -----
public se_writeref
se_writeref proc
movseg ds,ss
movseg es,ss
mov dx,reffile
call writeref ; write to current "editfile"
mov di,pathbuf
mov dx,reffile
call setrefdir
mov fullpath,TRUE
writeref:
test promode,PRO_CREATE
_ifn z
call open_file
_else
msdos F_OPEN,O_WRITE
mov bx,ax
_endif
jc wref9
test promode,PRO_NOHIST
_if z
call write_history
_endif
call write_goption
call write_crlf
tstb fullpath
_ifn z
call write_curdir
_endif
call write_editfile
clr cx
msdos F_WRITE
msdos F_CLOSE
mov tchdir,TRUE ; ##155.76
wref9: mov fullpath,FALSE
VZ_RET
se_writeref endp
;----- Write editfile -----
write_editfile proc
mov bp,w_busy
_repeat
tstb [bp].wnum
_ifn z
mov di,lbuf
inc di
inc di
pushm <bx,di>
call w_name_cp
call w_act_back
call w_text_opt
mov ax,CRLF
stosw
popm <dx,bx>
mov cx,di
sub cx,dx
msdos F_WRITE
_endif
mov bp,[bp].w_next
tst bp
_until z
VZ_RET
write_editfile endp
pf_name db "%s",0
pf_cp db " ->%lx",0
pf_mark db " -#%d=%lx",0
pf_option db " -%c%u",0
w_name_cp proc
; lea ax,[bp].path
; tstb fullpath
; _if z
mov ax,[bp].namep
; _endif
movseg ds,cs
push ax
mov bx,sp
mov si,offset cgroup:pf_name
call sprintf
dec di
pop ax
mov ax,[bp].tcp
call setabsp
mov cx,ax
or cx,dx
_ifn z
pushm <dx,ax>
mov bx,sp
mov si,offset cgroup:pf_cp
call sprintf
dec di
popm <ax,ax>
_endif
movseg ds,ss
VZ_RET
w_name_cp endp
w_act_back proc
cmp bp,w_act
_if e
mov al,SPC
stosb
mov ax,'+-'
stosw
mov al,[bp].wsplit
add al,'0'
stosb
mov al,wys
call w_option
_endif
cmp bp,w_back
_if e
mov al,SPC
stosb
mov ax,'--'
stosw
mov al,wys
call w_option
_endif
VZ_RET
w_act_back endp
w_option proc
clr ah
push ax
call get_optkwd
pop si
mov dl,[bp+si]
clr dh
w_option1: movseg ds,cs
xchg al,ah
push dx
push ax
mov bx,sp
mov si,offset cgroup:pf_option
call sprintf
dec di
add sp,4
movseg ds,ss
VZ_RET
w_option endp
w_text_opt proc
test [bp].largf,FL_LOG
_if z
tstb [bp].tchf
_if s
mov al,tchf
call w_option
_endif
_endif
mov al,[bp].fsiz
cmp al,fldsz
_ifn e
mov al,fsiz
call w_option
_endif
; call w_mark
; VZ_RET
w_text_opt endp
w_mark proc
movseg ds,cs
mov cx,1
mov si,tmark
_repeat
mov ax,[bp+si] ; ##156.107
and ax,[bp+si+2]
inc ax
_ifn z
push si
push [bp+si+2]
push [bp+si]
push cx
mov bx,sp
mov si,offset cgroup:pf_mark
call sprintf
dec di
add sp,6
pop si
_endif
add si,4
inc cx
cmp cx,MARKCNT
_until a
movseg ds,ss
VZ_RET
w_mark endp
;----- Save closing file info -----
prof_close proc
push ds
movseg ds,ss
movseg es,ss
mov al,promode
test al,PRO_CLOSE
jz prcls9
test [bp].largf,FL_LOG
_ifn z
test al,PRO_LOGCLOSE
jz prcls9
_endif
mov ax,[bp].tnow
cmp ax,[bp].ttop
je prcls9
mov di,lbuf
inc di
inc di
push di
call w_name_cp
call w_text_opt
pop si
clr cx
mov bx,fbuf
call histcpy_w
prcls9: pop ds
VZ_RET
prof_close endp
;----- Write grobal option -----
public write_gopt
write_gopt proc
_repeat
cmpsw
_ifn e
pushm <cx,dx,si,di>
mov di,dx
mov ax,cs:[di]
mov dx,[si-2]
mov di,lbuf
inc di
inc di
pushm <bx,di>
call w_option1
mov cx,di
popm <dx,bx>
sub cx,dx
msdos F_WRITE
popm <di,si,dx,cx>
_endif
inc dx
inc dx
_loop
VZ_RET
write_gopt endp
;----- Write current dir -----
write_curdir proc
mov di,lbuf
inc di
inc di
push di
mov al,'>'
stosb
mov si,curdir
call strcpy
mov ax,CRLF
stosw
mov cx,di
pop dx
sub cx,dx
msdos F_WRITE
VZ_RET
write_curdir endp
;----- Write history -----
write_history proc
mov ah,'S'
mov di,sbuf
call w_history
mov ah,'F'
mov di,fbuf
call w_history
test promode,PRO_CMDHIST
_ifn z
mov ah,'C'
mov di,xbuf
call w_history
_endif
VZ_RET
write_history endp
w_history proc
dec di
dec di
mov dx,di
mov cx,[di]
push cx
mov al,':'
stosw
clr al
_repeat
repnz scasb
scasb
_until z
mov cx,di
sub cx,dx
msdos F_WRITE
mov di,dx
pop [di]
call write_crlf
VZ_RET
w_history endp
write_crlf proc
pushm <cx,dx>
mov cx,2
mov dx,offset cgroup:pro_crlf
msdos F_WRITE
popm <dx,cx>
VZ_RET
write_crlf endp
;----- Read history -----
read_history proc
lodsb
push bx
call get_histsym
mov si,bx
pop bx
jc r_hist_x
mov si,[si]
mov dx,si
mov cx,[si-2]
dec cx
msdos F_READ
mov cx,ax
mov si,ax
mov di,dx
clr al
_repeat
repnz scasb
_break cxz
scasb
jz r_hist1
dec cx
_until z
stosb
stosb
mov dx,offset cgroup:readbuf
mov cx,1
_repeat
msdos F_READ
tst ax
jz r_hist_x
cmp readbuf,LF
_until e
VZ_RET
r_hist1:
dec cx ; CRLF
dec cx
dec cx
_ifn cxz
clc
mov dx,cx
_ifn s
neg dx
_endif
mov cx,-1
msdos F_SEEK,1
_endif
VZ_RET
r_hist_x:
stc
VZ_RET
read_history endp
;------------------------------------------------
; Log file manager
;------------------------------------------------
;
;----- Read/Write Log Table -----
public read_logtbl
read_logtbl proc
tstw logtblsz
_ifn z
call setvzenv
msdos F_OPEN,O_READ
_ifn c
mov bx,ax
mov dx,logtbl
mov cx,logtblsz
msdos F_READ
msdos F_CLOSE
_endif
_endif
VZ_RET
read_logtbl endp
public write_logtbl
write_logtbl proc
tstw logtblsz
_ifn z
clr al
xchg addlogf,al
tst al
_ifn z
call setvzenv
call open_file
_ifn c
mov dx,logtbl
call endlogtbl
inc di
mov cx,di
sub cx,dx
msdos F_WRITE
msdos F_CLOSE
VZ_RET
_endif
_endif
_endif
VZ_RET
write_logtbl endp
public open_file
open_file proc
msdos F_OPEN,O_WRITE
_if c
clr cx
msdos F_CREATE
_endif
_ifn c
mov bx,ax
_endif
VZ_RET
open_file endp
;----- Set "VZ.ENV" -----
setvzenv proc
movseg es,ss
mov si,defpath
mov di,pathbuf
push di
call strcpy
call addsep
mov si,offset cgroup:nm_vz
call strcpy
mov al,'.'
stosb
mov si,offset cgroup:nm_env
call strcpy
pop dx
VZ_RET
setvzenv endp
;----- Check log file -----
;<-- CY :log file
public chk_logfile
chk_logfile proc
pushm <ds,es>
movseg ds,ss
movseg es,ss
mov si,offset cgroup:nm_log
mov di,pathbuf
call setenvvar
_if c
mov ds,ax
_repeat
lea di,[bp].path
_repeat
lodsb
cmp al,SPC+1
jb chklog9
call toupper
mov ah,al
mov al,es:[di]
inc di
call toupper
cmp al,ah
_while e
call skipchar
_until c
_endif
clc
chklog9: popm <es,ds>
VZ_RET
chk_logfile endp
;----- Scan Log file table -----
;<-- CY :found (at SI)
public scan_logtbl
scan_logtbl proc
pushm <ds,es>
movseg ds,ss
movseg es,ss
tstw logtblsz
jz sclog9
mov si,logtbl
_repeat
tstb [si]
jz sclog9
lea di,[bp].path
call strcmp
pushf
call strskip
popf
_break e
add si,type _logtbl
_until
stc
sclog9: popm <es,ds>
VZ_RET
scan_logtbl endp
;----- Add Log file table -----
;<-- SI :logtbl ptr
public add_logtbl
add_logtbl proc
pushm <ds,es>
movseg ds,ss
movseg es,ss
test [bp].largf,FL_LOG
jz addlog9
call scan_logtbl
_if c
tstw [si].lg_lnumb
_if z
tstb [bp].tchf
_if le
mov ax,[bp].lnumb
mov di,si
call set_logtbl
_endif
_endif
jmps addlog9
_endif
call endlogtbl
lea si,[bp].path
call strlen
add ax,type _logtbl + 1
add ax,di
sub ax,logtbl+2
_if a
push di
mov si,logtbl
push si
mov cx,si
add cx,ax
_repeat
call strskip
add si,type _logtbl
cmp si,cx
_until a
pop di
pop cx
sub cx,si
call memmove
add di,cx
lea si,[bp].path
_endif
call strcpy
inc di
mov si,di
mov ax,[bp].lnumb
call set_logtbl
clr al
stosb
addlog9: popm <es,ds>
VZ_RET
add_logtbl endp
public set_logtbl
set_logtbl proc
stosw
mov ax,word ptr [bp].eofp
stosw
push ax
mov ax,word ptr [bp].eofp + 2
stosw
pop ax
stosw
mov ax,word ptr [bp].eofp + 2
stosw
mov al,LF
stosb
tch_logtbl: mov ss:addlogf,TRUE
VZ_RET
set_logtbl endp
endlogtbl proc
mov di,logtbl
_repeat
tstb [di]
_break z
call skipstr
add di,type _logtbl
_until
VZ_RET
endlogtbl endp
endcs
end
;****************************
; End of 'open.asm'
; Copyright (C) 1989 by c.mos
;****************************