{----------------------------------------------------------}
{----------------------------------------------------------}
{ Increment a symbolic name. Eg XXX021 to XXX022. }
PROCEDURE incr_name (VAR name :char12);
VAR
i :INTEGER;
col :INTEGER;
flag :BOOLEAN;
BEGIN{PROCEDURE}
col := 12;
WHILE (col>=1) AND (name[col]=' ') DO col := col - 1;
flag := TRUE;
WHILE flag AND (col>=1) DO BEGIN
i := ORD (name[col]) + 1;
IF i <= ORD('9') THEN BEGIN
flag := FALSE;
name[col] := CHR(i);
END
ELSE BEGIN
name[col] := '0';
col := col - 1;
END{IF};
END{WHILE};
END{PROCEDURE};
{--------------------------------------------------}
{Reset a big-counter to zero }
{--------------------------------------------------}
{Increments a big-counter. }
PROCEDURE ctr_count (VAR ctr :ctr_array);
BEGIN{PROCEDURE}
ctr[1] := ctr[1] + 1;
IF ctr[1] >= 1000 THEN BEGIN
ctr[2] := ctr[2] + 1;
ctr[1] := 0;
END{IF};
END{PROCEDURE};
{-------------------------------------------------------------}
{Test a counter against another counter}
{Returns TRUE if counter A is bigger than counter B}
FUNCTION close_outfile :INTEGER;
BEGIN{FUNCTION}
close_outfile := 0;
END{FUNCTION};
{--------------------------------------------------------}
{Gets the next char (pseudochar, a byte) from the input buffer.}
{Signals EOF by returning -1. Returns 0 if get a char. }
FUNCTION get_char ( VAR in_char :byte ) :INTEGER;
VAR
status :INTEGER;
BEGIN{FUNCTION}
status := 0;
IF in_bufptr >= sector_size THEN BEGIN
status := read_infile;
END{IF};
IF status = 0 THEN BEGIN
in_bufptr := in_bufptr + 1;
in_char := in_buffer[in_bufptr];
IF in_char = eof_char THEN status := -1;
END{IF};
IF out_bufptr >= sector_size THEN BEGIN
status := write_outfile;
END{IF};
put_char := status;
END{FUNCTION};
{--------------------------------------------------------}
{Purge any chars still remaining in the output buffer}
PROCEDURE put_purge;
VAR
i :INTEGER;
remaining :INTEGER;
status :INTEGER;
BEGIN{PROCEDURE}
status := put_char (eof_char); {ensure at least 1 EOL}
remaining := sector_size - out_bufptr;
FOR i:= 1 TO remaining DO BEGIN
status := put_char (eof_char);
END{FOR};
END{PROCEDURE};
BEGIN{PROCEDURE}
IF outf_flag THEN BEGIN
result := put_char (in_char);
IF line_mod_ctr[2] > line_thousands_limit THEN BEGIN
put_purge;
result := open_next_outfile;
ctr_reset (line_mod_ctr);
END{IF};
END{IF};
END{PROCEDURE};
VAR
i :INTEGER;
status :INTEGER;
in_char :byte;
out_chars :outch_array;
�chars :INTEGER;
BEGIN{FUNCTION}
status := 0;
ctr_reset (line_ctr);
ctr_reset (line_mod_ctr);
ctr_reset (char_ctr);
WHILE status = 0 DO BEGIN
status := get_char (in_char);
IF (status<>0) AND outf_flag THEN BEGIN
put_purge;
END
ELSE BEGIN
count_char (in_char);
IF outf_flag THEN putout_char (in_char);
END{IF};
END{WHILE};
count_file := status;
END{FUNCTION};
BEGIN{PROGRAM}
WRITELN ('Fcount Version ', version);
get_infilename;
status := open_infile;
IF status<>0 THEN BEGIN
WRITELN('*** Could not open input file ', infilename);
END{IF};
IF status=0 THEN BEGIN
get_outfilename;
IF outf_flag THEN BEGIN
status := open_outfile;
IF status<>0 THEN BEGIN
WRITELN('*** Could not open ouput file ', outfilename);
END{IF};
END{IF};
END{IF};
IF status=0 THEN BEGIN
WRITE('Enter max #lines per file (in thousands: ');
line_thousands_limit := get_limit;
IF line_thousands_limit > 0 THEN BEGIN
WRITELN('NOTE that filename should be xxxxx.001');
END{IF};
END{IF};
IF status=0 THEN BEGIN
status := count_file;
END{IF};