mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-28 07:37:47 +00:00
98 lines
3.6 KiB
Text
98 lines
3.6 KiB
Text
|
'--- This function simulates the open behavior of real files depending
|
||
|
'--- on the file OPEN mode. That way the file OPEN calls are easily
|
||
|
'--- replaceable by OpenBuffer%() calls without worry about the internal
|
||
|
'--- differences of the buffer system compared to real files.
|
||
|
'--- Respective CLOSE calls can be simply removed as buffers remain
|
||
|
'--- always accessible until cleared/disposed.
|
||
|
'-----
|
||
|
'--- The file names given to this function should be just the same as
|
||
|
'--- you would use to open a real file, i.e. inclusive full or relative
|
||
|
'--- path as required.
|
||
|
'--- Modes names can be short, only the first character is checked.
|
||
|
'---------------------------------------------------------------------
|
||
|
FUNCTION OpenBuffer% (sbMode$, sbName$)
|
||
|
'--- option _explicit requirements ---
|
||
|
DIM buf%, nul&
|
||
|
'--- buffer already existing? ---
|
||
|
FOR buf% = 0 TO UBOUND(SBufN)
|
||
|
IF SBufN(buf%) = sbName$ THEN EXIT FOR
|
||
|
NEXT buf%
|
||
|
'--- simulate file modes ---
|
||
|
SELECT CASE UCASE$(LEFT$(sbMode$, 1))
|
||
|
CASE "A" 'append
|
||
|
IF buf% > UBOUND(SBufN) THEN GOSUB newBuf
|
||
|
nul& = SeekBuf&(buf%, 0, SBM_BufEnd)
|
||
|
CASE "B" 'binary
|
||
|
IF buf% > UBOUND(SBufN) THEN GOSUB newBuf
|
||
|
nul& = SeekBuf&(buf%, 0, SBM_BufStart)
|
||
|
CASE "I" 'input
|
||
|
IF buf% > UBOUND(SBufN) THEN ERROR 53 'buffer not found
|
||
|
nul& = SeekBuf&(buf%, 0, SBM_BufStart)
|
||
|
CASE "O" 'output
|
||
|
IF buf% <= UBOUND(SBufN) THEN DisposeBuf buf%: SBufN(buf%) = ""
|
||
|
GOSUB newBuf
|
||
|
CASE ELSE 'random or unknown mode
|
||
|
buf% = SBE_NoMoreBuffers 'not supported
|
||
|
END SELECT
|
||
|
OpenBuffer% = buf%
|
||
|
EXIT FUNCTION
|
||
|
'----------
|
||
|
newBuf:
|
||
|
buf% = CreateBuf%
|
||
|
IF buf% > UBOUND(SBufN) THEN REDIM _PRESERVE SBufN(0 TO buf% + 99) AS STRING 'extend by 100 buffers
|
||
|
SBufN(buf%) = sbName$
|
||
|
RETURN
|
||
|
END FUNCTION
|
||
|
|
||
|
'--- This subroutine will clear the given buffer or ALL buffers, if the
|
||
|
'--- name argument is empty.
|
||
|
'--- Clearing a buffer is the equivalent to KILLing a real file.
|
||
|
'-----
|
||
|
'--- To designate a single buffer to clear, use the same file name as
|
||
|
'--- given at the respective OpenBuffer%() call.
|
||
|
'---------------------------------------------------------------------
|
||
|
SUB ClearBuffers (sbName$)
|
||
|
'--- option _explicit requirements ---
|
||
|
DIM buf%
|
||
|
'--- clear/dispose buffer(s) ---
|
||
|
IF sbName$ <> "" THEN
|
||
|
FOR buf% = 0 TO UBOUND(SBufN)
|
||
|
IF SBufN(buf%) = sbName$ THEN EXIT FOR 'buffer found
|
||
|
NEXT buf%
|
||
|
IF buf% > UBOUND(SBufN) THEN EXIT SUB 'buffer doesn't exist
|
||
|
DisposeBuf buf%: SBufN(buf%) = ""
|
||
|
ELSE
|
||
|
FOR buf% = 0 TO UBOUND(SBufN)
|
||
|
IF SBufN(buf%) <> "" THEN DisposeBuf buf%: SBufN(buf%) = ""
|
||
|
NEXT buf%
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
'--- This subroutine will write the current contents of the given buffer
|
||
|
'--- or ALL buffers, if the name argument is empty, into the respective
|
||
|
'--- files on disk (using names as given by the OpenBuffer%() function)
|
||
|
'--- The change state of the buffer(s) is checked first to avoid needless
|
||
|
'--- disk writes.
|
||
|
'-----
|
||
|
'--- To designate a single buffer to write, use the same file name as
|
||
|
'--- given at the respective OpenBuffer%() call.
|
||
|
'---------------------------------------------------------------------
|
||
|
SUB WriteBuffers (sbName$)
|
||
|
'--- option _explicit requirements ---
|
||
|
DIM buf%
|
||
|
'--- write buffer(s) ---
|
||
|
IF sbName$ <> "" THEN
|
||
|
FOR buf% = 0 TO UBOUND(SBufN)
|
||
|
IF SBufN(buf%) = sbName$ THEN EXIT FOR 'buffer found
|
||
|
NEXT buf%
|
||
|
IF buf% > UBOUND(SBufN) THEN EXIT SUB 'buffer doesn't exist
|
||
|
IF IsBufChanged%(buf%) THEN BufToFile buf%, SBufN(buf%)
|
||
|
ELSE
|
||
|
FOR buf% = 0 TO UBOUND(SBufN)
|
||
|
IF SBufN(buf%) <> "" THEN
|
||
|
IF IsBufChanged%(buf%) THEN BufToFile buf%, SBufN(buf%)
|
||
|
END IF
|
||
|
NEXT buf%
|
||
|
END IF
|
||
|
END SUB
|