blob: 313b1105874f42baa9c7f5654b64e75133b69501 (
plain) (
tree)
|
|
###############################################################################
# #
# Lout @CPSetup package for formatting C programs #
# #
# Version 2.0 by Jeffrey H. Kingston, February 2000. #
# #
# This package uses a filtered body parameter to convert C 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 style
named @OrIfPlain left x right y
{ @BackEnd @Case { PlainText @Yield y else @Yield x } }
{ fixed } # print style
named pipe { } # pipe through this first
named fixedfont { Courier } # font family if fixed
named fixedstrings { Base } # string face if fixed
named fixedidentifiers { Base } # identifier face if fixed
named fixedcomments { Base } # comment face if fixed
named fixedkeywords { Base } # keyword face if fixed
named fixednumbers { Base } # number face if fixed
named fixedoperators { Base } # operator face if fixed
named fixedsize { -1.0p } # font size if fixed
named fixedline { 1.0vx } # line-space if fixed
named fixedtabin { 8 } # tab interval if fixed
named fixedtabout { 8s } # tab width if fixed
named varyingfont { } # font family if varying
named varyingstrings { Slope } # string face if varying
named varyingidentifiers { Slope } # identifier face if varying
named varyingcomments { Base } # comment face if varying
named varyingkeywords { Bold } # keyword face if varying
named varyingnumbers { Base } # number face if varying
named varyingoperators { Base } # operator face if varying
named varyingsize { 1.0f } # font size if varying
named varyingline { 1.0vx } # line-space if varying
named varyingtabin { 8 } # tab interval if varying
named varyingtabout { 3f } # tab width if varying
named symbolfont { } # font family if symbol
named symbolstrings { Slope } # string face if symbol
named symbolidentifiers { Slope } # identifier face if symbol
named symbolcomments { Base } # comment face if symbol
named symbolkeywords { Bold } # keyword face if symbol
named symbolnumbers { Base } # number face if symbol
named symboloperators { Base } # operator face if symbol
named symbolsize { 1.0f } # font size if symbol
named symbolline { 1.0vx } # line-space if symbol
named symboltabin { 8 } # tab interval if symbol
named symboltabout { 3f } # tab width if symbol
@Begin
export
"$>" @S @D @C @K @N @O @A @ST @ED @M
def @CP
named style { style } # style
named pipe { pipe } # pipe through this first
named font { dft } # font family
named strings { dft } # string font
named identifiers { dft } # ident. font
named comments { dft } # comment font
named keywords { dft } # keyword font
named numbers { dft } # number font
named operators { dft } # operator font
named size { dft } # font size
named line { dft } # line-space
named tabin { dft } # tab interval
named tabout { dft } # tab width
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 @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 @S # for formatting strings
right x
{
# "\"" &
strings @Test
iffixed { fixedstrings }
ifvarying { varyingstrings }
ifsymbol { symbolstrings }
@Font x
# & "\""
}
# def "`"
# {
# style @Case {
# symbol @Yield { "`" }
# else @Yield { "'" }
# }
# }
def @D # for formatting identifiers
right x
{
identifiers @Test
iffixed { fixedidentifiers }
ifvarying { varyingidentifiers }
ifsymbol { symbolidentifiers }
@Font x
}
def @C # for formatting comments
right x
{
comments @Test
iffixed { fixedcomments }
ifvarying { varyingcomments }
ifsymbol { symbolcomments }
@Font x
}
def @K # for formatting keywords
right x
{
keywords @Test
iffixed { fixedkeywords }
ifvarying { varyingkeywords }
ifsymbol { symbolkeywords }
@Font x
}
def @N # for formatting numbers
right x
{
numbers @Test
iffixed { fixednumbers }
ifvarying { varyingnumbers }
ifsymbol { symbolnumbers }
@Font x
}
def @O # for formatting operators
right x
{
operators @Test
iffixed { fixedoperators }
ifvarying { varyingoperators }
ifsymbol { symboloperators }
@Font x
}
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 }
}
}
def @ST # for formatting asterisks
right x
{
operators @Test
iffixed { fixedoperators }
ifvarying { varyingoperators }
ifsymbol { symboloperators }
@Font "0.5w" @VShift x
}
def @ED # for formatting larger dots (not used in C)
right x
{
operators @Test
iffixed { fixedoperators }
ifvarying { varyingoperators }
ifsymbol { symboloperators }
@Font @BackEnd @Case {
PlainText @Yield x
else @Yield { "1.2f" @Font "+0.05f" @VShift @O x &"0.05f" }
}
}
macro "$>" { {} & }
def @M right x
{
style @Case {
fixed @Yield "-"
varying @Yield { { Symbol Base } @Font @Char minus }
symbol @Yield { { Symbol Base } @Font @Char minus }
}
}
{ @InitFontFamily Base @InitSize } @Font
{ @InitLine lines } @Break @Body
@End @CP
@End @CPSetup
|