PROGRAM PaginateTextFiles; CONST ProgData = 'PAGINATE- Free DOS utility: text file paginator.'; ProgDat2 = 'V1.00: July 14, 1993. (c) 1993 by David Daniel Anderson - Reign Ware.'; Usage = 'Usage: PAGINATE /i /o /l##[:##] (lines per odd/even page)'; Example = 'Example: PAGINATE /iNOTPAGED.TXT /oPAGED.TXT /l55'; VAR IFL, OFL, LPP : String[80]; InFile, OutFile : Text; OddL,EvenL : Word; PROCEDURE InValidParms( ErrCode : Word ); VAR Message : String[80]; BEGIN WriteLn(Usage); WriteLn(Example); CASE ErrCode OF 1 : Message := 'Incorrect number of parameters on command line.'; 2 : Message := 'Invalid switch on command line.'; 3 : Message := 'Cannot open input file '+ IFL + '.'; 4 : Message := 'Cannot open NEW output file '+ OFL + '.'; 5 : Message := 'Non-numeric '+ LPP + ' specified for lines per page.'; ELSE Message := 'Unknown error.'; END; Writeln(Message); Halt; END; PROCEDURE ParseComLine; CONST Bad = ''; {An invalid filename character & invalid integer.} VAR SwStr : String[1]; SwChar : Char; ic : Byte; ArgText : String[80]; BEGIN IF ParamCount <> 3 THEN InValidParms(1); IFL := Bad; OFL := Bad; LPP := Bad; FOR ic := 1 to 3 DO BEGIN SwStr := Copy(ParamStr(ic),1,1); SwChar := UpCase(SwStr[1]); IF (SwChar <> '/') THEN InValidParms(2); SwStr := Copy(ParamStr(ic),2,1); SwChar := UpCase(SwStr[1]); ArgText := Copy(ParamStr(ic),3,(Length(ParamStr(ic))-2)); CASE SwChar OF 'I' : IFL := ArgText; 'O' : OFL := ArgText; 'L' : LPP := ArgText; END; END; END; PROCEDURE Open_I_O_Files; BEGIN Assign(InFile,IFL); {$I-} Reset(InFile); {$I+} IF IOResult <> 0 THEN InValidParms(3); Assign(OutFile,OFL); {$I-} Rewrite(OutFile); {$I+} IF IOResult <> 0 THEN InValidParms(4); END; PROCEDURE GetEvenOdd ( lpp_param : string; var oddnum, evennum : Word); { determine page length for odd/ even pages } VAR odds, evens, { string of odd/ even lines per page } lstr : string[5]; { entire string containing numbers needed } vlppo,vlppe, { numeric of lines per page odd/even } lval : byte; { numeric of string containing numbers needed } pcode : integer; { error code, will be non-zero if strings are not numbers } BEGIN lstr := lpp_param; IF ((pos(':',lstr)) <> 0) THEN BEGIN { determine position of } odds := copy(lstr,1,((pos(':',lstr))-1)); { any colon, and divide } evens := copy(lstr,((pos(':',lstr))+1),length(lstr)); { at that point } val(odds,vlppo,pcode); { convert first part of string } IF (pcode <> 0) THEN { into numeric } InValidParms(5); { show help if any errors } val(evens,vlppe,pcode); { convert first part of string } IF (pcode <> 0) THEN { into numeric } InValidParms(5); { show help if any errors } END ELSE BEGIN { if colon not present, lines/pg should be entire parameter } val(lstr,lval,pcode); { convert entire of string } IF (pcode <> 0) THEN { into numeric } InValidParms(5); { show help if any errors } vlppo := lval; vlppe := lval; END; oddnum := vlppo; evennum := vlppe; END; PROCEDURE InsertFF( OddLines, EvenLines : Word); CONST FF = ' '; VAR LinesCopied, LinesPerPage, PageCopying : Word; ALine : String; BEGIN LinesCopied := 0; LinesPerPage := OddLines; PageCopying := 1; WHILE (NOT Eof(InFile)) DO BEGIN ReadLn(InFile,ALine); IF (LinesCopied = LinesPerPage) THEN BEGIN ALine := FF + ALine; LinesCopied := 0; PageCopying := Succ(PageCopying); IF ((PageCopying MOD 2) = 0) THEN LinesPerPage := EvenLines ELSE LinesPerPage := OddLines; END; WriteLn(OutFile,ALine); LinesCopied := Succ(LinesCopied); END; END; BEGIN { main } Writeln(ProgData); Writeln(ProgDat2); Writeln; ParseComLine; Open_I_O_Files; GetEvenOdd(LPP,OddL,EvenL); Writeln('Input file: ',IFL,' - Output file: ',OFL,'.'); Writeln('Lines per odd / even page: ',Oddl,' / ',EvenL,'.'); InsertFF(OddL,EvenL); Close(InFile); Close(OutFile); Writeln('Done!'); END.