[net.nlang.greek] LCG Source

kateveni@ariadne.UUCP (11/09/85)

# /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 <stdio.h>
#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 ; i<TABLESIZE ; i++ )
     { table[i].mode = 'A' ;
       table[i].nxtSP= FALSE ;
       table[i].tr   = NULL ;
       table[i].trSP = NULL ;
     }

  for ( i='a' ; i<='z' ; i++ )
       table[i].mode = 'L' ;
  for ( i='A' ; i<='Z' ; i++ )
       table[i].mode = 'L' ;


  initEntry( mIOTAdiTon,	'G',  FALSE,   ":'i:",	NULL);
  initEntry( mYPSILONdiTon,	'G',  FALSE,   ":'y:",	NULL);
  initEntry( mIOTAdialy,	'G',  FALSE,   ":i:",	NULL);
  initEntry( mYPSILONdialy,	'G',  FALSE,   ":y:",	NULL);
  initEntry( kIOTAdialy,	'G',  FALSE,   ":I:",	NULL);
  initEntry( kYPSILONdialy,	'G',  FALSE,   ":Y:",	NULL);

	/* The letters with "dialytika" are here, in front of all
	 * others, some of them do not exist on some machines (e.g.
	 * IBM-pc).  This way, their input codes, which coincide
	 * with the codes of the simple letters, will be overwritten
	 * by those other simpler letters.
	 */

  initEntry( mALFA,		'G',  TRUE,    "a",	NULL);
  initEntry( mBHTA,		'G',  TRUE,    "b",	NULL);
  initEntry( mGAMA,		'G',  TRUE,    "g",	NULL);
  initEntry( mDELTA,		'G',  TRUE,    "d",	NULL);
  initEntry( mEPSILON,		'G',  TRUE,    "e",	NULL);
  initEntry( mZHTA,		'G',  TRUE,    "z",	NULL);
  initEntry( mHTA,		'G',  TRUE,    "ii",	NULL);
  initEntry( mTHITA,		'G',  TRUE,    "th",	NULL);
  initEntry( mIOTA,		'G',  TRUE,    "i",	NULL);
  initEntry( mKAPA,		'G',  TRUE,    "k",	NULL);
  initEntry( mLAMDA,		'G',  TRUE,    "l",	NULL);
  initEntry( mMI,		'G',  TRUE,    "m",	NULL);
  initEntry( mNI,		'G',  TRUE,    "n",	NULL);
  initEntry( mXI,		'G',  TRUE,    "x",	NULL);
  initEntry( mOMIKRON,		'G',  TRUE,    "o",	NULL);
  initEntry( mPI,		'G',  TRUE,    "p",	NULL);
  initEntry( mRO,		'G',  TRUE,    "r",	NULL);
  initEntry( mSIGMAMESAIO,	'G',  TRUE,    "s",	NULL);
  initEntry( mSIGMATELIKO,	'G',  TRUE,    "s",	NULL);
  initEntry( mTAU,		'G',  TRUE,    "t",	NULL);
  initEntry( mYPSILON,		'G',  TRUE,    "y",	NULL);
  initEntry( mFI,		'G',  TRUE,    "f",	NULL);
  initEntry( mCHI,		'G',  TRUE,    "ch",	NULL);
  initEntry( mPSI,		'G',  TRUE,    "ps",	NULL);
  initEntry( mOMEGA,		'G',  TRUE,    "w",	NULL);

  initEntry( kALFA,		'G',  FALSE,   "A",	NULL);
  initEntry( kBHTA,		'G',  FALSE,   "B",	NULL);
  initEntry( kGAMA,		'G',  FALSE,   "G",	NULL);
  initEntry( kDELTA,		'G',  FALSE,   "D",	NULL);
  initEntry( kEPSILON,		'G',  FALSE,   "E",	NULL);
  initEntry( kZHTA,		'G',  FALSE,   "Z",	NULL);
  initEntry( kHTA,		'G',  FALSE,   "II",	NULL);
  initEntry( kTHITA,		'G',  FALSE,   "TH",	NULL);
  initEntry( kIOTA,		'G',  FALSE,   "I",	NULL);
  initEntry( kKAPA,		'G',  FALSE,   "K",	NULL);
  initEntry( kLAMDA,		'G',  FALSE,   "L",	NULL);
  initEntry( kMI,		'G',  FALSE,   "M",	NULL);
  initEntry( kNI,		'G',  FALSE,   "N",	NULL);
  initEntry( kXI,		'G',  FALSE,   "X",	NULL);
  initEntry( kOMIKRON,		'G',  FALSE,   "O",	NULL);
  initEntry( kPI,		'G',  FALSE,   "P",	NULL);
  initEntry( kRO,		'G',  FALSE,   "R",	NULL);
  initEntry( kSIGMA,		'G',  FALSE,   "S",	NULL);
  initEntry( kTAU,		'G',  FALSE,   "T",	NULL);
  initEntry( kYPSILON,		'G',  FALSE,   "Y",	NULL);
  initEntry( kFI,		'G',  FALSE,   "F",	NULL);
  initEntry( kCHI,		'G',  FALSE,   "CH",	NULL);
  initEntry( kPSI,		'G',  FALSE,   "PS",	NULL);
  initEntry( kOMEGA,		'G',  FALSE,   "W",	NULL);

  initEntry( mALFAtonos,	'G',  FALSE,   "'a",	"A" );
  initEntry( mEPSILONtonos,	'G',  FALSE,   "'e",	"E" );
  initEntry( mHTAtonos,		'G',  FALSE,   "'ii",	"II");
  initEntry( mIOTAtonos,	'G',  FALSE,   "'i",	"I" );
  initEntry( mOMIKRONtonos,	'G',  FALSE,   "'o",	"O" );
  initEntry( mYPSILONtonos,	'G',  FALSE,   "'y",	"Y" );
  initEntry( mOMEGAtonos,	'G',  FALSE,   "'w",	"W" );

  initEntry( kALFAtonos,	'G',  FALSE,   "'A",	NULL);
  initEntry( kEPSILONtonos,	'G',  FALSE,   "'E",	NULL);
  initEntry( kHTAtonos,		'G',  FALSE,   "'II",	NULL);
  initEntry( kIOTAtonos,	'G',  FALSE,   "'I",	NULL);
  initEntry( kOMIKRONtonos,	'G',  FALSE,   "'O",	NULL);
  initEntry( kYPSILONtonos,	'G',  FALSE,   "'Y",	NULL);
  initEntry( kOMEGAtonos,	'G',  FALSE,   "'W",	NULL);

  initEntry( "'",		'A',  FALSE,   NULL,	NULL);

}


initEntry(s, md, nSP, ttr, ttrSP)
char *s, md, nSP, *ttr, *ttrSP;
{ struct translation *t;
  int i;

  /* printf("initEntry: %d, %c, %d, %s, %s.\n", *s&MASK, md, nSP, ttr, ttrSP); */
  t = &table[*s&MASK] ;
  t->mode = 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 */
		}

<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(mALFA,	stdout);
<GRK>v|b	fputs(mBHTA,	stdout);
<GRK>g		fputs(mGAMA,	stdout);
<GRK>d		fputs(mDELTA,	stdout);
<GRK>e		fputs(mEPSILON,	stdout);
<GRK>z		fputs(mZHTA,	stdout);
<GRK>ii|h	fputs(mHTA,	stdout);
<GRK>th		fputs(mTHITA,	stdout);
<GRK>i		fputs(mIOTA,	stdout);
<GRK>k		fputs(mKAPA,	stdout);
<GRK>l		fputs(mLAMDA,	stdout);
<GRK>m		fputs(mMI,	stdout);
<GRK>n		fputs(mNI,	stdout);
<GRK>x		fputs(mXI,	stdout);
<GRK>o		fputs(mOMIKRON,	stdout);
<GRK>p		fputs(mPI,	stdout);
<GRK>r		fputs(mRO,	stdout);
<GRK>s/[a-zAEHIOYUW']		fputs(mSIGMAMESAIO,	stdout);
<GRK>s/(''|[^a-zAEHIOYUW'])	fputs(mSIGMATELIKO,	stdout);
<GRK>t		fputs(mTAU,	stdout);
<GRK>y|u	fputs(mYPSILON,	stdout);
<GRK>f		fputs(mFI,	stdout);
<GRK>ch		fputs(mCHI,	stdout);
<GRK>ps		fputs(mPSI,	stdout);
<GRK>w		fputs(mOMEGA,	stdout);


<GRK>A		{ if (capToAcc)	fputs(mALFAtonos,	stdout);
			else	fputs(kALFA,		stdout);
		  capToAcc=0;
		}
<GRK>B|V	fputs(kBHTA,	stdout);
<GRK>G		fputs(kGAMA,	stdout);
<GRK>D		fputs(kDELTA,	stdout);
<GRK>E		{ if (capToAcc)	fputs(mEPSILONtonos,	stdout);
			else	fputs(kEPSILON,		stdout);
		  capToAcc=0;
		}
<GRK>Z		fputs(kZHTA,	stdout);
<GRK>II|Ii|H	{ if (capToAcc)	fputs(mHTAtonos,	stdout);
			else	fputs(kHTA,		stdout);
		  capToAcc=0;
		}
<GRK>TH|Th	fputs(kTHITA,	stdout);
<GRK>I		{ if (capToAcc)	fputs(mIOTAtonos,	stdout);
			else	fputs(kIOTA,		stdout);
		  capToAcc=0;
		}
<GRK>K		fputs(kKAPA,	stdout);
<GRK>L		fputs(kLAMDA,	stdout);
<GRK>M		fputs(kMI,	stdout);
<GRK>N		fputs(kNI,	stdout);
<GRK>X		fputs(kXI,	stdout);
<GRK>O		{ if (capToAcc)	fputs(mOMIKRONtonos,	stdout);
			else	fputs(kOMIKRON,		stdout);
		  capToAcc=0;
		}
<GRK>P		fputs(kPI,	stdout);
<GRK>R		fputs(kRO,	stdout);
<GRK>S		fputs(kSIGMA,	stdout);
<GRK>T		fputs(kTAU,	stdout);
<GRK>Y|U	{ if (capToAcc)	fputs(mYPSILONtonos,	stdout);
			else	fputs(kYPSILON,		stdout);
		  capToAcc=0;
		}
<GRK>F		fputs(kFI,	stdout);
<GRK>CH|Ch	fputs(kCHI,	stdout);
<GRK>PS|Ps	fputs(kPSI,	stdout);
<GRK>W		{ if (capToAcc)	fputs(mOMEGAtonos,	stdout);
			else	fputs(kOMEGA,		stdout);
		  capToAcc=0;
		}


<GRK>'a		fputs(mALFAtonos,	stdout);
<GRK>'e		fputs(mEPSILONtonos,	stdout);
<GRK>'ii|'h	fputs(mHTAtonos,	stdout);
<GRK>'i		fputs(mIOTAtonos,	stdout);
<GRK>'o		fputs(mOMIKRONtonos,	stdout);
<GRK>'y|'u	fputs(mYPSILONtonos,	stdout);
<GRK>'w		fputs(mOMEGAtonos,	stdout);

<GRK>'A		fputs(kALFAtonos,	stdout);
<GRK>'E		fputs(kEPSILONtonos,	stdout);
<GRK>'II|'Ii|'H	fputs(kHTAtonos,	stdout);
<GRK>'I		fputs(kIOTAtonos,	stdout);
<GRK>'O		fputs(kOMIKRONtonos,	stdout);
<GRK>'Y|'U	fputs(kYPSILONtonos,	stdout);
<GRK>'W		fputs(kOMEGAtonos,	stdout);

<GRK>:i:	fputs(mIOTAdialy,	stdout);
<GRK>:y:|:u:	fputs(mYPSILONdialy,	stdout);
<GRK>:'i:	fputs(mIOTAdiTon,	stdout);
<GRK>:'y:|:'u:	fputs(mYPSILONdiTon,	stdout);
<GRK>:I:	fputs(kIOTAdialy,	stdout);
<GRK>:Y:|:U:	fputs(kYPSILONdialy,	stdout);
'MARKER8'
cat > lcg/scan-main.c << 'MARKER9'
#include <stdio.h>

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'