home *** CD-ROM | disk | FTP | other *** search
- {================================================================}
- { INITIALIZE FILER FILE }
- {================================================================}
- PROCEDURE INITIALIZE;
-
- BEGIN
- REPEAT
- CLRSCR;
- TEXTMODE(BW40);
- GOTOXY(1,22);
- WRITE('SORTER A LA PASCAL');
- GOTOXY(1,23);
- WRITE('ENTER SOURCE FILE NAME : ');
- READLN(SOURCENAME);
- X := POS('.',SOURCENAME);
- IF X <> 0 THEN SOURCENAME := COPY(SOURCENAME,1,X-1);
- SOURCENAMEDAT := SOURCENAME + '.DAT';
- SOURCENAMEBAK := SOURCENAME + '.BAK';
- FILEEXISTS := EXIST(SOURCENAMEDAT);
- UNTIL FILEEXISTS = TRUE;
-
- {========================================}
- { ERASE ANY BACKUP FILE OF SAME NAME }
- {========================================}
- IF (EXIST(SOURCENAMEBAK)) THEN
- BEGIN
- ASSIGN(SOURCE,SOURCENAMEBAK);
- ERASE(SOURCE);
- WRITELN;
- WRITELN(SOURCENAMEBAK,' HAS BEEN DELETED.');
- END;
-
- {========================================}
- { RENAME FILE TO FILENAME.BAK }
- {========================================}
- ASSIGN(SOURCE,SOURCENAMEDAT);
- RENAME(SOURCE,SOURCENAMEBAK);
- RESET(SOURCE);
- WRITELN('FILE ',SOURCENAMEDAT,' RENAMED ',SOURCENAMEBAK);
-
- {=======================================}
- { CREATE DESTINATION FILENAME.DAT }
- {=======================================}
- ASSIGN(DESTINATION, SOURCENAMEDAT);
- REWRITE ( DESTINATION );
-
- {=======================================}
- { BUILD HEADER FOR NEW FILE }
- {=======================================}
- SEEK(SOURCE,0);
- BLOCKREAD( SOURCE,GETDATA,1 ); { BASIC/Z BLOCK 0 }
- BLOCKWRITE(DESTINATION,GETDATA,1);
-
- BLOCKREAD( SOURCE,GETDATA,1 ); { FILE PARAMETERS }
- BLOCKWRITE(DESTINATION,GETDATA,1);
-
- BLOCKREAD( SOURCE,LBL,3 ); { FILER LABELS }
- BLOCKWRITE(DESTINATION,LBL,3);
-
-
- {=================================================}
- { READ IN HEADER DATA FOR FILER FILE }
- {=================================================}
- FILENAME := 'XXXXXX';
- FOR X := 1 TO 6 DO
- FILENAME[X] := GETDATA[X];
- MAXNBRREC := CHTOIN(GETDATA,7,4);
- NBRRECUSED := CHTOIN(GETDATA,11,4);
- RCDLEN := CHTOIN(GETDATA,15,3);
- BLOCKINGFACTOR := CHTOIN(GETDATA,18,2);
- FIELDPERRECORD := CHTOIN(GETDATA,20,2);
- FILEDATE := ' / / ';
- MOVE(GETDATA[22],FILEDATE[1],8);
-
- {================================================================}
- { GET LABEL LENGTH, DATA LENGTH & DATA FORM INFO }
- {================================================================}
-
- LABELPOSN[1] := 1;
- DATAPOSN[1] := 1;
-
- FOR X := 1 TO FIELDPERRECORD DO
- BEGIN
- LABELLENGTH[X] := BCDTOIN(GETDATA[32+X]);
- DATALEN[X] := BCDTOIN(GETDATA[64+X]);
- DATAFORM[X] := ORD(GETDATA[96+X])-48;
- LABELPOSN[X+1] := LABELPOSN[X] + LABELLENGTH[X];
- DATAPOSN[X+1] := DATAPOSN[X] + DATALEN[X];
- END;
-
- {================================================================}
- { TRANSLATE REPORT STRUCTURE }
- {================================================================}
-
- BLOCKREAD(SOURCE,GETDATA,1); { SCREEN INFORMATION }
- BLOCKWRITE(DESTINATION,GETDATA,1);
- { ESTABLISH VALUE OF DATAFORM[Z] FOR ASCII INFORMATION }
- IF GETDATA[1] = 'S' THEN ASCII := 9 ELSE ASCII := 15;
- FOR X := 1 TO FIELDPERRECORD DO
- BEGIN
- W := X*4+1;
- ROW[X] := BCDTOIN(GETDATA[W]);
- COLUMN[X] := BCDTOIN(GETDATA[W+1])*10+TRUNC(BCDTOIN(GETDATA[W+2])/10);
- {FIELDNBR[X] := BCDTOIN(GETDATA[W+3]);} { NOT IMPLEMENTED }
- END;
- BLOCKREAD(SOURCE,GETDATA,2); { REPORT FORMAT INFORMATION (NOT USED) }
- BLOCKWRITE(DESTINATION,GETDATA,1);
- BLOCKWRITE(DESTINATION,GETDATA,1); { FIRST RECORD GOES HERE }
- BLOCKWRITE(DESTINATION,GETDATA,1);
-
- {================================================================}
- { INITIALIZE VARIABLES FOR ENTRY INTO FILER }
- {================================================================}
- DATARECORD := NBRRECUSED; { SOURCE FILE SET UP }
- CALCULATE;
- DISKRECNOWINMEM := DISKRECORD -1; { ENSURE DISK READ FIRST TIME}
- FILERECCHGD := FALSE; { ENSURE NO WRITE BEFORE FIRST READ }
- LASTRECUSED := 0; { SET LAST RECORD USED TO ZERO }
- NBRDISKRECUSED := DISKRECORD; { ESTABLISH MAX DISK REC NBR }
- RECADDEDTOFILE := FALSE; { FLAG TO INDICATE CHANGE IN FILE SIZE}
-
- NBRRECUSED2 := 0; { DESTINATION FILE SET UP }
- DATARECORD2 := NBRRECUSED2;
- CALCULATE2;
- DISKRECNOWINMEM2 := DISKRECORD2 -1; { ENSURE DISK READ FIRST TIME}
- FILERECCHGD2 := FALSE; { ENSURE NO WRITE BEFORE FIRST READ }
- LASTRECUSED2 := 0; { SET LAST RECORD USED TO ZERO }
- NBRDISKRECUSED2 := DISKRECORD2; { ESTABLISH MAX DISK REC NBR }
- RECADDEDTOFILE2 := FALSE; { FLAG TO INDICATE CHANGE IN FILE SIZE}
-
- END; { INTIIALIZE PROCEDURE }
-
-
- {================================================================}
- { SORT PROGRAM }
- {================================================================}
-
- BEGIN
- INITIALIZE; { ID AND READ IN FILE PARAMETERS }
- TEXTMODE(BW80);
-
- {======================================}
- { ENTER KEY FIELDS }
- {======================================}
- REPEAT
- DISPLAYREC;
- GOTOXY(1,21);
- WRITE('IN ORDER OF IMPORTANCE :');
- X := 1;
- KEYLENGTH := 0;
- REPEAT
- CLREOL;
- IF X = 1 THEN
- BEGIN
- GOTOXY(1,23);
- WRITE('ENTER KEY FIELD NUMBER : ')
- END
- ELSE
- BEGIN
- GOTOXY(1,24);
- WRITE('ENTER RETURN ONLY TO END KEY DEFINITION');
- GOTOXY(1,23);
- WRITE('ENTER NEXT KEY FIELD : ');
- CLREOL;
- END;
- ANS := '';
- READ(ANS);
- STRINGTOREAL(ANS,NUMVALUE,CODE);
- KEYFIELD[X] := TRUNC(NUMVALUE);
- IF NUMVALUE <> 0 THEN KEYLENGTH := KEYLENGTH + DATALEN[KEYFIELD[X]];
- X := X + 1;
- UNTIL NUMVALUE = 0;
- KEYFIELD[0] := X-2;
- IF KEYLENGTH > 55 THEN KEYLENGTH := 55;
- KEYLENGTH := KEYLENGTH + 6; { 5 for field nbr + 1 for string 0 byte }
-
- {=======================================}
- { DISPLAY KEYS SELECTED }
- {=======================================}
- CLRSCR;
- GOTOXY(1,23);
- WRITELN('KEY FIELDS SELECTED ARE :');
- WRITELN('=========================');
- WRITELN;
- FOR X := 1 TO KEYFIELD[0] DO
- BEGIN
- PRINTLABEL(KEYFIELD[X]);
- END;
- WRITELN;
- WRITELN('=========================');
- WRITELN('KEYLENGTH = ',KEYLENGTH);
- WRITE('IS THIS OK (Y/N) : ');
- READLN(CH);
- UNTIL (UPCASE(CH) = 'Y') OR (EOLN);
- WRITELN;
-
- {===============================================}
- { BUILD KEY FIELDS AND PASS TO TURBO SORT }
- {===============================================}
-
- WRITELN(TURBOSORT(KEYLENGTH)); { CALL TURBO SORT PROGRAM }
- { SEE INP, LESS & OUTP }
- { PROCEDURES }
-
- {================================================================}
- { END PROGRAM }
- {================================================================}
-
- SEEK(DESTINATION,1);
- BLOCKREAD(DESTINATION,GETDATA,1);
- STR(NBRRECUSED:4,ANS);
- MOVE(ANS[1],GETDATA[11],4); { UPDATE NBR OF RECORDS }
- SEEK(DESTINATION,1);
- BLOCKWRITE(DESTINATION,GETDATA,1);
- CLOSE(SOURCE);
- CLOSE(DESTINATION);
- GOTOXY(5,24);
- WRITELN('[ 0 INDICATES SUCCESSFUL SORT ]');
- WRITELN;
- WRITELN;
- WRITELN('..oO[ HAVE A GREAT DAY! ]Oo..');
- END.