;****	TRACE ON		; Debugging
;
; ----- COM-AND BBS file maintenance script (BULLETIN file)
;	Commenced: 11/90 R.McG
; -----------------------------------------------------------------------
;	Purpose:
;	   The script, named BBMAINT3.CMD, produces the main window for
;	Bulletin functions of BBMAINT, and implements its functions.  It
;	is not directly callable itself.
; -----------------------------------------------------------------------
;	Usage:
;	   N99 -> Text attribute value (Setup by BBMAINT.CMD)
;	   N98 -> BBMAINT Mainline cursor position
;	   N97 -> BBMAINT Mainline cursor position
;	   N96 -> our mainline cursor position
;	   N95 -> our mainline cursor position
; -----------------------------------------------------------------------
;
;	This script is intended ONLY to be used for FCALL
;
	IF NOT FCALLED
	   WOPEN 10,10,13,70 (cont) NOBUEsc
	   ATSAY 10,12 (cont) " BBS Bulletin "
	   ATSAY 11,12 (cont) " The script: "*"_SCRIPT"
	   ATSAY 12,12 (cont) " is not used by itself... it is called through BBMAINT"
	   ATSAY 13,26 (cont) " Press any key to continue "
	   ;
	   ;	Wait a keypress
	   ;
	   KEYGET S0		; Wait for any key
	   WCLOSE		; Close open window
	   EXIT 		; Terminate right here
	   ENDIF
	GOSUB Bullfile		; Invoke function
	FRETURN 		; Return to caller
; -----------------------------------------------------------------------
; ----- NoBull:  Inform that there's no BBS-Bull file to modify
;
NoBull:
	WOPEN 10,10,13,70 (cont) NOBUEsc
	ATSAY 10,12 (cont) " BBS BullDir "
	ATSAY 11,12 (cont) " The file: "*S25&"\BBS-Bull"
	ATSAY 12,12 (cont) " does not exist.  Please create subdirectories first."
	ATSAY 13,26 (cont) " Press any key to continue "
	;
	;    Wait a keypress
	;
	KEYGET S0		; Wait for any key
	WCLOSE
NOBUEsc:
	RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: BullFile -> Update Bulletin directory
;
BullFile:
	GOSUB NewBull		; Create if not there
	IF NOT ISFILE S25&"\BBS-Bull"
	   GOSUB NoBull 	; Inform there's no file
	   RETURN		; .. so we can't continue
	   ENDIF
;
;	Open a window
;
	WOPEN 0,0 23,79 (defa) Bull_Esc
	ATSAY 0,2 (defa)   " BBS Bulletins "
	ATSAY 23,25 (defa) " Press ESC to cancel BBMAINT "
;
;	Paint the window
;
BUFI100:
	CLEAR			; Clear window
	LOCATE 2,2

	MESS " 1) Add a bulletin to the list"
	MESS " 2) Delete a bulletin from the list"
	MESS " 3) Modify a bulletin's listing"
	MESS " 4) Print the bulletin list"
	MESS " 5) View the bulletin list"
	MESS "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ "
	MESS "Note: Alt-Q to edit a file"
	MESS "      Alt-F for a directory search"
	MESS "      Alt-F10 to shell to DOS"
	MESS " "
	MESS "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ "
	MESS " "
	MESS "Select item (carriage return = previous): "
	CURSOR N96,N95		; Read current cursor
;
;	Wait for entry, and interpret
;
BUFI200:
	LOCATE N96 N95		; Reposition cursor
	KEYGET S0		; Wait for it
	SWITCH S0		; Act according to keyget
	  CASE "1"
	       GOSUB AddBull
	       ENDCASE
	  CASE "2"
	       GOSUB DelBull
	       ENDCASE
	  CASE "3"
	       GOSUB ModBull
	       ENDCASE
	  CASE "4"
	       GOSUB PrnBull
	       ENDCASE
	  CASE "5"
	       GOSUB ViewBull
	       GOTO BUFI100	; Repaint screen after this
	       ENDCASE
	  CASE "0d"             ; c/r alone is exit
	       WCLOSE		; Close window...
	       RETURN		; and return to caller
	       ENDCASE
	  CASE "_NULL"          ; ESC -> Null
	       WCLOSE		; Close window...
	       RETURN		; Leave Main routine
	       ENDCASE
	  CASE "2100"           ; Alt-F
	       MANUAL "0x2100"  ; Perform Dir cmd
	       ENDCASE
	  CASE "1000"           ; Alt-Q
	       MANUAL "0x1000"  ; Edit a file
	       ENDCASE
	  CASE "7100"           ; Alt-F10
	       SHELL
	       DWINDOW 1,2,22,78; Reset dwindow after shell
	       LEGEND "_LEGEND" ; Redo the legend
	       ENDCASE
	  DEFAULT		; None of the above
	       SOUND 100,100	; Bronx cheer
	       ENDCASE
	  ENDSWITCH
	GOTO BUFI200		; Repaint screen and ask again
;
;	End of bulletin procedure
;
Bull_Esc:
	S0 = ""                 ; Fake a null entry
	RETURN			; Leave bulletin routine
; -----------------------------------------------------------------------
; ----- AddBUll:  Add a file to the bulletin directory
;
AddBull:
	SET FLAG(0) OFF 	; Flag for ESCAPE
	WOPEN 10,10,17,75 (cont) ADBUEsc
	ATSAY 10,12 (cont) " BBS Bulletin Add "
	ATSAY 11,12 (cont) "Enter the bulletin number: "
	ATSAY 17,26 (cont) " Press ESC to cancel "
	;
	;    Wait a keypress
	;
	LOCATE 11,42
	GET S0 5		; get number
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	LJ S0			; Left justify
	UPPER S0		; Upper casefy
	IF NULL S0 GOTO ADBUEnd ; get out on empty entry
	GOSUB LkpBull		; Lookup name in file
	IF FOUND		; If its there we can't add it
	   WCLOSE		; Close open window
	   GOTO ModBU_Add	; Skip if found
	   ENDIF
	S10 = S0		; Save File name
	GOTO ADBU100		; And branch around parallel code
;
;	Entry from ModBull... Nothing to modify
;
AddBU_Mod:
	WOPEN 10,10,17,75 (cont) ADBUEsc
	ATSAY 10,12 (cont) " BBS Bulletin Add "
	ATSAY 11,12 (cont) "Enter the bulletin number: "
	ATSAY 11,42 (cont) S0
	ATSAY 17,26 (cont) " Press ESC to cancel "
	S10 = S0		; Copy it for remainder
;
;	Place file date and time in record
;
ADBU100:
	DATE S1 		; Want mm/dd/yy form
	S10(5:12) = S1		; Save date added
	ATSAY 12,12 (cont) "Enter the file name:"
	LOCATE 12,42
	GET S0 12		; get file name
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	LJ S0			; Left justify
	IF NULL S0
	   SOUND 100,100	; Indicate displeasure
	   GOTO ADBU100 	; Try again
	   ENDIF
	FFIRST S25&"\"*S0       ; Test for file's existence
	S10(14:25) = S0 	; Save File name
	IF SUCCESS GOTO ADBU200 ; Skip if exists
;
;	File does not exist...
;
ADBU110:
	ATSAY 13,12 (cont) "File d.n.e. Add anyway (y/n): "
	LOCATE 13,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	IF NULL S0 or NOT FIND "YN" S0(0)
	   SOUND 100,100	; Indicate displeasure
	   GOTO ADBU110 	; Try again
	   ENDIF
	IF FIND "N" S0(0)
	   WCLOSE		; Close window
	   GOTO AddBull 	; And try again
	   ENDIF
;
;	Ask for a comment field
;
ADBU200:
	ATSAY 14,12 (cont) "Description: "
	LOCATE 14,26
	GET S0 40		; get resp
	LJ S0			; Left justify
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	IF NULL S0
	   SOUND 100,100	; Indicate displeasure
	   GOTO ADBU200 	; Try again
	   ENDIF
	S10(26:79) = S0 	; Save comment text
;
;	Ask for privileged flag
;
ADBU250:
	ATSAY 15,12 (cont) "Priveleged access (y/n):  "
	LOCATE 15,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	IF NULL S0 or NOT FIND "YN" S0(0)
	   SOUND 100,100	; Indicate displeasure
	   GOTO ADBU250 	; Try again
	   ENDIF
	IF FIND "Y" S0(0) S10(13:13) = "P" ; Save priveleged access
;
;	Ask for one more look
;
ADBU300:
	ATSAY 16,12 (cont) "OK to add this record?:   "
	LOCATE 16,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO ADBUEnd ; Exit if ESC hit
	IF NULL S0 or NOT FIND "YN" S0(0)
	   SOUND 100,100	; Indicate displeasure
	   GOTO ADBU300 	; Try again
	   ENDIF
	IF FIND "N" S0(0)
	   WCLOSE		; Close window
	   GOTO AddBull 	; And try again
	   ENDIF
;
;	Write the record
;
	GOSUB AddBRec		; Write to Bulletins file
;
;	End of add procedure
;
ADBUEnd:
	WCLOSE
ADBUEsc:
	SET FLAG(0) ON
	RETURN
; -----------------------------------------------------------------------
; ----- AddBRec:  Add a record to the Bulletin file...
;	.. S10 passes the record to be written
;
AddBRec:
	FOPENO S25&"\BBS-bull" TEXT APPEND
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   RETURN		; And we're done
	   ENDIF
	PRESERVE S10		; Preserve ^'s and !'s
	WRITE S10		; Write the record
	WRITE "!^Z"             ; And finish it
	FCLOSEO
	RETURN
; -----------------------------------------------------------------------
; ----- LkpFile:  Lookup a file in the BBS-Bull file
;	.. S0 passes the fname to be tested
;	.. S10 returns the record read
;
LkpBull:
	FOPENI S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   SET FOUND OFF	; Not found
	   RETURN		; And we're done
	   ENDIF
;
;	Read loop
;
LOBU100:
	READ S10 80 N0		; Read a record
	IF EOF GOTO LOBU200	; Skip on EOF
	IF STRCMP S10(0:0) "*" GOTO LOBU110
	IF STRCMP S10(0:4) S0(0:4) GOTO LOBU300
;
;	Record longer than 80 chars
;
LOBU110:
	IF N0 LT 80 GOTO LOBU100; If exactly 80 rtnd, c/r wasn't read
	READ S10 80 N0		; Read remainder of rec
	GOTO LOBU110		; Read until less than 80
;
;	We have end-of-file - not found
;
LOBU200:
	SET FOUND OFF		; Indicate not found
	GOTO LOBUEnd
;
;	We have a hit - return found
;
LOBU300:
	SET FOUND ON		; Indicate found
;
;	And exit
;
LOBUEnd:
	FCLOSEI
	RETURN
; -----------------------------------------------------------------------
; ----- DelBull:  Delete a file from Bulletin file
;
DelBull:
	SET FLAG(0) OFF 	; Flag for ESCAPE
	WOPEN 10,10,15,70 (cont) DEBUEsc
	ATSAY 10,12 (cont) " BBS Bulletin Delete "
	ATSAY 11,12 (cont) "Enter bulletin number to del: "
	ATSAY 15,26 (cont) " Press ESC to cancel "
	;
	;    Wait a keypress
	;
	LOCATE 11,42
	GET S0 5		; get resp
	IF FLAG(0) GOTO DEBUEnd ; Exit if ESC hit
	LJ S0			; Left justify
	UPPER S0		; Upper casefy
	IF NULL S0 GOTO DEBUEnd ; get out on empty entry
;
;	Open the Bulletin file and a temp copy file
;
	GOSUB DelBRec		; Try to delete a record
	IF FLAG(1) GOTO DEBUEnd ; Skip if record deleted
	ATSAY 12,12 (cont) "Bulletin not in listing...     "
	ATSAY 13,12 (cont) "Press any key to continue..."
	KEYGET S0
;
;	End of add procedure
;
DEBUEnd:
	WCLOSE
DEBUEsc:
	SET FLAG(0) ON
	RETURN
; -----------------------------------------------------------------------
; ----- DelBRec:  Delete a record from the Bulletin file...
;	.. S0 passes the bulletin number key
;	.. S1 destroyed in the process
;	.. FLAG(1) if rtn'd set, indicates record was FOUND
;
DelBRec:
;
;	Open the Bulletin file and a temp copy file
;
	SET FLAG(1)  OFF	; Initialize for found flag
	FOPENI S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   GOTO DEBREnd 	; And we're done
	   ENDIF

	FOPENO S25&"\TempBull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\TempBull"
	   GOSUB Error		; Report
	   GOTO DEBREnd 	; And we're done
	   ENDIF
	N10 = 0 		; COunt recs written
;
;	Read records (40 chars at a time to allow PRESERVE)
;
DEBR100:
	READ S1 40 N0		; Read 1st 40 chars
	IF EOF GOTO DEBR300	; Skip on EOF
	IF STRCMP S1(0:4) S0(0:4) GOTO DEBR200
	INC N10 		; COunt rec written
;
;	Copy the record read to the output file
;
DEBR110:
	PRESERVE S1		; Save !'s and ^'s
	WRITE S1		; Write text

	IF N0 LT 40		; If we wrote end of record
	   WRITE "!"            ; Finish w/cr/lf
	   GOTO DEBR100 	; And continue copying
	   ENDIF
	READ S1 40 N0		; Read remainder of rec
	IF NOT EOF GOTO DEBR110 ; Skip if not eof
	WRITE "!"               ; Finish record
	GOTO DEBR300		; End of file
;
;	We have a hit
;
DEBR200:
	SET FLAG(1) ON		; Flag we deleted item
	IF N0 LT 40 GOTO DEBR100
	READ S1 40 N0		; Read remainder of rec
	IF NOT EOF GOTO DEBR200 ; Skip if not found
;
;	We hit EOF - may or may not have found the target rec
;
DEBR300:
	IF NOT FLAG(1) GOTO DEBR400 ; skip if not found
	WRITE "^Z"              ; Finish ASCII file
	FCLOSEO 		; Close output
	FCLOSEI 		; Close input
	DELETE S25&"\BBS-Bull"  ; Delete original
	RENAME S25&"\TempBull" S25&"\BBS-Bull"
	IF ZERO N10 DELETE S25&"\BBS-Bull" ; Delete empty file
	GOTO DEBREnd
;
;	We hit EOF - we did not find the record
;
DEBR400:
	FCLOSEO 		; Close output
	FCLOSEI 		; Close input
	DELETE S25&"\TempBull"  ; Delete copy file
;
;	End of procedure...
;
DEBREnd:
	RETURN
; -----------------------------------------------------------------------
; ----- ModBull:  Modify a record in the bulletin file
;
ModBull:
	SET FLAG(0) OFF 	; Flag for ESCAPE
	WOPEN 10,10,18,75 (cont) MOBUEsc
	ATSAY 10,12 (cont) " BBS Bulletin Modify "
	ATSAY 11,12 (cont) "Enter number to change: "
	ATSAY 18,26 (cont) " Press ESC to cancel "
	;
	;    Wait a keypress
	;
	LOCATE 11,42
	GET S0 5		; get resp
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	LJ S0			; Left justify
	UPPER S0		; Upper case
	IF NULL S0 GOTO MOBUEnd ; get out on empty entry
	GOSUB LkpBull		; Lookup in Bulletin file
	IF NOT FOUND		; If its there we can't add it
	   WCLOSE		; Close open window
	   GOTO AddBU_Mod	; Skip if NOT found
	   ENDIF
	GOTO MOBU100		; And branch around parallel code
;
;	Entry from AddBull... We have a rec in S10 - needs adding
;
ModBU_Add:
	WOPEN 10,10,18,75 (cont) MOBUEsc
	ATSAY 10,12 (cont) " BBS Bulletin Modify "
	ATSAY 11,12 (cont) "Enter number to be changed: "
	ATSAY 11,42 (cont) S0
	ATSAY 18,26 (cont) " Press ESC to cancel "
;
;	Display the original values (rtnd in S10 by LkpBull)
;
MOBU100:
	ATSAY 10,54 (cont) " Old vals "
	ATSAY 11,55 (cont) S10(0:4)	; Num
	ATSAY 12,55 (cont) S10(14:25)	; Fname
	ATSAY 15,26 (cont) S10(26:65)	; Description
	IF NOT NULL S10(13:13)
	   ATSAY 16,55 (cont) "y"
	ELSE
	   ATSAY 16,55 (cont) "n"
	   ENDIF
;
;	Ask for a file name (containing the bulletin)
;
MOBU110:
	DATE S1 		; Want mm/dd/yy form
	S10(5:12) = S1		; Save date mod'd
	ATSAY 12,12 (cont) "Enter the file name:"
	LOCATE 12,42
	GET S0 12		; get file name
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	LJ S0			; Left justify
	IF NULL S0 GOTO MOBU200 ; Skip if null entry
	FFIRST S25&"\"*S0       ; Test for file's existence
	S10(14:25) = S0 	; Save File name
	IF SUCCESS GOTO MOBU200 ; Skip if exists
;
;	File does not exist...
;
MOBU120:
	ATSAY 13,12 (cont) "File d.n.e. Add anyway (y/n): "
	LOCATE 13,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	IF NULL S0 or NOT FIND "YN" S0(0)
	   SOUND 100,100	; Indicate displeasure
	   GOTO MOBU120 	; Try again
	   ENDIF
	IF FIND "N" S0(0)
	   WCLOSE		; Close window
	   GOTO ModBull 	; And try again
	   ENDIF
;
;	Ask for a comment field
;
MOBU200:
	ATSAY 14,12 (cont) "Description: "
	LOCATE 14,26
	GET S0 40		; get resp
	LJ S0			; Left justify
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	IF NULL S0		; If null entry...
	   ATSAY 14,26 (cont) S10(26:65)
	   GOTO MOBU250 	; Skip store
	   ENDIF
	S10(26:79) = S0 	; Save comment text
;
;	Ask for privileged flag
;
MOBU250:
	ATSAY 16,12 (cont) "Priveleged access (y/n):  "
	LOCATE 16,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	IF NULL S0 ATSCR 16,55 1 S0 ; Read back previous value
	IF NOT FIND "YN" S0(0)  ; If not y/n
	   SOUND 100,100	; Indicate displeasure
	   GOTO MOBU250 	; Try again
	   ENDIF
	S10(13:13) = " "        ; Default no priv
	IF FIND "Y" S0(0)       ; If privilege 'y'
	   S10(13:13) = "P"     ; Set priveleged access
	   ENDIF
;
;	Ask for one more look
;
MOBU300:
	ATSAY 17,12 (cont) "OK to add this record?:   "
	LOCATE 17,42
	GET S0 1		; get resp
	IF FLAG(0) GOTO MOBUEnd ; Exit if ESC hit
	IF NULL S0 or NOT FIND "YN" S0(0)
	   SOUND 100,100	; Indicate displeasure
	   GOTO MOBU300 	; Try again
	   ENDIF
	IF FIND "N" S0(0)
	   WCLOSE		; Close window
	   GOTO ModBull 	; And try again
	   ENDIF
;
;	Delete the previous value... and add the new
;	.. Could do a Delete/add but don't want file re-ordered
;
	GOSUB ModBRec		; Modify the record in S10
	IF NOT FLAG(1)		; If not deleted
	   S0 = "Error modifying bulletin: "*S0
	   GOSUB Error		; Report
	   GOTO MOBUEnd 	; And we're done
	   ENDIF
;
;	End of add procedure
;
MOBUEnd:
	WCLOSE
MOBUEsc:
	SET FLAG(0) ON
	RETURN
; -----------------------------------------------------------------------
; ----- ModBRec:  Modify a record from the Files file...
;	.. S10 passes the new record (same file name key)
;	.. S1 destroyed in the process
;
ModBRec:
;
;	Open the Files file and a temp copy file
;
	SET FLAG(1)  OFF	; Initialize for found flag
	FOPENI S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   GOTO MOBREnd 	; And we're done
	   ENDIF

	FOPENO S25&"\TempFile" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\TempFile"
	   GOSUB Error		; Report
	   GOTO MOBREnd 	; And we're done
	   ENDIF
	N10 = 0 		; Count recs written
;
;	Read records (40 chars at a time to allow PRESERVE)
;
MOBR100:
	READ S1 40 N0		; Read 1st 40 chars
	IF EOF GOTO MOBR300	; Skip on EOF
	IF STRCMP S1(0:4) S10(0:4) GOTO MOBR200
	INC N10
;
;	Copy the record read to the output file
;
MOBR110:
	PRESERVE S1		; Save !'s and ^'s
	WRITE S1		; Write text

	IF N0 LT 40		; If we wrote end of record
	   WRITE "!"            ; Finish w/cr/lf
	   GOTO MOBR100 	; And continue copying
	   ENDIF
	READ S1 40 N0		; Read remainder of rec
	IF NOT EOF GOTO MOBR110 ; Skip if not eof
	WRITE "!"               ; Finish record
	GOTO MOBR300		; End of file
;
;	We have a match on the key.
;
MOBR200:
	SET FLAG(1) ON		; Flag we deleted item
	S1 = S10(0:39)		; Take 1st part of rec to write
	PRESERVE S1		; Save !s and ^s
	WRITE S1		; Write text

	LENGTH S10 N1		; Get new rec length
	IF N1 LT 40 GOTO MOBR210

	S1 = S10(40:79) 	; Take 2nd part of rec to write
	PRESERVE S1		; Save !s and ^s
	WRITE S1		; Write text
;
;	Finish the new record
;
MOBR210:
	WRITE "!"               ; Finish record
;
;	Finish reading the original record
;
MOBR220:
	IF N0 LT 40 GOTO MOBR100
	READ S1 40 N0		; Read remainder of rec
	IF NOT EOF GOTO MOBR220 ; Skip if not found
;
;	We hit EOF - may or may not have found the target rec
;
MOBR300:
	IF NOT FLAG(1) GOTO MOBR200 ; skip if not found
	WRITE "^Z"              ; Finish ASCII file
	FCLOSEO 		; Close output
	FCLOSEI 		; Close input
	DELETE S25&"\BBS-Bull"  ; Delete original
	RENAME S25&"\TempFile" S25&"\BBS-Bull"
	IF ZERO N10 DELETE S25&"\BBS-Bull" ; Delete empty file
;
;	End of procedure...
;
MOBREnd:
	RETURN
; -----------------------------------------------------------------------
; ----- PrnBull:  Print a list of bulletins
;
PrnBull:
	FOPENI S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   RETURN		; And we're done
	   ENDIF
;
;	Initialize a counter
;
	N10 = 0 		; # Lines printed
	N11 = 1 		; Page number
;
;	Read loop
;
PRBU100:
	READ S10 80 N0		; Read a record
	IF EOF GOTO PRBU200	; Skip on EOF
	IF STRCMP S10(0:0) "<" GOTO PRBU120 ; skip comments
	IF ZERO N0 GOTO PRBU100 ; skip blank lines
;
;	Print a heading...
;
	IF N10 GT 0 and N10 LE 50 GOTO PRBU110
	PRINT "COM-AND Scripted BBS Bulletin list as of "*"_DATE"*", "*"_TIME"*"      Page "*N11*"^M^J"
	PRINT "From: "*"_IFILE"*"^M^J"
	PRINT "--------------------------------------------------------------------------^M^J"
	PRINT "Numbr File         Priv Description^M^J"
	PRINT "----- ------------ ---- --------------------------------------------------^M^J"
	N10 = 0
	INC N11
;
;	Build a record and print it
;
PRBU110:
	S0 = S10(0:4)		; Number Field
	S0(6:17) = S10(14:25)	; Fname  Field
	IF NOT NULL S10(13:13) S0(20:22) = "yes"
	S0(24:79)  = S10(26:79) ; Description
	PRESERVE S0
	PRINT S0
	PRINT "^M^J"            ; Finish line
	INC N10 		; COunt lines printed
;
;	Handle record longer than 80 chars
;
PRBU120:
	IF N0 LT 80 GOTO PRBU100; If exactly 80 rtnd, c/r wasn't read
	READ S10 80 N0		; Read remainder of rec
	GOTO PRBU120		; Read until less than 80
;
;	We have end-of-file
;
PRBU200:
	PRINT "^L"              ; Do a final top-of-form
;
;	And exit
;
PRBUEnd:
	FCLOSEI
	RETURN
; -----------------------------------------------------------------------
; ----- ViewBull: View a list of bulletins
;
ViewBull:
	FOPENI S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS		; Open failed
	   S0 = "Error opening: "*S25&"\BBS-Bull"
	   GOSUB Error		; Report
	   RETURN		; And we're done
	   ENDIF
;
;	Initialize a counter
;
	N10 = 0 		; # Lines printed
	N11 = 0 		; Page number
	SET FLAG(0) OFF 	; Initialize esc flag
	S11 = "_ONESC"
	ON ESCAPE GOSUB VIBUESC
;
;	Print a heading...
;
VIBU100:
	IF N10 GT 0 GOTO VIBU110
	CLEAR			; Clear the window
	ATSAY 1,2 (defa) "Numbr File         Priv Description"
	ATSAY 2,2 (defa) "----- ------------ ---- --------------------------------------------------"
	N10 = 3 		; Set starting line no
	INC N11 		; Set next page
;
;	Save the file position for the start of this page
;
	FSAVEI
	IF NOT SUCCESS
	   FSAVEI SHIFT 	; Save last 20 pos'ns
	   FSAVEI
	   ENDIF
;
;	Read loop
;
VIBU110:
	READ S10 80 N0		; Read a record
	IF EOF GOTO VIBU200	; Skip on EOF
	IF STRCMP S10(0:0) "<" GOTO VIBU120 ; skip comments
	IF ZERO N0 GOTO VIBU110 ; skip blank lines
;
;	Build a record and print it
;
	S0 = S10(0:4)		; Number Field
	S0(6:17) = S10(14:25)	; Fname  Field
	IF NOT NULL S10(13:13) S0(20:22) = "yes"
	S0(24:74)  = S10(26:79) ; Description
	PRESERVE S0
	ATSAY N10,2 (defa) S0
	INC N10 		; COunt lines printed
;
;	Handle record longer than 80 chars
;
VIBU120:
	IF N0 LT 80 GOTO VIBU200; If exactly 80 rtnd, c/r wasn't read
	READ S10 80 N0		; Read remainder of rec
	GOTO VIBU120		; Read until less than 80
;
;	Look for end of screen/end of file
;
VIBU200:
	IF (NOT EOF) and N10 LT 21 GOTO VIBU100
	IF EOF
	   ATSAY 22,2 (defa) "End of file; Home (top), PgDn (forward), PgUp (back)"
	ELSE
	   ATSAY 22,2 (defa) "Page "*N11*"; Home (top), PgDn (forward), PgUp (back)"
	   ENDIF
;
;	Read a key and interpret
;
VIBU210:
	IF FLAG(0) RETURN	; End of routine when flag set
	KEYGET S1
	IF FLAG(0) RETURN	; End of routine when flag set
	SWITCH S1
	  CASE "4900"           ; Pgup
	    GOTO PgUp
	    ENDCASE
	  CASE "5100"           ; PgDn
	    GOTO PgDn
	    ENDCASE
	  CASE "4700"           ; Home
	    GOTO Home
	    ENDCASE
	  CASE "0D"             ; C/r
	    IF EOF GOTO VIBUEnd
	    GOTO PgDn
	    ENDCASE
	  CASE "2100"           ; Alt-F
	    MANUAL "0x2100"     ; Perform Dir cmd
	    ENDCASE
	  CASE "1000"           ; Alt-Q
	    MANUAL "0x1000"     ; Edit a file
	    ENDCASE
	  CASE "7100"           ; Alt-F10
	    SHELL
	    DWINDOW 1,2,22,78	; Reset dwindow after shell
	    LEGEND "_LEGEND"    ; Redo the legend
	    ENDCASE
	  DEFAULT
	    MESS S1
	    SOUND 100,100
	    ENDCASE
	  ENDSWITCH
	GOTO VIBU210
;
;	Page up (go backwards)
;
PgUp:
	N10 = 0 		; Clear line ctr
	FRESTOREI		; Backup current pg
	N11 = N11-1		; Reset Page # for redisplay
	FRESTOREI		; Backup one more
	IF NOT SUCCESS
	   SOUND 200,100	; Indicate problem
	   GOTO Home
	   ENDIF
	N11 = N11-1		; Reset Page # for redisplay
	GOTO VIBU100
;
;	Home (go to top)
;
Home:
	N10 = 0 		; Clear line ctr
	N11 = 0 		; Set new pg number
	FSAVEI CLEAR		; Clear saved pages
	REWIND			; Rewind input
	GOTO VIBU100
;
;	Page down (go forwards)
;
PgDn:
	IF EOF GOTO Home	; Wrap to home at EOF
	N10 = 0 		; Clear line ctr
	GOTO VIBU100
;
;	And exit
;
VIBUEnd:
	FCLOSEI
	RETURN
;
;	Escape entered
;
VIBUESC:
	SET FLAG(0) ON
	ON ESCAPE GOSUB S11	; Restore previous ON ESC
	RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: NewBull -> Create a new BBS-Bull file
;
NewBull:
	IF ISFILE S25&"\BBS-Bull" RETURN
	FOPENO S25&"\BBS-Bull" TEXT
	IF NOT SUCCESS RETURN	; Open failed
	WRITE "!^Z"             ; Make it empty
	FCLOSEO 		; Done with it
	RETURN
; -----------------------------------------------------------------------
; ----- Error:	Open a window, display a message, and wait for keypress
;	S0 passes the error message
;
Error:
	WOPEN 10,10,12,70 (cont) Err_Esc
	ATSAY 10,12 (cont) " Error "
	ATSAY 11,12 (cont) S0(0:55); Max msg width 55 chars
	ATSAY 12,26 (cont) " Press any key to continue "
	;
	;    Wait a keypress
	;
	KEYGET S0		; Wait for any key
	WCLOSE
Err_Esc:
	RETURN
