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