EXTERNAL KFORMAT::STDIO; {++++++++++++++++++++++++++++++++++++++++} {+ STANDARD FILE IO MODULE +} {++++++++++++++++++++++++++++++++++++++++} { WRITTEN BY: Raymond E. Penley DATE WRITTEN: March 13, 1981 } {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DECLARE THE FOLLOWING IN YOUR MAIN PROGRAM. CONST DEFAULT = 80; SMAX = 255; space = ' '; maxargc = 5; < maximum # of words you expect to parse > < out of the Command line. > TYPE byte = 0..255; int = INTEGER; DSTRING = string default; MSTRING = STRING SMAX; S$0 = string 0; S$255 = string 255; VAR argc : byte; argv : ARRAY [1..maxargc] OF DSTRING; infile, outfile, params : byte; inbuf : MSTRING; ioresult, con_wanted, printer_wanted : boolean; stdin, stdout : TEXT; PROCEDURE HALT(message:MSTRING);EXTERNAL; ++++++++++++++++++++++++++++++++++++++++++++++++++++} {$C-}{ CONTROL-C CHECKING OFF } {$M-}{ INTEGER MULT & DIVD ERROR CHECKING OFF } {$F-}{ FLOATING POINT ERROR CHECKING OFF } {$iOPEN.LIB } {$iGCML.LIB } PROCEDURE PARSE(inbuf: MSTRING); var idlen,cpos: int; begin append(inbuf,' '); for argc := 1 to maxargc do setlength(argv[argc],0); argc := 0; cpos := 1; WHILE cpos < length(inbuf) DO BEGIN WHILE (cpos < length(inbuf)) AND (inbuf[cpos]=space) DO cpos := cpos + 1; { skip over spaces } idlen := 0; argc := argc + 1; WHILE (cpos < length(inbuf)) AND (inbuf[cpos]<>space) DO BEGIN {accept only non-space} idlen := idlen + 1; append( argv[argc], inbuf[cpos] ); cpos := cpos + 1; END; END; {WHILE cpos0 then begin PARSE(inbuf); { open input file } OPEN(argv[infile],'I',stdin); if ioresult=false then HALT(' '); { open output file } { if no file specified then default=LST: } if length(argv[outfile])=0 then argv[outfile] := 'LST:'; OPEN(argv[outfile],'O',stdout); if ioresult=false then HALT(' '); end END { * STD OPEN * }; PROCEDURE getc(VAR ch: char); {$R-}{ * RANGE CHECKING OFF * } BEGIN xeof := false; IF NOT EOF(stdin) THEN READ(stdin,ch); IF EOF(stdin) THEN begin ch := ' '; xeof := true; end else if ch=chr(5) then { * end of file on the console? * } xeof := true; { * do eof stuff if yes * } end; {$R+}{ * RANGE CHECKING ON * } PROCEDURE putc(c:CHAR); BEGIN if c=newline then writeln(stdout) else WRITE(stdout,c); {output the character} END; PROCEDURE puts(VAR LINE:MSTRING); var i:int; BEGIN for i:=1 to length(LINE) do putc( LINE[i] ); END; procedure gets(var inbuf:MSTRING); { * this version of gets() specially modified for kformat.pas * } (* GLOBAL: newline, xeof, SMAX, stdin *) var ch: char; BEGIN setlength(inbuf,0); { * inbuf := ''; * } WHILE not eoln(stdin) and not xeof do begin getc(ch); If ORD(ch)>127 then ch := CHR( ORD(ch)-127 ); If length(inbuf) < SMAX then (* start accepting characters *) append(inbuf, ch) end; READLN(stdin); {+++ ignore the line boundary +++} append(inbuf,newline); { *** MAR 81 *** } end; {END EXTERNAL}. .