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'