Category : Communication (modem) tools and utilities
Archive   : CA29-3.ZIP
Filename : BBMAINT4.CMD

 
Output of file : BBMAINT4.CMD contained in archive : CA29-3.ZIP
;**** TRACE ON ; Debugging
;
; ----- COM-AND BBS file maintenance script (MAIL file)
; Commenced: 11/90 R.McG
; -----------------------------------------------------------------------
; Purpose:
; The script, named BBMAINT4.CMD, produces the main window for
; Mail 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) NOMAEsc
ATSAY 10,12 (cont) " BBS Mail "
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 Mailfile ; Invoke function
FRETURN ; Return to caller
; -----------------------------------------------------------------------
; ----- NoMail: Inform that there's no BBS-Mail file to modify
;
NoMail:
WOPEN 10,10,13,70 (cont) NOMAEsc
ATSAY 10,12 (cont) " BBS MailDir "
ATSAY 11,12 (cont) " The file: "*S24&"\BBS-Mail"
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
NOMAEsc:
RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: MailFile -> Update Mail directory
;
MailFile:
GOSUB NewMail ; Create if not there
IF NOT ISFILE S24&"\BBS-Mail"
GOSUB NoMail ; Inform there's no file
RETURN ; .. so we can't continue
ENDIF
;
; Open a new window
;
WOPEN 0,0 23,79 (defa) Mail_Esc
ATSAY 0,2 (defa) " BBS Mail "
ATSAY 23,25 (defa) " Press ESC to cancel BBMAINT "
;
; Paint a new menu
;
MAFI100:
CLEAR ; Clear window
LOCATE 2,2

MESS " 1) Clean up mail directory"
MESS " 2) Delete notes older than ..."
MESS " 3) Read notes newer than ..."
MESS " 4) Post a new note"
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
;
MAFI200:
LOCATE N96 N95 ; Reposition cursor
KEYGET S0 ; Wait for it
SWITCH S0 ; Act according to keyget
CASE "1"
GOSUB ClrMail
GOTO MAFI100 ; Repaint after this
ENDCASE
CASE "2"
GOSUB DelMail
GOTO MAFI100 ; Repaint after this
ENDCASE
CASE "3"
GOSUB ReadMail
GOTO MAFI100 ; Repaint after this
ENDCASE
CASE "4"
GOSUB Compose
GOTO MAFI200 ; This sub saves screen
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 MAFI200 ; Repaint screen and ask again
;
; End of mail procedure
;
Mail_Esc:
S0 = "" ; Fake a null entry
RETURN ; Leave Mail routine
; -----------------------------------------------------------------------
; ----- ClrMail: Clear mail directory of unneeded entries
;
ClrMail:
FOPENI S24&"\BBS-Mail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\BBS-Mail"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF

FOPENO S24&"\TempMail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\TempMail"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF
;
; Initialize
;
CLEAR ; Clear window
N9 = 0 ; Count recs written
;
; Read loop (40 chars at a time to allow PRESERVE)
;
CLMA100:
READ S10 40 N0 ; Read a record
IF EOF GOTO CLMA200 ; Skip on EOF
IF STRCMP S10(0:0) "*" GOTO CLMA115 ; Copy comments
IF ZERO N0 GOTO CLMA115 ; Copy blank lines
;
; Test for the existence of the indicated file
;
CLMA110:

S0 = S24&"\"*S10(25:37) ; Make a file name
IF NOT ISFILE S0 ; Test existence
MESS S0*" does not exist - deleting record"
GOTO CLMA130 ; Remove entry
ENDIF
MESS S0*" exists - copying record"
;
; Count the write
;
CLMA115:
INC N9 ; Count recs written
;
; Copy record just read to output file
;
CLMA120:
PRESERVE S10 ; Save !'s and ^'s
WRITE S10 ; Write text

IF N0 LT 40 ; If we wrote end of record
WRITE "!" ; Finish w/cr/lf
GOTO CLMA100 ; And continue copying
ENDIF
READ S10 40 N0 ; Read remainder of rec
IF NOT EOF GOTO CLMA120 ; Skip if not eof
WRITE "!" ; Finish record
GOTO CLMA200 ; End of file
;
; Throw away the current record
;
CLMA130:
IF N0 LT 40 GOTO CLMA100
READ S10 40 N0 ; Read remainder of rec
IF NOT EOF GOTO CLMA130 ; Skip if not eof
;
; We have end-of-file
;
CLMA200:
WRITE "^Z" ; Finish ASCII file
FCLOSEO ; Close output
FCLOSEI ; Close input
DELETE S24&"\BBS-Mail" ; Delete original
RENAME S24&"\TempMail" S24&"\BBS-Mail"
IF ZERO N9 DELETE S24&"\BBS-Mail" ; Delete empty file
RETURN
; -----------------------------------------------------------------------
; ----- DelMail: Delete mail files older than some date...
; .. Note this only works through current and last year
;
DelMail:
FOPENI S24&"\BBS-Mail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\BBS-Mail"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF

FOPENO S24&"\TempMail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\TempMail"
GOSUB Error ; Report
GOTO DEMAErr ; And we're done
ENDIF
N9 = 0 ; Counter for recs written
;
; Initialize
; .. (N2 = # days to keep, N3 = today's julian dayno, N4 = current yr)
;
S0 = "Enter age in days of the oldest file to keep"
GOSUB Get_Number ; Ask for a value
IF FLAG(0) GOTO DEMAERR ; IF ESCAPE pressed...
IF N0 LE 0 N0 = 1 ; No negative dates
N2 = N0 ; Save value for later

DATE S0 1 ; get current date (mm/dd/yyyy)
N4 = S0(6:9) ; Save current year number
GOSUB Julian ; make Julian date from current date
N3 = N0 ; Save current julian day number

CLEAR ; Clear window
;
; Read loop (40 chars at a time to allow PRESERVE)
;
DEMA100:
READ S10 40 N10 ; Read a record
IF EOF GOTO DEMA200 ; Skip on EOF
IF STRCMP S10(0:0) "*" GOTO DEMA115 ; Copy comments
IF ZERO N10 GOTO DEMA115; Copy blank lines
;
; Test for the existence of the indicated file
;
DEMA110:
S1 = S24&"\"*S10(25:37) ; Make a file name
IF NOT ISFILE S1 ; Test existence
MESS S1*" does not exist - cleaning dir"
GOTO DEMA130 ; Remove entry
ENDIF
;
; Find the date of the file. NOTE: The years we limit this code
; .. to recognizing are the current and previous years.
;
FDATE S0 S1 1 ; Get the file's date into S0 (mm/dd/yyyy)
N5 = N4-S0(6:9) ; Compute # years difference fdate and cur yr
IF N5 LT 0 ; If file year is future....
MESS S1*" date is in the future... saving(!!)"
GOTO DEMA115 ; Save the entry
ENDIF
IF N5 GT 1 ; if file older than 1 year
MESS S1*" more than a year old ... deleting"
DELETE S1 ; Delete the file...
GOTO DEMA130 ; Delete the entry
ENDIF
GOSUB Julian ; Convert date to Julian day no
;
; Compute the days difference and act according to user set max
;
IF N5 EQ 0 ; if file date same year as current...
N1 = N3-N0 ; Same year... N1 = age of file
ELSE ; If file date previous year
N1 = N3-(N1-N0) ; [Julian returns N1 = #days that year]
ENDIF
IF N1 GT N2 ; If fileage > max age
MESS S1*" is "*N1*" days old - deleting"
DELETE S1 ; Delete the file...
GOTO DEMA130 ; Delete the entry
ENDIF
MESS S1*" is "*N1*" days old - keeping"
;
; Count the write
;
DEMA115:
INC N9 ; Count recs written
;
; Copy record just read to output file
;
DEMA120:
PRESERVE S10 ; Save !'s and ^'s
WRITE S10 ; Write text

IF N10 LT 40 ; If we wrote end of record
WRITE "!" ; Finish w/cr/lf
GOTO DEMA100 ; And continue copying
ENDIF
READ S10 40 N10 ; Read remainder of rec
IF NOT EOF GOTO DEMA120 ; Skip if not eof
WRITE "!" ; Finish record
GOTO DEMA200 ; End of file
;
; Throw away the current record
;
DEMA130:
IF N10 LT 40 GOTO DEMA100
READ S10 40 N10 ; Read remainder of rec
IF NOT EOF GOTO DEMA130 ; Skip if not eof
;
; We have end-of-file
;
DEMA200:
WRITE "^Z" ; Finish ASCII file
FCLOSEO ; Close output
FCLOSEI ; Close input
DELETE S24&"\BBS-Mail" ; Delete original
RENAME S24&"\TempMail" S24&"\BBS-Mail"
IF ZERO N9 DELETE S24&"\BBS-Mail" ; Delete empty file
RETURN
;
; Error exit
;
DEMAERR:
FCLOSEO ; Close output
FCLOSEI ; Close input
RETURN
; -------------------------------------------------------------------------
; ----- Get_Number
; S0 passes the prompt
; N0 returns the value entered
; FLAG(0) returned true indicates ESC was pressed
;
Get_Number:
SET FLAG(0) OFF ; ESCAPE flag
WOPEN 10,10,13,70 (cont) GENU_ESC
ATSAY 10,12 (cont) " Enter Value "
ATSAY 11,12 (cont) S0(0:55); Max msg width 55 chars
ATSAY 12,12 (cont) "-> "
ATSAY 13,26 (cont) " Press ESCAPE to cancel "
N0 = -1 ; Default value
;
; Wait a keypress
;
GENU100:
LOCATE 12,15
GET S0 5 ; Wait for a number
IF NOT FLAG(0) and NOT (FIND S0 "all" or NULL S0)
ATOI S0 N0 ; Convert w/o err msg
IF ERROR ; If couldn't convert
SOUND 100,100 ; Bronx cheer
GOTO GENU100 ; Ask again
ENDIF
ELSE
IF NOT (FIND S0 "all" or NULL S0)
SOUND 100,100 ; Bronx cheer
GOTO GENU100 ; Ask again
ENDIF
ENDIF
WCLOSE ; Close open window
RETURN
;
; Escape during GET
;
GENU_Esc:
SET FLAG(0) ON ; Flag Escape pressed
RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: NewMail -> Create a new BBS-Mail file
;
NewMail:
IF ISFILE S24&"\BBS-Mail" RETURN
FOPENO S24&"\BBS-Mail" TEXT
IF NOT SUCCESS RETURN ; Open failed
WRITE "!^Z" ; Make it empty
FCLOSEO ; Done with it
RETURN
;--------------------------------------------------------------------------
;------ Julian: Simple (not true) Julian date conversion
;
; Passed: S0 contains a date formatted: mm/dd/yyyy left justified
; as per COM-AND "DATE Sx 1" format
; Rtnd: N0 returns the julian date number (1-366)
; N1 returns 365 or 366 as the total # days in the given year
; if SUCCESS is set
;
; NOTE: This routine is placed near beginning of file to speed access.
; This script exceeds the 100 label limit of COM-AND's cache!
;
Julian:
IF NOT (NUMERIC S0(0) and NUMERIC S0(3) and NUMERIC S0(6)) GOTO JULERR
N0 = S0(3:4) ; Extract day number
N1 = S0(0:1) ; Set default value to be rtnd
SWITCH N1 ; Switch on Month #
CASE 1 ; January
GOTO JUL200 ; And continue
ENDCASE
CASE 2 ; February
N0 = N0+31 ; Preceeding mo has 31 days
GOTO JUL200 ; And continue
ENDCASE
CASE 3 ; March
N0 = N0+59 ; Preceeding mo has 28 days
GOTO JUL100 ; And continue
ENDCASE
CASE 4 ; April
N0 = N0+90 ; Preceeding mo has 31 days
GOTO JUL100 ; And continue
ENDCASE
CASE 5 ; May
N0 = N0+120 ; Preceeding mo has 30 days
GOTO JUL100 ; And continue
ENDCASE
CASE 6 ; June
N0 = N0+151 ; Preceeding mo has 31 days
GOTO JUL100 ; And continue
ENDCASE
CASE 7 ; July
N0 = N0+181 ; Preceeding mo has 30 days
GOTO JUL100 ; And continue
ENDCASE
CASE 8 ; August
N0 = N0+212 ; Preceeding mo has 31 days
GOTO JUL100 ; And continue
ENDCASE
CASE 9 ; September
N0 = N0+243 ; Preceeding mo has 31 days
GOTO JUL100 ; And continue
ENDCASE
CASE 10 ; October
N0 = N0+273 ; Preceeding mo has 30 days
GOTO JUL100 ; And continue
ENDCASE
CASE 11 ; November
N0 = N0+304 ; Preceeding mo has 31 days
GOTO JUL100 ; And continue
ENDCASE
CASE 12 ; December
N0 = N0+334 ; Preceeding mo has 30 days
GOTO JUL100 ; And continue
ENDCASE
DEFAULT ; Month not 1-12
GOTO JULERR ; And continue
ENDCASE
ENDSWITCH
;
; Month is after February - handle leap year
; .. leap year is divisible by 4 but not by 400
;
JUL100:
IF (NOT ZERO (S0(6:9)\4)) or ZERO (S0(6:9)\400) GOTO JUL200
INC N0 ; Add a day for leap year
N1 = 366 ; Set value to be rtnd (total # days)
;
; Return with a number 1-366 in N0
;
JUL200:
IF N1 LT 366 N1 = 365 ; Total # days
SET SUCCESS ON ; Indicate success
RETURN
;
; Error in passed date
;
JULERR:
SET SUCCESS OFF ; Indicate FAILURE
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
; -----------------------------------------------------------------------
; ----- ReadMail: Read mail files newer than some date...
; .. Note this only works through current and last year
; Uses: S29,S28,S27,S10
;
ReadMail:
FOPENI S24&"\BBS-Mail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\BBS-Mail"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF
;
; Alloc dyn vars (for message text display)
;
ALLOCATE 100 ; Need 100 dynamic variables
IF FAILED ; If allocation failed
S0 = "Cannot allocate memory for variables"
GOSUB Error ; Report the problem
GOTO REMA900 ; Go clean up
ENDIF
;
; Initialize
; .. (N2 = # days to keep, N3 = today's julian dayno, N4 = current yr)
;
S0 = "Enter age in days of the oldest file to read:"
GOSUB Get_Number ; Ask for a value
IF FLAG(0) GOTO REMA900 ; IF ESCAPE pressed...
N2 = N0 ; Save value for later

DATE S0 1 ; get current date (mm/dd/yyyy)
N4 = S0(6:9) ; Save current year number
GOSUB Julian ; make Julian date from current date
N3 = N0 ; Save current julian day number

CLEAR ; Clear the current screen
;
; Read loop
;
REMA100:
FSAVEI ; Save current place in file
IF FAILED ; .. if stack full
FSAVEI SHIFT ; .. throw away oldest
FSAVEI ; .. and NOW save it
ENDIF
READ S10 80 N10 ; Read a record
IF EOF GOTO REMA900 ; Skip on EOF
IF STRCMP S10(0:0) "*" GOTO REMA100 ; Skip comments
IF ZERO N10 GOTO REMA100; Skip blank lines
;
; Test for the existence of the indicated file
;
REMA110:
S1 = S24&"\"*S10(25:37) ; Make a file name
IF NOT ISFILE S1 GOTO REMA100
;
; Skip if 'ALL' selected
;
IF N2 LT 0 GOTO REMA200
;
; Find the date of the file. NOTE: This code limits the years
; .. recognized to the current and previous years.
;
FDATE S0 S1 1 ; Get the file's date into S0 (mm/dd/yyyy)
N5 = N4-S0(6:9) ; Compute # years difference fdate and cur yr
IF N5 LT 0 GOTO REMA200 ; If file year is future.... read it
IF N5 GT 1 GOTO REMA100 ; If file older than 1 year skip it
GOSUB Julian ; Convert date to Julian day no
;
; Compute the days difference and act according to user set max
;
IF N5 EQ 0 ; if file date same year as current...
N1 = N3-N0 ; Same year... N1 = age of file
ELSE ; If file date previous year
N1 = N3-(N1-N0) ; [Julian returns N1 = #days that year]
ENDIF
IF N1 GT N2 GOTO REMA100; If fileage > max age
;
; Save the current in-file's position and open the mail file
;
REMA200:
S29 = "_IPOS" ; Save input file position as a string
FOPENI S1 text ; OPen input file as text
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S1
GOSUB Error ; Report
N10 = 0 ; Clear # text lines (to skip display)
GOTO REMA400 ; And continue
ENDIF
;
; Load text into dynamic variables
;
N10 = 0 ; Clear count of lines
N11 = 5 ; # header lines to skip
WHILE NOT EOF and N10 LT 100 ; We have 100 lines possible
READ S0 80 N0 ; Read a line
IF NOT EOF and ZERO N11 ; If a line was read...
PRESERVE S0 ; Retain !s ^s and `s
V0[N10] = S0 ; Save the line
INC N10 ; Move to next
ENDIF
IF N11 GT 0 DEC N11 ; Count header lines
ENDWHILE
;
; Re-open the BBS-Mail file and restore its position
;
REMA400:
FOPENI S24&"\BBS-Mail" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S24&"\BBS-Mail"
GOSUB Error ; Report
GOTO REMA900 ; And we're done
ENDIF
SET IPOS S29 ; Restore saved position
LOAD FSAVEI "BBMAINT4.STK"
;
; Display (and prepare relpies to) the note
;
IF NOT ZERO N10 GOSUB Display
IF FLAG(0) GOTO REMA900 ; Exit if ESC
GOTO REMA100 ; and continue
;
; We have end-of-file
;
REMA900:
SET FLAG(0) OFF ; Clear ESC flag
FCLOSEI ; CLose input file
DEALLOCATE ; Deallocate variables
DELETE "BBMAINT4.STK" ; Delete temp file
RETURN
; -----------------------------------------------------------------------
; ----- Display: Display mail listings
;
; Entry: S1 -----> File name carrying mail
; S10 ----> BBS-Mail record
; V0-V99 -> Contain the records to display
; N10 ----> Carries the # Vx records
; Exit: FLAG(0) is set to return to main (ESC)
; Note: All values, except N99 may be modified
;
Display:
S28 = "_Legend"
LEGEND "F10 (help), , PgUp, PgDn"
;
; Save current variables
;
S27 = "_ONESCape" ; Save original handler
ON ESCAPE GOSUB DispEsc ; Set new ESC handler
;
; Open a window
;
SSIZE N80 ; Get # lines
SAVE 0,0 N80-2,79 ; Save screen area
DWINDOW 1,0 N80-3,79 ; Set new DWINDOW
CLEAR N99 ; Clear window and set new attr

SET WRAP OFF ; No line wrap at col 80
ATSAY 0,0 N99 "²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"
ATSAY N80-2,0 N99 "²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"

ATSAY 0,2 N99 " BBS Mail "
S0 = S10(25:37)&"" ; Extract fname
LENGTH S0 N0 ; get fname length
ATSAY 0,76-N0 N99 " "*S0&" "
ATSAY N80-2,25 N99 " Press ESC to return to main "
;
; Display fixed portion
;
ATSAY 2,0 N99 "From: "*S10(8:15)
ATSAY 3,0 N99 "To: "*S10(0:7)
ATSAY 4,0 N99 "Posted: "*S10(17:24)

ATSAY 5,0 N99 "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
ATSAY 6,0 N99 "Subject: "*S10(38:78)
ATSAY 7,0 N99 "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
;
; Display text
;
N11 = N80-12 ; Compute end line
IF N11 GE N10 N11 = N10-1 ; ..
SCREEN 9,0 9+N11,79 N99 V0 ; Display all at once

IF N10 GT N80-11 LEGEND "_LEGEND"&", CurUp, CurDn"
;
; Now, wait for entry
;
DISP100:
IF NOT FLAG(0) KEYGET S0 ; Wait for entry
IF FLAG(0) GOTO DISPXIT ; Return on ESC

SWITCH S0 ; Act upon entry
CASE "0d" ; Carriage return
GOTO DISPXIT ; Done with display
ENDCASE
CASE "5100" ; PgDn
GOTO DISPXIT ; Done with display
ENDCASE
CASE "4900" ; PgUp
S3 = "_IPOS" ; Read current position
FRESTOREI ; Restore current file pos
IF SUCCESS ; .. if that worked
FRESTOREI ; .. do it again
IF SUCCESS GOTO DISPXIT
FSAVEI ; Restore the one stacked addr
ENDIF ; If not 2 stored on stack, fall thru
SET IPOS S3 ; Failed... restore original pos
SOUND 100,400 ; Bronx cheer
KFLUSH ; FLush typeahead
GOTO DISP100 ; And continue
ENDCASE
CASE "4800" ; Cursor up
IF N11 GT N80-12 ; If anything to scroll
SCROLL -1 9,0 N80-3,79 N99
DEC N11
ATSAY 9,0 N99 V0[N11-N80+12]
ELSE ; Nothing to scroll
SOUND 100,400 ; Bronx cheer
ENDIF
KFLUSH ; FLush typeahead
GOTO DISP100
ENDCASE
CASE "5000" ; Cursor down
IF N11 LT N10-1 ; If anything to scroll
SCROLL 1 9,0 N80-3,79 N99
INC N11
ATSAY N80-3,0 N99 V0[N11]
ELSE ; Nothing to scroll
SOUND 100,400 ; Bronx cheer
ENDIF
KFLUSH ; FLush typeahead
GOTO DISP100
ENDCASE
CASE "4700" ; Home
SCROLL 0 9,0 N80-3,79 N99
N11 = N80-12 ; Compute end line
IF N11 GE N10 N11 = N10-1; ..
SCREEN 9,0 9+N11,79 N99 V0 ; Display all at once
GOTO DISP100
ENDCASE
CASE "4400" ; F10
N0 = 0 ; Indicate call from Display
GOSUB Help ; Display help screen
ENDCASE
CASE "1300" ; Alt-R
GOSUB Reply ; Reply to Forum messages
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,0,N80-3,79 ; Reset dwindow after shell
LEGEND "_LEGEND" ; Redo the legend
ENDCASE
DEFAULT ; None of the above
SOUND 100,400 ; Bronx cheer
KFLUSH ; Flush kbd
ENDCASE
ENDSWITCH
IF FLAG(0) GOTO DISPXIT ; Return on ESC
GOTO DISP100
;
; End of display - restore screen
;
DISPXIT:
ON ESCAPE GOSUB S27 ; Set original handler
LEGEND S28 ; Set original legend
CLEAR "_DEFA" ; Set attrs back
RESTORE
DWIND 1,2 22,78 ; Re-Establish scrolling region
SET WRAP ON ; line wrap at col 80 again
RETURN ; Done with display
;
; ESC pressed during routine
;
DispEsc:
SET FLAG(0) ON ; Flag fact
RETURN
; -----------------------------------------------------------------------
; ----- Reply: Replay to a note
;
; Entry: S1 -> File name carrying mail
; S10 -> BBS-Mail record
; Exit: FLAG(0) is set to return to main (ESC)
;
Reply:
WOPEN 8,15,10,55 (defa) DispEsc
ATSAY 8,17 (defa) " Message Type "
ATSAY 9,17 (defa) " Private reply (Y/N,cr=N)?"
ATSAY 10,29 (defa) " Press ESC to cancel "
;
; Ask for a selection
;
S0 = "" ; Make a NULL for loop
WHILE NULL S0
ATGET 9,44 (defa) 1 S0 ; Get resp
IF FLAG(0) ; Exit if ESC hit
SET FLAG(0) OFF ; Clear flag setting
WCLOSE ; CLose open window
RETURN ; Exit if ESC hit
ENDIF
IF NULL S0 S0 = "n" ; Default cr=no
IF NOT FIND "YN" S0 ; Require y/n
SOUND 100,100 ; Displeased
S0 = "" ; Force a loop
ENDIF
ENDWHILE
WCLOSE ; CLose window
S12 = S0 ; Save private flag
;
; Ask for a subject
;
WOPEN 8,15,11,65 (defa) DispEsc
ATSAY 8,17 (defa) " Subject "
ATSAY 9,17 (defa) "Enter the subject line please:"
ATSAY 11,29 (defa) " Press ESC to cancel "
;
; Ask for a subject
;
S0 = "" ; Make a NULL for loop
ATGET 10,17 (defa) 48 S0 ; Get resp
IF FLAG(0) ; Exit if ESC hit
SET FLAG(0) OFF ; Clear flag setting
WCLOSE ; CLose open window
RETURN ; Exit if ESC hit
ENDIF
IF NULL S0 ; If no response...
S0 = S10(38:77)&"" ; Default response
IF NOT FIND S10(38:47) "Reply to: " S0 = "Reply to: "*S0
ENDIF
WCLOSE ; CLose window
S13 = S0 ; Save subject line
;
; Construct a file name for the new message
;
N2 = 0 ; Make smallest possible date
S11 = S24&"\"*S10(8:15)&"." ; Save fname
WHILE ISFILE S11*N2 and N2 LT 1000
INC N2 ; Move to next
ENDWHILE ; If no error
IF N2 GE 1000
S0 = "Cannot reply... you have "*N2*" notes outstanding"
GOSUB Error
RETURN
ENDIF
S11 = S11*N2 ; Save fname to use
;
; Build an editor batch file
;
FOPENO "BBMAINT.TMP" text ; Try to open file
IF FAILED ; From FOPENO above
S0 = "Error opening BBMAINT.TMP"
GOSUB Error ; Report
RETURN ; Return to caller
ENDIF
;
; The first command is to open the new file
;
WRITE "edit "
S0 = S11&"" ; Replicate
PRESERVE S0 ; Retain !s ^s and `s
WRITE S0 ; Write
WRITE "!" ; And a crlf
;
; Place the header to the file
;
S0 = S10(8:15)
PRESERVE S0
WRITE "To: "*S0
WRITE "!Insert!"
WRITE "From: "*"Sysop"
WRITE "!Insert!"
WRITE "Date: "*"_DATE"*" "*"_Time"
WRITE "!Insert!"
S0 = S13
PRESERVE S0
WRITE "Subject: "*S0
WRITE "!Insert!"
WRITE "!Insert!"
;
; If a response batch file exists, the next command executes THAT
;
IF ISFILE S24&"\BBMAINT.RES"
S0 = S24&"" ; Replicate
PRESERVE S0 ; Retain !s ^s and `s
WRITE "@"*S0 ; Write beginning of cmd
WRITE "\BBMAINT.RES!" ; Write tail of cmd
GOTO REPL100 ; and continue
ENDIF
;
; No pre-existing batch file - make one
;
WRITE "set margin 1 76!"
WRITE "set exit text!"
WRITE "Top!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Home!"
WRITE ""*S10(8:15)&", greetings!"
WRITE "Insert!"
WRITE "Insert!"
WRITE "Begin text here; margin is set to 1:76; Wordwrap and INSERT enabled.!"
WRITE "Insert!"
WRITE "Press F3 to save response; Press F4 to cancel response; F10 for help!"
WRITE "Insert!"
WRITE "Press F8 to view the original note; F8 from that window returns here.!"
WRITE "Insert!"
WRITE "Insert!"
WRITE "Sysop!"
WRITE "Top!"
WRITE "Home!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "set insert!"
WRITE "^Z"
;
; Close the batch file
;
REPL100:
FCLOSEO ; Ready to use it
;
; Invoke the editor to write a response
;
SET TEXT N99 ; Reset Text attr
STACK "^@[email protected]!" ; ^@A -> F7; Stack batch file cmd
EDIT S1 ; Open original 1st, then "response"
SET TEXT "_DEFA" ; Make text mode
DELETE "BBMAINT.TMP" ; Delete temp file we created
IF NOT ISFILE S11 RETURN ; Skip if no response text prep'd
;
; Open the mail control file
;
FOPENO S24&"\BBS-Mail" text append
IF FAILED ; From FOPENO above
S0 = "Error opening BBS-Mail"
GOSUB Error ; Report
RETURN ; Return to caller
ENDIF
;
; Add a record to the mail file
;
S2(0:7) = S10(8:15) ; New 'to' is old from
S2(8:15) = "SYSOP" ; From ID
S2(16:16) = " " ; Privacy flag
IF FIND S12 "Y" S2(16:16) = "P" ; ..
S2(17:24) = "_DATE" ; Set date field
S2(25:37) = S10(8:15)&"."*N2 ; FIle name
S2(38:77) = S13 ; Subject
PRESERVE S2 ; Retain !s ^s and `s
WRITE S2 ; Issue Merge command
WRITE "!" ; And a crlf
;
; And we're done
;
FCLOSEO ; Done with file
RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: Help
;
Help:
WOPEN 0, 0,23,78 (default) DispEsc
ATSAY 0, 2 (Default) " BBMAINT Help "
ATSAY 23,28 (Default) " Press any key to continue "
;
; Constants for all displays
;
ATSAY 1,2 (default) " Returns to BBMAINT main menu"
ATSAY 2,2 (default) " Moves to next message"

ATSAY 4,2 (default) "CurUp Scrolls text up"
ATSAY 5,2 (default) "CurDn Scrolls text down"
ATSAY 6,2 (default) "Home Moves to top of text"
ATSAY 7,2 (default) "PgDn Moves to next display"
ATSAY 8,2 (default) "PgUp Moves to previous display"

ATSAY 10,2 (default) "Alt-F10 Shell-to-DOS"
ATSAY 11,2 (default) "Alt-F Directory search"
ATSAY 12,2 (default) "Alt-Q Edit a file"

ATSAY 14,2 (default) "Alt-R Reply to current message"
;
; Wait for a keypress, and return
;
KEYGET S0
WCLOSE
;
; ESCAPE during this screen
;
SET FLAG(0) OFF ; Clear flag if set
RETURN
; -----------------------------------------------------------------------
; ----- Compose: Compose and post an ad hoc note
;
; Entry: nothing
; Exit: FLAG(0) is set to return to main (ESC)
;
Compose:
WOPEN 8,15,10,55 N99 DispEsc
ATSAY 8,17 N99 " Addressee "
ATSAY 9,17 N99 " To: "
ATSAY 10,29 N99 " Press ESC to cancel "
;
; Ask for a selection
;
S0 = "" ; Make a NULL for loop
WHILE NULL S0
ATGET 9,22 N99 8 S0 ; Get resp
IF FLAG(0) ; Exit if ESC hit
SET FLAG(0) OFF ; Clear flag setting
WCLOSE ; CLose open window
RETURN ; Exit if ESC hit
ENDIF
LJ S0 ; Left justify
UPPER S0 ; Upper case it
IF NULL S0 ; Require a name
SOUND 100,100 ; Displeased
S0 = "" ; Force a loop
ENDIF
ENDWHILE
WCLOSE ; CLose window
S10 = S0 ; Save addressee
;
; Ask if private...
;
WOPEN 8,15,10,55 N99 DispEsc
ATSAY 8,17 N99 " Message Type "
ATSAY 9,17 N99 " Private reply (Y/N,cr=N)?"
ATSAY 10,29 N99 " Press ESC to cancel "
;
; Ask for a selection
;
S0 = "" ; Make a NULL for loop
WHILE NULL S0
ATGET 9,44 N99 1 S0 ; Get resp
IF FLAG(0) ; Exit if ESC hit
SET FLAG(0) OFF ; Clear flag setting
WCLOSE ; CLose open window
RETURN ; Exit if ESC hit
ENDIF
IF NULL S0 S0 = "n" ; Default cr=no
IF NOT FIND "YN" S0 ; Require y/n
SOUND 100,100 ; Displeased
S0 = "" ; Force a loop
ENDIF
ENDWHILE
WCLOSE ; CLose window
S11 = S0 ; Save private flag
;
; Ask for a subject
;
WOPEN 8,15,11,65 N99 DispEsc
ATSAY 8,17 N99 " Subject "
ATSAY 9,17 N99 "Enter the subject line please:"
ATSAY 11,29 N99 " Press ESC to cancel "
;
; Ask for a subject
;
S0 = "" ; Make a NULL for loop
ATGET 10,17 N99 48 S0 ; Get resp
IF FLAG(0) ; Exit if ESC hit
SET FLAG(0) OFF ; Clear flag setting
WCLOSE ; CLose open window
RETURN ; Exit if ESC hit
ENDIF
IF NULL S0 S0 = ".." ; If no response...
WCLOSE ; CLose window
S13 = S0 ; Save subject line
;
; Construct a file name for the new message
;
N2 = 0 ; Make smallest possible date
S14 = S24&"\"*S10&"." ; Save fname
WHILE ISFILE S14*N2 and N2 LT 1000
INC N2 ; Move to next
ENDWHILE ; If no error
IF N2 GE 1000
S0 = "Cannot reply... you have "*N2*" notes outstanding"
GOSUB Error
RETURN
ENDIF
S14 = S14*N2 ; Save fname to use
;
; Build an editor batch file
;
FOPENO "BBMAINT.TMP" text ; Try to open file
IF FAILED ; From FOPENO above
S0 = "Error opening BBMAINT.TMP"
GOSUB Error ; Report
RETURN ; Return to caller
ENDIF
;
; Place the header to the file
;
S0 = S10
PRESERVE S0
WRITE "To: "*S0
WRITE "!Insert!"
WRITE "From: "*"Sysop"
WRITE "!Insert!"
WRITE "Date: "*"_DATE"*" "*"_Time"
WRITE "!Insert!"
S0 = S13
PRESERVE S0
WRITE "Subject: "*S0
WRITE "!Insert!"
WRITE "!Insert!"
;
; If a response batch file exists, the next command executes THAT
;
IF ISFILE S24&"\BBMAINT.MES"
S0 = S24&"" ; Replicate
PRESERVE S0 ; Retain !s ^s and `s
WRITE "@"*S0 ; Write beginning of cmd
WRITE "\BBMAINT.MES!" ; Write tail of cmd
GOTO COMP100 ; and continue
ENDIF
;
; No pre-existing batch file - make one
;
WRITE "set margin 1 76!"
WRITE "set exit text!"
WRITE "Top!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Home!"
WRITE ""*S10&", greetings!"
WRITE "Insert!"
WRITE "Insert!"
WRITE "Begin text here; margin is set to 1:76; Wordwrap and INSERT enabled.!"
WRITE "Insert!"
WRITE "Press F3 to save response; Press F4 to cancel response; F10 for help!"
WRITE "Insert!"
WRITE "Insert!"
WRITE "Sysop!"
WRITE "Top!"
WRITE "Home!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "Down!"
WRITE "set insert!"
WRITE "^Z"
;
; Close the batch file
;
COMP100:
FCLOSEO ; Ready to use it
;
; Invoke the editor to write a response
;
SET TEXT N99 ; Reset Text attr
STACK "^@[email protected]!" ; ^@A -> F7; Stack batch file cmd
EDIT S14 ; Open original 1st, then "response"
SET TEXT "_DEFA" ; Make text mode
DELETE "BBMAINT.TMP" ; Delete temp file we created
IF NOT ISFILE S14 RETURN ; Skip if no response text prep'd
;
; Open the mail control file
;
FOPENO S24&"\BBS-Mail" text append
IF FAILED ; From FOPENO above
S0 = "Error opening BBS-Mail"
GOSUB Error ; Report
RETURN ; Return to caller
ENDIF
;
; Add a record to the mail file
;
S2(0:7) = S10 ; New 'to' is old from
S2(8:15) = "SYSOP" ; From ID
S2(16:16) = " " ; Privacy flag
IF FIND S11 "Y" S2(16:16) = "P" ; ..
S2(17:24) = "_DATE" ; Set date field
S2(25:37) = S10&"."*N2 ; FIle name
S2(38:77) = S13 ; Subject
PRESERVE S2 ; Retain !s ^s and `s
WRITE S2 ; Issue Merge command
WRITE "!" ; And a crlf
;
; And we're done
;
FCLOSEO ; Done with file
RETURN


  3 Responses to “Category : Communication (modem) tools and utilities
Archive   : CA29-3.ZIP
Filename : BBMAINT4.CMD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/