Main Menu

KB#00887-Program to shrink MKEYED files by rewriting keys in non-sequential loop iteration.

Title:

Program to shrink MKEYED files by rewriting keys in non-sequential loop iteration.

Description:

The following program can be used to shrink MKEYED files by writing records in a non-sequential loop. 

0010 REM Program to write MKEYED keys in non-sequential order 
0020 REM Will shrink MKEYED files by re-writing them in a 5-pass loop 
0030 REM You can set the number of passes at line 70 (CYCLES=5). 
0040 REM 
0050 IF TCB(13)=0 THEN BEGIN ; IF TCB(15)<255 THEN START 255,PGM(-1) 
0060 LET F1N$=FIN(0),CUR_WDW=DEC(F1N$(9,2)); PRINT 'GOTO'(0),'PUSH','CS', 
0070 LET F1N$=FIN(0),XM=ASC(F1N$(7)),YM=ASC(F1N$(8)),LN=29,CYCLES=5 
0080 LET TXT$="Shrink MKEYED files in a "+STR(CYCLES)+"-pass rewrite" 
0090 GOSUB CENTER; PRINT @(X,0),TXT$,'CE','GS',@(0,1),FILL(XM,"0"),'GE', 
0100 LET DIR$=DIR(""); SETERR GET_DIR; ENTER DIR$; GOTO TST_DIR 
0110 GET_DIR: LET Y=INT((YM-3)/2)-1,TXT$="Directory to examine : "+FILL(LN) 
0120 GOSUB CENTER; PRINT @(X,Y),'SB',TXT$,'CE',; LET TXT$=TXT$(1,LEN(TXT$)-LN) 
0130 INPUTE (0,ERR=GET_DIR)X+LEN(TXT$),Y,LN,"_",DIR$:(""=QUIT,LEN=0,LN) 
0140 TST_DIR: SETERR 0; IF DIR$(LEN(DIR$),1)<>"/" THEN LET DIR$=DIR$+"/" 
0150 LET Z=X,CHAN=UNT; OPEN (CHAN,ERR=OOPS_0)DIR$; GOTO CHECK 
0160 OOPS_0: LET TXT$="Error "+STR(ERR)+" during 'OPEN' of "+DIR$ 
0170 OOPS_1: GOSUB CENTER; PRINT @(X,YM-2),'SF','BR',TXT$,'ER', 
0180 INPUT (0,ERR=GET_DIR,SIZ=1)'CI',*; GOTO GET_DIR 
0190 OOPS_2: LET TXT$="Error "+STR(ERR)+" during 'OPEN' ..." 
0200 GOSUB CENTER; GOSUB WAIT; GOTO READ 
0210 OOPS_3: LET TXT$="'LOCK' on this file not possible at the time !!!" 
0220 GOSUB CENTER; GOSUB WAIT; CLOSE (CHECK); GOTO READ 
0230 OOPS_4: LET TXT$="'"+PATH$+"' => NO read/write permission" 
0240 GOSUB CENTER; GOSUB WAIT; GOTO EOD 
0250 OOPS_5: LET TXT$="Error "+STR(ERR)+" during creation '"+TMP$+"'" 
0260 GOSUB CENTER; GOSUB WAIT; CLOSE (CHECK); GOTO READ 
0270 CHECK: LET F1D$=FID(CHAN); IF ASC(F1D$)=5 THEN GOTO GET_SUB 
0280 LET TXT$="'"+DIR$+"' is NOT a directory !!!"; GOTO OOPS_1 
0290 GET_SUB: LET TXT$="Examine subdirectories of "+DIR$+" too : " 
0300 PRINT @(Z,Y+1),'SB',TXT$,'CE', 
0310 INPUTE (0,ERR=GET_SUB)Z+LEN(TXT$),Y+1,"A","_",SUB$:(""=GET_DIR,LEN=0,1) 
0320 ON POS(SUB$="NJY") GOTO GET_SUB,GO 
0330 GO: CLOSE (CHAN); DIM NO[19]; LET PATH$="",NAME$=DIR$,CNT=-1,NO[0]=CHAN
0340 GET: LET CNT=CNT+1,PATH$=PATH$+NAME$ 
0350 PRINT @(Z,Y+2),'SB',"Directory : ",'CE',PATH$,@(Z,Y+3),'SB',"File : ", 
0360 IF NO[CNT]=0 THEN LET NO[CNT]=UNT FI; OPEN (NO[CNT],ERR=OOPS_4)PATH$ 
0370 READ: READ RECORD(NO[CNT],ERR=EOD)NAME$; PRINT @(Z+7,Y+3),'CL',NAME$,
0380 IF POS(NAME$="..") THEN GOTO READ 
0390 IF NAME$(LEN(NAME$))<>"/" THEN GOTO GOT_FILE 
0400 IF POS(SUB$="YJ") THEN GOSUB GET; GOTO READ ELSE GOTO READ 
0410 GOT_FILE: LET CHECK=UNT; OPEN (CHECK,ERR=OOPS_2)PATH$+NAME$ 
0420 LET F1D$=FID(CHECK),F1N$=FIN(CHECK) 
0430 IF ASC(F1D$)<>6 OR ASC(F1D$(2))<>0 THEN CLOSE (CHECK); GOTO READ 
0440 IF DEC(F1N$(77,4))<CYCLES+1 THEN CLOSE (CHECK); GOTO READ 
0450 IF POS($00$<>F1N$(86))=0 THEN CLOSE (CHECK); GOTO READ 
0460 LOCK (CHECK,ERR=OOPS_3); LET COPY=UNT 
0470 LET TMP$=PATH$+"TMP"+HTA(INFO(3,0))+"."+FID(0),F1D$=F1D$(1,8)+TMP$ 
0480 PRINT @(Z,Y+4),'SB',"Rewrite : ",'CE',TMP$, 
0490 ERASE: LET X=Z+LEN(TMP$)+10; ERASE TMP$,ERR=COPY; GOTO ERASE 
0500 COPY: LET NR=DEC($00$+F1N$(77,4)); FILE F1D$,F1N$(86),ERR=OOPS_5 
0510 OPEN (COPY)TMP$; LOCK (COPY) 
0520 FOR PASS=1 TO CYCLES; CLOSE (CHECK); PREFIX PFX 
0530 OPEN (CHECK)PATH$+NAME$; LOCK (CHECK); LET TIMES=PASS-1 
0540 WHILE TIMES; READ RECORD(CHECK,END=EOF0); GOTO EOW0 
0550 EOF0: LET TIMES=1 
0560 EOW0: LET TIMES=TIMES-1; WEND 
0570 GET_REC: READ RECORD(CHECK,END=EOF2,DIR=CYCLES)D$; LET NR=NR-1 
0580 WRITE RECORD(COPY,ERR=EOF2,DOM=EOF2)D$; PRINT @(X,Y+4),NR,PASS," ", 
0590 GOTO GET_REC 
0600 EOF2: NEXT PASS; LET D$="",NEWFIN$=FIN(COPY) 
0610 IF NR=0 AND F1N$(77,4)=NEWFIN$(77,4) THEN GOTO RENAME 
0620 LET TXT$="'"+NAME$+"' => Possible KEY-POINTER problem ..." 
0630 GOSUB CENTER; GOSUB WAIT; CLOSE (CHECK); CLOSE (COPY); PREFIX PFX 
0640 ERASE TMP$; GOTO READ 
0650 RENAME: CLOSE (CHECK); CLOSE (COPY); PREFIX PFX 
0660 ERASE PATH$+NAME$,ERR=OOPS_6; GOTO RENAME_1 
0670 OOPS_6: LET TXT$="Error "+STR(ERR)+" during erase '"+PATH$+NAME$+"'" 
0680 GOSUB CENTER; GOSUB WAIT; GOTO READ 
0690 RENAME_1: PREFIX PFX; RENAME TMP$ TO PATH$+NAME$ 
0700 PRINT @(0,Y+4),'CE',; GOTO READ 
0710 EOD: CLOSE (NO[CNT]); LET CNT=CNT-1 
0720 LET PATH$=PATH$(1,POS("/"=PATH$(1,LEN(PATH$)-1),-1)) 
0730 PRINT @(Z,Y+2),'SB',"Directory : ",'CL',PATH$, 
0740 IF PATH$>=DIR$ THEN RETURN 
0750 LET TXT$="End of re-write, hit <CR>"; GOSUB CENTER; GOSUB WAIT 
0760 GOTO QUIT 
5000 REM ^5000 
5010 QUIT: PRINT 'POP','GOTO'(CUR_WDW),; RESET 
5020 IF TCB(13) THEN EXIT ELSE STOP 
5030 CENTER: LET X=INT((XM-LEN(TXT$))/2); IF X<0 THEN LET X=0 FI; RETURN 
5040 WAIT: PRINT @(X,YM-2),'CE','BR',TXT$,'ER','RB', 
5050 INPUT (0,ERR=TIMEOUT,SIZ=1,TIM=10)'CI',* 
5060 TIMEOUT: PRINT @(0,YM-2),'CE',; RETURN 
5070 END 



Last Modified: 02/23/2004 Product: PRO/5 Operating System: All platforms

BASIS structures five components of their technology into the BBx Generations.

View BASIS LinkedIN Profile Visit our Twitter Feed Check out our Facebook Public Profile Click to View the BASIS youTube channel