'===========================================================================
' Subject: FILE SPLITTER                      Date: 08-30-00 (14:48)       
'  Author: Jeremiah Hyde                      Code: QB, QBasic, PDS        
'  Origin: fishoffire@yahoo.com             Packet: MISC.ABC
'===========================================================================
'PPPPPP
'PP  PP
'PP  PP rr rrr   oooo   ggg gg rr rrr  aaaa   mm  mm    eeee   rr rrr   zzzzzz
'PPPPP   rrr rr oo  oo gg  gg   rrr rr    aa  mmmmmmm  ee  ee   rrr rr  z  zz
'PP      rr  rr oo  oo gg  gg   rr  rr aaaaa  mmmmmmm  eeeeee   rr  rr    zz
'PP      rr     oo  oo  ggggg   rr    aa  aa  mm m mm  ee       rr       zz  z
'PP     rrrr     oooo      gg  rrrr    aaaaa  mm   mm   eeee   rrrr     zzzzzz
'                        ggggg                            (  /\__________/\  )
'                                                          \(^ @___..___@ ^)/
'  ###########                                              /\ (\/\/\/\/) /\
'  # ___ ___ #   RRRRR          lll          !!   !!       /  \(/\/\/\/\)/  \ 
'  { (0) (0) }   RR  RR          ll         !!!! !!!!     (    """"""""""    )
'  |    P    |   RR  RR uu  uu   ll  zzzzzz !!!! !!!!     \      _____      /
'   \ \___/ /    RRRRR  uu  uu   ll  z  zz  !!!! !!!!     (     /(   )\     )
'    \_____/     RR RR  uu  uu   ll    zz    !!   !!      _)   (_V) (V_)   (_
' Jeremiah "BJ"  RR  RR uu  uu   ll   zz  z              (V)(V)(V)   (V)(V)(V)
'     Hyde       RR  RR  uuu uu llll zzzzzz  !!   !!          My dog Smokey,
'                                                            aka Stupid Mutt
'
' This code released under the GNU General Public License. This means you
' can use it, compile it, pass it around, modify it, WHATEVER! However,
' if you do this, I will expect notification and a copy of whatever you've
' done, unless it's a virus, or breaking into the CIA, etc.
'                                                    Jeremiah "BJ" Hyde
'E-Mail me at: fishoffire@yahoo.com                fishoffire Industries:
' Visit me at: www.fishoffire.com                     Your source for
'                                                    EVERYTHING QBasic
'Note:
' This code has been tested on my machines:
'   ASUS TX97x WOA: AMD K6-266, 160MB RAM, 20.5 GB HD, 15" PnP(SVGA+) Monitor,
'       Win98 DOSBox
'   AT&T Globalyst 520: Intel 486 DX 66mhz, 19MB RAM, 14" SVGA Monitor,
'       Win95 DOSBox
'   Compaq Deskpro 4/33i: Intel 386 33mhz, 4MB RAM, 14" SVGA Monitor,
'       MS-DOS 6.22/Win3.11
' and has run correctly under those environments. However, no guarantee,
' warranty, or any other declaration of safety, etc. is offered. If your
' computer system is taken over by smurfs, or the ROM is RAMed, or
' anything else of a detrimental nature happens to your PC as a result
' of this code, I am *not* responsible for it. The full burden of blame
' rests squarely on your shoulders.(Of course, if something GOOD happens to
' your computer as a result of this code, well, obviously, I did it!)
' -------------
' In other words: You're on your own, pal!
'
' This is just something I threw together in about 20 minutes, so
' no comments about my (lack of) programming skill. Anyway, what
' this does is, it splits a file up into chunks. This is highly
' useful if you have to transport some massive file on floppies.
' (Ex: Internut Exploiter 5). Hav Phun.

DEFDBL A-Z
SHELL "DIR /-W/A-S/P/O"
INPUT "Enter filename:   ", FileName$
OPEN FileName$ FOR BINARY ACCESS READ AS #1
FileLen = LOF(1)
IF FileLen = 0 THEN CLOSE 1: PRINT "Bad filename!": END
INPUT "Enter chunk size: ", ChunkSize
IF ChunkSize < 1 OR ChunkSize > FileLen THEN CLOSE 1: PRINT "Bad chunk-size!": END

NumPackets = FIX(FileLen / ChunkSize)
IF NumPackets * ChunkSize < FileLen THEN NumPackets = NumPackets + 1
FOR i = 1 TO NumPackets
    num$ = RIGHT$("000" + LTRIM$(STR$(i - 1)), 3)
    OPEN "SPLIT." + num$ FOR BINARY ACCESS WRITE AS #2
        PRINT "Writing chunk" + STR$(i) + " ";
        k = ((i - 1) * ChunkSize)
        IF FileLen - k < ChunkSize THEN PRINT "PARTIAL ";
        FOR j = 1 TO ChunkSize STEP 1024
            IF ChunkSize > 1024 THEN
                IF (j MOD (ChunkSize \ 1024)) = 0 THEN
                        PRINT ".";
                END IF
            END IF
            A$ = SPACE$(1024)
            IF (ChunkSize - (LOC(1) - k)) < 1024 THEN A$ = SPACE$(ChunkSize - (LOC(1) - k))
            IF (FileLen - LOC(1)) < 1024 THEN A$ = SPACE$(FileLen - LOC(1))
           
            GET #1, k + j, A$
            PUT #2, j, A$
            IF j + 1024 > FileLen THEN EXIT FOR
        NEXT j
        PRINT "Done!"
    CLOSE #2
NEXT i
CLOSE #1
PRINT
PRINT "Done!!!"
