Submitted-by: Andy Tefft (ART100@psuvm.psu.edu) Posting-number: Volume 1, Source:31 Archive-name: archive/aaf_basic Architecture: ANY_2 Version-number: 1.00 The AAF (Apple Archive Format) tools implemented in Basic, for those of you lacking a C compiler. Enjoy. =paaf.doc - -Andy Tefft -ART100@psuvm.psu.edu -99 E. Main St. -North East, PA 16428 - -paaf.bas -Version 1.00 - -Features of this version: - -- lets you change the filename that it writes into the file - if you desire (for the = line) -- if you try and write a line > 79 columns (which would be truncated - by mailers) you are warned, but the line is written as-is anyway. - -You can choose to create a new archive or append to an existing -one. The only real difference is if you choose "new" the archive -is deleted if it exists already. It is ok to use "append" on -a new file. - =paaf.bas - 1 ONERR GOTO 2000 - 4 LOMEM: 16384 - 5 IN$ = "X": REM must be first string assigned - 10 TEXT : HOME - 15 PRINT "AAF Packer, v1.0" - 20 PRINT : PRINT "By Andy Tefft (art100@psuvm.psu.edu)" - 25 PRINT : PRINT "Freeware. Use with appropriate caution." - 30 PRINT : PRINT "Notes:" - 40 PRINT : PRINT "1) 'Pathname' means any valid ProDOS' - 45 PRINT " full or partial pathname." - 46 PRINT - 50 PRINT "2) Pressing RETURN at the input/output" - 55 PRINT " file prompts returns you to the menu" - 60 PRINT : PRINT "3) Both input and output volumes must" - 65 PRINT " be online." - 70 PRINT : PRINT "4) Looks best in 40 columns." - 75 PRINT : PRINT "5) You will be warned when adding lines" - 76 PRINT " longer than 79 columns." - 80 PRINT : PRINT "Press a key to continue" - 90 GET A$ - 120 FOR R = 768 TO 788: READ X: POKE R,X: NEXT : REM input-anything - 130 DATA 162,0,32,117,253,160,2,138,145,105,200,169,0,145,105,200 - 135 DATA 169,2,145,105,96 - 140 D$ = CHR$ (4) - 145 DIM OU$(100) - 150 PRINT D$"prefix": INPUT PR$ - 160 TEXT : HOME - 165 PRINT "AAF Packer v1.0 Andy Tefft 11/23/90" - 170 PRINT : PRINT "Prefix: "PR$ - 171 PRINT "---------------------------------------" - 172 POKE 34,5 - 175 PRINT : PRINT "Menu:" - 176 POKE 32,5 - 180 PRINT : PRINT "P)refix": PRINT "C)atalog" - 181 PRINT - 185 PRINT "A)ppend to an archive" - 190 PRINT "N)ew archive" - 195 PRINT : PRINT "E)xit" - 199 POKE 32,0 - 200 VTAB 18: GET C$ - 210 IF C$ = "e" OR C$ = "E" THEN END - 220 IF C$ < > "C" AND C$ < > "c" THEN GOTO 300 - 230 INPUT "Directory to catalog, return for prefix:";C$ - 240 S = 1: REM section for error check - 250 PRINT D$"cat"C$ - 260 PRINT "Press a key to return to menu.";: GET A$ - 270 HOME : GOTO 175 - 300 IF C$ < > "P" AND C$ < > "p" THEN 400 - 310 S = 2: REM for error checking - 320 PRINT : INPUT "New prefix: ";C$ - 325 PRINT D$"prefix"C$ - 330 GOTO 150 - 400 IF C$ = "A" OR C$ = "a" OR C$ = "N" OR C$ = "n" THEN 410 - 405 HOME : GOTO 175 - 410 IF C$ = "N" OR C$ = "n" THEN NF = 1: REM new file - 420 PRINT "Archive pathname (return for menu)": INPUT ": ";OF$ - 425 IF OF$ = "" THEN HOME : GOTO 175 - 430 S = 3: REM section for errors - 440 PRINT D$"open"OF$: PRINT D$"close"OF$ - 450 IF NF THEN PRINT D$"delete"OF$ - 460 INPUT "Pathname of file to add to archive? : ";I$ - 465 IF I$ = "" THEN HOME : GOTO 175 - 470 S = 4 - 471 PRINT D$"verify"I$ - 475 PRINT : PRINT "Filename to put in archive? (return for" - 476 PRINT I$;: INPUT " : ";FF$ - 477 IF FF$ = "" THEN FF$ = I$ - 482 PRINT D$"open"OF$ - 483 PRINT D$"append"OF$ - 484 PRINT D$"write"OF$ - 485 PRINT "= "FF$ - 488 PRINT D$ - 490 PRINT D$"open"I$ - 500 PRINT D$"read"I$ - 505 S = 5 - 510 FOR L = 1 TO 100 - 520 CALL 768:IN$ = MID$ (IN$,1) - 525 VTAB PEEK (37) - 530 IF LEN (IN$) < 80 THEN 550 - 540 PRINT : PRINT ">>> Warning: Line too long:" - 541 PRINT : PRINT IN$ - 545 PRINT - 550 OU$(L) = "-" + IN$ - 560 NEXT - 570 PRINT D$ - 580 PRINT D$"write"OF$ - 590 FOR L = 1 TO 100 - 600 PRINT OU$(L): NEXT - 610 PRINT D$ - 620 GOTO 500 - 700 PRINT D$"write"OF$ - 710 FOR LL = 1 TO L - 1 - 720 PRINT OU$(LL): NEXT - 725 PRINT "+ End of file "FF$ - 730 PRINT D$"close" - 740 PRINT ">>> Finished. Hit a key for menu." - 745 GET A$ - 750 GOTO 150 - 1999 END - 2000 Y = PEEK (222) - 2010 PRINT - 2020 IF Y = 5 AND S = 5 THEN 700 - 2030 IF Y = 6 AND S = 2 THEN 2100 - 2035 IF Y = 6 AND S = 1 THEN 2200 - 2040 IF Y = 6 AND S = 3 THEN 2300 - 2050 IF Y = 6 AND S = 4 THEN 2400 - 2055 PRINT D$"close" - 2060 PRINT ">>> Error #"Y: END - 2100 PRINT : PRINT ">>> Error: Volume/dir not found." - 2105 PRINT - 2110 GOTO 320 - 2200 PRINT : PRINT ">>> Error: Volume/dir not found." - 2205 PRINT - 2210 GOTO 230 - 2300 PRINT ">>> Error: File/directory not found." - 2310 PRINT : PRINT "Insert disk if necessary, then hit" - 2320 PRINT "return to continue, ? for catalog" - 2330 INPUT C$: IF C$ = "" THEN 420 - 2340 INPUT "Pathname? (return for current prefix) : ";C$ - 2350 PRINT D$"cat"C$ - 2360 PRINT "Hit a key.": GET A$: PRINT : GOTO 420 - 2400 PRINT ">>> Error: input file not found." - 2410 PRINT "Hit return to try again, ? for catalog" - 2420 INPUT ": ";C$ - 2430 IF C$ = "" THEN 460 - 2440 INPUT "Pathname? (return for current prefix) : ";C$ - 2450 PRINT D$"cat"C$ - 2460 PRINT "Hit a key.": GET A$: PRINT : GOTO 460 - =upaaf.doc - -Andy Tefft -ART100@psuvm.psu.edu -99 E. Main St. -North East, PA 16428 - -upaaf.bas -Version 1.00 - -This should be exec'ed under basic.system and then saved -as aaf.unpacker. - -Some notes that may/may not be mentioned in the program itself: - -- it handles multiple files in one posting (of course) -- it echoes lines to the screen that are before the first = - and after the last + (this isn't specified in the specs) -- it attempts to detect whether the last file in the archive - was closed with a + line, and issues a warning if it's not. - it does not however check for a new = line occurring before a - + line. If this mistake exists in the file, the = line will - simply be echoed. -- Because it's not easy to edit the archive on an apple //, - it will prompt for an output file name (default can of - course be used) -- "pathname" means any valid prodos pathname, with or without - a leading volume/directory name. The prefix is shown and - prepended to any filenames without a leading slash (by prodos, - not my program). Use of an invalid pathname will generate - cryptic errors -- control-c will exit the program at any time, and will display - error #255 and close all files. Because the program builds - up a list of the last 100 output lines to write to the file, - up to the last 100 lines will not be written to the output - file if you interrupt the program. Same for a disk full - error. -- both input and output volumes must be online at the same time. - I had planned on allowing volume switches (that's why I buffer - 100 output lines at a time), but I won't unless someone requests - it. -- Output is formatted for 40 columns, but 80 columns can be - used if desired (this makes in-file comments easier to read). - 80/40 columns should be selected by the user before running - the program. -- ">>>" prefixes messages from the program (except prompts) - to distinguish them from in-file comments -- input anything routine is (I think) from an old dos 3.3 - public domain disk I found. It allows , and : in input lines. - Examine the program for usage. - =upaaf.bas - 4 LOMEM: 16384 - 5 IN$ = "X": REM must be first string assigned - 10 TEXT : HOME - 20 PRINT "AAF Unpacker, v1.0" - 22 PRINT : PRINT "by Andy Tefft (art100@psuvm.psu.edu)" - 24 PRINT : PRINT "This program is freeware. Do what you" - 25 PRINT "want with it, but don't blame me if you" - 26 PRINT "break it." - 28 PRINT : PRINT "Notes (list program for more):" - 30 PRINT : PRINT "1) When asked for a pathname, use" - 32 PRINT " a full or partial pathname." - 34 PRINT : PRINT "2) Type 'PR#3' before running to use" - 36 PRINT " 80 columns." - 38 PRINT : PRINT "3) Only minimal error checking is done." - 40 PRINT : PRINT "4) Input and output volumes must both" - 42 PRINT "be online." - 44 PRINT : PRINT "Press a key to continue" - 45 GET A$ - 50 REM ARCHIVE FORMAT: - 55 REM - 60 REM = filename : denotes output file name - 70 REM - line : line of output file - 80 REM + anything : end of file ("anything" ignored") - 85 REM - 86 REM all other lines echoed to screen - 87 REM - 90 REM because of the difficulty of editing text files - 91 REM on the apple //, this program prompts for output - 92 REM file names, so you can change them if desired. - 93 REM - 94 REM input anything routine is from an old dos 3.3 - 95 REM public-domain disk - 96 REM - 120 FOR R = 768 TO 788: READ X: POKE R,X: NEXT : REM input-anything - 130 DATA 162,0,32,117,253,160,2,138,145,105,200,169,0,145,105,200 - 135 DATA 169,2,145,105,96 - 140 D$ = CHR$ (4) - 145 DIM OU$(100) - 150 PRINT D$"prefix": INPUT PR$ - 160 TEXT : HOME - 165 PRINT "AAF Unpacker v1.0 Andy Tefft 11/21/90" - 170 PRINT : PRINT "Prefix: "PR$ - 175 PRINT : PRINT "Enter archive pathname, ? for catalog," - 176 PRINT "/ to change prefix, return to exit." - 180 POKE 34,7 - 190 PRINT - 199 ONERR GOTO 2000 - 200 INPUT ": ";C$ - 205 IF C$ = "" THEN END - 210 IF C$ < > "/" THEN 300 - 220 PRINT : INPUT "New prefix:";P$ - 230 PRINT D$"Prefix"P$ - 240 GOTO 150 - 300 IF C$ < > "?" THEN 400 - 310 PRINT D$"cat" - 320 GOTO 190 - 400 PRINT : PRINT ">>> Opening "C$" for input." - 405 POKE 34,4:II = 1 - 406 PRINT D$"verify"C$ - 407 II = 0 - 410 PRINT D$"open"C$ - 415 IL = 0 - 420 PRINT D$"read"C$ - 430 CALL 768:IN$ = MID$ (IN$,1) - 440 IF LEFT$ (IN$,1) = "=" THEN 450 - 445 PRINT IN$: GOTO 430 - 450 OU$ = MID$ (IN$,2) - 455 PRINT ">>> "; - 460 PRINT "Opening "OU$" for output." - 465 PRINT D$: REM stop taking input from file - 470 PRINT "Press return to use this, enter a new" - 472 PRINT "pathname for output, ? for catalog" - 475 INPUT ": ";CC$ - 476 IF CC$ < > "?" THEN 480 - 477 PRINT "Path to catalog, return for current dir" - 478 INPUT P$: PRINT D$"CAT"P$: GOTO 460 - 480 IF CC$ < > "" THEN OU$ = CC$ - 485 OO = 1 - 490 PRINT D$"open"OU$: PRINT D$"close"OU$: PRINT D$"delete"OU$ - 491 OO = 0 - 495 PRINT D$"read"C$ - 500 OL = 0 - 505 FI = 1: REM means we've started a file - 510 CALL 768:IN$ = MID$ (IN$,1) - 520 IF LEFT$ (IN$,1) = "-" THEN 530 - 521 IF LEFT$ (IN$,1) = "+" THEN 1000 - 525 PRINT IN$: GOTO 510 - 530 OL = OL + 1 - 535 VTAB PEEK (37) - 540 OU$(OL) = MID$ (IN$,2) - 550 IF OL < 100 GOTO 510 - 560 REM write 100 lines of output file - 570 PRINT D$"open"OU$ - 580 PRINT D$"append"OU$ - 590 PRINT D$"write"OU$ - 600 FOR R = 1 TO 100 - 610 PRINT OU$(R) - 620 NEXT - 630 PRINT D$"close"OU$ - 640 GOTO 495 - 1000 PRINT D$"open"OU$ - 1010 PRINT D$"append"OU$ - 1020 PRINT D$"write"OU$ - 1030 FOR R = 1 TO OL - 1040 PRINT OU$(R): NEXT - 1050 PRINT D$"close"OU$ - 1060 PRINT : PRINT ">>> Finished "OU$ - 1065 FI = 0 - 1070 GOTO 420 - 1999 END - 2000 Y = PEEK (222) - 2001 PRINT - 2005 IF Y = 6 THEN 2100 - 2010 IF Y = 5 THEN 2020 - 2015 PRINT "Error #"Y: PRINT D$"close": END - 2020 PRINT D$"close": PRINT ">>> End of file encountered." - 2030 IF FI = 1 THEN PRINT ">>> "OU$" may be incomplete." - 2040 IF FI = 1 THEN PRINT "(no end of file marker found)" - 2050 TEXT - 2060 END - 2100 IF OO = 1 THEN PRINT "Volume/directory not found.": GOTO 455 - 2110 IF II = 1 THEN PRINT "Input file not found.": GOTO 175 - + END OF ARCHIVE