'===========================================================================
' Subject: BUNDLE MULTIPLE FILES              Date: 05-28-97 (00:44)       
'  Author: Kurt Kuzba                         Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: MISC.ABC
'===========================================================================
'>   I am trying to track down some code that would allow a
'>   program of mine to archive a few files, much like PKZIP
'>   does and of course unarchive the files.  Does anyone know
'>   of or have any such code they would be willing to part with?
'>....
'   Here are some simple routines to bundle files in a single
'archival file. The interface is a bit unfriendly, but the thing
'works like a charm. You can add whatever interface suits you
'and fits the program you are writing. Have a look at it.
'_|_|_|   FILEBAG.BAS
'_|_|_|   Simple file bundler routines for QB and QBasic.
'_|_|_|   No warrantee or guarantee is given or implied.
'_|_|_|   PUBLIC DOMAIN   by Kurt Kuzba.  (5/28/1997)
DECLARE SUB BAGit ()
DECLARE SUB UnBAGit ()
ON ERROR GOTO BooBoo
DO
   CLS : COLOR 15, 1
   LOCATE 5, 29: PRINT "  __----~~~~~~~~~~~~~~----__  "
   LOCATE 6, 29: PRINT " |  [ I ]=> Include files.  | "
   LOCATE 7, 29: PRINT " |  [ E ]=> Extract files.  | "
   LOCATE 8, 29: PRINT " |  [ Q ]=> Quit Program.   | "
   LOCATE 9, 29: PRINT "  ~~----______________----~~  "
   DO: k% = INSTR(" IEQ" + CHR$(27), UCASE$(INKEY$)): LOOP WHILE k% < 2
   SELECT CASE k%
      CASE 4, 5: EXIT DO
      CASE 2: BAGit
      CASE 3: UnBAGit
   END SELECT
LOOP:SYSTEM
BooBoo: Ferror$ = STR$(ERR): RESUME NEXT
SUB BAGit
   SHARED Ferror$: COLOR 10, 0: CLS
   INPUT "File to include => ", BagItem$
   INPUT ".BAG to hold it => ", Bagfile$
   Bag% = FREEFILE: Ferror$ = "ok": OPEN Bagfile$ FOR APPEND AS #Bag%
   IF Ferror$ <> "ok" THEN
      PRINT "File error. Unable to open "; Bagfile$
      WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND: EXIT SUB
   END IF: Itm% = FREEFILE: OPEN BagItem$ FOR INPUT AS #Itm%
   IF Ferror$ <> "ok" THEN
      PRINT "File error. Unable to open "; BagItem$
      WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND
      CLOSE Bag%: EXIT SUB
   END IF: CLOSE Itm%: OPEN BagItem$ FOR BINARY AS #Itm%
   DO: slash% = INSTR(BagItem$, "\")
      IF slash% > 0 THEN BagItem$ = MID$(BagItem$, slash% + 1)
   LOOP WHILE slash% > 0
   PRINT #Bag%, LEFT$(BagItem$ + "            ", 12);
   PRINT #Bag%, LEFT$(STR$(LOF(Itm%)) + "          ", 12);
   WHILE NOT EOF(Itm%): it$ = INPUT$(512, Itm%): PRINT #Bag%, it$;
   WEND: CLOSE Bag%: CLOSE Itm%
END SUB
SUB UnBAGit
   SHARED Ferror$: COLOR 10, 0: CLS
   INPUT ".BAG to unpack => ", Bagfile$
   Bag% = FREEFILE: Ferror$ = "ok": OPEN Bagfile$ FOR INPUT AS #Bag%
   IF Ferror$ <> "ok" THEN
      PRINT "File error. Unable to open .BAG "; Bagfile$
      WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND: EXIT SUB
   END IF: CLOSE Bag%: OPEN Bagfile$ FOR BINARY AS #Bag%
   IF Ferror$ <> "ok" THEN
      PRINT "File error. Unable to open .BAG "; Bagfile$
      WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND: EXIT SUB
   END IF: PRINT "Unpacking "; Bagfile$:
   PRINT "=============================="
   PRINT "File name      length     ===="
   DO: BagItem$ = INPUT$(12, Bag%): IL& = VAL(INPUT$(12, Bag%))
      IF LOC(Bag%) >= LOF(Bag%) THEN EXIT DO
      PRINT BagItem$, IL&
      Itm% = FREEFILE: OPEN BagItem$ FOR OUTPUT AS #Itm%
      IF Ferror$ <> "ok" THEN
         PRINT "File error. Unable to open "; BagItem$
         WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND
         CLOSE Bag%: EXIT SUB
      END IF
      FOR t& = 1 TO IL& \ 512
         it$ = INPUT$(512, Bag%): PRINT #Itm%, it$; : NEXT
      it$ = INPUT$(IL& MOD 512, Bag%): PRINT #Itm%, it$;
      CLOSE Itm%
   LOOP WHILE NOT EOF(Bag%): CLOSE Bag%
   PRINT "==== done ===================="
   WHILE INKEY$ <> "": WEND: WHILE INKEY$ = "": WEND
END SUB
'_|_|_|   end   FILEBAG.BAS
