1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-09 22:25:12 +00:00
QB64-PE/source/utilities/s-buffer/sb_qb64pe_extension.bm
Roland Heyder 51667125c9 Avoid excessive disk access while typing
- No longer constantly (over)writes files in the `internal\temp` folder while typing in the IDE, as the generated C/C++ code is buffered internally now.
- Buffers are automatically written out to disk on a `Make` request (F5/F11).
2022-08-25 01:14:29 +02:00

98 lines
3.6 KiB
Plaintext

'--- 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