Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site seismo.UUCP Posting-Version: version B 2.10.2 9/3/84; site genrad.UUCP Path: seismo!harvard!think!mit-eddie!genrad!sources-request From: sources-request@genrad.UUCP Newsgroups: mod.sources Subject: Software Tools in Pascal (Part 5 of 6) Message-ID: <942@genrad.UUCP> Date: 13 Jul 85 12:37:41 GMT Sender: john@genrad.UUCP Lines: 1891 Approved: john@genrad.UUCP Mod.sources: Volume 2, Issue 11 Submitted by: ihnp4!mnetor!clewis (Chris Lewis) #!/bin/sh echo 'Start of pack.out, part 05 of 06:' echo 'x - append.pascal' sed 's/^X//' > append.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Append -- append lines after "line" } Xsegment Append; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction Append; Xvar X inLine: StringType; X stat: STCode; X done: Boolean; Xbegin X if (glob) then X stat := ERR X else begin X curLn := line; X stat := OK; X done := false; X while (not done) and (stat = OK) do X if (not GetLine(inLine, STDIN, MAXSTR)) then X stat := ENDDATA X else if (inLine[1] = PERIOD) and X (inLine[2] = NEWLINE) then X done := true X else if (PutTxt(inLine) = ERR) then X stat := ERR X end; X Append := stat Xend; / echo 'x - catsub.pascal' sed 's/^X//' > catsub.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ CatSub -- add replacement text to end of new } Xsegment CatSub; X%include swtools X%include subdef X%include metadef Xprocedure CatSub; Xvar X i,j: Integer; X junk: Boolean; X l: Integer; Xbegin X i := 1; X while (sub[i] <> ENDSTR) do begin X if (sub[i] = DITTO) then begin X l := Ord(sub[i+1]); X if (l in [0..9]) then begin X for j := metaTable[l].first to metaTable[l].last -1 do X junk := AddStr(lin[j], new, k, maxNew); X i := i + 1 X end X else X for j := s1 to s2-1 do X junk := AddStr(lin[j], new, k, maxNew) X end X else X junk := AddStr(sub[i], new, k, maxNew); X i := i + 1 X end Xend; / echo 'x - ckp.pascal' sed 's/^X//' > ckp.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ CkP -- check for "p" after command } Xsegment CkP; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction CkP; Xbegin X SkipBl(lin, i); X if (lin[i] = PCMD) then begin X i := i + 1; X pFlag := true X end X else X pFlag := false; X if (lin[i] = NEWLINE) then X status := OK X else X status := ERR; X CkP := status Xend; / echo 'x - cscopy.pascal' sed 's/^X//' > cscopy.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ CSCopy -- copy cb[i]... to string s } Xsegment CSCopy; X%include swtools X%include defdef X%include defref X%include defproc Xprocedure CSCopy; Xvar X j: Integer; Xbegin X j := 1; X while (cb[i] <> ENDSTR) do begin X s[j] := cb[i]; X i := i + 1; X j := j + 1 X end; X s[j] := ENDSTR Xend; / echo 'x - ctoi.pascal' sed 's/^X//' > ctoi.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ CToI -- convert string at s[i] to integer, increment i } Xsegment ctoi; X%include swtools Xfunction CToI; Xvar X n, sign: Integer; Xbegin X while (s[i] = BLANK) or (s[i] = TAB) do X i := i + 1; X if (s[i] = MINUS) then X sign := -1 X else X sign := 1; X if (s[i] = MINUS) or (s[i] = PLUS) then X i := i + 1; X n := 0; X while(IsDigit(s[i])) do begin X n := 10 * n + Ord(s[i]) - Ord(DIG0); X i := i + 1; X end; X CToI := sign * n; Xend; / echo 'x - dochq.pascal' sed 's/^X//' > dochq.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoChq -- Change quote characters } Xsegment DoChq; X%include swtools X%include macdefs X%include macproc Xprocedure DoChq; Xvar X temp: StringType; X n: Integer; Xbegin X CsCopy(evalStk, argStk[i+2], temp); X n := StrLength(temp); X if (n <= 0) then begin X lQuote := GRAVE; X rQuote := ACUTE; X end {elseif} X else if (n = 1) then begin X lQuote := temp[1]; X rQuote := lQuote X end {elseif} X else begin X lQuote := temp[1]; X rQuote := temp[2] X end {if} Xend {DoCkq}; / echo 'x - dodef.pascal' sed 's/^X//' > dodef.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoDef -- install definition in table } Xsegment DoDef; X%include swtools X%include macdefs X%include macproc Xprocedure DoDef; Xvar X temp1, temp2: StringType; Xbegin X if (j - i > 2) then begin X CsCopy(evalStk, argStk[i+2], temp1); X CsCopy(evalStk, argStk[i+3], temp2); X Install(temp1, temp2, MACTYPE) X end {if}; Xend {DoDef}; / echo 'x - doglob.pascal' sed 's/^X//' > doglob.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoGlob -- do command at lin[i] on all marked lines } Xsegment DoGlob; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction DoGlob; Xvar X count, iStart, n: Integer; Xbegin X status := OK; X count := 0; X n := line1; X iStart := i; X repeat X if (GetMark(n)) then begin X PutMark(n, false); X curLn := n; X curSave := curLn; X i := iStart; X if (GetList(lin, i, status) = OK) then X if (DoCmd(lin, i, true, status) = OK) then X count := 0; X end X else begin X n := NextLn(n); X count := count + 1 X end X until (count > lastLn) or (status <> OK); X DoGlob := status Xend; / echo 'x - doif.pascal' sed 's/^X//' > doif.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoIf -- Select one of two arguments } Xsegment DoIf; X%include swtools X%include macdefs X%include macproc Xprocedure DoIf; Xvar X temp1, temp2, temp3: StringType; Xbegin X if (j - i >= 4) then begin X CsCopy(evalStk, argStk[i+2], temp1); X CsCopy(evalStk, argStk[i+3], temp2); X if (Equal(temp1, temp2)) then X CsCopy(evalStk, argStk[i+4], temp3) X else if (j - i >= 5) then X CsCopy(evalStk, argStk[i+5], temp3) X else X temp3[1] := ENDSTR; X PBStr(temp3) X end {if} Xend {DoIf}; / echo 'x - dolen.pascal' sed 's/^X//' > dolen.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoLen -- Return length of argument } Xsegment DoLen; X%include swtools X%include macdefs X%include macproc Xprocedure DoLen; Xvar X temp: StringType; Xbegin X if (j - i > 1) then begin X CsCopy(evalStk, argStk[i+2], temp); X PBNum(StrLength(temp)) X end {then} X else X PBNum(0) Xend {DoLen}; / echo 'x - dolprint.pascal' sed 's/^X//' > dolprint.pascal << '/' X{ X Copyright (c) 1982 X By: Chris Lewis X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoLPrint -- print lines n1 thru n2 unambiguously } Xsegment DoLPrint; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref X%include chardef Xfunction DoLPrint; Xvar X lp: Integer; X i: Integer; X line: StringType; Xbegin X if (n1 < 0) then X DoLPrint := ERR X else begin X for i := n1 to n2 do begin X GetTxt(i, line); X if OptIsOn(numFlag) then begin X PutDec(i, 5); X PutC(BLANK) X end; X for lp := 1 to StrLength(line) do begin X if CharClass(line[lp]) <> [] then X PutC(line[lp]) X else if line[lp] = NEWLINE then X PutC(NEWLINE) X else begin X PutC(BACKSLASH); X PutDec(Ord(line[lp]), 3) X end X end X end; X curLn := n2; X DoLPrint := OK X end Xend; / echo 'x - doprint.pascal' sed 's/^X//' > doprint.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoPrint -- print lines n1 thru n2 } Xsegment DoPrint; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction DoPrint; Xvar X i: Integer; X line: StringType; Xbegin X if (n1 < 0) then X DoPrint := ERR X else begin X for i := n1 to n2 do begin X GetTxt(i, line); X if OptIsOn(numFlag) then begin X PutDec(i, 5); X PutC(BLANK) X end; X PutStr(line, STDOUT) X end; X curLn := n2; X DoPrint := OK X end Xend; / echo 'x - dowrite.pascal' sed 's/^X//' > dowrite.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ DoWrite -- write lines n1..n2 into file } Xsegment DoWrite; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction DoWrite; Xvar X i: Integer; X fd: FileDesc; X line: StringType; Xbegin X fd := FCreate(fil, IOWRITE); X if (fd = IOERROR) then X DoWrite := ERR X else begin X for i := n1 to n2 do begin X GetTxt(i, line); X PutStr(line,fd) X end; X FClose(fd); X PutDec(n2-n1+1, 1); X PutC(NEWLINE); X DoWrite := OK X end Xend; / echo 'x - esc.pascal' sed 's/^X//' > esc.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Esc -- map s(i) into escaped characters, increment i } Xsegment Esc; X%include swtools Xfunction Esc; Xbegin X if (s[i] <> ESCAPE) then X Esc := s[i] X else if (s[i+1] = ENDSTR) then { @ not special at end } X Esc := ESCAPE X else begin X i := i + 1; X if (s[i] = LETN) or (s[i] = BIGN) then X Esc := NEWLINE X else if (s[i] = TAB) then X Esc := TAB X else X Esc := s[i] X end Xend; / echo 'x - expr.pascal' sed 's/^X//' > expr.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Expr -- Recursive expression evaluation } Xsegment Expr; X%include swtools X%include macdefs X%include macproc Xfunction Expr; Xvar X v: Integer; X t: CharType; Xbegin X v := Term(s, i); X t := GNBChar(s, i); X while (t in [PLUS, MINUS]) do begin X i := i + 1; X if (t = PLUS) then X v := v + Term(s, i) X else X v := v - Term(s, i); X t := GNBChar(s, i) X end {while}; X Expr := v Xend {Expr}; / echo 'x - factor.pascal' sed 's/^X//' > factor.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Factor -- Evaluate factor of arithmetic expression } Xsegment Factor; X%include swtools X%include macdefs X%include macproc Xfunction Factor; Xbegin X if (GNBChar(s, i) = LPAREN) then begin X i := i + 1; X Factor := Expr(s, i); X if (GNBChar(s, i) = RPAREN) then X i := i + 1 X else X Message('Macro: missing paren in expr') X end {then} X else X Factor := CToI(s, i) Xend {Factor}; / echo 'x - getccl.pascal' sed 's/^X//' > getccl.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ GetCCL -- expand char class at arg[i] into pat[j } Xsegment GetCCL; X%include swtools X%include patdef Xfunction GetCCL; Xvar X jStart: Integer; X junk: Boolean; Xbegin X i := i + 1; {skip over CCL} X if (arg[i] = NEGATE) then begin X junk := AddStr(NCCL, pat, j, MAXPAT); X i := i + 1 X end X else X junk := AddStr(CCL, pat, j, MAXPAT); X jStart := j; X junk := AddStr(ENDSTR, pat, j, MAXPAT); {make room for count} X DoDash(CCLEND, arg, i, pat, j, MAXPAT); X { putting an integer into a char only works if the number is les X than 255} X pat[jStart] := Chr(j - jStart - 1); X GetCCL := (arg[i] = CCLEND) Xend; / echo 'x - getpbc.pascal' sed 's/^X//' > getpbc.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ GetPBC -- get a (possibly pushed back) character } Xsegment GetPBC; X%include swtools X%include defdef X%include defref X%include defproc Xfunction GetPBC; Xbegin X if (bp > 0) then X c := buf[bp] X else begin X bp := 1; X buf[bp] := GetC(c); X end; X if (c <> ENDFILE) then X bp := bp - 1; X GetPBC := c Xend; / echo 'x - getrhs.pascal' sed 's/^X//' > getrhs.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ GetRHS -- get right hand side of "s" command } Xsegment GetRHS; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref X%include subdef Xfunction GetRHS; Xbegin X GetRHS := OK; X if (lin[i] = ENDSTR) then X GetRHS := ERR X else if (lin[i+1] = ENDSTR) then X GetRHS := ERR X else begin X i := MakeSub(lin, i+1, lin[i], sub); X if (i = 0) then X GetRHS := ERR X else if (lin[i+1] = LETG) then begin X i := i + 1; X gFlag := true X end X else X gFlag := false X end Xend; / echo 'x - gettok.pascal' sed 's/^X//' > gettok.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ GetTok -- get token for define } Xsegment GetTok; X%include swtools X%include defdef X%include defref X%include defproc Xfunction GetTok; Xvar X i: Integer; X done: Boolean; X junk: CharType; Xbegin X i := 1; X done := false; X while (not done) and (i < tokSize) do begin X token[i] := GetPBC(junk); X if (IsAlphaNum(token[i])) then X i := i + 1 X else X done := true X end; X if (i >= tokSize) then X Error('define: token too long'); X if (i > 1) then begin { some alpha was seen } X PutBack(token[i]); X i := i - 1 X end; X { else single non-alphanumeric } X token[i+1] := ENDSTR; X GetTok := token[1] Xend; / echo 'x - getword.pascal' sed 's/^X//' > getword.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ getword -- get word form s(i) into out } Xsegment GetWord; X%include swtools Xfunction GetWord; Xvar X j: Integer; Xbegin X while (s[i] in [BLANK,TAB,NEWLINE]) do X i := i + 1; X j := 1; X while (not (s[i] in [ENDSTR,BLANK,TAB,NEWLINE])) do begin X out[j] := s[i]; X i := i + 1; X j := j + 1 X end; X out[j] := ENDSTR; X if (j = 1) then X GetWord := 0 X else X GetWord := i Xend; / echo 'x - grep.pascal' sed 's/^X//' > grep.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Grep -- Globally look for Regular Expressions and Print } Xprogram Grep; X%include swtools X%include patdef X%include matchdef Xvar X arg, lin, pat: StringType; X returnCode: Integer; Xbegin X ToolInit; X returnCode := 4; X if (not GetArg(1, arg, MAXSTR)) then X Error('Usage: Grep pattern'); X if (not GetPat(arg, pat)) then X Error('Grep: illegal pattern'); X while (GetLine(lin, STDIN, MAXSTR)) do X if (Match(lin, pat)) then begin X returnCode := 0; X PutStr(lin, STDOUT) X end; X ProgExit(returnCode) Xend. / echo 'x - includ.pascal' sed 's/^X//' > includ.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Includ -- replace include file by contents } XProgram Includ; X%include swtools Xvar incl: StringType; X{ FInclude -- include file desc f } Xprocedure FInclude(f: FileDesc); Xvar X line,strg: StringType; X loc, i: Integer; X f1: FileDesc; Xbegin X while(GetLine(line,f,MAXSTR)) do begin X loc := GetWord(line,1,strg); X if (not Equal(strg,incl)) then X PutStr(line,STDOUT) X else begin X if GetFid(line, loc, strg) then begin X f1 := MustOpen(strg,IOREAD); X FInclude(f1); X FClose(f1); X end X else X Error('Bad file name'); X end X end Xend; Xbegin X ToolInit; X CvtSST('#include', incl); X FInclude(STDIN) Xend. / echo 'x - initmacr.pascal' sed 's/^X//' > initmacr.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ InitMacro -- initialize variables for macro } Xsegment InitMacro; X%include swtools X%include macdefs X%include macproc Xprocedure InitMacro; Xbegin X null[1] := ENDSTR; X CvtSST('define', defName); X CvtSST('substr', subName); X CvtSST('expr', exprName); X CvtSST('ifelse', ifName); X CvtSST('len', lenName); X CvtSST('changeq', chqName); X bp := 0; { push back buffer pointer } X traceing := false; X if NArgs > 0 then traceing := true; X InitHash; X lQuote := GRAVE; X rQuote := ACUTE; Xend {InitMacro}; / echo 'x - kwic.exec' sed 's/^X//' > kwic.exec << '/' X&CONTROL OFF X&IF &1 EQ ? &GOTO -EXPLAIN XSTATE &1 &2 * X&IF &RETCODE NE 0 &GOTO -NOFILE XKWIC < &1 &2 > KWIC TEMP1 A X&IF &RETCODE NE 0 &GOTO -DIED XBNRSORT KWIC TEMP1 KWIC TEMP2 AP 1 20 X&IF &RETCODE NE 0 &GOTO -DIED XUNROTATE < KWIC TEMP2 > &1 KWIC A X&IF &RETCODE NE 0 &GOTO -DIED XERASE KWIC TEMP1 XERASE KWIC TEMP2 X&EXIT 0 X-NOFILE X&TYPE FILE &1 &2 DOES NOT EXIST X&EXIT 4 X-DIED XERASE KWIC TEMP1 XERASE KWIC TEMP2 X&TYPE ONE OF THE KWIC PASSES DIED X&EXIT 8 X-EXPLAIN X&BEGTYPE X KWIC INNAME INTYPE X X Kwic is an EXEC that produces a "Keyword in Context" Index. X Kwic takes the file specified by inFile inType and creates X the index in a file called "inFile KWIC" X X The first "inName inFile" encountered in your search path is X used. "inFile KWIC" is created on your A disk. X X It is recommended that you never "KWIC" a "KWIC" file. X&END / echo 'x - lndelete.pascal' sed 's/^X//' > lndelete.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ LnDelete -- delete lines n1 thru n2 } Xsegment LnDelete; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction LnDelete; Xbegin X if (n1 <= 0) then X status := ERR X else begin X BlkMove(n1, n2, lastLn); X lastLn := lastLn - (n2 - n1 + 1); X curLn := PrevLn(n1); X status := OK X end; X LnDelete := status Xend; / echo 'x - locate.pascal' sed 's/^X//' > locate.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Locate -- look for c in character class at pat[offset] } Xsegment Locate; X%include swtools X%include matchdef Xfunction Locate; Xvar X i: Integer; Xbegin X { size of class is at pat[offset], characters follow } X Locate := false; X i := offset + Ord(pat[offset]); { last position } X while (i > offset) do X if (c = pat[i]) then begin X locate := true; X i := offset { force loop termination } X end X else X i := i - 1 Xend; / echo 'x - lookup.pascal' sed 's/^X//' > lookup.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Lookup -- locate name, get defn and type from table } Xsegment Lookup; X%include swtools X%include defdef X%include defref X%include defproc Xfunction Lookup; Xvar X p: ndPtr; Xbegin X p := HashFind(name); X if (p = nil) then X Lookup := false X else begin X Lookup := true; X CSCopy(NDTable, p->.defn, defn); X t := p->.kind X end Xend; / echo 'x - match.pascal' sed 's/^X//' > match.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Match -- find match anywhere on line + support fcns } Xsegment Match; X%include swtools X%include patdef X%include matchdef Xfunction Match; Xvar X i, pos: Integer; Xbegin X pos := 0; X i := 1; X while (lin[i] <> ENDSTR) and (pos = 0) do begin X pos := AMatch(lin, i, pat, 1); X i := i + 1; X end; X Match := (pos > 0) Xend; / echo 'x - move.pascal' sed 's/^X//' > move.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Move -- move line1 thru line2 after line3 } Xsegment Move; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction Move; Xbegin X if (line1 <= 0) or ((line3 >= line1) and (line3 < line2)) then X Move := ERR X else begin X BlkMove(line1, line2, line3); X if (line3 > line1) then X curLn := line3 X else X curLn := line3 + (line2 - line1 + 1); X Move := OK X end Xend; / echo 'x - nextln.pascal' sed 's/^X//' > nextln.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ NextLn/PrevLn -- get next/previous line number } Xsegment NextLn; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref Xfunction NextLn; Xbegin X if (n >= lastLn) then X nextLn := 0 X else X nextLn := n + 1 Xend; Xfunction PrevLn; Xbegin X if (n <= 0) then X PrevLn := lastLn X else X PrevLn := n - 1 Xend; / echo 'x - optpat.pascal' sed 's/^X//' > optpat.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ OptPat -- get optional pattern from lin[i], increment i } Xsegment OptPat; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref X%include patdef Xfunction OptPat; Xbegin X if (lin[i] = ENDSTR) then X i := 0 X else if (lin[i + 1] = ENDSTR) then X i := 0 X else if (lin[I + 1] = lin[i]) then { leave existing pattern alone } X i := i + 1 X else X i := MakePat(lin, i+1, lin[i], pat); X if (pat[1] = ENDSTR) then X i := 0; X if (i = 0) then begin X pat[1] := ENDSTR; X OptPat := ERR X end X else X OptPat := OK Xend; / echo 'x - patscan.pascal' sed 's/^X//' > patscan.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ PatScan -- find next occurance of pattern after line n } Xsegment PatScan; X%include swtools X%include editcons X%include edittype X%include editproc X%include editref X%include matchdef Xfunction PatScan; Xvar X done: Boolean; X line: StringType; Xbegin X n := curLn; X PatScan := ERR; X done := false; X repeat X if (way = SCAN) then X n := NextLn(n) X else X n := PrevLn(n); X GetTxt(n, line); X if (Match(line, pat)) then begin X PatScan := OK; X done := true X end X until (n = curLn) or (done) Xend; / echo 'x - patsize.pascal' sed 's/^X//' > patsize.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ PatSize -- returns size of pattern entry at pat[n] } Xsegment PatSize; X%include swtools X%include patdef X%include matchdef X%include metadef Xfunction PatSize; Xbegin X case pat[n] of X LITCHAR: X PatSize := 2; X BOL, EOL, ANY, BOM, EOM: X PatSize := 1; X CCL, NCCL: X PatSize := Ord(pat[n+1]) + 2; X CLOSURE: X PatSize := CLOSIZE X otherwise X Error('in PatSize: Can''t happen'); X end Xend; / echo 'x - putchr.pascal' sed 's/^X//' > putchr.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ PutChr -- put single char on output or eval stack } Xsegment PutChr; X%include swtools X%include macdefs X%include macproc Xprocedure PutChr; Xbegin X if (cp <= 0) then X PutC(c) X else begin X if (ep > EVALSIZE) then X Error('Macro: evaluation stack overflow'); X evalStk[ep] := c; X ep := ep + 1 X end {if} Xend {PutChr}; / echo 'x - putstr.pascal' sed 's/^X//' > putstr.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ PutStr -- put string out on file } Xsegment PutStr; X%include swtools X%include ioref Xprocedure PutStr; Xvar X i: Integer; X j: integer; X len: Integer; X outString: StringType; Xbegin X i := 1; X j := 1; X len := StrLength(str); X while i <= len do begin X if str[i] = NEWLINE then begin X if j = 1 then WriteLn(openList[fd].fileVar) X else WriteLn(openList[fd].fileVar, outString:j-1); X j := 1; X end {then} X else begin X outString[j] := str[i]; X j := j + 1; X end; {if} X i := i + 1 X end; {while} X if j <> 1 then write(openList[fd].fileVar, outString:j-1); Xend; {PutStr} / echo 'x - putsub.pascal' sed 's/^X//' > putsub.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ PutSub -- output substitution text } Xsegment PutSub; X%include swtools X%include subdef Xprocedure PutSub; Xvar X i, j: Integer; X junk: Boolean; Xbegin X i := 1; X while (sub[i] <> ENDSTR) do begin X if (sub[i] = DITTO) then X for j := s1 to s2-1 do X PutC(lin[j]) X else X PutC(sub[i]); X i := i + 1 X end Xend; / echo 'x - sccopy.pascal' sed 's/^X//' > sccopy.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ SCCopy -- copy string s to cb[i] } Xsegment SCCopy; X%include swtools X%include defdef X%include defref X%include defproc Xprocedure SCCopy; Xvar X j: Integer; Xbegin X j := 1; X while (s[j] <> ENDSTR) do begin X cb[i] := s[j]; X j := j + 1; X i := i + 1 X end; X cb[i] := ENDSTR Xend; / echo 'x - screen.pascal' sed 's/^X//' > screen.pascal << '/' X{ X Copyright (c) 1982 X By: Chris Lewis X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Screen -- line printer character test } Xprogram Screen; X%include swtools X%include ioref Xvar i: Integer; X first: Integer; Xbegin XToolInit; XWriteLn(openList[STDOUT].fileVar, ' C H A R A C T E R S E T'); XPutC(NEWLINE); XWriteLn(openList[STDOUT].FileVar, X ' 0 1 2 3 4 5 6 7 8 9 A B C D E F'); Xfor i := 0 to 255 do begin X if i mod 16 = 0 then begin X PutC(NEWLINE); X PutC(NEWLINE); X first := i div 16; X if first >= 10 then X PutC(Chr(first + Ord(BIGA) - 10)) X else X PutC(Chr(i div 16 + Ord(DIG0))); X PutC(DIG0); X PutC(BLANK); X PutC(BLANK); X end; X Write(openList[STDOUT].fileVar, ' ', Chr(i)) Xend Xend. / echo 'x - stclose.pascal' sed 's/^X//' > stclose.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ StClose -- insert closure entry at pat[j] } Xsegment STClose; X%include swtools X%include patdef Xprocedure StClose; Xvar X jp, jt: Integer; X junk: Boolean; Xbegin X for jp := j-1 downto lastJ do begin X jt := jp + CLOSIZE; X junk := AddStr(pat[jp], pat, jt, MAXPAT) X end; X j := j + CLOSIZE; X pat[lastJ] := CLOSURE { where original pattern began } Xend; / echo 'x - strindex.pascal' sed 's/^X//' > strindex.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ StrIndex -- find position of character c in string s } Xsegment StrIndex; X%include swtools Xfunction StrIndex; Xvar X i: Integer; Xbegin X i := 1; X while (s[i] <> c) and (s[i] <> ENDSTR) do X i := i + 1; X if (s[i] = ENDSTR) then X StrIndex := 0 X else X StrIndex := i Xend; / echo 'x - subline.pascal' sed 's/^X//' > subline.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ SubLine -- substitute sub for pat in lin and print } Xsegment SubLine; X%include swtools X%include patdef X%include subdef X%include matchdef Xprocedure SubLine; Xvar X i, lastm, m: Integer; X junk: Boolean; Xbegin X lastm := 0; X i := 1; X while (lin[i] <> ENDSTR) do begin X m := AMatch(lin, i, pat, 1); X if (m > 0) and (lastm <> m) then begin X { replace substituted text } X PutSub(lin, i, m, sub); X lastm := m X end; X if (m = 0) or (m = i) then begin X { no match or null match } X PutC(lin[i]); X i := i + 1 X end X else { skip matched text } X i := m X end Xend; / echo 'x - swch.pascal' sed 's/^X//' > swch.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Change -- change "from" into "to" on each line } Xprogram swch; X%include swtools X%include patdef X%include matchdef X%include subdef Xvar X lin, pat, sub, arg: StringType; Xbegin X ToolInit; X if (not GetArg(1, arg, MAXSTR)) then X Error('usage: change from '); X if (not GetPat(arg, pat)) then X Error('change: illegal "from" pattern'); X if (not GetArg(2, arg, MAXSTR)) then X arg[1] := ENDSTR; X if (not GetSub(arg, sub)) then X Error('change: illegal "to" string'); X while (GetLine(lin, STDIN, MAXSTR)) do X SubLine(lin, pat, sub) Xend; / echo 'x - swprint.exec' sed 's/^X//' > swprint.exec << '/' X&TRACE OFF XCP SPOOL PRT CONT HOLD FORM LW1T XERASE CMS EXEC A XEXECUTIL WRITE CMS EXEC A (&TRACE OFF) XLISTFILE * PASCAL C (APPEND XEXEC CMS EXEC SWPRIN1 XERASE CMS EXEC A XERASE SWTOOLS LDATE C XEXECUTIL WRITE SWTOOLS LDATE C (JUNK) XERASE CMS EXEC XCP SPOOL PRT CLOSE / echo 'x - term.pascal' sed 's/^X//' > term.pascal << '/' X{ X Copyright (c) 1981 X By: Bell Telephone Laboratories, Inc. and X Whitesmiths, Ltd., X X This software is derived from the book X "Software Tools In Pascal", by X Brian W. Kernighan and P.J. Plauger X Addison-Wesley, 1981 X ISBN 0-201-10342-7 X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Term -- Evaluate term of arithmetic expression } Xsegment Term; X%include swtools X%include macdefs X%include macproc Xfunction Term; Xvar X v: Integer; X t: CharType; Xbegin X v := Factor(s, i); X t := GNBChar(s, i); X while (t in [STAR, SLASH, PERCENT]) do begin X i := i + 1; X case t of X STAR: X v := v * Factor(s, i); X SLASH: X v := v div Factor(s, i); X PERCENT: X v := v mod Factor(s, i) X end {case}; X t := GNBChar(s, i) X end {while}; X Term := v Xend { Term }; / echo 'x - wc.pascal' sed 's/^X//' > wc.pascal << '/' X{ X Copyright (c) 1982 X By: Chris Lewis X X Right is hereby granted to freely distribute or duplicate this X software, providing distribution or duplication is not for profit X or other commerical gain and that this copyright notice remains X intact. X} X{ Wc -- Word Counting program } Xprogram Wc; X%include SWTOOLS Xvar X buffer: StringType; X numChars: Integer; X numWords: Integer; X numLines: Integer; X i: Integer; X lineLength: Integer; X inWord: Boolean; Xbegin X ToolInit; X numChars := 0; X numWords := 0; X numLines := 0; X while (GetLine(buffer, STDIN, MAXSTR)) do begin X inWord := false; X numLines := numLines + 1; X lineLength := StrLength (buffer); X numChars := numChars + lineLength; X for i := 1 to lineLength do X if (buffer[i] = BLANK) then X inWord := false X else if (not inWord) then begin X inWord := true; X numWords := numWords + 1; X end; {if} X end; {while} X PutDec(numChars, 7); X PutDec(numWords, 7); X PutDec(numLines, 7); Xend; {Wc} / echo 'Part 05 of pack.out complete.' exit