@Section @Title { Reading and selecting program text from separate files } @Tag { pipes } @Begin @PP We have said that program text within @Code "@CP { ... }" and the other symbols is passed directly to @Code prg2lout for analysis. However, there is an exception. The program text may contain an @Code "@Include" or @Code "@SysInclude" command, which, as for the @Code "@Verbatim" symbol (Section {@NumberOf verbatim}), causes Lout to take the program text from a file: @ID @OneRow @Code { "@Eiffel" "{" " @Include { \"/usr/staff/jeff/Eiffel/hash.e\" }" "}" } The included file is not examined for balanced braces or @Code "@End" or {@Code "@Include"}; it is treated entirely verbatim and passed straight on to {@Code prg2lout}. There may be several @Code "@Include" commands, and any amount of program text as well, within @Code "@CP { ... }" and the rest. @PP When including files in this way it often happens that only part of an actual program file is wanted for display. Rather than placing the wanted part in a separate file, which is error-prone and tedious when the program is changing, Unix users can use the @Code "pipe" option to pipe the entire file through an arbitrary sequence of Unix commands, which may be used to make the wanted selection before the program text is passed to {@Code prg2lout}. @PP For example, suppose that all your Eiffel routines begin with the routine name one tab stop from the left margin and end at the first following @Eiffel { end } indented two tab stops. Then @ID @OneRow @Code { "@Eiffel" " pipe { \"sed -n /^.insert/,/^..end/p\" }" "{" " @Include { \"/usr/staff/jeff/Eiffel/hash.e\" }" "}" } will select just the @Eiffel { insert } routine from the @Code { hash.e } file. Assuming that your program text has been laid out in a disciplined manner, every line of the selection will begin with a tab character that is not wanted in this display, so an even better pipe is @ID @OneRow @Code { "@Eiffel" " pipe { \"sed -n /^.insert/,/^..end/p | cut -c2-\" }" "{" " @Include { \"/usr/staff/jeff/Eiffel/hash.e\" }" "}" } since it cuts away the unwanted tab characters. Unfortunately, we can't show the result of this on an actual example, since that would prevent this manual from being formatted on a non-Unix system. @End @Section