panos@utcsri.UUCP (Panos Economopoulos) (11/05/85)
%START LAT GRK %{ #include "accents.h" %} %% char prevMo='L'; /* previous "Mode": 'L' (LAT), or 'G' (GRK) */ int capToAcc=0; /* flag: convert next capital to accented */ BEGIN LAT; /* default "font" is LAT (latin) */ ^".".* { ECHO; /* full-line troff commands get echoed; there is NO translation * of their arguments. .ft-type commands get caught below, * because that is a longer match */ /* in-line troff commands (except for \f[RBIP] -- see below) * are NOT understood, and will get translated, in GRK-mode; * this will usually ruin them */ } <LAT>\\fG | <LAT>^\.("ft ")?G\n { prevMo='L'; BEGIN GRK; } <GRK>\\fG | <GRK>^\.("ft ")?G\n { prevMo='G'; } <LAT>\\fL | <LAT>^\.("ft ")?L\n { prevMo='L'; } <LAT>\\f[RBI] | <LAT>^\.("ft ")?[RBI]\n { prevMo='L'; ECHO; } <GRK>\\fL | <GRK>^\.("ft ")?L\n { prevMo='G'; BEGIN LAT; } <GRK>\\f[RBI] | <GRK>^\.("ft ")?[RBI]\n { prevMo='G'; BEGIN LAT; ECHO;} <LAT>\\fP | <LAT>^\.ft(" P")?\n { if (prevMo=='G') BEGIN GRK; ECHO; /* restore BOTH the previous mode (LAT/GRK), * and the previous latin font (R, B, or I) */ } <GRK>\\fP | <GRK>^\.ft(" P")?\n { if (prevMo=='L') BEGIN LAT; /* restore ONLY the previous mode (LAT/GRK) */ } <GRK>([a-z]|ii|th|ch|ps|Ii|Th|Ch|Ps)[AEHIOYUW] { capToAcc=1; REJECT; /* set flag to interpret upper-case letter as accented lower- * case one, and then go back to normal processing */ } <GRK>a fputs("\\(*a", stdout); <GRK>v|b fputs("\\(*b", stdout); <GRK>g fputs("\\(*g", stdout); <GRK>d fputs("\\(*d", stdout); <GRK>e fputs("\\(*e", stdout); <GRK>z fputs("\\(*z", stdout); <GRK>ii|h fputs("\\(*y", stdout); <GRK>th fputs("\\(*h", stdout); <GRK>i fputs("\\(*i", stdout); <GRK>k fputs("\\(*k", stdout); <GRK>l fputs("\\(*l", stdout); <GRK>m fputs("\\(*m", stdout); <GRK>n fputs("\\(*n", stdout); <GRK>x fputs("\\(*c", stdout); <GRK>o fputs("\\(*o", stdout); <GRK>p fputs("\\(*p", stdout); <GRK>r fputs("\\(*r", stdout); <GRK>s/[a-zAEHIOYUW'] fputs("\\(*s", stdout); <GRK>s/[^a-zAEHIOYUW'] { #ifdef IMAGEN ECHO; /* the Imagen laser-printer has no terminal-sigma(!) */ #else fputs("\\(ts", stdout); #endif } <GRK>t fputs("\\(*t", stdout); <GRK>y|u fputs("\\(*u", stdout); <GRK>f fputs("\\(*f", stdout); <GRK>ch fputs("\\(*x", stdout); <GRK>ps fputs("\\(*q", stdout); <GRK>w fputs("\\(*w", stdout); <GRK>A { if (capToAcc) { fputs(aAcc, stdout); capToAcc=0; } else putchar('A'); } <GRK>B|V fputs("\\(*B", stdout); <GRK>G fputs("\\(*G", stdout); <GRK>D fputs("\\(*D", stdout); <GRK>E { if (capToAcc) { fputs(eAcc, stdout); capToAcc=0; } else putchar('E'); } <GRK>II|Ii|H { if (capToAcc) { fputs(hAcc, stdout); capToAcc=0; } else putchar('H'); } <GRK>TH|Th fputs("\\(*H", stdout); <GRK>I { if (capToAcc) { fputs(iAcc, stdout); capToAcc=0; } else putchar('I'); } <GRK>L fputs("\\(*L", stdout); <GRK>X fputs("\\(*C", stdout); <GRK>O { if (capToAcc) { fputs(oAcc, stdout); capToAcc=0; } else putchar('O'); } <GRK>P fputs("\\(*P", stdout); <GRK>R putchar('P'); <GRK>S fputs("\\(*S", stdout); <GRK>Y|U { if (capToAcc) { fputs(uAcc, stdout); capToAcc=0; } else fputs("\\(*U", stdout); } <GRK>F fputs("\\(*F", stdout); <GRK>CH|Ch putchar('X'); <GRK>PS|Ps fputs("\\(*Q", stdout); <GRK>W { if (capToAcc) { fputs(wAcc, stdout); capToAcc=0; } else fputs("\\(*W", stdout); } <GRK>'a fputs(aAcc, stdout); <GRK>'e fputs(eAcc, stdout); <GRK>'ii|'h fputs(hAcc, stdout); <GRK>'i fputs(iAcc, stdout); <GRK>'o fputs(oAcc, stdout); <GRK>'y|'u fputs(uAcc, stdout); <GRK>'w fputs(wAcc, stdout); <GRK>'A fputs(AAcc, stdout); <GRK>'E fputs(EAcc, stdout); <GRK>'II|'Ii|'H fputs(HAcc, stdout); <GRK>'I fputs(IAcc, stdout); <GRK>'O fputs(OAcc, stdout); <GRK>'Y|'U fputs(UAcc, stdout); <GRK>'W fputs(WAcc, stdout); <GRK>:i: fputs(iDial, stdout); <GRK>:y:|:u: fputs(uDial, stdout); <GRK>:'i: fputs(iDiAc, stdout); <GRK>:'y:|:'u: fputs(uDiAc, stdout); <GRK>:I: fputs(IDial, stdout); <GRK>:Y:|:U: fputs(UDial, stdout); -- Panos Economopoulos UUCP: {decvax,linus,ihnp4,uw-beaver,allegra,utzoo}!utcsri!panos CSNET: panos@toronto