PROGRAM ACCTPOI;
TYPE
	MAILING = RECORD
		NAD:ARRAY[1..124] OF CHAR;
		ACCT_NUMBER:ARRAY[1..4] OF CHAR;
		END;

	XXPOINTERS = RECORD
		START:INTEGER;
		FINISH:INTEGER;
		END;

	ENTRY = RECORD
		ACCT_NO:INTEGER;
		DATE:ARRAY[1..6] OF CHAR;
                INVOICE_NUMBER:ARRAY[1..10] OF CHAR;
                PURCHASE_ORDER_NUMBER:ARRAY[1..10] OF CHAR;
		AMOUNT:REAL;
		END;

FO = FILE OF XXPOINTERS;
FN = FILE OF ENTRY;
FI  = FILE OF MAILING;

$STRING14 = STRING 14;
XR = ARRAY[1..3] OF CHAR;
$STRING0 = STRING 0;
$STRING255 = STRING 255;
$STRING80 = STRING 80;


VAR
FNAD:FI;
FIN:FN;  
FOUT:FO;

NAME:MAILING;
POINTERS:XXPOINTERS;
INFORMATION:ENTRY;

N,I,NUMBER,COUNTER,RECORD_NUMBER,NUMBER_OF_RECORDS,NUMBER_ACCOUNTS:INTEGER;
LAST_RECORD_NUMBER:INTEGER;

FILENAM,LOCFILE,INVFILE:$STRING14;
{$C-}
{$M-}
{$F-}

PROCEDURE SETLENGTH(VAR X:$STRING0;Y:INTEGER);EXTERNAL;
FUNCTION LENGTH(X:$STRING255):INTEGER;EXTERNAL;

PROCEDURE CLEAR_SCREEN;
BEGIN
WRITE(CHR(27),'*',CHR(0),CHR(0),CHR(0),CHR(0));
END;


PROCEDURE ENTER_FILE_NAME;ŠVAR
ERROR:BOOLEAN;

BEGIN
REPEAT
ERROR:=FALSE;
CLEAR_SCREEN;
WRITELN;
WRITE('ENTER THE NAME AND ADDRESS FILE AS: DRIVE:NAME.EXTENSION  ');
READ(FILENAM);
RESET(FILENAM,FNAD);

IF EOF(FNAD) THEN
BEGIN
WRITELN;
WRITELN('FILE NOT FOUND. PLEASE RE-ENTER');
ERROR:=TRUE;
END;

UNTIL ERROR = FALSE;
END; {OF PROCEDURE}

PROCEDURE NO_ACCOUNTS (FNAME:$STRING14);
BEGIN
RESET(FNAME,FNAD);
WITH NAME DO
BEGIN
READ(FNAD:1,NAME);
NUMBER_ACCOUNTS:=(((ORD(ACCT_NUMBER[1])-48)*1000)+
                  ((ORD(ACCT_NUMBER[2])-48)*100)+
                  ((ORD(ACCT_NUMBER[3])-48)*10)+
                  (ORD(ACCT_NUMBER[4])-48));

WRITELN('NUMBER OF ACCOUNTS IN NAD FILE ',NUMBER_ACCTS);

END;

END; {OF PROCEDURE}



{************ PROCEDURE TO DETERMINE NUMBER OF RECORDS****}

PROCEDURE NUMBER_RECORDS (FNAM:$STRING14);
BEGIN
RESET(FNAM,FIN);
WITH INFORMATION DO
BEGIN

READ(FIN:1,INFORMATION);
NUMBER_OF_RECORDS:=(((ORD(PURCHASE_ORDER_NUMBER[1])-48)*1000)+
	((ORD(PURCHASE_ORDER_NUMBER[2])-48)*100)+
	((ORD(PURCHASE_ORDER_NUMBER[3])-48)*10)+
	(ORD(PURCHASE_ORDER_NUMBER[4])-48));
END; {OF WITH}
WRITELN(' NUMBER OF RECORDS IN THE ACCOUNT FILE ',FNAM,' : ',
		NUMBER_OF_RECORDS); 
END; {OF PROCEDURE}
Š

FUNCTION MAKE_FILE_NAMES(XFILNAME:$STRING14;EXT:XR):$STRING14;
VAR
FILENAME:$STRING14;
L:INTEGER;


BEGIN
I:=1;
SETLENGTH(FILENAME,0);
WHILE XFILNAME[I] <> '.' DO
	BEGIN
	APPEND(FILENAME,XFILNAME[I]);
	I:=I+1;
	END;

APPEND(FILENAME,'.');
FOR N:=1 TO 3 DO
BEGIN
APPEND(FILENAME,EXT[N]);
END;

IF (I+4) < 14 THEN
BEGIN
I:=I+4;
WHILE I < 15 DO
BEGIN
APPEND(FILENAME,' ');
I:=I+1;
END;
END;
WRITELN('FILENAME IS ',FILENAME);
MAKE_FILE_NAMES:=FILENAME;

END; {OF FUNCTION}


PROCEDURE XPOINTERS (FNAME:$STRING14);
VAR
I:INTEGER;
MATCH:BOOLEAN;

BEGIN
LAST_RECORD_NUMBER:=2;
RECORD_NUMBER:=2;
NUMBER:=2;
REWRITE(LOCFILE,FOUT);
RESET(FNAME,FIN);

REPEAT
WITH INFORMATION DO
BEGIN

REPEAT
READ(FIN:RECORD_NUMBER,INFORMATION);
IF ACCT_NO = NUMBER THEN
	BEGIN
	MATCH:=TRUE;
	RECORD_NUMBER:=RECORD_NUMBER+1;
	END;
	
IF ACCT_NO <> NUMBER THEN MATCH:=FALSE;
UNTIL (MATCH = FALSE) OR (RECORD_NUMBER > NUMBER_OF_RECORDS);

END; {OF INFORMATION}

WITH POINTERS DO
BEGIN
START:=LAST_RECORD_NUMBER;
FINISH:=RECORD_NUMBER;
IF FINISH < START THEN FINISH:=START;
COUNTER:=NUMBER;
WRITE(FOUT:COUNTER,POINTERS);
LAST_RECORD_NUMBER:=RECORD_NUMBER;
WRITELN('ACCOUNT # ',NUMBER:4,' START= ',START:3,'  FINISH= ',
        FINISH:3,'  # RECS WITH THIS ACCT # ',(FINISH-START):3);
END;

NUMBER:=NUMBER+1;

UNTIL NUMBER > NUMBER_ACCOUNTS

END; {OF PROCEDURE}


BEGIN    {OF MAIN}
ENTER_FILE_NAME;
NO_ACCOUNTS(FILENAM);
LOCFILE:=MAKE_FILE_NAMES(FILENAM,'LOC');
INVFILE:=MAKE_FILE_NAMES(FILENAM,'INV');
NUMBER_RECORDS(INVFILE);
XPOINTERS(INVFILE);
END.
