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'