home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1994-09-13 | 19.4 KB | 684 lines |
- '*****************************************************************************
- '*****************************************************************************
- '* AMOS NEW Files Lister, written by Ari Tsironis, 250594, PUBLIC DOMAIN *
- '*****************************************************************************
- '*****************************************************************************
- '
- '
- '*****************************************************************************
- '* Increase Variable Space *
- '*****************************************************************************
- '
- Set Buffer 10
- '
- '
- '*****************************************************************************
- '* Important Offsets into File.data *
- '*****************************************************************************
- '
- F_HEADER=466
- F_ENTRY=202
- '
- '
- '*****************************************************************************
- '* Important Offsets into User.data *
- '*****************************************************************************
- '
- U_HEADER=66
- U_ENTRY=308
- U_DATE=284
- '
- '
- '*****************************************************************************
- '* Important Offsets into MAXsBBS.config *
- '*****************************************************************************
- '
- S_HEADER=2496
- S_ENTRY=62
- S_ENTRIES=100*62
- '
- '
- '*****************************************************************************
- '* Numeric Constants *
- '*****************************************************************************
- '
- BUFFER_ENTRIES=200
- NO_OF_SECTIONS=100
- NO_OF_FILES=8
- NO_OF_MARKS=30
- SECTION_NAME_LENGTH=42
- FILE_NAME_LENGTH=41
- DESCRIPTION_LENGTH=60
- USER_NAME_LENGTH=41
- DROPPED_CARRIER=20
- NO_OF_ROWS=24
- DLOAD_FUNC=24
- '
- '
- '*****************************************************************************
- '* String Constants *
- '*****************************************************************************
- '
- FILE_DATA$="BBS:Files/File.data"
- BBS_CONFIG$="BBS:MAXSBBS.config"
- USER_DATA$="BBS:Userfiles/User.data"
- '
- '
- '*****************************************************************************
- '* Global Arrays *
- '*****************************************************************************
- '
- Dim SECTIONS$(NO_OF_SECTIONS),L_ACCESS(NO_OF_SECTIONS),H_ACCESS(NO_OF_SECTIONS)
- Dim SCR_MARKS(NO_OF_FILES),SCR_FILES$(NO_OF_FILES),SCR_SECTIONS(NO_OF_FILES)
- Dim MARKED_FILES$(NO_OF_MARKS),MARKED_SECTIONS(NO_OF_MARKS)
- '
- '
- '*****************************************************************************
- '* Global Numerics *
- '*****************************************************************************
- '
- MARKS=0
- FILE_DATE=0
- FILE_LENGTH=0
- DLOADS=0
- SECTION=0
- '
- '
- '*****************************************************************************
- '* Global Strings, MUST be Pre-Allocated to Maximum Anticipated Size!!! *
- '*****************************************************************************
- '
- SECTION$=Space$(SECTION_NAME_LENGTH)
- FILE_NAME$=Space$(FILE_NAME_LENGTH)
- DESCRIPTION$=Space$(DESCRIPTION_LENGTH)
- '
- '
- '*****************************************************************************
- '* Get the Node Number that MAXS sends us, through Command Args *
- '*****************************************************************************
- '
- NODE_NUMBER=Val(Left$(Command Line$,1))
- '
- '
- '*****************************************************************************
- '* Open a MAXS AMOS Door Port *
- '*****************************************************************************
- '
- CARRIER= Extension_16_0006(NODE_NUMBER)
- '
- '
- '*****************************************************************************
- '* Draw Initial Screen, and Check for Initial Loss of Carrier *
- '*****************************************************************************
- '
- CARRIER=CARRIER or Extension_16_0072(12)
- CARRIER=CARRIER or Extension_16_0152(13,0,"DOORS:AMOS/NewFiles.ansi")
- _LOCATE[33,12]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[37;41mSearching....."+Chr$(27)+"[0m")
- If CARRIER=DROPPED_CARRIER
- Extension_16_0018
- End
- End If
- '
- '
- '*****************************************************************************
- '* Get the User's Access Level *
- '*****************************************************************************
- '
- U_ACCESS= Extension_16_0106(1)
- '
- '
- '*****************************************************************************
- '* Allocate Space and then Get the User's Name *
- '*****************************************************************************
- '
- USER_NAME$=Space$(USER_NAME_LENGTH)
- CARRIER=CARRIER or Extension_16_011A(1,USER_NAME$)
- '
- '
- '*****************************************************************************
- '* Get Today's Date *
- '*****************************************************************************
- '
- _GET_DATE
- _TODAYS_DATE=Param
- '
- '
- '*****************************************************************************
- '* Get the Date of the User's Last Login *
- '*****************************************************************************
- '
- _GET_USER_DATE
- USER_DATE=Param
- '
- '
- '*****************************************************************************
- '* Read in ALL the File Sections' Names *
- '*****************************************************************************
- '
- _GET_SECTION_NAMES
- '
- '
- '*****************************************************************************
- '* Do the File Showing/Selecting/Downloading *
- '*****************************************************************************
- '
- _MAIN
- '
- '
- '
- '*****************************************************************************
- '* Close the MAXS AMOS Door Port and Finish *
- '*****************************************************************************
- '
- Extension_16_0018
- '
- End
- '
- '
- '
- Procedure _MAIN
- '
- Shared FILE_DATE,FILE_LENGTH,DLOADS,SECTION
- Shared SECTION$,FILE_NAME$,DESCRIPTION$
- Shared FILE_DATA$,F_HEADER,F_ENTRY,BUFFER_ENTRIES
- Shared _TODAYS_DATE,USER_DATE,FILE_NAME_LENGTH
- Shared U_ACCESS,L_ACCESS(),H_ACCESS()
- Shared SCR_FILES$(),SCR_SECTIONS()
- Shared NO_OF_FILES,NO_OF_MARKS,MARKED_FILES$(),MARKED_SECTIONS()
- Shared DLOAD_FUNC,NO_OF_ROWS,CARRIER,DROPPED_CARRIER
- '
- '
- Open In 1,FILE_DATA$
- FLENGTH=Lof(1)
- '
- '
- '*** Reads in BUFFER_ENTRIES, (ie 200), Files at a Time ***
- '
- NO_OF_ENTRIES=(FLENGTH-F_HEADER)/F_ENTRY
- NO_OF_BUFFERS=NO_OF_ENTRIES/BUFFER_ENTRIES
- ENTRIES_REMAINING=NO_OF_ENTRIES mod BUFFER_ENTRIES
- '
- '
- '*** Allocate Memory for our BUFFER_ENTRIES Files ***
- '
- Pof(1)=F_HEADER
- Reserve As Work 15,F_ENTRY*BUFFER_ENTRIES
- '
- ROWS=0
- FOUND_A_FILE=0
- '
- '
- '*** Loop for (Total Number of Files/BUFFER_ENTRIES) ***
- '
- For I=1 To NO_OF_BUFFERS
- Sload 1 To Start(15),F_ENTRY*BUFFER_ENTRIES
- '
- '
- '*** For BUFFER_ENTRIES Files, Scan in Each File's Data ***
- '
- For J=0 To BUFFER_ENTRIES-1
- _SCAN_FILE_ENTRY[Start(15)+J*F_ENTRY]
- '
- '
- '*** If we Find a File that the User hasn't Seen, then Show it ***
- '
- If FILE_DATE<=_TODAYS_DATE and FILE_DATE>=USER_DATE and U_ACCESS>=L_ACCESS(SECTION) and U_ACCESS<=H_ACCESS(SECTION)
- If FOUND_A_FILE=0
- _LOCATE[1,12]
- S$=Space$(80)
- CARRIER=CARRIER or Extension_16_002A(S$)
- End If
- '
- FOUND_A_FILE=1
- '
- _LOCATE[1,ROWS+1+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[0m"+FILE_NAME$)
- _LOCATE[21,ROWS+1+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[33m"+DESCRIPTION$)
- _LOCATE[21,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[36mSize ="+Str$(FILE_LENGTH))
- _LOCATE[38,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A("Downloads ="+Str$(DLOADS))
- _LOCATE[55,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[32m"+SECTION$)
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- '
- '*** Put New File Name into the Screen Display Name Array ***
- '
- SCR_FILES$(ROWS/2)=Space$(FILE_NAME_LENGTH)
- For K=0 To FILE_NAME_LENGTH-1
- Poke Varptr(SCR_FILES$(ROWS/2))+K,Peek(Varptr(FILE_NAME$)+K)
- Next
- '
- '
- '*** Put New File's Section into the Screen Display Section Array ***
- '
- SCR_SECTIONS(ROWS/2)=SECTION
- '
- Inc ROWS
- Inc ROWS
- '
- '
- '*** If the Maximum Number of Files have been Displayed ***
- '*** Then Allow User to Proceed with File Marking ***
- '
- If ROWS=NO_OF_FILES*2
- _MARK_FILES[ROWS]
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- ROWS=0
- _CLEAR_WINDOW
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- End If
- End If
- Next
- Next
- '
- '
- '*** Do it ALL Again, but this Time for the Remaining Files ***
- '
- Sload 1 To Start(15),F_ENTRY*ENTRIES_REMAINING
- '
- '
- '*** For ENTRIES_REMAINING Files, Scan in Each File's Data ***
- '
- For J=0 To ENTRIES_REMAINING-1
- _SCAN_FILE_ENTRY[Start(15)+J*F_ENTRY]
- '
- '
- '*** If we Find a File that the User hasn't Seen, then Show it ***
- '
- If FILE_DATE<=_TODAYS_DATE and FILE_DATE>=USER_DATE and U_ACCESS>=L_ACCESS(SECTION) and U_ACCESS<=H_ACCESS(SECTION)
- If FOUND_A_FILE=0
- _LOCATE[1,12]
- S$=Space$(80)
- CARRIER=CARRIER or Extension_16_002A(S$)
- End If
- '
- FOUND_A_FILE=1
- '
- _LOCATE[1,ROWS+1+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[0m"+FILE_NAME$)
- _LOCATE[21,ROWS+1+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[33m"+DESCRIPTION$)
- _LOCATE[21,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[36mSize ="+Str$(FILE_LENGTH))
- _LOCATE[38,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A("Downloads ="+Str$(DLOADS))
- _LOCATE[55,ROWS+2+NO_OF_ROWS-NO_OF_FILES*2]
- CARRIER=CARRIER or Extension_16_002A(Chr$(27)+"[32m"+SECTION$)
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- '
- '*** Put New File Name into the Screen Display Name Array ***
- '
- SCR_FILES$(ROWS/2)=Space$(FILE_NAME_LENGTH)
- For K=0 To FILE_NAME_LENGTH-1
- Poke Varptr(SCR_FILES$(ROWS/2))+K,Peek(Varptr(FILE_NAME$)+K)
- Next
- '
- '
- '*** Put New File's Section into the Screen Display Section Array ***
- '
- SCR_SECTIONS(ROWS/2)=SECTION
- '
- Inc ROWS
- Inc ROWS
- '
- '
- '*** If the Maximum Number of Files have been Displayed ***
- '*** Then Allow User to Proceed with File Marking ***
- '
- If ROWS=NO_OF_FILES*2
- _MARK_FILES[ROWS]
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- ROWS=0
- _CLEAR_WINDOW
- '
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- '
- End If
- End If
- Next
- '
- If ROWS>0
- _MARK_FILES[ROWS]
- End If
- '
- Erase 15
- Close 1
- '
- '
- '*** For ALL Marked Files, Download to User ***
- '
- For I=0 To NO_OF_MARKS-1
- If MARKED_SECTIONS(I)>0
- CARRIER=CARRIER or Extension_16_0152(DLOAD_FUNC,MARKED_SECTIONS(I),MARKED_FILES$(I))
- If CARRIER=DROPPED_CARRIER
- Pop Proc
- End If
- End If
- Next
- '
- '
- '*** No New Files were Found!!! ***
- '
- If FOUND_A_FILE=0
- _LOCATE[21,12]
- C= Extension_16_002A(Chr$(27)+"[37;41mNo NEW Files since you were last on!%Y"+Chr$(27)+"[0m")
- End If
- '
- End Proc
- '
- Procedure _MARK_FILES[NO_OF_ROWS]
- '
- Shared SCR_MARKS(),SCR_FILES$(),SCR_SECTIONS()
- Shared MARKED_FILES$(),MARKED_SECTIONS()
- Shared NO_OF_FILES,MARKS,NO_OF_MARKS
- Shared DLOAD_FUNC,CARRIER,DROPPED_CARRIER
- '
- '
- '*** First Time in Here there are No Files Marked ***
- '
- LOCAL_MARKS=0
- For I=0 To NO_OF_FILES-1
- SCR_MARKS(I)=0
- Next
- '
- BASE=NO_OF_ROWS-NO_OF_FILES*2
- ROW=BASE
- '
- '
- '*** Do ALL this Until Space Bar is Hit ***
- '
- Repeat
- _LOCATE[1,ROW+1]
- Repeat
- '
- '
- '*** Get a Key Immeadiately and Filter out any Non-ASCII Info ***
- '
- K= Extension_16_0184
- K=K and $FF
- K$=Chr$(K)
- Until K<>0
- '
- '
- '*** If User has Quit or Dropped Carrier then Exit ***
- '
- If(K=DROPPED_CARRIER) or(K$="Q") or(K$="q")
- CARRIER=DROPPED_CARRIER
- '
- For I=0 To NO_OF_FILES-1
- If SCR_MARKS(I)=1
- If MARKS=NO_OF_MARKS
- Exit
- End If
- '
- MARKED_FILES$(MARKS)=SCR_FILES$(I)
- MARKED_SECTIONS(MARKS)=SCR_SECTIONS(I)
- Inc MARKS
- End If
- Next
- '
- '
- '*** If User is Still Around then Download any Marked Files ***
- '
- For I=0 To NO_OF_MARKS-1
- If MARKED_SECTIONS(I)>0
- C= Extension_16_0152(DLOAD_FUNC,MARKED_SECTIONS(I),MARKED_FILES$(I))
- End If
- Next
- '
- Pop Proc
- End If
- '
- '
- '*** Down Arrow Key ***
- '
- If K$="2"
- Inc ROW
- Inc ROW
- If ROW=NO_OF_ROWS+BASE
- ROW=BASE
- End If
- End If
- '
- '
- '*** Up Arrow Key ***
- '
- If K$="8"
- Dec ROW
- Dec ROW
- If ROW=BASE-2
- ROW=NO_OF_ROWS+BASE-2
- End If
- End If
- '
- '
- '*** Mark File ***
- '
- If K=13
- _LOCATE[1,ROW+1]
- '
- MARK_INDEX=(ROW-BASE)/2
- '
- SCR_MARKS(MARK_INDEX)=SCR_MARKS(MARK_INDEX) xor 1
- If SCR_MARKS(MARK_INDEX)=1
- C= Extension_16_002A(Chr$(27)+"[37;45m"+SCR_FILES$(MARK_INDEX))
- C= Extension_16_002A(Chr$(27)+"[0m")
- Inc LOCAL_MARKS
- '
- If MARKS+LOCAL_MARKS=NO_OF_MARKS
- SCR_MARKS(MARK_INDEX)=SCR_MARKS(MARK_INDEX) xor 1
- _LOCATE[1,ROW+1]
- C= Extension_16_002A(Chr$(27)+"[37;40m"+SCR_FILES$(MARK_INDEX))
- Dec LOCAL_MARKS
- Bell
- _LOCATE[21,8]
- C= Extension_16_002A(Chr$(27)+"[37;41mMaximum Files Marked, you LEECH :-)%Y"+Chr$(27)+"[0m")
- S$=Space$(80)
- _LOCATE[1,8]
- C= Extension_16_002A(S$)
- End If
- '
- Else
- If SCR_MARKS(MARK_INDEX)=0
- _LOCATE[1,ROW+1]
- C= Extension_16_002A(Chr$(27)+"[37;40m"+SCR_FILES$(MARK_INDEX))
- Dec LOCAL_MARKS
- End If
- End If
- '
- End If
- Until K=32
- '
- '
- '*** Set Marked Arrays with Stuff Selected by the User in the Screen Arrays ***
- '
- For I=0 To NO_OF_FILES-1
- If SCR_MARKS(I)=1
- If MARKS=NO_OF_MARKS
- Exit
- End If
- '
- MARKED_FILES$(MARKS)=SCR_FILES$(I)
- MARKED_SECTIONS(MARKS)=SCR_SECTIONS(I)
- Inc MARKS
- End If
- Next
- '
- End Proc
- '
- Procedure _SCAN_FILE_ENTRY[BUFFER]
- '
- Shared SECTIONS$(),FILE_NAME_LENGTH,DESCRIPTION_LENGTH
- Shared FILE_DATE,FILE_LENGTH,DLOADS,SECTION
- Shared SECTION$,FILE_NAME$,DESCRIPTION$
- '
- '
- '*** Gets ALL the Relevant Info for a File Entry ***
- '
- FILE_DATE=Leek(BUFFER)
- FILE_LENGTH=Leek(BUFFER+8)
- DLOADS=Leek(BUFFER+12)
- '
- SECTION=Peek(BUFFER+17)
- SECTION$=SECTIONS$(SECTION)
- '
- For I=0 To FILE_NAME_LENGTH-1
- Poke Varptr(FILE_NAME$)+I,Peek(BUFFER+18+I)
- Next
- '
- For I=0 To DESCRIPTION_LENGTH-1
- Poke Varptr(DESCRIPTION$)+I,Peek(BUFFER+59+I)
- Next
- '
- End Proc[FOUND]
- '
- Procedure _GET_SECTION_NAMES
- '
- Shared BBS_CONFIG$,SECTIONS$(),L_ACCESS(),H_ACCESS()
- Shared S_HEADER,S_ENTRIES,S_ENTRY
- Shared NO_OF_SECTIONS,SECTION_NAME_LENGTH
- '
- '
- '*** Reads in ALL the Section Names from MAXsBBS.config ***
- '
- Open In 1,BBS_CONFIG$
- FLENGTH=Lof(1)
- Pof(1)=S_HEADER
- Reserve As Work 15,S_ENTRIES
- Sload 1 To Start(15),S_ENTRIES
- Close 1
- '
- For I=0 To NO_OF_SECTIONS-1
- SECTIONS$(I)=Space$(SECTION_NAME_LENGTH)
- Next
- '
- For I=0 To NO_OF_SECTIONS-1
- For J=0 To SECTION_NAME_LENGTH-1
- Poke Varptr(SECTIONS$(I))+J,Peek(Start(15)+S_ENTRY*I+J)
- Next
- '
- L_ACCESS(I)=Leek(Start(15)+S_ENTRY*I+42)
- H_ACCESS(I)=Leek(Start(15)+S_ENTRY*I+46)
- Next
- '
- Erase(15)
- '
- End Proc
- '
- Procedure _GET_USER_DATE
- '
- Shared USER_DATA$,U_HEADER,U_ENTRY,U_DATE,USER_NAME$
- Shared USER_NAME_LENGTH
- '
- '
- Open In 1,USER_DATA$
- FLENGTH=Lof(1)
- Reserve As Work 15,FLENGTH
- Sload 1 To Start(15),FLENGTH
- Close 1
- '
- NO_OF_USERS=(FLENGTH-U_HEADER)/U_ENTRY
- '
- NAME$=Space$(USER_NAME_LENGTH)
- '
- '
- '*** Search for the Current User's Name ***
- '
- For I=0 To NO_OF_USERS-1
- For J=0 To USER_NAME_LENGTH-1
- Poke Varptr(NAME$)+J,Peek(Start(15)+U_HEADER+U_ENTRY*I+J)
- Next
- '
- K=0
- FOUND_NAME=0
- '
- Repeat
- CH1=Peek(Varptr(USER_NAME$)+K)
- CH2=Peek(Varptr(NAME$)+K)
- If CH1<>CH2
- Exit
- Else
- If CH1=0
- FOUND_NAME=1
- Exit 2
- End If
- End If
- '
- Inc K
- Until CH1=0
- '
- Next
- '
- '
- '*** If Current User is Found, then Get their Last Login Date ***
- '
- If FOUND_NAME=1
- DATE=Leek(Start(15)+U_HEADER+U_ENTRY*I+U_DATE)
- Else
- DATE=0
- End If
- '
- Erase 15
- '
- End Proc[DATE]
- '
- Procedure _GET_DATE
- '
- DATE$=Space$(12)
- Dreg(1)=Varptr(DATE$)
- TEMP=Doscall(-192)
- DATE=Leek(Varptr(DATE$))
- '
- End Proc[DATE]
- '
- Procedure _CLEAR_WINDOW
- '
- Shared NO_OF_FILES,NO_OF_ROWS
- Shared CARRIER,DROPPED_CARRIER
- '
- '
- For I=NO_OF_ROWS-NO_OF_FILES*2+1 To NO_OF_ROWS
- _LOCATE[1,I]
- C$=Space$(80)
- CARRIER=CARRIER or Extension_16_002A(C$)
- If CARRIER=DROPPED_CARRIER
- Exit
- End If
- Next
- '
- End Proc
- '
- Procedure _LOCATE[X,Y]
- '
- Shared CARRIER
- '
- '
- A$=Chr$(27)+"["+Mid$(Str$(Y),2)+";"+Mid$(Str$(X),2)+"H"
- CARRIER=CARRIER or Extension_16_002A(A$)
- '
- End Proc