Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site ucbvax.BERKELEY.EDU
Path: utzoo!watmath!clyde!burl!ulysses!ucbvax!seismo.css.gov!mcvax!ariadne!kateveni
From: kateveni@ariadne.UUCP
Newsgroups: net.nlang.greek
Subject: LCG Source (2nd message of 3)
Message-ID: <8511091509.AA08194@ariadne.UUCP>
Date: Sat, 9-Nov-85 11:53:27 EST
Article-I.D.: ariadne.8511091509.AA08194
Posted: Sat Nov 9 11:53:27 1985
Date-Received: Sun, 10-Nov-85 10:18:57 EST
Sender: daemon@ucbvax.BERKELEY.EDU
Organization: University of California at Berkeley
Lines: 933
# /bin/csh
#
# This shell-script will generate the LCG source directory,
# except for "lcg/lcg.l" -- the manual-source, which couldn't
# fit into the same mail-message (too big), and is coming
# in the next one.
# Put all this into a file -- say "tmp", then run:
# % csh tmp
# This will create a subdirectory "lcg" in the current
# directory, and will create the following files in it:
# lcg/Makefile
# lcg/code.guide.h
# lcg/code.itroff.h
# lcg/code.pc.h
# lcg/code.qtroff.h
# lcg/code.vtroff.h
# lcg/scan-bin.c
# lcg/scan-lcg.l
# lcg/scan-main.c
# After this, you can remove "tmp". Then, change directory
# to "lcg", edit and customize "Makefile" according to your
# preferences (redefine CODE, DESTDIR, MANDIR, OBJECTS, if
# you want), and then:
# % make
# NOTE: bin2hex, hex2bin, lcg2pchex, and pchex2lcg are not
# included here.
#
#
mkdir lcg
cat > lcg/Makefile << 'MARKER1'
CODE= vtroff
# CC= cc
CC= cc -O
DESTDIR= /usr/local
MANDIR= /usr/man/manl
VERSDIR= version2
# OBJECTS= lcg2$(CODE) $(CODE)2lcg \
# bin2hex hex2bin lcg2pchex pchex2lcg
OBJECTS= lcg2$(CODE)
all: $(OBJECTS)
install: $(OBJECTS) installman
-cp $(OBJECTS) $(DESTDIR)
lcg2$(CODE): code.$(CODE).h scan-lcg.c scan-main.o
ln code.$(CODE).h code.h
$(CC) -o lcg2$(CODE) scan-lcg.c scan-main.o -ll
rm code.h
$(CODE)2lcg: code.$(CODE).h scan-bin.c scan-main.o
ln code.$(CODE).h code.h
$(CC) -o $(CODE)2lcg scan-bin.c scan-main.o
rm code.h
scan-lcg.c: scan-lcg.l
lex scan-lcg.l
mv lex.yy.c scan-lcg.c
bin2hex:
$(CC) -o bin2hex bin2hex.c
hex2bin:
$(CC) -o hex2bin hex2bin.c
version:
mkdir $(VERSDIR)
cp Makefile README *.l *.h *.c *pchex* $(VERSDIR)
date > $(VERSDIR)/VersionDate
chmod 444 $(VERSDIR)/*
clean:
-rm scan-lcg.c *.o lcg2$(CODE)
installman:
-cp lcg.l $(MANDIR)
-chmod 644 $(MANDIR)/lcg.l
manual:
nroff -man lcg.l > lcg.manual
'MARKER1'
cat > lcg/code.guide.h << 'MARKER2'
/*
* GUIDE FOR A CODE-DEFINITION FILE
*/
/* mikra, atona: */
#define mALFA
#define mBHTA
#define mGAMA
#define mDELTA
#define mEPSILON
#define mZHTA
#define mHTA
#define mTHITA
#define mIOTA
#define mKAPA
#define mLAMDA
#define mMI
#define mNI
#define mXI
#define mOMIKRON
#define mPI
#define mRO
#define mSIGMAMESAIO
#define mSIGMATELIKO
#define mTAU
#define mYPSILON
#define mFI
#define mCHI
#define mPSI
#define mOMEGA
/* mikra, tonismena, dialytika (monotoniko): */
#define mALFAtonos
#define mEPSILONtonos
#define mHTAtonos
#define mIOTAtonos
#define mIOTAdialy
#define mIOTAdiTon
#define mOMIKRONtonos
#define mYPSILONtonos
#define mYPSILONdialy
#define mYPSILONdiTon
#define mOMEGAtonos
/* kefalaia, atona: */
#define kALFA
#define kBHTA
#define kGAMA
#define kDELTA
#define kEPSILON
#define kZHTA
#define kHTA
#define kTHITA
#define kIOTA
#define kKAPA
#define kLAMDA
#define kMI
#define kNI
#define kXI
#define kOMIKRON
#define kPI
#define kRO
#define kSIGMA
#define kTAU
#define kYPSILON
#define kFI
#define kCHI
#define kPSI
#define kOMEGA
/* kefalaia, tonismena, dialytika (monotoniko): */
#define kALFAtonos
#define kEPSILONtonos
#define kHTAtonos
#define kIOTAtonos
#define kIOTAdialy
#define kOMIKRONtonos
#define kYPSILONtonos
#define kYPSILONdialy
#define kOMEGAtonos
'MARKER2'
cat > lcg/code.itroff.h << 'MARKER3'
/*
* CODE-DEFINITION FOR itroff (Imagen Laser printer)
*/
/* mikra, atona: */
#define mALFA "\\(*a"
#define mBHTA "\\(*b"
#define mGAMA "\\(*g"
#define mDELTA "\\(*d"
#define mEPSILON "\\(*e"
#define mZHTA "\\(*z"
#define mHTA "\\(*y"
#define mTHITA "\\(*h"
#define mIOTA "\\(*i"
#define mKAPA "\\(*k"
#define mLAMDA "\\(*l"
#define mMI "\\(*m"
#define mNI "\\(*n"
#define mXI "\\(*c"
#define mOMIKRON "\\(*o"
#define mPI "\\(*p"
#define mRO "\\(*r"
#define mSIGMAMESAIO "\\(*s"
#define mSIGMATELIKO "s"
#define mTAU "\\(*t"
#define mYPSILON "\\(*u"
#define mFI "\\(*f"
#define mCHI "\\(*x"
#define mPSI "\\(*q"
#define mOMEGA "\\(*w"
/* mikra, tonismena, dialytika (monotoniko): */
#define mALFAtonos "\\h'0.15m'\\z\\'\\h'-0.15m'\\(*a"
#define mEPSILONtonos "\\h'0.08m'\\z\\'\\h'-0.08m'\\(*e"
#define mHTAtonos "\\h'0.10m'\\z\\'\\h'-0.10m'\\(*y"
#define mIOTAtonos "\\h'0.00m'\\z\\'\\h'-0.00m'\\(*i"
#define mIOTAdialy "\\v'-0.55m'\\h'0.00m'\\z.\\h'0.20m'\\z.\\h'-0.20m'\\v'0.55m'\\(*i"
#define mIOTAdiTon "\\v'-0.50m'\\h'-0.02m'\\z.\\h'0.25m'\\z.\\h'-0.20m'\\v'0.35m'\\z\\'\\h'-0.03m'\\v'0.15m'\\(*i"
#define mOMIKRONtonos "\\h'0.12m'\\z\\'\\h'-0.12m'\\(*o"
#define mYPSILONtonos "\\h'0.15m'\\z\\'\\h'-0.15m'\\(*u"
#define mYPSILONdialy "\\v'-0.55m'\\h'0.15m'\\z.\\h'0.20m'\\z.\\h'-0.35m'\\v'0.55m'\\(*u"
#define mYPSILONdiTon "\\v'-0.50m'\\h'00.15m'\\z.\\h'0.25m'\\z.\\h'-0.20m'\\v'0.35m'\\z\\'\\h'-0.20m'\\v'0.15m'\\(*u"
#define mOMEGAtonos "\\h'0.12m'\\z\\'\\h'-0.12m'\\(*w"
/* kefalaia, atona: */
#define kALFA "A"
#define kBHTA "B"
#define kGAMA "\\(*G"
#define kDELTA "\\(*D"
#define kEPSILON "E"
#define kZHTA "Z"
#define kHTA "H"
#define kTHITA "\\(*H"
#define kIOTA "I"
#define kKAPA "K"
#define kLAMDA "\\(*L"
#define kMI "M"
#define kNI "N"
#define kXI "\\(*C"
#define kOMIKRON "O"
#define kPI "\\(*P"
#define kRO "P"
#define kSIGMA "\\(*S"
#define kTAU "T"
#define kYPSILON "\\(*U"
#define kFI "\\(*F"
#define kCHI "X"
#define kPSI "\\(*Q"
#define kOMEGA "\\(*W"
/* kefalaia, tonismena, dialytika (monotoniko): */
#define kALFAtonos "\\'\\h'-0.40m'A"
#define kEPSILONtonos "\\'\\h'-0.12m'E"
#define kHTAtonos "\\'\\h'-0.10m'H"
#define kIOTAtonos "\\'\\h'-0.15m'I"
#define kIOTAdialy "\\v'-0.80m'\\h'-0.10m'\\z.\\h'0.30m'\\z.\\h'-0.20m'\\v'0.80m'\\(*I"
#define kOMIKRONtonos "\\'\\h'-0.22m'O"
#define kYPSILONtonos "\\'\\h'-0.16m'\\(*U"
#define kYPSILONdialy "\\v'-0.80m'\\h'00.10m'\\z.\\h'0.30m'\\z.\\h'-0.40m'\\v'0.80m'\\(*U"
#define kOMEGAtonos "\\'\\h'-0.20m'\\(*W"
'MARKER3'
cat > lcg/code.pc.h << 'MARKER4'
/*
* Code for the Greek characters on the IBM PC's
* (of the Cretan Computer Institute)
*/
/* mikra, atona: */
/* in OCTAL */
#define mALFA "\230"
#define mBHTA "\231"
#define mGAMA "\232"
#define mDELTA "\233"
#define mEPSILON "\234"
#define mZHTA "\235"
#define mHTA "\236"
#define mTHITA "\237"
#define mIOTA "\240"
#define mKAPA "\241"
#define mLAMDA "\242"
#define mMI "\243"
#define mNI "\244"
#define mXI "\245"
#define mOMIKRON "\246"
#define mPI "\247"
#define mRO "\250"
#define mSIGMAMESAIO "\251"
#define mSIGMATELIKO "\252"
#define mTAU "\253"
#define mYPSILON "\254"
#define mFI "\255"
#define mCHI "\256"
#define mPSI "\257"
#define mOMEGA "\340"
/* mikra, tonismena, dialytika (monotoniko): */
#define mALFAtonos "\341"
#define mEPSILONtonos "\342"
#define mHTAtonos "\343"
#define mIOTAtonos "\345"
#define mIOTAdialy "\344"
#define mIOTAdiTon "\344"
#define mOMIKRONtonos "\346"
#define mYPSILONtonos "\347"
#define mYPSILONdialy "\350"
#define mYPSILONdiTon "\350"
#define mOMEGAtonos "\351"
/* kefalaia, atona: */
#define kALFA "\200"
#define kBHTA "\201"
#define kGAMA "\202"
#define kDELTA "\203"
#define kEPSILON "\204"
#define kZHTA "\205"
#define kHTA "\206"
#define kTHITA "\207"
#define kIOTA "\210"
#define kKAPA "\211"
#define kLAMDA "\212"
#define kMI "\213"
#define kNI "\214"
#define kXI "\215"
#define kOMIKRON "\216"
#define kPI "\217"
#define kRO "\220"
#define kSIGMA "\221"
#define kTAU "\222"
#define kYPSILON "\223"
#define kFI "\224"
#define kCHI "\225"
#define kPSI "\226"
#define kOMEGA "\227"
/* kefalaia, tonismena, dialytika (monotoniko): */
#define kALFAtonos "'\200"
#define kEPSILONtonos "'\204"
#define kHTAtonos "'\206"
#define kIOTAtonos "'\210"
#define kIOTAdialy "\210"
#define kOMIKRONtonos "'\216"
#define kYPSILONtonos "'\223"
#define kYPSILONdialy "\223"
#define kOMEGAtonos "'\227"
'MARKER4'
cat > lcg/code.qtroff.h << 'MARKER5'
/*
* CODE-DEFINITION FOR qtroff (QMS "LASERGRAFIX" printer)
*/
/* mikra, atona: */
#define mALFA "\\(*a"
#define mBHTA "\\(*b"
#define mGAMA "\\(*g"
#define mDELTA "\\(*d"
#define mEPSILON "\\(*e"
#define mZHTA "\\(*z"
#define mHTA "\\(*y"
#define mTHITA "\\(*h"
#define mIOTA "\\(*i"
#define mKAPA "\\(*k"
#define mLAMDA "\\(*l"
#define mMI "\\(*m"
#define mNI "\\(*n"
#define mXI "\\(*c"
#define mOMIKRON "\\(*o"
#define mPI "\\(*p"
#define mRO "\\(*r"
#define mSIGMAMESAIO "\\(*s"
#define mSIGMATELIKO "\\(ts"
#define mTAU "\\(*t"
#define mYPSILON "\\(*u"
#define mFI "\\(*f"
#define mCHI "\\(*x"
#define mPSI "\\(*q"
#define mOMEGA "\\(*w"
/* mikra, tonismena, dialytika (monotoniko): */
#define mALFAtonos "\\v'-0.0m'\\h'0.32m'\\z\\'\\h'-0.32m'\\v'0.0m'\\(*a"
#define mEPSILONtonos "\\v'-0.0m'\\h'0.24m'\\z\\'\\h'-0.24m'\\v'0.0m'\\(*e"
#define mHTAtonos "\\v'-0.0m'\\h'0.30m'\\z\\'\\h'-0.30m'\\v'0.0m'\\(*y"
#define mIOTAtonos "\\v'-0.0m'\\h'0.12m'\\z\\'\\h'-0.12m'\\v'0.0m'\\(*i"
#define mIOTAdialy "\\v'-0.60m'\\h'0.00m'\\z.\\h'0.20m'\\z.\\h'-0.20m'\\v'0.60m'\\(*i"
#define mIOTAdiTon "\\v'-0.55m'\\h'-0.02m'\\z.\\h'0.25m'\\z.\\h'-0.05m'\\v'0.45m'\\z\\'\\h'-0.18m'\\v'0.10m'\\(*i"
#define mOMIKRONtonos "\\v'-0.0m'\\h'0.20m'\\z\\'\\h'-0.20m'\\v'0.0m'\\(*o"
#define mYPSILONtonos "\\v'-0.0m'\\h'0.28m'\\z\\'\\h'-0.28m'\\v'0.0m'\\(*u"
#define mYPSILONdialy "\\v'-0.60m'\\h'0.10m'\\z.\\h'0.20m'\\z.\\h'-0.30m'\\v'0.60m'\\(*u"
#define mYPSILONdiTon "\\v'-0.55m'\\h'00.10m'\\z.\\h'0.25m'\\z.\\h'-0.05m'\\v'0.45m'\\z\\'\\h'-0.30m'\\v'0.10m'\\(*u"
#define mOMEGAtonos "\\v'-0.0m'\\h'0.30m'\\z\\'\\h'-0.30m'\\v'0.0m'\\(*w"
/* kefalaia, atona: */
#define kALFA "A"
#define kBHTA "B"
#define kGAMA "\\(*G"
#define kDELTA "\\(*D"
#define kEPSILON "E"
#define kZHTA "Z"
#define kHTA "H"
#define kTHITA "\\(*H"
#define kIOTA "I"
#define kKAPA "K"
#define kLAMDA "\\(*L"
#define kMI "M"
#define kNI "N"
#define kXI "\\(*C"
#define kOMIKRON "O"
#define kPI "\\(*P"
#define kRO "P"
#define kSIGMA "\\(*S"
#define kTAU "T"
#define kYPSILON "\\(*U"
#define kFI "\\(*F"
#define kCHI "X"
#define kPSI "\\(*Q"
#define kOMEGA "\\(*W"
/* kefalaia, tonismena, dialytika (monotoniko): */
#define kALFAtonos "\\'\\h'-0.30m'A"
#define kEPSILONtonos "\\'\\h'-0.05m'E"
#define kHTAtonos "\\'\\h'-0.10m'H"
#define kIOTAtonos "\\'\\h'-0.10m'I"
#define kIOTAdialy "\\v'-0.85m'\\h'-0.08m'\\z.\\h'0.30m'\\z.\\h'-0.22m'\\v'0.85m'\\(*I"
#define kOMIKRONtonos "\\'\\h'-0.15m'O"
#define kYPSILONtonos "\\'\\h'-0.05m'\\(*U"
#define kYPSILONdialy "\\v'-0.85m'\\h'00.10m'\\z.\\h'0.30m'\\z.\\h'-0.40m'\\v'0.85m'\\(*U"
#define kOMEGAtonos "\\'\\h'-0.25m'\\(*W"
'MARKER5'
cat > lcg/code.vtroff.h << 'MARKER6'
/*
* CODE-DEFINITION FOR vtroff (Varian electrostatic plotters)
*/
/* mikra, atona: */
#define mALFA "\\(*a"
#define mBHTA "\\(*b"
#define mGAMA "\\(*g"
#define mDELTA "\\(*d"
#define mEPSILON "\\(*e"
#define mZHTA "\\(*z"
#define mHTA "\\(*y"
#define mTHITA "\\(*h"
#define mIOTA "\\(*i"
#define mKAPA "\\(*k"
#define mLAMDA "\\(*l"
#define mMI "\\(*m"
#define mNI "\\(*n"
#define mXI "\\(*c"
#define mOMIKRON "\\(*o"
#define mPI "\\(*p"
#define mRO "\\(*r"
#define mSIGMAMESAIO "\\(*s"
#define mSIGMATELIKO "\\(ts"
#define mTAU "\\(*t"
#define mYPSILON "\\(*u"
#define mFI "\\(*f"
#define mCHI "\\(*x"
#define mPSI "\\(*q"
#define mOMEGA "\\(*w"
/* mikra, tonismena, dialytika (monotoniko): */
#define mALFAtonos "\\v'-0.1m'\\h'0.32m'\\z\\'\\h'-0.32m'\\v'0.1m'\\(*a"
#define mEPSILONtonos "\\v'-0.1m'\\h'0.24m'\\z\\'\\h'-0.24m'\\v'0.1m'\\(*e"
#define mHTAtonos "\\v'-0.1m'\\h'0.30m'\\z\\'\\h'-0.30m'\\v'0.1m'\\(*y"
#define mIOTAtonos "\\v'-0.1m'\\h'0.12m'\\z\\'\\h'-0.12m'\\v'0.1m'\\(*i"
#define mIOTAdialy "\\v'-0.60m'\\h'0.00m'\\z.\\h'0.20m'\\z.\\h'-0.20m'\\v'0.60m'\\(*i"
#define mIOTAdiTon "\\v'-0.55m'\\h'-0.02m'\\z.\\h'0.25m'\\z.\\h'-0.10m'\\v'0.35m'\\z\\'\\h'-0.13m'\\v'0.20m'\\(*i"
#define mOMIKRONtonos "\\v'-0.1m'\\h'0.20m'\\z\\'\\h'-0.20m'\\v'0.1m'\\(*o"
#define mYPSILONtonos "\\v'-0.1m'\\h'0.28m'\\z\\'\\h'-0.28m'\\v'0.1m'\\(*u"
#define mYPSILONdialy "\\v'-0.60m'\\h'0.10m'\\z.\\h'0.20m'\\z.\\h'-0.30m'\\v'0.60m'\\(*u"
#define mYPSILONdiTon "\\v'-0.55m'\\h'00.10m'\\z.\\h'0.25m'\\z.\\h'-0.10m'\\v'0.35m'\\z\\'\\h'-0.25m'\\v'0.20m'\\(*u"
#define mOMEGAtonos "\\v'-0.1m'\\h'0.30m'\\z\\'\\h'-0.30m'\\v'0.1m'\\(*w"
/* kefalaia, atona: */
#define kALFA "A"
#define kBHTA "B"
#define kGAMA "\\(*G"
#define kDELTA "\\(*D"
#define kEPSILON "E"
#define kZHTA "Z"
#define kHTA "H"
#define kTHITA "\\(*H"
#define kIOTA "I"
#define kKAPA "K"
#define kLAMDA "\\(*L"
#define kMI "M"
#define kNI "N"
#define kXI "\\(*C"
#define kOMIKRON "O"
#define kPI "\\(*P"
#define kRO "P"
#define kSIGMA "\\(*S"
#define kTAU "T"
#define kYPSILON "\\(*U"
#define kFI "\\(*F"
#define kCHI "X"
#define kPSI "\\(*Q"
#define kOMEGA "\\(*W"
/* kefalaia, tonismena, dialytika (monotoniko): */
#define kALFAtonos "\\'\\h'-0.25m'A"
#define kEPSILONtonos "\\'\\h'-0.05m'E"
#define kHTAtonos "\\'\\h'-0.05m'H"
#define kIOTAtonos "\\'\\h'-0.05m'I"
#define kIOTAdialy "\\v'-0.85m'\\h'-0.11m'\\z.\\h'0.30m'\\z.\\h'-0.19m'\\v'0.85m'\\(*I"
#define kOMIKRONtonos "\\'\\h'-0.15m'O"
#define kYPSILONtonos "\\'\\h'-0.05m'\\(*U"
#define kYPSILONdialy "\\v'-0.85m'\\h'00.00m'\\z.\\h'0.30m'\\z.\\h'-0.30m'\\v'0.85m'\\(*U"
#define kOMEGAtonos "\\'\\h'-0.12m'\\(*W"
'MARKER6'
cat > lcg/scan-bin.c << 'MARKER7'
#include
#include "code.h"
#define MASK 255
#define TABLESIZE 256
/* the translation-table size */
#define FALSE 0
#define TRUE 1
/*
* Scans a "binary" text (a text where all 8 bits of the bytes may
* be used), and converts it to LCG format, on a byte-by-byte basis.
*/
struct translation
{ char mode; /* the mode in which the output steam must be
* in order for this translation to be accurate:
* 'L': in Latin mode
* 'G': in Greek mode
* 'A': any mode
*/
char nxtSP; /* BOOLEAN: when set, it means that the next
* byte on the input stream can be translated
* into its "special" translation, trSP (below)
*/
char *tr; /* the string into which the input byte must be
* translated; if NULL, then NO translation must
* be done (output=input)
*/
char *trSP; /* "special" translation of the input byte: when
* the last byte on the input stream had its
* nxtSP set, and when this field is NOT NULL,
* then this special translation can be used,
* instead of the normal one
*/
} ;
struct translation table[TABLESIZE]; /* the translation-table */
yylex() /* we use the same main program as the opposite filter
* does (file: scan-main.c), and thus we call our main
* routine "yylex", even though we do NOT use the LEX
* scanner-generator */
{ int i;
char *mH, *mI, *mIt, *mO, *kH, *kI, *kT;
struct translation *mh, *mi, *mit, *mo, *kh, *ki, *kt;
char curMode; /* the current mode of the outp. str. */
struct translation *t,
*prevt; /* the translation entry for the
* previous (last) input byte */
init(); /* initialize the translation table */
mH = mHTA ; /* pointers to character (strings) */
mI = mIOTA ;
mIt= mIOTAtonos ;
mO = mOMIKRON ;
kH = kHTA ;
kI = kIOTA ;
kT = kTAU ;
mh = &table[*mH&MASK] ; /* pointers to translation entries */
mi = &table[*mI&MASK] ;
mit= &table[*mIt&MASK];
mo = &table[*mO&MASK] ;
kh = &table[*kH&MASK] ;
ki = &table[*kI&MASK] ;
kt = &table[*kT&MASK] ;
curMode = 'L';
prevt = &table[0] ;
do
{ while ( (i=getchar()) != EOF )
{ i = i&MASK ;
if ( i<0 || i>=TABLESIZE ) i=0; /* protect from off-bounds */
t = &table[i] ; /* translate */
if ( t->mode != curMode && t->mode != 'A' )
{ printf("\\f%c", t->mode); /* change mode of outp-str.*/
curMode = t->mode ;
}
if (t->tr==NULL) putchar(i); /* no translation */
else if ( t==mh && (prevt==mi || prevt==mit || prevt==mo))
putchar('h');
else if ( t==kh && prevt!=kt ) putchar('H');
else if ( t==mi && prevt==mi ) fputs("\\fGi", stdout);
else if ( t==ki && prevt==ki ) fputs("\\fGI", stdout);
else if (prevt->nxtSP && t->trSP!=NULL) fputs(t->trSP, stdout);
else fputs(t->tr, stdout);
prevt=t;
}
}
while (!yywrap()); /* remember that we use the main program from
* file: scan-main.c; "yywrap" is there */
}
init() /* initialize the translation-table */
{ int i;
for ( i=0 ; imode = md ;
t->nxtSP = nSP ;
t->tr = ttr ;
t->trSP = ttrSP ;
}
'MARKER7'
cat > lcg/scan-lcg.l << 'MARKER8'
%START LAT GRK
%{
#include "code.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 */
}
\\fG |
^\.("ft ")?G\n { prevMo='L'; BEGIN GRK; }
\\fG |
^\.("ft ")?G\n { prevMo='G'; }
\\fL |
^\.("ft ")?L\n { prevMo='L'; }
\\f[RBI] |
^\.("ft ")?[RBI]\n { prevMo='L'; ECHO; }
\\fL |
^\.("ft ")?L\n { prevMo='G'; BEGIN LAT; }
\\f[RBI] |
^\.("ft ")?[RBI]\n { prevMo='G'; BEGIN LAT; ECHO;}
\\fP |
^\.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) */
}
\\fP |
^\.ft(" P")?\n { if (prevMo=='L') BEGIN LAT;
/* restore ONLY the previous mode (LAT/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 */
}
a fputs(mALFA, stdout);
v|b fputs(mBHTA, stdout);
g fputs(mGAMA, stdout);
d fputs(mDELTA, stdout);
e fputs(mEPSILON, stdout);
z fputs(mZHTA, stdout);
ii|h fputs(mHTA, stdout);
th fputs(mTHITA, stdout);
i fputs(mIOTA, stdout);
k fputs(mKAPA, stdout);
l fputs(mLAMDA, stdout);
m fputs(mMI, stdout);
n fputs(mNI, stdout);
x fputs(mXI, stdout);
o fputs(mOMIKRON, stdout);
p fputs(mPI, stdout);
r fputs(mRO, stdout);
s/[a-zAEHIOYUW'] fputs(mSIGMAMESAIO, stdout);
s/(''|[^a-zAEHIOYUW']) fputs(mSIGMATELIKO, stdout);
t fputs(mTAU, stdout);
y|u fputs(mYPSILON, stdout);
f fputs(mFI, stdout);
ch fputs(mCHI, stdout);
ps fputs(mPSI, stdout);
w fputs(mOMEGA, stdout);
A { if (capToAcc) fputs(mALFAtonos, stdout);
else fputs(kALFA, stdout);
capToAcc=0;
}
B|V fputs(kBHTA, stdout);
G fputs(kGAMA, stdout);
D fputs(kDELTA, stdout);
E { if (capToAcc) fputs(mEPSILONtonos, stdout);
else fputs(kEPSILON, stdout);
capToAcc=0;
}
Z fputs(kZHTA, stdout);
II|Ii|H { if (capToAcc) fputs(mHTAtonos, stdout);
else fputs(kHTA, stdout);
capToAcc=0;
}
TH|Th fputs(kTHITA, stdout);
I { if (capToAcc) fputs(mIOTAtonos, stdout);
else fputs(kIOTA, stdout);
capToAcc=0;
}
K fputs(kKAPA, stdout);
L fputs(kLAMDA, stdout);
M fputs(kMI, stdout);
N fputs(kNI, stdout);
X fputs(kXI, stdout);
O { if (capToAcc) fputs(mOMIKRONtonos, stdout);
else fputs(kOMIKRON, stdout);
capToAcc=0;
}
P fputs(kPI, stdout);
R fputs(kRO, stdout);
S fputs(kSIGMA, stdout);
T fputs(kTAU, stdout);
Y|U { if (capToAcc) fputs(mYPSILONtonos, stdout);
else fputs(kYPSILON, stdout);
capToAcc=0;
}
F fputs(kFI, stdout);
CH|Ch fputs(kCHI, stdout);
PS|Ps fputs(kPSI, stdout);
W { if (capToAcc) fputs(mOMEGAtonos, stdout);
else fputs(kOMEGA, stdout);
capToAcc=0;
}
'a fputs(mALFAtonos, stdout);
'e fputs(mEPSILONtonos, stdout);
'ii|'h fputs(mHTAtonos, stdout);
'i fputs(mIOTAtonos, stdout);
'o fputs(mOMIKRONtonos, stdout);
'y|'u fputs(mYPSILONtonos, stdout);
'w fputs(mOMEGAtonos, stdout);
'A fputs(kALFAtonos, stdout);
'E fputs(kEPSILONtonos, stdout);
'II|'Ii|'H fputs(kHTAtonos, stdout);
'I fputs(kIOTAtonos, stdout);
'O fputs(kOMIKRONtonos, stdout);
'Y|'U fputs(kYPSILONtonos, stdout);
'W fputs(kOMEGAtonos, stdout);
:i: fputs(mIOTAdialy, stdout);
:y:|:u: fputs(mYPSILONdialy, stdout);
:'i: fputs(mIOTAdiTon, stdout);
:'y:|:'u: fputs(mYPSILONdiTon, stdout);
:I: fputs(kIOTAdialy, stdout);
:Y:|:U: fputs(kYPSILONdialy, stdout);
'MARKER8'
cat > lcg/scan-main.c << 'MARKER9'
#include
int curarg, /* index into argv[] for argument (file) currently
* under processing */
maxarg; /* the maximum value that curarg can take */
char **g_argv; /* global (external) version of argv[] */
main(argc, argv)
int argc; char *argv[];
{ int nofiles; /* boolean flag */
curarg = 0 ; /* this is BEFORE processing of the first
* argument (file) has begun */
maxarg = argc-1 ;
g_argv = argv ;
nofiles = yywrap() ; /* open first argument (file), or do
* nothing if no arguments exist */
if ( maxarg>0 && nofiles )
{ fprintf(stderr, "grk: all arguments were bad -- quit.\n");
exit(1);
}
yylex() ; /* call the LEX-scanner; IT will call yywrap()
* when each end-of-file is reached */
}
yywrap()
{
if ( curarg++ < maxarg ) /* more file(s) to be opened */
{ if ( freopen(g_argv[curarg], "r", stdin) != NULL )
/* default LEX-scanner reads from standard-
* input; thus, we "re-open" stdin -- the
* alternative would be to redefine yyin */
return(0); /* successful opening -- else: */
fprintf(stderr, "grk: can't open %s -- discarded it.\n",
g_argv[curarg] );
return(yywrap()); /* try to open the next one */
}
else /* no more files to be opened */
return(1);
}
'MARKER9'