home *** CD-ROM | disk | FTP | other *** search
- ;**** 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.
- ; -----------------------------------------------------------------------
- ;
- ; 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
- ;
- ; Paint 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 "
- MAFI100:
- CLEAR ; Clear window
- LOCATE 2,2
-
- MESS " 1) Clean up mail directory"
- MESS " 2) Delete notes older than ..."
- MESS "_______________________________________"
- MESS " "
- MESS "Select item (carriage return = previous): "
- ;
- ; Wait for entry, and interpret
- ;
- GET S0 1 ; Wait for it
- SWITCH S0 ; Act according to keyget
- CASE "1"
- GOSUB ClrMail
- ENDCASE
- CASE "2"
- GOSUB DelMail
- ENDCASE
- CASE "_NULL" ; c/r alone is exit
- WCLOSE ; Close window...
- RETURN ; and return to caller
- ENDCASE
- DEFAULT ; None of the above
- SOUND 100,100 ; Bronx cheer
- ENDCASE
- ENDSWITCH
- GOTO MAFI100 ; 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 any key to continue "
- ;
- ; Wait a keypress
- ;
- GENU100:
- LOCATE 12,15
- GET S0 5 ; Wait for a number
- IF NOT FLAG(0) ; If wasn't ESCAPE
- ATOI S0 N0 ; Convert w/o err msg
- IF ERROR ; If couldn't convert
- 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