############################################################################### # # # Lout @CPSetup package for formatting C and C++ programs # # # # Version 3.0 # # Jeffrey H. Kingston # # 5 April 2000 # # # # This package uses a filtered body parameter to convert program source # # code into Lout source. The filter program is prg2lout, which is # # distributed with Lout and should be compiled and installed wherever # # Lout itself is. # # # ############################################################################### export @CP def @CPSetup named pipe { } # pipe through this first named style named @OrIfPlain left x right y { @BackEnd @Case { PlainText @Yield y else @Yield x } } { fixed } # print style # the following options apply when style is "fixed" named fixedfont { Courier }# font family named fixedsize { -1.0p } # font size named fixedline { 1.0vx } # line-space named fixedtabin { 8 } # tab interval named fixedtabout { 8s } # tab width named fixedidentifiers { Base } # identifier face named fixedkeywords { Base } # keyword face named fixedoperators { Base } # operator face named fixednumbers { Base } # number face named fixedstrings { Base } # string face named fixedcomments { Base } # comment face named fixedidentifiersformat right @Body { @Body } # identifier format named fixedkeywordsformat right @Body { @Body } # keyword format named fixedoperatorsformat right @Body { @Body } # operators format named fixednumbersformat right @Body { @Body } # number format named fixedstringsformat right @Body { @Body } # string format named fixedcommentsformat right @Body { @Body } # comment format # the following options apply when style is "varying" named varyingfont { } # font family named varyingsize { 1.0f } # font size named varyingline { 1.0vx } # line-space named varyingtabin { 8 } # tab interval named varyingtabout { 3f } # tab width named varyingidentifiers { Slope } # identifier face named varyingkeywords { Bold } # keyword face named varyingoperators { Base } # operator face named varyingnumbers { Base } # number face named varyingstrings { Slope } # string face named varyingcomments { Base } # comment face named varyingidentifiersformat right @Body { @Body } # identifier format named varyingkeywordsformat right @Body { @Body } # keyword format named varyingoperatorsformat right @Body { @Body } # operators format named varyingnumbersformat right @Body { @Body } # number format named varyingstringsformat right @Body { @Body } # string format named varyingcommentsformat right @Body { @Body } # comment format # the following options apply when style is "symbol" named symbolfont { } # font family named symbolsize { 1.0f } # font size named symbolline { 1.0vx } # line-space named symboltabin { 8 } # tab interval named symboltabout { 3f } # tab width named symbolidentifiers { Slope } # identifier face named symbolkeywords { Bold } # keyword face named symboloperators { Base } # operator face named symbolnumbers { Base } # number face named symbolstrings { Slope } # string face named symbolcomments { Base } # comment face named symbolidentifiersformat right @Body { @Body } # identifier format named symbolkeywordsformat right @Body { @Body } # keyword format named symboloperatorsformat right @Body { @Body } # operators format named symbolnumbersformat right @Body { @Body } # number format named symbolstringsformat right @Body { @Body } # string format named symbolcommentsformat right @Body { @Body } # comment format @Begin export @PI @PK @PO @PN @PS @PC @PA @PM @PD @A "$>" def @CP named style { style } # style named pipe { pipe } # pipe through this first named font { dft } # font family named size { dft } # font size named line { dft } # line-space named tabin { dft } # tab interval named tabout { dft } # tab width named identifiers { dft } # ident. font named keywords { dft } # keyword font named operators { dft } # operator font named numbers { dft } # number font named strings { dft } # string font named comments { dft } # comment font body @Body # filtered, see below @Begin def @Test # returns x unless x is dft left x named iffixed {} named ifvarying {} named ifsymbol {} { x @Case { dft @Yield { style @Case { fixed @Yield { iffixed } varying @Yield { ifvarying } symbol @Yield { ifsymbol } } } else @Yield x } } def @Else # returns x, or y if x is dft left x right y { x @Case { dft @Yield y else @Yield x } } def @InitTab { tabin @Test iffixed { fixedtabin } ifvarying { varyingtabin } ifsymbol { symboltabin } } def @InitTabWidth { tabout @Test iffixed { fixedtabout } ifvarying { varyingtabout } ifsymbol { symboltabout } } def @Filter { pipe @Case { "" @Yield { "prg2lout -r -lC" -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} } else @Yield { "cat" @FilterIn "|" pipe "|" "prg2lout -r -lC" -o{@FilterOut} -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} } } } def @InitFontFamily { font @Test iffixed { fixedfont } ifvarying { varyingfont } ifsymbol { symbolfont } } def @InitSize { size @Test iffixed { fixedsize } ifvarying { varyingsize } ifsymbol { symbolsize } } def @InitLine { line @Test iffixed { fixedline } ifvarying { varyingline } ifsymbol { symbolline } } def @PI # for formatting identifiers right x { style @Case { fixed @Yield fixedidentifiersformat { { identifiers @Else fixedidentifiers } @Font x } varying @Yield varyingidentifiersformat { { identifiers @Else varyingidentifiers } @Font x } symbol @Yield symbolidentifiersformat { { identifiers @Else symbolidentifiers } @Font x } } } def @PK # for formatting keywords right x { style @Case { fixed @Yield fixedkeywordsformat { { keywords @Else fixedkeywords } @Font x } varying @Yield varyingkeywordsformat { { keywords @Else varyingkeywords } @Font x } symbol @Yield symbolkeywordsformat { { keywords @Else symbolkeywords } @Font x } } } def @PO # for formatting operators right x { style @Case { fixed @Yield fixedoperatorsformat { { operators @Else fixedoperators } @Font x } varying @Yield varyingoperatorsformat { { operators @Else varyingoperators } @Font x } symbol @Yield symboloperatorsformat { { operators @Else symboloperators } @Font x } } } def @PN # for formatting numbers right x { style @Case { fixed @Yield fixednumbersformat { { numbers @Else fixednumbers } @Font x } varying @Yield varyingnumbersformat { { numbers @Else varyingnumbers } @Font x } symbol @Yield symbolnumbersformat { { numbers @Else symbolnumbers } @Font x } } } def @PS # for formatting strings right x { style @Case { fixed @Yield fixedstringsformat { { strings @Else fixedstrings } @Font x } varying @Yield varyingstringsformat { { strings @Else varyingstrings } @Font x } symbol @Yield symbolstringsformat { { strings @Else symbolstrings } @Font x } } } def @PC # for formatting comments right x { style @Case { fixed @Yield fixedcommentsformat { { comments @Else fixedcomments } @Font x } varying @Yield varyingcommentsformat { { comments @Else varyingcomments } @Font x } symbol @Yield symbolcommentsformat { { comments @Else symbolcomments } @Font x } } } def @PA # for formatting asterisks { @PO @BackEnd @Case { PlainText @Yield "*" else @Yield { "0.5w" @VShift "*" } } } def @PM # for formatting minus signs { @PO @BackEnd @Case { PlainText @Yield "-" else @Yield style @Case { fixed @Yield "-" else @Yield { { Symbol Base } @Font @Char "minus" } } } } def @PD # for formatting dots, if wanted larger { @PO @BackEnd @Case { PlainText @Yield "." else @Yield { "1.4f" @Font "+0.04f" @VShift "." &"0.05f" } } } def @A # get characters from the Adobe Symbol font left sym right x { style @Case { symbol @Yield { { Symbol Base } @Font @Char sym } else @Yield { x } } } macro "$>" { {} & } { @InitFontFamily Base @InitSize } @Font { @InitLine lines } @Break @Body @End @CP @End @CPSetup