home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
rbbs_pc
/
173_bas.arc
/
RBBSSUB5.BAS
< prev
Wrap
BASIC Source File
|
1990-02-10
|
87KB
|
2,661 lines
' $linesize:132
' $title: 'RBBSSUB5.BAS CPC17.3, Copyright 1986 - 90 by D. Thomas Mack'
' Copyright 1990 by D. Thomas Mack, all rights reserved.
' Name ...............: RBBSSUB5.BAS
' First Released .....: February 11, 1990
' Subsequent Releases.:
' Copyright ..........: 1986 - 1990
' Purpose.............: The Remote Bulletin Board System for the IBM PC,
' RBBS-PC.BAS utilizes a lot of common subroutines. Those that do not
' require error trapping are incorporated within RBBSSUB 2-5 as
' separately callable subroutines in order to free up as much
' code as possible within the 64K code segment used by RBBS-PC.BAS.
' Parameters..........: Most parameters are passed via a COMMON statement.
'
' Subroutine Line Function of Subroutine
' Name Number
' BinSearch 63520 Binary searches sorted file for a key value
' BreakFileName 63300 Break file name into component parts
' BufAsUnit 63500 Buffer out a string with CR's
' SetPrompt 63470 Set prompts based on the user's security
' DoorReturn 63100 Process door requests
' FdMacExe 63462 Executes a found macro
' FileSystem 20117 File System for RBBS-PC
' FindIt 63490 Check whether file exists and if so open as #2
' FormRead 63420 Read from file into a form
' LockAppend 63400 Prepare for a file append
' MacroExe 63460 Execute internal macro rather than user
' MsgNameMatch 63540 Match name to one in msg header
' NoPath 63480 Detects whether string has a path in it
' RestoreCom 63310 Restore comm port after external program
' ReadMacro 63330 Read and process macro
' ShellExit 63320 Exit RBBS via shell
' TakeOffHook 63530 Take modem off hook
' UnLockAppend 63410 Clean up after file append
' VerifyAns 63510 Verify that string passes edits
' WildCard 63200 Match string to a pattern
'
' $INCLUDE: 'RBBS-VAR.BAS'
'
20117 ' $SUBTITLE: 'FileSystem -- subroutine for RBBS-PC's file system'
' $PAGE
'
' NAME -- FileSystem
'
' INPUTS -- PARAMETER MEANING
' ZFileSysParm = 1 LIST THE SYSOP'S COMMENTS FILE
' 2 L)IST DIRECTORY COMMAND
' 3 D)OWNLOAD COMMAND
' 4 RETURN FROM EXTERNAL PROTOCOLS
' 5 U)PLOAD COMMAND
' 6 S)CAN DIRECTORY COMMAND
' 7 P)ERSONAL FILES COMMAND
' 8 N)EW FILES COMMAND
' 9 RETURN FROM EXTENDED DESCRIPTION
'
' OUTPUTS -- ZFileSysParm = 1 COMMAND PROCESSED SUCCESSFULLY
' 2 RECYCLE TO TOP OF RBBS-PC (202)
' 3 PROCESS NEXT COMMAND (1200)
' 4 DENY USER ACCESS (1380)
' 5 HANDLE EXTENDED DESCRIP. (2008)
' 6 USER'S TIME EXCEEDED (10553)
' 7 Carrier DROPPED (10595)
'
' PURPOSE -- To handle the RBBS-PC file system commands
'
SUB FileSystem STATIC
ZFF = ZFileSysParm
ZFileSysParm = 1
ON ZFF GOSUB 20119, _ ' HANDLER TO LIST COMMENTS TO SYSOP
20150, _ ' L)IST DIRECTORY COMMAND HANDLER
20180, _ ' D)OWNLOAD COMMAND HANDLER
20263, _ ' RETURN FROM EXTERNAL Protocol'S
20400, _ ' U)PLOAD COMMAND HANDLER
21800, _ ' S)CAN DIRECTORY COMMAND HANDLER
21850, _ ' P)ERSONAL FILES COMMAND HANDLER
21860, _ ' N)EW FILES COMMAND HANDLER
20705 ' RETURN FROM EXTENDED DESCRIPTIONS
GOTO 21920
20119 ZErrCode = 0
GOTO 20122
'
' ***** SCAN DIRECTORIES (PRINT TEXT) ****
'
' (formerly lines 7000 to 7260 in RBBS-PC.BAS CPC16-1ZWasA
20120 ZOutTxt$ = "Scanning Directory " + _
ZFileNameHold$
IF WasRS$ <> "" THEN _
ZOutTxt$ = ZOutTxt$ + " for " + WasRS$
GOSUB 21650
IF ZFileSysParm > 1 THEN _
RETURN
WasPG = ZTrue
20122 CALL OpenWork (2,ZFileName$)
IF ZErrCode = 53 THEN _
ZOutTxt$ = "Missing File " + ZFileName$ : _
CALL UpdtCalr (ZOutTxt$,2) : _
ZOutTxt$ = ZOutTxt$ + _
". Please tell SYSOP" : _
GOSUB 21650 : _
RETURN
ZJumpSupported = ZTrue
ZJumpLast$ = ""
LastOK = ZFalse
20124 CALL Carrier
IF EOF(2) OR _
(ZSubParm = -1 AND NOT ZLocalUser) THEN _
GOTO 20142
20126 CALL ReadDir (2,1)
IF ZErrCode <> 0 THEN _
ZWasEL = 20126 : _
GOTO 21900
IF WasCK = 0 THEN _
GOTO 20140
IF LEFT$(ZOutTxt$,1) = " " THEN _
IF LastOK AND NOT ZExtendedOff THEN _
GOTO 20140 _
ELSE GOTO 20124
LastOK = ZFalse
20128 IF ZJumpSearching THEN _
GOTO 20129
IF WasCK < 2 THEN _
GOTO 20130
IF WildSearch THEN _
ZWasA = INSTR(ZOutTxt$," ") : _
IF ZWasA = 0 THEN _
GOTO 20124 _
ELSE ZWasZ$ = LEFT$(ZOutTxt$,ZWasA - 1) : _
CALL WildFile (WasRS$,ZWasZ$,WasXXX) : _
WasXXX = NOT WasXXX : _
GOTO 20136
20129 ZWasZ$ = ZOutTxt$
CALL AllCaps (ZWasZ$)
WasXXX = (INSTR(ZWasZ$,WasRS$) = 0)
GOTO 20136
20130 ZWasA = INSTR(9,MID$(ZOutTxt$,1,32),"/")
IF ZWasA = 0 THEN _
ZWasA = INSTR(9,MID$(ZOutTxt$,1,32),"-")
20132 IF ZWasA < 3 THEN _
GOTO 20124
IF INSTR("0123456789",MID$(ZOutTxt$,ZWasA - 1,1)) = 0 THEN _
GOTO 20124
ZWasA = ZWasA - 2
WasWK$ = RIGHT$(MID$(ZOutTxt$,ZWasA,8),2) + _
LEFT$(MID$(ZOutTxt$,ZWasA,8),2) + _
MID$(MID$(ZOutTxt$,ZWasA,8),4,2)
IF MID$(WasWK$,3,1) = " " THEN _
MID$(WasWK$,3,1) = "0"
IF MID$(WasWK$,5,1) = " " THEN _
MID$(WasWK$,5,1) = "0"
20134 WasXXX = (WasWK$ < WasRS$)
20136 IF WasXXX THEN _
GOTO 20124
IF ZJumpSearching THEN _
WasRS$ = PrevSearch$ : _
WasCK = PrevCK : _
ZJumpSearching = ZFalse : _
GOTO 20140
IF WasPG THEN _
WasPG = ZFalse : _
CALL OpenWork (2,ZFileName$) : _
ZWasQ = 0 : _
GOTO 20124
20138 IF WasPG THEN _
GOTO 20124
20140 LastOK = ZTrue
GOSUB 21650
IF ZFileSysParm > 1 THEN _
RETURN
CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse)
IF ZNo THEN _
ZErrCode = 0 : _
RETURN
IF ZJumpSearching THEN _
IF LEFT$(ZOutTxt$,1) <> " " THEN _
PrevSearch$ = WasRS$ : _
PrevCK = WasCK : _
WasCK = 2 : _
WasRS$ = ZJumpTo$
IF NOT ZRet THEN _
GOTO 20124
20142 ZWasQ = 0
ZJumpSupported = ZFalse
CLOSE 2
CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7
RETURN
'
' * L - COMMAND FROM FILES MENU (LIST DIRECTORY)
'
20150 ZListDir = ZTrue
ListNew = ZFalse
SearchDate$ = ""
SearchString$ = ""
WasRS$ = ""
ShowDirOfDir = (ZLastIndex <= ZAnsIndex) AND NOT ZExpertUser
WasCK = 0
ZSearchingAll = ZFalse
20155 IF ListNew OR ZAnsIndex > 255 THEN _
RETURN
CALL GetDirs (ShowDirOfDir)
IF ZWasQ = 0 THEN _
RETURN
ShowDirOfDir = ZFalse
CALL ConvertDir (ZAnsIndex)
WasQX = ZLastIndex
20157 CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
GOTO 20161
20159 IF ZAnsIndex < ZLastIndex THEN _
GOTO 20155
ZSearchingAll = ZFalse
CALL CmdStackPushPop (1)
ZLastIndex = 0
IF ZNo OR (ZFileNameHold$ = ZDirPrefix$) THEN _
GOTO 20155
CALL QuickTPut (ZEmphasizeOff$,0)
ZOutTxt$ = "End list. R)elist, [Q]uit, or download what"
ZStackC = ZTrue
GOSUB 21668
CALL AllCaps (ZUserIn$(1))
IF ZUserIn$(1) = "R" THEN _
ZUserIn$(ZAnsIndex) = WasA1$ : _
GOTO 20161
IF LEN(ZUserIn$(1)) > 1 AND _
ZUserSecLevel >= ZOptSec(19 - 20 * (ZMenuIndex = 6)) THEN _
ZAnsIndex = 1 : _
GOSUB 20202
CALL CmdStackPushPop (2)
RETURN
20161 IF INSTR(ZUserIn$(ZAnsIndex),".") THEN _
GOTO 20172
ZViolation$ = "List Dir. "
ZWasZ$ = ZUserIn$(ZAnsIndex)
ZWasA = INSTR("E+E-E",ZWasZ$)
IF ZWasA > 0 THEN _
IF ZWasA = 5 THEN _
ZExtendedOff = NOT ZExtendedOff : _
GOTO 20155 _
ELSE ZExtendedOff = (ZWasA > 2) : _
GOTO 20155
CALL AllCaps(ZWasZ$)
ZFileNameHold$ = ZWasZ$
WasA1$ = ZWasZ$
IF ZWasZ$ = ZDirPrefix$ THEN _
GOTO 20164
InFMS = ZFalse
20162 CALL CmdStackPushPop (1) ' save dir list list processing
CALL FMS (ZWasZ$,SearchString$,SearchDate$,InFMS, _
ZCategoryName$(),ZCategoryCode$(),ZCategoryDesc$(),_
DnldFlag,CatFound,ZAnsIndex)
WHILE DnldFlag > 0 AND ZSubParm > -1
GOSUB 20202
IF ZFileSysParm > 1 THEN _
RETURN
WasX$ = ZCategoryCode$(CatFound)
CALL DispUpDir (WasX$,SearchString$,SearchDate$,DnldFlag,ZAnsIndex)
CALL CheckTimeRemain (MinsRemaining)
IF ZSubParm = -1 THEN _
ZFileSysParm = 6 : _
RETURN
CALL Carrier
WEND
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
IF ZAnsIndex > 255 THEN _
ZLastIndex = 0 : _
RETURN
CALL CmdStackPushPop (2) ' restore dir list list processing
ZActiveFMSDir$ = ""
IF InFMS THEN _
GOTO 20159
IF ZUserSecLevel < ZMinSecToView THEN _
IF ZFileNameHold$ = ZUpldDirCheck$ THEN _
ZFileNameHold$ = "of uploads" : _
GOTO 20172
ZFileNameHold$ = ZUserIn$(ZAnsIndex)
IF ZLimitSearchToFMS THEN _
GOTO 20166
IF NOT ZSearchingAll THEN _
IF ZFileNameHold$ = "ALL" OR ZFileNameHold$ = "A" THEN _
ZSearchingAll = ZTrue : _
GOSUB 21890 : _
GOTO 20157
CALL BadFile (ZFileNameHold$,BadFileNameIndex)
ON BadFileNameIndex GOTO 20163,20172,20176
20163 ZFileName$ = ZFileNameHold$
CALL BadName (BadFileNameIndex)
ON BadFileNameIndex GOTO 20164,20176
20164 IF ZFileName$ = ZUpldDirCheck$ AND _
ZUserSecLevel >= ZMinSecToView THEN _
ZFileName$ = ZUpldPath$ _
ELSE ZFileName$ = ZCurDirPath$
ZFileName$ = ZFileName$ + _
ZFileNameHold$ + _
"." + _
ZDirExtension$
CALL Graphic (ZUserGraphicDefault$,ZFileName$)
20165 IF ZOK THEN _
CALL ReadDir (2,1) : _
IF ZErrCode = 0 THEN _
IF LEFT$(ZOutTxt$,4) = "\FMS" THEN _
InFMS = ZTrue : _
ZActiveFMSDir$ = ZFileName$ : _
GOTO 20162 _
ELSE GOTO 20167
20166 ZFileName$ = ZCurDirPath$ + _
ZFileNameHold$ + ".MNU"
CALL FindIt (ZFileName$)
IF ZOK THEN _
CALL BufFile (ZFileName$,ZAnsIndex) : _
GOTO 20155
IF ZAltdirExtension$ = "" THEN _
GOTO 20172
ZFileName$ = ZCurDirPath$ + _
ZFileNameHold$ + _
"." + _
ZAltdirExtension$
CALL Graphic (ZUserGraphicDefault$,ZFileName$)
IF NOT ZOK THEN _
GOTO 20172
20167 ZUserIn$(0) = ZUserIn$(ZAnsIndex)
GOSUB 20120
IF ZFileSysParm > 1 THEN _
RETURN
GOTO 20170
20168 CALL BufFile(ZFileName$,ZAnsIndex)
CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
20170 IF ZAnsIndex > 255 THEN _
ZLastIndex = 0 : _
RETURN
ZUserIn$(ZAnsIndex) = ZUserIn$(0)
GOTO 20159
20172 IF NOT ZSearchingAll THEN _
ZOutTxt$ = "Directory " + _
ZFileNameHold$ + _
" not found!" : _
GOSUB 21640 : _
ZNo = ZTrue : _
IF ZFileSysParm > 1 THEN _
RETURN
GOTO 20155
20176 CALL SecViolation
IF ZDenyAccess THEN _
ZFileSysParm = 4 : _
RETURN
GOTO 20172
'
' * D - COMMAND FROM FILES MENU (SEARCH FOR FILE TO DOWNLOAD)
'
20180 ZOutTxt$ = "Download what file(s)"
ZStackC = ZTrue
GOSUB 21668
IF ZFileSysParm > 1 THEN _
RETURN
IF ZWasQ = 0 THEN _
RETURN
20202 IF (ZTimeLock AND 2) AND (NOT TimeLockExempt) AND NOT ZHasPrivDoor THEN _
CALL TimeLock : _
IF NOT ZOK THEN _
RETURN
LastDnld = ZLastIndex
FirstDnld = ZAnsIndex
ZCmdTransfer$ = ""
IF ZAutoDownYes THEN _
ZCmdTransfer$ = "X"
ZAutoDownInProgress = ZAutoDownYes
ZAnsIndex = ZLastIndex
GOSUB 20470
LastDnld = LastDnld + (WasX > 0)
BatchBytes# = 0
BatchBlocks# = 0
ZDownFiles = 0
CALL KillWork (ZNodeWorkFile$)
ZErrCode = 0
FOR ZAnsIndex = FirstDnld TO LastDnld
GOSUB 20470
GOSUB 20205
ZCmdTransfer$ = ZWasFT$
CALL Line25
IF ZFileSysParm > 1 OR ZInternalProt$ = "N" THEN _
ZAnsIndex = LastDnld + 1
20203 NEXT
ZLastIndex = 0
IF ZFileSysParm > 1 THEN _
RETURN
ZBatchTransfer = ZFalse
ZCmdTransfer$ = ""
RETURN
20205 MarkingTime = (ZAnsIndex = FirstDnld OR NOT ZConcatFIles)
ZFileName$ = ZUserIn$(ZAnsIndex)
CALL Remove (ZFileName$,", ")
ZViolation$ = "Download "
IF PersonalDnld THEN _
CALL BreakFileName (ZFileName$,DR$,ZWasY$,WasX$,ZTrue) : _
ZFileNameHold$ = ZWasY$ + _
WasX$ : _
GOTO 20235
ZFileNameHold$ = ZFileName$
CALL BadFile (ZFileName$,BadFileNameIndex)
ON BadFileNameIndex GOTO 20220,20231,20233
20220 IF INSTR (ZFileName$,".") = 0 THEN _
FileNameAlt$ = ZFileName$ : _
ZFileName$ = ZFileName$ + "." + ZDefaultExtension$ : _
ZFileNameHold$ = ZFileNameHold$ + "." + ZDefaultExtension$ _
ELSE FileNameAlt$ = ""
20222 CALL RotorsDir (ZFileName$,ZSubDir$(),ZSubDirCount + _
((ZUserSecLevel < ZMinSecToView) OR _
NOT ZCanDnldFromUp),MarkingTime)
20225 IF ZOK THEN _
GOTO 20235
IF ZDotFlag THEN _
RETURN
IF FileNameAlt$ <> "" THEN _
ZFileName$ = FileNameAlt$ : _
FileNameAlt$ = "" : _
ZFileNameHold$ = ZFileName$ : _
GOTO 20222
20231 ZOutTxt$ = ZFileNameHold$ + _
" not found!"
CALL UpdtCalr (ZOutTxt$,2)
IF ZAutoDownInProgress THEN _
ZOutTxt$ = ZOutTxt$ + _
" during AUTODOWNLOAD" : _
GOSUB 21640 : _
RETURN
ZOutTxt$ = ZOutTxt$ + _
" Correct name"+ZPressEnterExpert$
ZSuspendAutoLogoff = ZTrue
GOSUB 21660
ZSuspendAutoLogoff = ZFalse
IF ZFileSysParm > 1 THEN _
RETURN
IF ZWasQ=0 THEN _
IF ZBatchTransfer AND ZAnsIndex >= LastDnld THEN _
GOTO 20262 _
ELSE ZAutoLogOffReq = ZFalse : _
RETURN
ZUserIn$(ZAnsIndex) = ZUserIn$(1)
GOTO 20205
20233 CALL SecViolation
IF ZDenyAccess THEN _
ZFileSysParm = 4 : _
RETURN
GOTO 20231
20235 CALL BadName (BadFileNameIndex)
ON BadFileNameIndex GOTO 20236,20245
20236 ZLine25$ = "(D) " + _
ZWasZ$
IF ZAutoDownInProgress THEN _
MID$(ZLine25$,2,1) = "A"
'
' * TEST FOR DOWNLOAD SECURITY
'
CALL OpenWork (2,ZFileSecFile$)
IF ZErrCode = 53 THEN _
CALL UpdtCalr ("Missing file " + ZFileSecFile$,2) : _
GOTO 20247
20242 IF EOF(2) THEN _
GOTO 20247
CALL ReadParms (ZWorkAra$(),3,1)
IF ZErrCode <> 0 THEN _
ZWasEL = 20242 : _
GOTO 21900
20243 CALL WildFile (ZWorkAra$(1),ZWasZ$,ZOK)
IF NOT ZOK THEN _
GOTO 20242
20244 IF ZUserSecLevel < VAL(ZWorkAra$(2)) THEN _
GOTO 20245
FilePswd$ = ZWorkAra$(3)
IF FilePswd$ = "" THEN _
GOTO 20247
CALL AllCaps (FilePswd$)
IF FilePswd$ = ZPswd$ THEN _
GOTO 20247
ZOutTxt$ = "Enter PASSWORD to download " + _
ZFileName$
GOSUB 21660
IF ZFileSysParm > 1 THEN _
RETURN
IF ZWasQ = 0 THEN _
RETURN
CALL AllCaps (ZUserIn$(1))
IF ZUserIn$(1) = FilePswd$ THEN _
GOTO 20247
20245 ZViolation$ = "DownLoad " + _
ZFileName$
20246 CALL SecViolation
IF ZDenyAccess THEN _
ZFileSysParm = 4
RETURN
20247 ZWasDF = 0
CALL BreakFileName (ZFileName$,DR$,WasX$,Extension$,ZFalse)
IF ZAutoDownInProgress THEN _
ZOutTxt$ = "Transferring -- " + _
ZUserIn$(ZAnsIndex) : _
GOSUB 21640 : _
IF ZFileSysParm > 1 THEN _
RETURN
IF INSTR("...WRK.FW .ARC.EXE.COM.OBJ.WKS.LBR.ZIP.PAK.ZOO.LZH.","."+Extension$+".") > 2 OR _
MID$(Extension$,2,1) = "Q" OR _
(ZRequireNonASCII AND Extension$ = "BAS") THEN _
ZWasDF = ZTrue
20248 ZOutTxt$ = ""
IF ZBatchTransfer THEN _
IF ZAnsIndex < LastDnld THEN _
GOTO 20260
CALL XferType (2,ZTrue)
IF ZFF THEN _
GOTO 20260
CALL XferType (1,ZTrue)
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
20260 ZTransferFunction = 1
GOSUB 21790
IF ZFileSysParm > 1 THEN _
RETURN
ZBatchTransfer = (ZBatchProto AND (LastDnld > FirstDnld))
IF ZBatchTransfer AND ZCmdTransfer$ = "" THEN _
ZCmdTransfer$ = ZWasFT$
ON INSTR("AXCYN",ZInternalProt$) GOTO _
20340, _ ' ASCII DOWNLOAD
20290, _ ' Xmodem
20290, _ ' Xmodem CRC
20270, _ ' YMODEM
21700 ' NONE - CANCEL
'
' * EXTERNAL Protocol Downloads/Uploads
'
20261 IF ZReq8Bit THEN _
IF NOT ZEightBit THEN _
GOSUB 20318 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE GOSUB 20992 : _
IF ZFileSysParm > 1 THEN _
RETURN
IF ZTransferFunction = 1 THEN _
GOSUB 20750 : _
CLOSE 2 : _
IF ZFileSysParm > 1 OR NOT ZOK THEN _
RETURN
20262 IF ZBatchTransfer THEN _
IF ZAnsIndex < LastDnld THEN _
RETURN _
ELSE ZBlocksInFile# = BatchBlocks# : _
ZBytesInFile# = BatchBytes# : _
ZNumDnldBytes! = BatchBytes# : _
IF ZBytesInFile# < 1 THEN _
RETURN _
ELSE GOSUB 20780 : _
IF ZFileSysParm > 1 OR NOT ZOK THEN _
RETURN
IF ZAutoDownInProgress THEN _
CALL SendName : _
IF ZAbort THEN _
DnldCompleted = ZFalse : _
GOSUB 21760 : _
RETURN
CALL Transfer
20263 IF ZPrivateDoor THEN _
ZCmdTransfer$ = ZWasFT$ : _
CALL XferType (2,ZTrue) : _
ZCmdTransfer$ = ""
CALL OpenWork (2,"XFER-" + ZNodeID$ + ".DEF")
IF ZErrCode <> 0 THEN _
GOTO 20267
CALL ReadParms (ZWorkAra$(), ZFailureParm, 1)
IF ZErrCode <> 0 THEN _
GOTO 20267
CALL KillWork ("XFER-" + ZNodeID$ + ".DEF")
20264 IF ZPrivateDoor THEN _
ZFileName$ = ZWorkAra$(1) : _
CALL BreakFileName (ZFileName$,WasX$,ZFileNameHold$,ZWasY$,ZTrue) : _
ZFileNameHold$ = ZFileNameHold$ + _
ZWasY$
IF LEFT$(ZWorkAra$(ZFailureParm),1) = "L" THEN _
MID$(ZWorkAra$(ZFailureParm),1,1) = ZFailureString$
20265 IF ZTransferFunction = 2 THEN _
IF INSTR(ZWorkAra$(ZFailureParm),ZFailureString$) <> 1 THEN _
GOTO 20700 _
ELSE GOTO 20730
IF ZTransferFunction = 1 THEN _
DnldCompleted = (INSTR(ZWorkAra$(ZFailureParm),ZFailureString$) <> 1)
GOSUB 21760
CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7
RETURN
'
' * XFER FILE NOT Found
'
20267 ZWasEL = 20263
GOTO 21900
'
' * YMODEM DOWNLOAD DRIVER
'
20270 GOTO 20292
'
' * Xmodem DOWNLOAD DRIVER
'
20290 '
20292 GOSUB 20750
IF ZFileSysParm > 1 OR NOT ZOK THEN _
RETURN
WasA1$ = "SEND"
GOSUB 20320
IF ZFileSysParm > 1 THEN _
RETURN
IF ZLocalUser THEN _
CALL QuickTPut1 ("Protocol not available in local mode") : _
RETURN
IF ZAutoDownInProgress THEN _
GOSUB 20294 : _
IF ZAbort THEN _
RETURN
GOSUB 21300
IF ZFileSysParm > 1 THEN _
RETURN
ZOutTxt$ = ""
GOTO 20390
20294 CALL SendName
RETURN
20318 ZOutTxt$ = "Please Switch to N,8,1 for binary transfer"
GOSUB 21630
IF ZFileSysParm > 1 THEN _
RETURN
CALL DelayTime (3)
RETURN
20320 IF NOT ZEightBit THEN _
GOSUB 20318 : _
IF ZFileSysParm > 1 THEN _
RETURN
20325 IF ZCheckSum THEN _
ZNAK$ = CHR$(21) : _
SOL = 132 _
ELSE ZNAK$ = "C" : _
SOL = 133
20330 IF ZAutoDownInProgress THEN _
RETURN
ZOutTxt$ = ZProtoPrompt$ + _
" " + WasA1$ + _
" of " + _
ZFileNameHold$ + _
" ready. <Ctrl X> aborts"
GOSUB 21650
20335 IF ZTransferFunction = 1 THEN _
CALL Talk (8,ZOutTxt$) _
ELSE CALL Talk (9,ZOutTxt$)
RETURN
'
' * ASCII DOWNLOAD DRIVER
'
20340 IF ZWasDF THEN _
ZOutTxt$ = "Switch to a non-ascii protocol" : _
GOSUB 21650 : _
GOTO 21700
GOSUB 20750
IF ZFileSysParm > 1 OR NOT ZOK THEN _
RETURN
CALL OpenWork (2,ZFileName$)
IF (ZAnsIndex = FirstDnld OR NOT ZConcatFIles) THEN _
ZOutTxt$ = "^X aborts. ^S suspends ^Q resumes" : _
GOSUB 21640 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE ZOutTxt$ = ZProtoPrompt$ + " SEND of " + _
ZFileNameHold$ + _
" ready. Press Any Key to start" : _
ZTurboKey = 2 : _
ZForceKeyboard = ZTrue : _
ZSuspendAutologoff = ZTrue : _
GOSUB 21660 : _
ZSuspendAutologoff = ZFalse : _
GOSUB 20335 : _
IF ZFileSysParm > 1 THEN _
RETURN
20380 ZStopInterrupts = ZFalse
WasTU = 0
SWAP WasTU,ZPageLength
CALL BufFile (ZFileName$,WasX)
SWAP WasTU,ZPageLength
ZNonStop = (ZPageLength < 1)
IF StopFile THEN _
DnldCompleted = ZFalse : _
GOTO 20390
20381 IF (ZAnsIndex = LastDnld OR NOT ZConcatFIles) THEN _
CALL QuickTPut (CHR$(26),0) : _
IF NOT ZLocalUser AND ZSubParm = 0 THEN _
FOR WasX = 1 TO 5 : _
CALL PutCom (CHR$(7)) : _
CALL DelayTime (3) : _
NEXT
20385 DnldCompleted = ZTrue
20390 GOTO 21760
'
' * U - COMMAND FROM FILES MENU (UPLOAD)
'
20395 GOSUB 21640
IF ZFileSysParm > 1 THEN _
RETURN
ZOutTxt$ = "Correct name of file to upload" + _
ZPressEnterExpert$
GOSUB 21660
IF ZFileSysParm > 1 THEN _
RETURN
IF ZWasQ = 0 THEN _
RETURN
ZUserIn$(ZAnsIndex) = ZUserIn$(1)
GOTO 20435
20400 CALL TimeBack (1)
GOSUB 20420
ZAutoLogOffReq = 0
FirstUpld = ZAnsIndex
GOTO 20430
20420 ZOutTxt$ = "Upload what file(s)"
ZStackC = ZTrue
GOSUB 21668
RETURN
'
' * SEARCH FOR DUPLICATE FILENAME
'
20430 ZAnsIndex = ZLastIndex
GOSUB 20470
ZLastIndex = ZLastIndex + (WasX > 0)
FOR ZAnsIndex = FirstUpld TO ZLastIndex
GOSUB 20470
GOSUB 20435
IF ZFileSysParm > 1 THEN _
ZAnsIndex = ZLastIndex + 1
NEXT
ZCmdTransfer$ = ""
RETURN
20435 ZFileNameHold$ = ZUserIn$(ZAnsIndex)
IF INSTR(ZFileNameHold$,".") = 0 THEN _
ZFileNameHold$ = ZFileNameHold$ + "." + ZDefaultExtension$
CALL AllCaps(ZFileNameHold$)
ZFileName$ = ZFileNameHold$
ZViolation$ = "Upload "
CALL NoPath (ZFileName$,BadFileNameIndex)
IF BadFileNameIndex THEN _
GOTO 20451
CALL BadFile (ZFileName$,BadFileNameIndex)
ON BadFileNameIndex GOTO 20440,20451,20515
20440 CALL RotorsDir (ZFileName$,ZSubDir$(),ZSubDirCount,ZTrue)
20445 IF ZOK THEN _
GOTO 20452
IF INSTR(ZFileName$,".") = 0 THEN _
GOTO 20475
CALL BreakFileName (ZFileName$,DR$,WasX$,Extension$,ZFalse)
WasI = 1
20447 WasJ = INSTR(MID$(ZCompressedExt$+". ",WasI),".")
IF WasJ = 0 THEN _
GOTO 20475
Check$ = MID$(ZCompressedExt$,WasI,WasJ-1)
WasI = WasI + WasJ
20450 IF Extension$ <> Check$ THEN _
CALL RotorsDir (WasX$ + "." + Check$,ZSubDir$(),ZSubDirCount,ZTrue) : _
IF ZOK THEN _
GOTO 20452
GOTO 20447
20451 ZOutTxt$ = "Invalid file name <" + ZFileName$ + ">"
GOTO 20395
20452 IF ZUserSecLevel < ZOverWriteSecLevel THEN _
GOTO 20453
ZOutTxt$ = "Overwrite file (Y,[N])"
GOSUB 21660
IF ZFileSysParm > 1 THEN _
RETURN
IF NOT ZYes THEN _
GOTO 20453
ZWasZ$ = ZFileName$
CALL KillWork (ZFileName$)
IF ZErrCode <> 0 THEN _
ZWasEL = 20452 : _
GOTO 21900
GOTO 20475
20453 CLOSE 2
IF ZUserSecLevel >= ZAddDirSecurity THEN _
GOTO 20455
20454 CALL QuickTPut1 ("Thanks, but we already have " + ZFileNameHold$)
CALL UpdtCalr ("Upload duplicate " + ZFileNameHold$,1)
RETURN
20455 ZOutTxt$ = "Add new directory entry (Y,[N])"
ZTurboKey = - ZTurboKeyUser
GOSUB 21660
IF ZFileSysParm > 1 THEN _
RETURN
IF NOT ZYes THEN _
RETURN
AddingDescOnly = ZTrue
ZWasFT$ = "l"
GOSUB 20702
RETURN
20470 ' *** CHECK FOR Protocol IN FILE LIST ***
ZWasZ$ = ZUserIn$(ZAnsIndex)
CALL AllCaps(ZWasZ$)
WasX = 0
IF LEN (ZWasZ$) = 1 THEN _
WasX = INSTR(ZDefaultXfer$,ZWasZ$) : _
IF WasX > 0 THEN _
ZAnsIndex = ZAnsIndex + 1 : _
ZCmdTransfer$ = ZWasZ$ : _
ZAutoDownInProgress = ZFalse : _
IF MID$(ZInternalEquiv$,WasX,1) = "N" THEN _
ZCmdTransfer$ = ""
RETURN
20475 ZWasZ$ = ZUpldDriveFile$
CALL FindFree
IF VAL(ZFreeSpace$) < 4096 THEN _
CALL QuickTPut1 ("No room for uploads. Try tomorrow.") : _
ZAnsIndex = ZLastIndex + 1 : _
RETURN
ZOutTxt$ = "Upload disk has" + _
ZFreeSpace$
GOSUB 21640
IF ZFileSysParm > 1 THEN _
RETURN
ZLine25$ = "(U) " + _
ZFileNameHold$
ZSubParm = 2
CALL Line25
ZOutTxt$ = ""
ZOK = ZTrue
20477 CALL XferType (2,ZTrue)
IF ZFF THEN _
GOTO 20500
CALL XferType (1,ZTrue)
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
20500 ZTransferFunction = 2
ZAutoDownInProgress = ZFalse
GOSUB 21790
IF ZFileSysParm > 1 THEN _
RETURN
ON INSTR("AXCYN",ZInternalProt$) GOTO _
20560, _ ' ASCII UPLOAD
20542, _ ' Xmodem
20542, _ ' Xmodem CRC
20542, _ ' YMODEM
20735 ' NONE - CANCEL
GOTO 20261
20510 WasD$ = "<Esc> by SYSOP aborts"
GOSUB 21710
RETURN
20515 CALL SecViolation
IF ZDenyAccess THEN _
ZFileSysParm = 4 : _
RETURN
GOTO 20420
'
' * Xmodem/YMODEM UPLOAD DRIVER
'
20542 WasA1$ = "RECEIVE"
GOSUB 20320
IF ZFileSysParm > 1 THEN _
RETURN
ZOK = ZTrue
GOSUB 20860
IF ZFileSysParm > 1 THEN _
RETURN
IF ZOK THEN _
GOTO 20700
GOTO 20730
'
' * ASCII UPLOAD
'
20560 LineACK = (ZDefaultLineACK$ <> "")
IF LineACK THEN _
ZOutTxt$ = "Acknowledge each line ([Y],N)" : _
ZTurboKey = - ZTurboKeyUser : _
LineACK = NOT ZNo : _
GOSUB 21660 : _
IF ZFileSysParm > 1 THEN _
RETURN
CALL QuickTPut1 ("Transfer MUST end with a <Ctrl-K>")
CALL QuickTPut1 (ZProtoPrompt$+" RECEIVE of " + ZFileNameHold$ + " ready")
ZOK = ZFalse
XOff = ZFalse
CALL OpenOutW(ZFileName$)
IF ZErrCode <> 0 AND ZErrCode <> 53 THEN _
ZWasEL = 20560 : _
GOTO 21900
GOSUB 20510
IF ZFileSysParm > 1 THEN _
RETURN
20600 CALL EofComm (Char)
WHILE Char <> -1
CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
IF NOT ZFossil THEN _
IF LOF(3) < 512 THEN _
CALL PutCom(ZXOff$) : _
XOff = ZTrue
20610 CALL FlushCom (WasX$)
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
IF INSTR(WasX$,CHR$(11)) THEN _
GOTO 20650
ZOK = ZTrue
20620 CALL PrintWork (WasX$)
IF LineACK THEN _
IF INSTR(WasX$,CHR$(10)) > 0 THEN _
CALL PutCom (ZDefaultLineACK$)
IF ZErrCode <> 0 THEN _
ZWasEL = 20620 : _
GOTO 21900
WasD$ = WasX$
NumReturns = 0
GOSUB 21720
IF ZFileSysParm > 1 THEN _
RETURN
20621 CALL FindFKey
IF ZSubParm < 0 THEN _
ZFileSysParm = 2 : _
RETURN
IF ZKeyPressed$ = ZEscape$ THEN _
GOTO 20745
IF NOT ZOK THEN _
GOTO 20670
CALL EofComm (Char)
20630 WEND
CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
IF XOff THEN _
XOff = ZFalse : _
CALL PutCom (ZXOn$) : _
IF ZErrCode <> 0 THEN _
ZWasEL = 20630 : _
GOTO 21900
GOTO 20600
20650 WasX = INSTR(WasX$,CHR$(11))
IF WasX = 1 THEN _
IF NOT ZOK THEN _
GOTO 20730 _
ELSE GOTO 20700
CALL PrintWorkA (LEFT$(WasX$,WasX-1))
IF ZErrCode <> 0 THEN _
ZWasEL = 20650 : _
GOTO 21900
GOTO 20700
20670 ZOutTxt$ = ZXOff$ + _
"System error! Upload aborted <Ctrl-K> continues"
20675 GOSUB 21650
IF ZFileSysParm > 1 THEN _
RETURN
CALL DelayTime (3)
CALL PutCom(ZXOn$)
20680 CALL EofComm (Char)
WHILE Char <> -1
CALL FlushCom(WasX$)
IF INSTR(WasX$,CHR$(11)) THEN _
GOTO 20730
20685 CALL Carrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
CALL EofComm (Char)
WEND
GOTO 20680
'
' * UPDATE UPLOAD DIRECTORY
'
20700 GOSUB 21780
IF ZFileSysParm > 1 THEN _
RETURN
20702 CALL UpdtUpload (ZCategoryName$(),ZCategoryCode$(), ZLinesInMsg)
ZPrivateDoor = ZFalse
IF NOT ZGetExtDesc THEN _
GOTO 20710
ZMsgHeader$ = "Extended Description for " + ZFileNameHold$
ZSysopComment = ZTrue
ZMaxMsgLines = ZMaxExtendedLines
WasLL = ZRightMargin
ZRightMargin = 30 + ZMaxDescLen
ZFileSysParm = 5
RETURN
20705 ZMaxMsgLines = ZMaxMsgLinesDef
ZRightMargin = WasLL
GOTO 20702
20710 AddingDescOnly = ZFalse
IF ZBytesInFile# > 0.0 THEN _
GOTO 21770
20730 GOSUB 21780
CALL QuickTPut1 ("Upload aborted")
ZPrivateDoor = ZFalse
20735 CALL KillWork (ZFileName$)
IF ZErrCode <>0 THEN _
ZWasEL = 20736 : _
GOTO 21900
ZLastIndex = 0
RETURN
'
' * Sysop ABORTED UPLOAD
'
20745 ZOutTxt$ = ZXOff$ + _
"SYSOP aborted upload. Stop tranfer. <Ctrl-K> continues"
GOTO 20675
'
' * CALCULATE DOWNLOAD TIME ESTIMATE
'
20750 ZStartOfHeader$ = CHR$(1 - (ZInternalProt$ = "Y"))
CALL OpenRSeq (ZFileName$,MaxBlock,ZWasDF,ZFLen)
20760 IF ZErrCode <> 0 THEN _
CALL QuickTPut1 ("Unable to access "+ZFileNameHold$) : _
CALL UpdtCalr ("Unable to access "+ZFileName$,2) : _
ZOK = ZFalse : _
ZErrCode = 0 : _
ZBytesInFile# = 0 : _
RETURN
ZBytesInFile# = LOF(2)
ZNumDnldBytes! = LOF(2)
ZOK = ZTrue
IF SizeOnly THEN _
SizeOnly = ZFalse : _
RETURN
ZBlocksInFile# = MaxBlock
IF ZBatchTransfer THEN _
Temp# = BatchBlocks# + ZBlocksInFile# : _
CALL CheckTimeRemain (MinsRemaining) : _
IF (NOT PersonalDnld) AND _
(INT(Temp# / 60) + 1 > MinsRemaining) THEN _
CALL QuickTPut1 ("Omitting " + ZFileNameHold$ + ". Insufficient time") : _
RETURN _
ELSE BatchBlocks# = Temp# : _
BatchBytes# = BatchBytes# + ZBytesInFile# : _
CALL OpenWorkA (ZNodeWorkFile$) : _
CALL PrintWorkA (ZFileName$) : _
ZDownFiles = ZDownFiles + 1 : _
RETURN
ZDownFiles = 1
20780 ZOutTxt$ = "File Size :"
ZOK = ZTrue
IF ZBlockSize > 0 THEN _
ZOutTxt$ = ZOutTxt$ + _
STR$(FIX(ZBlocksInFile#)) + _
" blocks "
20785 ZBlocksInFile# = ZBlocksInFile# / _
VAL(MID$("00000300045012002400480096019203840", -4 * ZBPS, 4))
ZBlocksInFile# = ZBlocksInFile# * ZFLen / ZSpeedFactor!
IF (ZAnsIndex > 1 AND ZConcatFIles) THEN _
RETURN
ZOutTxt$ = ZOutTxt$ + _
STR$(ZBytesInFile#) + _
" bytes"
GOSUB 21650
IF ZFileSysParm > 1 THEN _
RETURN
IF ZBytesInFile# < 1 THEN _
RETURN
20790 ZSubParm = 2
CALL Line25
ZOutTxt$ = "Transfer Time:" + _
STR$(INT(ZBlocksInFile# / 60)) + _
" min," + _
STR$(INT(ZBlocksInFile# - (INT(ZBlocksInFile# / 60) * 60))) + _
" sec (approx)"
GOSUB 21650
IF ZFileSysParm > 1 THEN _
RETURN
20791 IF PersonalDnld THEN _
RETURN
CALL CheckTimeRemain (MinsRemaining)
IF ZSubParm = -1 THEN _
ZFileSysParm = 6 : _
RETURN
ZOK = ZTrue
IF (INT(ZBlocksInFile# / 60) + 1) > MinsRemaining THEN _
ZOutTxt$ = "Not enough time left!" : _
CALL UpdtCalr (ZFileName$ + " " + ZOutTxt$,2) : _
CALL QuickTPut1 (ZOutTxt$): _
ZOutTxt$ = "" : _
ZOK = ZFalse : _
ZAutoLogoffReq = ZFalse : _
RETURN
IF ZRatioRestrict# > 0 THEN _
CALL QuickTPut1 ("New statistics will be") : _
CALL CheckRatio (ZTrue)
RETURN
20810 ZDelay! = TIMER + 6
20840 CALL EofComm (Char)
IF Char = -1 THEN _
GOTO 20850
CALL FlushCom(ZWasY$)
RETURN
20850 CALL CheckTime (ZDelay!, TempElapsed!, 1)
IF TempElapsed! > 0 THEN GOTO 20840
20851 ZWasY$ = ""
CALL CheckCarrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
RETURN
'
' * Xmodem/YMODEM UPLOAD
'
20860 GOSUB 20992
IF ZFileSysParm > 1 THEN _
RETURN
IF NOT ZEightBit THEN _
GOSUB 21280 : _
IF ZFileSysParm > 1 THEN _
RETURN
20900 WasX$ = ""
Sec = 1
'CALL OpenOutW (ZFileName$)
IF ZFLen > ZWriteBufDef THEN _
WriteBuf = ZFLen _
ELSE WriteBuf = ZWriteBufDef
CALL OpenRSeq (ZFileName$,WasY,ZWasDF,WriteBuf)
IF ZErrCode <> 0 AND ZErrCode <> 53 THEN _
ZWasEL = 20900 : _
GOTO 21900
FIELD #2, WriteBuf AS ZUpldRec$
RecsWrit = 0
NumInBuff = 0
TransferAbort! = TIMER + ZWaitBeforeDisconnect
Year$ = " " + _
CHR$(1) + _
CHR$(2) + _
ZEndTransmission$ + _
ZCancel$
20903 CALL PutCom (ZNAK$)
20920 WasX = 1
20922 CALL CheckCarrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
CALL FindFKey
IF ZKeyPressed$ = ZEscape$ THEN _
GOSUB 20510 :_
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE GOTO 21240
GOSUB 20810
IF ZFileSysParm > 1 THEN _
RETURN
20930 WasJ = INSTR(Year$,LEFT$(ZWasY$,1))
ON WasJ GOTO 20960,20999,20999,21220,21230
20960 IF ZWasY$ <> "" THEN _
GOSUB 21280 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE CALL CheckTime (TransferAbort!,TempElapsed!,1) : _
ON ZSubParm GOTO 20920,21230
20970 WasX = WasX + 1
CALL DelayTime (1)
CALL PutCom (ZNAK$)
IF WasX < 6 THEN _
GOTO 20922
WasD$ = "Upload Timeout"
GOSUB 21710
IF ZFileSysParm > 1 THEN _
RETURN
CALL CheckTime (TransferAbort!,TempElapsed!,1)
ON ZSubParm GOTO 20990,21230
20990 GOTO 20920
'
' * CHANGE TO 8 BIT FOR Xmodem
'
20992 GOSUB 20510
IF ZFileSysParm > 1 THEN _
ZFileSysParm = 2 : _
RETURN
IF NOT ZEightBit THEN _
PrevLineCntl = INP (ZLineCntlReg) : _
CALL DelayTime (3) : _
SwitchToEight = ZTrue : _
OUT ZLineCntlReg,3
20996 WasSO = 0
RETURN
'
' * EXPECTED BLOCK LENGTH. 132 FOR CheckSum, 133 FOR CRC, 1029 FOR YMODEM
'
20999 SOL = 896 * WasJ - 1659 + ZCheckSum
DataSol = 128 - (SOL > 1024)*896
GOTO 21020
'
' * Xmodem/YMODEM UPLOAD
'
21000 GOSUB 20810
IF ZFileSysParm > 1 THEN _
RETURN
IF ZWasY$ = "" THEN _
WasD$ = "Upload Timeout" : _
GOSUB 21710 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE GOTO 21040
21020 WasX$ = WasX$ + _
ZWasY$
IF LEN(WasX$) < SOL THEN _
GOTO 21000
21040 IF LEN(WasX$) = SOL THEN _
GOTO 21090
21050 IF LEN(WasX$) > SOL THEN _
GOTO 21180
21060 IF WasX$ = ZEndTransmission$ THEN _
GOTO 21220
21070 IF WasX$ = ZCancel$ THEN _
GOTO 21230
21080 GOTO 21170
21090 WasJX = ASC(MID$(WasX$,2,1))
IF Sec = WasJX THEN _
GOTO 21100
GOTO 21200
21100 IF (Sec XOR 255) <> ASC(MID$(WasX$,3,1)) THEN _
GOTO 21210
21110 IF ZCheckSum THEN _
WasWK$ = MID$(WasX$,4,128) : _
GOSUB 21750 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE IF XmodemChecksum <> ASC(MID$(WasX$,132,1)) THEN _
GOTO 21190 _
ELSE GOTO 21120
WasWK$ = MID$(WasX$,4)
GOSUB 21750
IF ZFileSysParm > 1 THEN _
RETURN
21113 IF CRCValue <> 0 THEN _
GOTO 21191
21120 WasSO = WasSO + 1
CALL PutCom (ZAcknowledge$)
21131 IF NumInBuff >= WriteBuf THEN _
NumInBuff = 0 : _
CALL PutWork (ZUpldRec$,RecsWrit,WriteBuf) : _
IF ZErrCode <> 0 THEN _
ZWasEL = 21131 : _
GOTO 21900
MID$(ZUpldRec$,NumInBuff+1,DataSol) = WasWK$
NumInBuff = NumInBuff + DataSol
21145 Sec = 255 AND (Sec + 1)
CALL QuickLPrnt ("OK Rec Blk #",WasSO)
21150 WasX$ = ""
XmodemChecksum = 0
TransferAbort! = TIMER + 45
GOTO 20920
21170 ZOutTxt$ = "Short Blk #"
GOTO 21212
21180 ZOutTxt$ = "Long Blk #"
GOTO 21212
21190 ZOutTxt$ = "Chksum Error #"
GOTO 21212
21191 ZOutTxt$ = "CRC Error"
GOTO 21212
21200 IF Sec < WasJX THEN _
ZOutTxt$ = "Blk # Error in #" : _
GOTO 21212
CALL PutCom (RIGHT$(ZAckChar$,1 - (WasJX = 0)))
GOTO 21150
21210 ZOutTxt$ = "Complement Error in #"
21212 CALL PutCom (ZNAK$)
CALL LPrnt(ZLineFeed$ + ZOutTxt$ + STR$(WasSO + 1),0)
GOTO 21150
21220 IF NumInBuff < 1 THEN _
GOTO 21225
WasWK$ = LEFT$(ZUpldRec$,NumInBuff)
CALL OpenRSeq (ZFileName$,MaxBlock,ZWasDF,128)
FIELD #2, 128 AS ZUpldRec$
MaxBlock = CDBL(RecsWrit) * WriteBuf / 128
FOR WasI = 1 TO NumInBuff/128
CALL PutWork (MID$(WasWK$,128*WasI-127,128),MaxBlock,128)
IF ZErrCode > 0 THEN _
ZWasEL = 21220 : _
GOTO 21900
NEXT
CLOSE 2
21225 CALL PutCom (ZAcknowledge$)
GOTO 21250
21230 WasD$ = ZLineFeed$ + _
"Transfer Aborted"
GOSUB 21710
IF ZFileSysParm > 1 THEN _
RETURN
21240 CALL EofComm (Char)
IF Char <> -1 THEN _
GOSUB 21280 : _
IF ZFileSysParm > 1 THEN _
RETURN _
ELSE CALL DelayTime (1) : _
GOTO 21240
CALL PutCom (ZCancel$ + ZCancel$)
CALL DelayTime (1)
CALL EofComm (Char)
IF Char <> -1 THEN _
GOTO 21240
ZOK = ZFalse
21250 ZEightBit = ZTrue
RETURN
'
' * CLEAR GARBAGE OUT OF COMMUNICATIONS BUFFER
'
21280 CALL CheckCarrier
IF ZSubParm = -1 THEN _
ZFileSysParm = 7 : _
RETURN
CALL EofComm (Char)
IF Char = -1 THEN _
RETURN
21281 CALL FlushCom(ZWasDF$)
'IF ZSubParm = -1 THEN _
' ZFileSysParm = 7 : _
' RETURN
GOTO 21280
'
' * Xmodem/YMODEM DOWNLOAD
'
21300 GOSUB 20992
IF ZFileSysParm > 1 THEN _
RETURN
Sec = 0
GOSUB 21280
IF ZFileSysParm > 1 THEN _
RETURN
ZNAK$ = CHR$(21)
TransferAbort! = TIMER + ZWaitBeforeDisconnect
21303 FIELD 2,ZFLen AS ZDnldRecord$
'
' * ROUTINE TO START AN "Xmodem" OR "YMODEM" DOWNLOAD. CHECK'S INITIAL
' * "HANDSHAKE" TO SEE IF CHARACTER IS SENT IS A:
' * "X" = Xmodem WITH CheckSum AND 128 CHARACTER RECORDS
' * "C" = Xmodem WITH CRC CHECK AND 128 CHARACTER RECORDS
' * "Y" = YMODEM WITH CRC CHECK AND 1024 CHARACTER RECORDS
'
21350 CALL EofComm (Char)
WHILE Char <> -1
21360 CALL GetCom(ZWasY$)
IF ZWasY$ = ZCancel$ THEN _
GOTO 21560
21380 ZCheckSum = (ZWasY$ = ZNAK$)
IF ZCheckSum THEN _
ZFF = INSTR(ZInternalEquiv$,"X") : _
IF ZFF > 0 THEN _
ZWasFT$ = MID$(ZDefaultXfer$,ZFF,1) : _
GOTO 21480 _
ELSE ZWasFT$ = "X" : _
GOTO 21480 _
ELSE IF ZWasY$ = "C" THEN _
GOTO 21480
CALL EofComm (Char)
21390 WEND
GOSUB 21460
IF ZFileSysParm > 1 THEN _
RETURN
IF ZKeyPressed$ = ZEscape$ THEN _
RETURN
CALL CheckTime (TransferAbort!, TempElapsed!, 1)
ON ZSubParm GOTO 21350,21455
21410 TransferAbort! = TIMER + ZWaitBeforeDisconnect
'
' * ROUTINE TO WAIT FOR AN ACKNOWLEDGEMENT ON AN "Xmodem" OR "YMODEM"
' * DOWNLOAD
'
21415 CALL EofComm (Char)
IF Char <> -1 THEN _
GOTO 21420
GOSUB 21460
IF ZFileSysParm > 1 THEN _
RETURN
IF ZKeyPressed$ = ZEscape$ THEN _
RETURN
CALL CheckTime (TransferAbort!, TempElapsed!, 1)
ON ZSubParm GOTO 21415,21455
21420 CALL GetCom(ZWasY$)
IF ZWasY$ = ZAcknowledge$ THEN _
GOTO 21470
21440 IF ZWasY$ <> ZNAK$ THEN _
GOTO 21450
21443 WasD$ = ZLineFeed$ + _
"Error -> retrans #" + _
STR$(WasSO)
GOSUB 21710
IF ZFileSysParm > 1 THEN _
RETURN
21445 WasSO = WasSO - 1
GOTO 21490
21450 IF ZWasY$ = ZCancel$ THEN _
IF HaveACancel THEN _
GOTO 21560 _
ELSE HaveACancel = ZTrue
CALL CheckTime (TransferAbort!, TempElapsed!, 1)
ON ZSubParm GOTO 21415,21455
21455 WasD$ = "Download timeout"
GOSUB 21710
IF ZFileSysParm > 1 THEN _
RETURN
GOTO 21560
21460 CALL CheckCarrier
CALL FindFKey
IF ZSubParm < 0 THEN _
ZFileSysParm = 7 : _
RETURN
IF ZKeyPressed$ = ZEscape$ THEN _
GOTO 21540
RETURN
'
' * DISPLAY BLOCK SENT OK AND THEN READ IN NEXT RECORD FROM DISK TO DOWNLOAD
'
21470 CALL QuickLPrnt ("OK Sent Blk #",WasSO)
21480 IF LOC(2) => MaxBlock THEN _
GOTO 21530
CALL GetWork (ZFLen)
IF ZErrCode <> 0 THEN _
ZWasEL = 21480 : _
GOTO 21900
Sec = 255 AND (Sec + 1)
GOTO 21490
'
' * ROUTINE TO WRITE OUT AN "Xmodem" OR "YMODEM" RECORD TO THE COMM. PORT
'
21490 WasSO = WasSO + 1
CALL PutCom (ZStartOfHeader$ + CHR$(Sec) + CHR$(Sec XOR 255))
CALL PutCom (ZDnldRecord$)
HaveACancel = ZFalse
21503 WasWK$ = ZDnldRecord$
21504 GOSUB 21750
IF ZFileSysParm > 1 THEN _
RETURN
21510 IF ZCheckSum THEN _
CALL PutCom(CHR$(XmodemChecksum)) _
ELSE CALL PutCom(CHR$(CRCHigh) + CHR$(CRCLow))
GOSUB 21280
IF ZFileSysParm > 1 THEN _
RETURN
GOTO 21410
'
' * END-OF-FILE FOR Xmodem Dnlds -- SEND THE "EOT" CHARACTER AND WAIT UP
' * TO 2 SECONDS FOR A POSITIVE RESPONSE (I.E. AN "ACK"). IF NONE IS
' * RE-TRY UP TO 10 TIMES. IF No POSITIVE RESPONSE IS RECEIVED AFTER TEN
' * Attempts, ASSUME THE DOWNLOAD WAS UNSUCCESSFULL.
'
21530 CALL PutCom (ZEndTransmission$)
WasX = 1
21531 GOSUB 20810
IF ZFileSysParm > 1 THEN _
RETURN
IF INSTR(ZWasY$,ZAcknowledge$) THEN _
GOTO 21550
CALL FindFKey
IF ZSubParm < 0 THEN _
ZFileSysParm = 2 : _
RETURN
IF ZKeyPressed$ = ZEscape$ THEN _
GOSUB 21540 : _
GOTO 21545
IF WasX < 10 THEN _
WasX = WasX + 1 : _
GOTO 21531
DnldCompleted = ZFalse
GOTO 21230
21540 GOSUB 20510
IF ZFileSysParm > 1 THEN _
RETURN
RETURN
21545 ZWasY$ = ZCancel$
CALL PutCom (ZCancel$ + ZCancel$ + ZCancel$)
DnldCompleted = ZFalse
GOTO 21250
21550 DnldCompleted = ZTrue
GOTO 21250
21560 DnldCompleted = ZFalse
WasD$ = ZLineFeed$ + _
"Caller aborted trans"
GOSUB 21710
IF ZFileSysParm > 1 THEN _
RETURN
GOTO 21545
'
' STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
'
' Modeled on lines 12975 to 12983 in RBBS-PC.BAS
21630 ZSubParm = 1
GOTO 21655
21640 ZSubParm = 3
GOTO 21655
21650 ZSubParm = 5
21655 CALL TPut
IF ZSubParm < 0 THEN _
ZFileSysParm = 2 : _
RETURN
IF ZSubParm = 8 THEN _
GOSUB 21660
RETURN
'
' STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
'
' Modeled on lines 12995 to 12997 in RBBS-PC.BAS
21660 ZSubParm = 1
CALL TGet
21665 IF ZSubParm < 0 THEN _
ZFileSysParm = 2
RETURN
21668 CALL PopCmdStack
GOTO 21665
21700 ZErrCode = 0
ZLastIndex = 0
RETURN
'
' **** COMMON LOCAL DISPLAY PRINT ***
'
' (formerly lines 1315 to 1320 in RBBS-PC.BAS
21710 NumReturns = 1
21720 CALL LPrnt (WasD$,NumReturns)
RETURN
'
' * Xmodem / CRC INTERFACE
'
' (formerly line 46000 in RBBS-PC.BAS
21750 XmodemChecksum = 0
CRCValue = 0
CALL Xmodem(WasWK$,XmodemChecksum,CRCValue,CRCHigh,CRCLow)
RETURN
'
' * UPDATE DOWNLOAD STATISTICS
'
' (formerly lines 50600 to 50614 in RBBS-PC.BAS
21760 GOSUB 21780
IF ZFileSysParm > 1 THEN _
RETURN
IF ZBatchTransfer THEN _
CALL LinesInFile (ZNodeWorkFile$,ZDownFiles) _
ELSE ZDownFiles = 1
IF NOT DnldCompleted THEN _
ZAutoLogoffReq = ZFalse : _
ZWasDF$ = " Aborted" : _
GOTO 21768
CALL LogPDown (PersonalDnld,1+ZAnsIndex-FirstDnld)
WasX = ((ZRatioRestrict# = 0) AND ZEnforceRatios)
IF NOT WasX THEN _
ZDnlds = ZDnlds + ZDownFiles : _
ZGlobalDLToday! = ZGlobalDLToday! + ZDownFiles : _
ZGlobalDnlds = ZGlobalDnlds + ZDownFiles : _
ZDLBytes! = ZDLBytes! + ZNumDnldBytes! : _
ZGlobalDLBytes! = ZGlobalDLBytes! + ZNumDnldBytes! : _
ZDLToday! = ZDLToday! + ZDownFiles : _
ZBytesToday! = ZBytesToday! + ZNumDnldBytes! : _
ZGlobalBytesToday! = ZGlobalBytesToday! + ZNumDnldBytes!
ZNumDnldBytes! = 0
CALL Muzak (6)
ZWasDF$ = " Downloaded"
IF (ZAnsIndex = LastDnld OR NOT ZConcatFIles) THEN _
CALL SkipLine (1) : _
CALL QuickTPut1 ("Download successful") : _
IF WasX THEN _
CALL QuickTPut1 ("but not counted against ratios")
21768 IF ZAutoDownInProgress THEN _
ZWasDF$ = " AUTO" + _
MID$(ZWasN$,2)
IF INSTR(ZWasN$,"Aborted") THEN _
ZAutoDownInProgress = 0
ZOutTxt$ = ""
21770 CALL AMorPM
IF NOT ZBatchTransfer THEN _
GOTO 21773
CALL OpenWork (2,ZNodeWorkFile$)
IF ZErrCode > 0 THEN _
RETURN
ZWasQ = 0
WHILE NOT EOF(2)
CALL ReadAny
ZWasQ = ZWasQ + 1
ZUserIn$(ZWasQ) = ZOutTxt$
WEND
21772 IF ZWasQ < 1 THEN _
ZBatchTransfer = ZFalse : _
RETURN
CALL OpenWork (2,ZUserIn$(ZWasQ))
IF ZErrCode > 0 THEN _
ZErrCode = 0 : _
ZWasQ = ZWasQ - 1 : _
GOTO 21772
ZBytesInFile# = LOF(2)
ZFileName$ = ZUserIn$(ZWasQ)
21773 CALL BreakFileName (ZFileName$,DR$,WasX$,Extension$,ZTrue)
ZWasZ$ = WasX$ + _
Extension$ + _
ZWasDF$ + _
" at " + _
ZTime$ + _
" using " + _
ZWasFT$ + _
STR$(ZBytesInFile#)
CALL UpdtCalr (ZWasZ$,2)
IF ZBatchTransfer THEN _
ZWasQ = ZWasQ - 1 : _
GOTO 21772
'CALL CheckRatio (ZFalse)
21774 IF ZMenuIndex = 6 THEN _
IF DnldCompleted THEN _
ZOutTxt$ = WasX$ : _
ZSubParm = 5 : _
CALL Library
RETURN
'
' ***** TURN ON INTERMEDIATE ECHO ****
'
' (formerly line 50620 in RBBS-PC.BAS
21780 IF ZEchoer$ = "I" THEN _
CALL SetEcho ("I")
'
' * RESTORE COMMUNICATIONS AFTER Switch TO 8 BIT
'
' (formerly between lines 50620 and 50630 in RBBS-PC.BAS
IF SwitchToEight THEN _
IF ZSwitchBack THEN _
OUT ZLineCntlReg, PrevLineCntl : _
CALL DelayTime (3) : _
ZEightBit = ZFalse : _
SwitchToEight = ZFalse
RETURN
'
' ***** TURN OFF INTERMEDIATE ECHO ****
'
' (formerly line 50630 in RBBS-PC.BAS
21790 IF ZEchoer$ = "I" THEN _
CALL SetEcho ("R")
RETURN
'
' ***** DIRECTORY SEARCH ****
'
' (formerly lines 52900 to 52920 in RBBS-PC.BAS
21800 WasCK = 2
21810 ZOutTxt$ = "Search for (in file name/desc, wildcards name only, [ENTER] quits)"
ZMacroMin = 99
GOSUB 21668
IF ZWasQ = 0 THEN _
RETURN
21820 WasRS$ = ZUserIn$(ZAnsIndex)
WildSearch = (INSTR(WasRS$,"*") > 0 OR INSTR(WasRS$,"?") > 0)
CALL AllCaps (WasRS$)
SearchString$ = WasRS$
SearchDate$ = ""
ZJumpSearching = ZFalse
WasA1$ = WasRS$
GOTO 21867
'
' ***** WasP - personal download ****
'
' (formerly lines 52950 to 52952 in RBBS-PC.BAS
21850 IF ZPersonalBegin < 1 OR ZPersonalLen < 1 THEN _
RETURN
DnldFlag = 0
PersonalDnld = ZTrue
21852 CALL PersFile (MID$(ZUserRecord$,ZPersonalBegin,ZPersonalLen),_
DnldFlag)
IF ZSubParm = -1 THEN _
ZFileSysParm = 7: _
RETURN
IF ZLastIndex <= 0 THEN _
GOTO 21854
ZConcatFIles = ZPersonalConcat
ZStopInterrupts = ZTrue
TimeLockExempt = ZTrue
GOSUB 20202
IF ZFileSysParm > 1 THEN _
GOTO 21854
TimeLockExempt = ZFalse
ZConcatFIles = ZFalse
GOTO 21852
21854 PersonalDnld = ZFalse
RETURN
'
' * WasN - COMMAND FROM FILES MENU (DISPLAY NEW FILES SINCE Last DIR DISPLAY)
'
' (formerly lines 53000 to 53070 in RBBS-PC.BAS
21860 WasCK = 1
21862 WasA1$ = RIGHT$(ZWasLM$,4) +_
LEFT$(ZWasLM$,2)
ZOutTxt$ = "Files on/after MMDDYY, [ENTER] = " + WasA1$
GOSUB 21668
CALL AllCaps (ZUserIn$(ZAnsIndex))
IF ZWasQ = 0 OR ZUserIn$(ZAnsIndex) = "S" THEN _
WasRS$ = ZWasLM$ : _
GOTO 21866
21865 IF LEN(ZUserIn$(ZAnsIndex)) <> 6 THEN _
GOTO 21862
WasA1$ = ZUserIn$(ZAnsIndex)
WasRS$ = RIGHT$(WasA1$,2) + _
LEFT$(WasA1$,4)
ListNew = ZTrue
21866 SearchDate$ = WasRS$
SearchString$ = ""
ZJumpSearching = ZFalse
21867 CALL GetDirs (NOT ZExpertUser)
IF ZWasQ = 0 THEN _
RETURN
21871 CALL ConvertDir (ZAnsIndex)
ZListDir = ZTrue
ListNew = ZTrue
ZSearchingAll = ZFalse
21875 ZWasZ$ = ZUserIn$(ZAnsIndex)
IF NOT ZSearchingAll THEN _
IF ZWasZ$ = "ALL" THEN _
IF NOT ZLimitSearchToFMS THEN _
GOSUB 21890
21880 WasQX = ZAnsIndex
GOSUB 20157
IF ZFileSysParm > 1 THEN _
RETURN
ZAnsIndex = ZAnsIndex + 1
IF ZAnsIndex <= ZLastIndex THEN _
GOTO 21875
ListNew = ZFalse
SearchString$ = ""
SearchDate$ = ""
RETURN
21890 WasG = ZAnsIndex
CALL GetAll (ZUserIn$(),WasG)
ZSearchingAll = ZTrue
ZLastIndex = WasG
ZAnsIndex = ZAnsIndex + 1
RETURN
'
' * MAIN FILE SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
'
' (formerly lines 13000 to 13500 in RBBS-PC.BAS
21900 IF ZDebug THEN _
ZOutTxt$ = "RBBSSUB5 DEBUG Error Trap Entry ERL=" + _
STR$(ZWasEL) + _
" ERR=" + _
STR$(ZErrCode) : _
IF ZPrinter THEN _
CALL Printit(ZOutTxt$) _
ELSE CALL LPrnt(ZOutTxt$,1)
IF ZWasEL = 20126 AND ZErrCode = 53 THEN _
GOTO 20142
IF ZWasEL = 20242 AND ZErrCode = 62 THEN _
CALL UpdtCalr (ZFileSecFile$ + " bad format!",2) : _
GOTO 20247
IF ZWasEL = 20263 THEN _
ZOutTxt$ = "<Download aborted>" : _
DnldCompleted = ZFalse : _
GOTO 20390
IF ZWasEL = 20452 AND ZErrCode = 53 THEN _
GOTO 20451
IF ZWasEL = 20560 AND ZErrCode = 67 THEN _
GOTO 20451
IF ZWasEL = 20560 AND ZErrCode = 70 THEN _
IF VAL(ZFreeSpace$) > 1999 THEN _
GOTO 20610 _
ELSE CALL QuickTPut1 ("No room for uploads. Try tomorrow.") : _
GOTO 21700
IF ZWasEL = 20620 THEN _
GOTO 20670
IF ZWasEL = 20650 THEN _
GOTO 20670
IF ZWasEL = 20736 AND ZErrCode = 53 THEN _
GOTO 21700
IF ZWasEL = 20900 AND ZErrCode = 75 THEN _
GOTO 21230
IF ZWasEL = 20900 AND ZErrCode = 70 THEN _
CALL QuickTPut1 ("No room for uploads. Try tomorrow.") : _
GOTO 21230
IF ZWasEL = 21131 OR ZWasEL = 21220 THEN _
ZErrCode = 0 : _
GOTO 21230
IF ZWasEL = 21480 THEN _
CALL LogError : _
IF ZErrCode = 57 THEN _
CALL QuickTPut1 ("Error reading file. Aborting download") : _
DnldCompleted = ZFalse : _
GOTO 21230
21910 CALL LogError
CALL QuickTPut1 (ZCallersRecord$)
ZFileSysParm = 3
RETURN
21920 ' EXIT RBBS-PC FILE SUBSYSTEM
END SUB
63100 ' $SUBTITLE: 'DoorReturn - Subroutine to process requests from a door'
' $PAGE
'
' NAME -- DoorReturn
'
' INPUTS -- PARAMETER MEANING
' DOUTx.DEF File of requests
'
' OUTPUTS -- ZUserSecLevel Revised Security Level
'
' PURPOSE -- To give Doors a stable way to make requests
' to the host.
'
SUB DoorReturn STATIC
IF ZPrivateDoor OR NOT ZExitToDoors THEN _
EXIT SUB
ZFileName$ = "DOUT" + ZNodeID$ + ".DEF"
CALL FindIt (ZFileName$)
IF NOT ZOK THEN _
EXIT SUB
63105 IF EOF(2) THEN _
GOTO 63195
CALL ReadParms (ZOutTxt$(),2,1)
IF ZErrCode > 0 THEN _
GOTO 63115
IF LEN(ZOutTxt$(1)) < 2 THEN _
EXIT SUB
ZUserIn$ = LEFT$(ZOutTxt$(1),2) + ","
WasX = INSTR("SL,UR,",ZUserIn$)
IF WasX = 0 THEN _
GOTO 63105
WasX = WasX\3 + 1
ON WasX GOTO 63110,63115
GOTO 63105
63110 WasX$ = LEFT$(ZOutTxt$(2),1) ' ZWasSL = Security Level
CALL CheckInt (ZOutTxt$(2))
IF ZErrCode > 0 THEN _
GOTO 63105
IF WasX$ = "+" OR WasX$ = "-" THEN _
ZWasA = ZUserSecLevel + ZTestedIntValue _
ELSE ZWasA = ZTestedIntValue
IF ZWasA < ZSysopSecLevel THEN _
ZAdjustedSecurity = (ZWasA <> ZUserSecLevel) : _
IF ZAdjustedSecurity THEN _
ZUserSecLevel = ZWasA : _
MID$(ZUserRecord$,47,2) = MKI$(ZWasA) : _
CALL QuickTPut1 ("Security changed to" + STR$(ZWasA)) : _
CALL UpdtCalr ("Door reset security to "+STR$(ZWasA),2)
GOTO 63105
63115 IF LEN(ZOutTxt$(1)) < 7 THEN _
GOTO 63105
IF MID$(ZOutTxt$(1),3,1) <> "(" THEN _
GOTO 63105
WasX = INSTR(4,ZOutTxt$(1),":")
IF WasX < 1 THEN _
GOTO 63105
CALL CheckInt (MID$(ZOutTxt$(1),4,WasX-4))
IF ZErrCode > 0 THEN _
GOTO 63105
IF ZTestedIntValue > 128 OR ZTestedIntValue < 1 THEN _
GOTO 63105
ZWasA = ZTestedIntValue
CALL CheckInt (MID$(ZOutTxt$(1),WasX+1))
IF ZErrCode > 0 OR ZTestedIntValue < 1 OR ZTestedIntValue > 128 THEN _
GOTO 63105
MID$(ZUserRecord$,ZWasA,ZTestedIntValue) = LEFT$(ZOutTxt$(2) + _
SPACE$(ZTestedIntValue),ZTestedIntValue)
CALL UpdtCalr ("Door set UR"+STR$(ZWasA)+":"+STR$(ZTestedIntValue)+" to <"+ZOutTxt$(2)+">",2)
GOTO 63105
63195 CALL KillWork (ZFileName$)
ZErrCode = 0
END SUB
63200 ' $SUBTITLE: 'WildCard -- Matches string to a pattern'
' $PAGE
' NAME -- WildCard
'
' INPUTS -- PARAMETER MEANING
' Pattern$ PATTERN TO CHECK
' Strng$ STRING TO FIE
'
' OUTPUTS -- ZOK True IF MATCH Found
' False IF No MATCH WAS Found
'
' PURPOSE Determine whether a string is an instance in a pattern
' supported patterns are only "?" which requires a
' character but can be any, and "*" which matches any-
' thing, including a null string. Anything else in a
' sting must be an exact match. Supports reverse
' wildcards.
'
'
SUB WildCard (Pattern$,Strng$) STATIC
63285 ZOK = ZTrue
PatPos = 0
StrPos = 0
Inc = 1
WasKT = 0
WasP = LEN(Pattern$)
WasL = LEN(Strng$)
63286 PatPos = PatPos + Inc
StrPos = StrPos + Inc
WasKT = WasKT + 1
IF WasKT > WasL THEN _
GOTO 63288
ZUserIn$ = MID$(Pattern$,PatPos,1)
IF ZUserIn$ = "*" THEN _
GOTO 63289
63287 IF ZUserIn$ <> "?" AND MID$(Strng$,StrPos,1) <> ZUserIn$ THEN _
ZOK = ZFalse : _
EXIT SUB
GOTO 63286
63288 IF PatPos >= LEN(Pattern$) OR PatPos < 1 THEN _
EXIT SUB
IF MID$(Pattern$,PatPos,1) <> "*" THEN _
ZOK = ZFalse : _
EXIT SUB
63289 IF PatPos <> WasP THEN _ ' Reverse search
Inc = -1 : _
WasP = PatPos : _
PatPos = LEN(Pattern$) + 1 : _
StrPos = LEN(Strng$) + 1 : _
WasKT = 0 : _
GOTO 63286
END SUB
63300 ' $SUBTITLE: 'BreakFileName - sub to split file name into components'
' $PAGE
'
' NAME -- BreakFileName
'
' INPUTS -- PARAMETER MEANING
' FileSpec$ FULL NAME OF FILE
' ForJoining True IF WANT PARTS FORMATTED FOR
' FORMING FILE NAMES
' OUTPUTS -- DrvPath$ DRIVE AND PATH
' Prefix$ PREFIX OF FILE NAME
' Extension$ EXTENSION OF FILE NAME
'
' (E.G. "C:\RBBS\ARCE.COM" HAS "C:\RBBS" AS DRIVE AND PATH,
' "ARCE" AS PREFIX OF THE FILE NAME, AND
' "COM" AS THE EXTENSION OF THE FILE NAME.
'
' JOINED FORMAT IS C:\RBBS\,ARCE,.COM
'
' PURPOSE -- To break a file name into its component parts
' of drive/path, prefix, and extension
'
'
SUB BreakFileName (FileSpec$,DrvPath$,Prefix$,Extension$,ForJoining) STATIC
CALL AllCaps (FileSpec$)
DrvPath$ = ""
Prefix$ = ""
Extension$ = ""
CALL TrimTrail (FileSpec$,"\")
WasL = LEN(FileSpec$)
IF WasL < 1 THEN _
EXIT SUB
CALL FindLast (FileSpec$,"\",WasX,WasY)
IF WasX < 1 THEN _
IF MID$(FileSpec$,2,1) = ":" THEN _
DrvPath$ = LEFT$(FileSpec$,1) : _
ZWasS = 3 _
ELSE ZWasS = 1 _
ELSE DrvPath$ = LEFT$(FileSpec$,WasX-1) : _
ZWasS = WasX + 1 : _
IF WasY = 1 THEN _
DrvPath$ = DrvPath$ + "\"
WasX = INSTR(FileSpec$ + ".",".")
IF WasX < WasL THEN _
Extension$ = MID$(FileSpec$,WasX + 1)
IF ZWasS <= WasL THEN _
IF WasX >= ZWasS THEN _
Prefix$ = MID$(FileSpec$,ZWasS,WasX - ZWasS)
IF NOT ForJoining THEN _
EXIT SUB
IF LEN(DrvPath$) = 1 THEN _
IF DrvPath$ <> "\" THEN _
DrvPath$ = DrvPath$ + _
":"
IF INSTR(DrvPath$,"\") > 0 AND RIGHT$(DrvPath$,1) <> "\" THEN _
DrvPath$ = DrvPath$ + _
"\"
IF LEN(Extension$) > 0 THEN _
Extension$ = "." + _
Extension$
END SUB
63310 ' $SUBTITLE: 'RestoreCom - sub to restore comm port'
' $PAGE
'
' NAME -- RestoreCom
'
' INPUTS -- none
'
' OUTPUTS -- none
'
' PURPOSE -- To restore communications port after an external
' program may have left it in altered state
'
SUB RestoreCom STATIC
Parity$ = MID$(",N,8,1,E,7,1",7 + 6 * ZEightBit,6)
IF ZLocalUser THEN _
EXIT SUB
CALL SetBaud
IF NOT ZFossil THEN _
CALL OpenCom(ZTalkToModemAt$,Parity$)
END SUB
63320 ' $SUBTITLE: 'ShellExit - sub to shell out from RBBS'
' $PAGE
'
' NAME -- ShellExit
'
' INPUTS -- ShellTem$ String to invoke shell with
'
' OUTPUTS -- none
'
' PURPOSE -- Delay so that strings can finish printing. Restore comm
' port on return
'
SUB ShellExit (ShellTem$) STATIC
CALL DelayTime (8 + ZBPS)
IF NOT ZLocalUser THEN _
IF ZFossil THEN _
CALL FOSExit(ZComPort) _
ELSE CLOSE 3 : _
OUT ZModemCntlReg,INP(ZModemCntlReg) OR 1
CLOSE 2
CALL MetaGSR (ShellTem$,ZFalse)
SHELL ShellTem$
IF ZFossil THEN _
IF NOT ZLocalUser THEN _
CALL FOSinit(ZComPort,Result) : _
IF Result = -1 THEN _
CALL PScrn("ERROR INITIALIZING FOSSIL AFTER EXTERNAL Protocol") : _
SYSTEM
CALL DelayTime (2)
CALL RestoreCom
END SUB
63330 ' $SUBTITLE: 'ReadMacro - sub to read macro'
' $PAGE
'
' NAME -- ReadMacro
'
' INPUTS -- PARAMETER MEANING
'
' OUTPUTS -- ZOutTxt$ LINE TO PROCESS IN MACRO
' ZMacroActive FLAG WHETHER IN A MACRO
'
' PURPOSE -- Reads in a line from macro file (#6) and processes
' macro commands, which are:
' *0 - display what follows, no carriage return
' *1 - display what follows with carriage return
' *B - display block that follows
' *F - display File
' WT - wait specified # of seconds
' >> - append following block to specified file
' ST - stack following (with carriage return)
' ON - define case
' == - case value that applies to following block
' M! - execute following macro
' M@ - abort macro processing
' EY - Echo on (yes)
' EN - Echo off (no)
' /* - comment line skipped in processing
' TK - Turbo key on (if user preference)
' << - Read from file into a form
' := - Assign value to work variable
'
SUB ReadMacro STATIC
IF ZMacroTemplate$ <> "" THEN _
GOTO 63392
IF ZDistantTGet = 2 THEN _
GOTO 63349
63336 GOSUB 63395
IF NOT ZMacroActive THEN _
ZMacroEcho = ZTrue : _
EXIT SUB
IF LEN(ZOutTxt$) < 3 THEN _
GOTO 63398
WasX$ = RIGHT$(ZOutTxt$,LEN(ZOutTxt$)-3)
IF CompareVar > 0 THEN _
IF NOT CaseExecute THEN _
IF LEFT$(ZOutTxt$,3) = ZSmartTextCode$+"==" THEN _
GOTO 63370 _
ELSE IF LEFT$(ZOutTxt$,7) = ZSmartTextCode$ + "END ON" THEN _
CompareVar = 0 : _
GOTO 63336 _
ELSE GOTO 63336
IF LEFT$(ZOutTxt$,1) <> ZSmartTextCode$ THEN _
GOTO 63398
CALL CheckInt (MID$(ZOutTxt$,2))
IF ZErrCode > 0 THEN _
GOTO 63398
IF ZTestedIntValue > 0 AND ZTestedIntValue <= ZMaxWorkVar THEN _
ZOutTxt$ = WasX$ : _ ' Macro command ask
ZForceKeyboard = ZTrue : _
ZMacroSave = ZTestedIntValue : _
ZLinesPrinted = 1 : _
ZNonStop = (ZPageLength < 1) : _
EXIT SUB
ON (1+INSTR("*0*1*B*FWT>>STON==M!M@EYEN/*TK<<:=LVNVCV",MID$(ZOutTxt$,2,2)))\2 GOTO _
63345, _ ' Display with no Carriage Return
63347, _ ' Display with Carriage Return
63340, _ ' Display Block
63348, _ ' Display File
63343, _ ' Wait # of seconds
63350, _ ' Append to file
63355, _ ' Stack
63360, _ ' Case
63370, _ ' Case Comparison
63375, _ ' Macro execute
63380, _ ' Macro Abort
63383, _ ' Macro Echo on
63385, _ ' Macro Echo off
63336, _ ' Macro Comment
63387, _ ' Turbo Key allowed
63390, _ ' Form read
63362, _ ' Assign value to work var
63363, _ ' LV list verify
63364, _ ' NV number verify
63364 ' CV character verify
GOTO 63398
63338 ZOutTxt$ = WasX$
63339 ZSubParm = 4
CALL TPut
RETURN
63340 WasX$ = ZSmartTextCode$ + "END" ' Print Block
GOSUB 63395
WHILE ZMacroActive AND LEFT$(ZOutTxt$,4) <> WasX$
GOSUB 63339
CALL SkipLine (1)
GOSUB 63395
WEND
GOTO 63336
63343 CALL CheckInt (WasX$) ' Delay
IF ZErrCode = 0 THEN _
CALL DelayTime (ZTestedIntValue)
GOTO 63336
63345 GOSUB 63338 ' Print Line
GOTO 63336
63347 GOSUB 63338
CALL SkipLine (1)
GOTO 63336
63348 CALL Trim (WasX$) ' Print File
CALL FINDITX (WasX$,7)
IF NOT ZOK THEN _
GOTO 63336
ZLinesPrinted = 1
ZNo = ZFalse
ZNonStop = (ZNonStop OR ZPageLength < 1)
63349 WHILE (NOT EOF(7) AND (NOT ZNo) AND (ZNonStop OR (ZLinesPrinted < ZPageLength)) AND (ZSubParm > -1))
CALL ReadDir (7,1)
GOSUB 63396
ZSubParm = 5
CALL TPut
WEND
ZDistantTGet = 0
IF ZSubParm < 0 THEN _
EXIT SUB
IF EOF(7) OR ZNo THEN _
CLOSE 7 : _
ZNo = ZFalse : _
GOTO 63336
ZDistantTGet = 2
CALL PauseExit
EXIT SUB
63350 ZWasEN$ = WasX$ ' Append to file
WasX = INSTR(ZWasEN$," /FL")
OverStrike = (WasX > 0)
IF OverStrike THEN _
ZWasEN$ = LEFT$(ZWasEN$,WasX-1) + RIGHT$(ZWasEN$,LEN(ZWasEN$)-WasX-3)
CALL Trim (ZWasEN$)
CALL LockAppend
IF ZErrCode > 0 THEN _
GOTO 63352
GOSUB 63395
WasX$ = ZSmartTextCode$ + "END"
WHILE ZMacroActive AND LEFT$(ZOutTxt$,4) <> WasX$
CALL PrintWorkA (ZOutTxt$)
GOSUB 63395
WEND
63352 CALL UnLockAppend
OverStrike = ZFalse
GOTO 63336
63355 ZCommPortStack$ = ZCommPortStack$ + WasX$ + ZCarriageReturn$ ' STack
GOTO 63336
63360 CompareVar = VAL(WasX$)
CALL AllCaps (WasX$)
IF CompareVar < 1 OR CompareVar > ZMaxWorkVar THEN _
CompareVar = 0
GOTO 63336
63362 CALL CheckInt (WasX$)
WasX = INSTR(WasX$," ")
IF WasX > 0 AND ZTestedIntValue > 0 AND ZTestedIntValue <= ZMaxWorkVar THEN _
ZGSRAra$(ZTestedIntValue) = RIGHT$(WasX$,LEN(WasX$)-WasX)
GOTO 63336
63363 ZVerifyList$ = WasX$
CALL Trim (ZVerifyList$)
GOTO 63365
63364 CALL Trim (WasX$)
WasX = INSTR(WasX$," ")
IF WasX = 0 THEN _
GOTO 63336
ZVerifyLow$ = LEFT$(WasX$,WasX-1)
ZVerifyHigh$ = RIGHT$(WasX$,LEN(WasX$)-WasX)
CALL Trim (ZVerifyLow$)
CALL Trim (ZVerifyHigh$)
ZVerifyNumeric = (MID$(ZOutTxt$,2,1) = "N")
63365 ZVerifying = ZTrue
GOTO 63336
63370 IF CompareVar = 0 THEN _ ' Compare Case
GOTO 63336
ZWasDF$ = ZGSRAra$(CompareVar)
CALL AllCaps (ZWasDF$)
CaseExecute = (WasX$ = ZWasDF$)
GOTO 63336
63375 CALL Trim (WasX$) ' Execute Macro
CALL Macro (WasX$,WasX)
GOTO 63336
63380 ZMacroActive = ZFalse ' Abort Macro
GOTO 63398
63383 ZMacroEcho = ZTrue
GOTO 63336
63385 ZMacroEcho = ZFalse
GOTO 63336
63387 ZTurboKey = -ZTurboKeyUser 'TK Turbo Key
GOTO 63336
63390 ZUserIn$ = ZOutTxt$
ZUserIn$(5) = ""
ZUserIn$(6) = ""
ZWasQ = 1
ZStoreParseAt = 1
CALL ParseIt
IF ZWasQ < 4 THEN _
GOTO 63336
WasX$ = ZSmartTextCode$ + "END"
GOSUB 63397
ZMacroTemplate$ = ""
WHILE ZMacroActive AND LEFT$(ZOutTxt$,4) <> WasX$
ZMacroTemplate$ = ZMacroTemplate$ + ZOutTxt$ + ZCrLf$
GOSUB 63397
WEND
WasX = VAL(ZUserIn$(4))
VarLen = (ZUserIn$(3) <> "/F")
CALL FindIt (ZUserIn$(2))
IF (WasX < 1) OR (NOT ZOK) OR (VarLen AND WasX > ZMaxWorkVar) THEN _
ZMacroTemplate$ = "" : _
GOTO 63336
PauseEachRec = (ZUserIn$(6) = "/1")
63392 CALL FormRead (ZMacroTemplate$,ZUserIn$(2),NOT VarLen,WasX,(ZUserIn$(5) = "/FL"),PauseEachRec)
IF ZMacroTemplate$ <> "" THEN _
EXIT SUB _
ELSE GOTO 63336
63395 GOSUB 63397
GOSUB 63396
RETURN
63396 CALL SmartText (ZOutTxt$,ZFalse, OverStrike)
CALL MetaGSR (ZOutTxt$,OverStrike)
RETURN
63397 IF EOF(6) THEN _ ' Read next line in macro
ZMacroActive = ZFalse _
ELSE CALL ReadDir (6,1) : _
ZMacroActive = (ZErrCode = 0)
RETURN
63398 END SUB ' Not Macro command - pass to normal processing
63400 ' $SUBTITLE: 'LockAppend - prepares for file append'
' $PAGE
'
' NAME -- LockAppend
'
' INPUTS -- ZWasEN$ Name of file to append to
'
' OUTPUTS -- none
'
' PURPOSE -- Locks and opens file to append to
'
SUB LockAppend STATIC
WasBX = &H4
ZSubParm = 9
CALL FileLock
ZErrCode = 0
CALL OpenWorkA (ZWasEN$)
END SUB
63410 ' $SUBTITLE: 'UnLockAppend - cleans up after file append'
' $PAGE
'
' NAME -- UnLockAppend
'
' INPUTS -- none
'
' OUTPUTS -- none
'
' PURPOSE -- Unlocks and close file appending to
'
SUB UnLockAppend STATIC
WasBX = &H4
ZSubParm = 10
CALL FileLock
CLOSE 2
END SUB
63420 ' $SUBTITLE: 'FormRead - Reads from a file into a form'
' $PAGE
'
' NAME -- FormRead
'
' INPUTS -- Template$ Display formvoke shell with
' FilName$ Data file to get values from
' FixedLength Whether file is fixed length
' DataVar # bytes data if fixed length; # fields
' if variable length
' OverStrike Whether typeover into form or insert
' RecPause Whether pause after every record displayed
' otherwise when screen fills
' OUTPUTS -- (displays data base records)
'
' PURPOSE -- Allows field oriented data base data to be displayed
' in a human readable format by substituting field
' data into template or form
'
SUB FormRead (Template$,FilName$,FixedLength,DataVar,OverStrike,RecPause) STATIC
63422 IF EOF(2) OR ZNo OR (ZErrCode > 0) OR (ZSubParm < 0) THEN _
Template$ = "" : _
EXIT SUB
IF FixedLength THEN _
CALL ReadDir (2,1) : _
ZGSRAra$(1) = ZOutTxt$ _
ELSE CALL ReadParms (ZGSRAra$(),DataVar,1)
WasX$ = Template$
CALL SmartText (WasX$,ZTrue,OverStrike)
CALL MetaGSR (WasX$,OverStrike)
CALL BufAsUnit (WasX$)
IF RecPause OR (ZPageLength > 0 AND (ZLinesPrinted >= ZPageLength-1)) THEN _
CALL PauseExit : _
EXIT SUB
GOTO 63422
END SUB
63440 ' $SUBTITLE: 'BufAsUnit - prints string with no pauses'
' $PAGE
'
' NAME -- BufAsUnit
'
' INPUTS -- Strng$ String to print
'
' OUTPUTS -- none
'
' PURPOSE -- Prints string with embedded carriage returns.
' Will never pause. Used to print when can't call TGet
'
SUB BufAsUnit (Strng$) STATIC
WasL = LEN(Strng$)
IF WasL < 1 THEN _
EXIT SUB
StartByte = 1
63450 CRat = INSTR(StartByte,Strng$,ZCarriageReturn$)
IF CRat > 0 AND CRat < WasL THEN _
CRFound = (MID$(Strng$,CRat + 1,1) = ZLineFeed$) _
ELSE CRFound = ZFalse
EOLlen = -2 * CRFound
IF CRFound THEN _
EOD = CRat _
ELSE EOD = WasL + 1
NumBytes = EOD - StartByte
ZOutTxt$ = MID$(Strng$,StartByte,NumBytes)
ZSubParm = 4
CALL TPut
CALL SkipLine (-(CRFound))
IF ZRet THEN _
EXIT SUB
StartByte = EOD + EOLlen
IF StartByte <= WasL THEN _
GOTO 63450
END SUB
63460 ' Check if macro exists and execute if does
SUB MacroExe (Strng$) STATIC
CALL Trim (Strng$)
CALL Macro (Strng$,Found)
IF NOT Found THEN _
EXIT SUB
CALL FdMacExe
END SUB
63462 ' Unconditionally executes a macro
SUB FdMaCExe STATIC
ZOutTxt$ = ""
ZMacroEcho = ZFalse
ZSubParm = 1
CALL TGet
END SUB
63465 ' Forces a keyboard pause inside a macro
SUB PauseExit STATIC
ZSubParm = 4
ZTurboKey = -ZTurboKeyUser
ZOutTxt$ = ZMorePrompt$ + ">" + MID$("? ! ",2*ZTurboKey+1,2)
ZForceKeyboard = ZTrue
ZNoAdvance = ZTrue
CALL TPut
ZLinesPrinted = 0
ZUserIn$ = ""
END SUB
63470 ' $SUBTITLE: 'SetPrompt - sub to set prompts based on user security'
' $PAGE
'
' NAME -- SetPrompt
'
' INPUTS -- PARAMETER MEANING
' ZBegMain POSITION START OF MAIN CMDS
' ZBegFile POSITION START OF FILE CMDS
' ZBegUtil POSITION START OF UTIL CMDS
' ZBegLibrary POSITION START OF Library CMDS
'
' OUTPUTS -- PRESENT.OPTS$ DISPLAY WHAT USER CAN DO (1st)
' CALLERS.OPTS$ DISPLAY WHAT USER CAN DO (2nd)
' ZMainOpts$ MAIN OPTS USER CAN DO
' ZFileOpts$ FILE OPTS USER CAN DO
' ZUtilOpts$ UTIL OPTS USER CAN DO
' ZLibOpts$ Library OPTS USER CAN DO
'
' PURPOSE -- Sets command line display of what user can do by
' section and display of what all user can do
'
SUB SetPrompt STATIC
First = ZBegMain
Last = ZBegFile - 1
CALL SetOpts (ZMainOpts$,ZInvalidMainOpts$,First,Last)
First = ZBegFile
Last = ZBegUtil - 1
CALL SetOpts (ZFileOpts$,ZInvalidFileOpts$,First,Last)
First = ZBegUtil
Last = ZBegLibrary - 1
CALL SetOpts (ZUtilOpts$,ZInvalidUtilOpts$,First,Last)
First = ZBegLibrary
Last = ZBegLibrary + 6
CALL SetOpts (ZLibOpts$,ZInvalidLibraryOpts$,First,Last)
First = 50
Last = 56
CALL SetOpts (SysOpt$,ZInvalidSysOpts$,First,Last)
First = 46
Last = 49
CALL SetOpts (GlobalOpts$,InvalidGlobalOpts$,First,Last)
IF LEN(SysOpt$) > 0 THEN _
ZSystemOpts$ = "Sysop: " + _
SysOpt$
ZMainOpts$ = GlobalOpts$ + _
ZMainOpts$
ZFileOpts$ = GlobalOpts$ + _
ZFileOpts$
ZUtilOpts$ = GlobalOpts$ + _
ZUtilOpts$
ZLibOpts$ = GlobalOpts$ + _
ZLibOpts$
CALL SortString (SysOpt$)
CALL SortString (ZMainOpts$)
ZMainOpts$ = ZMainOpts$ + _
SysOpt$
CALL SortString (ZFileOpts$)
CALL SortString (ZUtilOpts$)
CALL SortString (ZLibOpts$)
CALL AddCommas (ZMainOpts$)
CALL AddCommas (ZFileOpts$)
CALL AddCommas (ZUtilOpts$)
CALL AddCommas (ZLibOpts$)
ZDirPrompt$ = "What directory(s) (" + _
MID$("U)pload,A)ll,L)ist,E)xtended +/-, [Q]uit)",8 * (ZUserSecLevel => ZMinSecToView) + 9)
ZQuitPromptExpert$ = "QUIT C,S, or to F,[M],U,@"
ZQuitPromptNovice$ = "QUIT C)onference, S)ession or to section " + _
"F)ile, [M]ain, U)til or @)Library"
ZQuitList$ = "FMUS@C"
IF ZUserSecLevel < ZOptSec(18) THEN _
ZQuitPromptExpert$ = LEFT$(ZQuitPromptExpert$,23) : _
ZQuitPromptNovice$ = LEFT$(ZQuitPromptNovice$,61) : _
MID$(ZQuitList$,5) = " "
IF ZUserSecLevel < ZOptSec(15) THEN _
ZQuitPromptExpert$ = LEFT$(ZQuitPromptExpert$,22) + _
MID$(ZQuitPromptExpert$,25) : _
ZQuitPromptNovice$ = LEFT$(ZQuitPromptNovice$,56) + _
MID$(ZQuitPromptNovice$,63) : _
MID$(ZQuitList$,3,1) = " "
IF ZUserSecLevel < ZOptSec(6) THEN _
ZQuitPromptExpert$ = LEFT$(ZQuitPromptExpert$,16) + _
MID$(ZQuitPromptExpert$,19) : _
ZQuitPromptNovice$ = LEFT$(ZQuitPromptNovice$,41) + _
MID$(ZQuitPromptNovice$,49) : _
MID$(ZQuitList$,1,1) = " "
CALL SetSection
END SUB
63480 ' $SUBTITLE: 'NoPath - detects whether string has path'
' $PAGE
'
' NAME -- NoPath
'
' INPUTS -- Strng$ String to check
'
' OUTPUTS -- HAS.NONE True if has no path
'
' PURPOSE -- Detects whether have path. Used when shouldn't
' be any
'
SUB NoPath (Strng$,HasPath) STATIC
CALL BreakFileName (Strng$,DrvPath$,Prefix$,Ext$,ZFalse)
HasPath = (DrvPath$ <> "")
END SUB
63490 ' $SUBTITLE: 'FindIt - Determine whether file exists'
' $PAGE
'
' NAME -- FindIt
'
' INPUTS -- FilName$ File name to check
'
' OUTPUTS -- ZOK True if file exists. Opened as #2 if does
'
' PURPOSE -- Determine whether file exists and open as standard work
' file if it does (#2)
'
SUB FindIt (FilName$) STATIC
CALL FindItX (FilName$,2)
END SUB
63495 ' $SUBTITLE: 'TimeBack - Give time back to the user'
' $PAGE
'
' NAME -- TimeBack
'
' INPUTS -- Index = 1 Set start of time (begin give back)
' = 2 Give back time from defined start
'
' OUTPUTS -- ZTimeCredits! Number of seconds to credit with
' ZSecsPerSession! Number of seconds in current session
'
' PURPOSE -- Give time back to the user (e.g. sysop initiated chat)
'
SUB TimeBack (Index) STATIC
IF Index = 1 THEN _
CALL TimeRemain (MinsRemaining) : _
ZWasQ! = ZSecsUsedSession! : _
EXIT SUB
CALL TimeRemain (MinsRemaining)
WasX! = (ZSecsUsedSession! - ZWasQ!)
ZTimeCredits! = ZTimeCredits! + WasX!
END SUB
63500 ' $SUBTITLE: 'CmdStackPushPop - Save/restore command stack'
' $PAGE
'
' NAME -- CmdStackPushPop
'
' INPUTS -- Index = 1 Save command stack
' = 2 Restore command stack
' ZAnsIndex
' ZLastIndex
' ZUserIn$()
'
' OUTPUTS -- ZUserIn$() Stacked commands
' ZAnsIndex
' ZLastIndex
'
' PURPOSE -- Save restore a command stack list when need to input
' another list in middle of previous list processing
'
SUB CmdStackPushPop (Index) STATIC
IF Index = 1 THEN _
OrigLastIndex = ZLastIndex : _ ' save
OrigIndex = ZAnsIndex : _
FOR WasI = 1 TO OrigLastIndex : _
ZOutTxt$(WasI) = ZUserIn$(WasI) : _
NEXT : _
EXIT SUB
ZLastIndex = OrigLastIndex ' restore
ZAnsIndex = OrigIndex
FOR WasI = 1 TO OrigLastIndex
ZUserIn$(WasI) = ZOutTxt$(WasI)
NEXT
END SUB
63510 ' $SUBTITLE: 'VerifyAns - edits an answer'
' $PAGE
'
' NAME -- VerifyAns
' MEANING
' INPUTS -- ZVerifying Whether verifying
' ZUserIn$(1) Response verifying
' ZVerifyList$ List of appropriate answers. 1st
' char is what separates answers
' ZVerifyNumeric Verify that is a valid integer
' if false, then verifying that
' a string is between 2 values
' ZVerifyLow$ Lowest ok value of string
' ZVerifyHigh$ Highest ok value of string
'
' OUTPUTS -- ZOK Whether passes verification
' ZVerifyList$ Empties if ok
' ZVerifying Sets false if ok
' ZVerifyNumeric Sets false if ok
'
' PURPOSE -- Processes edits on a user input
'
SUB VerifyAns STATIC
ZOK = ZTrue
IF NOT ZVerifying THEN _
EXIT SUB
Temp$ = ZUserIn$(1)
CALL AllCaps (Temp$)
IF ZVerifyList$ <> "" THEN _
WasX$ = LEFT$(ZVerifyList$,1) : _
ZOK = (INSTR (ZVerifyList$, WasX$+Temp$+WasX$) > 0) _
ELSE IF ZVerifyNumeric THEN _
CALL CheckInt (ZUserIn$) : _
ZOK = (ZErrCode = 0 AND _
ZTestedIntValue >= VAL(ZVerifyLow$) AND _
ZTestedIntValue <= VAL(ZVerifyHigh$)) _
ELSE ZOK = (Temp$ >= ZVerifyLow$ AND Temp$ <= ZVerifyHigh$)
IF ZOK THEN _
ZVerifyList$ = "" : _
ZVerifying = ZFalse : _
ZVerifyNumeric = ZFalse
END SUB
63520 ' $SUBTITLE: 'BinSearch - binary search a file'
' $PAGE
'
' NAME -- BinSearch
' MEANING
' INPUTS -- PassedSearchFor$ Value you are looking for
' StartPos Starting position of sort key
' NumChars # of characters in sort key
' LenRec Length of record of data file searching
' High Record # of last record
' ZFastTabs$ In a binary integer subfield (2 bytes)
' holds 1st record when might find
' a key beginning with a particular
' character (0-9,A-Z). Empty if
' no Fast Tab exists for the file.
'
' OUTPUTS -- RecFoundAt Record # value found at (0 if none)
' RecFound$ Full data record when found
'
' PURPOSE -- Binary searches work file #2 for a key value in a
' data file that is sorted on a key field
'
SUB BinSearch (PassedSearchFor$,StartPos, NumChars, LenRec, High, RecFoundAt, RecFound$) STATIC
SearchFor$ = LEFT$(PassedSearchFor$,NumChars)
SearchFor$ = SearchFor$ + SPACE$(NumChars-LEN(SearchFor$))
FIELD #2, LenRec AS SearchRec$
Low = 0
IF LEN(ZFastTabs$) < 72 THEN _
GOTO 63522
WasX$ = LEFT$(SearchFor$,1)
WasX = INSTR("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",WasX$)
IF WasX > 0 THEN _
Low = CVI(MID$(ZFastTabs$,1+2*(WasX-1),2)) - 1
IF WasX < 36 THEN _
High = CVI(MID$(ZFastTabs$,1+2*WasX,2))
63522 RecFoundAt = 0
WasX$ = SPACE$ (NumChars)
Done = ZFalse
WHILE NOT Done
WasI = INT(((High + Low) / 2) + .5)
GET 2, WasI
LSET WasX$ = MID$(SearchRec$, StartPos, NumChars)
IF WasX$ = SearchFor$ THEN _
RecFound$ = SearchRec$: _
RecFoundAt = WasI : _
Done = ZTrue _
ELSE IF (High - Low) < 2 THEN _
Done = ZTrue _
ELSE IF WasX$ < SearchFor$ THEN _
Low = WasI _
ELSE IF WasX$ > SearchFor$ THEN _
High = WasI
WEND
END SUB
63530 ' Take modem offhook
SUB TakeOffHook STATIC
CALL ModemPut (ZModemGoOffHookCmd$)
CALL DelayTime (3)
END SUB
63540 ' Match Name to one in message file
SUB MsgNameMatch (PrimeName$,AltName$,SearchPos,Found) STATIC
WasX$ = LEFT$(PrimeName$+" ",22-8*(SearchPos < 7))
Found = (MID$(ZMsgRec$,SearchPos, LEN(WasX$)) = WasX$)
IF NOT Found THEN _
IF AltName$ <> "" THEN _
WasX$ = LEFT$(AltName$ + " ",22-8*(SearchPos < 7)) : _
Found = (MID$(ZMsgRec$,SearchPos, LEN(WasX$)) = WasX$)
END SUB