2000 REM ...... THIS IS FILE "PACKER.BAS" 2010 2020 !---------------------------------! 2030 ! ALPHABASIC SOURCE CODE PACKER ! 2040 !---------------------------------! 2050 2060 !------------------------------------------------------------------------! 2070 ! THIS PROGRAM IS FOR MEMORY HOGS ! 2080 ! IT ACCEPTS AS INPUT THE FILE NAME OF ANY BASIC SOURCE PROGRAM ! 2090 ! (NORMALLY, A PROGRAM TOO BIG TO COMPILE IN ALPHABASIC), ! 2100 ! & CREATES A PACKED (MEMORY-SAVING) VERSION OF IT, ! 2110 ! WHILE LEAVING THE ORIGINAL UNTOUCHED (SUITABLE FOR FRAMING !). ! 2120 ! ! 2130 ! THE PACKED VERSION IS LIKE THE ORIGINAL, EXCEPT THAT ! 2140 ! (1) BLANK LINES ARE REMOVED (IF THE USER SO SPECIFIES) ! 2150 ! (2) "REM" AND "!" STATEMENTS ARE REPLACED BY BLANK LINES ! 2160 ! (OR REMOVED ENTIRELY, IF THE USER SO SPECIFIES) ! 2170 ! (3) BLANKS ARE DELETED, EXCEPT IN THE FOLLOWING CASES : ! 2180 ! --- WITHIN QUOTES ! 2190 ! --- WITHIN THE DATA AREA OF A "DATA" STATEMENT ! 2200 ! --- ONE BLANK IS LEFT BEFORE THE FOLLOWING RESERVED WORDS : ! 2210 ! "AND" "OR" ! 2220 ! "TO" "STEP" ! 2230 ! "ELSE" ! 2240 ! "MAX" "MIN" ! 2250 ! (4) EACH "PRINT" IS CHANGED TO "?", EXCEPT WHEN USED IN LABELS ! 2260 ! (5) THE LINE "1NOEXPAND" IS ADDED TO THE PACKED FILE VERSION ! 2270 ! (NOTE : AVOID USE OF THE LABEL "PRINT" BY ITSELF) ! 2280 ! (6) THE PACKED FILE HAS EXTENSION ".PAK" ! 2290 ! ! 2300 ! THE PACKED VERSION REQUIRES LESS ROOM TO LOAD, BUT PRODUCES EXACTLY ! 2310 ! THE SAME OBJECT (".RUN") CODE. ! 2320 !------------------------------------------------------------------------! 2330 2340 REM ...... STRING DEFINITIONS 2350 MAP1 IN$ ,S,6 2360 MAP1 INFNAME$ ,S,10 2370 MAP1 OUTFNAME$,S,10 2380 MAP1 CODE$ ,S,250 2390 MAP1 NCODE$ ,S,250 2400 MAP1 FIRST$ ,S,1 2410 MAP1 DELETE'EMPTY$,S,1 2420 MAP1 DELETE'REMS$ ,S,1 2430 2440 NEW'FILE: 2450 ? "ENTER NAME OF BASIC SOURCE PROGRAM TO BE PACKED (1-6 CHARACTERS) : "; 2460 INPUT "" IN$ 2470 INFNAME$=IN$+".BAS" 2480 LOOKUP INFNAME$, THERE 2490 IF(THERE < 0) THEN PRINT "ERROR---RANDOM FILE NAME !" : GO TO NEW'FILE 2500 IF(THERE = 0) THEN PRINT "ERROR---FILE DOESN'T EXIST" : GO TO NEW'FILE 2510 OPEN #1, INFNAME$, INPUT 2520 OUTFNAME$=IN$+".PAK" 2530 OPEN #2, OUTFNAME$, OUTPUT 2540 2550 REM ...... SPECIFY OPTIONS FOR EMPTY & REMARK LINES 2560 DELETE'EMPTY$="N" 2570 INPUT "SHALL BLANK LINES BE DELETED ? ('Y' OR 'N') : ", DELETE'EMPTY$ 2580 DELETE'REMS$="N" 2590 INPUT "SHALL REMARK LINES BE DELETED ? ('Y' OR 'N') : ", DELETE'REMS$ 2600 2610 REM ...... INITIAL CONDITIONS 2620 NLINE=0 2630 COMMENT=0 2640 PACKED=0 2650 UNPACKED=0 2660 BYTSRC=0 2670 PRINT #2, "1NOEXPAND" 2680 BYTOBJ=11 2690 PRINT 2700 PRINT "I AM NOW PACKING LINE NUMBER :" 2710 PRINT 2720 2730 2740 2750 READ'UNPACKED'LINE: 2760 INPUT LINE #1, CODE$ 2770 IF(EOF(1)=1) THEN GO TO FINISH 2780 NLINE=NLINE+1 2790 PACK=0 2800 BYTSRC=BYTSRC+LEN(CODE$)+2 2810 NCODE$="" 2820 L=LEN(CODE$) 2830 2840 STRIP'LINE'NUMBER: 2850 DIGIT$=LEFT$(CODE$,1) 2860 IF(DIGIT$ < "0" OR DIGIT$ > "9") THEN GO TO DISPLAY'LINE'NUMBER 2870 NCODE$=NCODE$+DIGIT$ 2880 CODE$=RIGHT$(CODE$,L-1) 2890 L=L-1 2900 GO TO STRIP'LINE'NUMBER 2910 2920 DISPLAY'LINE'NUMBER: 2930 PRINT USING "######", VAL(NCODE$); 2940 IF(NLINE/10=INT(NLINE/10)) THEN PRINT " #"; NLINE 2950 2960 STRIP'LEADING'BLANKS: 2970 2980 REM ...... CHECK FOR A BLANK LINE (ONLY A LINE NUMBER) 2990 IF(L > 0) THEN GO TO NON'EMPTY'LINE 3000 IF(DELETE'EMPTY$="Y") THEN COMMENT=COMMENT+1 : GO TO READ'UNPACKED'LINE 3010 NCODE$=NCODE$+" " 3020 GO TO WRITE'PACKED'LINE 3030 3040 NON'EMPTY'LINE: 3050 FIRST$=LEFT$(CODE$,1) 3060 IF(FIRST$ <> " ") THEN GO TO BEGIN'MAIN'TEXT 3070 CODE$=RIGHT$(CODE$,L-1) 3080 PACK=1 3090 L=L-1 3100 GO TO STRIP'LEADING'BLANKS 3110 3120 3130 3140 BEGIN'MAIN'TEXT: 3150 3160 REM ...... CHECK FOR A REMARK LINE ("REM" OR "!") 3170 IF(INSTR(1,CODE$,"REM")<>1 AND INSTR(1,CODE$,"!")<>1)THEN GO TO P'CHECK 3180 IF(DELETE'REMS$="Y") THEN COMMENT=COMMENT+1 : GO TO READ'UNPACKED'LINE 3190 NCODE$=NCODE$+" " 3200 GO TO WRITE'PACKED'LINE 3210 3220 P'CHECK: 3230 IF(INSTR(1,CODE$,"PRINT") <> 1) THEN GO TO DATA'CHECK 3240 IF(INSTR(1,CODE$,"PRINT'") = 1) THEN GO TO DATA'CHECK 3250 NCODE$=NCODE$+"?" 3260 L=L-5 3270 CODE$=RIGHT$(CODE$,L) 3280 PACK=1 3290 GO TO REST'OF'TEXT'LOOP 3300 3310 DATA'CHECK: 3320 IF(INSTR(1,CODE$,"DATA") <> 1) THEN GO TO REST'OF'TEXT'LOOP 3330 NCODE$=NCODE$+CODE$ 3340 GO TO WRITE'PACKED'LINE 3350 3360 3370 3380 REST'OF'TEXT'LOOP: 3390 3400 REM ...... CHECK FOR DOUBLE QUOTE 3410 IF(INSTR(1,CODE$,CHR(34)) <> 1) THEN GO TO EMPTY'CHECK 3420 NCODE$=NCODE$+CHR(34) : L=L-1 : CODE$=RIGHT$(CODE$,L) 3430 REM ...... TRANSFER ALL CHARACTERS UP TO NEXT (CLOSED) DOUBLE QUOTE 3440 M=INSTR(1,CODE$,CHR(34)) 3450 IF(M=0) THEN NCODE$=NCODE$+CODE$ : GO TO WRITE'PACKED'LINE 3460 NCODE$=NCODE$+CODE$[1,M] 3470 L=L-M 3480 CODE$=RIGHT$(CODE$,L) 3490 3500 EMPTY'CHECK: 3510 IF(L=0) THEN GO TO WRITE'PACKED'LINE 3520 3530 REM ...... CHECK FOR INTERNAL REMARKS ("REM" OR "!") 3540 IF(INSTR(1,CODE$,"REM")=1) THEN GO TO WRITE'PACKED'LINE 3550 FIRST$=LEFT$(CODE$,1) 3560 IF(FIRST$="!") THEN GO TO WRITE'PACKED'LINE 3570 3580 REM ...... CHECK FOR BLANK 3590 IF(FIRST$ <> " ") THEN GO TO TRANSFER'NEXT'CHARACTER 3600 3610 REM ...... CHECK FOR INTERNAL "PRINT" STATEMENT 3620 IF(INSTR(1,CODE$," PRINT") <> 1) THEN GO TO RESERVED'WORD'CHECK 3630 IF(INSTR(1,CODE$," PRINT'")=1) THEN GO TO RESERVED'WORD'CHECK 3640 NCODE$=NCODE$+"?" 3650 L=L-6 3660 CODE$=RIGHT$(CODE$,L) 3670 PACK=1 3680 GO TO REST'OF'TEXT'LOOP 3690 3700 RESERVED'WORD'CHECK: 3710 IF(INSTR(1,CODE$," ELSE")=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3720 IF(INSTR(1,CODE$," TO" )=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3730 IF(INSTR(1,CODE$," STEP")=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3740 IF(INSTR(1,CODE$," AND" )=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3750 IF(INSTR(1,CODE$," OR" )=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3760 IF(INSTR(1,CODE$," MAX" )=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3770 IF(INSTR(1,CODE$," MIN" )=1) THEN GO TO TRANSFER'NEXT'CHARACTER 3780 PACK=1 : GO TO STRIP'NEXT'CHARACTER 3790 3800 TRANSFER'NEXT'CHARACTER: 3810 NCODE$=NCODE$+FIRST$ 3820 3830 STRIP'NEXT'CHARACTER: 3840 L=L-1 3850 CODE$=RIGHT$(CODE$,L) 3860 GO TO REST'OF'TEXT'LOOP 3870 3880 WRITE'PACKED'LINE: 3890 PRINT #2, NCODE$ 3900 BYTOBJ=BYTOBJ+2+LEN(NCODE$) 3910 IF(PACK=0) THEN UNPACKED=UNPACKED+1 ELSE PACKED=PACKED+1 3920 GO TO READ'UNPACKED'LINE 3930 3940 FINISH: 3950 CLOSE #1 3960 CLOSE #2 3970 PRINT 3980 PRINT 3990 PRINT "END OF PACKING ------" 4000 PRINT " FILE "; INFNAME$; " HAS"; BYTSRC; "BYTES IN"; NLINE; "LINES" 4010 PRINT " FILE "; OUTFNAME$; " HAS"; BYTOBJ; "BYTES IN"; 4020 PRINT NLINE-COMMENT; "LINES"; 4030 PRINT " ("; (1-BYTOBJ/BYTSRC)*100; "% SIZE REDUCTION )" 4040 PRINT " (="; PACKED; "LINES PACKED +"; UNPACKED; "LINES UNCHANGED)" 4050 PRINT 4060 4070 4080 4090 REM ...... END 4100 END