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.

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