summaryrefslogtreecommitdiff
path: root/obsolete/systems/sisisi
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /obsolete/systems/sisisi
Initial commit
Diffstat (limited to 'obsolete/systems/sisisi')
-rw-r--r--obsolete/systems/sisisi/msdos/beispiel.sibin0 -> 34304 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/demo.binbin0 -> 1140 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/demo1.sibin0 -> 14699 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/hilfe.menbin0 -> 24360 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/hilfe.txt421
-rw-r--r--obsolete/systems/sisisi/msdos/lexikon.bat4
-rw-r--r--obsolete/systems/sisisi/msdos/manual.txt29
-rw-r--r--obsolete/systems/sisisi/msdos/neuwort.tex0
-rw-r--r--obsolete/systems/sisisi/msdos/schiffe.sibin0 -> 290 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/sidemo.bat7
-rw-r--r--obsolete/systems/sisisi/msdos/sisisi.bat4
-rw-r--r--obsolete/systems/sisisi/msdos/sisisi.sys28
-rw-r--r--obsolete/systems/sisisi/msdos/worttab.hasbin0 -> 62464 bytes
-rw-r--r--obsolete/systems/sisisi/msdos/worttab.htx5580
-rw-r--r--obsolete/systems/sisisi/si3win/si3win.txt24
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch71
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch33
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch32
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty432
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex1372
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex1232
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch71
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch33
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch32
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty432
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex1372
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex1233
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile31
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux37
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvibin0 -> 46448 bytes
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt0
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig79
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps188
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex7
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig61
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps133
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex7
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex16
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log180
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem224
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps2560
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex678
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc10
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex1
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex48
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/htx2tex.doc27
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/sihyphen.tex5577
-rw-r--r--obsolete/systems/sisisi/unix/COMMON/worttab.htx5576
-rw-r--r--obsolete/systems/sisisi/unix/Lexikon/neuwort.tex0
-rw-r--r--obsolete/systems/sisisi/unix/Lexikon/sisisi.sys27
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE184
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST20
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/Makefile200
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT155
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h890
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch1877
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/install59
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/makefile280
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gzbin0 -> 323486 bytes
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch2827
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch687
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c2492
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/texd.h485
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c334
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h93
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/install205
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/install.other204
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gzbin0 -> 324022 bytes
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch2834
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch1937
-rw-r--r--obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other1964
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST20
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/install52
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile201
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h927
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert12
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch1878
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile280
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines5
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gzbin0 -> 328845 bytes
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c498
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch1410
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c2013
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c2152
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h532
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c334
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h93
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc1347
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch2827
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/install266
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/install.other263
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gzbin0 -> 329454 bytes
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch1431
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch2834
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch1938
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other1965
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch69
-rw-r--r--obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch133
-rw-r--r--obsolete/systems/sisisi/unix/liesmich.txt139
99 files changed, 69255 insertions, 0 deletions
diff --git a/obsolete/systems/sisisi/msdos/beispiel.si b/obsolete/systems/sisisi/msdos/beispiel.si
new file mode 100644
index 0000000000..a4e182d092
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/beispiel.si
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/demo.bin b/obsolete/systems/sisisi/msdos/demo.bin
new file mode 100644
index 0000000000..0e566b2b6c
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/demo.bin
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/demo1.si b/obsolete/systems/sisisi/msdos/demo1.si
new file mode 100644
index 0000000000..a596cd1bce
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/demo1.si
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/hilfe.men b/obsolete/systems/sisisi/msdos/hilfe.men
new file mode 100644
index 0000000000..45c05cf38a
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/hilfe.men
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/hilfe.txt b/obsolete/systems/sisisi/msdos/hilfe.txt
new file mode 100644
index 0000000000..d3e3d56d63
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/hilfe.txt
@@ -0,0 +1,421 @@
+00 03 05 08 28 00 99 99 šbersicht#
+ Funktionstasten-Belegung
+ Bearbeitung von Dokumenten
+ Seitenformat des Dokuments
+ Rechtschreibprfung
+ Neues Dokument
+ Abspeichern von Dokumenten
+ Zwischen- / Fremddatei
+ Drucken von Dokumenten
+01 03 05 12 29 00 99 02 Funktionstasten-Belegung#
+ F1: ¿
+ SHIFT-F1: Ã Hilfe
+ ALT-F1: Ù
+ F2: l”sche Zeilenrest
+ SHIFT-F2: l”sche Absatz
+ ALT-F2: l”sche Fuánote
+ F3: weiter Suchen
+ SHIFT-F3: Suchen
+ ALT-F3: Suchargument ?
+ F4: weiter Ersetzen
+ SHIFT-F4: Ersetzen
+ ALT-F4: Ersetzargument ?
+02 03 05 15 35 00 01 03 Funktionstasten-Belegung#
+ F6: Seitenumbruch
+ SHIFT-F6: bedingter Seitenumb.
+ ALT-F6: Seitenumb. aufheben
+ F7: Kopftext
+ SHIFT-F7: Fuátext
+ ALT-F7: Seite suchen
+ F8: Absatz markieren
+ SHIFT-F8: Absatz kopieren
+ ALT-F8: Markierung entfernen
+ F9: Absatz formatieren
+ SHIFT-F9: Absatzformat „ndern
+ ALT-F9: Absatzfolge markieren
+ F10: Absatz zentrieren
+ SHIFT-F10: -----
+ ALT-F10: Zwischendatei einfgen
+03 03 05 14 33 00 02 32 Funktionstasten-Belegung#
+ ALT-T: Abtrennen hinter diesem
+ Buchstaben m”glich
+ ALT-U: Umbruch hinter diesem
+ Buchstaben m”glich
+ ALT-B: geschtztes Blank
+ ALT-C: Zeichen einsaugen
+ ALT-W: Wort einsaugen
+ ALT-E: Staubsaugerinhalt an der
+ Cursorposition einsetzen
+ ALT-L: Staubsauger l”schen
+ ALT-R: Rechtschreibprfung ohne
+ Absatzoptimierung
+ ALT-A: Trenninformation
+ ALT-K: Knuth-Formatierung
+04 03 05 13 34 00 99 99 Dokument bearbeiten#
+ Funktionstasten-Belegung
+ Cursorbewegung
+ Insert-Taste (Ins)
+ L”schen von Text
+ Text suchen und ersetzen
+ Abs„tze kopieren
+ Kopf- und Fuátext
+ Bildbearbeitung
+ Editieren von Fuánoten
+ Unterstreichen/Fettdruck
+ Seitenumbruch
+ Zentrieren von Abs„tzen
+ Randausgleich/Absatzformat
+05 03 05 12 35 04 99 99 Cursorbewegung#
+ - 4 Cursorbewegungstasten
+ - Tab bzw. SHIFT-Tab:
+ rechter bzw. linker Rand
+ - PgUp: vorherige Bildschirmseite
+ - PgDn: n„chste Bildschirmseite
+ - Home: Dokumentanfang
+ - End: Dokumentende
+ - Ctrl-Cursor links bzw. rechts:
+ vorheriges bzw. n„chstes Wort
+ - ALT-G: Wortende
+ - ALT-F7: Anfang einer bestimmten
+ Seite
+06 03 05 09 33 04 99 99 L”schen von Text#
+ Del-Taste: l”scht das Zeichen
+ unter dem Cursor
+
+ "<--"-Taste: l”scht das Zeichen
+ (Backspace) links vom Cursor
+
+ F2: l”scht Rest der Zeile
+
+ SHIFT-F2: l”scht Absatz
+07 03 05 12 34 04 99 99 Insert-Taste (Ins)#
+ - Ins-Taste: umschalten zwischen
+ folgenden 2 Modi:
+
+ 1. EINFšGEMODUS:
+ Das Zeichen wird an der
+ aktuellen Cursorposition
+ eingefgt
+
+ 2. ERSETZMODUS:
+ Das Zeichen berschreibt
+ an der aktuellen Cursor-
+ position das alte Zeichen
+08 03 05 15 38 04 99 99 Text suchen und ersetzen#
+ SHIFT-F3: Suchen nach bestimmtem
+ Textteil
+ F3: Suchen nach n„chstem Vorkommen
+ dieses Textteils
+ ALT-F3: Anzeigen des letzten
+ Sucharguments
+
+ SHIFT-F4: Ersetzen eines bestimmten
+ Textteils durch anderen
+ F4: Ersetzen des n„chsten Vorkommens
+ dieses Textteils
+ ALT-F4: Anzeigen des letzten
+ Such- und Ersetzarguments
+
+ ALT-F7: Suchen nach bestimmter Seite
+09 03 05 13 40 04 99 10 Abs„tze kopieren#
+ F8:
+ Markieren des Absatzes, in dem der
+ Cursor steht. Beliebig viele Abs„tze
+ k”nnen markiert werden. Diese werden
+ am Bildschirm invers oder farbig
+ dargestellt.
+
+ SHIFT-F8:
+ Alle markierten Abs„tze werden hinter
+ den Absatz, in dem der Cursor gerade
+ steht, kopiert. Die Reihenfolge ent-
+ spricht der zeitlichen Reihenfolge
+ beim Markieren.
+10 03 05 12 39 04 09 11 Abs„tze kopieren#
+ ALT-F8:
+ Aufheben aller Markierungen
+ ALT-F9:
+ Markieren aller Abs„tze zwischen zu-
+ letzt markiertem und dem, in dem der
+ Cursor steht. War noch kein Absatz
+ markiert, wird am Dokumentanfang be-
+ gonnen. Steht der Cursor vor dem zu-
+ letzt markierten Absatz, wird "rck-
+ w„rts" markiert, d.h. die Kopie ent-
+ h„lt nachher die Abs„tze in umge-
+ kehrter Reihenfolge.
+11 03 05 06 39 04 10 99 Abs„tze kopieren#
+ Die 4 Funktionen (F8,SHIFT-F8,ALT-F8,
+ ALT-F9) helfen auch (in Verbindung
+ mit der Funktion "l”sche Absatz")
+ beim Umordnen eines Dokuments.
+ Weitere M”glichkeiten hierfr bietet
+ die "Zwischendatei".
+12 03 05 08 36 04 99 13 Kopf- und Fuátext#
+ Zu jedem Absatz kann ein Kopf- und
+ Fuátext angegeben werden.
+ F7: fr Kopftext
+ SHIFT-F7: fr Fuátext
+
+ $ tippt man an der Stelle im Kopf-
+ bzw. Fuátext, an der die Seiten-
+ nummer stehen soll.
+13 03 05 14 40 04 12 99 Kopf- und Fuátext#
+ Kopf- bzw. Fuátext kann positioniert
+ werden, indem man hinter $ eines der
+ folgenden Steuerzeichen angibt:
+ r/R: rechtsbndig
+ l/L: linksbndig
+ m/M: zentriert
+ a/A: abwechselnd links und rechts,
+ gerade Seitennummern rechts
+
+ Kopf- bzw. Fuátext einer Seite richtet
+ sich nach dem letzten Absatz dieser
+ Seite. Fehlt bei diesem Absatz der
+ Kopf- bzw. Fuátext, so wird der letzte
+ vorher angegebene genommen.
+14 03 05 13 40 04 99 99 Unterstreichen/Fettdruck#
+ F5:
+ Das Zeichen, an dem der Cursor steht,
+ wird markiert und der Cursor wird um
+ eine Position weiterbewegt.
+ ALT-F5:
+ Hebt die Markierung eines Zeichens
+ wieder auf.
+
+ Markierter Text wird am Bildschirm in-
+ vers dargestellt. Beim Drucken des
+ Textes wird gew„hlt, ob markierte Zei-
+ chen unterstrichen oder fett gedruckt
+ werden.
+15 03 05 13 40 04 99 99 Seitenumbruch#
+ F6: Erzeugt unbedingten Seitenumbruch
+ vor dem aktuellen Absatz
+ SHIFT-F6:
+ Erzeugt bedingten Seitenumbruch vor
+ dem aktuellen Absatz. Es erfolgt ein
+ Seitenumbruch, wenn auf der aktuellen
+ Seite weniger als x (default: 2) Zei-
+ len Platz haben.
+ Nach der Zeilenanzahl x wird gefragt.
+ ALT-F6:
+ Beseitigt vorhandenen Seitenumbruch.
+ Der Cursor muá im ersten Absatz der
+ folgenden Seite stehen.
+16 03 05 05 35 04 99 99 Zentrieren von Abs„tzen#
+ F10: Zentriert Absatz, in dem der
+ Cursor steht.
+ Bei jeder Žnderung in diesem
+ Absatz wird die Zentrierung
+ wieder aufgehoben.
+17 03 05 14 38 04 99 99 Randausgleich/Absatzformat#
+ SHIFT-F9: Aufruf eines Mens zur
+ Žnderung des Hauptformats.
+ F9: Neuanordnung des akuellen Ab-
+ satzes nach dem Hauptformat.
+ Das beim Erstellen verwendete
+ Format wird verdr„ngt.
+
+ Folgende 4 Angaben beschreiben das
+ Format eines Absatzes:
+
+ - L: linker Rand
+ - R: rechter Rand
+ - E: Einrcken seiner ersten Zeile
+ - Randausgleich EIN/AUS
+18 03 05 12 38 00 99 19 Rechtschreibprfung#
+ Es gibt zwei M”glichkeiten den Text
+ einer Rechtschreibprfung zu unter-
+ ziehen.
+
+ 1. Rechtschreibprfung mit
+ Optimierung der Absatzanordnung:
+
+ Aktivierung erfolgt vom Hauptmenu.
+ Wahlm”glichkeit, ob alle oder nur
+ modifizierte Abs„tze bearbeitet
+ und ob mehrdeutige W”rter ange-
+ zeigt werden sollen.
+19 03 05 15 39 00 18 20 Rechtschreibprfung#
+ 2. Rechtschreibprfung ohne
+ Optimierung der Absatzanordnung:
+
+ Aktivierung erfolgt aus dem
+ Bearbeitungsmodus (ALT-R).
+ ALT-R:
+ Auruf eines Mens, in dem Sie die-
+ selbe Wahlm”glichkeit wie bei Recht-
+ schreibprfung mit Optimierung der
+ Absatzanordnung haben. Zus„tzlich
+ kann festgelegt werden, ob mit dem
+ aktuellen Wort oder Absatz begonnen
+ werden soll. Die Rechtschreibprfung
+ kann aus diesem Men gestartet wer-
+ den.
+20 03 05 13 39 00 19 21 Rechtschreibprfung#
+ Unbekannte und auf Wunsch mehrdeutige
+ W”rter werden blinkend dargestellt.
+
+ Unbekanntes Wort:
+
+ <K>: Bearbeitungsmodus zur Korrektur
+ des Wortes. Mit ESCAPE wieder
+ Rechtschreibprfung.
+ <E>: Vormerken des Wortes fr das
+ Eintragen in die Worttabelle
+ durch das System LEXIKON.
+ <W>: Fortsetzung
+ <A>: Abbruch
+21 03 05 14 37 00 20 22 Rechtschreibprfung#
+ Mehrdeutiges Wort:
+
+ Es werden alle M”glichkeiten ausge-
+ geben, das Wort zu trennen.
+
+ <K>,<E>: siehe unbekanntes Wort
+ Cursortasten: Auswahl der richtigen
+ Trennstelle
+ <T>: Die ausgew„hlte Trennstelle
+ wird bei diesem Wort vermerkt
+ und bei Zeilenumbrchen be-
+ bercksichtigt.
+ <W>: Fortsetzung
+ <A>: Abbruch
+22 03 05 14 35 00 21 23 Rechtschreibprfung#
+ Explizite Angabe m”glicher Trenn-
+ stellen bei der Texteingabe:
+
+ ALT-T zu einem Buchstaben:
+ Das Wort darf hinter diesem
+ Buchstaben getrennt werden.
+ ALT-U zu einem Zeichen:
+ Hinter diesem Zeichen darf ein
+ Zeilenumbruch ohne Trennzeichen
+ erfolgen.
+ ALT-B:
+ Spezielles Leerzeichen bei dem
+ nie ein Zeilenumbruch erfolgen
+ darf.
+23 03 05 10 34 00 22 99 Rechtschreibprfung#
+ Bei Unklarheit, ob hinter einem
+ Buchstaben eine Haupt- (bei zu-
+ sammengesetzten W”rtern) oder
+ eine Nebentrennstelle (z.B. nach
+ Vorsilben) zu setzen ist, gilt:
+
+ Nebentrennstelle:
+ Hinzufgen von ALT-T
+ Haupttrennstelle:
+ Hinzufgen von ALT-T und ALT-U
+24 03 05 12 35 00 99 25 Seitenformat#
+ Aktivierung erfolgt vom Hauptmenu
+ Žnderung der folgenden Werte:
+ Seitenl„nge: Anz. der Zeilen pro
+ Seite, mit Kopf- und
+ Fuázone.
+ Kopfzone: Anz. der Zeilen in der
+ Kopfzone.
+ Fuázone: Anz. der Zeilen in der
+ Fuázone.
+ Kopf- bzw. Fuátext steht in der
+ mittleren Zeile der jeweiligen
+ Zone.
+25 03 05 07 36 00 24 99 Seitenformat#
+ Linker Rand: Anz. der Leerzeichen
+ am Beginn einer Zeile
+ Rechter Rand: Anz. der Zeichen
+ einer Zeile incl. Leer-
+ zeichen am Anfang.
+ Anfangsnummer: Seitennummer der
+ ersten Seite.
+26 03 05 06 35 00 99 99 Neues Dokument#
+ Aktivierung erfolgt vom Hauptmenu
+ Sie werden nach dem neuen Namen
+ des Dokuments gefragt. Unter die-
+ sem Namen wird ein Dokument ange-
+ legt. Existiert ein solches Doku-
+ ment, wird dieses eingelesen.
+27 03 05 05 35 00 99 28 Zwischendatei#
+ Erzeugung der Zwischendatei durch
+ Aktivierung des Menus Zwischenda-
+ tei schreiben (ganzes Dokument
+ oder nur markierte Abs„tze). Alte
+ Zwischendatei wird berschrieben.
+28 03 05 09 35 00 27 29 Zwischendatei#
+ Einfgen der Zwischendatei durch
+ Aktivierung des Menus Zwischenda-
+ tei einfgen oder durch ALT-F10.
+ Die Zwischendatei wird dann im
+ aktuellen Dokument an der Stelle
+ des Cursors eingefgt. Im Falle
+ eines breiteren Formats der Zwi-
+ schendatei werden die Abs„tze neu
+ formatiert.
+29 03 05 09 33 00 28 99 Fremddatei#
+ Durch Aktivierung der Funktion
+ "Lesen" wird eine Textdatei im
+ Sinne von MS/DOS in ein SISISI-
+ Dokument umgewandelt.
+ Durch Aktivierung der Funktion
+ "Schreiben" wird ein SISISI-
+ Dokument in eine Textdatei um-
+ wandelt und auf Diskette oder
+ Platte gespeichert.
+30 03 05 09 35 00 99 99 Speichern#
+ Aktivierung erfolgt vom Hauptmenu
+ Sie werden gefragt, ob Sie unter
+ dem aktuellen oder einem anderen
+ Namen abspeichern wollen.
+ Existiert ein Dokument unter die-
+ sem Namen, werden Sie gefragt, ob
+ es berschrieben werden soll oder
+ nicht. Wenn nicht, werden Sie
+ nach einem neuen Namen gefragt.
+31 03 05 07 35 00 99 99 Drucken#
+ Aktivierung erfolgt vom Hauptmenu
+ Es gibt folgende M”glichkeiten:
+ - Gesamttext drucken
+ - bestimmte Seite drucken
+ - bestimmte Seite suchen
+ - Umschalten: Zeilenvorschub
+ (1 / 1« / 2 - zeilig)
+32 03 05 13 32 00 03 99 Funktionstasten-Belegung#
+ Zeichenformate:
+ F5: Unterstreichen
+ SHIFT-F5: Fettdrucken
+ ALT-F5: Unterstr. aufheben
+ ALT-I: Italic (kursiv)
+ ALT-N: Roman (normal)
+
+ Bilder und Fuánoten:
+ ALT-P: Erzeugen und Žndern
+ von Bildern
+ ALT-F: Fuánotenbearbeitung
+ ALT-V: Fuánotenparam. „ndern
+ (nur in Fuánotenbearb.)
+33 03 05 12 39 04 99 99 Bildbearbeitung#
+ Mit ALT-P kann dem aktuellen Absatz
+ ein Bildabsatz zugeordnet werden.
+ Ist es das erste Bild erscheint so-
+ fort ein Men zur Eingabe eines neuen
+ Bildes.
+ Sonst ein Auswahlmen mit folgenden
+ Punkten:
+ - Eingabe eines neuen Bildes
+ - Žndern der Daten eines Bildes
+ - L”schen eines Bildes
+ - Žndern des Namens eines Bildes
+ - Einstellung der Bildgrenzen
+34 03 05 11 37 04 99 99 Editieren von Fuánoten#
+ Mit ALT-F kann zu dem aktuellen
+ Wort ein Fuánotentext eingegeben
+ bzw. ver„ndert werden.
+ Befindet man sich in der Fuánoten-
+ editierung, k”nnen mit ALT-V die
+ Fuánotenparameter ver„ndert werden
+ und mit ALT-F kommt man wieder zum
+ Bearbeitungsmodus.
+ Mit ALT-F2 k”nnen Fuánoten gel”scht
+ werden. Der Cursor muá auf dem Fuá-
+ notenverweis (Pik) stehen. \ No newline at end of file
diff --git a/obsolete/systems/sisisi/msdos/lexikon.bat b/obsolete/systems/sisisi/msdos/lexikon.bat
new file mode 100644
index 0000000000..9b90a3947d
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/lexikon.bat
@@ -0,0 +1,4 @@
+@echo off
+c:\sisisi\lexprog
+echo on
+ \ No newline at end of file
diff --git a/obsolete/systems/sisisi/msdos/manual.txt b/obsolete/systems/sisisi/msdos/manual.txt
new file mode 100644
index 0000000000..949baaa328
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/manual.txt
@@ -0,0 +1,29 @@
+
+
+ November 1995
+
+Das ist das alte Textsystem SISISI. Es l„uft unter DOS. Es hat nur eine
+Schriftart und auch sonst nur wenige Funktionen. Vor allem dient es dazu,
+die
+ sichere sinnentsprechende Silbentrennung
+
+zu erproben.
+
+Rufen Sie es mit SISISI auf und lassen Sie sich durch den Dialog fhren.
+Benutzen Sie auch die Hilfe F1.
+
+Mit LEXIKON kommen Sie in das System zum Manipulieren der Worttabelle.
+Sie k”nnen neue Wortst„mme in die Tabelle eintragen. Bei "Ausnahmen"
+k”nnen Sie die Trennstellen selbst vorgeben, auch wie weit der Stamm
+untrennbar sein soll.
+
+Die Dokumente sind Files mit einer besonderen Struktur, sie werden alle mit
+der Erweiterung ... .SI versehen, es sind keine Textfiles! Man kann aber
+Textfiles ber Zw./Fr.Datei, Fremddatei und Einlesen in SISISI-Files umwan-
+deln. Die Umkehrung geht ber Zwi/Fr.Datei und Schreiben; sie funktioniert
+aber nicht automatisch, es mssen noch Steuerzeichen per Hand entfernt
+werden, auch an den Trennstellen wird einiges verstmmelt.
+
+Mit SIDEMO k”nnen Sie eine Demo starten. Sie mssen aber das Datenfile
+DEMO1.SI dafr unmittelbar vorher unter SISISI benutzt, aber nicht ver„ndert
+haben.
diff --git a/obsolete/systems/sisisi/msdos/neuwort.tex b/obsolete/systems/sisisi/msdos/neuwort.tex
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/neuwort.tex
diff --git a/obsolete/systems/sisisi/msdos/schiffe.si b/obsolete/systems/sisisi/msdos/schiffe.si
new file mode 100644
index 0000000000..a5077911a6
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/schiffe.si
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/sidemo.bat b/obsolete/systems/sisisi/msdos/sidemo.bat
new file mode 100644
index 0000000000..a947a3b80e
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/sidemo.bat
@@ -0,0 +1,7 @@
+@echo off
+:Weiter
+run
+if errorlevel 5 goto Ende
+GOTO Weiter
+:Ende
+mode co80
diff --git a/obsolete/systems/sisisi/msdos/sisisi.bat b/obsolete/systems/sisisi/msdos/sisisi.bat
new file mode 100644
index 0000000000..66b0ca4408
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/sisisi.bat
@@ -0,0 +1,4 @@
+@echo off
+c:\sisisi\siprog
+echo on
+ \ No newline at end of file
diff --git a/obsolete/systems/sisisi/msdos/sisisi.sys b/obsolete/systems/sisisi/msdos/sisisi.sys
new file mode 100644
index 0000000000..ae29278587
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/sisisi.sys
@@ -0,0 +1,28 @@
+C:\
+C:\SISISI\DEMO1
+C:\WORTTAB
+C:\WORTTAB
+C:\AUTOMAT
+0 rechter Rand
+0 linker Rand
+2 Seitenumbruch
+0 Einrueckung
+2 Zeilenvorschub
+TRUE Randausgleich
+3 Kopfzone
+3 Fuszzone
+51 Seitenlaenge
+1 Seitennummer
+10 Dokument linker Rand
+72 Dokument rechter Rand
+2 Dokument Zeilenvorschub
+4 Druckertyp : NEC P6
+2 Zeilen zwischen Text und Fuánote
+. Zeichen fr Trennlinie
+10 Linker Rand der Trennlinie
+72 Rechter Rand der Trennlinie
+75 Max. Anzahl von Fuánoten auf einer Seite
+3 Zeilen eines Absatzes mssen auf neue Seite
+2 Zeilen eines Absatzes bleiben auf alter Seite
+8 max linker Rand der Bilder
+70 max rechter Rand der Bilder
diff --git a/obsolete/systems/sisisi/msdos/worttab.has b/obsolete/systems/sisisi/msdos/worttab.has
new file mode 100644
index 0000000000..3aa6dfc490
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/worttab.has
Binary files differ
diff --git a/obsolete/systems/sisisi/msdos/worttab.htx b/obsolete/systems/sisisi/msdos/worttab.htx
new file mode 100644
index 0000000000..f0d85cddef
--- /dev/null
+++ b/obsolete/systems/sisisi/msdos/worttab.htx
@@ -0,0 +1,5580 @@
+ab vo
+abakus s
+abel e
+abend s
+abenteuer s
+aber o
+able e
+abonn s
+absolut s
+abstrahier sa 2
+abstrakt sa 2
+absurd s
+abszeá sa 2
+abt s
+ach o
+ache s
+achs s
+achsel s
+acht s
+acker s
+adapt sa 2
+ad„quat sa 2
+add s
+ade s
+adel s
+ader s
+adler s
+administrat sa 2 6
+adress s
+adreá s
+advent s
+aero n
+aff s
+afrika s
+age e
+agent s
+aggress sa 2
+aha b
+ahm s
+ahn s
+ahorn s
+aids s
+akadem s
+akazie s
+akkord s
+akkordeon s
+akt s
+aktiv s
+aktualit„t s
+aktuell s
+akust s
+akzept s
+akzeptanz s
+al e
+alarm s
+album s
+alemann s
+alfabet s
+alge s
+algebra sa 2 4
+algorithm s
+algorithmus s
+alisch e
+alisier e
+alkohol s
+alkoholiker s
+all s
+allein s
+allerdings s
+alles s
+alli s
+allm„hlich s
+allzu s
+alm s
+almose s
+alp s
+alphabet s
+als o
+also b
+alt s
+altar s
+alter s
+alternativ s
+aluminium s
+am b
+amateur s
+ambition s
+amboá s
+ambulat s
+ameise s
+amen s
+amerika s
+amok s
+ampel s
+amsel s
+amt s
+an vo
+analog s
+analys s
+analytisch s
+ananas s
+and e
+ander s
+anderer s
+anderswo s
+angel s
+anger s
+angina s
+angst s
+anim s
+animo s
+animus s
+anker s
+annuit„t s
+anonym sa 2
+anorak s
+ans„ssig s
+ant e
+anteil s
+antenn s
+anthropo sa 2
+anti vn
+antlitz s
+antwort s
+anz e
+aper s
+apfel s
+apostel s
+apotheke s
+apparat s
+appell s
+appetit s
+applaudier sa 2
+applaus sa 2
+approxim sa 2 5
+april sa
+aquarium s
+arbeit s
+arbeiter s
+architekt s
+architekton s
+architektur s
+archiv s
+arg s
+argument s
+ariat e
+aristokrat sa 3 6
+arit„t e
+arithmet s
+arm s
+armut s
+aroma s
+art s
+arthritis sa 2 6
+artikel s
+artikul s
+arznei s
+arzt s
+asbest s
+asch s
+asiat s
+aspekt sa
+asphalt s
+assistent s
+assistenz s
+assistier s
+ast s
+astro sa
+aá s
+at e
+atelier s
+atem s
+athlet s
+ation e
+atlas s
+atm s
+atmosph„r sa 2 4
+atom s
+atomar s
+attentat s
+attent„ter s
+attest s
+attrakt sa 2
+auch b
+auf vo
+aufs b
+aug s
+august s
+aus vo
+austral sa 2
+austria sa 2
+auáen s
+auáer s
+auáerdem s
+auto vs
+autobahn s
+autodrom sa 4
+automat s
+automatisch s
+autor s
+avanc s
+avantgard s
+axiom s
+axt b
+„cht s
+„chz s
+„ff s
+„hn s
+„hre s
+„lt s
+„mt s
+„nder s
+„ngst s
+„pfel s
+„quivalent s
+„quivalenz s
+„r e
+„rg s
+„rger s
+„rm s
+„rzt s
+„st s
+„sthet sa 2
+„t e
+„tz s
+„ug s
+„uáer s
+„xte s
+baby sa 2
+bach s
+back s
+bad s
+baff s
+bagger s
+bahn s
+bahr s
+balanc s
+bald s
+baldrian s
+balg s
+balken s
+balkon s
+ball s
+ballett s
+ballon s
+balsam s
+balz s
+banal s
+banane s
+band s
+bandag s
+bang s
+banjo s
+bank s
+bann s
+bar evb
+baracke s
+barg s
+barm s
+baro v
+barock s
+barren s
+barsch s
+barst u
+bart s
+bas s
+basis s
+bast s
+baá s
+bat s
+bau s
+bauch s
+bauer s
+baum s
+bausch s
+bazillen s
+bazillus s
+b„ch s
+b„ck s
+b„cker s
+b„d s
+b„hn s
+b„lk s
+b„ll s
+b„nd s
+b„ng s
+b„nk s
+b„r s
+b„rt s
+b„sse s
+b„uch s
+b„uer s
+b„um s
+b„usch s
+be v
+beb s
+becher s
+becken s
+beef s
+beer s
+beerd sa 2
+beet s
+befiehl u
+begann s
+beginn s
+begonn s
+behend s
+beh”rd s
+bei vo
+beicht s
+beid s
+beige s
+beil s
+beim b
+bein s
+beinhal sa 2 4
+beiá s
+beiz s
+bejah s
+bel e
+bell s
+bengel s
+benzin s
+bequem s
+berg s
+berst u
+berchtigt s
+beschwerd s
+beschwerde sa 2
+besen s
+besser s
+best s
+best„tig s
+besteh s
+bet s
+bet„ub s
+betrieb sa 2
+bett s
+beug s
+beul s
+beut s
+beutel s
+bevor b
+bezirk s
+bibel s
+biber s
+bibl s
+biblio sa 2
+bibliothek sa 2
+bieg s
+biene s
+bier d -- no "bieren"!
+biet s
+bikini sa 2 4
+bilanz s
+bild s
+billig s
+billiger s
+bin b
+bin„r s
+bind s
+binnen s
+bio vn
+biolog s
+birg s
+birk s
+birn s
+birne s
+birst b
+bis s
+bischof s
+bisch”f s
+bisher s
+biskott s
+biskuit sa 3
+biss s
+bist b
+biá s
+bitt s
+bitter s
+blam s
+blank s
+blas s
+blaá s
+blatt s
+blau s
+bl„h s
+bl„s s
+bl„st b
+bl„tt s
+bl„u s
+ble c
+blech s
+blei s
+bleib s
+bleich s
+blend s
+blich u
+blick s
+blieb s
+blies s
+blind s
+blink s
+blinz s
+blitz s
+block s
+blond s
+bloá s
+bl”cke s
+bl”d s
+bl”k s
+blӇ s
+bluejean sa 4
+bluff s
+blum s
+blunze s
+bluse s
+blut s
+blff s
+blh s
+blm s
+blt s
+bob s
+bock s
+boden s
+bog s
+bohne s
+bohr s
+boiler s
+boje s
+bold s
+bolz s
+bombard s
+bombe s
+bonbon s
+bonbonniere s
+bonus s
+boom s
+boot s
+bord s
+bordre s
+borg s
+borst s
+borte s
+bos s
+bot s
+botan s
+bottich s
+box s
+b” s
+b”ck s
+b”ller s
+b”rse s
+b”s s
+b”schung s
+b”t s
+brach s
+bracht u
+branche s
+brand s
+brannt s
+brat s
+brau s
+brauch s
+braun s
+brav s
+bravo s
+br„nd s
+br„t s
+br„u s
+br„uch s
+br„un s
+br„ut s
+br„utigam s
+brech s
+brei s
+breit s
+brems s
+brenn s
+brenz s
+brett s
+brezel s
+brich s
+brief s
+briet u
+brikett s
+brill s
+bring s
+brise s
+broch s
+brock s
+brod s
+brodel s
+brom s
+bronchial s
+bronchitis s
+brosamen s
+brosch s
+broschre s
+brot s
+br”ck s
+br”sel s
+br”t s
+bruch s
+bruder s
+brumm s
+brunn s
+brunst s
+brust s
+brut s
+brutal s
+brutto s
+brutzel s
+brch s
+brck s
+brder s
+brh s
+brll s
+brnett s
+brst s
+brt s
+bub s
+buch s
+buchstab s
+buck s
+bude s
+budel s
+budget s
+buffet s
+bug s
+buket s
+bummel s
+bummerl s
+bund s
+bunt s
+bure s
+burg s
+bursch s
+bus s
+busch s
+bussard s
+busserl s
+buá s
+butt s
+butter s
+butzen s
+bch s
+bck s
+bffel s
+bffet s
+bg s
+bgel s
+bhn s
+bnd s
+brg s
+brgermeister s
+bro s
+brst s
+bsch s
+bá s
+bzw b
+cafe s
+camp s
+camping s
+cellist s
+cello s
+cellophan s
+celsius s
+center s
+champagner sa 4 6
+champignon sa 4 6
+chance s
+chaos s
+chaot s
+charakter s
+charm s
+chauff s
+chef s
+chem s
+chemikal s
+chen c
+chiffr sa 4
+china s
+chines s
+chip s
+chlor s
+cholera s
+chor s
+choral s
+choreo n
+choreograph sa 3 6
+christ s
+christus s
+chrom s
+city s
+clever s
+clown s
+club s
+cod s
+collage s
+compiler s
+computer s
+couch s
+courag s
+cousin s
+cowboy s
+creme s
+cup s
+da vo
+dach s
+dacht s
+dackel s
+damal s
+dame s
+damm s
+dampf s
+dampfer s
+dang u
+dank s
+dann o
+dar o
+darb s
+darf s
+darm s
+das o
+dasjenige s
+daá b
+data s
+datei s
+daten s
+datier s
+dattel s
+datum s
+dau s
+dauer s
+davon s
+dazu s
+d„ch s
+d„mm s
+d„mmer s
+d„mpf s
+d„mpfer s
+d„rm s
+debakel s
+deck s
+defekt s
+definier s
+definition s
+defizit s
+degen s
+dehn s
+deich s
+deichsel s
+dein s
+deka vs
+dekan s
+deklar sa 2
+dekor s
+deleg s
+delikat s
+delikatesse s
+delikt s
+delphin s
+dem s
+demokrat sa 2 4
+demol s
+demonstr sa 2 5
+demut s
+demtig s
+den b
+denen b
+dengel s
+denjenigen s
+denk s
+denn s
+dennoch s
+denselben b
+dentist s
+deponie s
+depress sa 2
+deprim sa 2
+der s
+derb s
+derby s
+derjenig s
+des bv
+deshalb b
+design s
+deskript sa 2
+dessen s
+dessert s
+desto s
+deswegen s
+deszend sa 2
+detail s
+detektiv s
+determin s
+deut s
+deutsam s
+deutsch s
+deutschen s
+dezember s
+dezi n
+dezimal s
+dia s
+diagnos sa 3
+diagnose sa 3
+diagonal s
+diagramm sa 3
+dialekt s
+dialog s
+diamant s
+di„t s
+dich b
+dicht s
+dick s
+dickicht s
+didakt s
+die s
+dieb s
+diejenige s
+dien s
+dienst s
+dienstag sa 5
+dies s
+diffam s
+different s
+differential s
+differenz s
+diffizil s
+digital s
+dikt s
+dilemma s
+dilett s
+dimension s
+dimensional s
+ding s
+di”zes s
+diphtherie s
+diplom sa 2
+dir b
+direkt s
+dirig s
+dirigent s
+dirndl s
+dis v
+diskont s
+diskret sa 3
+diskussion s
+diskut s
+dispon s
+dissert s
+distanz s
+distel s
+disziplin sa 3 5
+diva s
+divergent s
+divergenz s
+divers s
+divid s
+divis s
+diwan s
+doch b
+docht s
+dogge s
+dohle s
+doktor s
+dokument s
+dokumentar s
+dokumentation s
+dolch s
+dollar s
+dolmetsch s
+dom s
+domino s
+dompt s
+donau s
+donner s
+donnerstag sa 3 7
+doppel s
+doppl s
+dorb s
+dorf s
+dorn s
+dorr s
+dorsch s
+dort s
+dose s
+dot s
+dotter s
+dozent s
+dozier s
+d”rf s
+d”rr s
+drache s
+dragoner s
+draht s
+drama s
+dran o
+drang s
+drap s
+drastisch s
+drauf o
+draus o
+drauáen o
+dr„ht s
+dr„ng s
+drechseln s
+drechsler s
+dreck s
+dreh s
+drei s
+dreier sa 4
+dreiáig s
+dresch s
+dress s
+dreá s
+dribb s
+drieá s
+drill s
+drin b
+dring s
+drinnen b
+drisch u
+dritt s
+droben b
+drog s
+droh s
+drollig s
+dromedar s
+drosch s
+dross s
+droá s
+dr”hn s
+druck s
+drum o
+drungen d
+drunter b
+druá s
+drben b
+drber s
+drck s
+drs s
+dschungel s
+dschunke s
+du b
+duck s
+dudel s
+duell s
+duett s
+duft s
+dukat s
+duktion s
+duld s
+dumm s
+dumpf s
+dung s
+dunkel s
+dunkl s
+dunst s
+dur s
+durch vo
+durchs b
+durf s
+durst s
+dusch s
+dutzend s
+duz s
+dbel s
+dft s
+dmm s
+dng s
+dnk s
+dnn s
+dnst s
+drf s
+drr s
+drst s
+ds s
+dster s
+dynam s
+dynamik sa 2
+dynamisch sa 2
+dynamo s
+dynast s
+e iwgf
+eben s
+eber s
+ebne s
+echo s
+echse s
+echt s
+eck s
+edel s
+edit s
+efeu s
+effekt s
+effektiv s
+effizient s
+effizienz s
+egal s
+egg s
+egoist sa 3
+ehe s
+ehr s
+ei ed
+eich s
+eid s
+eier s
+eifer s
+eifrig s
+eig s
+eigentlich s
+eil s
+eimer s
+ein s
+eine s
+einem s
+einen s
+einer s
+einfall s
+einheit s
+einig s
+einiger s
+eins s
+einsam s
+einzel s
+einzeln d
+einzig s
+eis s
+eisen s
+eisern s
+eitel s
+eiter s
+eitrig s
+ekel s
+elast s
+elastizit„t s
+elefant s
+eleg s
+elegant s
+eleganz s
+elektr sa 4
+elektrizit„t sa 4
+elektro sa 4
+element s
+elementar s
+elend s
+elf s
+elimin s
+ell s
+elster s
+eltern s
+em wg
+email s
+emaill s
+emp v
+empir s
+empor s
+emp”r s
+emsig s
+en phjfigw
+end sp
+energ s
+eng s
+enkel s
+enorm s
+ens jfwg
+ensemble sa 2 5
+ent v
+entbehr s
+ente s
+entgolt s
+entlich e
+entzckend s
+enz e
+enzian s
+episode s
+epoch s
+er vbkjfwg
+erb s
+erd s
+erei e - zur Unterdrckung echter Mdtk (B„cker=ei!)
+ergonom s
+erker s
+erkor u
+erl s
+ern w
+ernst s
+ernte s
+erst s
+erz s
+es bfwg
+esch s
+esel s
+eskal s
+eskapade s
+eskimo s
+espe s
+esse d
+essig s
+est kig
+eá s
+et pig
+etage s
+etappe s
+ete g
+eten g
+eternit s
+etest g
+etet g
+eth sa 3
+etikett s
+etliche s
+etui s
+etwa s
+etwaig sa 2 4
+etwas b
+euch b
+euer b
+eule s
+eur e
+eure b
+europa s
+europ„ s
+euter s
+evangel s
+eventuell s
+ewig s
+ex v
+exakt sa 2
+exemplar sa 2 4
+exerz sa 2
+exil s
+existent sa 3
+existenz sa 3
+existier s
+exklud sa 2
+exklus sa 2
+exorbitant sa 2
+exot s
+experiment s
+experte s
+explizi sa 2
+explodier sa 2
+explosion sa 2
+exponent s
+export s
+expreá sa 2
+exspekt sa 2
+extern s
+extra sa 2
+extrem sa 2
+extrema s
+extremal s
+fabel s
+fabrik sa 2
+fabrikant sa 2
+fabrikat sa 2
+fabrikation sa 2
+fabrizier sa 2
+fach s
+fackel s
+fad s
+faden s
+fahl s
+fahn s
+fahnd s
+fahr s
+fahrt s
+fakt s
+fakult„t s
+falk s
+fall s
+falsch s
+falt s
+famili„r s
+familie s
+famos s
+fanat s
+fand s
+fanfare s
+fang s
+farb s
+farm s
+faschier s
+fasching s
+faser s
+fass s
+fasson s
+fast s
+faá s
+faát s
+fauch s
+faul s
+faust s
+faxe s
+fazit s
+f„cher s
+f„d s
+f„den s
+f„hig s
+f„hr s
+f„hrd s
+f„ll s
+f„lsch s
+f„lt s
+f„nd u
+f„ng s
+f„rb s
+f„ul s
+f„ust s
+feber s
+februar sa 2 5
+fecht s
+feder s
+fee s
+feg s
+fehd s
+fehl s
+fehler s
+feier sa 3
+feig s
+feil s
+feilsch s
+fein s
+feind s
+feld s
+felg s
+fell s
+fels s
+fenster s
+ferien sa 2 4
+ferkel s
+fern s
+fers s
+fertig s
+fesch s
+fessel s
+fest s
+feál s
+fett s
+fetz s
+feucht s
+feuer s
+feurig s
+fiaker s
+fibel s
+ficht s
+fidel s
+fieber s
+fiebrig s
+fied s
+fiedel s
+fiehl s
+fiel s
+figur s
+fikt s
+file sa
+filial s
+film s
+filter s
+filtr s
+filz s
+final s
+finanz s
+finanziell s
+find s
+finesse s
+fing s
+finger s
+finish s
+finit s
+fink s
+finster s
+firm s
+firma s
+firn s
+firnis s
+first s
+fisch s
+fischer s
+fistel s
+fit s
+fix s
+flach s
+flacker s
+flad s
+flagg s
+flamm s
+flanell s
+flank s
+flasche s
+flatter s
+flau s
+flaum s
+fl„ch s
+fl„sch s
+flecht s
+fleck s
+fleckerl s
+fledermaus s
+flegel s
+fleh s
+flehentlich s
+fleisch s
+fleiá s
+fletsch s
+flexi s
+flexibilit„t s
+flicht s
+flick s
+flieder s
+flieg s
+flieh s
+flies s
+flieá s
+flimmer s
+flink s
+flint s
+flitter s
+flitz s
+flocht s
+flock s
+flog s
+floh s
+flosse s
+floá s
+flott s
+flӇ s
+fl”te s
+fluch s
+flucht s
+flug s
+flunker s
+flur s
+fluss s
+fluá s
+flut s
+flcht s
+flge s
+flgel s
+flgge s
+flss s
+flster s
+focht s
+fohl s
+folg s
+folgend s
+folgender s
+folie s
+folter s
+fon s
+fonds s
+fopp s
+forc s
+forder s
+forelle s
+foren s
+form s
+formal s
+format s
+formel s
+formular s
+formulier s
+forsch s
+forst s
+fort s
+forum s
+foto s
+f”hn s
+f”hre s
+f”n s
+f”rder s
+f”rm s
+f”rst s
+fracht s
+frag s
+fragment d
+frank s
+frans s
+fraá s
+fratz s
+frau s
+fr„chter s
+fr„s s
+fr„á s
+fr„ulein s
+frech s
+frei s
+freitag s
+fremd s
+frequentier s
+frequenz s
+fress s
+freu s
+freud s
+freund s
+frev s
+fried s
+frier s
+fris s
+frisch s
+frist s
+friá s
+frittat s
+froh s
+fromm s
+fron s
+front s
+fror s
+frosch s
+frost s
+frott s
+frotzel s
+fr”h s
+fr”st s
+frucht s
+frcht s
+frh s
+fuchs s
+fug s
+fuhr s
+fund s
+funk s
+funktion s
+furch s
+furcht s
+furt s
+furunkel s
+fusion s
+fuá s
+futter s
+futteral s
+fg s
+fhl s
+fhr s
+fll s
+fnd s
+fnf s
+fr o
+frcht s
+frst s
+fá s
+ftter s
+gab s
+gabel s
+gacker s
+gaff s
+galant s
+galerie s
+galgen s
+gall s
+galopp s
+galt s
+gams s
+gang s
+gans s
+ganz s
+gar s
+garag s
+garaus sa 3
+garb s
+garde s
+garnitur s
+garten s
+gas s
+gaso v
+gasse s
+gast s
+gatsch s
+gatt s
+gau s
+gaul s
+gaumen s
+gauner s
+g„b s
+g„hn s
+g„ng s
+g„ns s
+g„nz s
+g„r s
+g„rten s
+g„ste s
+g„á s
+ge v
+geb s
+gebar u
+gebaut s
+geb„rd s
+geb„ud s
+geber s
+geboren d
+gebracht da 2
+geburt s
+gebhr s
+gedeih s
+gediegen s
+gedieh u
+gegen s
+gegend s
+gegn s
+gegner s
+gegolten d
+geh s
+gehalt s
+geheim s
+geheuer s
+geheuren s
+geier s
+geig s
+geil s
+geisel s
+geist s
+geiá s
+geiz s
+gelb s
+geld s
+gelegentlich s
+gell s
+gelse s
+gelt s
+gelbd s
+gem„lde s
+gems s
+gems s
+genau s
+genauso s
+gendarm s
+general s
+generator s
+generell s
+generier s
+genes s
+genieá s
+genoss s
+genoá u
+genug s
+geng s
+geo n
+gerad s
+geradeaus sa 6
+geradezu s
+gerb s
+germ s
+german s
+gern s
+gerste s
+gerte s
+gerch s
+germpel s
+ges„á s
+geschah u
+geschehen s
+geschieh u
+geschm„cker sa 2
+geschmeid sa 2
+geschwister s
+geschwr sa 2
+geselcht s
+gesell s
+gesind s
+gessen d
+gest s
+gestrig s
+gestrpp sa 2
+gestt s
+gesund s
+gesungen s
+gesunken s
+geálich s
+getan s
+getreide sa 2
+geud s
+gewalt s
+gewann s
+gewinn s
+gewiá s
+gewrungen d
+geziefer s
+geziem s
+gezwungen d
+gib s
+gicht s
+gieb s
+gier s
+gieá s
+gift s
+gigant s
+gilb s
+gilt s
+ging u
+ginster s
+gipfel s
+gips s
+giraffe s
+girlande s
+girr s
+gitarre s
+gitter s
+gladiole s
+glanz s
+glas s
+glatt s
+glatz s
+glaub s
+gl„nz s
+gl„s s
+gl„tt s
+gl„ub s
+gleich s
+gleis s
+gleit s
+gletscher s
+glich s
+glied s
+glimm s
+glimpf s
+glitschig s
+glitt s
+glitzer s
+glitzernd s
+global s
+globus s
+glock s
+glomm s
+gloss s
+glossar s
+glotz s
+gl”ck s
+glucks s
+glut s
+glck s
+glh s
+gnade s
+gn„dig s
+gng s
+gockel s
+gold s
+golf s
+gonal s
+gondel s
+gong s
+gor u
+gorilla s
+goss s
+goá s
+gott s
+g”nn s
+g”tt s
+grab s
+grad s
+graf s
+gram s
+gramm s
+grammatikalisch s
+granat s
+grandios s
+granit s
+grant s
+graph s
+graphik s
+gras s
+grat s
+gratis s
+gratul s
+grau s
+graupel s
+grav s
+gravierend s
+grazi s
+gr„b s
+gr„f s
+gr„m s
+gr„s s
+gr„álich s
+gr„te s
+gr„tsch s
+greif s
+greis s
+greiáler s
+grell s
+gremien sa 3 5
+gremium s
+grenz s
+greuel s
+grieá s
+griff s
+grill s
+grimasse s
+grimm s
+grind s
+grins s
+gripp s
+grob s
+grobian s
+groll s
+groschen s
+groá s
+grott s
+gr”hl s
+grӇ s
+grub s
+gruft s
+grund s
+grunz s
+gruppe s
+gruppier s
+grusel s
+gruss s
+gruá s
+grb s
+grn s
+grnd s
+grá s
+guck s
+gugelhupf s
+gulasch s
+gulden s
+gummi s
+gunst s
+gurgel s
+gurk s
+gurt s
+guss s
+guá s
+gut s
+gltig s
+gnst s
+grt s
+gss s
+gt s
+gymnasi s
+gymnasium s
+gymnast s
+haar s
+hab s
+habicht s
+habilit s
+habt d
+hack s
+hader s
+hafen s
+hafer s
+hafner s
+haft sc
+hag s
+hagel s
+hahn s
+hai s
+hain s
+hak s
+halb s
+halde s
+half u
+halfter s
+hall s
+hallo s
+halm s
+hals s
+halt s
+hammel s
+hammer s
+hampel s
+hamster s
+hand s
+handel s
+handl s
+hanf s
+hang s
+hangar s
+hantier s
+haper s
+happen s
+hardware sa 4
+harfe s
+harm s
+harmon s
+harmonika s
+harn s
+harpun s
+harr s
+harsch s
+hart s
+hartn„ckig s
+harz s
+hasch s
+hase s
+hasel s
+hass s
+hast s
+haá s
+hat s
+hatte s
+hau s
+haube s
+hauch s
+haufen s
+haupt s
+haus s
+haut s
+h„ftling s
+h„k s
+h„kel s
+h„lfte s
+h„lt s
+h„mmer s
+h„nd s
+h„ng s
+h„nseln s
+h„rchen s
+h„rt s
+h„s s
+h„ss s
+h„á s
+h„tsch s
+h„tte s
+h„uf s
+h„upt s
+h„us s
+h„ut s
+heb s
+hecht s
+heck s
+heer s
+hefe s
+heft s
+heg s
+heid s
+heikel s
+heiklig s
+heil s
+heiland s
+heim s
+heimat s
+heirat s
+heiser s
+heiá s
+heit c
+heiter s
+heiz s
+hektar s
+hekto n
+held s
+helf s
+hell s
+helm s
+hemd s
+hemm s
+hendl s
+hengst s
+henk s
+henne s
+her vo
+herb s
+herbst s
+herd s
+hering s
+herr s
+herrsch s
+herz s
+hetz s
+heu s
+heuchel s
+heuchler s
+heuer s
+heul s
+heut s
+hex s
+hieb s
+hielt s
+hier s
+hierarch sa 4
+hierbei s
+hierfr s
+hierher s
+hierzu s
+hiesig s
+hieá u
+hilf s
+him v
+himmel s
+himmlisch s
+hin vo
+hinder s
+hindurch s
+hing s
+hink s
+hint s
+hinter s
+hinzu s
+hirn s
+hirsch s
+hirse s
+hirt s
+hiss s
+histor s
+hitz s
+hob s
+hobby s
+hoch s
+hock s
+hof s
+hoff s
+hoffentlich b
+hohe s
+hohl s
+hohn s
+hol s
+holf s
+holper s
+holprig s
+holz s
+homo n
+honig s
+hopf s
+hoppel s
+hoppla s
+hops s
+horch s
+horde s
+horizont s
+horizontal s
+horn s
+hornisse s
+horst s
+hort s
+hose s
+hospital sa 2
+hospit„ler sa 2
+hostie s
+hotel s
+h”chst s
+h”cker s
+h”f s
+h”h s
+h”ll s
+h”lz s
+h”r s
+h”s s
+hub s
+hudeln s
+huf s
+huhn s
+human s
+hummel s
+hummer s
+humor s
+humpel s
+humus s
+hund s
+hundert s
+hunger s
+hungrig s
+hup s
+hupf s
+hurra s
+hurtig s
+husch s
+hust s
+hut s
+hbsch s
+hft s
+hgel s
+hhn s
+hhner s
+hhnerei sa 3 6
+hll s
+hls s
+hndin s
+hpf s
+hrde s
+hsteln s
+ht s
+hyazinth s
+hy„ne sa 3
+hydrant sa 2
+hydraul sa 2
+hygien s
+hymne s
+hypnotis s
+hypothese s
+hypothetisch s
+hyster s
+iade e
+ial e
+iat e
+ich b
+ideal s
+idee s
+ident s
+identifikation s
+idiot s
+ie e
+iell e
+ien e
+ier e
+ig e
+igel s
+ignor s
+ihm b
+ihn s
+ihr s
+ik e
+ika e
+ikum e
+illuster s
+illustr sa 2 4
+im b
+imag s
+imbiá s
+imker s
+immer s
+immerzu s
+immun s
+impf s
+implement sa 2
+implizi sa 2
+import s
+impr„gn sa 2 5
+improvis sa 2
+impuls s
+imstand s
+in oe
+in„r e
+indes s
+indessen s
+index s
+individu s
+individuum s
+indiz s
+industri sa 2 4
+infekt s
+infinitesimal s
+infiz s
+inflation sa 2
+infolgedessen s
+informatik s
+information s
+infra sa 2
+inhal s
+initi sa 2
+injekt s
+inklus sa 2
+inner s -- inne? innere?
+innig s
+innung s
+ins b
+insbesonder s
+insekt s
+insel s
+inser s
+insgesamt s
+insolvent s
+insolvenz s
+inspekt sa 2
+instanz s
+instinkt s
+institut s
+instrument sa 2
+inszenier sa 2
+integer s
+integr sa 2 4
+integral s
+intelligent s
+intelligenz s
+intendant s
+intens s
+inter v
+interess sa 2 5
+intern s
+interpret sa 2 5
+intrig sa 2
+invalid s
+inventar s
+inventur s
+invest s
+inwieweit s
+ion e
+ional e
+irdisch s
+irgend s
+irgendwie s
+irgendwo s
+irr s
+irrelevant s
+isation e
+isch e
+isier e
+ismus e
+iso v
+isol s
+ist be
+istisch e
+iá b
+iát b
+italien s
+it„t e
+iter s
+ition e
+ium e
+iv e
+iz e
+ja s
+jacht s
+jacke s
+jag s
+jagd s
+jahr s
+jahresende sa 3 6
+jalousie s
+janker s
+januar s
+jauche s
+jauchz s
+jaul s
+jaus s
+jazz s
+j„ck s
+j„ger s
+j„h s
+j„hr s
+j„mmerlich s
+j„nner s
+j„te s
+je b
+jed s
+jedoch b
+jeglich s
+jeher s
+jemals s
+jemand s
+jen s
+jenseits s
+jesus s
+jetzig s
+jetzt s
+jeweil s
+job s
+joch s
+jod s
+jodel s
+jodler s
+joghurt sa 2
+johannis s
+johl s
+jongl s
+joppe s
+journal sa 4
+jubel s
+jubil s
+jubilar s
+jubil„um s
+juchz s
+juck s
+jud s
+judo s
+jugend s
+juli s
+jung s
+juni s
+just b
+justiz s
+jute s
+juwel s
+jux s
+jd s
+jng s
+kabel s
+kabin s
+kachel s
+kaffee s
+kahl s
+kahn s
+kai s
+kaiser s
+kajak s
+kakao s
+kaktus s
+kalb s
+kalender s
+kalk s
+kalkul s
+kalt s
+kam s
+kamera s
+kamerad s
+kamill s
+kamm s
+kamp s
+kampf s
+kanal s
+kanarie s
+kan„le s
+kandid s
+kanin s
+kanister s
+kann s
+kanon s
+kanone s
+kant s
+kanu s
+kanz s
+kap s
+kapazit„t s
+kapital s
+kapit„n s
+kapitel s
+kaplan sa 2
+kappe s
+kaputt s
+kapuz s
+kar s
+karabiner s
+karaffe s
+karawan s
+karbol s
+kardinal s
+karg s
+kari s
+karniese s
+karo s
+karosse s
+karott s
+karpfen s
+karte s
+kartei s
+kartoffel s
+karton s
+kasern s
+kasperl s
+kass s
+kassa s
+kastanie s
+kasten s
+katakomb s
+katalog s
+katarrh s
+katastroph sa 2 4
+katastrophal sa 2 4
+katech s
+kategor s
+kater s
+kathol s
+katze s
+kau s
+kauer s
+kauf s
+kaum s
+kautschuk s
+kauz s
+k„fer s
+k„fig s
+k„lt s
+k„m s
+k„mm s
+k„mpf s
+k„nguruh s
+k„pp s
+k„rg s
+k„rt s
+k„se s
+k„st s
+k„tz s
+k„ue s
+k„uf s
+keck s
+kegel s
+kehl s
+kehr s
+keif s
+keil s
+keim s
+kein s
+keit c
+keks s
+kelch s
+kell s
+kenn s
+kenter s
+keram s
+kerb s
+kerker s
+kerl s
+kern s
+kerze s
+kessel s
+kett s
+keuch s
+keule s
+keusch s
+kicher s
+kiebitz s
+kiefer s
+kiel s
+kieme s
+kien s
+kies s
+kilo vd
+kind s
+kinn s
+kino s
+kiosk s
+kipp s
+kirch s
+kirsch s
+kirtag s
+kissen s
+kist s
+kitsch s
+kitt s
+kitz s
+klag s
+klamm s
+klammer s
+klang s
+klappe s
+klappt s
+klaps s
+klar s
+klass s
+klassifizier s
+klatsch s
+klau s
+klaub s
+klausur s
+klavier s
+kl„ff s
+kl„g s
+kl„ng s
+kl„r s
+kleb s
+kleck s
+klee s
+kleid s
+kleie s
+klein s
+kleister s
+klemm s
+klett s
+klima s
+klimm s
+klimper s
+klin s
+kling s
+klingel s neu wegen gestrichener -el-Endung
+klingl s neu wegen gestrichener -l-Endung
+klink s
+klinker s
+klipp s
+klirr s
+klo s
+klomm u
+klopf s
+klosett s
+kloster s
+klotz s
+kl”ppel s
+klub s
+kluft s
+klug s
+klump s
+klung s
+klft s
+knabber s
+knabe s
+knack s
+knall s
+knapp s
+knarr s
+knatt s
+knaus s
+kn„cke s
+kn„uel s
+knebel s
+knecht s
+kneif u
+knet s
+knick s
+knie s
+kniff s
+knips s
+knirps s
+knirsch s
+knister s
+knitter s
+knoblauch s
+knoch s
+knochen s
+knoll s
+knopf s
+knorpel s
+knorplig s
+knorr s
+knosp s
+knot s
+kn”ch s
+kn”del s
+kn”pf s
+knurr s
+knusper s
+knusprig s
+knll s
+knpf s
+knppel s
+koal sa 2
+kobel s
+kobold s
+koch s
+kod s
+kodex s
+koeffizient s
+koffer s
+kogel s
+kognit sa 2
+kohl s
+koje s
+kokos s
+koks s
+kolb s
+kolik s
+kollabier s
+kollaps s
+kolleg s
+kollekt s
+koller s
+kolonn s
+kolossal s
+koloá s
+kom s
+kombination s
+kombinator s
+kombinatorisch s
+kombinier s
+komm s
+komma s
+kommando s
+kommentar s
+kommentier s
+kommiss s
+kommun s
+kommuni s
+kompakt s
+kompanie s
+kompetent s
+kompetenz s
+komplett sa 3
+komplex sa 3
+kompliment sa 3
+kompliz sa 3
+kompon s
+komponente s
+kompott s
+kon v
+kondens s
+kondition s
+konditor s
+kondol s
+konfekt s
+konfer s
+konfession s
+konflikt sa 3
+kongreá sa 3
+kongruenz sa 3 6
+konjunktur s
+konkav s
+konkret sa 3
+konkurr s
+konkurrent s
+konnt u
+konsequent s
+konsequenz s
+konserv s
+konsonant s
+konstant s
+konstruier sa 3
+konstrukt sa 3
+konsum s
+konsument s
+kontakt s
+konten s
+kontingent s
+kontinuier s
+konto s
+kontra sa 3
+kontrakt sa 3
+kontrast sa 3
+kontroll sa 3
+konvent s
+konvergent s
+konvergenz s
+konvex s
+konzentr sa 3 6
+konzept s
+konzern s
+konzert s
+konzession s
+konzil s
+konzipier s
+kooperation sa 2
+koordin sa 2
+kopf s
+kopie s
+kopplung s
+koralle s
+korb s
+kork s
+korn s
+korrekt s
+korrektur s
+korrel s
+korrigier s
+kosmet s
+kosmo s
+kost s
+kostm s
+kot s
+kotz s
+k”ch s
+k”der s
+k”ffer s
+k”hl s
+k”mm s
+k”nig s
+k”nn s
+k”pf s
+k”rn s
+k”rper s
+k”st s
+krabbel s
+krach s
+kraft s
+kragen s
+krakeel s
+kralle s
+kram s
+krampen s
+krampf s
+kran s
+krank s
+kranz s
+krapfen s
+krass s
+kraá s
+krat s
+kratz s
+kraul s
+kraus s
+kraut s
+krawall s
+krawatte s
+krax s
+kr„chz s
+kr„ft s
+kr„gen s
+kr„h s
+kr„mer s
+kr„nk s
+kr„nz s
+kr„usel s
+kr„ut s
+kreat s
+krebs s
+kredenz s
+kredit s
+kreide s
+kreier sa 3
+kreis s
+kreisch s
+kremp s
+kren s
+krepp s
+kreuz s
+kribb s
+kriech s
+krieg s
+krimi s
+kripp s
+krise s
+krisis s
+kristall s
+krit s
+kriteri s
+kriterium s
+kritzel s
+kroch s
+krokodil s
+kron s
+kropf s
+kr”n s
+kr”te s
+krug s
+krumm s
+krust s
+kruzifix s
+krcke s
+krg s
+krmm s
+krppel s
+krypto vn
+kubisch s
+kubus s
+kuchen s
+kuckuck s
+kuf s
+kugel s
+kuh s
+kult s
+kultur s
+kummer s
+kund s
+kunft s
+kunst s
+kunterbunt s
+kupfer s
+kuppe s
+kuppel s
+kupplung s
+kur s
+kurbel s
+kurios s
+kurs s
+kurv s
+kurz s
+kusine s
+kuá s
+kutsch s
+kutte s
+kuvert s
+kbel s
+kche s
+kcken s
+khl s
+khn s
+kken s
+kmmel s
+kmmer s
+knd s
+knft s
+knftig s
+knst s
+kr s
+krbis s
+krschner s
+krz s
+kss s
+kste s
+kybernet s
+lab s
+lach s
+lack s
+lad s
+lag s
+lahm s
+laib s
+laich s
+laie s
+lall s
+lament s
+lamm s
+lampe s
+lampion s
+land s
+lang s
+lanze s
+lapp s
+larv s
+las s
+lasch s
+lass s
+lasso s
+last s
+laá s
+latein s
+latern s
+latsch s
+latte s
+latz s
+lau s
+laub s
+lauch s
+lauf s
+laug s
+laus s
+lausch s
+laut s
+lava s
+lawine s
+lax s
+lazarett s
+l„ch s
+l„d u
+l„g s
+l„hm s
+l„nd s
+l„nder s
+l„ng s
+l„rm s
+l„ss s
+l„ster s
+l„stig s
+l„á s
+l„át s
+l„uf s
+l„ufer s
+l„us s
+l„ut s
+leb s -- hier war "-le x" drin; wieso??
+lechz s
+leck s
+leder s
+ledig s
+lee s
+leer s
+leg s
+legal s
+legitim s
+lehen s
+lehm s
+lehn s
+lehr s
+lei e
+leib s
+leich s
+leicht s
+leid s
+leier s
+leih s
+leim s
+lein se
+leise s
+leist s
+leit s
+lenk s
+lenz s
+lepra sa 2
+ler e
+lerche s
+lern s
+les s
+letzt s
+leucht s
+leugn s
+leut s
+lexikon s
+libelle s
+lich e
+licht s
+lid s
+lieb s
+lied s
+lief s
+lieg s
+lieh s
+lies s
+lieá s
+lift s
+lig e
+liga s
+lik”r s
+lila s
+limonade s
+limousine s
+lind s
+lineal s
+linear s
+ling u
+linguist s
+linie s
+linien sa 2 4
+linig s
+link s
+linoleum s
+linse s
+lippe s
+lisch eu
+lispel s
+list s
+liter s
+literatur s
+litt s
+liturg s
+livr sa 2
+lizenz s
+lob s
+loch s
+lock s
+loden s
+log u
+loggia s
+logik s
+logisch s
+loh s
+lohn s
+lok s
+lokal s
+lokomotiv s
+los s
+losch u
+lot s
+lotto s
+l”b s
+l”ch s
+l”ck s
+l”ffel s
+l”hn s
+l”s s
+l”sch s
+l”t s
+l”w s
+lud s
+luft s
+luke s
+lump s
+lung e
+lunge s
+lupe s
+lust s
+lutsch s
+luv s
+luxuri”s s
+luxus s
+lcke s
+lft s
+lg s
+lmmel s
+lys e
+lyt e
+mach s Endung -m gestrichen!
+madonna s
+mag s
+magazin s
+magd s
+magistrat sa 2 4
+magnet sa 2
+magneto sa 2
+mahagoni s
+mahd s
+mahl s
+mahn s
+mai s
+majest s
+majoran s
+makel s
+makkaroni s
+makler s
+mal s
+malus s
+malz s
+man s
+management s
+managen s
+manager s
+manch s
+mand s
+manege s
+mang s
+mangel s
+manifest s
+manipulation s
+manipulier s
+mann s
+man”v s
+mansarde s
+manschette s
+mantel s
+manu s
+manuell s
+mappe s
+marder s
+margarine s
+marginal s
+marionett s
+mark s
+markier s
+markise s
+markt s
+marmelade s
+marmor s
+marsch s
+marter s
+marzipan s
+masch s
+maschin s
+maser s
+mask s
+mass s
+masse s
+mast s
+maá s
+matador s
+match s
+mater s
+material s
+materie s
+mathematik s
+mathematisch s
+matratze sa 2 5
+matrikel sa 2 5
+matrix sa 2
+matrize sa 2 5
+matsch s
+matura s
+mauer s
+maul s
+maurer s
+maus s
+maut s
+maxim s
+maximal s
+maximum s
+mayonnaise sa 2 5
+m„ch s
+m„dchen s
+m„del s
+m„dl s
+m„h s
+m„ngel s
+m„nn s
+m„ntel s
+m„rchen s
+m„rkte s
+m„rtyrer s
+m„rz s
+m„st s
+m„á s
+m„us s
+mechan s
+mecker s
+medaille s
+medaillon s
+medial s
+medien s
+medikament s
+medium s
+medizin s
+meer s
+mehl s
+mehr s
+meid s
+meier s
+meile s
+mein s
+meind s
+meise s
+meist s
+meiáel s
+meld s
+melk s
+melod s
+melone s
+menagerie s
+meng s
+mensch s
+ment e
+mental s
+menu s
+men s
+merk s
+merz s
+mess s
+messen s
+messer s
+messing s
+meá s
+meta vb
+metall s
+metapher s
+meteor s
+meteoro s
+meter s
+method s
+metr sa 2
+metropol sa 2
+mett s
+metz s
+meut s
+mich s
+mied s
+mieden s
+mien s
+mies s
+miet s
+mikro sa 2
+milch s
+mild s
+milit s
+milk u
+milli vn
+milliarde s
+million s
+milz s
+mind s -- ersetzt minder und mindest
+mine s
+mineral s
+mini s
+miniatur s
+minimal s
+minimum s
+minister s
+ministerium s
+minus s
+minute s
+mint s
+minz s
+mir b
+misch s
+miser s
+mismus e
+misse s
+mission s
+missionar s
+mist s
+miá vb
+mit vo
+mitt s
+mittag s
+mitter s
+mittler s
+mittwoch s
+mix s
+mobil s
+mobilit„t s
+mocht s
+mode d -
+modell s
+moder s - ersetzen gemeinsam "mod"
+modern d -
+modi s
+modifikation s
+modifizier s
+modr s -
+modul s
+modular s
+modus s
+mogel s
+mohn s
+mohr s
+mokka s
+molk s
+moll s
+moment s
+momentan s
+monat s
+mond s
+monitor s
+mono vd
+mont s
+montag s
+monument s
+moor s
+moos s
+moped s
+mops s
+moral s
+morast s
+morator s
+mord s
+morg s
+morgen s
+moritat s
+morph s
+morpho v
+morsch s
+mosaik s
+most s
+motiv s
+motor s
+motte s
+m”bel s
+m”bl s
+m”cht s
+m”g s
+m”nch s
+m”rder s
+m”rtel s
+m”we s
+mucks s
+muff s
+mulde s
+muli s
+mull s
+multi s
+multiplikand sa 3 5
+multiplikat sa 3 5
+mumie s
+mumps s
+mund s
+munition s
+munkel s
+munter s
+mure s
+murks s
+murmel s
+murr s
+mus s
+muschel s
+muse s
+museum sa 2 4
+musik s
+musikal s
+musiz s
+muskel s
+muskulatur s
+muskul”s s
+muster s
+muá s
+muáe s
+mut s
+mutter s
+mcke s
+md s
+mh s
+mll s
+mnd s
+mnz s
+mrb s
+mrr s
+mss s
+má s
+máte s
+mt s
+mtz s
+myst s
+mysteri s
+mystif s
+mythen s
+mythisch s
+mythos s
+n jfigw
+nabe s
+nabel s
+nach vo
+nachdem b
+nacht s
+nacken s
+nackt s
+nadel s
+nadel”hr sa 2 5
+nag s
+nah s
+nahezu s
+nahm s
+naiv s
+nam s
+namentlich s
+nannt s
+nano vn
+narb s
+narkose s
+narr s
+narzisse s
+nas s
+nasch s
+naá s
+nation s
+national s
+natter s
+natur s
+natr s
+n„chst s
+n„cht s
+n„h s
+n„m s
+n„rr s
+n„rrisch s
+n„s s
+nd p
+nebel s
+neben s
+nebenbei s
+neblig s
+nebst s
+neck s
+neffe s
+negativ s
+neger s
+negrid sa 2
+nehm s
+neid s
+neig s
+nein s
+nelke s
+nenn s
+neon s
+nephritis sa 2 6
+nerv s
+nerv”s s
+nessel s
+nest s
+nett s
+netto s
+netz s
+neu s
+neugierde s
+neun s
+neuralg sa 4
+neuro v
+neutral sa 3
+neutrum sa 3
+nicht s
+nick s
+nie s
+nieder s
+niedr d
+niere s
+niet s
+nikolaus s
+nikotin s
+nil s
+nimm s
+nipp s
+nirgend s
+nirgendwo s
+nis e
+nische s
+nisse e
+nist s
+niveau s
+nixe s
+nobel s
+noch s
+nock s
+nom s
+nommen d
+nonne s
+nord s
+norm s
+normal s
+nostalg sa 4
+not s
+notar s
+notiz s
+nougat s
+novell s
+november s
+n”rd s
+n”rg s
+n”t s
+ns wg
+nudel s
+nugat s
+nuklear sa 2
+null s
+numer s
+numerier s
+numerisch s
+nummer s
+nun o
+nunft s
+nur o
+nuá s
+nut s
+nutz s
+nutzer s
+nchter s
+nnft s
+nster s
+ntz s
+nylon s
+oase s
+ob o
+obacht sa 2
+obdach s
+oben s
+ober s
+obig s
+objekt s
+oblate s
+obmann s
+oboe s
+obschon s
+obst s
+obwohl b
+ochs s
+ocker s
+oder b
+ofen s
+offen s
+offiz s
+offizier s
+oft s
+ohn s
+ohr s
+oktober s
+oliv s
+olymp s
+oma s
+omelett s
+omnibus s
+onkel s
+opa s
+oper s
+operat s
+operette s
+operier s
+opfer s
+opti s
+optik s
+option s
+opus s
+or e
+orange s
+orchester s
+ord s
+ordentlich s
+organ s
+organis s
+organisation s
+organisier s
+orgel s
+orientier s
+original s
+originell s
+orium e
+orkan s
+ornament s
+ort s
+ortho vn
+ost s
+oster s
+otter s
+oval s
+ozean s
+”d s
+”fen s
+”ffentlich s
+”ffne s
+”ffnung s
+”ft s
+”hr s
+”ko vn
+”l s
+”r e
+”rt s
+”rtlich s
+”s e
+”se s
+”st s
+paar s
+pacht s
+pack s
+padd s
+paket s
+palais s
+palast s
+palaver s
+paletot s
+palett s
+palm s
+pan s
+paneel s
+panorama sa 3
+pansch s
+pantoffel s
+pantsch s
+panzer s
+papa s
+papagei s
+papier s
+papp s
+paprika sa 2
+papst s
+par b
+para v
+parad s
+paradies s
+parallaxe sa 3
+parallel sa 3
+pardon s
+parfum s
+parfm s
+parier s
+parit s
+park s
+parlament s
+part s
+partei s
+parterre s
+partie s
+partizip s
+partner s
+party s
+parzell s
+pasch s
+pass s
+passable sa 3 5
+passage s
+passagier s
+passier s
+pasta s
+paste s
+pastet s
+pasteurisier s
+pastor s
+paá s
+pat s
+patent s
+patho v
+patient s
+patron sa 2
+patsch s
+patschen s
+patz s
+pauk s
+paus s
+pauschal s
+pause s
+pavian s
+pavillon s
+p„chter s
+p„ck s
+p„dagog s
+p„pst s
+p„rchen s
+pech s
+pedal s
+pedit s
+pegel s
+pein s
+peitsch s
+pelikan s
+pelz s
+pend s
+pension s
+pensum s
+per vb
+perfekt s
+pergament s
+period sa 2 4
+peripher s
+perl s
+perlon s
+permanent s
+perplex sa 3
+person s
+personal s
+pers”n s
+percke s
+pessim s
+pest s
+petersil s
+petrol sa 2
+petroleum s
+pfad s
+pfahl s
+pfand s
+pfanne s
+pfarr s
+pfau s
+pf„nd s
+pf„nde s
+pfeffer s
+pfeif s
+pfeil s
+pfennig s
+pferd s
+pfiff s
+pfingst s
+pfirsich s
+pflanz s
+pflaster s
+pflaume s
+pfleg s
+pflicht s
+pflock s
+pflog u
+pflug s
+pflck s
+pflg s
+pfort s
+pfosten s
+pfote s
+pf”rt s
+pfropf s
+pfui s
+pfund s
+pfusch s
+pftze s
+phantas s
+phantast s
+phantom s
+phase s
+philo s
+phon s
+phor e
+photo s
+photograph sa 3 5
+phys s
+physio v
+pianino s
+pianist s
+piano s
+pick s
+piekfein s
+piep s
+piesack s
+pigment s
+pik s
+pilger s
+pille s
+pilot s
+pilz s
+pingpong s
+pinguin s
+pink s
+pinne s
+pinsel s
+pinupgirl sa 3 5
+pinzette s
+pionier s
+pirat s
+pirouette s
+pirsch s
+piste s
+pistol s
+pittoresk s
+plafond s
+plag s
+plagiat s
+plakat s
+plakette s
+plan s
+planet s
+planke s
+plankton s
+plansch s
+plantage s
+plapper s
+plasma s
+plast s
+plastik s
+plateau s
+platin s
+platitde s
+platonisch s
+platsch s
+platt s
+platz s
+plauder s
+plausch s
+plausibel s
+plazet s
+plazier s
+pl„d s
+pl„doyer s
+pl„n s
+pl„rr s
+pl„tscher s
+pl„tt s
+pl„tz s
+plebej s
+plebiszit sa 3 5
+plebs s
+pleite s
+plenar s
+plenum s
+pleuel s
+plexi s
+plissee s
+plizier s
+plomb s
+plos s
+pl”tzlich s
+plump s
+plunder s
+plunze s
+plural s
+plus s
+plnder s
+plsch s
+pneu s
+pneumat s
+poch s
+pock s
+podest s
+podex s
+podium s
+poem s
+poet s
+pokal s
+poker s
+pol s
+polar s
+polem s
+polen s
+police s
+poliklin sa 4
+polio s
+polit s
+politur s
+poliz s
+polizei s
+polizze s
+polka s
+pollen s
+polster s
+polter s
+poly vn
+polygam s
+polygon s
+polymer s
+polynom s
+polyp s
+pomad s
+pommes s
+pomp s
+ponton s
+pony s
+pool s
+pop s
+popul s
+pore s
+porno s
+por”s s
+port s
+portal s
+portefeuille s
+porti s
+porto s
+portrait s
+porzellan s
+pos s
+posaune s
+position s
+positiv s
+poss s
+post s
+postillion s
+postulat s
+potent s
+potenz s
+powidl s
+p”bel s
+p”kel s
+p”nal s
+p”st s
+pracht s
+pragmat s
+prahl s
+prakt s
+praktikabl sa 4 8
+prall s
+prang s
+pranke s
+prass s
+prassel s
+praxis s
+pr„cht s
+pr„dikat s
+pr„g s
+pr„gnant sa 3
+pr„lat s
+pr„mie s
+pr„par s
+pr„sent s
+pr„senz s
+pr„sident s
+pr„zis s
+predig s
+preis s
+preiserh”hung sa 5 7
+prek„r s
+prell s
+press s
+preá s
+prickel s
+pries s
+priester s
+prim s
+prima s
+primitiv s
+prinz s
+prinzessin s
+prinzip s
+priorit„t s
+prise s
+pritsche s
+privat s
+privileg s
+pro vb
+prob s
+probabil s
+problem sa 3
+produkt s
+produzent s
+profess s
+professor s
+profil s
+prognos sa 3
+programm sa 3
+programmende sa 3 8
+progress s
+progreá s
+projekt s
+projektil s
+projizier s
+promen s
+prompt s
+propag s
+propaganda s
+propeller s
+prophet s
+prophezei sa 3 6
+proporz s
+prospekt sa 3
+prothese s
+protokoll s
+protz s
+proviant s
+provinz s
+provis s
+prozedur s
+prozent s
+prozess s
+prozeá s
+prunk s
+prf s
+prgel s
+pseudo s
+psych s
+psycho s
+publik sa 2
+publikum sa 2
+publiz sa 2
+pudding s
+pudel s
+puder s
+puff s
+puffer s
+pullover sa 4
+puls s
+pult s
+pulver s
+pump s
+punkt s
+pupille s
+pupp s
+pur s
+purpur s
+purzel s
+pute s
+putz s
+puzzle s
+pnkt s
+pree s
+pyjama s
+pyknisch sa 2
+pyramide s
+quader s
+quadrat sa 3
+quadrier sa 3
+quak s
+qual s
+qualit s
+quant s
+quantit s
+quart s
+quartal s
+quarz s
+quasi s
+quast s
+quatsch s
+qu„l s
+queck s
+quell s
+quelle s
+quer s
+querfeldein sa 4 8
+quetsch s
+quick s
+quiek s
+quietsch s
+quill u
+quirl s
+quitt s
+quiz s
+quoll u
+quot s
+r wg
+rabatt s
+rabe s
+rabiat s
+rach d
+racker s
+rad s
+radikal s
+radio s
+radius s
+raff s
+raffin s
+rag s
+rahm s
+raiffeisen sa 5 7
+rain s
+rakete s
+ramm s
+rampe s
+ramsch s
+rand s
+randalier s
+rang s
+rank s
+rann s
+ranz s
+rapid s
+rappe s
+raps s
+rar s
+ras s
+rasch s
+raspel s
+rat s
+ratte s
+raub s
+rauch s
+rauf s
+rauh s
+raum s
+raunz s
+raupe s
+raus vb
+rausch s
+r„ch s
+r„d s
+r„hm s
+r„nd s
+r„t s
+r„uber s
+r„ucher s
+r„ud s
+r„um s
+r„usch s
+r„usper s
+re v
+reag s
+real s
+realisation s
+realisier s
+realistisch s
+reb s
+rebe s
+rebeln s
+rechen s
+recherch s
+rechn s
+recht s
+reck s
+recorder s
+red s
+redakt s
+reduz s
+reell s
+refer s
+reflekt sa 2
+reflex sa 2
+refrain sa 2
+reg s
+regal s
+regatta s
+regier s
+regiment s
+regisseur s
+registrat sa 2 4
+registrier sa 2 4
+reglement sa 2
+regress sa 2
+regreá sa 2
+regul s
+reh s
+rehabilit s
+reib s
+reich s
+reif s
+reigen s
+reih s
+reim s
+rein s
+reis s
+reiá sa 4
+reiáaus s
+reit s
+reiz s
+reklam sa 2
+rekord s
+rektor s
+relais n
+relat s
+relativ s
+relevant s
+relig s
+religi”s s
+remis s
+remp s
+renk s
+renn s
+renov s
+rent s
+rentab s
+rentabilit„t s
+rentner s
+reparatur s
+reparier s
+reptil s
+republik sa 2 4
+reserv s
+reservier s
+resonanz s
+respekt sa 2
+rest s
+restaur s
+resultat s
+resultier s
+retour s
+retrospektiv sa 2 5
+rett s
+rettich s
+reu s
+revanch s
+revers s
+revolt s
+revolut s
+revolver s
+rezept s
+rhabarber s
+rhetor s
+rheuma s
+rheumatisch s
+rhododendron sa 5 8
+rhythm s
+rhythmus s
+ribisel s
+rich e
+richt s
+rieb s
+riech s
+rief s
+rieg s
+riem s
+ries s
+riet s
+rill s
+rind s
+ring s
+ringsum sa 5
+rinn s
+ripp s
+rips s
+risiko s
+riskant s
+riskier s
+riss s
+rist s
+riá s
+ritt s
+ritz s
+robe s
+roboter s
+robust s
+roch s
+rock s
+rod s
+rode s
+rodel s
+rogen s
+roggen s
+roh s
+rohr s
+roll s
+roman s
+ronn s
+rosa s
+rose s
+rosig s
+rosin s
+rost s
+roá s
+rot s
+rotz s
+route s
+r”ch s
+r”hr s
+r”ll s
+r”m s
+r”ntgen s
+r”s s
+r”t s
+rubrik sa 2
+ruch s
+ruck s
+rudel s
+ruder s
+ruf s
+ruh s
+ruin s
+rum s
+rumor s
+rump s
+rumpf s
+rund s
+rung d
+runz s
+rupf s
+ruá s
+rute s
+rutsch s
+rb s
+rck s
+rd s
+rg s
+rhm s
+rhr s
+rlps s
+rmpf s
+rpel s
+rsch s
+rssel s
+rst s
+rtt s
+s hfwg
+saal s
+saar s
+saat s
+sach s
+sack s
+safari s
+saft s
+sag s
+sah s
+saison s
+saite s
+sakko s
+sakrament sa 2
+sakristei sa 2
+sal e
+salamander s
+salami s
+salat s
+salb s
+saldo s
+salon s
+salto s
+salut s
+salz s
+sam e
+same s
+samm s
+sammen s
+samstag sa 4
+samt s
+sanatorien s
+sanatorium s
+sand s
+sandale s
+sandwich s
+sanft s
+sang s
+sanier s
+sanit„r s
+sanit„t s
+sank s
+sann s
+sardelle s
+sardine s
+sarg s
+sasse s
+saá s
+satan s
+satellit s
+satt s
+satz s
+sau s
+sauber s
+sauce s
+sauciere s
+sauer s
+sauf s
+saug s
+saum s
+sauna s
+saus s
+saxophon s
+s„ s
+s„bel s
+s„ch s
+s„en s
+s„g s
+s„le s
+s„mtlich s
+s„nft s
+s„nger s
+s„t s
+s„tt s
+s„tz s
+s„uber s
+s„uer s
+s„uf s
+s„ug s
+s„ule s
+s„um s
+s„ure s
+s„usel s
+schab s
+schablone sa 4
+schach s
+schacht s
+schachtel s
+schad s
+schaf s
+schaff s
+schaft s
+schal s
+schale s
+schall s
+schalt s
+scham s
+schand s
+schank s
+schanz s
+schar s
+scharf s
+schatt s
+schattier s
+schatulle s
+schatz s
+schau s
+schauf s
+schauk s
+schaum s
+sch„big s
+sch„d s
+sch„fer s
+sch„ft s
+sch„hl s
+sch„l s
+sch„m s
+sch„nd s
+sch„rf s
+sch„tz s
+sch„um s
+scheck s
+scheffel s
+scheib s
+scheid s
+schein s
+scheit s
+schell s
+schelm s
+schelten b
+schema s
+schematisch s
+schemel s
+schenk s
+schepper s
+scher s
+scherbe s
+scherflein s
+scherz s
+scheu s
+scheuch s
+scheuá s
+schi s
+schicht s
+schick s
+schieb s
+schied s
+schief s
+schiel s
+schien s
+schieá s
+schiff s
+schikan s
+schild s
+schilf s
+schiller s
+schillernd s
+schilling s
+schilt u
+schimm s
+schimpanse s
+schimpf s
+schind s
+schinken s
+schirm s
+schirr s
+schizophren sa 4 6
+schlacht s
+schlack s
+schlaf s
+schlaff s
+schlag s
+schlamm s
+schlamp s
+schlang s
+schlank s
+schlau s
+schlauch s
+schl„cht s
+schl„f s
+schl„g s
+schl„ngel s
+schlecht s
+schleck s
+schlegel s
+schleich s
+schleier sa 6
+schleif s
+schleifenende sa 6 9
+schleim s
+schleiá s
+schlemm s
+schlender s
+schlenker s
+schlepp s
+schleuder s
+schleunig s
+schleus s
+schlich s
+schlief s
+schlieá s
+schliff s
+schlimm s
+schling s
+schlissen d
+schliá u
+schlitt s
+schlitz s
+schlosse s
+schloá s
+schlot s
+schlotter s
+schlucht s
+schluchz s
+schluck s
+schlug s
+schlummer s
+schlund s
+schlungen d
+schlupf s
+schluss s
+schluá s
+schlck s
+schlpf s
+schlrf s
+schlss s
+schmach s
+schmack s
+schmal s
+schmalz s
+schmarotz s
+schmarren s
+schmatz s
+schmaus s
+schm„chtig s
+schm„h s
+schmeck s
+schmeich s
+schmeiá s
+schmelz s
+schmerz s
+schmetter s
+schmied s
+schmieg s
+schmier s
+schmilz u
+schmink s
+schmirg s
+schmiss s
+schmiá s
+schmoll s
+schmolz s
+schmor s
+schmuck s
+schmugg s
+schmunzel s
+schmutz s
+schmck s
+schnabel s
+schnabulier s
+schnall s
+schnalz s
+schnapp s
+schnaps s
+schnarch s
+schnarr s
+schnatter s
+schnaub s
+schnauf s
+schnauz s
+schn„uz s
+schnecke s
+schnee s
+schnei s
+schneid s
+schneien sa 6
+schnell s
+schneuz s
+schnippisch s
+schnitt s
+schnitz s
+schnob s
+schnorchel s
+schn”rkel s
+schn”rks s
+schnuller s
+schnupf s
+schnuppe s
+schnupper s
+schnur s
+schnurr s
+schnurstracks sa 6
+schnff s
+schnr s
+schob s
+schock s
+schokolade s
+scholle s
+scholt s
+schon s
+schopf s
+schoppen s
+schor u
+schornstein s
+schossen s
+schoá s
+schote s
+schott s
+sch”n s
+sch”pf s
+schӇ s
+schraff s
+schrak u
+schrank s
+schraub s
+schr„g s
+schr„nk s
+schrebergarten s
+schreck s
+schrei s
+schreib s
+schreit s
+schrick u
+schrie s
+schrieb s
+schrift s
+schrill s
+schritt s
+schrocken d
+schroff s
+schrot s
+schr”pf s
+schrumpf s
+schub s
+schuf s
+schuft s
+schuh s
+schuko s
+schul s
+schuld s
+schulter s
+schund s
+schupp s
+schur s
+schurk s
+schurz s
+schussel s
+schuster s
+schuá s
+schutt s
+schutz s
+schchtern s
+schler s
+schr s
+schrf s
+schrz s
+schss s
+schtt s
+schtz s
+schwach s
+schwade s
+schwager s
+schwalbe s
+schwall s
+schwamm s
+schwan s
+schwand s
+schwang s
+schwank s
+schwanz s
+schwarm s
+schwarte s
+schwarz s
+schwatz s
+schw„ch s
+schw„ger s
+schw„nz s
+schw„nzel s
+schw„r s
+schw„rm s
+schw„rz s
+schw„tz s
+schweb s
+schwefel s
+schweif s
+schweig s
+schwein s
+schweiá s
+schweiz s
+schwel s
+schwell s
+schwemm s
+schwend s
+schwengel s
+schwenk s
+schwer s
+schwester s
+schwieg s
+schwiel s
+schwiele s
+schwierig s
+schwill u
+schwimm s
+schwind s
+schwing s
+schwips s
+schwirr s
+schwitz s
+schwoll s
+schwomm s
+schwor s
+schw”r s
+schwulst s
+schwund s
+schwung s
+schwur s
+schwl s
+sechs s
+sechzehn s
+sechzig s
+see s
+seel s
+segel s
+segen s
+segler s
+segn s
+seh s
+sehr s
+sei s
+seicht s
+seid s
+seif s
+seih s
+seil s
+sein s
+seit s
+sekret sa 2
+sekt s
+sekund s
+sekunde s
+selb d
+selbst n
+selch s
+selekt s
+selig s
+sellerie s
+selt s
+semant s
+semantik s
+semester s
+semi s
+seminar s
+semmel s
+send s
+senf s
+seng s
+senior s
+senk s
+senn s
+sensation s
+sense s
+sensor s
+separat s
+september s
+sequent s
+sequenz s
+serie s
+serien sa 2 4
+seri”s s
+serpentine s
+service s
+servier s
+serviette sa 3 5
+sess s
+sessel s
+seá s
+set es -- wozu als Endung?
+setz s
+seuch s
+seufz s
+sex s
+shampoo s
+shopping s
+shorts s
+show s
+sich b
+sichel s
+sicher s
+sicht s
+sicker s
+sie b
+sieb s
+sieben s
+siech s
+sied s
+sieg s
+sieh s
+signal sa 2
+signifik sa 2
+silb s
+silbentrenn sa 3 6
+silber s
+silbrig s
+silo s
+silvester s
+simpel s
+sims s
+simul s
+sind b
+sinfon s
+sing s
+sink s
+sinn s
+sintflut sa 4
+siphon s
+sippe s
+sirene s
+sirup s
+sitt s
+sittich s
+situation s
+sitz s
+skala s
+skandal s
+skelett s
+ski s
+skizz s
+sklave s
+skop s
+skript s
+slalom s
+slip s
+smaragd s
+so o
+socke s
+sockel s
+sod s
+soda s
+sodann s
+sodaá s
+sofa s
+soff s
+sofort s
+software sa 4
+sog s
+sogar b
+sohl s
+sohn s
+sol s
+solch s
+soldat s
+soll s
+sollen s
+solo s
+somit b
+sommer s
+sonate s
+sonder s
+sonn s
+sonntag s
+sonst s
+soph s
+sopran sa 2
+sorg s
+sort s
+sortiment s
+soáe s
+sott s
+souvenir s
+sowie s
+sowjet s
+sozial s
+sozio v
+s”hn s
+spachtel s
+spagat s
+spaghetti sa 3
+spalier s
+spalt s
+span s
+spange s
+spann s
+spar s
+spargel s
+spass s
+spassig s
+spaá s
+spat s
+spatz s
+spazier s
+sp„h s
+sp„lt s
+sp„nn s
+sp„rlich s
+sp„t s
+specht s
+speck s
+spedit s
+speer s
+spei s
+speich s
+speicher s
+speien sa 4
+speis s
+spektak s
+spektr sa 4
+spektra sa 4
+spektro sa 4
+spektrum sa 4
+spekul s
+spend s
+spengler s
+spenst s
+sperling s
+sperr s
+spesen s
+spezial s
+spezialis s
+speziell sa 3 5
+spezifikation s
+spezifisch s
+spezifizier s
+spick s
+spie u
+spiegel s
+spiegelei sa 4 7
+spiel s
+spieá s
+spike s
+spinat s
+spindel s
+spinn s
+spion s
+spiral s
+spiritus s
+spital s
+spit„ler sa 3
+spitz s
+spleiá s
+spliss d
+spliá u
+splitt s
+sponn d
+spontan s
+sporn s
+sport s
+spott s
+sp”tt s
+sprach s
+sprang s
+spray s
+spr„ch s
+sprech s
+spreiz s
+spreng s
+sprenkel s
+spreu s
+sprich s
+sprieá s
+spring s
+springer s
+sprint s
+sprit s
+spritz s
+sprochen s
+spross s
+sproá s
+spr”d s
+sprӇ s
+spruch s
+sprud s
+sprudel s
+sprung s
+sprch s
+sprh s
+sprng s
+spuck s
+spuk s
+spul s
+spund s
+spur s
+spl s
+spr s
+st kig
+staat s
+stab s
+stabil s
+stach s
+stachel s
+stachl s
+stadel s
+stadion s
+stadium s
+stadt s
+stahl s
+stall s
+stalt s
+stamm s
+stampf s
+stand s
+standard s
+stang s
+stank s
+stanniol s
+stanz s
+stap s
+stapf s
+star s
+starb s
+stark s
+starr s
+start s
+stat s
+statik s
+station s
+statisch s
+statistik s
+statistisch s
+statt s
+statu s
+statue s
+status s
+stau s
+staub s
+stauch s
+staud s
+st„b s
+st„dt s
+st„hl s
+st„mm s
+st„nd s
+st„nker s
+st„rk s
+st„tt s
+steak s
+stech s
+steck s
+steg s
+steh s
+steif s
+steig s
+steil s
+stein s
+stell s
+stellung s
+stelz s
+stemm s
+stempel s
+stengel s
+steno n
+stephan s
+stepp s
+steppe s
+sterb s
+stereo s
+steril s
+stern s
+sterz s
+stet s
+steuer s
+stich s
+stick s
+stieb s
+stief s
+stiefel s
+stieg s
+stiehlt s
+stiel s
+stier s
+stieá s
+stift s
+stil s
+still s
+stimm s
+stink s
+stipend s
+stirb s
+stirn s
+stob s
+stoch s
+stock s
+stoff s
+stohl s
+stoisch s
+stollen s
+stolper s
+stolz s
+stop s
+stopf s
+stopp s
+storb s
+storch s
+stoá s
+stotter s
+st”ber s
+st”ck s
+st”hn s
+st”psel s
+st”r s
+stӇ s
+straf s
+straff s
+strahl s
+stramm s
+stramp s
+strand s
+strang s
+strapaz s
+straá s
+strateg s
+strauch s
+strauá s
+str„f s
+str„hn s
+str„á s
+str„ub s
+str„uch s
+str„uá s
+streb s
+streck s
+streich s
+streif s
+streik s
+streit s
+streng s
+stress s
+streá s
+streu s
+strich s
+strichlier s
+strick s
+striegel s
+strieme s
+stritt s
+stroh s
+strolch s
+strom s
+stroph s
+strotz s
+str”m s
+strudel s
+struktur s
+strumpf s
+strunk s
+strupp s
+struwwelpeter s
+strmpf s
+strpp s
+stube s
+stud s
+student s
+studio s
+studium s
+stuf s
+stuhl s
+stulpe s
+stumm s
+stumpf s
+stund s
+stunk s
+sturm s
+sturz s
+stute s
+stutz s
+stb s
+stberl s
+stck s
+stlp s
+stmper s
+stmpf s
+stnd s
+strm s
+strz s
+sttz s
+subtrahend sa 3
+subtrahier sa 3
+subtraktion sa 3
+subvention s
+such s
+sucht s
+sud s
+suggerier s
+suggest s
+sukzess s
+summ s
+sumpf s
+super n
+suppe s
+surr s
+suspekt sa 3
+suspendier sa 3
+suspens sa 3
+scht s
+sd s
+shn s
+smpf s
+snd s
+sá s
+swimming s
+symbol s
+symbolik s
+symbolis s
+symbolisch s
+symmetr sa 3 5
+sympath s
+symphon s
+sympos s
+synchron sa 3
+syndik s
+syndikus s
+synonym sa 3
+syntax s
+synthese s
+system s
+systematik s
+systematisch s
+systematisier s
+szene s
+t pig
+tabak s
+tabell s
+tabernakel s
+tablett sa 2
+tacho s
+tadel s
+tafel s
+tag s
+taill s
+takt s
+tal s
+talent s
+taler s
+talg s
+talisman s
+talk s
+tandem s
+tangent s
+tangier s
+tank s
+tann s
+tante s
+tanz s
+tapet s
+tapezier s
+tapfer s
+tapp s
+tara s
+tarif s
+tarn s
+tasche s
+tasse s
+tast s
+tastatur s
+tat s
+tatsache s
+tatze s
+tau s
+taub s
+tauch s
+tauf s
+taug s
+tausch s
+tausend s
+tax s
+taxi s
+t„fel s
+t„g s
+t„nz s
+t„sch s
+t„t s
+t„tsch s
+t„ub s
+t„uf s
+t„usch s
+te g
+tea 0
+team s
+technik s
+techniker s
+technisch s
+techno s
+teddy s
+tee s
+teich s
+teig s
+teil s
+teint s
+tel e
+tele n
+telex s
+teller s
+tempel s
+tempera s
+tempo s
+ten g
+tendenz s
+tenne s
+tennis s
+tenor s
+teppich s
+term s
+termino s
+terpentin s
+terrasse s
+terrazzo s
+terror s
+terti s
+test sg
+tet g
+teuer s
+teuf s
+text s
+textil s
+theater s
+theist sa 3
+thema s
+themen s
+theo s
+theoretisch s
+theorie s
+therap s
+thermal s
+thermo s
+thron s
+thunfisch s
+tick s
+tief s
+tiegel s
+tier s
+tiger s
+tilg s
+tinte s
+tip s
+tipp s
+tipptopp s
+tirol s
+tisch s
+titel s
+tob s
+tochter s
+tod s
+toilett s
+toler s
+toll s
+tolpatsch s
+tomate s
+tombola s
+ton s
+topf s
+topfit s
+topo v
+tor s
+torf s
+torkel s
+tos s
+tot s
+total s
+toto s
+tour s
+t”chter s
+t”dlich s
+t”lpel s
+t”n s
+t”pf s
+t”richt s
+t”s s
+t”t s
+trab s
+tracht s
+tradition s
+traf s
+trafo s
+trag s
+trag”d s
+train s
+trainer s
+training s
+trakt s
+tram s
+trampel s
+tramway s
+tran s
+trank s
+transfer s
+transit s
+transparent s
+transparenz s
+transport s
+transzend s
+transzendent s
+trapez s
+trasse s
+trat s
+tratsch s
+trau s
+traube s
+traum s
+traurig d -- killed "trau-r-..." durch "r dg"-Eintrag
+travers s
+tr„cht s
+tr„g s
+tr„ller s
+tr„n s
+tr„nk s
+tr„uf s
+tr„um s
+treff s
+treib s
+trend s
+trenn s
+trepp s
+tresor s
+tret s
+treu s
+tribne s
+trichter s
+trick s
+trieb s
+trief s
+triff s
+trift s
+trikot s
+triller s
+trink s
+trio s
+trippel s
+tritt s
+triumph s
+trock s
+troff u
+troffen s
+trog s
+tromm s
+trompete s
+trop s
+tropf s
+troph„e s
+trost s
+trott s
+trotz s
+tr”d s
+tr”pf s
+tr”st s
+trubel s
+trudeln s
+trug s
+truhe s
+trunk s
+trupp s
+trut s
+trb s
+trg s
+trmmer s
+tu u
+tube s
+tuberkulose s
+tuberkul”s s
+tuch s
+tuend s
+tugend s
+tulpe s
+tum e
+tummel s
+tumult s
+tunell s
+tunk s
+tunnel s
+tupf s
+turbine s
+turm s
+turn s
+tusch s
+tut s
+tch s
+tck s
+tft s
+tm e
+tmmel s
+tmpel s
+tr s
+trk s
+trm s
+tte s
+typ s
+typhus s
+tyrann s
+ufer s
+uhr s
+uhu s
+ul„r e
+ulme s
+ultimativ s
+ultimatum s
+ultimo s
+ultra sa 2
+um vo
+ums b
+umso s
+un v
+und o
+ung e
+ungetm s
+uni s
+uniform s
+universit„t s
+uns s
+unten b
+unter vd
+unterdes s
+ur vbe
+urbar s
+urne s
+utop s
+b s
+ber vo
+brig s
+ppig s
+vagabund s
+vakuum s
+valid s
+vall s
+vanille s
+vari s
+variable sa 2 5
+vater s
+v„ter s
+veilchen s
+vektor s
+vene s
+ventil s
+ver v
+veranda s
+verb s
+verdirb u
+verdutzt s
+veredlung sa 3
+verein sa 3
+verflixt sa 3
+vergaá s
+vergess s
+vergiá u
+verletz s
+verleumd s
+verlier s
+verlor s
+vers d -- kill vers-t-eckt
+version s
+verteidig s
+vertrackt sa 3
+verworr u -- fr verworren usw.
+vetter s
+viadukt s
+video n
+vieh s
+viel s
+vier s
+villa s
+villen s
+violett s
+violin s
+viper s
+viren s
+virtuell s
+virtuos s
+virulent s
+virus s
+vision s
+visit s
+visualisier s
+vitamin s
+vize s
+vogel s
+vokabel s
+vokabular s
+vokal s
+volk s
+voll s
+volumen s
+vom b
+von o
+vor vo
+vorder s
+vorn n
+vorne n
+v”gel s
+v”lk s
+v”ll s
+vulkan s
+waag s
+wabe s
+wach s
+wacholder s
+wachs s
+wackel s
+wade s
+waffe s
+waffel s
+wag s
+waggon s
+wahl s
+wahn s
+wahr s
+waid s
+wais s
+wal s
+wald s
+walk s
+wall s
+walt s
+walz s
+wand s
+wander s
+wange s
+wank s
+wann s
+wanz s
+wapp s
+war s
+warb s
+warf s
+warm s
+wart s
+warum s
+warze s
+was s
+wasch s
+wasser s
+wate s
+watschel s
+watt s
+w„ch s
+w„g s
+w„hl s
+w„hn s
+w„hr s
+w„hrend s
+w„ld s
+w„lt s
+w„lz s
+w„nd s
+w„re s
+w„rm s
+w„rt s
+w„sch s
+w„sser s
+web s
+wechsel s
+wechselnd s
+wechsl s
+weck s
+wedel s
+weder s
+weg s
+wegen s
+weh s
+wehr s
+wehtun s
+weib s
+weich s
+weid s
+weiger s
+weih s
+weil s
+wein s
+weis s
+weiá s
+weit s
+weiter s
+weithin sa 4
+weizen s
+welch s
+welk s
+well s
+welt s
+wem b
+wen b
+wend s
+wenig s
+wenigsten s
+wenn s
+wer b
+werb s
+werd s
+werf s
+werg s
+werk s
+werkstatt s
+wermut s
+werner b
+wert s
+wes s
+wesen s
+wesend s
+wesentlich s
+weshalb s
+wespe s
+west s
+weswegen s
+wett s
+wetz s
+wich s
+wichs s
+wicht s
+wickel s
+wicklung s
+widder s
+wider s
+widm s
+widrig s
+wie o
+wieg s
+wieher s
+wien s
+wierig s
+wies s
+wiesel s
+wieso s
+wieviel s
+wild s
+wildbret sa 4
+will s
+wimmel s
+wimmer s
+wimpel s
+wimper s
+wind s
+wink s
+winsel s
+winter s
+winz s
+wipfel s
+wir b
+wirb u
+wirbel s
+wird b
+wirf s
+wirk s
+wirr s
+wirst b
+wirt s
+wisch s
+wispel s
+wiss s
+wiá s
+witt s
+witter s
+witwe s
+witwer s
+witz s
+wo vo
+wob u
+woben n
+woche s
+wochenende sa 2 6
+wog s
+wohl s
+wohn s
+wolf s
+wolk s
+woll s
+wom”glich s
+wonne s
+wor o
+worb s
+worden d
+worfen d
+wort s
+w”ch s
+w”chentlich s
+w”hn s
+w”lb s
+w”lk s
+w”rt s
+w”rter s
+wrack s
+wrang u
+wring s
+wuch s
+wuchs s
+wulst s
+wund s
+wunder s
+wunken d
+wunsch s
+wurde s
+wurf s
+wurm s
+wurst s
+wurzel s
+wusch s
+wuschel s
+wust s
+wuát u
+wut s
+wchs s
+whl s
+wnsch s
+wrd s
+wrf s
+wrg s
+wrm s
+wrst s
+wrz s
+wst s
+wát s
+wt s
+xylophon s
+yankee s
+ypsilon s
+zack s
+zag s
+zahl s
+zahm s
+zahn s
+zange s
+zank s
+zapf s
+zappel s
+zart s
+zauber s
+zaum s
+zaun s
+zaus s
+z„h s
+z„hl s
+z„hm s
+z„hn s
+z„nk s
+z„pf s
+z„rt s
+z„un s
+zebra sa 2
+zech s
+zeck s
+zeder s
+zeh s
+zehe s
+zehn s
+zehr s
+zeich s
+zeig s
+zeih s
+zeil s
+zeile s
+zeisig s
+zeit s
+zell s
+zellophan s
+zelt s
+zement s
+zensier s
+zensur s
+zenti v
+zentner s
+zentr sa 3
+zentral sa 3
+zentri sa 3
+zentrum sa 3
+zer v
+zeremonie s
+zerr s
+zettel s
+zeug s
+zicht s
+zick s
+ziege s
+ziegel s
+zieh s
+ziel s
+ziem s
+ziemlich s
+zier s
+zierde s
+ziffer s
+zig e
+zigarette s
+zigarre s
+zigeuner s
+zimmer s
+zimperlich s
+zimt s
+zink s
+zinn s
+zins s
+zipfel s
+zirka s
+zirkel s
+zirkul s
+zirkus s
+zirp s
+zisch s
+zitat s
+zither s
+zitier s
+zitrone sa 2
+zitter s
+zittrig s
+zivil s
+zivilisation s
+zivilisier s
+zog s
+zoll s
+zone s
+zoo s
+zopf s
+zorn s
+zott s
+zottel s
+z”g s
+z”ll s
+zu vo
+zuber s
+zucht s
+zuck s
+zucker s
+zug s
+zugeben s
+zum b
+zunge s
+zupf s
+zur b
+zurzeit s
+zusammengesetzt s
+zcht s
+zck s
+zg s
+znd s
+zngel s
+zrn s
+zwang s
+zwanzig s
+zwar b
+zw„ng s
+zweck s
+zwei s
+zweier sa 4
+zweif s
+zweifel s
+zweig s
+zwerchfell s
+zwerg s
+zwetsche s
+zwetschge s
+zwetschke s
+zwick s
+zwie v
+zwiebel s
+zwilling s
+zwing s
+zwinker s
+zwirn s
+zwischen s
+zwischendurch s
+zwist s
+zwitscher s
+zw”lf s
+zykl sa 2
+zyklus sa 2
+zylind s
+zyn s
+zypresse sa 2
diff --git a/obsolete/systems/sisisi/si3win/si3win.txt b/obsolete/systems/sisisi/si3win/si3win.txt
new file mode 100644
index 0000000000..d55b7df09b
--- /dev/null
+++ b/obsolete/systems/sisisi/si3win/si3win.txt
@@ -0,0 +1,24 @@
+Si3Win-Testumgebung fuer Windows
+--------------------------------
+
+Obwohl eine fortgeschrittenere Version in Entwicklung ist, haben wir
+uns wegen einiger Anfragen entschlossen, das Testprogramm "Si3Win"
+oeffentlich zur Verfuegung zu stellen.
+
+Dieses Testprogramm ist zur Verwendung mit Microsoft Windows 3.11
+und hoeher (auch Windows 95/98) geeignet. Zur Installation entpacken
+Sie die Datei si3win.zip in ein geeignetes neues Verzeichnis (zum
+Beispiel c:\si3win) und starten das Programm si3win.exe, das dann
+automatisch seine Konfigurationsdateien neu erzeugt.
+
+Eine kurze Dokumentation finden Sie auf den Web-Seiten der Abteilung
+fuer Algorithmen und Datenstrukturen, Institut fuer Computergraphik
+und Algorithmen, Technische Universitaet Wien:
+
+ http://www.ads.tuwien.ac.at/research/SiSiSi.html
+
+Fuer allfaellige Rueckmeldungen sind wir dankbar. Bitte wenden Sie sich
+an Gabriele Kodydek (kodydek@ads.tuwien.ac.at) oder Martin Schoenhacker
+(schoenhacker@ads.tuwien.ac.at).
+
+ Wien, am 18.10.2001
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch
new file mode 100644
index 0000000000..85179b9d47
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch
@@ -0,0 +1,71 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:31 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29128; Thu, 12 Aug 93 11:31:42 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9761; Thu, 12 Aug 1993
+ 11:29:25 EDT
+Date: Thu, 12 Aug 1993 11:29:23 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Cc: helmut@eichow.tuwien.ac.at
+Message-Id: <00970E8C.653CC200.9761@eichow.tuwien.ac.at>
+Subject: File: german_sty.cha
+Status: RO
+
+@x
+\gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlautlow{\def\"{\protect\newumlaut}}
+\gdef\newumlaut#1{\leavevmode\allowhyphens
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+@y
+% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}}
+
+%\gdef\umlautlow{\def\"{\protect\newumlaut}}
+
+\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}}
+
+\gdef\dirtyumlautlow#1{\if#1A{\discretionary
+{\kern 4321sp m\kern
+196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1O{\discretionary
+{\kern 4321sp m\kern
+214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1U{\discretionary
+{\kern 4321sp m\kern
+220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1a{\discretionary
+{\kern 4321sp m\kern
+228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1o{\discretionary
+{\kern 4321sp m\kern
+246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1u{\discretionary
+{\kern 4321sp m\kern
+252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1s{\discretionary
+{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{}
+{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi}
+
+
+\gdef\newumlaut#1{\leavevmode
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+@z
+
+@x
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}\allowhyphens}
+\gdef\highumlaut#1{\leavevmode\allowhyphens
+ \accent127 #1\allowhyphens}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\
+z@\ht\z@
+@y
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}}
+
+\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\
+z@\ht\z@
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch
new file mode 100644
index 0000000000..4c3e0c9e52
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch
@@ -0,0 +1,33 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:33 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29169; Thu, 12 Aug 93 11:33:32 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9765; Thu, 12 Aug 1993
+ 11:31:14 EDT
+Date: Thu, 12 Aug 1993 11:31:13 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Message-Id: <00970E8C.A685B5A0.9765@eichow.tuwien.ac.at>
+Subject: File: lplain_tex.cha
+Status: RO
+
+@x
+\def\"#1{{\accent"7F #1}}
+
+% LaTeX change: Make \t work in a moving argument.
+@y
+%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the
+following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut
+
+% LaTeX change: Make \t work in a moving argument.
+@z
+
+@x
+\input hyphen
+@y
+\input sihyphen
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch
new file mode 100644
index 0000000000..de25f540f8
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch
@@ -0,0 +1,32 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:32 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29132; Thu, 12 Aug 93 11:32:33 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9763; Thu, 12 Aug 1993
+ 11:30:15 EDT
+Date: Thu, 12 Aug 1993 11:30:14 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Message-Id: <00970E8C.837FA520.9763@eichow.tuwien.ac.at>
+Subject: File: plain_tex.cha
+Status: RO
+
+@x
+\def\"#1{{\accent"7F #1}}
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+@y
+% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by
+the following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut % for testing purposes excluded
+
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+@z
+
+@x
+\input hyphen
+@y
+\input sihyphen
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty
new file mode 100644
index 0000000000..9f3396a76c
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty
@@ -0,0 +1,432 @@
+%GERMAN
+% This is GERMAN.TEX or GERMAN.DOC or GERMAN.STY, Vers. 2.3c, 28 Aug 1990,
+% collected by H.Partl (TU Wien),
+% using ideas by W.Appelt, F.Hommes et al. (GMD St.Augustin),
+% T.Hofmann (CIBA-GEIGY Basel), N.Schwarz (Uni Bochum),
+% J.Schrod (TH Darmstadt), D.Armbruster (Uni Stuttgart),
+% R.Schoepf (Uni Mainz, Uni Heidelberg) and F.Mittelbach
+% (Uni Mainz, EDS Ruesselsheim), J.Knappen (Uni Mainz),
+% P.Breitenlohner (MPI Muenchen), and many others.
+%
+% DOCUMENT STYLE OPTION for writing german texts
+% with TeX version 2.x (Plain TeX) or with LaTeX version 2.09.
+%
+% It can be called via
+% \input german
+% or (with LaTeX) via
+% \documentstyle[german]{anystyle}
+%
+% This file conforms to the standard for "Einheitliche deutsche
+% TeX-Befehle" as proposed at the 6th Meeting of German TeX Users
+% in Muenster, October 1987. It is available from DANTE (the users
+% group of German speaking TeX users) at the Uni Heidelberg.
+%
+% Commands to be used by the end users:
+% "a for Umlaut-a (like \"a), also for all other vowels.
+% "s for sharp s (like \ss{}).
+% "ck for ck to be hyphenated as k-k.
+% "ff for ff to be hyphenated as ff-f, also for certain
+% other consonants.
+% "S for SS to be \uppercase{"s}
+% "A, "CK, "FF etc. uppercase versions of the above
+% "| to separate ligatures.
+% "- like \-, but allowing hyphenation in the rest of
+% the word.
+% "" like "-, but producing no hyphen sign.
+% "` or \glqq for german left double quotes (similar to ,,)
+% "' or \grqq for german right double quotes (similar to ``)
+% \glq for german left single quotes (similar to , )
+% \grq for german right single quotes (similar to ` )
+% "< or \flqq for french left double quotes (similar to <<)
+% "> or \frqq for french right double quotes (similar to >>)
+% \flq for french left single quotes (similar to < )
+% \frq for french right single quotes (similar to > )
+% \dq for the original quotes character (")
+% \selectlanguage{n} to switch to the language specified by n, which
+% should be one of the following command names:
+% \austrian \french \english \german \USenglish;
+% - this changes the date format, captions and (if
+% ``multilingual TeX''is installed) hyphenation.
+% \originalTeX to restore everything to the original settings
+% of TeX and LaTeX (well, almost everything).
+% \germanTeX to re-activate the german settings.
+%
+% Obsolete commands, provided for compatibility with existing
+% applications:
+% \3 for sharp s (like "s).
+% \ck for ck to be hyphenated as k-k (like "ck).
+% \setlanguage (if not defined, i.e. not with TeX 3.x) = \selectlanguage
+%
+% Lower level commands and features:
+% \umlautlow redefines the Umlaut accent such that the dots come
+% nearer to the letter and that hyphenation is enabled
+% in the rest of the word.
+% \umlauthigh restores \" to its original meaning.
+% \ss is \lccode'd to enable hyphenation.
+% \mdqon makes " an active (meta-) character that does the
+% pretty things described above.
+% \mdqoff restores " to its original meaning.
+% \dospecials,\@sanitize are extended to include the ".
+% \dateaustrian, \dategerman, \dateenglish, \dateUSenglish, \datefrench
+% redefine \today to use the respective date format.
+% \captionsgerman, \captionsenglish, \captionsfrench
+% switch to german, english or french chapter captions
+% and the like, resp. This will have an effect only
+% if the document style files use the symbolic names
+% \chaptername etc. instead of the original english
+% words.
+% \language a count that is set by \selectlanguage and can be used
+% by document style declarations like
+% \ifnum\language=\english .textengl.\else
+% \ifnum\language=\german .textgerm.\fi\fi
+% and/or by M.Ferguson's ``Multilingual T^eX''.
+%
+% Finally, \germanTeX is switched on.
+%
+% Notes:
+% This file can be used both with Plain TeX and with LaTeX and other
+% macro packages, and with the original TeX and LaTeX fonts. Usage
+% of german hyphenation patterns is recommended to accompany this
+% style file when writing german texts.
+% The file should be read in vertical mode only (usually at the
+% beginning of the document) to avoid spurious spaces.
+% \undefined must be an undefined control sequence.
+% Multiple calls of this file (e.g. at the beginning of each subfile)
+% will do no harm. Only the first call (i.e., if \mdqon is undefined)
+% performs all the definitions and settings.
+% The catcode of @ remains unchanged after processing of this file.
+% All definitions are global, the switching on of the german options
+% is local.
+% The commands \mdqon, \mdqoff, \originalTeX, \germanTeX, and
+% \selectlanguage are ``fragile'' with LaTeX and should not be used
+% within arguments of macro calls.
+% In Plain TeX, `\protect' should be \let to `\relax' normally and to
+% something like `\string' inside the arguments of `\write' or `\message'
+% (see LaTeX.TEX for all the details).
+% The command \umlautlow may need adaption to font parameters (see
+% comments there for details).
+% The commands \flqq, \frqq, \flq, \frq, and \datefrench in their
+% present forms do not work properly with all font sizes and styles,
+% they still require a better solution. A LaTeX-only solution might be
+% to use {\ly(}, {\ly(\kern-0.166em(}, {\ly)} etc., but this would not
+% work with Plain TeX.
+%
+
+% \ifundefined{mdqon} or \mdqon=\relax
+\expandafter\ifx\csname mdqon\endcsname\relax
+% \then go ahead \else do nothing
+\else \endinput \fi
+
+\message{Document Style Option `german' Version 2.3c of 28 Aug 1990}
+
+% \ifundefined{protect}
+\ifx\protect\undefined
+% \then define it
+\let\protect=\relax \fi
+
+{\catcode`\@=11 % \makeatletter
+
+\gdef\allowhyphens{\penalty\@M \hskip\z@skip}
+% {\nobreak \hskip 0pt plus 0pt\relax}
+
+\newcount\U@C\newbox\U@B\newdimen\U@D
+% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}}
+
+%\gdef\umlautlow{\def\"{\protect\newumlaut}}
+
+\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}}
+
+\gdef\dirtyumlautlow#1{\if#1A{\discretionary
+{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1O{\discretionary
+{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1U{\discretionary
+{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1a{\discretionary
+{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1o{\discretionary
+{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1u{\discretionary
+{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1s{\discretionary
+{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{}
+{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi}
+
+
+\gdef\newumlaut#1{\leavevmode
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+% \baselineskip 0pt
+ \ialign{##\crcr\hidewidth
+ \setbox\U@B\hbox{#1}\U@D .01\p@\U@C\U@D
+ \U@D\ht\U@B\advance\U@D -1ex\divide\U@D \U@C
+ \U@C\U@D\U@D\the\fontdimen1\the\font
+ \multiply\U@D \U@C\divide\U@D 100\kern\U@D
+ \vbox to .20ex % <--- depending on the METAFONT parameters
+% of the fonts, the height of this \vbox
+% may vary around the value of .20ex --
+% just try out, which will look best!
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}}
+
+\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\z@\ht\z@
+ \advance\dimen\z@ -\ht\tw@
+ \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@ }
+% (this lowers the german left quotes to the same level as the comma.)
+
+\gdef\@glqq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \leavevmode
+ \set@low@box{''}\box\z@\kern-.04em\allowhyphens\@SF\relax}}
+\gdef\glqq{\protect\@glqq}
+\gdef\@grqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \kern-.07em``\kern.07em\@SF\relax}
+\gdef\grqq{\protect\@grqq}
+\gdef\@glq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \leavevmode
+ \set@low@box{'}\box\z@\kern-.04em\allowhyphens\@SF\relax}}
+\gdef\glq{\protect\@glq}
+\gdef\@grq{\kern-.07em`\kern.07em}
+\gdef\grq{\protect\@grq}
+\gdef\@flqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode \ll \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle \ll $}\fi \@SF\relax}
+\gdef\flqq{\protect\@flqq}
+\gdef\@frqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode \gg \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle \gg $}\fi \@SF\relax}
+\gdef\frqq{\protect\@frqq}
+\gdef\@flq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode < \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle < $}\fi \@SF\relax}
+\gdef\flq{\protect\@flq}
+\gdef\@frq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode > \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle > $}\fi \@SF\relax}
+\gdef\frq{\protect\@frq}
+
+% enable hyphenations after \ss:
+\global\lccode`\^^Y=`\^^Y
+
+\global\let\original@three=\3 % Note that \3 may be defined or undefined.
+
+% add the quotes to the definitions of dospecials and sanitize:
+\begingroup
+\def\do{\noexpand\do\noexpand}%
+% note that "\xdef" means "\global\edef"
+\xdef\dospecials{\dospecials\do\"}%
+% not ( \ifundefined{@sanitize} or \@sanitize=\relax ) = if LaTeX
+\expandafter\ifx\csname @sanitize\endcsname\relax \else
+ \def\@makeother{\noexpand\@makeother\noexpand}%
+ \xdef\@sanitize{\@sanitize\@makeother\"}%
+\fi
+\endgroup
+
+\gdef\mdqon{\catcode`\"\active}
+\gdef\mdqoff{\catcode`\"12 }
+
+\gdef\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens}
+
+{\mdqoff
+\gdef\@UMLAUT{\"}
+\gdef\@MATHUMLAUT{\mathaccent"707F }
+\gdef\@SS{\mathchar"7019 }
+\gdef\dq{"}
+}
+
+{\mdqon
+\gdef"{\protect\active@dq}
+\gdef\active@dq{\futurelet\next@after@dq\first@active@dq}
+% For efficency, first the most frequent ones in a short macro only:
+\gdef\first@active@dq#1{%
+ \ifx \next@after@dq\bgroup\dq {#1}%
+ \else \expandafter\ifx \space\next@after@dq\dq\space #1%
+ % The two lines above are needed before everything else, to take care of
+ % (empty or non-empty) groups and spaces after the active quote!
+ % Now the real thing:
+ \else \ifx #1s\ifmmode\@SS \else \ss\fi{}%
+ % note the empty group to avoid gobbling spaces.
+ \else \ifx #1a\ifmmode\@MATHUMLAUT a\else \@UMLAUT a\fi
+ \else \ifx #1o\ifmmode\@MATHUMLAUT o\else \@UMLAUT o\fi
+ \else \ifx #1u\ifmmode\@MATHUMLAUT u\else \@UMLAUT u\fi
+ \else \ifx #1A\ifmmode\@MATHUMLAUT A\else \@UMLAUT A\fi
+ \else \ifx #1O\ifmmode\@MATHUMLAUT O\else \@UMLAUT O\fi
+ \else \ifx #1U\ifmmode\@MATHUMLAUT U\else \@UMLAUT U\fi
+ \else \ifx #1`\glqq{}%
+ \else \ifx #1'\grqq{}%
+ \else \other@active@dq{#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi }
+% And now a separate command for the less frequent ones:
+\gdef\other@active@dq#1{%
+ \ifx #1e\ifmmode\@MATHUMLAUT e\else \highumlaut e\fi
+ \else \ifx #1i\ifmmode\@MATHUMLAUT i\else \highumlaut\i \fi
+ \else \ifx #1E\ifmmode\@MATHUMLAUT E\else \highumlaut E\fi
+ \else \ifx #1I\ifmmode\@MATHUMLAUT I\else \highumlaut I\fi
+ \else \ifx #1SSS%
+ \else \ifx #1-\allowhyphens\-\allowhyphens
+ \else \ifx #1"\hskip\z@skip
+ \else \ifx #1|\discretionary{-}{}{\kern.03em}%
+ \else \ifx #1c\allowhyphens\discretionary{k-}{}{c}\allowhyphens
+ \else \ifx #1f\allowhyphens\discretionary{ff-}{}{f}\allowhyphens
+ \else \ifx #1l\allowhyphens\discretionary{ll-}{}{l}\allowhyphens
+ \else \ifx #1m\allowhyphens\discretionary{mm-}{}{m}\allowhyphens
+ \else \ifx #1n\allowhyphens\discretionary{nn-}{}{n}\allowhyphens
+ \else \ifx #1p\allowhyphens\discretionary{pp-}{}{p}\allowhyphens
+ \else \ifx #1t\allowhyphens\discretionary{tt-}{}{t}\allowhyphens
+ \else \ifx #1C\allowhyphens\discretionary{K-}{}{C}\allowhyphens
+ \else \ifx #1F\allowhyphens\discretionary{FF-}{}{F}\allowhyphens
+ \else \ifx #1L\allowhyphens\discretionary{LL-}{}{L}\allowhyphens
+ \else \ifx #1M\allowhyphens\discretionary{MM-}{}{M}\allowhyphens
+ \else \ifx #1N\allowhyphens\discretionary{NN-}{}{N}\allowhyphens
+ \else \ifx #1P\allowhyphens\discretionary{PP-}{}{P}\allowhyphens
+ \else \ifx #1T\allowhyphens\discretionary{TT-}{}{T}\allowhyphens
+ \else \ifx #1<\flqq{}%
+ \else \ifx #1>\frqq{}%
+ % note the empty group to avoid gobbling spaces.
+ \else \ifx #1\active@dq\hskip\z@skip
+ \else \dq #1%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi }
+} % end of \mdqon
+
+\gdef\dateaustrian{\def\today{\number\day.~\ifcase\month\or
+ J\"anner\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Juli\or August\or September\or Oktober\or November\or Dezember\fi
+ \space\number\year}}
+\gdef\dategerman{\def\today{\number\day.~\ifcase\month\or
+ Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Juli\or August\or September\or Oktober\or November\or Dezember\fi
+ \space\number\year}}
+\gdef\dateUSenglish{\def\today{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\day, \number\year}}
+\gdef\dateenglish{\def\today{\ifcase\day\or
+ 1st\or 2nd\or 3rd\or 4th\or 5th\or
+ 6th\or 7th\or 8th\or 9th\or 10th\or
+ 11th\or 12th\or 13th\or 14th\or 15th\or
+ 16th\or 17th\or 18th\or 19th\or 20th\or
+ 21st\or 22nd\or 237rd\or 24th\or 25th\or
+ 26th\or 27th\or 28th\or 29th\or 30th\or
+ 31st\fi
+ ~\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space \number\year}}
+\gdef\datefrench{\def\today{\ifnum\day=1\relax 1\/$^{\rm er}$\else
+ \number\day\fi \space\ifcase\month\or
+ janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
+ juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi
+ \space\number\year}}
+
+% Here is, how you can modify the LaTeX document style files and option
+% files, to benefit from the following \captionsxxxxx commands. Def's like
+% \def\tableofcontents{\section*{Contents\markboth{CONTENTS}{CONTENTS}}
+% \@starttoc{toc}}
+% should be redefined by def's like
+% \def\contentsname{Contents} % <---
+% \def\tableofcontents{\section*{\contentsname
+% \markboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}}
+% \@starttoc{toc}}
+% (it's best to put all these new lines to the end of the origignal files),
+% and of course, you should modify the change date in the file header and
+% in the \typeout command.
+
+\gdef\captionsgerman{%
+\def\refname{Literatur}%
+\def\abstractname{Zusammenfassung}%
+\def\bibname{Literaturverzeichnis}%
+\def\chaptername{Kapitel}%
+\def\appendixname{Anhang}%
+\def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt
+\def\listfigurename{Abbildungsverzeichnis}%
+\def\listtablename{Tabellenverzeichnis}%
+\def\indexname{Index}%
+\def\figurename{Abbildung}%
+\def\tablename{Tabelle}% % oder: Tafel
+\def\partname{Teil}%
+\def\enclname{Anlage(n)}% % oder: Beilage(n)
+\def\ccname{Verteiler}% % oder: Kopien an
+\def\headtoname{An}%
+\def\pagename{Seite}}
+
+\gdef\captionsenglish{%
+\def\refname{References}%
+\def\abstractname{Abstract}%
+\def\bibname{Bibliography}%
+\def\chaptername{Chapter}%
+\def\appendixname{Appendix}%
+\def\contentsname{Contents}%
+\def\listfigurename{List of Figures}%
+\def\listtablename{List of Tables}%
+\def\indexname{Index}%
+\def\figurename{Figure}%
+\def\tablename{Table}%
+\def\partname{Part}%
+\def\enclname{encl}%
+\def\ccname{cc}%
+\def\headtoname{To}%
+\def\pagename{Page}}
+
+\gdef\captionsfrench{%
+\def\refname{R\'ef\'erences}%
+\def\abstractname{R\'esum\'e}%
+\def\bibname{Bibliographie}%
+\def\chaptername{Chapitre}%
+\def\appendixname{Annexe}%
+\def\contentsname{Table des mati\`eres}%
+\def\listfigurename{Liste des figures}%
+\def\listtablename{Liste des tableaux}%
+\def\indexname{Index}%
+\def\figurename{Figure}%
+\def\tablename{Tableau}%
+\def\partname{Partie}%
+\def\enclname{P.~J.}%
+\def\ccname{Copie \`a}%
+\def\headtoname{A}%
+\def\pagename{Page}}
+
+\newcount\l@nguage
+% This will be re-declared as \language if the latter has not yet been
+% declared neither by Ferguson's ``Multilingual T^eX'' nor by TeX 3:
+% \ifundefined{language}
+\expandafter\ifx\csname language\endcsname\relax
+\global\let\language=\l@nguage
+\fi
+
+\newcount\USenglish \global\USenglish=0
+\newcount\german \global\german=1
+\newcount\austrian \global\austrian=2
+\newcount\french \global\french=3
+\newcount\english \global\english=4
+
+\gdef\selectlanguage#1{\language #1\relax
+ \expandafter\ifcase #1\relax
+ \dateUSenglish \captionsenglish \or
+ \dategerman \captionsgerman \or
+ \dateaustrian \captionsgerman \or
+ \datefrench \captionsfrench \or
+ \dateenglish \captionsenglish \fi}
+
+% \ifundefined{setlanguage} (= TeX version < 3 )
+\expandafter\ifx\csname setlanguage\endcsname\relax
+\global\let\setlanguage=\selectlanguage
+\fi
+
+\gdef\originalTeX{\mdqoff \umlauthigh \let\3\original@three
+ \selectlanguage{\USenglish}}
+\gdef\germanTeX{\mdqon \umlautlow \let\3\ss
+ \selectlanguage{\german}}
+
+} % return to previous catcodes
+
+% Now, switch on what is appropriate for german:
+
+\germanTeX
+
+% This is the end of GERMAN.STY/DOC/TEX.
+\endinput
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex
new file mode 100644
index 0000000000..2655612748
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex
@@ -0,0 +1,1372 @@
+% File LPLAIN - Created 29 October 1985 from plain version 1.5CM
+% - Last modified 20 October 1988 to take into account
+% changes to PLAIN.TEX reported by Arthur Ogawa
+% - Modified February 8, 1990 by Dominik Wujastyk to
+% match the PLAIN.TEX meant for TeX 3.0 (\fmtname{plain},
+% \fmtversion{3.0}).
+% - Modified March 15, 1990 by Frank Mittelbach to
+% allow the use of this file both in TeX 2 and 3
+%
+% This is the LaTeX version of the plain TeX format that's described in
+% The TeXbook. All modifications can be found by searching for
+% the word 'LaTeX'.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..127, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+\mathcode`\^^D="225E % \land
+\mathcode`\^^E="023A % \lnot
+\mathcode`\^^F="3232 % \in
+\mathcode`\^^G="0119 % \pi
+\mathcode`\^^H="0115 % \lambda
+\mathcode`\^^I="010D % \gamma
+\mathcode`\^^J="010E % \delta
+\mathcode`\^^K="3222 % \uparrow
+\mathcode`\^^L="2206 % \pm
+\mathcode`\^^M="2208 % \oplus
+\mathcode`\^^N="0231 % \infty
+\mathcode`\^^O="0140 % \partial
+\mathcode`\^^P="321A % \subset
+\mathcode`\^^Q="321B % \supset
+\mathcode`\^^R="225C % \cap
+\mathcode`\^^S="225B % \cup
+\mathcode`\^^T="0238 % \forall
+\mathcode`\^^U="0239 % \exists
+\mathcode`\^^V="220A % \otimes
+\mathcode`\^^W="3224 % \leftrightarrow
+\mathcode`\^^X="3220 % \leftarrow
+\mathcode`\^^Y="3221 % \rightarrow
+\mathcode`\^^Z="8000 % \ne
+\mathcode`\^^[="2205 % \diamond
+\mathcode`\^^\="3214 % \le
+\mathcode`\^^]="3215 % \ge
+\mathcode`\^^^="3211 % \equiv
+\mathcode`\^^_="225F % \lor
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% more macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 19 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+% LaTeX change: remove \outer from \newcount and \newdimen (FMi)
+% This is necessary to use \newcount inside \if...
+% later on.
+
+\def\newcount{\alloc@0\count\countdef\insc@unt}
+\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
+
+% LaTeX change: the PLAIN \centering dimension conflicts with
+% LaTeX's \centering command, so it is redefined to \@centering.
+% This dimension is used by LaTeX.
+
+\newskip\@centering \@centering=0pt plus 1000pt minus 1000pt
+
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip \z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+\message{setting up things for TeX 3.0, }
+
+% If this file is used in an old TeX we define the new features
+% of TeX 3.0 as simple macros or counters so that files that uses
+% these features can be processed in such an environment
+% (They will however produce some other results).
+
+\ifx\undefined\inputlineno
+ \newcount\inputlineno
+ \inputlineno-1 % this could be used to detect that
+ % an old TeX is in force
+ \newcount\language
+ \newcount\lefthyphenmin
+ \newcount\righthyphenmin
+ \newcount\errorcontextlines
+ \newcount\holdinginserts
+ \newdimen\emergencystretch
+ \newcount\badness
+ \let\noboundary\relax
+ \newcount\setlanguage
+\fi
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+% LaTeX font definitions are taken from the file LFONTS.TEX,
+% so all of PLAIN's font definitions are commented out.
+
+%\message{fonts,}
+%
+%\font\tenrm=cmr10 % roman text
+%\font\preloaded=cmr9
+%\font\preloaded=cmr8
+%\font\sevenrm=cmr7
+%\font\preloaded=cmr6
+%\font\fiverm=cmr5
+%
+%\font\teni=cmmi10 % math italic
+%\font\preloaded=cmmi9
+%\font\preloaded=cmmi8
+%\font\seveni=cmmi7
+%\font\preloaded=cmmi6
+%\font\fivei=cmmi5
+%
+%\font\tensy=cmsy10 % math symbols
+%\font\preloaded=cmsy9
+%\font\preloaded=cmsy8
+%\font\sevensy=cmsy7
+%\font\preloaded=cmsy6
+%\font\fivesy=cmsy5
+%
+%\font\tenex=cmex10 % math extension
+%
+%\font\preloaded=cmss10 % sans serif
+%\font\preloaded=cmssq8
+%
+%\font\preloaded=cmssi10 % sans serif italic
+%\font\preloaded=cmssqi8
+%
+%\font\tenbf=cmbx10 % boldface extended
+%\font\preloaded=cmbx9
+%\font\preloaded=cmbx8
+%\font\sevenbf=cmbx7
+%\font\preloaded=cmbx6
+%\font\fivebf=cmbx5
+%
+%\font\tentt=cmtt10 % typewriter
+%\font\preloaded=cmtt9
+%\font\preloaded=cmtt8
+%
+%\font\preloaded=cmsltt10 % slanted typewriter
+%
+%\font\tensl=cmsl10 % slanted roman
+%\font\preloaded=cmsl9
+%\font\preloaded=cmsl8
+%
+%\font\tenit=cmti10 % text italic
+%\font\preloaded=cmti9
+%\font\preloaded=cmti8
+%\font\preloaded=cmti7
+%
+%\message{more fonts,}
+%\font\preloaded=cmu10 % unslanted text italic
+%
+%\font\preloaded=cmmib10 % bold math italic
+%\font\preloaded=cmbsy10 % bold math symbols
+%
+%\font\preloaded=cmcsc10 % caps and small caps
+%
+%\font\preloaded=cmssbx10 % sans serif bold extended
+%
+%\font\preloaded=cmdunh10 % Dunhill style
+%
+%\font\preloaded=cmr7 scaled \magstep4 % for titles
+%\font\preloaded=cmtt10 scaled \magstep2
+%\font\preloaded=cmssbx10 scaled \magstep2
+%
+%\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+%
+%% Additional \preloaded fonts can be specified here.
+%% (And those that were \preloaded above can be eliminated.)
+%
+%\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+%
+%\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+%\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+%
+%\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+%\def\rm{\fam\z@\tenrm}
+%\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+%\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
+%\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+%\def\cal{\fam\tw@}
+%\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+%\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
+%\textfont\itfam=\tenit
+%\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
+%\textfont\slfam=\tensl
+%\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
+%\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+%\scriptscriptfont\bffam=\fivebf
+%\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
+%\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+\def\lq{`} \def\rq{'}
+\def\lbrack{[} \def\rbrack{]}
+
+\let\endgraf=\par \let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={ \let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ } % tie
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+% \line changed to \@@line because LaTeX redefines \line
+\def\@@line{\hbox to\hsize}
+\def\leftline#1{\@@line{#1\hss}}
+\def\rightline#1{\@@line{\hss#1}}
+\def\centerline#1{\@@line{\hss#1\hss}}
+% end of LaTeX \line -> \@@line change
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround=\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+% LaTeX has its own tabbing environment, so PLAIN's is disabled.
+%
+%\newif\ifus@ \newif\if@cr
+%\newbox\tabs \newbox\tabsyet \newbox\tabsdone
+%
+%\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+%\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+%\let\+=\relax % in case this file is being read in twice
+%\def\sett@b{\ifx\next\+\let\next\relax
+% \def\next{\afterassignment\s@tt@b\let\next}%
+% \else\let\next\s@tcols\fi\next}
+%\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
+%\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+%\outer\def\+{\tabalign}
+%\def\s@tcols#1\columns{\count@#1 \dimen@\hsize
+% \loop\ifnum\count@>\z@ \@nother \repeat}
+%\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+% \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+% \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+%
+%\def\m@ketabbox{\begingroup
+% \global\setbox\tabsyet\copy\tabs
+% \global\setbox\tabsdone\null
+% \def\cr{\@crtrue\crcr\egroup\egroup
+% \ifus@\unvbox\z@\lastbox\fi\endgroup
+% \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+% \setbox\z@\vbox\bgroup\@crfalse
+% \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+%
+%\def\t@bbox{\setbox\z@\hbox\bgroup}
+%\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+% \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+% \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+% \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+% \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+% \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+% \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+% LaTeX has its own sectioning macros
+%\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+% \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+% \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\def\aa{\accent23a}
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} % put characters over each other
+\def\ooalign{\lineskiplimit-\maxdimen \oalign}
+
+% LaTeX change: \d, \b, \c redefined to work in a moving argument.
+\def\pd#1{\oalign{#1\crcr\hidewidth.\hidewidth}}
+\def\d{\protect\pd}
+
+\def\pb#1{\oalign{#1\crcr\hidewidth
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}
+\def\b{\protect\pb}
+
+\def\pc#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
+ \else{\ooalign{\hidewidth\char24\hidewidth\crcr\unhbox\z@}}\fi}
+\def\c{\protect\pc}
+% end of LaTeX change to \d, \b, \c
+
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+
+% LaTeX change: \ldots is redefined to do essentially what Plain's \dots does,
+% so ...
+\def\dots{\ldots}
+
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\def\v#1{{\accent20 #1}} \let\^^_=\v
+\def\u#1{{\accent21 #1}} \let\^^S=\u
+\def\=#1{{\accent22 #1}}
+\def\^#1{{\accent94 #1}} \let\^^D=\^
+\def\.#1{{\accent95 #1}}
+\def\H#1{{\accent"7D #1}}
+\def\~#1{{\accent"7E #1}}
+%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut
+
+% LaTeX change: Make \t work in a moving argument.
+\def\pt#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+\def\t{\protect\pt}
+
+% LaTeX change: \kern\z@ added to end of \hrulefill and \dotfill
+% to make them work in `tabular' and `array' environments.
+% (Change made 24 July 1987).
+\def\hrulefill{\leaders\hrule\hfill\kern\z@}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill\kern\z@}
+
+\def\rightarrowfill{$\m@th\mathord-\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord-$}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru
+ \bracelu\leaders\vrule\hfill\bracerd$}
+\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd
+ \braceld\leaders\vrule\hfill\braceru$}
+
+% LaTeX change: \bye is eliminated.
+%\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^ \let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A \let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352 \def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348 \def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E \let\land=\wedge
+\mathchardef\vee="225F \let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=} \let\ne=\neq
+\mathchardef\leq="3214 \let\le=\leq
+\mathchardef\geq="3215 \let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233 \let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220 \let\gets=\leftarrow
+\mathchardef\rightarrow="3221 \let\to=\rightarrow
+\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+
+% LaTeX Change: \longrightarrow and \longleftarrow redefined to make
+% then robust.
+\def\longrightarrow{\protect\@lra}
+ \def\@lra{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\protect\@lla}
+ \def\@lla{\leftarrow\joinrel\relbar}
+% End of LaTeX change to \longrightarrow and \longleftarrow
+
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+
+% LaTeX change: make \ldots work outside math mode too.
+\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\ldots{\protect\pldots}
+\def\pldots{\relax\ifmmode\@ldots\else\mbox{$\@ldots\,$}\fi}
+% End of LaTeX change to \ldots
+
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 }
+\def\grave{\mathaccent"7012 }
+\def\ddot{\mathaccent"707F }
+\def\tilde{\mathaccent"707E }
+\def\bar{\mathaccent"7016 }
+\def\breve{\mathaccent"7015 }
+\def\check{\mathaccent"7014 }
+\def\hat{\mathaccent"705E }
+\def\vec{\mathaccent"017E }
+\def\dot{\mathaccent"705F }
+\def\widetilde{\mathaccent"0365 }
+\def\widehat{\mathaccent"0362 }
+\def\overrightarrow#1{\vbox{\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}}
+
+\def\lmoustache{\delimiter"4000340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"5000341 } % top from ), bottom from (
+\def\lgroup{\delimiter"400033A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"500033B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"33C000 } % arrow without arrowheads
+\def\Arrowvert{\delimiter"33D000 } % double arrow without arrowheads
+\def\bracevert{\delimiter"33E000 } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D } \let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 } \let\}=\rbrace
+\def\lbrace{\delimiter"4266308 } \let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox
+\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}
+ \mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@}
+\newif\ifv@ \newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+
+% LaTeX: following command is moved after the \tenex font is defined
+% by LFONTS
+%\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+
+% LaTeX change: \eqalign eliminated, since it is replaced by the
+% eqnarray environment.
+%
+%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+% \crcr#1\crcr}}\,}
+
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse
+ \vskip-\lineskiplimit \vskip\normallineskiplimit
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+
+% LaTeX: The following \eqalign type macros are eliminated, since
+% they are replaced by the eqnarray environment.
+%
+%\def\eqalignno#1{\displ@y \tabskip\centering
+% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+% &\llap{$\@lign##$}\tabskip\z@skip\crcr
+% #1\crcr}}
+%\def\leqalignno#1{\displ@y \tabskip\centering
+% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+% &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+% #1\crcr}}
+
+% Definitions related to output
+
+% LaTeX uses its own output routine
+%
+%\message{output routines,}
+%
+%\countdef\pageno=0 \pageno=1 % first page is number 1
+%\newtoks\headline \headline={\hfil} % headline is normally blank
+%\newtoks\footline \footline={\hss\tenrm\folio\hss}
+% % footline is normally a centered page number in font \tenrm
+%\newif\ifr@ggedbottom
+%\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+%\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+%\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+%\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+%\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+% \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+% LaTeX does use the same insert for footnotes as PLAIN
+\newinsert\footins
+
+%\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+% \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+% #1\@sf\vfootnote{#1}}
+%\def\vfootnote#1{\insert\footins\bgroup
+% \interlinepenalty\interfootnotelinepenalty
+% \splittopskip\ht\strutbox % top baseline for broken footnotes
+% \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+% \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+% \textindent{#1}\footstrut\futurelet\next\fo@t}
+%\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+% \else\let\next\f@t\fi \next}
+%\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+%\def\f@t#1{#1\@foot}
+%\def\@foot{\strut\egroup}
+%\def\footstrut{\vbox to\splittopskip{}}
+
+% LaTeX leaves these initializations for the \footins insert.
+%
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+%\newinsert\topins
+%\newif\ifp@ge \newif\if@mid
+%\def\topinsert{\@midfalse\p@gefalse\@ins}
+%\def\midinsert{\@midtrue\@ins}
+%\def\pageinsert{\@midfalse\p@getrue\@ins}
+%\skip\topins=\z@skip % no space added when a topinsert is present
+%\count\topins=1000 % magnification factor (1 to 1)
+%\dimen\topins=\maxdimen % no limit per page
+%\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+%\def\endinsert{\egroup % finish the \vbox
+% \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+% \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+% \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+% \if@mid \bigskip\box\z@\bigbreak
+% \else\insert\topins{\penalty100 % floating insertion
+% \splittopskip\z@skip
+% \splitmaxdepth\maxdimen \floatingpenalty\z@
+% \ifp@ge \dimen@\dp\z@
+% \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+% \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+%\output{\plainoutput}
+%\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+% \advancepageno
+% \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+%\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+%\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+% \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+%\def\makefootline{\baselineskip24\p@\line{\the\footline}}
+%\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+% \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+%
+%\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+% \ifvoid\footins\else % footnote info is present
+% \vskip\skip\footins
+% \footnoterule
+% \unvbox\footins\fi
+% \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+
+% LaTeX keeps PLAIN TeX's \footnoterule as the default
+%
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input sihyphen
+
+% \magnification doesn't work in LaTeX
+%
+%\def\magnification{\afterassignment\m@g\count@}
+%\def\m@g{\mag\count@
+% \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+% input LaTeX fonts and commands
+
+\input lfonts
+\input latex
+
+% LaTeX change: moved from above.
+\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+
+% LaTeX: default values
+\normalbaselines
+% LaTeX: select 10pt font size and \rm style
+\xpt
+
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+% LaTeX: File called LPLAIN
+% Identify the current format
+\def\fmtname{lplain}\def\fmtversion{2.09-February 8, 1990}
+
+\typeout{Input any local modifications here.}
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex
new file mode 100644
index 0000000000..bffb195e6e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex
@@ -0,0 +1,1232 @@
+% This is the plain TeX format that's described in The TeXbook.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+\mathcode`\^^D="225E % \land
+\mathcode`\^^E="023A % \lnot
+\mathcode`\^^F="3232 % \in
+\mathcode`\^^G="0119 % \pi
+\mathcode`\^^H="0115 % \lambda
+\mathcode`\^^I="010D % \gamma
+\mathcode`\^^J="010E % \delta
+\mathcode`\^^K="3222 % \uparrow
+\mathcode`\^^L="2206 % \pm
+\mathcode`\^^M="2208 % \oplus
+\mathcode`\^^N="0231 % \infty
+\mathcode`\^^O="0140 % \partial
+\mathcode`\^^P="321A % \subset
+\mathcode`\^^Q="321B % \supset
+\mathcode`\^^R="225C % \cap
+\mathcode`\^^S="225B % \cup
+\mathcode`\^^T="0238 % \forall
+\mathcode`\^^U="0239 % \exists
+\mathcode`\^^V="220A % \otimes
+\mathcode`\^^W="3224 % \leftrightarrow
+\mathcode`\^^X="3220 % \leftarrow
+\mathcode`\^^Y="3221 % \rightarrow
+\mathcode`\^^Z="8000 % \ne
+\mathcode`\^^[="2205 % \diamond
+\mathcode`\^^\="3214 % \le
+\mathcode`\^^]="3215 % \ge
+\mathcode`\^^^="3211 % \equiv
+\mathcode`\^^_="225F % \lor
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% more macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 20 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
+\newskip\centering \centering=0pt plus 1000pt minus 1000pt
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip \z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+\message{fonts,}
+
+\font\tenrm=cmr10 % roman text
+\font\preloaded=cmr9
+\font\preloaded=cmr8
+\font\sevenrm=cmr7
+\font\preloaded=cmr6
+\font\fiverm=cmr5
+
+\font\teni=cmmi10 % math italic
+\font\preloaded=cmmi9
+\font\preloaded=cmmi8
+\font\seveni=cmmi7
+\font\preloaded=cmmi6
+\font\fivei=cmmi5
+
+\font\tensy=cmsy10 % math symbols
+\font\preloaded=cmsy9
+\font\preloaded=cmsy8
+\font\sevensy=cmsy7
+\font\preloaded=cmsy6
+\font\fivesy=cmsy5
+
+\font\tenex=cmex10 % math extension
+
+\font\preloaded=cmss10 % sans serif
+\font\preloaded=cmssq8
+
+\font\preloaded=cmssi10 % sans serif italic
+\font\preloaded=cmssqi8
+
+\font\tenbf=cmbx10 % boldface extended
+\font\preloaded=cmbx9
+\font\preloaded=cmbx8
+\font\sevenbf=cmbx7
+\font\preloaded=cmbx6
+\font\fivebf=cmbx5
+
+\font\tentt=cmtt10 % typewriter
+\font\preloaded=cmtt9
+\font\preloaded=cmtt8
+
+\font\preloaded=cmsltt10 % slanted typewriter
+
+\font\tensl=cmsl10 % slanted roman
+\font\preloaded=cmsl9
+\font\preloaded=cmsl8
+
+\font\tenit=cmti10 % text italic
+\font\preloaded=cmti9
+\font\preloaded=cmti8
+\font\preloaded=cmti7
+
+\message{more fonts,}
+\font\preloaded=cmu10 % unslanted text italic
+
+\font\preloaded=cmmib10 % bold math italic
+\font\preloaded=cmbsy10 % bold math symbols
+
+\font\preloaded=cmcsc10 % caps and small caps
+
+\font\preloaded=cmssbx10 % sans serif bold extended
+
+\font\preloaded=cmdunh10 % Dunhill style
+
+\font\preloaded=cmr7 scaled \magstep4 % for titles
+\font\preloaded=cmtt10 scaled \magstep2
+\font\preloaded=cmssbx10 scaled \magstep2
+
+\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+
+% Additional \preloaded fonts can be specified here.
+% (And those that were \preloaded above can be eliminated.)
+
+\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+
+\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+
+\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+\def\rm{\fam\z@\tenrm}
+\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
+\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+\def\cal{\fam\tw@}
+\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
+\textfont\itfam=\tenit
+\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
+\textfont\slfam=\tensl
+\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
+\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+\scriptscriptfont\bffam=\fivebf
+\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
+\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+\def\lq{`} \def\rq{'}
+\def\lbrack{[} \def\rbrack{]}
+
+\let\endgraf=\par \let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={ \let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ } % tie
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+\def\line{\hbox to\hsize}
+\def\leftline#1{\line{#1\hss}}
+\def\rightline#1{\line{\hss#1}}
+\def\centerline#1{\line{\hss#1\hss}}
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround=\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+\newif\ifus@ \newif\if@cr
+\newbox\tabs \newbox\tabsyet \newbox\tabsdone
+
+\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+\let\+=\relax % in case this file is being read in twice
+\def\sett@b{\ifx\next\+\let\next\relax
+ \def\next{\afterassignment\s@tt@b\let\next}%
+ \else\let\next\s@tcols\fi\next}
+\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
+\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+\outer\def\+{\tabalign}
+\def\s@tcols#1\columns{\count@#1\dimen@\hsize
+ \loop\ifnum\count@>\z@ \@nother \repeat}
+\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+ \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+ \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+
+\def\m@ketabbox{\begingroup
+ \global\setbox\tabsyet\copy\tabs
+ \global\setbox\tabsdone\null
+ \def\cr{\@crtrue\crcr\egroup\egroup
+ \ifus@\unvbox\z@\lastbox\fi\endgroup
+ \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+ \setbox\z@\vbox\bgroup\@crfalse
+ \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+
+\def\t@bbox{\setbox\z@\hbox\bgroup}
+\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+ \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+ \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+ \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+ \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+ \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+ \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+ \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+ \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\def\aa{\accent23a}
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} % put characters over each other
+\def\ooalign{\lineskiplimit-\maxdimen \oalign}
+\def\d#1{\oalign{#1\crcr\hidewidth.\hidewidth}}
+\def\b#1{\oalign{#1\crcr\hidewidth
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}
+\def\c#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
+ \else{\ooalign{\hidewidth\char24\hidewidth\crcr\unhbox\z@}}\fi}
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+
+\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\def\v#1{{\accent20 #1}} \let\^^_=\v
+\def\u#1{{\accent21 #1}} \let\^^S=\u
+\def\=#1{{\accent22 #1}}
+\def\^#1{{\accent94 #1}} \let\^^D=\^
+\def\.#1{{\accent95 #1}}
+\def\H#1{{\accent"7D #1}}
+\def\~#1{{\accent"7E #1}}
+% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by the following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut % for testing purposes excluded
+
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+
+\def\hrulefill{\leaders\hrule\hfill}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill}
+\def\rightarrowfill{$\m@th\mathord-\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord-$}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru
+ \bracelu\leaders\vrule\hfill\bracerd$}
+\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd
+ \braceld\leaders\vrule\hfill\braceru$}
+
+\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^ \let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A \let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352 \def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348 \def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E \let\land=\wedge
+\mathchardef\vee="225F \let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=} \let\ne=\neq
+\mathchardef\leq="3214 \let\le=\leq
+\mathchardef\geq="3215 \let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233 \let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220 \let\gets=\leftarrow
+\mathchardef\rightarrow="3221 \let\to=\rightarrow
+\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+\def\longrightarrow{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\leftarrow\joinrel\relbar}
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 }
+\def\grave{\mathaccent"7012 }
+\def\ddot{\mathaccent"707F }
+\def\tilde{\mathaccent"707E }
+\def\bar{\mathaccent"7016 }
+\def\breve{\mathaccent"7015 }
+\def\check{\mathaccent"7014 }
+\def\hat{\mathaccent"705E }
+\def\vec{\mathaccent"017E }
+\def\dot{\mathaccent"705F }
+\def\widetilde{\mathaccent"0365 }
+\def\widehat{\mathaccent"0362 }
+\def\overrightarrow#1{\vbox{\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}}
+
+\def\lmoustache{\delimiter"4000340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"5000341 } % top from ), bottom from (
+\def\lgroup{\delimiter"400033A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"500033B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"33C000 } % arrow without arrowheads
+\def\Arrowvert{\delimiter"33D000 } % double arrow without arrowheads
+\def\bracevert{\delimiter"33E000 } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D } \let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 } \let\}=\rbrace
+\def\lbrace{\delimiter"4266308 } \let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox
+\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}
+ \mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@}
+\newif\ifv@ \newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+ \crcr#1\crcr}}\,}
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse
+ \vskip-\lineskiplimit \vskip\normallineskiplimit
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+\def\eqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\z@skip\crcr
+ #1\crcr}}
+\def\leqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% Definitions related to output
+
+\message{output routines,}
+
+\countdef\pageno=0 \pageno=1 % first page is number 1
+\newtoks\headline \headline={\hfil} % headline is normally blank
+\newtoks\footline \footline={\hss\tenrm\folio\hss}
+ % footline is normally a centered page number in font \tenrm
+\newif\ifr@ggedbottom
+\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+ \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+\newinsert\footins
+\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ #1\@sf\vfootnote{#1}}
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \textindent{#1}\footstrut\futurelet\next\fo@t}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else\let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{#1\@foot}
+\def\@foot{\strut\egroup}
+\def\footstrut{\vbox to\splittopskip{}}
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+\newinsert\topins
+\newif\ifp@ge \newif\if@mid
+\def\topinsert{\@midfalse\p@gefalse\@ins}
+\def\midinsert{\@midtrue\@ins}
+\def\pageinsert{\@midfalse\p@getrue\@ins}
+\skip\topins=\z@skip % no space added when a topinsert is present
+\count\topins=1000 % magnification factor (1 to 1)
+\dimen\topins=\maxdimen % no limit per page
+\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+\def\endinsert{\egroup % finish the \vbox
+ \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+ \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+ \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+ \if@mid \bigskip\box\z@\bigbreak
+ \else\insert\topins{\penalty100 % floating insertion
+ \splittopskip\z@skip
+ \splitmaxdepth\maxdimen \floatingpenalty\z@
+ \ifp@ge \dimen@\dp\z@
+ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+ \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+\output{\plainoutput}
+\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+ \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+\def\makefootline{\baselineskip24\p@\line{\the\footline}}
+\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+ \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+
+\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+ \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+ \ifvoid\footins\else % footnote info is present
+ \vskip\skip\footins
+ \footnoterule
+ \unvbox\footins\fi
+ \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input sihyphen
+
+\def\magnification{\afterassignment\m@g\count@}
+\def\m@g{\mag\count@
+ \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+\normalbaselines\rm % select roman font
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+\def\fmtname{plain}\def\fmtversion{3.0} % identifies the current format
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch
new file mode 100644
index 0000000000..85179b9d47
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch
@@ -0,0 +1,71 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:31 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29128; Thu, 12 Aug 93 11:31:42 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9761; Thu, 12 Aug 1993
+ 11:29:25 EDT
+Date: Thu, 12 Aug 1993 11:29:23 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Cc: helmut@eichow.tuwien.ac.at
+Message-Id: <00970E8C.653CC200.9761@eichow.tuwien.ac.at>
+Subject: File: german_sty.cha
+Status: RO
+
+@x
+\gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlautlow{\def\"{\protect\newumlaut}}
+\gdef\newumlaut#1{\leavevmode\allowhyphens
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+@y
+% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}}
+
+%\gdef\umlautlow{\def\"{\protect\newumlaut}}
+
+\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}}
+
+\gdef\dirtyumlautlow#1{\if#1A{\discretionary
+{\kern 4321sp m\kern
+196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1O{\discretionary
+{\kern 4321sp m\kern
+214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1U{\discretionary
+{\kern 4321sp m\kern
+220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1a{\discretionary
+{\kern 4321sp m\kern
+228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1o{\discretionary
+{\kern 4321sp m\kern
+246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1u{\discretionary
+{\kern 4321sp m\kern
+252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1s{\discretionary
+{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{}
+{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi}
+
+
+\gdef\newumlaut#1{\leavevmode
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+@z
+
+@x
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}\allowhyphens}
+\gdef\highumlaut#1{\leavevmode\allowhyphens
+ \accent127 #1\allowhyphens}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\
+z@\ht\z@
+@y
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}}
+
+\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\
+z@\ht\z@
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch
new file mode 100644
index 0000000000..8cece159fe
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch
@@ -0,0 +1,33 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:33 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29169; Thu, 12 Aug 93 11:33:32 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9765; Thu, 12 Aug 1993
+ 11:31:14 EDT
+Date: Thu, 12 Aug 1993 11:31:13 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Message-Id: <00970E8C.A685B5A0.9765@eichow.tuwien.ac.at>
+Subject: File: lplain_tex.cha
+Status: RO
+
+@x
+\def\"#1{{\accent"7F #1}}
+
+% LaTeX change: Make \t work in a moving argument.
+@y
+%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the
+following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut
+
+% LaTeX change: Make \t work in a moving argument.
+@z
+
+@x
+\input lhyphen
+@y
+\input sihyphen
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch
new file mode 100644
index 0000000000..de25f540f8
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch
@@ -0,0 +1,32 @@
+From helmut@eichow.tuwien.ac.at Thu Aug 12 11:32 MES 1993
+Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP
+ (16.8/16.2) id AA29132; Thu, 12 Aug 93 11:32:33 +0200
+Return-Path: <helmut@eichow.tuwien.ac.at>
+Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9763; Thu, 12 Aug 1993
+ 11:30:15 EDT
+Date: Thu, 12 Aug 1993 11:30:14 EDT
+From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at>
+To: heinz@eichow.tuwien.ac.at
+Message-Id: <00970E8C.837FA520.9763@eichow.tuwien.ac.at>
+Subject: File: plain_tex.cha
+Status: RO
+
+@x
+\def\"#1{{\accent"7F #1}}
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+@y
+% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by
+the following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut % for testing purposes excluded
+
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+@z
+
+@x
+\input hyphen
+@y
+\input sihyphen
+@z
+
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty
new file mode 100644
index 0000000000..9f3396a76c
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty
@@ -0,0 +1,432 @@
+%GERMAN
+% This is GERMAN.TEX or GERMAN.DOC or GERMAN.STY, Vers. 2.3c, 28 Aug 1990,
+% collected by H.Partl (TU Wien),
+% using ideas by W.Appelt, F.Hommes et al. (GMD St.Augustin),
+% T.Hofmann (CIBA-GEIGY Basel), N.Schwarz (Uni Bochum),
+% J.Schrod (TH Darmstadt), D.Armbruster (Uni Stuttgart),
+% R.Schoepf (Uni Mainz, Uni Heidelberg) and F.Mittelbach
+% (Uni Mainz, EDS Ruesselsheim), J.Knappen (Uni Mainz),
+% P.Breitenlohner (MPI Muenchen), and many others.
+%
+% DOCUMENT STYLE OPTION for writing german texts
+% with TeX version 2.x (Plain TeX) or with LaTeX version 2.09.
+%
+% It can be called via
+% \input german
+% or (with LaTeX) via
+% \documentstyle[german]{anystyle}
+%
+% This file conforms to the standard for "Einheitliche deutsche
+% TeX-Befehle" as proposed at the 6th Meeting of German TeX Users
+% in Muenster, October 1987. It is available from DANTE (the users
+% group of German speaking TeX users) at the Uni Heidelberg.
+%
+% Commands to be used by the end users:
+% "a for Umlaut-a (like \"a), also for all other vowels.
+% "s for sharp s (like \ss{}).
+% "ck for ck to be hyphenated as k-k.
+% "ff for ff to be hyphenated as ff-f, also for certain
+% other consonants.
+% "S for SS to be \uppercase{"s}
+% "A, "CK, "FF etc. uppercase versions of the above
+% "| to separate ligatures.
+% "- like \-, but allowing hyphenation in the rest of
+% the word.
+% "" like "-, but producing no hyphen sign.
+% "` or \glqq for german left double quotes (similar to ,,)
+% "' or \grqq for german right double quotes (similar to ``)
+% \glq for german left single quotes (similar to , )
+% \grq for german right single quotes (similar to ` )
+% "< or \flqq for french left double quotes (similar to <<)
+% "> or \frqq for french right double quotes (similar to >>)
+% \flq for french left single quotes (similar to < )
+% \frq for french right single quotes (similar to > )
+% \dq for the original quotes character (")
+% \selectlanguage{n} to switch to the language specified by n, which
+% should be one of the following command names:
+% \austrian \french \english \german \USenglish;
+% - this changes the date format, captions and (if
+% ``multilingual TeX''is installed) hyphenation.
+% \originalTeX to restore everything to the original settings
+% of TeX and LaTeX (well, almost everything).
+% \germanTeX to re-activate the german settings.
+%
+% Obsolete commands, provided for compatibility with existing
+% applications:
+% \3 for sharp s (like "s).
+% \ck for ck to be hyphenated as k-k (like "ck).
+% \setlanguage (if not defined, i.e. not with TeX 3.x) = \selectlanguage
+%
+% Lower level commands and features:
+% \umlautlow redefines the Umlaut accent such that the dots come
+% nearer to the letter and that hyphenation is enabled
+% in the rest of the word.
+% \umlauthigh restores \" to its original meaning.
+% \ss is \lccode'd to enable hyphenation.
+% \mdqon makes " an active (meta-) character that does the
+% pretty things described above.
+% \mdqoff restores " to its original meaning.
+% \dospecials,\@sanitize are extended to include the ".
+% \dateaustrian, \dategerman, \dateenglish, \dateUSenglish, \datefrench
+% redefine \today to use the respective date format.
+% \captionsgerman, \captionsenglish, \captionsfrench
+% switch to german, english or french chapter captions
+% and the like, resp. This will have an effect only
+% if the document style files use the symbolic names
+% \chaptername etc. instead of the original english
+% words.
+% \language a count that is set by \selectlanguage and can be used
+% by document style declarations like
+% \ifnum\language=\english .textengl.\else
+% \ifnum\language=\german .textgerm.\fi\fi
+% and/or by M.Ferguson's ``Multilingual T^eX''.
+%
+% Finally, \germanTeX is switched on.
+%
+% Notes:
+% This file can be used both with Plain TeX and with LaTeX and other
+% macro packages, and with the original TeX and LaTeX fonts. Usage
+% of german hyphenation patterns is recommended to accompany this
+% style file when writing german texts.
+% The file should be read in vertical mode only (usually at the
+% beginning of the document) to avoid spurious spaces.
+% \undefined must be an undefined control sequence.
+% Multiple calls of this file (e.g. at the beginning of each subfile)
+% will do no harm. Only the first call (i.e., if \mdqon is undefined)
+% performs all the definitions and settings.
+% The catcode of @ remains unchanged after processing of this file.
+% All definitions are global, the switching on of the german options
+% is local.
+% The commands \mdqon, \mdqoff, \originalTeX, \germanTeX, and
+% \selectlanguage are ``fragile'' with LaTeX and should not be used
+% within arguments of macro calls.
+% In Plain TeX, `\protect' should be \let to `\relax' normally and to
+% something like `\string' inside the arguments of `\write' or `\message'
+% (see LaTeX.TEX for all the details).
+% The command \umlautlow may need adaption to font parameters (see
+% comments there for details).
+% The commands \flqq, \frqq, \flq, \frq, and \datefrench in their
+% present forms do not work properly with all font sizes and styles,
+% they still require a better solution. A LaTeX-only solution might be
+% to use {\ly(}, {\ly(\kern-0.166em(}, {\ly)} etc., but this would not
+% work with Plain TeX.
+%
+
+% \ifundefined{mdqon} or \mdqon=\relax
+\expandafter\ifx\csname mdqon\endcsname\relax
+% \then go ahead \else do nothing
+\else \endinput \fi
+
+\message{Document Style Option `german' Version 2.3c of 28 Aug 1990}
+
+% \ifundefined{protect}
+\ifx\protect\undefined
+% \then define it
+\let\protect=\relax \fi
+
+{\catcode`\@=11 % \makeatletter
+
+\gdef\allowhyphens{\penalty\@M \hskip\z@skip}
+% {\nobreak \hskip 0pt plus 0pt\relax}
+
+\newcount\U@C\newbox\U@B\newdimen\U@D
+% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}}
+\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}}
+
+%\gdef\umlautlow{\def\"{\protect\newumlaut}}
+
+\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}}
+
+\gdef\dirtyumlautlow#1{\if#1A{\discretionary
+{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1O{\discretionary
+{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1U{\discretionary
+{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1a{\discretionary
+{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1o{\discretionary
+{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1u{\discretionary
+{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else
+\if#1s{\discretionary
+{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{}
+{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi}
+
+
+\gdef\newumlaut#1{\leavevmode
+ \vbox{\baselineskip\z@skip \lineskip.25ex
+% \baselineskip 0pt
+ \ialign{##\crcr\hidewidth
+ \setbox\U@B\hbox{#1}\U@D .01\p@\U@C\U@D
+ \U@D\ht\U@B\advance\U@D -1ex\divide\U@D \U@C
+ \U@C\U@D\U@D\the\fontdimen1\the\font
+ \multiply\U@D \U@C\divide\U@D 100\kern\U@D
+ \vbox to .20ex % <--- depending on the METAFONT parameters
+% of the fonts, the height of this \vbox
+% may vary around the value of .20ex --
+% just try out, which will look best!
+ {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}}
+
+\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1}
+
+\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\z@\ht\z@
+ \advance\dimen\z@ -\ht\tw@
+ \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@ }
+% (this lowers the german left quotes to the same level as the comma.)
+
+\gdef\@glqq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \leavevmode
+ \set@low@box{''}\box\z@\kern-.04em\allowhyphens\@SF\relax}}
+\gdef\glqq{\protect\@glqq}
+\gdef\@grqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \kern-.07em``\kern.07em\@SF\relax}
+\gdef\grqq{\protect\@grqq}
+\gdef\@glq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi \leavevmode
+ \set@low@box{'}\box\z@\kern-.04em\allowhyphens\@SF\relax}}
+\gdef\glq{\protect\@glq}
+\gdef\@grq{\kern-.07em`\kern.07em}
+\gdef\grq{\protect\@grq}
+\gdef\@flqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode \ll \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle \ll $}\fi \@SF\relax}
+\gdef\flqq{\protect\@flqq}
+\gdef\@frqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode \gg \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle \gg $}\fi \@SF\relax}
+\gdef\frqq{\protect\@frqq}
+\gdef\@flq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode < \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle < $}\fi \@SF\relax}
+\gdef\flq{\protect\@flq}
+\gdef\@frq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else
+ \let\@SF\empty \fi
+ \ifmmode > \else \leavevmode
+ \raise .2ex \hbox{$\scriptscriptstyle > $}\fi \@SF\relax}
+\gdef\frq{\protect\@frq}
+
+% enable hyphenations after \ss:
+\global\lccode`\^^Y=`\^^Y
+
+\global\let\original@three=\3 % Note that \3 may be defined or undefined.
+
+% add the quotes to the definitions of dospecials and sanitize:
+\begingroup
+\def\do{\noexpand\do\noexpand}%
+% note that "\xdef" means "\global\edef"
+\xdef\dospecials{\dospecials\do\"}%
+% not ( \ifundefined{@sanitize} or \@sanitize=\relax ) = if LaTeX
+\expandafter\ifx\csname @sanitize\endcsname\relax \else
+ \def\@makeother{\noexpand\@makeother\noexpand}%
+ \xdef\@sanitize{\@sanitize\@makeother\"}%
+\fi
+\endgroup
+
+\gdef\mdqon{\catcode`\"\active}
+\gdef\mdqoff{\catcode`\"12 }
+
+\gdef\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens}
+
+{\mdqoff
+\gdef\@UMLAUT{\"}
+\gdef\@MATHUMLAUT{\mathaccent"707F }
+\gdef\@SS{\mathchar"7019 }
+\gdef\dq{"}
+}
+
+{\mdqon
+\gdef"{\protect\active@dq}
+\gdef\active@dq{\futurelet\next@after@dq\first@active@dq}
+% For efficency, first the most frequent ones in a short macro only:
+\gdef\first@active@dq#1{%
+ \ifx \next@after@dq\bgroup\dq {#1}%
+ \else \expandafter\ifx \space\next@after@dq\dq\space #1%
+ % The two lines above are needed before everything else, to take care of
+ % (empty or non-empty) groups and spaces after the active quote!
+ % Now the real thing:
+ \else \ifx #1s\ifmmode\@SS \else \ss\fi{}%
+ % note the empty group to avoid gobbling spaces.
+ \else \ifx #1a\ifmmode\@MATHUMLAUT a\else \@UMLAUT a\fi
+ \else \ifx #1o\ifmmode\@MATHUMLAUT o\else \@UMLAUT o\fi
+ \else \ifx #1u\ifmmode\@MATHUMLAUT u\else \@UMLAUT u\fi
+ \else \ifx #1A\ifmmode\@MATHUMLAUT A\else \@UMLAUT A\fi
+ \else \ifx #1O\ifmmode\@MATHUMLAUT O\else \@UMLAUT O\fi
+ \else \ifx #1U\ifmmode\@MATHUMLAUT U\else \@UMLAUT U\fi
+ \else \ifx #1`\glqq{}%
+ \else \ifx #1'\grqq{}%
+ \else \other@active@dq{#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi }
+% And now a separate command for the less frequent ones:
+\gdef\other@active@dq#1{%
+ \ifx #1e\ifmmode\@MATHUMLAUT e\else \highumlaut e\fi
+ \else \ifx #1i\ifmmode\@MATHUMLAUT i\else \highumlaut\i \fi
+ \else \ifx #1E\ifmmode\@MATHUMLAUT E\else \highumlaut E\fi
+ \else \ifx #1I\ifmmode\@MATHUMLAUT I\else \highumlaut I\fi
+ \else \ifx #1SSS%
+ \else \ifx #1-\allowhyphens\-\allowhyphens
+ \else \ifx #1"\hskip\z@skip
+ \else \ifx #1|\discretionary{-}{}{\kern.03em}%
+ \else \ifx #1c\allowhyphens\discretionary{k-}{}{c}\allowhyphens
+ \else \ifx #1f\allowhyphens\discretionary{ff-}{}{f}\allowhyphens
+ \else \ifx #1l\allowhyphens\discretionary{ll-}{}{l}\allowhyphens
+ \else \ifx #1m\allowhyphens\discretionary{mm-}{}{m}\allowhyphens
+ \else \ifx #1n\allowhyphens\discretionary{nn-}{}{n}\allowhyphens
+ \else \ifx #1p\allowhyphens\discretionary{pp-}{}{p}\allowhyphens
+ \else \ifx #1t\allowhyphens\discretionary{tt-}{}{t}\allowhyphens
+ \else \ifx #1C\allowhyphens\discretionary{K-}{}{C}\allowhyphens
+ \else \ifx #1F\allowhyphens\discretionary{FF-}{}{F}\allowhyphens
+ \else \ifx #1L\allowhyphens\discretionary{LL-}{}{L}\allowhyphens
+ \else \ifx #1M\allowhyphens\discretionary{MM-}{}{M}\allowhyphens
+ \else \ifx #1N\allowhyphens\discretionary{NN-}{}{N}\allowhyphens
+ \else \ifx #1P\allowhyphens\discretionary{PP-}{}{P}\allowhyphens
+ \else \ifx #1T\allowhyphens\discretionary{TT-}{}{T}\allowhyphens
+ \else \ifx #1<\flqq{}%
+ \else \ifx #1>\frqq{}%
+ % note the empty group to avoid gobbling spaces.
+ \else \ifx #1\active@dq\hskip\z@skip
+ \else \dq #1%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi }
+} % end of \mdqon
+
+\gdef\dateaustrian{\def\today{\number\day.~\ifcase\month\or
+ J\"anner\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Juli\or August\or September\or Oktober\or November\or Dezember\fi
+ \space\number\year}}
+\gdef\dategerman{\def\today{\number\day.~\ifcase\month\or
+ Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Juli\or August\or September\or Oktober\or November\or Dezember\fi
+ \space\number\year}}
+\gdef\dateUSenglish{\def\today{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\day, \number\year}}
+\gdef\dateenglish{\def\today{\ifcase\day\or
+ 1st\or 2nd\or 3rd\or 4th\or 5th\or
+ 6th\or 7th\or 8th\or 9th\or 10th\or
+ 11th\or 12th\or 13th\or 14th\or 15th\or
+ 16th\or 17th\or 18th\or 19th\or 20th\or
+ 21st\or 22nd\or 237rd\or 24th\or 25th\or
+ 26th\or 27th\or 28th\or 29th\or 30th\or
+ 31st\fi
+ ~\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space \number\year}}
+\gdef\datefrench{\def\today{\ifnum\day=1\relax 1\/$^{\rm er}$\else
+ \number\day\fi \space\ifcase\month\or
+ janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
+ juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi
+ \space\number\year}}
+
+% Here is, how you can modify the LaTeX document style files and option
+% files, to benefit from the following \captionsxxxxx commands. Def's like
+% \def\tableofcontents{\section*{Contents\markboth{CONTENTS}{CONTENTS}}
+% \@starttoc{toc}}
+% should be redefined by def's like
+% \def\contentsname{Contents} % <---
+% \def\tableofcontents{\section*{\contentsname
+% \markboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}}
+% \@starttoc{toc}}
+% (it's best to put all these new lines to the end of the origignal files),
+% and of course, you should modify the change date in the file header and
+% in the \typeout command.
+
+\gdef\captionsgerman{%
+\def\refname{Literatur}%
+\def\abstractname{Zusammenfassung}%
+\def\bibname{Literaturverzeichnis}%
+\def\chaptername{Kapitel}%
+\def\appendixname{Anhang}%
+\def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt
+\def\listfigurename{Abbildungsverzeichnis}%
+\def\listtablename{Tabellenverzeichnis}%
+\def\indexname{Index}%
+\def\figurename{Abbildung}%
+\def\tablename{Tabelle}% % oder: Tafel
+\def\partname{Teil}%
+\def\enclname{Anlage(n)}% % oder: Beilage(n)
+\def\ccname{Verteiler}% % oder: Kopien an
+\def\headtoname{An}%
+\def\pagename{Seite}}
+
+\gdef\captionsenglish{%
+\def\refname{References}%
+\def\abstractname{Abstract}%
+\def\bibname{Bibliography}%
+\def\chaptername{Chapter}%
+\def\appendixname{Appendix}%
+\def\contentsname{Contents}%
+\def\listfigurename{List of Figures}%
+\def\listtablename{List of Tables}%
+\def\indexname{Index}%
+\def\figurename{Figure}%
+\def\tablename{Table}%
+\def\partname{Part}%
+\def\enclname{encl}%
+\def\ccname{cc}%
+\def\headtoname{To}%
+\def\pagename{Page}}
+
+\gdef\captionsfrench{%
+\def\refname{R\'ef\'erences}%
+\def\abstractname{R\'esum\'e}%
+\def\bibname{Bibliographie}%
+\def\chaptername{Chapitre}%
+\def\appendixname{Annexe}%
+\def\contentsname{Table des mati\`eres}%
+\def\listfigurename{Liste des figures}%
+\def\listtablename{Liste des tableaux}%
+\def\indexname{Index}%
+\def\figurename{Figure}%
+\def\tablename{Tableau}%
+\def\partname{Partie}%
+\def\enclname{P.~J.}%
+\def\ccname{Copie \`a}%
+\def\headtoname{A}%
+\def\pagename{Page}}
+
+\newcount\l@nguage
+% This will be re-declared as \language if the latter has not yet been
+% declared neither by Ferguson's ``Multilingual T^eX'' nor by TeX 3:
+% \ifundefined{language}
+\expandafter\ifx\csname language\endcsname\relax
+\global\let\language=\l@nguage
+\fi
+
+\newcount\USenglish \global\USenglish=0
+\newcount\german \global\german=1
+\newcount\austrian \global\austrian=2
+\newcount\french \global\french=3
+\newcount\english \global\english=4
+
+\gdef\selectlanguage#1{\language #1\relax
+ \expandafter\ifcase #1\relax
+ \dateUSenglish \captionsenglish \or
+ \dategerman \captionsgerman \or
+ \dateaustrian \captionsgerman \or
+ \datefrench \captionsfrench \or
+ \dateenglish \captionsenglish \fi}
+
+% \ifundefined{setlanguage} (= TeX version < 3 )
+\expandafter\ifx\csname setlanguage\endcsname\relax
+\global\let\setlanguage=\selectlanguage
+\fi
+
+\gdef\originalTeX{\mdqoff \umlauthigh \let\3\original@three
+ \selectlanguage{\USenglish}}
+\gdef\germanTeX{\mdqon \umlautlow \let\3\ss
+ \selectlanguage{\german}}
+
+} % return to previous catcodes
+
+% Now, switch on what is appropriate for german:
+
+\germanTeX
+
+% This is the end of GERMAN.STY/DOC/TEX.
+\endinput
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex
new file mode 100644
index 0000000000..d0caa18510
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex
@@ -0,0 +1,1372 @@
+% File LPLAIN - Created 29 October 1985 from plain version 1.5CM
+% - Last modified 20 October 1988 to take into account
+% changes to PLAIN.TEX reported by Arthur Ogawa
+% - Modified February 8, 1990 by Dominik Wujastyk to
+% match the PLAIN.TEX meant for TeX 3.0 (\fmtname{plain},
+% \fmtversion{3.0}).
+% - Modified March 15, 1990 by Frank Mittelbach to
+% allow the use of this file both in TeX 2 and 3
+% - Modified June 21, 1991 by RmS to clear the
+% contents of \box0.
+% - Modified July 1, 1991, by RmS to correct \multispan bug.
+% - Modified August 14, 1991, By RmS to make \cases work
+% with NFSS.
+% - Modified October 30, 1991, by RmS to remove \catcode and
+% \mathcode assignments for control characters.
+% - Modified November 1, 1991, by RmS to remove ^^A and ^^K
+% control characters.
+% - Modified November 4, 1991, by RmS to add missing \m@th
+% assignments and to introduce the file lhyphen.tex.
+% - Modified November 7, 1991, by RmS to make it work with
+% MLTeX version 2.
+% - Modified March 17, 1992, by RmS to match changes in
+% plain.tex of March 16, 1992.
+%
+% This is the LaTeX version of the plain TeX format that's described in
+% The TeXbook. All modifications can be found by searching for
+% the word 'LaTeX'.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\_\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% more macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 20 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+% LaTeX change: remove \outer from \newcount and \newdimen (FMi)
+% This is necessary to use \newcount inside \if...
+% later on.
+
+\def\newcount{\alloc@0\count\countdef\insc@unt}
+\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
+
+% LaTeX change: the PLAIN \centering dimension conflicts with
+% LaTeX's \centering command, so it is redefined to \@centering.
+% This dimension is used by LaTeX.
+
+\newskip\@centering \@centering=0pt plus 1000pt minus 1000pt
+
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip \z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+\message{compatibility for TeX 2, }
+
+% If this file is used in an old TeX we define the new features
+% of TeX 3.0 as simple macros or counters so that files that uses
+% these features can be processed in such an environment
+% (They will however produce some other results).
+
+\ifx\undefined\inputlineno
+ \newcount\inputlineno
+ \inputlineno-1 % this could be used to detect that
+ % an old TeX is in force
+ \ifx\undefined\language % extra test for MLTeX 2, RmS 91/11/07
+ \newcount\language
+ \fi
+ \newcount\lefthyphenmin
+ \newcount\righthyphenmin
+ \newcount\errorcontextlines
+ \newcount\holdinginserts
+ \newdimen\emergencystretch
+ \newcount\badness
+ \let\noboundary\relax
+ \newcount\setlanguage
+\fi
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+% LaTeX font definitions are taken from the file LFONTS.TEX,
+% so all of PLAIN's font definitions are commented out.
+
+%\message{fonts,}
+%
+%\font\tenrm=cmr10 % roman text
+%\font\preloaded=cmr9
+%\font\preloaded=cmr8
+%\font\sevenrm=cmr7
+%\font\preloaded=cmr6
+%\font\fiverm=cmr5
+%
+%\font\teni=cmmi10 % math italic
+%\font\preloaded=cmmi9
+%\font\preloaded=cmmi8
+%\font\seveni=cmmi7
+%\font\preloaded=cmmi6
+%\font\fivei=cmmi5
+%
+%\font\tensy=cmsy10 % math symbols
+%\font\preloaded=cmsy9
+%\font\preloaded=cmsy8
+%\font\sevensy=cmsy7
+%\font\preloaded=cmsy6
+%\font\fivesy=cmsy5
+%
+%\font\tenex=cmex10 % math extension
+%
+%\font\preloaded=cmss10 % sans serif
+%\font\preloaded=cmssq8
+%
+%\font\preloaded=cmssi10 % sans serif italic
+%\font\preloaded=cmssqi8
+%
+%\font\tenbf=cmbx10 % boldface extended
+%\font\preloaded=cmbx9
+%\font\preloaded=cmbx8
+%\font\sevenbf=cmbx7
+%\font\preloaded=cmbx6
+%\font\fivebf=cmbx5
+%
+%\font\tentt=cmtt10 % typewriter
+%\font\preloaded=cmtt9
+%\font\preloaded=cmtt8
+%
+%\font\preloaded=cmsltt10 % slanted typewriter
+%
+%\font\tensl=cmsl10 % slanted roman
+%\font\preloaded=cmsl9
+%\font\preloaded=cmsl8
+%
+%\font\tenit=cmti10 % text italic
+%\font\preloaded=cmti9
+%\font\preloaded=cmti8
+%\font\preloaded=cmti7
+%
+%\message{more fonts,}
+%\font\preloaded=cmu10 % unslanted text italic
+%
+%\font\preloaded=cmmib10 % bold math italic
+%\font\preloaded=cmbsy10 % bold math symbols
+%
+%\font\preloaded=cmcsc10 % caps and small caps
+%
+%\font\preloaded=cmssbx10 % sans serif bold extended
+%
+%\font\preloaded=cmdunh10 % Dunhill style
+%
+%\font\preloaded=cmr7 scaled \magstep4 % for titles
+%\font\preloaded=cmtt10 scaled \magstep2
+%\font\preloaded=cmssbx10 scaled \magstep2
+%
+%\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+%
+%% Additional \preloaded fonts can be specified here.
+%% (And those that were \preloaded above can be eliminated.)
+%
+%\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+%
+%\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+%\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+%
+%\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+%\def\rm{\fam\z@\tenrm}
+%\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+%\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
+%\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+%\def\cal{\fam\tw@}
+%\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+%\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
+%\textfont\itfam=\tenit
+%\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
+%\textfont\slfam=\tensl
+%\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
+%\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+%\scriptscriptfont\bffam=\fivebf
+%\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
+%\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+\def\lq{`} \def\rq{'}
+\def\lbrack{[} \def\rbrack{]}
+
+\let\endgraf=\par \let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={ \let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ } % tie
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+% \line changed to \@@line because LaTeX redefines \line
+\def\@@line{\hbox to\hsize}
+\def\leftline#1{\@@line{#1\hss}}
+\def\rightline#1{\@@line{\hss#1}}
+\def\centerline#1{\@@line{\hss#1\hss}}
+% end of LaTeX \line -> \@@line change
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround=\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1\relax
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+% LaTeX has its own tabbing environment, so PLAIN's is disabled.
+%
+%\newif\ifus@ \newif\if@cr
+%\newbox\tabs \newbox\tabsyet \newbox\tabsdone
+%
+%\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+%\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+%\let\+=\relax % in case this file is being read in twice
+%\def\sett@b{\ifx\next\+\let\next\relax
+% \def\next{\afterassignment\s@tt@b\let\next}%
+% \else\let\next\s@tcols\fi\next}
+%\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
+%\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+%\outer\def\+{\tabalign}
+%\def\s@tcols#1\columns{\count@#1 \dimen@\hsize
+% \loop\ifnum\count@>\z@ \@nother \repeat}
+%\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+% \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+% \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+%
+%\def\m@ketabbox{\begingroup
+% \global\setbox\tabsyet\copy\tabs
+% \global\setbox\tabsdone\null
+% \def\cr{\@crtrue\crcr\egroup\egroup
+% \ifus@\unvbox\z@\lastbox\fi\endgroup
+% \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+% \setbox\z@\vbox\bgroup\@crfalse
+% \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+%
+%\def\t@bbox{\setbox\z@\hbox\bgroup}
+%\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+% \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+% \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+% \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+% \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+% \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+% \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+%% RmS 91/11/04: Removed \itemitem since never needed/useful on LaTeX.
+%\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+% LaTeX has its own sectioning macros
+%\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+% \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+% \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\def\aa{\accent23a}
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} % put characters over each other
+\def\ooalign{\lineskiplimit-\maxdimen \oalign}
+
+% LaTeX change: \d, \b, \c redefined to work in a moving argument.
+\def\pd#1{\oalign{#1\crcr\hidewidth.\hidewidth}}
+\def\d{\protect\pd}
+
+\def\pb#1{\oalign{#1\crcr\hidewidth
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}
+\def\b{\protect\pb}
+
+\def\pc#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
+ \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi}
+\def\c{\protect\pc}
+% end of LaTeX change to \d, \b, \c
+
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+
+% LaTeX change: \ldots is redefined to do essentially what Plain's \dots does,
+% so ...
+\def\dots{\ldots}
+
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\def\v#1{{\accent20 #1}} \let\^^_=\v
+\def\u#1{{\accent21 #1}} \let\^^S=\u
+\def\=#1{{\accent22 #1}}
+\def\^#1{{\accent94 #1}} \let\^^D=\^
+\def\.#1{{\accent95 #1}}
+\def\H#1{{\accent"7D #1}}
+\def\~#1{{\accent"7E #1}}
+%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the
+following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut
+
+% LaTeX change: Make \t work in a moving argument.
+\def\pt#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+\def\t{\protect\pt}
+
+% LaTeX change: \kern\z@ added to end of \hrulefill and \dotfill
+% to make them work in `tabular' and `array' environments.
+% (Change made 24 July 1987).
+\def\hrulefill{\leaders\hrule\hfill\kern\z@}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill\kern\z@}
+
+\def\rightarrowfill{$\m@th\mathord-\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord-$}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru
+ \bracelu\leaders\vrule\hfill\bracerd$}
+\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd
+ \braceld\leaders\vrule\hfill\braceru$}
+
+% LaTeX change: \bye is eliminated.
+%\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^ \let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A \let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352 \def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348 \def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E \let\land=\wedge
+\mathchardef\vee="225F \let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=} \let\ne=\neq
+\mathchardef\leq="3214 \let\le=\leq
+\mathchardef\geq="3215 \let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233 \let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220 \let\gets=\leftarrow
+\mathchardef\rightarrow="3221 \let\to=\rightarrow
+\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+
+% LaTeX Change: \longrightarrow and \longleftarrow redefined to make
+% then robust.
+\def\longrightarrow{\protect\@lra}
+ \def\@lra{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\protect\@lla}
+ \def\@lla{\leftarrow\joinrel\relbar}
+% End of LaTeX change to \longrightarrow and \longleftarrow
+
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+
+% LaTeX change: make \ldots work outside math mode too.
+\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\ldots{\protect\pldots}
+\def\pldots{\relax\ifmmode\@ldots\else\mbox{$\m@th\@ldots\,$}\fi}
+% End of LaTeX change to \ldots
+
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 }
+\def\grave{\mathaccent"7012 }
+\def\ddot{\mathaccent"707F }
+\def\tilde{\mathaccent"707E }
+\def\bar{\mathaccent"7016 }
+\def\breve{\mathaccent"7015 }
+\def\check{\mathaccent"7014 }
+\def\hat{\mathaccent"705E }
+\def\vec{\mathaccent"017E }
+\def\dot{\mathaccent"705F }
+\def\widetilde{\mathaccent"0365 }
+\def\widehat{\mathaccent"0362 }
+\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}}
+
+\def\lmoustache{\delimiter"437A340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"537B341 } % top from ), bottom from (
+\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads
+\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads
+\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D } \let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 } \let\}=\rbrace
+\def\lbrace{\delimiter"4266308 } \let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox
+\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}
+ \mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@}
+\newif\ifv@ \newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\m@th\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+%% RmS 91/08/14 inserted extra braces around entry for NFSS
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad{##}\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+
+% LaTeX: following command is moved after the \tenex font is defined
+% by LFONTS
+%\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+
+% LaTeX change: \eqalign eliminated, since it is replaced by the
+% eqnarray environment.
+%
+%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+% \crcr#1\crcr}}\,}
+
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse
+ \vskip-\lineskiplimit \vskip\normallineskiplimit
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+
+% LaTeX: The following \eqalign type macros are eliminated, since
+% they are replaced by the eqnarray environment.
+%
+%\def\eqalignno#1{\displ@y \tabskip\centering
+% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+% &\llap{$\@lign##$}\tabskip\z@skip\crcr
+% #1\crcr}}
+%\def\leqalignno#1{\displ@y \tabskip\centering
+% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+% &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+% #1\crcr}}
+
+% Definitions related to output
+
+% LaTeX uses its own output routine
+%
+%\message{output routines,}
+%
+%\countdef\pageno=0 \pageno=1 % first page is number 1
+%\newtoks\headline \headline={\hfil} % headline is normally blank
+%\newtoks\footline \footline={\hss\tenrm\folio\hss}
+% % footline is normally a centered page number in font \tenrm
+%\newif\ifr@ggedbottom
+%\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+%\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+%\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+%\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+%\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+% \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+% LaTeX does use the same insert for footnotes as PLAIN
+\newinsert\footins
+
+%\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+% \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+% #1\@sf\vfootnote{#1}}
+%\def\vfootnote#1{\insert\footins\bgroup
+% \interlinepenalty\interfootnotelinepenalty
+% \splittopskip\ht\strutbox % top baseline for broken footnotes
+% \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+% \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+% \textindent{#1}\footstrut\futurelet\next\fo@t}
+%\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+% \else\let\next\f@t\fi \next}
+%\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+%\def\f@t#1{#1\@foot}
+%\def\@foot{\strut\egroup}
+%\def\footstrut{\vbox to\splittopskip{}}
+
+% LaTeX leaves these initializations for the \footins insert.
+%
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+%\newinsert\topins
+%\newif\ifp@ge \newif\if@mid
+%\def\topinsert{\@midfalse\p@gefalse\@ins}
+%\def\midinsert{\@midtrue\@ins}
+%\def\pageinsert{\@midfalse\p@getrue\@ins}
+%\skip\topins=\z@skip % no space added when a topinsert is present
+%\count\topins=1000 % magnification factor (1 to 1)
+%\dimen\topins=\maxdimen % no limit per page
+%\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+%\def\endinsert{\egroup % finish the \vbox
+% \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+% \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+% \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+% \if@mid \bigskip\box\z@\bigbreak
+% \else\insert\topins{\penalty100 % floating insertion
+% \splittopskip\z@skip
+% \splitmaxdepth\maxdimen \floatingpenalty\z@
+% \ifp@ge \dimen@\dp\z@
+% \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+% \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+%\output{\plainoutput}
+%\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+% \advancepageno
+% \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+%\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+%\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+% \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+%\def\makefootline{\baselineskip24\p@\line{\the\footline}}
+%\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+% \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+%
+%\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+% \ifvoid\footins\else % footnote info is present
+% \vskip\skip\footins
+% \footnoterule
+% \unvbox\footins\fi
+% \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+
+% LaTeX keeps PLAIN TeX's \footnoterule as the default
+%
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input sihyphen
+
+% \magnification doesn't work in LaTeX
+%
+%\def\magnification{\afterassignment\m@g\count@}
+%\def\m@g{\mag\count@
+% \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+%% FMi & RmS 91/08/26: added \errorcontextlines=\maxdimen,
+%% suggested by J. Schrod
+
+\def\tracingall{\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode
+ \errorcontextlines\maxdimen\tracingonline\@ne}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+% input LaTeX fonts and commands
+
+%% Initialize \reset@font for use with Old font selection
+
+\let\reset@font\empty
+
+\input lfonts
+\input latex
+
+% LaTeX change: moved from above.
+\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+
+% RmS 91/06/21: clear \box0
+\setbox0=\box\voidb@x
+
+% LaTeX: default values
+\normalbaselines
+% LaTeX: select 10pt font size and \rm style
+\xpt
+
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+% LaTeX: File called LPLAIN
+% Identify the current format
+\def\fmtname{lplain}\def\fmtversion{2.09-March 25, 1992}
+
+\typeout{Input any local modifications here.}
+
+\endinput
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex
new file mode 100644
index 0000000000..7289f7d32f
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex
@@ -0,0 +1,1233 @@
+% This is the plain TeX format that's described in The TeXbook.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+\mathcode`\^^D="225E % \land
+\mathcode`\^^E="023A % \lnot
+\mathcode`\^^F="3232 % \in
+\mathcode`\^^G="0119 % \pi
+\mathcode`\^^H="0115 % \lambda
+\mathcode`\^^I="010D % \gamma
+\mathcode`\^^J="010E % \delta
+\mathcode`\^^K="3222 % \uparrow
+\mathcode`\^^L="2206 % \pm
+\mathcode`\^^M="2208 % \oplus
+\mathcode`\^^N="0231 % \infty
+\mathcode`\^^O="0140 % \partial
+\mathcode`\^^P="321A % \subset
+\mathcode`\^^Q="321B % \supset
+\mathcode`\^^R="225C % \cap
+\mathcode`\^^S="225B % \cup
+\mathcode`\^^T="0238 % \forall
+\mathcode`\^^U="0239 % \exists
+\mathcode`\^^V="220A % \otimes
+\mathcode`\^^W="3224 % \leftrightarrow
+\mathcode`\^^X="3220 % \leftarrow
+\mathcode`\^^Y="3221 % \rightarrow
+\mathcode`\^^Z="8000 % \ne
+\mathcode`\^^[="2205 % \diamond
+\mathcode`\^^\="3214 % \le
+\mathcode`\^^]="3215 % \ge
+\mathcode`\^^^="3211 % \equiv
+\mathcode`\^^_="225F % \lor
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% more macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 20 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
+\newskip\centering \centering=0pt plus 1000pt minus 1000pt
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip \z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+\message{fonts,}
+
+\font\tenrm=cmr10 % roman text
+\font\preloaded=cmr9
+\font\preloaded=cmr8
+\font\sevenrm=cmr7
+\font\preloaded=cmr6
+\font\fiverm=cmr5
+
+\font\teni=cmmi10 % math italic
+\font\preloaded=cmmi9
+\font\preloaded=cmmi8
+\font\seveni=cmmi7
+\font\preloaded=cmmi6
+\font\fivei=cmmi5
+
+\font\tensy=cmsy10 % math symbols
+\font\preloaded=cmsy9
+\font\preloaded=cmsy8
+\font\sevensy=cmsy7
+\font\preloaded=cmsy6
+\font\fivesy=cmsy5
+
+\font\tenex=cmex10 % math extension
+
+\font\preloaded=cmss10 % sans serif
+\font\preloaded=cmssq8
+
+\font\preloaded=cmssi10 % sans serif italic
+\font\preloaded=cmssqi8
+
+\font\tenbf=cmbx10 % boldface extended
+\font\preloaded=cmbx9
+\font\preloaded=cmbx8
+\font\sevenbf=cmbx7
+\font\preloaded=cmbx6
+\font\fivebf=cmbx5
+
+\font\tentt=cmtt10 % typewriter
+\font\preloaded=cmtt9
+\font\preloaded=cmtt8
+
+\font\preloaded=cmsltt10 % slanted typewriter
+
+\font\tensl=cmsl10 % slanted roman
+\font\preloaded=cmsl9
+\font\preloaded=cmsl8
+
+\font\tenit=cmti10 % text italic
+\font\preloaded=cmti9
+\font\preloaded=cmti8
+\font\preloaded=cmti7
+
+\message{more fonts,}
+\font\preloaded=cmu10 % unslanted text italic
+
+\font\preloaded=cmmib10 % bold math italic
+\font\preloaded=cmbsy10 % bold math symbols
+
+\font\preloaded=cmcsc10 % caps and small caps
+
+\font\preloaded=cmssbx10 % sans serif bold extended
+
+\font\preloaded=cmdunh10 % Dunhill style
+
+\font\preloaded=cmr7 scaled \magstep4 % for titles
+\font\preloaded=cmtt10 scaled \magstep2
+\font\preloaded=cmssbx10 scaled \magstep2
+
+\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+
+% Additional \preloaded fonts can be specified here.
+% (And those that were \preloaded above can be eliminated.)
+
+\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+
+\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+
+\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+\def\rm{\fam\z@\tenrm}
+\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
+\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+\def\cal{\fam\tw@}
+\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
+\textfont\itfam=\tenit
+\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
+\textfont\slfam=\tensl
+\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
+\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+\scriptscriptfont\bffam=\fivebf
+\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
+\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+\def\lq{`} \def\rq{'}
+\def\lbrack{[} \def\rbrack{]}
+
+\let\endgraf=\par \let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={ \let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ } % tie
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+\def\line{\hbox to\hsize}
+\def\leftline#1{\line{#1\hss}}
+\def\rightline#1{\line{\hss#1}}
+\def\centerline#1{\line{\hss#1\hss}}
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround=\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1\relax
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+\newif\ifus@ \newif\if@cr
+\newbox\tabs \newbox\tabsyet \newbox\tabsdone
+
+\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+\let\+=\relax % in case this file is being read in twice
+\def\sett@b{\ifx\next\+\let\next\relax
+ \def\next{\afterassignment\s@tt@b\let\next}%
+ \else\let\next\s@tcols\fi\next}
+\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
+\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+\outer\def\+{\tabalign}
+\def\s@tcols#1\columns{\count@#1\dimen@\hsize
+ \loop\ifnum\count@>\z@ \@nother \repeat}
+\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+ \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+ \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+
+\def\m@ketabbox{\begingroup
+ \global\setbox\tabsyet\copy\tabs
+ \global\setbox\tabsdone\null
+ \def\cr{\@crtrue\crcr\egroup\egroup
+ \ifus@\unvbox\z@\lastbox\fi\endgroup
+ \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+ \setbox\z@\vbox\bgroup\@crfalse
+ \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+
+\def\t@bbox{\setbox\z@\hbox\bgroup}
+\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+ \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+ \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+ \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+ \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+ \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+ \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+ \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+ \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\def\aa{\accent23a}
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} % put characters over each other
+\def\ooalign{\lineskiplimit-\maxdimen \oalign}
+\def\d#1{\oalign{#1\crcr\hidewidth.\hidewidth}}
+\def\b#1{\oalign{#1\crcr\hidewidth
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}
+\def\c#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
+ \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi}
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+
+\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\def\v#1{{\accent20 #1}} \let\^^_=\v
+\def\u#1{{\accent21 #1}} \let\^^S=\u
+\def\=#1{{\accent22 #1}}
+\def\^#1{{\accent94 #1}} \let\^^D=\^
+\def\.#1{{\accent95 #1}}
+\def\H#1{{\accent"7D #1}}
+\def\~#1{{\accent"7E #1}}
+% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by
+the following:
+\def\"#1{\dirtyumlaut#1}
+\input def_umlaut % for testing purposes excluded
+
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+
+\def\hrulefill{\leaders\hrule\hfill}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill}
+\def\rightarrowfill{$\m@th\mathord-\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord-$}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru
+ \bracelu\leaders\vrule\hfill\bracerd$}
+\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd
+ \braceld\leaders\vrule\hfill\braceru$}
+
+\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^ \let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A \let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352 \def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348 \def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E \let\land=\wedge
+\mathchardef\vee="225F \let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=} \let\ne=\neq
+\mathchardef\leq="3214 \let\le=\leq
+\mathchardef\geq="3215 \let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233 \let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220 \let\gets=\leftarrow
+\mathchardef\rightarrow="3221 \let\to=\rightarrow
+\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+\def\longrightarrow{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\leftarrow\joinrel\relbar}
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 }
+\def\grave{\mathaccent"7012 }
+\def\ddot{\mathaccent"707F }
+\def\tilde{\mathaccent"707E }
+\def\bar{\mathaccent"7016 }
+\def\breve{\mathaccent"7015 }
+\def\check{\mathaccent"7014 }
+\def\hat{\mathaccent"705E }
+\def\vec{\mathaccent"017E }
+\def\dot{\mathaccent"705F }
+\def\widetilde{\mathaccent"0365 }
+\def\widehat{\mathaccent"0362 }
+\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}}
+
+\def\lmoustache{\delimiter"437A340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"537B341 } % top from ), bottom from (
+\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads
+\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads
+\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D } \let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 } \let\}=\rbrace
+\def\lbrace{\delimiter"4266308 } \let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox
+\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}
+ \mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@}
+\newif\ifv@ \newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+ \crcr#1\crcr}}\,}
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse
+ \vskip-\lineskiplimit \vskip\normallineskiplimit
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+\def\eqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\z@skip\crcr
+ #1\crcr}}
+\def\leqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% Definitions related to output
+
+\message{output routines,}
+
+\countdef\pageno=0 \pageno=1 % first page is number 1
+\newtoks\headline \headline={\hfil} % headline is normally blank
+\newtoks\footline \footline={\hss\tenrm\folio\hss}
+ % footline is normally a centered page number in font \tenrm
+\newif\ifr@ggedbottom
+\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+ \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+\newinsert\footins
+\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ #1\@sf\vfootnote{#1}}
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \textindent{#1}\footstrut\futurelet\next\fo@t}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else\let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{#1\@foot}
+\def\@foot{\strut\egroup}
+\def\footstrut{\vbox to\splittopskip{}}
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+\newinsert\topins
+\newif\ifp@ge \newif\if@mid
+\def\topinsert{\@midfalse\p@gefalse\@ins}
+\def\midinsert{\@midtrue\@ins}
+\def\pageinsert{\@midfalse\p@getrue\@ins}
+\skip\topins=\z@skip % no space added when a topinsert is present
+\count\topins=1000 % magnification factor (1 to 1)
+\dimen\topins=\maxdimen % no limit per page
+\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+\def\endinsert{\egroup % finish the \vbox
+ \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+ \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+ \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+ \if@mid \bigskip\box\z@\bigbreak
+ \else\insert\topins{\penalty100 % floating insertion
+ \splittopskip\z@skip
+ \splitmaxdepth\maxdimen \floatingpenalty\z@
+ \ifp@ge \dimen@\dp\z@
+ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+ \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+\output{\plainoutput}
+\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+ \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+\def\makefootline{\baselineskip24\p@\line{\the\footline}}
+\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+ \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+
+\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+ \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+ \ifvoid\footins\else % footnote info is present
+ \vskip\skip\footins
+ \footnoterule
+ \unvbox\footins\fi
+ \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input sihyphen
+
+\def\magnification{\afterassignment\m@g\count@}
+\def\m@g{\mag\count@
+ \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+\normalbaselines\rm % select roman font
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+\def\fmtname{plain}\def\fmtversion{3.141} % identifies the current format
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile b/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile
new file mode 100644
index 0000000000..f89f936515
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile
@@ -0,0 +1,31 @@
+#
+# TransFig makefile
+#
+
+all: inst_ber.fg1.tex inst_ber.fg2.tex
+
+# translation into ps
+
+inst_ber.fg1.tex: inst_ber.fg1.ps Makefile
+ fig2ps2tex inst_ber.fg1.ps >inst_ber.fg1.tex
+clean::
+ rm -f inst_ber.fg1.tex
+
+inst_ber.fg1.ps: inst_ber.fg1.fig Makefile
+ fig2dev -L ps -m 0.8 inst_ber.fg1.fig > inst_ber.fg1.ps
+clean::
+ rm -f inst_ber.fg1.ps
+
+
+# translation into ps
+
+inst_ber.fg2.tex: inst_ber.fg2.ps Makefile
+ fig2ps2tex inst_ber.fg2.ps >inst_ber.fg2.tex
+clean::
+ rm -f inst_ber.fg2.tex
+
+inst_ber.fg2.ps: inst_ber.fg2.fig Makefile
+ fig2dev -L ps inst_ber.fg2.fig > inst_ber.fg2.ps
+clean::
+ rm -f inst_ber.fg2.ps
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux
new file mode 100644
index 0000000000..3b4181dc63
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux
@@ -0,0 +1,37 @@
+\relax
+\citation{KnuthProg}
+\citation{KnuthBook}
+\citation{Lamport}
+\citation{Kopka}
+\citation{BarthNi}
+\citation{BarthNi2}
+\citation{duden}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1}Terminologie}{2}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2}SiSiSi}{2}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3}Kurzbeschreibung des Trennverfahrens}{3}}
+\citation{BarthNi}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4}Mehrdeutigkeiten}{4}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5}Unbekannte W\string\active@dq\space orter}{6}}
+\@writefile{lof}{\string\contentsline\space {figure}{\string\numberline\space {1}{\ignorespaces Die neuen M\string\active@dq\space oglichkeiten}}{7}}
+\newlabel{bild1}{{1}{7}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {6}\string\isitex\space \ intern: Die neuen Files}{8}}
+\newlabel{kapitel6}{{6}{8}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {7}Wie erzeugt man ein druckfertiges Manuskript mit \string\isitex\space ?}{9}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {8}\string\active@dq\space `xxx\string\active@dq\space ' ist ein mehrdeutiges Wort! --- was tun?}{10}}
+\@writefile{lof}{\string\contentsline\space {figure}{\string\numberline\space {2}{\ignorespaces Die Wege der Daten}}{11}}
+\newlabel{bild2}{{2}{11}}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {9}\string\active@dq\space `xxx\string\active@dq\space ' ist ein unbekanntes Wort! --- was tun?}{12}}
+\citation{BarthNi}
+\citation{BarthNi2}
+\citation{duden}
+\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {10}\string\active@dq\space Anderung der Worttabelle}{13}}
+\newlabel{kapitel10}{{10}{13}}
+\bibcite{KnuthProg}{1}
+\bibcite{KnuthBook}{2}
+\bibcite{Lamport}{3}
+\bibcite{Kopka}{4}
+\bibcite{BarthNi}{5}
+\bibcite{BarthNi2}{6}
+\bibcite{Dante}{7}
+\bibcite{FTP}{8}
+\bibcite{duden}{9}
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi
new file mode 100644
index 0000000000..731f146890
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi
Binary files differ
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig
new file mode 100644
index 0000000000..8bd6dadda5
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig
@@ -0,0 +1,79 @@
+#FIG 2.1
+80 2
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 379 769 379 699 179 699 179 769 379 769 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 154 769 154 699 4 699 4 769 154 769 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 659 279 699 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 659 469 699 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 769 279 819 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 79 769 79 819 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 359 349 359 299 199 299 199 349 359 349 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 154 349 154 299 4 299 4 349 154 349 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 259 279 299 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 259 464 299 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 259 79 299 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 349 279 399 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 464 349 464 399 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 79 349 79 399 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 359 259 359 209 199 209 199 259 359 259 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 179 279 209 9999 9999
+2 2 0 4 -1 0 0 0 0.000 0 0 0
+ 339 179 219 179 219 149 339 149 339 179 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 659 79 699 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 359 659 359 609 199 609 199 659 359 659 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 279 579 279 609 9999 9999
+2 2 0 4 -1 0 0 0 0.000 0 0 0
+ 339 579 219 579 219 549 339 549 339 579 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 539 769 539 699 404 699 404 769 539 769 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 0 0
+ 469 769 469 819 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 524 349 524 299 404 299 404 349 524 349 9999 9999
+4 1 0 14 0 -1 0 0.00000 4 13 173 279 719 mit angegebenen Trennstellen
+4 1 0 14 0 -1 0 0.00000 4 10 120 279 740 merken in doku.mem
+4 1 0 14 0 -1 0 0.00000 4 10 72 279 761 und doku.lex
+4 1 0 14 0 -1 0 0.00000 4 10 120 79 719 merken in doku.mem
+4 1 0 14 0 -1 0 0.00000 4 10 72 79 740 und doku.lex
+4 1 0 14 0 -1 0 0.00000 4 10 93 279 839 mit Trennstellen
+4 1 0 14 0 -1 0 0.00000 4 10 105 279 860 wiederverwenden
+4 1 0 14 0 -1 0 0.00000 4 10 130 279 881 und LEXIKON am PC
+4 1 0 14 0 -1 0 0.00000 4 10 63 79 839 untrennbar
+4 1 0 14 0 -1 0 0.00000 4 10 105 79 860 wiederverwenden
+4 1 0 14 0 -1 0 0.00000 4 10 130 79 881 und LEXIKON am PC
+4 1 0 14 0 -1 0 0.00000 4 10 120 279 319 merken in doku.mem
+4 1 0 14 0 -1 0 0.00000 4 10 72 279 340 und doku.lex
+4 1 0 14 0 -1 0 0.00000 4 10 120 79 319 merken in doku.mem
+4 1 0 14 0 -1 0 0.00000 4 10 72 279 419 Trennstellen
+4 1 0 14 0 -1 0 0.00000 4 10 105 279 440 wiederverwenden
+4 1 0 14 0 -1 0 0.00000 4 10 130 279 461 und LEXIKON am PC
+4 1 0 14 0 -1 0 0.00000 4 10 72 79 419 Trennstellen
+4 1 0 14 0 -1 0 0.00000 4 10 105 79 440 wiederverwenden
+4 1 0 14 0 -1 0 0.00000 4 13 88 279 250 oder Tippfehler
+4 1 0 14 0 -1 0 0.00000 4 13 143 279 229 Auswahl einer Trennung
+4 1 0 14 0 -1 0 0.00000 4 13 110 279 169 mehrdeutiges Wort
+4 1 0 14 0 -1 0 0.00000 4 13 88 279 650 oder Tippfehler
+4 1 0 14 0 -1 0 0.00000 4 10 66 279 629 neues Wort
+4 1 0 14 0 -1 0 0.00000 4 10 105 279 569 unbekanntes Wort
+4 1 0 14 0 -1 0 0.00000 4 10 109 469 719 merken in doku.edt
+4 1 0 14 0 -1 0 0.00000 4 13 127 469 839 Tippfehler ausbessern
+4 1 0 14 0 -1 0 0.00000 4 10 109 464 319 merken in doku.edt
+4 1 0 14 0 -1 0 0.00000 4 13 127 464 419 Tippfehler ausbessern
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps
new file mode 100644
index 0000000000..3fc15415b8
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps
@@ -0,0 +1,188 @@
+%!PS-Adobe-2.0 EPSF
+%%Title: inst_ber.fg1.fig
+%%Creator: fig2dev
+%%CreationDate: Mon Aug 23 14:14:02 1993
+%%For: heinz@eiunix (Heinz Herbeck,E 186/1,58801-4107,)
+%%BoundingBox: 0 0 386 527
+%%Pages: 0
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/l {lineto} bind def
+/m {moveto} bind def
+/s {stroke} bind def
+/n {newpath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/clp {closepath} bind def
+/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+4 -2 roll mul setrgbcolor} bind def
+/col-1 {} def
+/col0 {0 0 0 setrgbcolor} bind def
+/col1 {0 0 1 setrgbcolor} bind def
+/col2 {0 1 0 setrgbcolor} bind def
+/col3 {0 1 1 setrgbcolor} bind def
+/col4 {1 0 0 setrgbcolor} bind def
+/col5 {1 0 1 setrgbcolor} bind def
+/col6 {1 1 0 setrgbcolor} bind def
+/col7 {1 1 1 setrgbcolor} bind def
+ end
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+0 setlinecap 0 setlinejoin
+-3.0 635.0 translate 0.720 -0.720 scale
+0.500 setlinewidth
+% Polyline
+n 154 769 m 154 699 l 4 699 l 4 769 l
+ clp gs col-1 s gr
+% Polyline
+n 279 659 m 279 699 l gs col-1 s gr
+% Polyline
+n 279 659 m 469 699 l gs col-1 s gr
+% Polyline
+n 279 769 m 279 819 l gs col-1 s gr
+% Polyline
+n 79 769 m 79 819 l gs col-1 s gr
+% Polyline
+n 359 349 m 359 299 l 199 299 l 199 349 l
+ clp gs col-1 s gr
+% Polyline
+n 154 349 m 154 299 l 4 299 l 4 349 l
+ clp gs col-1 s gr
+% Polyline
+n 279 259 m 279 299 l gs col-1 s gr
+% Polyline
+n 279 259 m 464 299 l gs col-1 s gr
+% Polyline
+n 279 259 m 79 299 l gs col-1 s gr
+% Polyline
+n 279 349 m 279 399 l gs col-1 s gr
+% Polyline
+n 464 349 m 464 399 l gs col-1 s gr
+% Polyline
+n 79 349 m 79 399 l gs col-1 s gr
+% Polyline
+n 359 259 m 359 209 l 199 209 l 199 259 l
+ clp gs col-1 s gr
+% Polyline
+n 279 179 m 279 209 l gs col-1 s gr
+3.000 setlinewidth
+% Polyline
+n 339 179 m 219 179 l 219 149 l 339 149 l
+ clp gs col-1 s gr
+0.500 setlinewidth
+% Polyline
+n 279 659 m 79 699 l gs col-1 s gr
+% Polyline
+n 359 659 m 359 609 l 199 609 l 199 659 l
+ clp gs col-1 s gr
+% Polyline
+n 279 579 m 279 609 l gs col-1 s gr
+3.000 setlinewidth
+% Polyline
+n 339 579 m 219 579 l 219 549 l 339 549 l
+ clp gs col-1 s gr
+0.500 setlinewidth
+% Polyline
+n 539 769 m 539 699 l 404 699 l 404 769 l
+ clp gs col-1 s gr
+% Polyline
+n 469 769 m 469 819 l gs col-1 s gr
+% Polyline
+n 524 349 m 524 299 l 404 299 l 404 349 l
+ clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 719 m
+gs 1 -1 scale (mit angegebenen Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 740 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+% Polyline
+n 379 769 m 379 699 l 179 699 l 179 769 l
+ clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 761 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+464 419 m
+gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 719 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 740 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 839 m
+gs 1 -1 scale (mit Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 860 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 881 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 839 m
+gs 1 -1 scale (untrennbar) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 860 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 881 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 319 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 340 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 319 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 419 m
+gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 440 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 461 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 419 m
+gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 440 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 250 m
+gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 229 m
+gs 1 -1 scale (Auswahl einer Trennung) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 169 m
+gs 1 -1 scale (mehrdeutiges Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 650 m
+gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 629 m
+gs 1 -1 scale (neues Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 569 m
+gs 1 -1 scale (unbekanntes Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+469 719 m
+gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+469 839 m
+gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+464 319 m
+gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+$F2psEnd
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex
new file mode 100644
index 0000000000..6ef8cc7f33
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex
@@ -0,0 +1,7 @@
+\makebox[5.361in][l]{
+ \vbox to 7.319in{
+ \vfill
+ \special{psfile=inst_ber.fg1.ps}
+ }
+ \vspace{-\baselineskip}
+}
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig
new file mode 100644
index 0000000000..486b308596
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig
@@ -0,0 +1,61 @@
+#FIG 2.1
+80 2
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 269 289 269 259 209 259 209 289 269 289 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 299 489 299 439 179 439 179 489 299 489 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 324 609 324 559 154 559 154 609 324 609 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 559 289 559 259 439 259 439 289 559 289 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 309 204 309 184 249 184 249 204 309 204 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 189 384 189 364 129 364 129 384 189 384 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 309 424 309 404 249 404 249 424 309 424 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 309 544 309 524 249 524 249 544 309 544 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 239 149 239 259 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 219 289 219 309 99 309 99 239 219 239 219 259 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 229 289 229 359 79 359 79 99 229 99 229 119 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 239 289 239 439 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 259 289 259 309 499 309 499 289 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 499 259 499 239 259 239 259 259 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+ 0 0 1.000 4.000 8.000
+ 239 489 239 559 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+ 269 149 269 119 209 119 209 149 269 149 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 194 334 194 314 124 314 124 334 194 334 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 409 334 409 314 349 314 349 334 409 334 9999 9999
+2 4 0 1 -1 0 0 0 0.000 7 0 0
+ 419 234 419 204 339 204 339 234 419 234 9999 9999
+4 1 0 14 0 -1 0 0.00000 4 10 52 239 139 EDITOR
+4 1 0 14 0 -1 0 0.00000 4 10 49 279 199 doku.tex
+4 1 0 14 0 -1 0 0.00000 4 10 40 239 279 iSiTeX
+4 1 0 14 0 -1 0 0.00000 4 10 49 159 379 doku.edt
+4 1 0 14 0 -1 0 0.00000 4 10 47 239 459 DVI2PS
+4 1 0 14 0 -1 0 0.00000 4 13 107 239 480 (..dvi to Postscript)
+4 1 0 14 0 -1 0 0.00000 4 10 42 239 579 PRINT
+4 1 0 14 0 -1 0 0.00000 4 13 155 239 600 (Postscript-Laserdrucker)
+4 1 0 14 0 -1 0 0.00000 4 10 48 279 419 doku.dvi
+4 1 0 14 0 -1 0 0.00000 4 13 44 279 539 doku.ps
+4 1 0 14 0 -1 0 0.00000 4 10 106 499 279 LEXIKON am PC
+4 1 0 14 0 -1 0 0.00000 4 10 60 159 329 doku.mem
+4 1 0 14 0 -1 0 0.00000 4 10 48 379 329 doku.lex
+4 1 0 14 0 -1 0 0.00000 4 10 67 379 224 Worttabelle
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps
new file mode 100644
index 0000000000..2334f21cc4
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps
@@ -0,0 +1,133 @@
+%!PS-Adobe-2.0 EPSF
+%%Title: inst_ber.fg2.fig
+%%Creator: fig2dev
+%%CreationDate: Mon Aug 23 13:39:57 1993
+%%For: heinz@eiunix (Heinz Herbeck,E 186/1,58801-4107,)
+%%BoundingBox: 0 0 432 459
+%%Pages: 0
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/l {lineto} bind def
+/m {moveto} bind def
+/s {stroke} bind def
+/n {newpath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/clp {closepath} bind def
+/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+4 -2 roll mul setrgbcolor} bind def
+/col-1 {} def
+/col0 {0 0 0 setrgbcolor} bind def
+/col1 {0 0 1 setrgbcolor} bind def
+/col2 {0 1 0 setrgbcolor} bind def
+/col3 {0 1 1 setrgbcolor} bind def
+/col4 {1 0 0 setrgbcolor} bind def
+/col5 {1 0 1 setrgbcolor} bind def
+/col6 {1 1 0 setrgbcolor} bind def
+/col7 {1 1 1 setrgbcolor} bind def
+ end
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+0 setlinecap 0 setlinejoin
+-72.0 549.0 translate 0.900 -0.900 scale
+0.500 setlinewidth
+% Polyline
+n 299 489 m 299 439 l 179 439 l 179 489 l
+ clp gs col-1 s gr
+% Polyline
+n 324 609 m 324 559 l 154 559 l 154 609 l
+ clp gs col-1 s gr
+% Polyline
+n 559 289 m 559 259 l 439 259 l 439 289 l
+ clp gs col-1 s gr
+% Polyline
+n 256 184 m 249 184 249 197 7 arcto 4 {pop} repeat 249 204 302 204 7 arcto 4 {pop} repeat 309 204 309 191 7 arcto 4 {pop} repeat 309 184 256 184 7 arcto 4 {pop} repeat clp gs col-1 s gr
+% Polyline
+n 136 364 m 129 364 129 377 7 arcto 4 {pop} repeat 129 384 182 384 7 arcto 4 {pop} repeat 189 384 189 371 7 arcto 4 {pop} repeat 189 364 136 364 7 arcto 4 {pop} repeat clp gs col-1 s gr
+% Polyline
+n 256 404 m 249 404 249 417 7 arcto 4 {pop} repeat 249 424 302 424 7 arcto 4 {pop} repeat 309 424 309 411 7 arcto 4 {pop} repeat 309 404 256 404 7 arcto 4 {pop} repeat clp gs col-1 s gr
+% Polyline
+n 256 524 m 249 524 249 537 7 arcto 4 {pop} repeat 249 544 302 544 7 arcto 4 {pop} repeat 309 544 309 531 7 arcto 4 {pop} repeat 309 524 256 524 7 arcto 4 {pop} repeat clp gs col-1 s gr
+% Polyline
+n 239 149 m 239 259 l gs col-1 s gr
+n 241.000 251.000 m 239.000 259.000 l 237.000 251.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 219 289 m 219 309 l 99 309 l 99 239 l
+ 219 239 l 219 259 l gs col-1 s gr
+n 221.000 251.000 m 219.000 259.000 l 217.000 251.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 229 289 m 229 359 l 79 359 l 79 99 l
+ 229 99 l 229 119 l gs col-1 s gr
+n 231.000 111.000 m 229.000 119.000 l 227.000 111.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 239 289 m 239 439 l gs col-1 s gr
+n 241.000 431.000 m 239.000 439.000 l 237.000 431.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 259 289 m 259 309 l 499 309 l 499 289 l gs col-1 s gr
+n 497.000 297.000 m 499.000 289.000 l 501.000 297.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 499 259 m 499 239 l 259 239 l 259 259 l gs col-1 s gr
+n 261.000 251.000 m 259.000 259.000 l 257.000 251.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 239 489 m 239 559 l gs col-1 s gr
+n 241.000 551.000 m 239.000 559.000 l 237.000 551.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 269 149 m 269 119 l 209 119 l 209 149 l
+ clp gs col-1 s gr
+% Polyline
+n 269 289 m 269 259 l 209 259 l 209 289 l
+ clp gs col-1 s gr
+% Polyline
+n 131 314 m 124 314 124 327 7 arcto 4 {pop} repeat 124 334 187 334 7 arcto 4 {pop} repeat 194 334 194 321 7 arcto 4 {pop} repeat 194 314 131 314 7 arcto 4 {pop} repeat clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+379 224 m
+gs 1 -1 scale (Worttabelle) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+% Polyline
+n 356 314 m 349 314 349 327 7 arcto 4 {pop} repeat 349 334 402 334 7 arcto 4 {pop} repeat 409 334 409 321 7 arcto 4 {pop} repeat 409 314 356 314 7 arcto 4 {pop} repeat clp gs col-1 s gr
+% Polyline
+n 346 204 m 339 204 339 227 7 arcto 4 {pop} repeat 339 234 412 234 7 arcto 4 {pop} repeat 419 234 419 211 7 arcto 4 {pop} repeat 419 204 346 204 7 arcto 4 {pop} repeat clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 139 m
+gs 1 -1 scale (EDITOR) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 199 m
+gs 1 -1 scale (doku.tex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 279 m
+gs 1 -1 scale (iSiTeX) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+159 379 m
+gs 1 -1 scale (doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 459 m
+gs 1 -1 scale (DVI2PS) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 480 m
+gs 1 -1 scale (\(..dvi to Postscript\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 579 m
+gs 1 -1 scale (PRINT) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 600 m
+gs 1 -1 scale (\(Postscript-Laserdrucker\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 419 m
+gs 1 -1 scale (doku.dvi) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 539 m
+gs 1 -1 scale (doku.ps) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+499 279 m
+gs 1 -1 scale (LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+159 329 m
+gs 1 -1 scale (doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+379 329 m
+gs 1 -1 scale (doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+$F2psEnd
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex
new file mode 100644
index 0000000000..9d35f02a29
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex
@@ -0,0 +1,7 @@
+\makebox[6.000in][l]{
+ \vbox to 6.375in{
+ \vfill
+ \special{psfile=inst_ber.fg2.ps}
+ }
+ \vspace{-\baselineskip}
+}
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex
new file mode 100644
index 0000000000..806b45fec9
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex
@@ -0,0 +1,16 @@
+ hyphenation
+barth
+nirschl
+sisisi
+duden
+ penalties
+ defaultm"a"sig
+ underfull
+f"uchse
+ dudenregeln
+initex
+leslie
+document
+ preparation
+addison
+wesley
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log
new file mode 100644
index 0000000000..3dc7c7ff3a
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log
@@ -0,0 +1,180 @@
+This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92} (C version d) (format=silplain 93.8.19) 23 AUG 1993 13:39
+**inst_ber.tex
+(inst_ber.tex
+ILaTeX Version 2.09 <13 Jun 1989>
+(/usr/local/lib/tex/inputs/article.sty
+Document Style `article' <16 Mar 88>, modified at TUW <11 Apr 89>.
+(/usr/local/lib/tex/inputs/art12.sty)
+\c@part=\count80
+\c@section=\count81
+\c@subsection=\count82
+\c@subsubsection=\count83
+\c@paragraph=\count84
+\c@subparagraph=\count85
+\c@figure=\count86
+\c@table=\count87
+) (/usr/local/lib/tex/inputs/sigerman.sty
+Document Style Option `german' Version 2.3c of 28 Aug 1990
+\U@C=\count88
+\U@B=\box29
+\U@D=\dimen99
+\l@nguage=\count89
+\USenglish=\count90
+\german=\count91
+\austrian=\count92
+\french=\count93
+\english=\count94
+) (transfig.tex
+TransFig: figures in PostScript.
+) (inst_ber.aux) (inst_ber.toc)
+\tf@toc=\write3
+ [0
+
+] [1] [2]
+Overfull \hbox (1.11171pt too wide) in paragraph at lines 146--153
+[][]\twlit SiSiSi \twlrm un-ter-stmtzt eine sinnent-sprechen-de Tren-nung, in-d
+em es die \twlbf Haupt-
+
+\hbox(8.33331+2.33331)x390.0, glue set - 1.0
+.\hbox(0.0+0.0)x17.62482
+.\setlanguage1 (hyphenmin 2,3)
+.\twlit S
+.\twlit i
+.\twlit S
+.etc.
+
+[3] [4] [5] (inst_ber.fg1.tex) [6] [7] [8] [9] (inst_ber.fg2.tex)
+Overfull \hbox (43.62pt too wide) in paragraph at lines 1--469
+[][]
+
+\hbox(460.72124+0.0)x390.0
+.\hbox(0.0+0.0)x0.0
+.\hbox(460.72124+0.0)x433.62, glue set 425.78674fil
+..\glue 3.91663 plus 1.95831 minus 1.30554
+..\vbox(460.72124+0.0)x0.0, glue set 460.72124fill
+...\glue 0.0 plus 1.0fill
+...\special{psfile=inst_ber.fg2.ps}
+..\glue 3.91663 plus 1.95831 minus 1.30554
+..\vadjust
+...\glue -14.5
+...\glue 0.0
+..\glue 0.0 plus 1.0fil minus 1.0fil
+.\glue(\rightskip) 0.0
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 1--469
+
+
+\hbox(0.0+0.0)x390.0
+.\glue(\rightskip) 0.0
+
+[10] [11]
+Overfull \hbox (13.19629pt too wide) in paragraph at lines 544--544
+[] []\twltt (`-' Nebentrennstelle, `=' Haupttrennstelle, `.' Weiterruecken,[]
+
+\hbox(8.33333+2.66667)x390.0
+.\hbox(0.0+0.0)x0.0
+.\penalty 10000
+.\glue 6.29994
+.\setlanguage1 (hyphenmin 2,3)
+.\twltt (
+.etc.
+
+[12]
+Underfull \hbox (badness 10000) in paragraph at lines 598--599
+
+
+\hbox(0.0+0.0)x390.0
+.\glue(\rightskip) 0.0
+
+
+Underfull \hbox (badness 7273) in paragraph at lines 604--606
+[][]\twlrm Wie 1, je-doch kann die-
+
+\hbox(8.33331+2.33331)x156.49014, glue set 4.17557
+.\hbox(0.0+0.0)x0.0
+.\setlanguage1 (hyphenmin 2,3)
+.\twlrm W
+.\twlrm i
+.\twlrm e
+.etc.
+
+
+Underfull \hbox (badness 1048) in paragraph at lines 611--612
+\twlrm Trenn-stel-le, nach dem \twlit k\twlrm -ten
+
+\hbox(8.33331+2.33331)x156.49014, glue set 2.19072
+.\twlrm T
+.\kern-0.97916
+.\twlrm r
+.\twlrm e
+.\twlrm n
+.etc.
+
+
+Underfull \hbox (badness 1430) in paragraph at lines 616--616
+[][]\twlrm Nach der Vor-sil-be wird ge-
+
+\hbox(8.33331+2.33331)x156.49014, glue set 2.42874
+.\hbox(0.0+0.0)x0.0
+.\setlanguage1 (hyphenmin 2,3)
+.\twlrm N
+.\twlrm a
+.\twlrm c
+.etc.
+
+
+Overfull \hbox (46.36421pt too wide) in paragraph at lines 600--620
+[]
+
+\hbox(112.94995+106.94994)x390.0
+.\hbox(112.94995+106.94994)x436.36421
+..\mathon
+..\vbox(112.94995+106.94994)x436.36421
+...\rule(0.4+0.0)x436.36421
+...\hbox(10.14995+4.35004)x436.36421 []
+...\rule(0.4+0.0)x436.36421
+...\hbox(10.14995+18.85004)x436.36421 []
+...\rule(0.4+0.0)x436.36421
+...etc.
+..\mathoff
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (44.73192pt too wide) in paragraph at lines 600--620
+[]
+
+\hbox(47.29997+41.29996)x390.0
+.\hbox(47.29997+41.29996)x434.73192
+..\mathon
+..\vbox(47.29997+41.29996)x434.73192
+...\rule(0.4+0.0)x434.73192
+...\hbox(10.14995+4.35004)x434.73192 []
+...\rule(0.4+0.0)x434.73192
+...\hbox(10.14995+18.85004)x434.73192 []
+...\rule(0.4+0.0)x434.73192
+...etc.
+..\mathoff
+.\penalty 10000
+.\glue 0.0 plus 1.0fil
+.\penalty -10000
+.\glue(\rightskip) 0.0
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 600--620
+
+
+\hbox(0.0+0.0)x390.0
+.\glue(\rightskip) 0.0
+
+[13] [14] [15] (inst_ber.aux) )
+Here is how much of TeX's memory you used:
+ 259 strings out of 11972
+ 2366 string characters out of 87201
+ 38859 words of memory out of 262141
+ 2219 multiletter control sequences out of 9500
+ 21837 words of font info for 84 fonts, out of 100000 for 255
+ 0 hyphenation exceptions out of 607
+ 13i,15n,15p,218b,339s stack positions out of 300i,40n,60p,3000b,4000s
+
+Output written on inst_ber.dvi (16 pages, 46448 bytes).
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem
new file mode 100644
index 0000000000..2c6bf9be52
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem
@@ -0,0 +1,224 @@
+21
+ 23 15 18 20 26 21 19 1 13 13 5 14 19 5 20 26 21 14 7 5 14
+ 1 1 1 4 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 1
+f
+12
+ 20 18 5 14 14 19 20 5 12 12 5 14
+ 1 1 1 1 2 1 1 1 2 1 1 1
+f
+11
+ 8 25 16 8 5 14 1 20 9 15 14
+ 1 1 1 1 1 1 1 1 1 1 1
+t
+5
+ 2 1 18 20 8
+ 1 1 1 1 1
+t
+7
+ 14 9 18 19 3 8 12
+ 1 1 1 1 1 1 1
+t
+18
+ 19 9 14 14 5 14 20 19 16 18 5 3 8 5 14 4 5 14
+ 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1
+f
+6
+ 19 9 19 9 19 9
+ 1 1 1 1 1 1
+t
+11
+ 14 1 8 20 19 20 5 12 12 5 14
+ 1 1 1 2 1 1 1 2 1 1 1
+f
+5
+ 4 21 4 5 14
+ 1 2 1 1 1
+t
+11
+ 23 15 18 20 20 1 2 5 12 12 5
+ 1 1 1 2 1 2 1 1 2 1 1
+f
+16
+ 23 15 18 20 2 5 19 20 1 14 4 20 5 9 12 5
+ 1 1 1 4 1 2 1 1 1 1 1 1 1 2 1 1
+f
+14
+ 1 13 5 18 9 11 1 14 9 19 3 8 5 14
+ 1 1 2 1 2 1 2 1 1 1 1 1 1 1
+f
+11
+ 20 18 5 14 14 19 20 5 12 12 5
+ 1 1 1 1 2 1 1 1 2 1 1
+f
+8
+ 16 1 19 19 5 14 4 5
+ 1 1 2 1 1 2 1 1
+f
+10
+ 5 9 7 5 14 14 1 13 5 14
+ 1 2 1 1 4 1 2 1 1 1
+f
+17
+ 19 9 14 14 5 14 20 19 16 18 5 3 8 5 14 4 5
+ 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1
+f
+17
+ 14 5 2 5 14 20 18 5 14 14 19 20 5 12 12 5 14
+ 1 2 1 1 4 1 1 1 1 2 1 1 1 2 1 1 1
+f
+9
+ 16 5 14 1 12 20 9 5 19
+ 1 1 1 1 2 1 1 1 1
+t
+12
+ 4 5 6 1 21 12 20 13 27 30 9 7
+ 1 2 1 1 1 1 2 1 1 1 1 1
+t
+17
+ 8 1 21 16 20 20 18 5 14 14 19 20 5 12 12 5 14
+ 1 1 1 1 4 1 1 1 1 2 1 1 1 2 1 1 1
+f
+12
+ 6 21 7 5 14 26 5 9 3 8 5 14
+ 1 2 1 1 4 1 1 2 1 1 1 1
+f
+9
+ 2 5 19 20 5 8 5 14 4
+ 1 2 1 1 1 1 1 1 1
+f
+10
+ 21 14 16 1 19 19 5 14 4 5
+ 1 2 1 1 2 1 1 2 1 1
+f
+16
+ 19 9 14 14 5 14 20 19 20 5 12 12 5 14 4 5
+ 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1
+f
+12
+ 1 2 20 18 5 14 14 21 14 7 5 14
+ 1 2 1 1 1 2 1 1 2 1 1 1
+f
+18
+ 5 9 14 26 5 12 2 5 19 20 1 14 4 20 5 9 12 5
+ 1 1 2 1 1 4 1 2 1 1 1 1 1 1 1 2 1 1
+f
+8
+ 2 5 20 20 18 21 8 5
+ 1 1 1 4 1 2 1 1
+f
+16
+ 8 1 21 16 20 20 18 5 14 14 19 20 5 12 12 5
+ 1 1 1 1 4 1 1 1 1 2 1 1 1 2 1 1
+f
+16
+ 14 5 2 5 14 20 18 5 14 14 19 20 5 12 12 5
+ 1 2 1 1 4 1 1 1 1 2 1 1 1 2 1 1
+f
+9
+ 21 14 4 5 18 6 21 12 12
+ 1 2 1 1 2 1 1 1 1
+t
+8
+ 26 21 7 18 21 14 4 5
+ 1 2 1 1 1 2 1 1
+f
+13
+ 23 5 9 20 18 5 9 3 8 5 14 4 5
+ 1 1 1 4 1 1 1 1 1 1 2 1 1
+f
+15
+ 26 21 19 1 13 13 5 14 6 1 19 19 5 14 4
+ 1 2 1 1 2 1 1 4 1 1 1 1 1 1 1
+f
+12
+ 5 14 20 19 16 18 5 3 8 5 14 4
+ 1 1 2 1 1 1 1 1 1 1 1 1
+f
+9
+ 23 1 3 8 19 20 21 2 5
+ 1 1 1 1 1 1 2 1 1
+f
+10
+ 23 1 3 8 19 20 21 2 5 14
+ 1 1 1 1 1 1 2 1 1 1
+f
+11
+ 8 9 14 26 21 7 5 6 29 7 20
+ 1 1 2 1 2 1 2 1 1 1 1
+f
+13
+ 7 18 21 14 4 19 27 20 26 12 9 3 8
+ 1 1 1 1 4 1 1 1 2 1 1 1 1
+f
+7
+ 12 28 19 3 8 5 14
+ 1 2 1 1 1 1 1
+f
+11
+ 8 9 14 7 5 14 15 13 13 5 14
+ 1 1 2 1 2 1 1 2 1 1 1
+f
+16
+ 1 21 6 13 5 18 11 19 1 13 13 1 3 8 5 14
+ 1 1 2 1 1 1 2 1 1 4 1 2 1 1 1 1
+f
+11
+ 5 18 12 5 9 3 8 20 5 18 20
+ 1 2 1 1 1 1 2 1 1 1 1
+f
+12
+ 1 21 19 7 5 2 5 19 19 5 18 20
+ 1 1 2 1 1 1 1 2 1 1 1 1
+f
+15
+ 2 5 14 21 20 26 5 18 5 9 7 5 14 5 14
+ 1 2 1 1 2 1 1 1 1 2 1 2 1 1 1
+f
+12
+ 1 2 23 1 14 4 12 21 14 7 5 14
+ 1 2 1 1 1 2 1 1 2 1 1 1
+f
+9
+ 20 9 5 18 14 1 13 5 14
+ 1 1 1 4 1 2 1 1 1
+f
+6
+ 6 29 3 8 19 5
+ 1 1 1 1 1 1
+t
+10
+ 1 2 23 5 9 3 8 5 14 4
+ 1 2 1 1 1 1 1 1 1 1
+f
+11
+ 4 21 4 5 14 18 5 7 5 12 14
+ 1 2 1 1 2 1 2 1 1 1 1
+t
+7
+ 4 1 18 29 2 5 18
+ 1 1 1 1 1 1 1
+f
+6
+ 9 14 9 20 5 24
+ 1 1 1 1 1 1
+t
+6
+ 12 5 19 12 9 5
+ 1 1 1 1 1 1
+t
+8
+ 4 15 3 21 13 5 14 20
+ 1 1 1 1 1 1 1 1
+t
+11
+ 16 18 5 16 1 18 1 20 9 15 14
+ 1 1 1 1 1 1 1 1 1 1 1
+t
+7
+ 1 4 4 9 19 15 14
+ 1 1 1 1 1 1 1
+t
+6
+ 23 5 19 12 5 25
+ 1 1 1 1 1 1
+t
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps
new file mode 100644
index 0000000000..e82861458e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps
@@ -0,0 +1,2560 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.47 Copyright 1986-91 Radical Eye Software
+%%Title: inst_ber.dvi
+%%Pages: 16 1
+%%BoundingBox: 0 0 596 843
+%%EndComments
+%%BeginProcSet: tex.pro
+/TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch
+load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{
+isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+Resolution VResolution vsize neg mul TR matrix currentmatrix dup dup 4 get
+round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@letter{/vsize 10
+N}B /@landscape{/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{
+/vsize 15.5531 N}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 N}B /@manualfeed{
+statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N
+/FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin
+/FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array
+/BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2
+array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}
+B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont
+setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup
+length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{
+ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B
+/ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0
+N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S
+dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0
+ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice
+ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}
+imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr
+put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf
+div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook
+known{bop-hook}if /SI save N @rigin 0 0 moveto}N /eop{clear SI restore
+showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256
+array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for}N /p /show load N
+/RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X
+/rulex X V}B /V statusdict begin /product where{pop product dup length 7 ge{0
+7 getinterval(Display)eq}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1
+TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1
+-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /a{
+moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{
+S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B
+/j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w
+}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{clear SS restore}B end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs
+792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N
+/p 3 def}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{
+@scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true
+N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X}
+B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B
+/magscale true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx
+defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{
+itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2
+roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll
+itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array
+astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{
+PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR
+pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if
+yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270
+rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not
+and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip
+not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}
+ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy
+TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if}
+if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{
+DVImag dup scale}if}N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save
+N userdict maxlength dict begin /magscale false def normalscale currentpoint
+TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx
+sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx
+psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N
+/erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{psf$llx psf$lly
+psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll
+S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end
+psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave
+normalscale currentpoint TR @SpecialDefaults}N /@setspecial{CLIP{newpath 0 0
+moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR
+hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg
+TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{grestore
+clear SpecialSave restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B
+/li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1
+setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY
+moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix
+currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix
+setmatrix}N end
+%%EndProcSet
+TeXDict begin 1000 300 300 @start /Fa 1 59 df<70F8F8F87005057C840E>58
+D E /Fb 1 16 df<03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FF
+FFC0FFFFC0FFFFC0FFFFC07FFF807FFF803FFF001FFE000FFC0003F00012147D9519>15
+D E /Fc 54 123 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F87870000000000070F8F8F870
+051E769D1A>33 D<701CF01EF01EF01EF01EF01EF01EF01EF01E701C701C701C701C600C0F0E7B
+9D1A>I<1C3E3E3F1F070707070E0E1C3C78F0600810789D1A>39 D<0038007800F001E003C007
+800F000E001C001C0038003800700070007000E000E000E000E000E000E000E000E000E000E000
+700070007000380038001C001C000E000F00078003C001E000F8007800380D2878A21A>I<6000
+F00078003C001E000F000780038001C001C000E000E00070007000700038003800380038003800
+38003800380038003800700070007000E000E001C001C0038007800F001E003C007800F0006000
+0D287CA21A>I<0030000078000078000078000078000078000078000078000078007FFFF0FFFF
+F8FFFFF87FFFF000780000780000780000780000780000780000780000780000300015167E991A
+>43 D<183E7E7F3F1F070E0E1CFCF8E0080D77851A>I<7FFFC0FFFFE0FFFFE07FFFC013047D90
+1A>I<3078FCFC7830060676851A>I<01F00007FC000FFE001F1F001C07003803803803807001C0
+7001C07001C0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C0
+7001C07803C03803803C07801C07001F1F000FFE0007FC0001F000131E7D9D1A>48
+D<00C001C001C003C007C00FC07FC0FDC071C001C001C001C001C001C001C001C001C001C001C0
+01C001C001C001C001C001C001C001C07FFFFFFF7FFF101E7B9D1A>I<03F0000FFC001FFF003C
+0F807803C07001C0E000E0F000E0F000E06000E00000E00000E00001C00001C000038000078000
+0F00000E00003C00007C0000F00001E00003C0000780000F00001E00E03C00E07FFFE0FFFFE07F
+FFE0131E7D9D1A>I<01F00007FC001FFE003E0F003807807003807001C0E001C0E001C0E001E0
+E000E0E000E0E001E07001E07803E03C0FE01FFFE00FFCE003F0E00001C00001C00001C0000380
+600380F00700F00F00F03E007FFC003FF0000FC000131E7D9D1A>57 D<3078FCFC783000000000
+00000000003078FCFC7830061576941A>I<7FFFF0FFFFF8FFFFF87FFFF0000000000000000000
+0000007FFFF0FFFFF8FFFFF87FFFF0150C7E941A>61 D<FFFE00FFFF80FFFFC01C03E01C00E01C
+00F01C00701C00701C00701C00701C00E01C01E01C07C01FFF801FFF801FFFC01C01E01C00F01C
+00701C00381C00381C00381C00381C00381C00781C00F01C01F0FFFFE0FFFFC0FFFF00151E7E9D
+1A>66 D<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E07000E07
+000E07000FFF000FFF000FFF000E07000E07000E07000E00000E00000E00000E000E0E000E0E00
+0E0E000E0E000E7FFFFEFFFFFE7FFFFE171E7F9D1A>69 D<7FFFFCFFFFFC7FFFFC0E001C0E001C
+0E001C0E001C0E001C0E00000E00000E07000E07000E07000FFF000FFF000FFF000E07000E0700
+0E07000E00000E00000E00000E00000E00000E00000E00000E00007FE000FFF0007FE000161E7F
+9D1A>I<FF8FF8FF8FF8FF8FF81C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01
+C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01
+C01C01C01C01C0FF8FF8FF8FF8FF8FF8151E7E9D1A>72 D<FFFF80FFFF80FFFF8001C00001C000
+01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80111E7C
+9D1A>I<FF83F8FF87FCFF83F81C01E01C03C01C03801C07001C0F001C1E001C1C001C38001C78
+001CF0001CF8001DF8001FDC001F9C001F0E001E0F001E07001C07801C03801C01C01C01C01C00
+E01C00E01C0070FF81FCFF81FEFF81FC171E7F9D1A>75 D<7FE000FFF0007FE0000E00000E0000
+0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000
+0E00000E00000E00000E00000E00380E00380E00380E00380E00387FFFF8FFFFF87FFFF8151E7E
+9D1A>I<FE0FF8FF0FF8FF0FF81D81C01D81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1
+C01C61C01C61C01C71C01C71C01C31C01C31C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0D
+C01C0DC01C0DC0FF87C0FF87C0FF83C0151E7E9D1A>78 D<0FFE003FFF807FFFC07C07C07001C0
+F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0
+E000E0E000E0E000E0E000E0E000E0F001E0F001E07001C07C07C07FFFC03FFF800FFE00131E7D
+9D1A>I<03F1C00FFDC03FFFC07C0FC07003C0E003C0E001C0E001C0E001C0E000007000007800
+003F00001FF00007FE0000FF00000F800003C00001C00000E00000E06000E0E000E0E000E0E001
+C0F001C0FC0780FFFF80EFFE00E3F800131E7D9D1A>83 D<7FFFFEFFFFFEFFFFFEE0380EE0380E
+E0380EE0380EE0380E003800003800003800003800003800003800003800003800003800003800
+00380000380000380000380000380000380000380000380000380003FF8007FFC003FF80171E7F
+9D1A>I<FE00FEFF01FEFE00FE70001C3800383800383800383800383800383800383800383800
+38187C301C7C701C7C701CEE701CEE701CEE701CEE701CEE700CC6600CC6600DC7600DC7600D83
+600D83600D83600F83E00F83E00701C0171E7F9D1A>87 D<7F87F87FCFF87F87F80F01C0070380
+07838003870003C70001CE0001EE0000FC0000FC00007800007800007800007C00007C0000FE00
+00EE0001CF0001C7000387800383800703C00701C00E01E00E00E07F83FCFF83FE7F83FC171E7F
+9D1A>I<600000F00000F00000F800007800007C00003C00003E00001E00001E00001F00000F00
+000F800007800007C00003C00003C00003E00001E00001F00000F00000F800007800007800007C
+00003C00003E00001E00001F00000F00000F00000F800007800007C00003C00003E00001E00001
+E00000C013277DA21A>92 D<060F1E3C387070E0E0E0E0F8FC7C7C38081077A11A>96
+D<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF803F83807803807003
+80E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157D941A>I<FE0000FE0000FE
+00000E00000E00000E00000E00000E00000E00000E3E000EFF800FFFE00FC1F00F80700F00380E
+00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00FFFC00E
+FF80063E00161E7F9D1A>I<00FF8003FFC00FFFE01F01E03C00C0780000700000700000E00000
+E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003FFC000FE0014157D
+941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C001F1C007FDC00FFF
+C01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C07003C07003
+C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F80007FF000FFF801E07C03C01C078
+00E07000E0E00070E00070FFFFF0FFFFF0FFFFF0E000007000007000007800703C00701F01F00F
+FFE003FFC000FE0014157D941A>I<0007E0001FF0003FF800787800F03000E00000E00000E000
+00E0007FFFF0FFFFF0FFFFF000E00000E00000E00000E00000E00000E00000E00000E00000E000
+00E00000E00000E00000E00000E00000E0007FFFC07FFFC07FFFC0151E7F9D1A>I<00F87C03FF
+FE07FFFE0F078C0E03801C01C01C01C01C01C01C01C01C01C00E03800F07800FFF000FFE001CF8
+001C00001C00000E00000FFF800FFFE03FFFF87C007C70001CE0000EE0000EE0000EE0000E7000
+1C78003C3E00F81FFFF007FFC001FF0017217F941A>I<FE0000FE0000FE00000E00000E00000E
+00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E
+00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE171E7F9D
+1A>I<01C00003E00003E00003E00001C0000000000000000000000000000000007FE000FFE000
+7FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
+00E00000E00000E000FFFFC0FFFFC0FFFFC0121F7C9E1A>I<FE0000FE0000FE00000E00000E00
+000E00000E00000E00000E00000E3FF80E3FFC0E3FF80E07800E0F000E1E000E3C000E78000EF0
+000FF8000FFC000F9C000F0E000E0F000E07800E03800E01C00E01E0FFC3FCFFE7FEFFC3FC171E
+7F9D1A>107 D<FFE000FFE000FFE00000E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E000FFFFE0FFFFE0FFFFE0131E7D9D1A>I<7CE0E000FFFBF8007FFFF8001F
+1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00
+1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F00191580941A>I<
+FE3E00FEFF80FFFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0
+0E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE17157F941A>I<01F00007FC001FFF
+003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07803
+C03C07803E0F801FFF0007FC0001F00013157D941A>I<FE3E00FEFF80FFFFE00FC1F00F80700F
+00380E00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00F
+FFC00EFF800E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE000FFE000FF
+E00016207F941A>I<FF83F0FF8FF8FFBFFC03FC3C03F01803E00003C00003C000038000038000
+038000038000038000038000038000038000038000038000FFFF00FFFF80FFFF0016157E941A>
+114 D<07FB801FFF807FFF80780780E00380E00380E003807800007FC0003FFC0007FF00003F80
+0003806001C0E001C0E001C0F003C0FC0780FFFF00EFFE00E3F80012157C941A>I<00C00001C0
+0001C00001C00001C00001C00001C0007FFFE0FFFFE0FFFFE001C00001C00001C00001C00001C0
+0001C00001C00001C00001C00001C00001C07001C07001C07001C07000E0E000FFE0007FC0001F
+00141C7F9B1A>I<FE0FE0FE0FE0FE0FE00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E
+00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFE03FFFE00FCFE17157F941A>I<
+7FC7FCFFC7FE7FC7FC0E00E00E00E00F01E00701C00701C00783C003838003838003838001C700
+01C70001C70000EE0000EE0000EE00007C00007C0000380017157F941A>I<FF83FEFFC7FEFF83
+FE3800381C00701C00701C00701C00701C38701C7C700C7C600E6CE00E6CE00EEEE00EEEE00EEE
+E006C6C006C6C007C7C007C7C003838017157F941A>I<7FC7F87FCFFC7FC7F80703C003878003
+C70001EE0000FE00007C00007800003800007C0000EE0001EE0001C7000383800783C00701C07F
+C7FCFFC7FE7FC7FC17157F941A>I<7FC7FCFFC7FE7FC7FC0E00E00F00E00701E00701C00781C0
+0381C003838001C38001C38001C70000E70000E70000E600006600006E00003C00003C00003C00
+003C0000380000380000780000700030700078E00079E0007FC0003F80001E000017207F941A>
+I<7FFFF0FFFFF0FFFFF0E001E0E003C0E00780000F00001E00003C0000780000F00001E00003C0
+000780000F00381E00383C0038780038FFFFF8FFFFF8FFFFF815157E941A>I
+E /Fd 11 108 df<00FFFFFF80000F000780000F000180000F000180001E000180001E00018000
+1E000100001E000100003C000100003C000100003C010100003C01000000780200000078020000
+007806000000780E000000FFFC000000F00C000000F00C000000F00C000001E008000001E00800
+0001E008040001E000080003C000080003C000080003C000100003C00010000780002000078000
+6000078000C000078001C0000F8007C000FFFFFF800021227DA121>69 D<00FFF8000F00000F00
+000F00001E00001E00001E00001E00003C00003C00003C00003C00007800007800007800007800
+00F00000F00000F00000F00001E00001E00001E00001E00003C00003C00003C00003C000078000
+0780000780000780000F8000FFF80015227DA113>73 D<00FFF807FC000F0001E0000F0001C000
+0F000100001E000200001E000400001E001000001E002000003C004000003C008000003C010000
+003C04000000780800000078180000007838000000787C000000F0BC000000F23C000000F41E00
+0000F81E000001F01F000001E00F000001E00F000001E00F800003C007800003C007800003C003
+C00003C003C000078003C000078001E000078001E000078001E0000F8001F000FFF80FFE002622
+7DA125>75 D<00FFFC00000F8000000F0000000F0000001E0000001E0000001E0000001E000000
+3C0000003C0000003C0000003C00000078000000780000007800000078000000F0000000F00000
+00F0000000F0000001E0000001E0000001E0002001E0002003C0004003C0004003C0008003C000
+8007800180078001000780030007800F000F803E00FFFFFE001B227DA11F>I<00FF000FFC000F
+8001E0000F800180000FC000800013C001000013C001000011E001000011E001000021E0020000
+20F002000020F002000020F0020000407804000040780400004078040000403C040000803C0800
+00803E080000801E080000801E080001001F100001000F100001000F10000100079000020007A0
+00020007A000020003E000020003E000040003C000040001C000040001C0000C0001C0001E0000
+8000FFC000800026227DA124>78 D<0000FE0000078380000C00E0003800700070003800E00038
+01C0001C0380001C0700001C0F00001E1E00001E1C00001E3C00001E3C00001E7800001E780000
+1E7800001EF000003CF000003CF000003CF0000078F0000078E0000078E00000F0E00000F0E000
+01E0E00001C0F00003C0F00007807000070078000E0038001C001C0038000E00E0000703800001
+FC00001F2479A225>I<0001F020000E0C40001802C0003001C0006001C000E0018000C0018001
+C0018001C0018003C0010003C0010003C0000003C0000003E0000001F8000001FF000000FFE000
+007FF000001FF8000003FC0000007C0000003C0000001E0000001E0000001E0020001C0020001C
+0020001C00200018006000380060003000700060007000C000C8018000C607000081FC00001B24
+7DA21B>83 D<007FF81FF8000FC007C000078003000007C002000003C004000003C008000003E0
+10000001E030000001E020000001F040000000F080000000F100000000FA000000007C00000000
+7C000000007C000000003C000000003C000000007E000000009E000000011E000000031F000000
+060F000000040F000000080F80000010078000002007C000004007C00000C003C000018003E000
+010001E000070001E0001F0003F000FFC01FFE0025227EA124>88 D<00C001E001C001C0000000
+000000000000000000000000001C002300430043008700870087000E000E001C001C001C003800
+38003840708070807080710032001C000B217BA00F>105 D<0000E00001E00001E00000C00000
+00000000000000000000000000000000000000000000001E000023000043800083800083800103
+80010380000700000700000700000700000E00000E00000E00000E00001C00001C00001C00001C
+0000380000380000380000380000700000700000700070E000F0C000F180006300003C0000132B
+82A00F>I<00F0000FE00000E00000E00000E00001C00001C00001C00001C00003800003800003
+80000380000700000701E0070210070C700E10F00E10F00E20600E40001D80001E00001FC0001C
+7000383800383800381C00381C20703840703840703840701880E01880600F0014237DA216>I
+E /Fe 1 98 df<00040000000E0000000E0000000E0000001F0000001F0000003F800000278000
+002780000043C0000043C0000043C0000081E0000081E0000101F0000100F0000100F00003FFF8
+000200780006007C0004003C0004003C000C001E000C001E003C003F00FF00FFE01B1A7F991F>
+97 D E /Ff 82 128 df<001F83E000706E3000C07C780180F8780380F0780700700007007000
+07007000070070000700700007007000070070000700700007007000FFFFFFC007007000070070
+000700700007007000070070000700700007007000070070000700700007007000070070000700
+7000070070000700700007007000070070000700700007007000070078007FE3FF801D2380A21C
+>11 D<001FC0000070200000C01000018038000380780007007800070030000700000007000000
+0700000007000000070000000700000007000000FFFFF800070078000700380007003800070038
+000700380007003800070038000700380007003800070038000700380007003800070038000700
+380007003800070038000700380007003800070038007FE1FF80192380A21B>I<001FD8000070
+380000C07800018078000380780007003800070038000700380007003800070038000700380007
+0038000700380007003800FFFFF800070038000700380007003800070038000700380007003800
+070038000700380007003800070038000700380007003800070038000700380007003800070038
+000700380007003800070038007FF3FF80192380A21B>I<007C000187000303800703C00601C0
+0E01E00E01E00E01E00E01E00E01E00E01C00E03800E03800E0E00FE38000E06000E03800E01C0
+0E01C00E00E00E00F00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E0070
+0E70E00E70C00E7180FE1F0015237FA218>25 D<70F8F8F8F8F8F8F87070707070707070707070
+70202020202020000000000070F8F8F87005247CA30E>33 D<7038F87CFC7EFC7E743A04020402
+040204020804080410081008201040200F0F7EA218>I<00200040008001000300060004000C00
+0C00180018003000300030007000600060006000E000E000E000E000E000E000E000E000E000E0
+00E000E000E000E0006000600060007000300030003000180018000C000C000400060003000100
+0080004000200B327CA413>40 D<800040002000100018000C0004000600060003000300018001
+80018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000E000E0
+00C000C000C001C0018001800180030003000600060004000C00180010002000400080000B327D
+A413>I<0001800000018000000180000001800000018000000180000001800000018000000180
+0000018000000180000001800000018000000180000001800000018000FFFFFFFEFFFFFFFE0001
+800000018000000180000001800000018000000180000001800000018000000180000001800000
+01800000018000000180000001800000018000000180001F227D9C26>43
+D<70F8FCFC7404040404080810102040060F7C840E>I<FFE0FFE00B027F8B10>I<70F8F8F87005
+057C840E>I<000080000180000180000300000300000300000600000600000600000C00000C00
+000C0000180000180000180000300000300000300000600000600000600000C00000C00000C000
+0180000180000180000180000300000300000300000600000600000600000C00000C00000C0000
+180000180000180000300000300000300000600000600000600000C00000C00000C0000011317D
+A418>I<01F000071C000C06001803003803803803807001C07001C07001C07001C0F001E0F001
+E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001
+C07001C07001C07803C03803803803801C07000C0600071C0001F00013227EA018>I<00800380
+0F80F3800380038003800380038003800380038003800380038003800380038003800380038003
+8003800380038003800380038003800380038007C0FFFE0F217CA018>I<03F0000C1C00100700
+2007804003C04003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003C0000780
+000700000E00001C0000180000300000600000C000018000010000020020040020080020180060
+3000403FFFC07FFFC0FFFFC013217EA018>I<03F8000C1E001007002007804007C07807C07803
+C07807C03807C0000780000780000700000F00000E0000380003F000001C00000F000007800007
+800003C00003C00003E02003E07003E0F803E0F803E0F003C04003C0400780200780100F000C1C
+0003F00013227EA018>I<000200000600000E00000E00001E00001E00002E00004E00004E0000
+8E00008E00010E00020E00020E00040E00040E00080E00100E00100E00200E00200E00400E0080
+0E00FFFFF8000E00000E00000E00000E00000E00000E00000E00001F0001FFF015217FA018>I<
+1000801E07001FFF001FFE001FF80013E00010000010000010000010000010000010000010F800
+130E001407001803801003800001C00001C00001E00001E00001E00001E07001E0F001E0F001E0
+E001C08001C04003C04003802007001006000C1C0003F00013227EA018>I<007E0001C1000300
+800601C00E03C01C03C0180180380000380000780000700000700000F0F800F30C00F40600F403
+00F80380F801C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E07001E03801C03801
+C01803801C03000C0600070C0001F00013227EA018>I<4000006000007FFFE07FFFC07FFFC040
+0080C0010080010080020080020000040000080000080000100000300000200000600000600000
+600000E00000C00000C00001C00001C00001C00001C00003C00003C00003C00003C00003C00003
+C00003C00003C00001800013237DA118>I<01F800060E000803001001802001802000C06000C0
+6000C06000C07000C07801803E01003F02001FC4000FF80003F80003FC00067F00083F80100F80
+3007C06001C06000E0C000E0C00060C00060C00060C000606000406000C03000801803000E0E00
+03F00013227EA018>I<01F000060C000C0600180700380380700380700380F001C0F001C0F001
+C0F001E0F001E0F001E0F001E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001
+C00001C00001C0000380000380300300780700780600700C002018001030000FC00013227EA018
+>I<70F8F8F870000000000000000000000070F8F8F87005157C940E>I<70F8F8F8700000000000
+00000000000070F8F8F87808080808101010204040051F7C940E>I<FFFFFFFEFFFFFFFE000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFEFFFFFFFE1F0C
+7D9126>61 D<07E01838201C400E800FF00FF00FF00F000F000E001C00380030006000C000C000
+800080018001000100010001000100010000000000000000000000038007C007C007C003801023
+7DA217>63 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E00000
+0DF0000008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E00
+00401E0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003
+C0040003E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>65
+D<FFFFF8000F800E0007800780078003C0078003E0078001E0078001F0078001F0078001F00780
+01F0078001F0078001E0078003E0078007C007800F8007803E0007FFFE0007800780078003C007
+8001E0078001F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078001F0
+078001F0078003E0078007C00F800F00FFFFFC001D227EA123>I<0007E0100038183000E00630
+01C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C000010780000
+1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800
+0000780000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001
+C0010000E0020000381C000007E0001C247DA223>I<FFFFF0000F801E0007800700078003C007
+8001C0078000E0078000F007800078078000780780007C0780003C0780003C0780003C0780003E
+0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003C078000
+3C0780007C0780007807800078078000F0078000E0078001E0078003C0078007000F801E00FFFF
+F8001F227EA125>I<FFFFFFC00F8007C0078001C0078000C00780004007800040078000600780
+0020078000200780002007802020078020000780200007802000078060000780E00007FFE00007
+80E000078060000780200007802000078020000780200807800008078000080780001007800010
+07800010078000300780003007800070078000E00F8003E0FFFFFFE01D227EA121>I<FFFFFFC0
+0F8007C0078001C0078000C0078000400780004007800060078000200780002007800020078020
+20078020000780200007802000078060000780E00007FFE0000780E00007806000078020000780
+200007802000078020000780000007800000078000000780000007800000078000000780000007
+800000078000000FC00000FFFE00001B227EA120>I<0007F008003C0C1800E0021801C001B803
+8000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008
+F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000
+787C0000783C0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E0
+0318003C0C080007F00020247DA226>I<FFFC3FFF0FC003F0078001E0078001E0078001E00780
+01E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E007
+8001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0
+078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF20227E
+A125>I<FFFC0FC007800780078007800780078007800780078007800780078007800780078007
+80078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA112>
+I<03FFF0001F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F
+00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F
+00700F00F80F00F80F00F80E00F01E00401C0020380018700007C00014237EA119>I<FFFC03FF
+000FC000F800078000600007800040000780008000078001000007800200000780040000078008
+0000078010000007802000000780400000078080000007818000000783C000000787E000000789
+E000000788F000000790F0000007A078000007C03C000007803C000007801E000007800F000007
+800F00000780078000078007C000078003C000078001E000078001E000078000F000078000F800
+0FC000FC00FFFC07FF8021227EA126>I<FFFE00000FC000000780000007800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000000780000007
+800000078000000780000007800000078000000780000007800000078000800780008007800080
+07800080078001800780018007800100078003000780030007800F000F803F00FFFFFF0019227E
+A11E>I<FFC00003FF0FC00003F007C00003E005E00005E005E00005E004F00009E004F00009E0
+04F00009E004780011E004780011E004780011E0043C0021E0043C0021E0043C0021E0041E0041
+E0041E0041E0040F0081E0040F0081E0040F0081E004078101E004078101E004078101E00403C2
+01E00403C201E00401E401E00401E401E00401E401E00400F801E00400F801E00400F801E00400
+7001E00E007001E01F007003F0FFE0203FFF28227EA12D>I<FF8007FF07C000F807C0007005E0
+002004F0002004F0002004780020047C0020043C0020041E0020041F0020040F00200407802004
+0780200403C0200401E0200401E0200400F0200400F8200400782004003C2004003E2004001E20
+04000F2004000F20040007A0040003E0040003E0040001E0040001E0040000E00E0000601F0000
+60FFE0002020227EA125>I<FFFFF0000F803C0007800F0007800780078007C0078003C0078003
+E0078003E0078003E0078003E0078003E0078003E0078003C0078007C00780078007800F000780
+3C0007FFF000078000000780000007800000078000000780000007800000078000000780000007
+80000007800000078000000780000007800000078000000FC00000FFFC00001B227EA121>80
+D<000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03E0000F83C00
+00787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003EF800003EF8
+00003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783C0000781E0380F0
+0E0420E00F0801E0078813C003C8178000E80E00007C3C02000FEC0200000C0200000C0200000E
+0600000F0E000007FC000007FC000007F8000003F8000001E01F2D7DA226>I<FFFFE000000F80
+3C000007800E00000780078000078007C000078003C000078003E000078003E000078003E00007
+8003E000078003E000078003C000078007C000078007800007800E000007803C000007FFE00000
+0780700000078038000007801C000007801E000007800E000007800F000007800F000007800F00
+0007800F000007800F800007800F800007800F800007800F808007800FC080078007C0800FC003
+C100FFFC01E2000000007C0021237EA124>I<03F0200C0C601802603001E07000E0600060E000
+60E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003F
+C00007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000
+C0C80180C6070081FC0014247DA21B>I<7FFFFFF8780780786007801840078008400780084007
+8008C007800C800780048007800480078004800780040007800000078000000780000007800000
+078000000780000007800000078000000780000007800000078000000780000007800000078000
+00078000000780000007800000078000000780000007800000078000000FC00003FFFF001E227E
+A123>I<FFFC07FF0FC000F8078000700780002007800020078000200780002007800020078000
+200780002007800020078000200780002007800020078000200780002007800020078000200780
+0020078000200780002007800020078000200780002007800020078000200380004003C0004003
+C0004001C0008000E000800060010000300600001C08000003F00020237EA125>I<FFF0007FC0
+1F80001F000F00000C000780000C000780000800078000080003C000100003C000100003E00030
+0001E000200001E000200000F000400000F000400000F000400000780080000078008000007C01
+8000003C010000003C010000001E020000001E020000001F020000000F040000000F040000000F
+8C0000000788000000078800000003D000000003D000000003F000000001E000000001E0000000
+00C000000000C000000000C0000022237FA125>I<FFF03FFC03FE1F8007E000F80F0003C00070
+0F0003C000200F0003C00020078001E00040078001E00040078001E0004003C002F0008003C002
+F0008003C002F0008001E00478010001E00478010001E00478010000F0083C020000F0083C0200
+00F0083C020000F8183E06000078101E04000078101E0400007C101E0400003C200F0800003C20
+0F0800003C200F0800001E40079000001E40079000001E40079000000F8003E000000F8003E000
+000F8003E00000070001C00000070001C00000070001C0000003000180000002000080002F237F
+A132>I<7FF807FF0007E001F80003C000E00003E000C00001E000800000F001000000F8030000
+0078020000007C040000003E0C0000001E080000001F100000000FB000000007A000000007C000
+000003E000000001E000000001F000000003F80000000278000000047C0000000C3E000000081E
+000000101F000000300F80000020078000004007C00000C003E000008001E000010001F0000300
+00F000070000F8001F8001FC00FFE007FFC022227FA125>I<7FFFFE7E003E78003C7000786000
+784000F0C000F0C001E08003C08003C0800780000780000F00001F00001E00003C00003C000078
+0000780000F00001F00001E00103C00103C0010780010780030F00031E00021E00023C00063C00
+0E78001EF8007EFFFFFE18227DA11E>90 D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
+C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE07317BA40E>I<08041008
+20102010402040208040804080408040B85CFC7EFC7E7C3E381C0F0F7AA218>I<FEFE06060606
+060606060606060606060606060606060606060606060606060606060606060606060606060606
+0606FEFE07317FA40E>I<0FE0001838003C0C003C0E0018070000070000070000070000FF0007
+C7001E07003C0700780700700700F00708F00708F00708F00F087817083C23900FC1E015157E94
+18>97 D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00
+000E00000E00000E1F000E61C00E80600F00300E00380E003C0E001C0E001E0E001E0E001E0E00
+1E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C41C0083F0017237FA21B>I<01
+FE000703000C07801C0780380300780000700000F00000F00000F00000F00000F00000F00000F0
+00007000007800403800401C00800C010007060001F80012157E9416>I<0000E0000FE00001E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E001F8E00704E0
+0C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E0
+7800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01FC000707000C03801C01C03801
+C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F000007000007800203800201C00
+400E008007030000FC0013157F9416>I<003C00C6018F038F030F070007000700070007000700
+070007000700FFF807000700070007000700070007000700070007000700070007000700070007
+000700070007807FF8102380A20F>I<00007001F198071E180E0E181C07001C07003C07803C07
+803C07803C07801C07001C07000E0E000F1C0019F0001000001000001800001800001FFE000FFF
+C00FFFE03800F0600030400018C00018C00018C000186000306000303800E00E038003FE001521
+7F9518>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+00000E00000E00000E1F800E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E
+00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>I<
+1C001E003E001E001C00000000000000000000000000000000000E00FE001E000E000E000E000E
+000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A227FA10E>I<01C003
+E003E003E001C00000000000000000000000000000000001E00FE001E000E000E000E000E000E0
+00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0
+C0F18061803E000B2C82A10F>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E
+00000E00000E00000E00000E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E
+10000E38000EF8000F1C000E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FF
+E3FE17237FA21A>I<0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FF
+E00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E
+003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0
+0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0FFE3FF8FFE27157F94
+2A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00700E00700E00700E00700E0070
+0E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18157F941B>I<01FC000707
+000C01801800C03800E0700070700070F00078F00078F00078F00078F00078F00078F000787000
+707800F03800E01C01C00E038007070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E
+00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F
+00700E80E00E41C00E3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FF
+E000171F7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F0007F80
+3FE00FF001F8003C801C800C800CC00CC008E018D0308FC00E157E9413>I<0200020002000200
+0600060006000E001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E
+040E040E040E040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00
+700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F00601
+7003827800FC7F18157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003
+808003808001C10001C10000E20000E20000E20000740000740000380000380000380000100017
+157F941A>I<FF8FF8FF1E01E03C1C01C0180E01C0180E01E0100E01E010070260200702702007
+02702003843040038438400384384001C8188001C81C8001C81C8000F00D0000F00F0000F00F00
+00600600006006000060060020157F9423>I<FF83FE1F01F00E00C007008003810003830001C2
+0000E400007800007800003800003C00004E00008E000187000103800201C00401E00C00E03E01
+F0FF03FE17157F941A>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003
+808001C10001C10000E20000E20000E20000740000740000380000380000380000100000100000
+2000002000002000004000F04000F08000F180004300003C0000171F7F941A>I<3FFFC0380380
+300780200700600E00401C00403C0040380000700000E00001E00001C0000380400700400F0040
+0E00C01C0080380080780180700780FFFF8012157F9416>I<FFFFFE1701808C18>I<FFFFFFFFFF
+FF3001808C31>I<7070F8F8F8F8F8F870700D057BA118>127 D E /Fg 21
+123 df<00E0000001900000030800000308000007080000070800000708000007080000071000
+0007100000072000000740000003C03FE003800F00038006000380040005C0040009C0080010E0
+100030E010006070200060702000E0384000E03C4000E01C8000E00F0020E00700207007804030
+09C0401830E18007C03E001B1F7E9D20>38 D<000600000006000000060000000F0000000F0000
+000F00000017800000178000001780000023C0000023C0000023C0000041E0000041E0000041E0
+000080F0000080F0000180F8000100780001FFF80003007C0002003C0002003C0006003E000400
+1E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F>65 D<FFF00F000F000F000F000F000F
+000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00
+0F00FFF00C1C7F9B0F>73 D<FF8000FF800F8000F8000F8000F8000BC00178000BC00178000BC0
+01780009E002780009E002780008F004780008F004780008F00478000878087800087808780008
+78087800083C107800083C107800083C107800081E207800081E207800081E207800080F407800
+080F40780008078078000807807800080780780008030078001C03007800FF8307FF80211C7E9B
+26>77 D<FF007FC00F800E000F8004000BC0040009E0040009E0040008F0040008F80400087804
+00083C0400083C0400081E0400080F0400080F0400080784000807C4000803C4000801E4000801
+E4000800F40008007C0008007C0008003C0008003C0008001C0008000C001C000C00FF8004001A
+1C7E9B1F>I<7FFFFFC0700F01C0600F00C0400F0040400F0040C00F0020800F0020800F002080
+0F0020000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000
+000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F800003FFFC
+001B1C7F9B1E>84 D<FFF07FC00F000E000F0004000F0004000F0004000F0004000F0004000F00
+04000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F
+0004000F0004000F0004000F0004000F0004000700080007800800038010000180100000C02000
+0070C000001F00001A1D7E9B1F>I<7FF0FFC00FC03E000780180003C0180003E0100001E02000
+01F0600000F0400000788000007D8000003D0000001E0000001F0000000F0000000F8000000F80
+000013C0000023E0000021E0000041F00000C0F8000080780001007C0003003C0002001E000600
+1F001F003F80FFC0FFF01C1C7F9B1F>88 D<1FC000307000783800781C00301C00001C00001C00
+01FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115>
+97 D<07E00C301878307870306000E000E000E000E000E000E00060007004300418080C3007C0
+0E127E9112>99 D<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002300218
+040C1803E00F127F9112>101 D<FC00001C00001C00001C00001C00001C00001C00001C00001C
+00001C00001C00001C7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C
+03801C03801C03801C03801C03801C03801C0380FF9FF0141D7F9C17>104
+D<18003C003C0018000000000000000000000000000000FC001C001C001C001C001C001C001C00
+1C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I<FC00001C00001C00001C0000
+1C00001C00001C00001C00001C00001C00001C00001C3FC01C0F001C0C001C08001C10001C2000
+1C40001CE0001DE0001E70001C78001C38001C3C001C1C001C0E001C0F001C0F80FF9FE0131D7F
+9C16>107 D<FC7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C0380
+1C03801C03801C03801C03801C03801C0380FF9FF014127F9117>110 D<03F0000E1C00180600
+300300700380600180E001C0E001C0E001C0E001C0E001C0E001C0600180700380300300180600
+0E1C0003F00012127F9115>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C00
+1C001C001C001C00FFC00D127F9110>114 D<1F9030704030C010C010E010F8007F803FE00FF0
+00F880388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00
+FFE01C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F
+9910>I<FF07E03C03801C01001C01000E02000E020007040007040007040003880003880003D8
+0001D00001D00000E00000E00000E00000400013127F9116>118 D<7FFC70386038407040F040
+E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>122
+D E /Fh 1 122 df<0C000C000C000C000C000C00FFC0FFC00C000C000C000C000C000C000C00
+0C000C000C000C000C000C000C000C000C000C000C000A1A7E9310>121
+D E /Fi 10 121 df<3078FCFC78300606778518>46 D<1FE0003FF8007FFC00781E00300E0000
+070000070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F00781F003FFFF01F
+FBF007E1F014147D9318>97 D<01FE0007FF001FFF803E0780380300700000700000E00000E000
+00E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318
+>99 D<01F00007FC001FFE003E0F00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0
+E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>101
+D<03800007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC00001C0
+0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
+00FFFF00FFFF80FFFF00111D7C9C18>105 D<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00
+E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3
+FC1714809318>110 D<0180000380000380000380000380007FFFC0FFFFC0FFFFC00380000380
+000380000380000380000380000380000380000380000380400380E00380E00380E001C1C001FF
+C000FF80003E0013197F9818>116 D<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00
+E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714
+809318>I<FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01C
+D9C01CD9C00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>119
+D<7F8FF07F9FF07F8FF0070700078E00039E0001DC0001F80000F80000700000F00000F80001DC
+00039E00038E000707000F07807F8FF0FF8FF87F8FF015147F9318>I E
+/Fj 1 98 df<001800001800001800003C00003C00004E00004E00004E00008700008700018780
+0103800103800201C00201C003FFC00400E00400E00800700800701800703C0078FE01FF18177F
+961C>97 D E /Fk 15 106 df<01FFFFC0001E00F0001E0078001E0038001E003C003C003C003C
+003C003C003C003C003C0078007800780078007800F0007801E000F0078000FFFE0000F00F8000
+F003C001E001C001E001E001E001E001E001E003C001E003C001E003C001E003C001C0078003C0
+0780078007800F0007801E000F007800FFFFE0001E1F7D9E20>66 D<0000FE0200078186001C00
+4C0038003C0060003C00C0001C01C0001803800018070000180F0000181E0000101E0000103C00
+00003C00000078000000780000007800000078000000F0000000F0000000F0000000F0000000F0
+0000807000008070000080700001003800010038000200180004000C001800060020000381C000
+00FE00001F217A9F21>I<01FFFF80001E00E0001E0070001E0038001E001C003C001C003C000E
+003C000E003C000E0078000E0078000E0078000E0078000E00F0001E00F0001E00F0001E00F000
+1E01E0003C01E0003C01E0003C01E0007803C0007003C0007003C000E003C001C0078001C00780
+038007800E0007801C000F007000FFFFC0001F1F7D9E22>I<01FFFFFE001E001C001E000C001E
+0004001E0004003C0004003C0004003C0004003C00040078080800780800007808000078180000
+F0300000FFF00000F0300000F0300001E0200001E0200001E0200001E0001003C0002003C00020
+03C0004003C00040078000800780018007800100078007000F001F00FFFFFE001F1F7D9E1F>I<
+0000FC040007030C001C00980030007800E0007801C000380380003003800030070000300E0000
+301E0000201E0000203C0000003C00000078000000780000007800000078000000F0000000F000
+FFF0F0000780F0000780F0000F0070000F0070000F0070000F0070001E0038001E0018003E001C
+002E000E00CC000383040000FC00001E217A9F23>71 D<01FFF3FFE0001F003E00001E003C0000
+1E003C00001E003C00003C007800003C007800003C007800003C007800007800F000007800F000
+007800F000007800F00000F001E00000FFFFE00000F001E00000F001E00001E003C00001E003C0
+0001E003C00001E003C00003C007800003C007800003C007800003C007800007800F000007800F
+000007800F000007800F00000F801F0000FFF1FFE000231F7D9E22>I<01FFF0001F00001E0000
+1E00001E00003C00003C00003C00003C0000780000780000780000780000F00000F00000F00000
+F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780000780000F
+8000FFF800141F7D9E12>I<01FFF800001F0000001E0000001E0000001E0000003C0000003C00
+00003C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F0
+000001E0000001E0000001E0000001E0008003C0010003C0010003C0030003C002000780060007
+80060007800C0007801C000F007800FFFFF800191F7D9E1D>76 D<01FF007FE0001F000F00001F
+0004000017800400001780040000278008000023C008000023C008000023C008000041E0100000
+41E010000041F010000040F010000080F0200000807820000080782000008078200001003C4000
+01003C400001003C400001001E400002001E800002001E800002000F800002000F800004000F00
+00040007000004000700000C000700001C00020000FF80020000231F7D9E22>78
+D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C0078
+007800780078007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001
+E0000001E0000003C0000003C0000003C0000003C0000007800000078000000780000007800000
+0F800000FFF000001E1F7D9E1F>80 D<01FFFF00001E03C0001E00E0001E0070001E0078003C00
+78003C0078003C0078003C0078007800F0007800F0007801E0007801C000F0070000F01E0000FF
+F00000F0380001E01C0001E01E0001E00E0001E00F0003C01E0003C01E0003C01E0003C01E0007
+803C0007803C0807803C0807803C100F801C10FFF00C20000007C01D207D9E21>82
+D<0007E040001C18C0003005800060038000C0038001C001800180010003800100038001000380
+01000380000003C0000003C0000003F8000001FF800001FFE000007FF000001FF0000001F80000
+00780000007800000038000000380020003800200038002000300060007000600060006000E000
+7000C000E8038000C606000081F800001A217D9F1A>I<0FFFFFF01E0780E01807802010078020
+20078020200F0020600F0020400F0020400F0020801E0040001E0000001E0000001E0000003C00
+00003C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000F0
+000000F0000001E0000001E0000001E0000001E0000003E00000FFFF00001C1F789E21>I<7FFC
+1FF807C003C00780010007800100078001000F0002000F0002000F0002000F0002001E0004001E
+0004001E0004001E0004003C0008003C0008003C0008003C000800780010007800100078001000
+78001000F0002000F0002000F0002000F0004000F0004000700080007001000030020000380400
+000C18000007E000001D20779E22>I<00C001E001E001C000000000000000000000000000000E
+003300230043804300470087000E000E000E001C001C001C003840388030807080310033001C00
+0B1F7C9E0E>105 D E /Fl 49 128 df<003F0000E0C001C0C00381E00701E00701E007000007
+0000070000070000070000070000FFFFE00700E00700E00700E00700E00700E00700E00700E007
+00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F
+19>12 D<00FC00018E000307000603800E03C00E03C00E03C00E03C00E03C00E03800E07000E0E
+00FE38000E0E000E03000E03800E01C00E01C00E01E00E00E00E00F00E00F00E00F00E00F00E00
+F00E00F00E00F00E00E00E71E00E71C00E7380FE3E0014207F9F17>25 D<70F8FCFC7404040408
+0810102040060E7C840D>44 D<FFC0FFC00A027F8A0F>I<70F8F8F87005057C840D>I<70F8F8F8
+700000000000000000000070F8F8F87005147C930D>58 D<000100000003800000038000000380
+000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F0000020
+7800002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE0001000F0001
+000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F
+22>65 D<FFFFE0000F80380007801E0007801F0007800F0007800F8007800F8007800F8007800F
+8007800F8007800F0007801F0007801E0007803C0007FFF00007803C0007801E0007800F000780
+0F8007800780078007C0078007C0078007C0078007C0078007C00780078007800F8007800F0007
+801F000F803C00FFFFF0001A1F7E9E20>I<FFFFE0000F803C0007801E00078007000780038007
+8003C0078001E0078001E0078001F0078000F0078000F0078000F8078000F8078000F8078000F8
+078000F8078000F8078000F8078000F8078000F8078000F0078000F0078000F0078001E0078001
+E0078003C0078003800780070007800E000F803C00FFFFE0001D1F7E9E23>68
+D<FFFFFF000F800F00078003000780030007800100078001800780008007800080078000800780
+80800780800007808000078080000781800007FF80000781800007808000078080000780800007
+808000078000200780002007800020078000400780004007800040078000C0078000C007800180
+0F800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F0007800300078003000780010007800180
+07800080078000800780008007800080078080000780800007808000078080000781800007FF80
+000781800007808000078080000780800007808000078000000780000007800000078000000780
+00000780000007800000078000000FC00000FFFE0000191F7E9E1E>I<FFFC0FC0078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+8007800780078007800FC0FFFC0E1F7F9E10>73 D<FFFE000FC000078000078000078000078000
+078000078000078000078000078000078000078000078000078000078000078000078000078000
+07800007800207800207800207800207800607800407800407800C07801C0F807CFFFFFC171F7E
+9E1C>76 D<FF80001FF80F80001F800780001F0005C0002F0005C0002F0005C0002F0004E0004F
+0004E0004F000470008F000470008F000470008F000438010F000438010F000438010F00041C02
+0F00041C020F00041C020F00040E040F00040E040F00040E040F000407080F000407080F000407
+080F000403900F000403900F000401E00F000401E00F000401E00F000E00C00F001F00C01F80FF
+E0C1FFF8251F7E9E2A>I<FF803FF807C007C007C0038005E0010005E0010004F0010004780100
+04780100043C0100043C0100041E0100040F0100040F010004078100040781000403C1000401E1
+000401E1000400F1000400F1000400790004003D0004003D0004001F0004001F0004000F000400
+0700040007000E0003001F000300FFE001001D1F7E9E22>I<FFFFE0000F80780007801C000780
+1E0007800F0007800F8007800F8007800F8007800F8007800F8007800F8007800F0007801E0007
+801C000780780007FFE00007800000078000000780000007800000078000000780000007800000
+0780000007800000078000000780000007800000078000000FC00000FFFC0000191F7E9E1F>80
+D<07E0800C1980100780300380600180600180E00180E00080E00080E00080F00000F000007800
+007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C00001C08001C08001C08001
+C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>83 D<7FFFFFE0780F01E060
+0F0060400F0020400F0020C00F0030800F0010800F0010800F0010800F0010000F0000000F0000
+000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00
+00000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F800007FFFE001C1F
+7E9E21>I<FFFC3FF80FC007C00780038007800100078001000780010007800100078001000780
+010007800100078001000780010007800100078001000780010007800100078001000780010007
+8001000780010007800100078001000780010007800100038002000380020001C0020001C00400
+00E008000070180000382000000FC0001D207E9E22>I<FFF003FE1F8000F80F0000600F800060
+078000400780004003C0008003C0008003C0008001E0010001E0010001F0010000F0020000F002
+0000F806000078040000780400003C0800003C0800003C0800001E1000001E1000001F3000000F
+2000000F20000007C0000007C0000007C000000380000003800000038000000100001F207F9E22
+>I<FFF07FF81FF01F800FC007C00F00078003800F00078001000F0007C00100078007C0020007
+8007C00200078007C0020003C009E0040003C009E0040003C009E0040003E010F00C0001E010F0
+080001E010F0080001F02078080000F02078100000F02078100000F0403C10000078403C200000
+78403C20000078C03E2000003C801E4000003C801E4000003C801E4000001F000F8000001F000F
+8000001F000F8000001E00078000000E00070000000E00070000000C000300000004000200002C
+207F9E2F>I<7FF83FF80FE00FC007C0070003C0020001E0040001F00C0000F008000078100000
+7C1000003C2000003E4000001E4000000F8000000F8000000780000003C0000007E0000005E000
+0009F0000018F8000010780000207C0000603C0000401E0000801F0001800F0001000780020007
+C0070003C01F8007E0FFE01FFE1F1F7F9E22>I<1FE000303000781800781C00300E00000E0000
+0E00000E0000FE00078E001E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F
+83C014147E9317>97 D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00
+000E00000E00000E3E000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00
+780E00780E00780E00700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C
+1C1E381E380C70007000F000F000F000F000F000F00070007000380138011C020E0C03F010147E
+9314>I<000380003F800003800003800003800003800003800003800003800003800003800003
+8003E380061B801C0780380380380380700380700380F00380F00380F00380F00380F00380F003
+807003807003803803803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038
+0700380700700700700380F00380F00380FFFF80F00000F00000F0000070000070000038008018
+00800C010007060001F80011147F9314>I<007C00C6018F038F07060700070007000700070007
+000700FFF007000700070007000700070007000700070007000700070007000700070007000700
+07007FF01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F0078
+0F00380E001C1C001E380033E0002000002000003000003000003FFE001FFF800FFFC03001E060
+0070C00030C00030C00030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE0000
+0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000E43000E8180
+0F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+0E01C00E01C00E01C0FFE7FC16207F9F19>I<1C001E003E001E001C0000000000000000000000
+00000E007E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
+00FFC00A1F809E0C>I<00E001F001F001F000E0000000000000000000000000007007F000F000
+700070007000700070007000700070007000700070007000700070007000700070007000700070
+00706070F060F0C061803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00
+000E00000E00000E00000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30
+000E70000EF8000F38000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF81520
+7F9F18>I<0E00FE000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F
+01F000FE618618000E81C81C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E
+00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00
+0E00E00E000E00E00E000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C0
+0F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+0E01C00E01C0FFE7FC16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000
+F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F8001414
+7F9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E
+00780E00780E00700E00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E
+00000E00000E00000E0000FFE000151D7F9319>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>114
+D<1F9030704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D060
+8F800D147E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E00
+0E000E000E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC0
+0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+0E01C00E03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E00
+8007010007010003820003820003820001C40001C40001EC0000E80000E8000070000070000070
+0000200015147F9318>I<FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C040
+0707C0800704C0800704E080038861000388710003C8730001D0320001D03A0000F03C0000E01C
+0000E01C0000601800004008001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000
+E40000EC00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF
+07FE1714809318>I<FF83F81E01E01C00C00E00800E00800E0080070100070100038200038200
+03820001C40001C40001EC0000E80000E800007000007000007000002000002000004000004000
+004000F08000F08000F100006200003C0000151D7F9318>I<3FFF380E200E201C403840784070
+00E001E001C00380078007010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC160180
+8C17>I<30307878F87C787830300E057C9E17>127 D E /Fm 9 118 df<3FFFFF803FFFFF803F
+803F003E007F0038007E003800FC007001FC007001F8006003F0006007F0006007E000000FC000
+001FC000001F8000003F0000007F0000007E000000FC000001FC018001F8018003F0018007F001
+8007E003800FC003801FC003001F8007003F000F007F001F007E007F00FFFFFF00FFFFFF00191F
+7D9E20>90 D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007FBE01F03E0
+3C03E07C03E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F9319>97
+D<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00
+007C00007C00003E00181E00180F807007FFE000FF8015147F9318>101
+D<001F8000FFC001F3E003E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC
+00FFFC0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0
+0007C00007C00007C00007C0003FFC003FFC0013207F9F10>I<01FC3C07FFFE0F079E1E03DE3E
+03E03E03E03E03E03E03E03E03E01E03C00F07800FFF0009FC001800001800001C00001FFF800F
+FFF007FFF81FFFFC3C007C70003EF0001EF0001EF0001E78003C78003C3F01F80FFFE001FF0017
+1E7F931A>I<FE0FE03F80FE1FF07FC01E70F9C3E01E407D01F01E807E01F01F807E01F01F007C
+01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F00
+7C01F01F007C01F01F007C01F01F007C01F0FFE3FF8FFEFFE3FF8FFE27147D932C>109
+D<FE0FC0FE3FE01E61F01EC0F81E80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00
+F81F00F81F00F81F00F81F00F81F00F8FFE3FFFFE3FF18147D931D>I<0FE63FFE701E600EE006
+E006F800FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>115
+D<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00
+F81F00F81F00F81F01F81F01F80F06F807FCFF03F8FF18147D931D>117
+D E /Fn 23 118 df<78FCFCFCFC7806067B8511>46 D<00100000700001F0000FF000FEF000F0
+F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000
+F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000
+F00000F00000F00000F00000F00000F00001F8007FFFE07FFFE013287BA71E>49
+D<00FE0007FF800E07E01803F02001F82000F840007C40007CF8007EFC007EFC003EFC003EFC00
+3E78007E00007E00007C00007C0000F80000F80001F00001E00003C0000780000700000E00001C
+0000380000700000600000C0000180020300020600040C000418000410000C3FFFFC7FFFF8FFFF
+F8FFFFF817287DA71E>I<007F000003FFC0000701F0000C00F80010007C001C007C003E007E00
+3E003E003E003E001E003E000C007E0000007C0000007C00000078000000F0000000E0000001C0
+000007000000FF00000001E0000000F0000000780000003C0000003E0000001F0000001F000000
+1F8000001F8030001F8078001F80FC001F80FC001F80FC001F00F8001F0040003F0040003E0030
+007C001800F8000F01F00003FFC000007F000019297EA71E>I<007F000001FFC00007C1E0000F
+0070001E0038001C003C003C001C0078001E0078001E00F8000F00F8000F00F8000F00F8000F00
+F8000F80F8000F80F8000F80F8000F8078000F8078001F803C001F803C001F801C002F800E004F
+800700CF8003810F80007E0F8000000F0000000F0000000F0000001E0000001E0000001E000000
+3C001C003C003E0078003E0070003C00E0001801C0001C0780000FFE000003F8000019297EA71E
+>57 D<00001800000000180000000018000000003C000000003C000000003C000000007E000000
+007E00000000FF000000009F000000009F000000011F800000010F800000010F8000000207C000
+000207C000000207C000000403E000000403E000000403E000000801F000000801F000001801F8
+00001000F800001000F800002000FC000020007C00003FFFFC00007FFFFE000040003E00004000
+3E000080001F000080001F000080001F000100000F800100000F800100000F8002000007C00700
+0007C01F80000FE0FFF000FFFFFFF000FFFF282A7EA92D>65 D<FFFFFF8000FFFFFFF00007E000
+FC0003E0007E0003E0003F0003E0001F8003E0000F8003E0000F8003E0000FC003E0000FC003E0
+000FC003E0000FC003E0000FC003E0000F8003E0001F8003E0001F0003E0003E0003E0007C0003
+E001F80003FFFFE00003E000F80003E0003E0003E0001F0003E0000F8003E00007C003E00007E0
+03E00003E003E00003F003E00003F003E00003F003E00003F003E00003F003E00003F003E00007
+E003E00007E003E0000FC003E0001F8003E0003F0007E000FE00FFFFFFF800FFFFFFE00024297E
+A82A>I<FFFF81FFFFFFFF81FFFF07F0000FE003E00007C003E00007C003E00007C003E00007C0
+03E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007
+C003E00007C003E00007C003E00007C003E00007C003FFFFFFC003FFFFFFC003E00007C003E000
+07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0
+0007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C007
+F0000FE0FFFF81FFFFFFFF81FFFF28297EA82D>72 D<00FE010003FF83000F81E3001E0037003C
+001F0038000F007800070070000700F0000300F0000300F0000300F0000100F8000100F8000100
+FC0000007C0000007F0000003FE000001FFF00000FFFE00007FFF80003FFFC00007FFE000007FF
+0000007F0000001F8000000F80000007C0000007C0800003C0800003C0800003C0800003C0C000
+03C0C0000380C0000380E0000780F0000700F8000E00EE001C00C3C07800C1FFF000803FC0001A
+2B7DA921>83 D<FFFE03FFF803FFC0FFFE03FFF803FFC00FE0003F80007E0007C0001F00001800
+03E0001F0000180003E0000F8000100003E0000F8000100001F0000F8000200001F0000FC00020
+0001F0000FC000200000F8000FC000400000F80013E000400000F80013E000400000FC0013E000
+C000007C0033F0008000007C0021F0008000007E0021F0008000003E0021F8010000003E0040F8
+010000003E0040F8010000001F0040F8020000001F00807C020000001F00807C020000000F8080
+7C040000000F81003E040000000F81003E0400000007C1003E0800000007C2001F0800000007C2
+001F0800000003E2001F1000000003E4000F9000000003E4000F9000000001F4000FA000000001
+F80007E000000001F80007E000000000F80007C000000000F00003C000000000F00003C0000000
+007000038000000000600001800000000060000180000000006000018000003A2A7FA83D>87
+D<01FC00000E0780001001C0003C00E0003E00F0003E0078001C00780008007800000078000000
+780000007800007FF80003E078000F8078001F0078003E0078007C00780078007820F8007820F8
+007820F8007820F800F8207C00F8203C013C401F063FC007F80F001B1A7E991E>97
+D<07800000FF800000FF8000000F80000007800000078000000780000007800000078000000780
+00000780000007800000078000000780000007800000078000000783F000078C1C0007B0070007
+A0038007C003C0078001E0078001E0078000F0078000F0078000F8078000F8078000F8078000F8
+078000F8078000F8078000F8078000F0078000F0078001F0078001E0078001C007C003C0074007
+8007200E0006181C000407E0001D2A7FA921>I<007F8001C0700780080F003C1E007C3C007C3C
+00387C0010780000F80000F80000F80000F80000F80000F80000F80000F800007800007C00003C
+00043C00041E00080F001007802001C0C0007F00161A7E991B>I<007E0003C3800700E00E00F0
+1C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F80000F80000F80000
+7800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E991B>101
+D<0000078001FC1840070721C00E03C1C01E03C0803C01E0003C01E0007C01F0007C01F0007C01
+F0007C01F0007C01F0003C01E0003C01E0001E03C0000E0380001707000011FC00003000000030
+00000030000000380000001C0000001FFFC0000FFFF80007FFFC001C003E0030000F0070000700
+60000380E0000380E0000380E0000380E0000380700007007000070038000E000C0018000780F0
+0000FF80001A287E9A1E>103 D<07800000FF800000FF8000000F800000078000000780000007
+800000078000000780000007800000078000000780000007800000078000000780000007800000
+0783F800078C1C0007900E0007A0070007A0078007C0078007C007800780078007800780078007
+800780078007800780078007800780078007800780078007800780078007800780078007800780
+078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E2A7FA921>I<07000F801F80
+1F800F80070000000000000000000000000000000000000007807F807F800F8007800780078007
+800780078007800780078007800780078007800780078007800780078007800780FFF8FFF80D29
+7FA811>I<07800000FF800000FF8000000F800000078000000780000007800000078000000780
+00000780000007800000078000000780000007800000078000000780000007807FF007807FF007
+801F8007801C0007801800078020000780400007808000078100000782000007870000079F8000
+07A7800007C7C0000783E0000781E0000781F0000780F8000780780007807C0007803E0007801E
+0007801F0007801F80FFFC7FF8FFFC7FF81D2A7FA920>107 D<0783F800FF8C1C00FF900E000F
+A0070007A0078007C0078007C00780078007800780078007800780078007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+8007800780FFFCFFFCFFFCFFFC1E1A7F9921>110 D<0787C0FF98E0FF91F00FA1F007C1F007C0
+E007C0000780000780000780000780000780000780000780000780000780000780000780000780
+0007800007800007800007800007C000FFFE00FFFE00141A7F9917>114
+D<07F8401C06C03001C06000C06000C0E00040E00040F00040F800007E00007FF0003FFE000FFF
+0003FF80003FC00007C08001E08001E0C000E0C000E0C000E0E000C0F001C0F80180C4070083F8
+00131A7E9918>I<0080000080000080000080000180000180000180000380000380000780000F
+80001FFF80FFFF8007800007800007800007800007800007800007800007800007800007800007
+800007800007800007804007804007804007804007804007804007804003C08001C08000E10000
+3E0012257FA417>I<07800780FF80FF80FF80FF800F800F800780078007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+800780078007800780078007800F8007800F800380178001C027C000E047FC003F87FC1E1A7F99
+21>I E /Fo 1 122 df<00600000F00000F00000F00000F00000F00000F0000060000060000060
+000060000060000060000060007861E0FFFFF0FFFFF07861E00060000060000060000060000060
+0000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0
+0000F00000F00000F00000F00000F00000F00000F0000060000060000060000060000060000060
+0000600000600000600000600000600000600014377DA91B>121 D E /Fp
+30 128 df<1C003E007F00FF80FF80FF807F003E001C000909798818>46
+D<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000FF1FC000001FC000001F
+C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000
+001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0
+00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F
+C000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3879B72B>49
+D<000FF80000007FFF000001FFFFC00003F01FE000078007F0000E0003F8001C0001FC001F8001
+FE003FC000FE003FE000FF003FE000FF003FE000FF003FE000FF001FC000FF000F8000FF000200
+00FE00000001FE00000001FE00000001FC00000003F800000003F000000007E000000007C00000
+001F800000007E0000003FF80000003FFF000000001FC000000007E000000003F000000001F800
+000001FC00000000FE00000000FF00000000FF000000007F800000007F800000007FC00000007F
+C00000007FC03F00007FC07F80007FC0FFC0007FC0FFC0007FC0FFC0007F80FFC0007F80FFC000
+FF80FF8000FF007F0000FF00700001FE00380001FC001C0003F8000F0007F00007E01FE00001FF
+FF8000007FFF0000000FF8000022397CB72B>51 D<000000380000000038000000007800000000
+F800000000F800000001F800000003F800000007F800000007F80000000FF80000001FF8000000
+1BF800000033F800000073F800000063F8000000C3F8000001C3F800000183F800000303F80000
+0703F800000603F800000C03F800001C03F800001803F800003003F800007003F800006003F800
+00C003F80001C003F800038003F800030003F800070003F8000E0003F8000C0003F800180003F8
+00380003F800300003F800600003F800E00003F800FFFFFFFFFCFFFFFFFFFCFFFFFFFFFC000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000007FC000003FFFFF80003FFFFF80003FFFFF826397EB82B>
+I<FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FFC00001FF80007F8000003F80007F80
+00000FC0007F80000007C0007F80000003C0007F80000003C0007F80000001C0007F80000001C0
+007F80000000C0007F80000000C0007F80000000C0007F80000000C0007F80000000E0007F8000
+000060007F8000300060007F8000300060007F8000300060007F8000300000007F800030000000
+7F8000300000007F8000700000007F8000700000007F8000F00000007F8003F00000007FFFFFF0
+0000007FFFFFF00000007FFFFFF00000007F8003F00000007F8000F00000007F8000700000007F
+8000700000007F8000300000007F8000300000007F800030000C007F800030000C007F80003000
+0C007F8000300018007F8000000018007F8000000018007F8000000018007F8000000038007F80
+00000038007F8000000030007F8000000030007F8000000070007F8000000070007F80000000F0
+007F80000000E0007F80000001E0007F80000003E0007F8000000FE0007F8000003FE000FFC000
+01FFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0363B7EBA3B>69
+D<FFFFFFC0FFFFFFC0FFFFFFC000FFC000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800000
+7F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000
+007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F80
+00007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F800000FFC000FFFFFFC0FFFFFFC0FF
+FFFFC01A3B7EBA1F>73 D<FFFF800000FFFFF0FFFFC00000FFFFF0FFFFE00000FFFFF0007FE000
+0007FE00007FF0000001F800006FF8000000F0000067F800000060000063FC00000060000063FE
+00000060000061FE00000060000060FF00000060000060FF800000600000607FC0000060000060
+3FC00000600000603FE00000600000601FF00000600000600FF000006000006007F80000600000
+6007FC00006000006003FC00006000006001FE00006000006001FF00006000006000FF80006000
+0060007F800060000060007FC00060000060003FE00060000060001FE00060000060000FF00060
+000060000FF800600000600007F800600000600003FC00600000600003FE00600000600001FF00
+600000600000FF006000006000007F806000006000007FC06000006000003FC06000006000001F
+E06000006000001FF06000006000000FF060000060000007F860000060000007FC600000600000
+03FE60000060000001FE60000060000000FF60000060000000FFE00000600000007FE000006000
+00003FE00000600000003FE00000600000001FE00000600000000FE00000600000000FE0000060
+00000007E00000F000000003E00001F800000001E00007FE00000001E000FFFFF0000000E000FF
+FFF00000006000FFFFF000000060003C3B7EBA41>78 D<000FF80060003FFF006000FFFFC0E001
+F807E1E007E000F1E00F80003BE00F00001FE01F00000FE03E000007E03E000003E07C000001E0
+7C000001E0FC000001E0FC000000E0FC000000E0FC000000E0FC00000060FE00000060FE000000
+60FF000000607F000000007F800000007FE00000003FF80000003FFF8000001FFFF800000FFFFF
+800007FFFFE00003FFFFF80001FFFFFC0000FFFFFE00003FFFFF000007FFFF8000007FFFC00000
+07FFE00000007FE00000001FF00000000FF000000007F000000007F800000003F840000003F8C0
+000003F8C0000001F8C0000001F8C0000001F8E0000001F8E0000001F8E0000001F0F0000001F0
+F0000003F0F8000003E0F8000003E0FC000007C0FF00000F80FB80000F00F1F0003E00F0FE00FC
+00E03FFFF800C00FFFE000C001FF8000253D7BBB30>83 D<3FFFFFFFFFFFF83FFFFFFFFFFFF83F
+FFFFFFFFFFF83FE001FF8007F83F0000FF0001F87C0000FF00007C780000FF00003C780000FF00
+003C700000FF00001C700000FF00001C600000FF00000C600000FF00000C600000FF00000C6000
+00FF00000C600000FF00000CE00000FF00000EC00000FF000006C00000FF000006C00000FF0000
+06C00000FF000006000000FF000000000000FF000000000000FF000000000000FF000000000000
+FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000
+000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF
+000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00000000
+0000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00
+0000000000FF000000000000FF000000000000FF000000000000FF000000000000FF0000000000
+00FF000000000000FF000000000000FF000000000003FFC00000001FFFFFFFF800001FFFFFFFF8
+00001FFFFFFFF800373B7DBA3E>I<FFFFFFC000FFFFF0FFFFFFC000FFFFF0FFFFFFC000FFFFF0
+00FFC0000007FE00007F80000001F800007F80000000F000007F800000006000007F8000000060
+00007F800000006000007F800000006000007F800000006000007F800000006000007F80000000
+6000007F800000006000007F800000006000007F800000006000007F800000006000007F800000
+006000007F800000006000007F800000006000007F800000006000007F800000006000007F8000
+00006000007F800000006000007F800000006000007F800000006000007F800000006000007F80
+0000006000007F800000006000007F800000006000007F800000006000007F800000006000007F
+800000006000007F800000006000007F800000006000007F800000006000007F80000000600000
+7F800000006000007F800000006000007F800000006000007F800000006000007F800000006000
+007F800000006000007F800000006000003F80000000C000003FC0000000C000003FC0000000C0
+00001FC00000018000001FC00000018000000FE000000300000007E000000700000003F0000006
+00000001F800000C00000000FC000038000000007E000070000000003F8001E0000000001FF00F
+C00000000007FFFF800000000001FFFE0000000000001FF00000003C3C7EBA41>I<7FFFFF800F
+FFFF007FFFFF800FFFFF007FFFFF800FFFFF0000FFFC0001FFE000003FF000007F0000001FF000
+007C0000001FF00000380000000FF800003000000007F800006000000007FC0000E000000003FE
+0000C000000003FE00018000000001FF00038000000000FF80030000000000FF80060000000000
+7FC00E00000000003FE00C00000000003FE01800000000001FF03800000000000FF83000000000
+000FF860000000000007FCE0000000000003FEC0000000000003FF80000000000001FF80000000
+000000FF00000000000000FF800000000000007FC00000000000007FC00000000000003FE00000
+000000003FF00000000000003FF00000000000006FF8000000000000E7FC000000000000C7FC00
+000000000183FE00000000000381FF00000000000301FF00000000000600FF80000000000E007F
+C0000000000C007FC00000000018003FE00000000038001FE00000000030001FF0000000006000
+0FF800000000E0000FF800000000C00007FC00000001800003FE00000003800003FE0000000300
+0001FF00000006000000FF8000000E000000FF8000001E0000007FC000003E0000003FE00000FF
+0000007FE00007FF800001FFF800FFFFF0000FFFFFF0FFFFF0000FFFFFF0FFFFF0000FFFFFF03C
+3B7EBA41>88 D<003FC0000001FFF8000007C07E00000E001F00001E000F80001F8007C0003FC0
+03E0003FC003F0003FC003F0003FC001F0001F8001F8000F0001F800000001F800000001F80000
+0001F800000001F80000001FF8000007FFF800003FF9F80000FF01F80003F801F80007F001F800
+0FC001F8001F8001F8003F8001F8007F0001F8007F0001F8007E0001F80CFE0001F80CFE0001F8
+0CFE0001F80CFE0003F80CFE0003F80C7E0006F80C7F0006F80C3F000C7C181F80187E380FE070
+3FF003FFE01FE0007F800F8026287CA62B>97 D<01F800000000FFF800000000FFF800000000FF
+F80000000007F80000000001F80000000001F80000000001F80000000001F80000000001F80000
+000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001
+F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F80FF0
+000001F83FFE000001F8F01F000001F9C007C00001FB0003E00001FE0001F00001FC0000F80001
+FC00007C0001F800007E0001F800003E0001F800003F0001F800003F0001F800003F8001F80000
+1F8001F800001F8001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001
+F800001FC001F800001FC001F800001FC001F800001FC001F800001F8001F800001F8001F80000
+3F8001F800003F0001F800003F0001F800007E0001F800007C0001FC0000FC0001FC0000F80001
+F60001F00001E30003E00001E1C00FC00001C0F03F000001803FFC000000000FE000002A3D7EBB
+30>I<0003FE00001FFFC0003E01F000F8003801F0003C03E000FC07C001FE0FC001FE0F8001FE
+1F8001FE3F0000FC3F0000787F0000007F0000007E0000007E000000FE000000FE000000FE0000
+00FE000000FE000000FE000000FE000000FE000000FE0000007E0000007F0000007F0000003F00
+00033F0000031F8000031F8000060FC0000607C0000C03E0001801F0003000F800E0007E03C000
+1FFF000003FC0020287DA626>I<00000007E000000003FFE000000003FFE000000003FFE00000
+00001FE00000000007E00000000007E00000000007E00000000007E00000000007E00000000007
+E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007E00000
+000007E00000000007E00000000007E00000000007E00000000007E0000001FC07E000000FFF87
+E000003F03C7E00000FC0067E00001F00037E00003E0001FE00007C0000FE0000FC0000FE0000F
+800007E0001F800007E0003F000007E0003F000007E0007F000007E0007E000007E0007E000007
+E000FE000007E000FE000007E000FE000007E000FE000007E000FE000007E000FE000007E000FE
+000007E000FE000007E000FE000007E0007E000007E0007E000007E0007F000007E0003F000007
+E0003F000007E0001F000007E0001F80000FE0000F80000FE00007C0001FE00003E0001FE00001
+F00077F80000F800E7FFC0003E0387FFC0001FFF07FFC00003FC07E0002A3D7DBB30>I<0003FC
+0000001FFF0000007E07C00000F801E00001E000F00003E000780007C0007C000F80003E001F80
+003E001F00003F003F00001F003F00001F007F00001F007E00001F807E00001F80FE00001F80FE
+00001F80FFFFFFFF80FFFFFFFF80FE00000000FE00000000FE00000000FE00000000FE00000000
+7E000000007E000000007F000000007F000000003F000001803F000001801F800001800F800003
+000FC000030007C000060003E0000C0001F00018000078007000003F01E000000FFF80000001FE
+000021287EA626>I<00003F000001FFC00003E0E0000781F0000F83F8001F07F8003E07F8007E
+07F8007E03F0007C01E000FC000000FC000000FC000000FC000000FC000000FC000000FC000000
+FC000000FC000000FC000000FC000000FC000000FC000000FC0000FFFFFC00FFFFFC00FFFFFC00
+00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00
+0000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC
+000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000
+FC000001FE00007FFFFC007FFFFC007FFFFC001D3D7FBC1A>I<0007F001F8003FFE0FFC007C1F
+1E3E00F007F03E01E003E01C03C001E00807C001F0000FC001F8000F8000F8001F8000FC001F80
+00FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC000F8000F8000FC001F80007
+C001F00003C001E00001E003C00001F0078000037C1F0000073FFE00000607F000000600000000
+0E000000000E000000000E000000000F000000000F0000000007C000000007FFFFC00003FFFFFC
+0001FFFFFF0000FFFFFF8003FFFFFFC00780003FE01F000007F03E000001F83C000000F87C0000
+00F8780000007CF80000007CF80000007CF80000007CF80000007CF80000007C7C000000F87C00
+0000F83E000001F01F000003E00F800007C003E0001F0001FC00FE00003FFFF0000007FF800027
+397EA52B>I<01F800000000FFF800000000FFF800000000FFF80000000007F80000000001F800
+00000001F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F800
+00000001F80000000001F80000000001F80000000001F807F8000001F81FFE000001F8781F0000
+01F8E00F800001F98007C00001FB0007E00001FB0003E00001FE0003F00001FC0003F00001FC00
+03F00001FC0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000
+01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800
+03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000
+01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007F800FFFFF1
+FFFFE0FFFFF1FFFFE0FFFFF1FFFFE02B3C7EBB30>I<01C00003F00007F8000FF8000FF8000FF8
+0007F80003F00001C0000000000000000000000000000000000000000000000000000000000000
+0000000001F8007FF8007FF8007FF80007F80001F80001F80001F80001F80001F80001F80001F8
+0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8
+0001F80001F80001F80001F80001F80001F80001F80001F80001F80003FC00FFFFE0FFFFE0FFFF
+E0133A7FB917>I<01F800000000FFF800000000FFF800000000FFF80000000007F80000000001
+F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000
+000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001
+F80000000001F80000000001F80000000001F80000000001F80000000001F800FFFE0001F800FF
+FE0001F800FFFE0001F8007FE00001F8003F800001F8003E000001F80038000001F80030000001
+F800E0000001F801C0000001F80300000001F80600000001F80C00000001F81800000001F83C00
+000001F87E00000001F8FF00000001FB9F00000001FF1F80000001FC0FC0000001F807C0000001
+F807E0000001F803F0000001F801F0000001F801F8000001F800FC000001F8007C000001F8007E
+000001F8003F000001F8001F800001F8001F800001F8000FC00001F8000FE00003FC001FF800FF
+FFF07FFF80FFFFF07FFF80FFFFF07FFF80293C7EBB2D>107 D<01F800FFF800FFF800FFF80007
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80003
+FC00FFFFF0FFFFF0FFFFF0143C7FBB17>I<01F807F80000FFF81FFE0000FFF8781F0000FFF8E0
+0F800007F98007C00001FB0007E00001FB0003E00001FE0003F00001FC0003F00001FC0003F000
+01FC0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800
+03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000
+01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800
+03F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007F800FFFFF1FFFFE0
+FFFFF1FFFFE0FFFFF1FFFFE02B267EA530>110 D<01F80FF00000FFF83FFE0000FFF8F01F0000
+FFF9C007C00003FB0003E00001FE0001F00001FC0000F80001FC0000FC0001F800007E0001F800
+007E0001F800007F0001F800003F0001F800003F8001F800003F8001F800001F8001F800001FC0
+01F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800
+001FC001F800001FC001F800001F8001F800003F8001F800003F8001F800003F0001F800007F00
+01F800007E0001F80000FC0001FC0000FC0001FC0001F80001FE0003F00001FB0007E00001F9C0
+0FC00001F8F03F000001F83FFC000001F80FE0000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F800
+00000001F80000000001F80000000003FC00000000FFFFF0000000FFFFF0000000FFFFF0000000
+2A377EA530>112 D<03F00F80FFF03FE0FFF070F0FFF0C1F807F183F801F303F801F603F801F6
+01F001F6004001FC000001FC000001FC000001FC000001F8000001F8000001F8000001F8000001
+F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000
+01F8000001F8000001F8000001F8000001F8000001F8000001F8000003FC0000FFFFF800FFFFF8
+00FFFFF8001D267EA522>114 D<007F818003FFE3800F807F801E001F80380007803800078070
+00038070000380F0000180F0000180F0000180F8000180F8000180FE0000007F8000007FFC0000
+3FFFC0001FFFF0000FFFFC0003FFFE0001FFFF00001FFF800000FF8000001FC040000FC0C00007
+E0C00003E0E00001E0E00001E0E00001E0E00001E0F00001E0F00001C0F80003C0FC000380FC00
+0700F7000E00E3C03C00C0FFF800C03FC0001B287DA622>I<0018000000180000001800000018
+00000018000000380000003800000038000000380000007800000078000000F8000000F8000001
+F8000003F8000007F800001FFFFF00FFFFFF00FFFFFF0001F8000001F8000001F8000001F80000
+01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800
+0001F8000001F8000001F8000001F8000001F8018001F8018001F8018001F8018001F8018001F8
+018001F8018001F8018001F8018000F8018000F8030000FC0300007C0300003E0600001F0C0000
+0FF8000003F00019367EB421>I<01F80003F000FFF801FFF000FFF801FFF000FFF801FFF00007
+F8000FF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003
+F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001
+F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003
+F00001F80003F00001F80003F00001F80003F00001F80003F00001F80007F00001F80007F00001
+F80007F00000F8000FF00000F8000FF00000FC001BF000007C001BFC00003E0073FFE0001F81E3
+FFE0000FFF83FFE00001FE03F0002B277EA530>I<FFFF801FFFFFFF801FFFFFFF801FFF07FC00
+07F803F80003E003F80001C001F800018001F800018000FC00030000FC00030000FC000300007E
+000600007E000600007F000E00003F000C00003F000C00001F801800001F801800001FC0380000
+0FC03000000FC030000007E060000007E060000007E060000003F0C0000003F0C0000003F9C000
+0001F980000001F980000000FF00000000FF00000000FF000000007E000000007E000000003C00
+0000003C000000003C0000000018000028267EA42D>I<3C003C7E007EFF00FFFF81FFFF81FFFF
+81FFFF00FF7E007E3C003C180977B92B>127 D E /Fq 55 128 df<387CFEFEFEFEFE7C7C7C7C
+7C7C7C7C38383838383838380000000000387CFEFEFE7C3807237BA211>33
+D<3803807C07C0FE0FE0FF0FF0FF0FF07F07F03B03B00300300300300700700600600600600C00
+C01C01C018018070070020020014117EA21D>I<FFFCFFFCFFFCFFFC0E047F8C13>45
+D<387CFEFEFE7C3807077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00F87C007C7C007C
+7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007E
+FC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE0017207E9F1C>
+48 D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F80001F80001F800
+01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800
+01F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF003C1FC07007
+E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007E00007C0000F
+80001F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFFF03FFFF07FFF
+F0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F81F83F81F81F
+03F81F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F80000FC0000FC3C
+00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017207E9F1C>I<
+0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E001C7E00187E0
+0307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E00007E00007E0
+0007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFFC01FFF801FFF
+001FFE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807E01803E00003
+F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007C01C1F800FFF
+0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E01F87E00F07C
+00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC007EFC007E7C
+007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F1C>I<600000
+7800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300C00300000600
+000C00001C0000180000380000780000780000F00000F00000F00001F00001F00001F00003F000
+03F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FFC00703E00E00
+F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FFC003FFE007FF
+F01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800383C00381F01
+F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C0078FC007CFC
+007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07FC7E00207E00
+007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017207E9F1C>I<
+387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<07FC001FFF00380F8070
+07C0F807E0FC07E0FC07E0FC07E07807E0000FC0001F80001F00003C0000780000700000E00000
+E00000C00000C00000C00000C00000C00000C00000000000000000000000000000000001C00003
+E00007F00007F00007F00003E00001C00013237DA21A>63 D<000070000000007000000000F800
+000000F800000000F800000001FC00000001FC00000003FE00000003FE00000003FE00000006FF
+000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181FC00000381FE0000030
+0FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FFFFF800018001FC0001
+8001FC00038001FE00030000FE00030000FE000600007F000600007F00FFE00FFFF8FFE00FFFF8
+25227EA12A>65 D<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007F0003F0007F0001F8007
+F0000FC007F00007E007F00007E007F00007F007F00003F007F00003F007F00003F007F00003F8
+07F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003
+F807F00003F007F00003F007F00003F007F00007E007F00007E007F0000FC007F0001F8007F000
+3F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227EA12B>68 D<FFFFFFFCFFFFFFFC07
+F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607F0180607F0180607F01806
+07F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F018
+0307F0180307F0000307F0000607F0000607F0000607F0000E07F0000E07F0001E07F0003E07F0
+01FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF807F001F807F0007807F0003807F0
+001807F0001C07F0001C07F0000C07F0000C07F0180C07F0180C07F0180007F0180007F0380007
+F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F0180007F0180007F00000
+07F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFFE000FFFFE0001E227E
+A123>I<FFFF83FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0
+07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F
+C007FFFFFFC007FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F000
+1FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0
+001FC007F0001FC0FFFF83FFFEFFFF83FFFE27227EA12C>72 D<FFFFE0FFFFE003F80003F80003
+F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003
+F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003
+F80003F800FFFFE0FFFFE013227FA115>I<FFFF803FFCFFFF803FFC07F000038007F000070007
+F0000E0007F000180007F000300007F000E00007F001C00007F003800007F007000007F00E0000
+07F018000007F038000007F0FC000007F1FE000007F3FE000007F77F000007FE7F800007F83F80
+0007F01FC00007F01FE00007F00FE00007F007F00007F007F80007F003F80007F001FC0007F001
+FE0007F000FF0007F0007F0007F0007F8007F0003FC0FFFF83FFFCFFFF83FFFC26227EA12C>75
+D<FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0067E
+000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0060FC00307
+E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E00603F00C07E00601
+F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E006007E6007E006007E6007
+E006003FC007E006003FC007E006001F8007E006001F8007E006001F8007E006000F0007E0FFF0
+0F00FFFFFFF00600FFFF30227EA135>77 D<01FC0407FF8C1F03FC3C007C7C003C78001C78001C
+F8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE
+0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE0
+80FF8018227DA11F>83 D<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F8
+0180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFCFFFF
+803FFC07F000018007F000018007F000018007F000018007F000018007F000018007F000018007
+F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0000180
+07F000018007F000018007F000018007F000018007F000018007F000018007F000018007F00001
+8007F000018003F000030003F800030001F800060000FC000E00007E001C00003F80F800000FFF
+E0000001FF000026227EA12B>I<FFFF0FFFF01FFEFFFF0FFFF01FFE0FF000FF0000E007F0007F
+0000C007F0007F0000C003F8007F80018003F8003F80018003FC003F80038001FC003FC0030001
+FC003FC0030000FE007FE0060000FE006FE0060000FF006FE00600007F00C7F00C00007F00C7F0
+0C00007F80C7F81C00003F8183F81800003F8183F81800001FC383FC3000001FC301FC3000001F
+E301FC3000000FE600FE6000000FE600FE6000000FF600FFE0000007FC007FC0000007FC007FC0
+000003FC007F80000003F8003F80000003F8003F80000001F0001F00000001F0001F00000000F0
+001E00000000E0000E00000000E0000E000037227FA13A>87 D<7FFFC1FFF07FFFC1FFF003FC00
+0C0001FE00180000FE00380000FF007000007F806000003F80C000003FC1C000001FE38000000F
+E30000000FF700000007FE00000003FC00000003FC00000001FE00000000FE00000000FF000000
+00FF80000001FFC0000001BFC00000031FE00000070FF000000E0FF000000C07F800001803FC00
+003803FC00003001FE00006000FF0000E000FF0001C0007F800180003FC0FFFC03FFFEFFFC03FF
+FE27227FA12A>I<0400400E00E0180180380380300300600600600600E00E00C00C00C00C00DC
+0DC0FE0FE0FF0FF0FF0FF07F07F03E03E01C01C014117AA21D>92 D<07FC001FFF803F07C03F03
+E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01
+F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 D<FF000000FF0000001F0000001F0000
+001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0F
+E0001F3FF8001FF07C001F801E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F
+000FC01F000FC01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C00
+1C3FF800180FC0001A237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000
+FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF80
+00FE0014167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E0000
+003E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E00
+3E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E
+00FC003E007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F>
+I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC00
+00FC00007C00007C00007E00003E00181F00300FC07003FFC000FF0015167E951A>I<003F8000
+FFC001E3E003C7E007C7E00F87E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FF
+FC000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F
+80000F80000F80000F80000F80000F80007FF8007FF80013237FA211>I<03FC1E0FFF7F1F0F8F
+3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC00300000
+3000003800003FFF801FFFF00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C
+7C007C3F01F80FFFE001FF0018217E951C>I<FF000000FF0000001F0000001F0000001F000000
+1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F07E0001F1FF8
+001F307C001F403C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F00
+3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FF
+E1FFC01A237EA21F>I<1C003F007F007F007F003F001C000000000000000000000000000000FF
+00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00
+FFE0FFE00B247EA310>I<FF000000FF0000001F0000001F0000001F0000001F0000001F000000
+1F0000001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F0060
+001F01C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07
+C0001F03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E
+>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA2
+10>I<FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F00
+1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00
+1F001F001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F40
+3C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F
+003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E95
+1F>I<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007E
+FC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0F
+E000FF3FF8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F
+000FC01F000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC00
+1F3FF8001F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000
+00FFE00000FFE000001A207E951F>I<FE1F00FE3FC01E67E01EC7E01E87E01E87E01F83C01F00
+001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FFF0
+00FFF00013167E9517>114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0
+007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F0
+0011167E9516>I<0180000180000180000180000380000380000780000780000F80003F8000FF
+FF00FFFF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F
+81800F81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>I<FF01FE00FF01
+FE001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F
+003E001F003E001F003E001F003E001F003E001F003E001F007E001F00FE000F81BE0007FF3FC0
+01FC3FC01A167E951F>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007C00C0007E01C00
+03E0180003E0180001F0300001F0300000F8600000F86000007CC000007CC000007FC000003F80
+00003F8000001F0000001F0000000E0000000E00001B167F951E>I<FFE7FF07F8FFE7FF07F81F
+007800C00F807801800F807C01800F807C018007C07E030007C0DE030007E0DE070003E0DF0600
+03E18F060001F18F0C0001F38F8C0001FB079C0000FB07D80000FE03D800007E03F000007E03F0
+00007C01F000003C01E000003800E000001800C00025167F9528>I<FFE07FC0FFE07FC00F801C
+0007C0380003E0700003F0600001F8C00000F98000007F8000003F0000001F0000001F8000003F
+C0000037C0000063E00000C1F00001C0F8000380FC0007007E000E003E00FF80FFE0FF80FFE01B
+167F951E>I<7FFFF07FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F800
+01F00003F03007E03007C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>
+122 D<FFFFFFFFFFFFFEFFFFFFFFFFFFFE3702808E38>124 D<380E007C1F00FE3F80FE3F80FE
+3F807C1F00380E0011077BA31C>127 D E /Fr 54 128 df<1F003F807FC0FFE0FFE0FFE0FFE0
+FFE0FFE07FC07FC07FC07FC07FC07FC03F803F803F803F803F803F803F801F001F001F001F001F
+001F001F000E000E000E000E000000000000000000000000000E003F807FC07FC0FFE0FFE0FFE0
+7FC07FC03F800E000B3279B119>33 D<1F0007C03F800FE07FC01FF0FFE03FF8FFE03FF8FFF03F
+FCFFF03FFCFFF03FFC7FF01FFC3FF00FFC1F7007DC0070001C0070001C00E0003800E0003800E0
+003801C0007001C00070038000E0038000E0070001C00E0003801C00070038000E00100004001E
+197DB12B>I<FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF014077F921B>45
+D<000FFC0000007FFF800001FFFFE00003FC0FF00007F003F8000FE001FC000FE001FC001FC000
+FE003FC000FF003FC000FF003F80007F007F80007F807F80007F807F80007F807F80007F80FF80
+007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF
+80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0
+7F80007F807F80007F807F80007F807F80007F803F80007F003FC000FF003FC000FF001FC000FE
+001FE001FE000FE001FC0007F807F80003FC0FF00001FFFFE000007FFF8000000FFC0000222E7D
+AD29>48 D<0001E0000003E000000FE000007FE0001FFFE000FFFFE000FFBFE000E03FE000003F
+E000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE00000
+3FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000
+003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0
+00003FE000003FE000003FE000003FE000003FE0007FFFFFF07FFFFFF07FFFFFF01C2E7AAD29>
+I<003FF00001FFFE0007FFFF800FC07FE01E001FF03C000FF87F0007FC7F8007FEFFC007FEFFC0
+03FEFFC003FFFFC003FF7F8003FF7F8003FF3F0003FF000003FF000003FE000003FE000007FC00
+0007FC00000FF800000FF000001FE000001FC000003F8000007F000000FE000001F8000001F000
+0003E00000078007000F0007001E0007003C000F0078000E00F0000E01C0001E03FFFFFE07FFFF
+FE0FFFFFFE1FFFFFFE3FFFFFFE7FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC202E7CAD29>I<000FFC
+0000007FFF800001F01FE00003C00FF000070007F8000FE007FC000FF007FC001FF007FE001FF8
+07FE001FF807FE001FF807FE001FF807FE000FF007FC0007E007FC00018007FC0000000FF80000
+000FF00000001FE00000001FC00000007F8000001FFE0000001FFC0000001FFF800000001FF000
+000007F800000003FC00000003FE00000003FF00000001FF80000001FF800E0001FFC03F8001FF
+C07FC001FFC07FC001FFC0FFE001FFC0FFE001FFC0FFE001FF80FFE001FF80FFC003FF007F8003
+FF003F0003FE001F0007FC000FE01FF80007FFFFE00001FFFF8000001FFC0000222E7DAD29>I<
+0000007800000000F800000001F800000003F800000007F800000007F80000000FF80000001FF8
+0000003FF80000007FF800000077F8000000F7F8000001E7F8000003C7F800000787F800000707
+F800000F07F800001E07F800003C07F800007807F800007007F80000F007F80001E007F80003C0
+07F800078007F8000F0007F8000F0007F8001E0007F8003C0007F800780007F800F00007F800FF
+FFFFFFF0FFFFFFFFF0FFFFFFFFF000000FF80000000FF80000000FF80000000FF80000000FF800
+00000FF80000000FF80000000FF80000000FF800000FFFFFF0000FFFFFF0000FFFFFF0242E7EAD
+29>I<0C0000380FC003F80FFFFFF80FFFFFF00FFFFFE00FFFFFC00FFFFF800FFFFE000FFFFC00
+0FFFF0000FFF00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0FF8
+000F7FFF000FFFFFC00FF01FE00F800FF00F0007F80E0007FC000003FC000003FE000003FE0000
+03FF000003FF1E0003FF3F0003FF7F8003FFFF8003FFFFC003FFFFC003FEFF8003FEFF8003FE7F
+0007FC7C0007F83C000FF01E001FE00FC07FC007FFFF8001FFFE00003FE000202E7CAD29>I<00
+007F80000007FFF000001FC07800007F001C0000FC001E0001F8007E0003F800FF0007F001FF00
+0FF001FF000FE001FF001FE001FF003FE000FE003FE0007C003FC00000007FC00000007FC00000
+007FC0000000FFC3FF8000FFC7FFE000FFCFBFF000FFDC03F800FFF801FC00FFF001FE00FFF000
+FF00FFE000FF80FFE000FF80FFE000FF80FFC000FFC0FFC000FFC0FFC000FFC07FC000FFC07FC0
+00FFC07FC000FFC07FC000FFC03FC000FFC03FC000FF803FC000FF801FE000FF801FE000FF000F
+E001FE0007F001FC0003F803F80001FC0FF00000FFFFE000003FFF80000007FC0000222E7DAD29
+>I<38000000003E000000003FFFFFFFC03FFFFFFFC03FFFFFFFC03FFFFFFF807FFFFFFF007FFF
+FFFE007FFFFFFC007FFFFFF8007FFFFFF000780001F000700003E000700007C000F0000F8000E0
+000F0000E0001E0000E0003E000000007C00000000F800000000F800000001F000000001F00000
+0003F000000003E000000007E000000007E00000000FE00000000FE00000001FC00000001FC000
+00001FC00000003FC00000003FC00000003FC00000003FC00000003FC00000007FC00000007FC0
+0000007FC00000007FC00000007FC00000007FC00000007FC00000007FC00000003F800000003F
+800000000E00000022307BAF29>I<0007FC0000003FFF800000F80FE00001E003F00003C001F8
+00078000FC000F8000FC000F80007E000F80007E001F80007E001FC0007E001FC0007E001FE000
+7E001FF800FC001FFE00FC000FFF81F8000FFFE1F0000FFFF7E00007FFFFC00003FFFF800001FF
+FFC00000FFFFE000007FFFF80001FFFFFC0003F7FFFE000FE1FFFF001F807FFF003F003FFF803F
+000FFF807E0003FFC07E0000FFC0FC00007FC0FC00001FC0FC00001FC0FC00000FC0FC00000FC0
+FC00000F807E00000F807E00000F007F00001F003F00001E001FC0007C000FF803F80003FFFFE0
+0000FFFF8000001FFC0000222E7DAD29>I<000FFC0000007FFF000001FC0FC00003F003E00007
+E003F0000FE001F8001FE001FC003FC001FE007FC000FE007FC000FF00FFC000FF00FFC000FF80
+FFC000FF80FFC000FF80FFC000FF80FFC000FFC0FFC000FFC0FFC000FFC0FFC000FFC07FC001FF
+C07FC001FFC03FC001FFC03FC003FFC01FE003FFC00FE007FFC007F00EFFC003FF7CFFC001FFF8
+FFC0007FF0FF80000000FF80000000FF80000000FF80000000FF000F8001FF001FC001FF003FE0
+01FE003FE001FC003FE003FC003FE003F8003FC007F0001F800FE0001E001FC0000F807F800007
+FFFE000001FFF80000007FC00000222E7DAD29>I<1F003F807FC0FFE0FFE0FFE0FFE0FFE07FC0
+3F801F0000000000000000000000000000000000000000001F003F807FC0FFE0FFE0FFE0FFE0FF
+E07FC03F801F000B207A9F17>I<00FFE00003FFFC000FFFFF001F007F803C003FC07E001FE07F
+001FE0FF801FF0FF801FF0FF801FF0FF801FF07F001FF03E003FE01C003FC000007F800000FF00
+0001FE000001F8000003F0000007E0000007C000000F8000000F0000000E0000000E0000001E00
+00001C0000001C0000001C0000001C0000001C0000001C0000001C000000000000000000000000
+0000000000000000000000000000001C0000007F000000FF800000FF800001FFC00001FFC00001
+FFC00000FF800000FF8000007F0000001C00001C327BB127>63 D<0000007C0000000000007C00
+0000000000FE000000000000FE000000000000FE000000000001FF000000000001FF0000000000
+03FF800000000003FF800000000007FFC00000000007FFC00000000007FFC0000000000FFFE000
+0000000F7FE0000000001F7FF0000000001E3FF0000000001E3FF0000000003E3FF8000000003C
+1FF8000000007C1FFC00000000780FFC00000000780FFC00000000F80FFE00000000F007FE0000
+0001F007FF00000001E003FF00000001E003FF00000003E003FF80000003C001FF80000007C001
+FFC00000078000FFC00000078000FFC000000FFFFFFFE000000FFFFFFFE000001FFFFFFFF00000
+1E00003FF000001E00003FF000003C00003FF800003C00001FF800007C00001FFC00007800000F
+FC00007800000FFC0000F0000007FE0000F0000007FE0001F0000007FF0003F8000003FF00FFFF
+C001FFFFFEFFFFC001FFFFFEFFFFC001FFFFFE37317DB03E>65 D<FFFFFFFFF00000FFFFFFFFFF
+0000FFFFFFFFFFC00000FFC000FFF00000FFC0000FFC0000FFC00007FE0000FFC00001FF0000FF
+C00000FF8000FFC000007FC000FFC000003FE000FFC000003FE000FFC000001FF000FFC000001F
+F000FFC000001FF800FFC000000FF800FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC0
+00000FFC00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE
+00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000
+000FFE00FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC000000FF800
+FFC000001FF800FFC000001FF800FFC000001FF000FFC000003FE000FFC000003FE000FFC00000
+7FC000FFC00000FF8000FFC00001FF0000FFC00003FE0000FFC0000FFC0000FFC0007FF000FFFF
+FFFFFFE000FFFFFFFFFF0000FFFFFFFFF0000037317EB03F>68 D<FFFFFFFFFFF000FFFFFFFFFF
+F000FFFFFFFFFFF00000FFC0003FF00000FFC00007F80000FFC00003F80000FFC00000F80000FF
+C00000F80000FFC00000780000FFC00000780000FFC00000380000FFC00000380000FFC0000038
+0000FFC000001C0000FFC007001C0000FFC007001C0000FFC007001C0000FFC00700000000FFC0
+0700000000FFC00F00000000FFC01F00000000FFC03F00000000FFFFFF00000000FFFFFF000000
+00FFFFFF00000000FFC03F00000000FFC01F00000000FFC00F00000000FFC00700000000FFC007
+00000000FFC00700038000FFC00700038000FFC00700038000FFC00000070000FFC00000070000
+FFC00000070000FFC00000070000FFC000000F0000FFC000000F0000FFC000001E0000FFC00000
+1E0000FFC000003E0000FFC000007E0000FFC00000FE0000FFC00003FE0000FFC0001FFE00FFFF
+FFFFFFFC00FFFFFFFFFFFC00FFFFFFFFFFFC0031317EB036>I<FFFFFFFFFFF0FFFFFFFFFFF0FF
+FFFFFFFFF000FFC0003FF000FFC00007F800FFC00003F800FFC00000F800FFC00000F800FFC000
+007800FFC000007800FFC000003800FFC000003800FFC000003800FFC000001C00FFC000001C00
+FFC007001C00FFC007001C00FFC007000000FFC007000000FFC007000000FFC00F000000FFC01F
+000000FFC03F000000FFFFFF000000FFFFFF000000FFFFFF000000FFC03F000000FFC01F000000
+FFC00F000000FFC007000000FFC007000000FFC007000000FFC007000000FFC007000000FFC000
+000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000
+FFC000000000FFC000000000FFC000000000FFC000000000FFC0000000FFFFFFF00000FFFFFFF0
+0000FFFFFFF000002E317EB034>I<FFFFFFC0FFFFFFC0FFFFFFC000FFC00000FFC00000FFC000
+00FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC0
+0000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FF
+C00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000
+FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC000
+00FFC000FFFFFFC0FFFFFFC0FFFFFFC01A317EB01F>73 D<FFFFFFC0007FFFC0FFFFFFC0007FFF
+C0FFFFFFC0007FFFC000FFC0000007F00000FFC0000003C00000FFC000000F800000FFC000001F
+000000FFC000003C000000FFC0000078000000FFC00001F0000000FFC00003E0000000FFC00007
+80000000FFC0000F00000000FFC0003E00000000FFC0007C00000000FFC000F000000000FFC001
+E000000000FFC007C000000000FFC00F8000000000FFC01F0000000000FFC03F8000000000FFC0
+7FC000000000FFC1FFE000000000FFC3FFF000000000FFC7FFF000000000FFCF3FF800000000FF
+FE1FFC00000000FFFC0FFE00000000FFF007FE00000000FFE007FF00000000FFC003FF80000000
+FFC001FFC0000000FFC000FFE0000000FFC000FFE0000000FFC0007FF0000000FFC0003FF80000
+00FFC0001FFC000000FFC0000FFC000000FFC0000FFE000000FFC00007FF000000FFC00003FF80
+0000FFC00001FFC00000FFC00001FFC00000FFC00000FFE00000FFC000007FF00000FFC000007F
+F800FFFFFFC00FFFFFE0FFFFFFC00FFFFFE0FFFFFFC00FFFFFE03B317EB041>75
+D<FFFFFFF00000FFFFFFF00000FFFFFFF0000000FFC000000000FFC000000000FFC000000000FF
+C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000
+0000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FF
+C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000
+0000FFC000000000FFC000000000FFC000000000FFC000000000FFC000007000FFC000007000FF
+C000007000FFC00000F000FFC00000F000FFC00000E000FFC00000E000FFC00001E000FFC00001
+E000FFC00003E000FFC00003E000FFC00007E000FFC0000FE000FFC0001FE000FFC0007FC000FF
+C003FFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC02C317EB032>I<FFFF8000000001FFFF80
+FFFFC000000003FFFF80FFFFE000000007FFFF8000FFE000000007FF800000EFF00000000EFF80
+0000EFF00000000EFF800000EFF00000000EFF800000E7F80000001CFF800000E7F80000001CFF
+800000E3FC00000038FF800000E3FC00000038FF800000E1FE00000070FF800000E1FE00000070
+FF800000E0FF000000E0FF800000E0FF000000E0FF800000E07F800001C0FF800000E07F800001
+C0FF800000E03FC0000380FF800000E03FC0000380FF800000E03FC0000380FF800000E01FE000
+0700FF800000E01FE0000700FF800000E00FF0000E00FF800000E00FF0000E00FF800000E007F8
+001C00FF800000E007F8001C00FF800000E003FC003800FF800000E003FC003800FF800000E001
+FE007000FF800000E001FE007000FF800000E000FF00E000FF800000E000FF00E000FF800000E0
+00FF00E000FF800000E0007F81C000FF800000E0007F81C000FF800000E0003FC38000FF800000
+E0003FC38000FF800000E0001FE70000FF800000E0001FE70000FF800000E0000FFE0000FF8000
+00E0000FFE0000FF800000E00007FC0000FF800000E00007FC0000FF800000E00007FC0000FF80
+0000E00003F80000FF800001F00003F80000FF8000FFFFE001F000FFFFFF80FFFFE001F000FFFF
+FF80FFFFE000E000FFFFFF8049317EB04E>I<001FF0018000FFFF038003FFFFC78007F00FFF80
+0F8001FF801F00007F803F00001F803E00000F807E00000F807E00000780FE00000780FE000007
+80FE00000380FF00000380FF00000380FF80000000FFE00000007FFC0000007FFFE000007FFFFE
+00003FFFFFC0001FFFFFF0001FFFFFF8000FFFFFFC0003FFFFFE0001FFFFFF00007FFFFF80001F
+FFFF800000FFFFC0000007FFC0000000FFE00000003FE00000003FE00000001FE06000001FE0E0
+00000FE0E000000FE0E000000FE0E000000FC0F000000FC0F000000FC0F800001F80FC00001F80
+FF00003F00FFC0007E00FFFC01FC00F1FFFFF800E03FFFE000C007FF000023317BB02E>83
+D<3FFFFFFFFFFF003FFFFFFFFFFF003FFFFFFFFFFF003FE00FFC01FF007F000FFC003F807E000F
+FC001F807C000FFC000F8078000FFC00078078000FFC00078070000FFC00038070000FFC000380
+70000FFC00038070000FFC000380E0000FFC0001C0E0000FFC0001C0E0000FFC0001C0E0000FFC
+0001C000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000
+000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00
+000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000000
+0FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000
+0000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000F
+FC000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF800032307DAF39>I<FFFFFFC003FFFF
+C0FFFFFFC003FFFFC0FFFFFFC003FFFFC000FFC0000007E00000FFC0000003C00000FFC0000003
+C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC00000
+03C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC000
+0003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0
+000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FF
+C0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000
+FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C000
+00FFC0000003C000007FC00000038000007FC00000078000007FE00000078000003FE000000F00
+00003FE000000F0000001FF000001E0000000FF800003E00000007FC00007C00000003FE0001F8
+00000000FFC00FE0000000003FFFFF80000000000FFFFE000000000000FFF00000003A317EB03F
+>I<FFFFFE07FFFFF801FFFFFFFFFE07FFFFF801FFFFFFFFFE07FFFFF801FFFF03FF00000FFC00
+0007E003FF80000FFC000003C001FF80000FFE0000038001FF800007FE0000038001FFC00007FE
+0000078000FFC00007FF0000070000FFE00003FF00000700007FE00003FF80000E00007FE00003
+FF80000E00007FF00003FF80001E00003FF00007FFC0001C00003FF80007FFC0001C00001FF800
+07FFE0003800001FF8000E7FE0003800001FFC000E7FE0007800000FFC001E7FF0007000000FFC
+001C3FF00070000007FE001C3FF000E0000007FE00381FF800E0000007FF00381FF801E0000003
+FF00781FFC01C0000003FF00700FFC01C0000003FF80700FFC03C0000001FF80F00FFE03800000
+01FFC0E007FE0380000000FFC0E007FF0700000000FFC1C003FF0700000000FFE1C003FF0F0000
+00007FE3C003FF8E000000007FE38001FF8E000000003FF38001FF9C000000003FF70000FFDC00
+0000003FFF0000FFFC000000001FFF0000FFF8000000001FFE00007FF8000000000FFE00007FF0
+000000000FFC00003FF0000000000FFC00003FF00000000007FC00003FE00000000007F800001F
+E00000000007F800001FE00000000003F800001FC00000000003F000000FC00000000001F00000
+0F800000000001E0000007800000000000E000000700000050317EB055>87
+D<7FFFFF80FFFFF07FFFFF80FFFFF07FFFFF80FFFFF000FFE0000FF80000FFF00003E000007FF0
+0007C000003FF80007C000003FFC000F8000001FFC001F0000000FFE003E00000007FF003E0000
+0007FF807C00000003FF80F800000001FFC1F000000001FFE1F000000000FFE3E0000000007FF7
+C0000000007FFF80000000003FFF80000000001FFF00000000000FFE00000000000FFF00000000
+0007FF000000000003FF800000000003FFC00000000001FFC00000000003FFE00000000007FFF0
+000000000FFFF8000000000FBFF8000000001F1FFC000000003E1FFE000000007C0FFE00000000
+7C07FF00000000F803FF80000001F003FF80000003E001FFC0000003E000FFE0000007C000FFF0
+00000F80007FF000000F00003FF800001F00003FFC00003E00001FFC00007C00000FFE00007C00
+0007FF0001FE000007FF80FFFFF001FFFFFEFFFFF001FFFFFEFFFFF001FFFFFE37317DB03E>I<
+0080002001C00070038000E0070001C00E0003801C0007001C00070038000E0038000E0070001C
+0070001C0070001C00E0003800E0003800EF803BE0FFC03FF0FFE03FF8FFF03FFCFFF03FFCFFF0
+3FFC7FF01FFC7FF01FFC3FE00FF81FC007F00F8003E01E1977B12B>92 D<007FF8000003FFFF00
+0007FFFFC0000FE01FE0001FF007F0001FF003F8001FF003FC001FF001FE000FE001FE0007C001
+FE00010001FE00000001FE00000001FE000001FFFE00003FFFFE0001FFF1FE0007FE01FE000FF0
+01FE001FC001FE003F8001FE007F8001FE00FF0001FE00FF0001FE00FF0001FE00FF0001FE00FF
+0003FE007F8003FE007FC00EFE003FF03CFF000FFFF87FF807FFF03FF800FF800FF825207E9F28
+>97 D<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F800000007F800000007
+F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8000000
+07F800000007F800000007F800000007F80FF00007F87FFE0007F9FFFF8007FFE03FC007FF000F
+E007FE0007F007F80003F807F80003FC07F80003FC07F80001FE07F80001FE07F80001FE07F800
+01FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F8
+0001FE07F80001FE07F80001FE07F80003FC07F80003FC07FC0007F807FE0007F007F7001FE007
+E3E07FC007C1FFFF0007807FFE0007001FE00028327EB12E>I<0007FF00007FFFE000FFFFF003
+FC03F807F007FC0FE007FC1FE007FC3FC007FC3FC003F87FC001F07F8000407F800000FF800000
+FF800000FF800000FF800000FF800000FF800000FF800000FF8000007F8000007FC000007FC000
+003FC0000E3FE0000E1FE0001C0FF0001C07F8007803FF01F000FFFFE0007FFF800007FC001F20
+7D9F25>I<00000007E0000003FFE0000003FFE0000003FFE00000003FE00000001FE00000001F
+E00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000000
+1FE00000001FE00000001FE00000001FE0000FF81FE0007FFF1FE001FFFFDFE003FE03FFE007F8
+00FFE00FE0003FE01FE0001FE03FC0001FE03FC0001FE07F80001FE07F80001FE07F80001FE0FF
+80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0
+7F80001FE07F80001FE07F80001FE03FC0001FE03FC0001FE01FC0003FE00FE0007FE007F001FF
+E003FC07DFF001FFFF9FFF007FFE1FFF000FF01FFF28327DB12E>I<0007FC0000003FFF800000
+FFFFE00003FC07F00007F801F8000FE000FC001FE0007E003FC0007E003FC0003F007FC0003F00
+7F80003F007F80003F80FF80003F80FF80003F80FFFFFFFF80FFFFFFFF80FFFFFFFF80FF800000
+00FF80000000FF800000007F800000007F800000003FC00000003FC00003801FC00003801FE000
+07800FF0000F0007F8001E0003FE00FC0000FFFFF800003FFFE0000003FF000021207E9F26>I<
+0000FF000007FFC0001FFFE0003FC7F0007F0FF800FE0FF801FE0FF801FC0FF803FC07F003FC03
+E003FC01C003FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFFF800FFFF
+F800FFFFF80003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003
+FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000
+03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00007FFFF0007FFFF0
+007FFFF0001D327EB119>I<001FF007E000FFFE3FF001FFFF7FF807F83FF1F80FE00FE1F80FE0
+0FE0F01FC007F0601FC007F0003FC007F8003FC007F8003FC007F8003FC007F8003FC007F8001F
+C007F0001FC007F0000FE00FE0000FE00FE00007F83FC00007FFFF000006FFFE00000E1FF00000
+0E000000001E000000001E000000001F000000001F800000001FFFFFC0000FFFFFF8000FFFFFFE
+0007FFFFFF0003FFFFFF8007FFFFFFC01FFFFFFFE03F00007FE07E00000FF0FC000007F0FC0000
+03F0FC000003F0FC000003F0FC000003F07E000007E03F00000FC01FC0003F800FF801FF0007FF
+FFFE0000FFFFF000001FFF8000252F7E9F29>I<01F800000000FFF800000000FFF800000000FF
+F8000000000FF80000000007F80000000007F80000000007F80000000007F80000000007F80000
+000007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000007
+F80000000007F80000000007F807F8000007F83FFF000007F87FFF800007F8F03FC00007F9C01F
+E00007FB000FE00007FE000FF00007FE000FF00007FC000FF00007FC000FF00007F8000FF00007
+F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F
+F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007
+F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000FFFFC1FFFF80FFFFC1FF
+FF80FFFFC1FFFF8029327DB12E>I<03C0000FF0000FF0001FF8001FF8001FFC001FF8001FF800
+0FF0000FF00003C00000000000000000000000000000000000000000000000000001F800FFF800
+FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
+07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
+07F800FFFF80FFFF80FFFF8011337DB217>I<01F8000000FFF8000000FFF8000000FFF8000000
+0FF800000007F800000007F800000007F800000007F800000007F800000007F800000007F80000
+0007F800000007F800000007F800000007F800000007F800000007F800000007F8007FFC07F800
+7FFC07F8007FFC07F8001FC007F8001F0007F8003E0007F800780007F801F00007F803E00007F8
+07800007F81F000007F83E000007F87C000007F9FE000007FBFF000007FFFF800007FF7FC00007
+FE3FE00007F81FE00007F01FF00007F00FF80007F007FC0007F003FE0007F001FF0007F000FF00
+07F000FF8007F0007FC007F0003FE007F0003FF0FFFF80FFFFFFFF80FFFFFFFF80FFFF28327EB1
+2C>107 D<01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007
+F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007
+F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007
+F80007F80007F80007F80007F80007F80007F80007F80007F80007F800FFFFC0FFFFC0FFFFC012
+327DB117>I<03F007F8000FF000FFF03FFF007FFE00FFF07FFF80FFFF00FFF0F03FC1E07F800F
+F1C01FE3803FC007F3000FE6001FC007F6000FFC001FE007FE000FFC001FE007FC000FF8001FE0
+07FC000FF8001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001F
+E007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF000
+1FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0
+001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000F
+F0001FE0FFFFC1FFFF83FFFFFFFFC1FFFF83FFFFFFFFC1FFFF83FFFF40207D9F45>I<03F007F8
+0000FFF03FFF0000FFF07FFF8000FFF0F03FC0000FF1C01FE00007F3000FE00007F6000FF00007
+FE000FF00007FC000FF00007FC000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F
+F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007
+F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F
+F00007F8000FF00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029207D9F2E>I<
+0007FE0000003FFFC00000FFFFF00003FC03FC0007F000FE000FE0007F001FC0003F803FC0003F
+C03FC0003FC07F80001FE07F80001FE07F80001FE0FF80001FF0FF80001FF0FF80001FF0FF8000
+1FF0FF80001FF0FF80001FF0FF80001FF0FF80001FF07F80001FE07F80001FE07F80001FE03FC0
+003FC03FC0003FC01FE0007F800FE0007F0007F801FE0003FE07FC0001FFFFF800003FFFC00000
+07FE000024207E9F29>I<01F80FF000FFF87FFE00FFF9FFFF80FFFFE07FC00FFF001FE007FE00
+0FF007F80007F807F80007FC07F80003FC07F80003FE07F80003FE07F80001FE07F80001FF07F8
+0001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FE07
+F80003FE07F80003FE07F80003FC07F80007FC07FC0007F807FE000FF007FF001FE007FBE07FC0
+07F9FFFF0007F87FFE0007F81FE00007F800000007F800000007F800000007F800000007F80000
+0007F800000007F800000007F800000007F800000007F800000007F8000000FFFFC00000FFFFC0
+0000FFFFC00000282E7E9F2E>I<03F03F00FFF07FC0FFF1FFE0FFF3C7F00FF38FF807F70FF807
+F60FF807FE0FF807FC07F007FC03E007FC008007F8000007F8000007F8000007F8000007F80000
+07F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800
+0007F8000007F8000007F80000FFFFE000FFFFE000FFFFE0001D207E9F22>114
+D<00FF870007FFEF001FFFFF003F007F003C001F0078000F00F8000700F8000700F8000700FC00
+0700FF000000FFF800007FFFC0003FFFF0003FFFFC000FFFFE0007FFFF0001FFFF80001FFF8000
+00FFC000001FC060000FC0E00007C0E00007C0F00007C0F8000780F8000F80FE000F00FF803E00
+FFFFFC00F3FFF800C07FC0001A207D9F21>I<0038000038000038000038000038000078000078
+0000780000F80000F80001F80003F80007F8001FF800FFFFFEFFFFFEFFFFFE07F80007F80007F8
+0007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F8
+0007F80707F80707F80707F80707F80707F80707F80703F80E03FC0E01FE1C00FFF8007FF0000F
+E0182E7EAD20>I<01F80003F000FFF801FFF000FFF801FFF000FFF801FFF0000FF8001FF00007
+F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F
+F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007
+F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8001F
+F00007F8001FF00003F8003FF00003F8006FF00001FE03CFF80000FFFF8FFF80007FFF0FFF8000
+0FFC0FFF8029207D9F2E>I<FFFF801FFEFFFF801FFEFFFF801FFE07F80003E007F80001C007FC
+0003C003FC00038003FE00078001FE00070001FF000F0000FF000E0000FF801E00007F801C0000
+7FC03C00003FC03800003FE03800001FE07000001FE07000000FF0E000000FF0E000000FF9E000
+0007F9C0000007FFC0000003FF80000003FF80000001FF00000001FF00000000FE00000000FE00
+0000007C000000007C0000000038000027207E9F2C>I<FFFF0FFFF01FFEFFFF0FFFF01FFEFFFF
+0FFFF01FFE0FF0007E0001F00FF8007F0001E007F8007F0001C007F8003F8003C003FC003F8003
+8003FC007FC0038003FE007FC0078001FE00FFC0070001FF00EFE00F0000FF00EFE00E0000FF01
+C7F00E00007F81C7F01C00007F83C7F01C00007FC383F83C00003FC383F83800003FC701FC3800
+001FE701FC7000001FEF01FC7000001FFE00FEF000000FFE00FEE000000FFC007FE0000007FC00
+7FC0000007FC007FC0000007F8003FC0000003F8003F80000003F0001F80000001F0001F000000
+01E0000F00000000E0000E000037207E9F3C>I<FFFF00FFFCFFFF00FFFCFFFF00FFFC07F8001F
+8003FC001E0001FE003C0000FF00780000FF80F000007FC1E000003FC1E000001FE3C000000FF7
+80000007FF00000007FE00000003FE00000001FE00000000FF00000001FF80000001FFC0000003
+FFE00000079FF000000F0FF000001E07F800003C03FC00007801FE0000F001FF0001E000FF8001
+E0007FC007E0003FC0FFF801FFFEFFF801FFFEFFF801FFFE27207E9F2C>I<3FFFFFFC3FFFFFFC
+3FFFFFFC3FC00FF83E001FF03C003FF038003FE078007FC07800FF807001FF807001FF007003FE
+007007FC00000FF800000FF800001FF000003FE000007FC00E007FC00E00FF800E01FF000E03FE
+000E07FE001E07FC001E0FF8001C1FF0003C3FF0007C3FE000FC7FC007FCFFFFFFFCFFFFFFFCFF
+FFFFFC1F207E9F25>122 D<FFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFF80FFFFFFFFFF
+FFFFFFFFFF805103809452>124 D<1C00387F00FEFF81FFFF81FFFFC3FFFFC3FFFF81FFFF81FF
+7F00FE1C0038180A78B229>127 D E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+TeXDict begin @a4
+%%EndSetup
+%%Page: 0 1
+bop 164 315 a Fr(Inhaltsv)n(erzeic)n(hnis)164 436 y Fq(1)45
+b(T)-5 b(erminologie)1198 b(2)164 555 y(2)45 b(SiSiSi)1377
+b(2)164 675 y(3)45 b(Kurzb)r(esc)n(hreibung)18 b(des)g(T)-5
+b(renn)n(v)n(erfahrens)562 b(3)164 795 y(4)45 b(Mehrdeutigk)n(eiten)1082
+b(4)164 914 y(5)45 b(Un)n(b)r(ek)m(ann)n(te)18 b(W)606 917
+y(\177)606 914 y(orter)1027 b(6)164 1034 y(6)237 1045 y(I)258
+1034 y(S)289 1023 y(I)310 1034 y(T)340 1045 y(E)369 1034 y(X)19
+b(in)n(tern:)24 b(Die)18 b(neuen)g(Files)757 b(8)164 1154 y(7)45
+b(Wie)16 b(erzeugt)f(man)h(ein)g(druc)n(kfertiges)f(Man)n(uskript)i(mit)1495
+1165 y(I)1516 1154 y(S)1547 1143 y(I)1568 1154 y(T)1598 1165
+y(E)1627 1154 y(X?)60 b(9)164 1274 y(8)237 1301 y(")264 1274
+y(xxx)l(\\)21 b(ist)d(ein)g(mehrdeutiges)e(W)-5 b(ort!)25 b(|)19
+b(w)n(as)h(tun?)352 b(10)164 1393 y(9)237 1421 y(")264 1393
+y(xxx)l(\\)21 b(ist)d(ein)g(un)n(b)r(ek)m(ann)n(tes)h(W)-5
+b(ort!)25 b(|)18 b(w)n(as)i(tun?)377 b(12)164 1513 y(10)244
+1503 y(\177)237 1513 y(Anderung)19 b(der)f(W)-5 b(orttab)r(elle)838
+b(13)p eop
+%%Page: 1 2
+bop 838 527 a Fp(I)869 509 y(S)917 490 y(I)948 509 y(T)996
+527 y(E)1044 509 y(X)333 612 y(In)n(teraktiv)n(e)31 b(Silb)r(en)n(trenn)n
+(ung)f(f)1395 616 y(\177)1393 612 y(ur)f(die)265 716 y(deutsc)n(he)g(Sprac)n
+(he)f(un)n(ter)h(T)1216 735 y(E)1263 716 y(X)g(3.14)f(und)635
+820 y(3.141)h(un)n(ter)f(UNIX)1313 789 y Fo(y)420 978 y Fn(W.)20
+b(Barth)150 b(H.)20 b(Steiner)148 b(H.)20 b(Herb)r(ec)n(k)762
+1105 y(23.)f(August)h(1993)766 1289 y Fm(Zusammenfassung)354
+1380 y Fl(Das)15 b(sp)q(eziell)j(f)618 1382 y(\177)617 1380
+y(ur)d(deutsc)o(hsprac)o(hige)h(T)l(exte)f(en)o(t)o(wic)o(k)o(elte)h
+Fk(SiSiSi)871 1474 y(SICHERE)711 1530 y(SINNENTSPRECHEN)o(DE)756
+1587 y(SILBENTRENNUNG)286 1680 y Fl(k)m(ann)23 b(jetzt)f(in)i(T)601
+1690 y(E)626 1680 y(X)f(und)g(L)793 1674 y Fj(a)814 1680 y
+Fl(T)839 1694 y(E)865 1680 y(X)f(b)q(en)o(utzt)h(w)o(erden.)43
+b(Es)22 b(gibt)h(f)1478 1682 y(\177)1477 1680 y(ur)f(UNIX)286
+1737 y(c)o(hange{\014les)14 b(und)h(alle)g(anderen)f(not)o(w)o(endigen)g
+(Files)h(auf)f(dem)g(anon)o(ymous{)286 1793 y(FTP{serv)o(er)19
+b Fi(eiunix.tuwien.ac.at)p Fl(.)32 b(Dort)19 b(\014ndet)i(man)f(auc)o(h)h
+(eine)g(In-)286 1850 y(stallationsanleitung,)16 b(mit)f(der)g(man)g(das)g
+(System)f(leic)o(h)o(t)i(installieren)i(k)m(ann.)286 1906 y(Dadurc)o(h)f
+(wird)i(ein)f(neues)h(System)e(erzeugt,)h(das)g(das)f(neue)i(V)l(erfahren)f
+(f)1619 1908 y(\177)1618 1906 y(ur)286 1963 y(die)e(Silb)q(en)o(trenn)o(ung)h
+(v)o(erw)o(endet.)i(Alle)e(anderen)e(T)1197 1972 y(E)1223 1963
+y(X{F)l(unktionen)g(bleib)q(en)286 2019 y(un)o(v)o(er)396 2021
+y(\177)396 2019 y(andert.)354 2076 y(Es)i(gibt)h(zw)o(ei)f(V)l(arian)o(ten:)
+25 b(Das)16 b(einfac)o(he)j(S)1142 2066 y(I)1158 2076 y(T)1183
+2085 y(E)1209 2076 y(X)e(und)h(das)f(in)o(teraktiv)o(e,)286
+2132 y(v)o(oll)d(ausgebaute)604 2142 y(I)621 2132 y(S)646 2122
+y(I)662 2132 y(T)687 2142 y(E)713 2132 y(X.)f(Das)h(einfac)o(he)h(S)1061
+2122 y(I)1077 2132 y(T)1102 2142 y(E)1128 2132 y(X)f(k)m(ann)g(nac)o(h)g(der)
+h(Installati-)286 2188 y(on)d(genauso)h(wie)g(das)f(urspr)777
+2190 y(\177)776 2188 y(unglic)o(he)j(T)977 2198 y(E)1002 2188
+y(X)e(v)o(erw)o(endet)f(w)o(erden.)19 b(Es)13 b(hat)f(ab)q(er)286
+2245 y(den)19 b(V)l(orteil,)i(da\031)d(es)h(auc)o(h)g(b)q(ei)h(unerw)o
+(arteten)f(W)l(ortzusammensetzungen)286 2301 y(k)o(eine)f(falsc)o(hen)g(T)l
+(rennstellen)h(erzeugt.)25 b(W)l(elc)o(he)18 b(zus)1241 2303
+y(\177)1241 2301 y(atzlic)o(hen)h(M)1476 2303 y(\177)1476 2301
+y(o)o(glic)o(hk)o(ei-)286 2358 y(ten)364 2368 y(I)381 2358
+y(S)406 2348 y(I)422 2358 y(T)447 2368 y(E)473 2358 y(X)c(bietet,)g(ist)h(in)
+g(diesem)g(Beric)o(h)o(t)g(b)q(esc)o(hrieb)q(en.)p 164 2402
+648 2 v 221 2433 a Fh(y)239 2448 y Fg(UNIX)e(ist)g(Mark)o(enzeic)o(hen)h(v)o
+(on)f(A)m(T&T)961 2599 y Ff(1)p eop
+%%Page: 2 3
+bop 164 315 a Fr(1)83 b(T)-7 b(erminologie)164 436 y Ff(T)191
+446 y(E)218 436 y(X)24 b(ist)16 b(Donald)h(E.)f(Kn)o(uths)g(F)l
+(ormatierungsprogramm)e(f)1311 438 y(\177)1310 436 y(ur)j(T)l(exte)e([1],)g
+([2].)164 537 y(L)176 531 y Fe(a)200 537 y Ff(T)227 552 y(E)254
+537 y(X)24 b(ist)17 b(das)g(v)o(on)g(Leslie)e(Lamp)q(ort)i(en)o(t)o(wic)o(k)o
+(elte)c(Makro{P)o(ak)o(et)k(zu)f(T)1547 548 y(E)1575 537 y(X,)f(das)j(im)286
+598 y(deutsc)o(hsprac)o(higen)f(Raum)h(meist)e(v)o(erw)o(endet)h(wird)h([3],)
+g([4].)26 b(Ab)18 b(sofort)h(gilt)286 658 y(T)313 669 y(E)340
+658 y(X)14 b(synon)o(ym)g(f)611 660 y(\177)610 658 y(ur)g(T)697
+669 y(E)725 658 y(X)g(und)h(L)884 652 y Fe(a)908 658 y Ff(T)935
+673 y(E)962 658 y(X,)f(und)h(die)f(im)f(folgenden)i(b)q(esc)o(hrieb)q(enen)
+286 718 y(Erw)o(eiterungen)f(S)636 707 y(I)653 718 y(T)680
+729 y(E)708 718 y(X)g(und)854 729 y(I)872 718 y(S)899 707 y(I)917
+718 y(T)944 729 y(E)971 718 y(X)g(k)1048 720 y(\177)1048 718
+y(onnen)h(so)o(w)o(ohl)f(auf)h(T)1453 729 y(E)1480 718 y(X)f(als)h(auc)o(h)g
+(auf)286 778 y(L)298 772 y Fe(a)322 778 y Ff(T)349 793 y(E)376
+778 y(X)h(angew)o(endet)g(w)o(erden.)164 880 y(S)191 869 y(I)209
+880 y(T)236 891 y(E)263 880 y(X)24 b(ist)14 b(eine)f(V)l(arian)o(te)g(v)o(on)
+h(T)799 891 y(E)827 880 y(X)f(f)893 882 y(\177)892 880 y(ur)i(deutsc)o
+(hsprac)o(hige)e(T)l(exte,)g(die)h(durc)o(h)g(Aus-)286 940
+y(tausc)o(h)25 b(der)540 970 y(")563 940 y(h)o(yphenation)m(\\)j(durc)o(h)c
+(das)h(v)o(on)g(W.)f(Barth)h(und)g(H.)f(Nirsc)o(hl)286 1000
+y(en)o(t)o(wic)o(k)o(elte)9 b(V)l(erfahren)i(zur)833 1030 y(")855
+1000 y(sic)o(heren)g(sinnen)o(tsprec)o(henden)g(Silb)q(en)o(trenn)o(ung)286
+1060 y(\()p Fd(SiSiSi)5 b Ff(\))m(\\)20 b(f)512 1062 y(\177)511
+1060 y(ur)d(die)e(deutsc)o(he)h(Sprac)o(he)g([5],)f([6])h(en)o(tstanden)g
+(ist.)164 1173 y(I)182 1162 y(S)209 1151 y(I)226 1162 y(T)253
+1173 y(E)280 1162 y(X)24 b(ist)11 b(eine)g(um)f(einige)g(zus)780
+1164 y(\177)780 1162 y(atzlic)o(he)g(M)998 1164 y(\177)998
+1162 y(oglic)o(hk)o(eiten,)f(insb)q(esondere)i(in)o(teraktiv)o(e)286
+1222 y(Komp)q(onen)o(ten,)k(erw)o(eiterte)f(F)l(orm)h(v)o(on)h(S)1087
+1212 y(I)1105 1222 y(T)1132 1233 y(E)1159 1222 y(X.)164 1399
+y Fr(2)83 b(SiSiSi)164 1520 y Ff(In)11 b(der)g(deutsc)o(hen)g(Sprac)o(he)g(v)
+o(erw)o(endet)f(man)h(gern)h(lange,)g(zusammengesetzte)c(W)1723
+1522 y(\177)1723 1520 y(o)q(r-)164 1580 y(ter,)15 b(wie)h(z.B.:)286
+1692 y(T)l(ext=v)o(erarb)q(eitungs=system)e(o)q(der)j(Silb)q(en=trenn)o
+(ungs=v)o(erfahren.)164 1805 y(W)l(enn)23 b(solc)o(he)f(riesigen)g(Gebilde)g
+(nic)o(h)o(t)g(am)g(Ende)h(einer)f(Zeile)f(abgeteilt)i(w)o(erden)164
+1865 y(k)190 1867 y(\177)190 1865 y(onnen,)e(en)o(tsteh)o(t)f(meist)f(ein)h
+(sehr)g(unsc)o(h)990 1867 y(\177)990 1865 y(o)q(nes)g(Sc)o(hriftbild.)33
+b(Das)21 b(Hauptproblem)164 1925 y(b)q(ei)14 b(der)g(Silb)q(en)o(trenn)o(ung)
+g(ist)g(das)i(Finden)e(der)g(Nah)o(tstellen)f(\(durc)o(h)1467
+1955 y(")1489 1925 y(=)m(\\)18 b(angezeigt\))164 1985 y(zwisc)o(hen)j(den)i
+(Einzelw)638 1987 y(\177)638 1985 y(o)o(rtern.)40 b(Die)22
+b(T)l(rennstellen)g(innerhalb)g(der)g(Einzelw)1681 1987 y(\177)1681
+1985 y(o)o(rter)164 2046 y(lassen)f(sic)o(h)e(relativ)g(leic)o(h)o(t)f(mit)h
+(den)h(im)f(Duden)h([9])g(angegeb)q(enen)h(Regeln)f(ermit-)164
+2106 y(teln.)38 b Fd(SiSiSi)28 b Ff(\014ndet)22 b(die)f(Zerlegung)h(der)g(W)
+1051 2108 y(\177)1051 2106 y(orter)g(mit)e(Hilfe)h(einer)g(W)l(orttab)q
+(elle,)164 2166 y(genauer)h(einer)e(T)l(ab)q(elle)g(aller)h(W)l(ortb)q
+(estandteile:)31 b(V)l(orsilb)q(en,)21 b(St)1455 2168 y(\177)1455
+2166 y(a)q(mme)d(und)j(En-)164 2226 y(dungen.)i(W)l(eniger)16
+b(als)h(8000)h(Ein)o(tragungen)f(reic)o(hen)e(aus,)i(um)f(fast)h(alle)f
+(deutsc)o(hen)164 2286 y(W)214 2288 y(\177)214 2286 y(orter)k(und)g(die)f(g)
+544 2288 y(\177)544 2286 y(a)q(ngigen)h(F)l(remdw)900 2288
+y(\177)900 2286 y(o)n(rter)g(zu)f(erfassen.)32 b(Durc)o(h)20
+b(die)f(Abst)1638 2288 y(\177)1637 2286 y(utzung)164 2346 y(des)h(V)l
+(erfahrens)f(auf)i(eine)d(W)l(orttab)q(elle)i(ist)g(es)f(nat)1162
+2348 y(\177)1161 2346 y(u)q(rlic)o(h)f(m)1344 2348 y(\177)1344
+2346 y(o)o(glic)o(h,)i(auc)o(h)f(mit)f(un-)164 2407 y(v)o(orherseh)o(baren,)j
+(ungew)656 2409 y(\177)656 2407 y(o)q(hnlic)o(hen)f(W)l(ortunget)1108
+2409 y(\177)1107 2407 y(u)q(men)g(fertig)g(zu)h(w)o(erden.)36
+b(Dieses)164 2467 y(Zerspalten)18 b(zusammengesetzter)d(W)883
+2469 y(\177)883 2467 y(o)q(rter)j(mit)f(einer)h(einfac)o(hen,)1451
+2469 y(\177)1449 2467 y(ub)q(ersc)o(haubaren)961 2599 y(2)p
+eop
+%%Page: 3 4
+bop 164 307 a Ff(Metho)q(de)12 b(bringt)h(w)o(esen)o(tlic)o(he)d(V)l(orteile)
+g(gegen)1053 309 y(\177)1052 307 y(u)q(b)q(er)i(dem)f(aus)i(dem)e(Amerik)m
+(anisc)o(hen)165 369 y(\177)164 367 y(ub)q(ernommenen)j(pattern{V)l
+(erfahren.)237 437 y Fd(SiSiSi)j Ff(suc)o(h)o(t)11 b(nac)o(h)g(allen)f(m)766
+439 y(\177)766 437 y(o)o(glic)o(hen)g(Zerlegungen)h(eines)f(W)l(ortes.)20
+b(Bei)10 b(manc)o(hen)164 497 y(gibt)16 b(es)g(mehr)f(als)h(eine,)f(wie)h
+(z.B.:)286 602 y(Bau=mast/Baum=ast)f(o)q(der)i(Stau=b)q(ec)o(k)o(en/Staub=ec)
+o(k)o(en.)164 707 y(Wir)12 b(b)q(ezeic)o(hnen)g(das)h(als)g
+Fq(Mehrdeutigk)n(eit)p Ff(.)18 b(St)1113 709 y(\177)1113 707
+y(o)q(\031t)13 b Fd(SiSiSi)19 b Ff(auf)13 b(eine)f(solc)o(he)g(Mehr-)164
+767 y(deutigk)o(eit,)18 b(so)j(n)o(utzt)e(die)g(einfac)o(here)f(Implem)o(en)n
+(tierung)f(S)1325 756 y(I)1343 767 y(T)1370 778 y(E)1397 767
+y(X)i(die)g(zw)o(eifelhafte)164 827 y(T)l(rennstelle)d(nic)o(h)o(t)g(aus.)25
+b(Dadurc)o(h)17 b(wird)g(sic)o(hergestellt,)e(da\031)k(k)o(eine)c(falsc)o
+(hen)i(T)l(ren-)164 887 y(n)o(ungen)c(en)o(tstehen.)20 b(Das)14
+b(in)o(teraktiv)o(e)902 898 y(I)919 887 y(S)946 877 y(I)964
+887 y(T)991 898 y(E)1018 887 y(X)f(h)1095 889 y(\177)1095 887
+y(alt)g(w)1200 889 y(\177)1200 887 y(a)q(hrend)g(der)g(Bearb)q(eitung)g(des)
+164 948 y(Dokumen)o(ts)d(b)q(ei)i(jedem)e(solc)o(hen)h(mehrdeutigen)f(W)l
+(ort)i(an,)g(zeigt)f(dem)g(Ben)o(utzer)f(alle)164 1008 y(m)206
+1010 y(\177)206 1008 y(o)o(glic)o(hen)15 b(Zerlegungen)h(und)g(erlaubt)g
+(ihm,)e(die)i(passende)h(auszu)o(w)1479 1010 y(\177)1479 1008
+y(ahlen.)237 1077 y(F)l(alls)22 b Fd(SiSiSi)28 b Ff(f)528 1079
+y(\177)527 1077 y(ur)22 b(ein)f(W)l(ort)i(k)o(eine)d(Zerlegung)i(\014ndet,)h
+(dann)g(handelt)f(es)g(sic)o(h)164 1138 y(dab)q(ei)14 b(en)o(t)o(w)o(eder)e
+(um)h(ein)g(sehr)h(ausgefallenes)g(W)l(ort)g(\(z.B.)e(Eigennamen)h(o)q(der)
+1661 1140 y(\177)1661 1138 y(ahnli-)164 1198 y(c)o(hes\),)h(das)h(nic)o(h)o
+(t)e(in)i(der)f(W)l(orttab)q(elle)g(en)o(thalten)g(ist,)g(o)q(der)h(das)h(W)l
+(ort)f(wurde)f(falsc)o(h)164 1258 y(gesc)o(hrieb)q(en.)21 b(Wir)16
+b(sprec)o(hen)f(v)o(on)i(einem)d Fq(un)n(b)r(ek)m(ann)n(ten)k(W)-5
+b(ort)p Ff(.)22 b(Auc)o(h)16 b(in)g(diesen)164 1318 y(F)196
+1320 y(\177)196 1318 y(allen)21 b(wird)h(durc)o(h)g(S)605 1308
+y(I)622 1318 y(T)649 1329 y(E)676 1318 y(X)g(nic)o(h)o(t)f(getrenn)o(t,)h
+(die)f(Silb)q(en)o(trenn)o(ung)h(bleibt)e(sic)o(her.)164 1389
+y(I)182 1378 y(S)209 1368 y(I)226 1378 y(T)253 1389 y(E)280
+1378 y(X)i(erlaubt)g(ab)q(er)g(dem)e(Ben)o(utzer,)h(je)h(nac)o(hdem)e(w)o
+(elc)o(her)g(F)l(all)h(v)o(orliegt,)h(das)164 1439 y(un)o(b)q(ek)m(ann)o(te)
+16 b(W)l(ort)h(zu)f(k)o(orrigieren)f(o)q(der)h(in)g(die)g(W)l(orttab)q(elle)g
+(einzutragen.)237 1508 y Fd(SiSiSi)h Ff(un)o(terst)532 1510
+y(\177)531 1508 y(utzt)10 b(eine)g(sinnen)o(tsprec)o(hende)f(T)l(renn)o(ung,)
+j(indem)d(es)i(die)f Fq(Haupt-)164 1569 y(trennstellen)j Ff(an)j(den)f(Nah)o
+(tstellen)e(zusammengesetzter)f(W)1358 1571 y(\177)1358 1569
+y(o)q(rter)i(gegen)1596 1571 y(\177)1595 1569 y(u)q(b)q(er)h(den)164
+1629 y(Neb)q(en)o(trennstellen)f(in)i(den)g(Einzelw)880 1631
+y(\177)880 1629 y(o)o(rtern)g(b)q(ev)o(orzugt.)237 1699 y(Diese)23
+b(Bev)o(orzugung)g(wird)g(durc)o(h)f(Strafpunkte)h(\(p)q(enalties\))g
+(gesteuert.)42 b(De-)164 1759 y(faultm)305 1761 y(\177)305
+1759 y(a)o(\031ig)13 b(erhalten)g(die)g(Neb)q(en)o(trennstellen)d(einen)j(h)
+1214 1761 y(\177)1214 1759 y(oheren)g(W)l(ert)g(als)g(die)g(Haupt-)164
+1819 y(trennstellen.)19 b(Diese)13 b(Relation)h(k)m(ann)g(ab)q(er)h(v)o(on)f
+(einem)d(erfahrenen)j(Ben)o(utzer)e(durc)o(h)164 1879 y(den)g(neuen)f(T)415
+1890 y(E)442 1879 y(X{Befehl)f Fc(\\nebenhyphenpenalty)15 b
+Ff(f)1173 1881 y(\177)1172 1879 y(ur)c(seine)g(Installation)h(ge)1645
+1881 y(\177)1645 1879 y(andert)164 1939 y(w)o(erden.)21 b(Ab)q(er)16
+b(das)g(wird)h(f)686 1941 y(\177)685 1939 y(ur)f(normales)f(Arb)q(eiten)g(k)m
+(aum)h(not)o(w)o(endig)g(sein.)164 2114 y Fr(3)83 b(Kurzb)r(esc)n(hreibung)24
+b(des)j(T)-7 b(renn)n(v)n(erfahrens)164 2233 y Ff(Jedes)21
+b(W)l(ort)h(ist)g(eine)e(F)l(olge)i(v)o(on)f(einem)e(o)q(der)j(mehreren)e
+(Einzelw)1488 2235 y(\177)1488 2233 y(o)o(rtern.)37 b(Jedes)164
+2293 y(Einzelw)o(ort)15 b(b)q(esteh)o(t)g(aus)i(b)q(eliebig)e(vielen)f(V)l
+(orsilb)q(en)i(\(ev)o(en)o(tuell)d(auc)o(h)j(k)o(einen\),)e(ge-)164
+2354 y(folgt)j(v)o(on)f(genau)h(einem)d(Stamm,)g(abgesc)o(hlossen)i(durc)o(h)
+g(b)q(eliebig)g(viele)e(Endungen)164 2414 y(\(ersatzw)o(eise)19
+b(F)l(ugenzeic)o(hen\).)33 b(Eine)20 b(W)l(orttab)q(elle)g(en)o(th)1268
+2416 y(\177)1268 2414 y(alt)g(alle)f(diese)h(erw)1638 2416
+y(\177)1638 2414 y(ahn)o(ten)164 2474 y(W)l(ortb)q(estandteile)c
+(\(Morpheme\).)961 2599 y(3)p eop
+%%Page: 4 5
+bop 237 307 a Ff(Der)13 b(Algorithm)o(us)f(suc)o(h)o(t)h(f)746
+309 y(\177)745 307 y(ur)g(jedes)g(W)l(ort,)h(das)g(ev)o(en)o(tuell)d(getrenn)
+o(t)i(w)o(erden)g(soll,)164 367 y(systematisc)o(h)i(nac)o(h)i(allen)f
+(Zerlegungen,)g(die)g(nac)o(h)h(der)g(angegeb)q(enen)g(Grammatik)164
+428 y(m)206 430 y(\177)206 428 y(o)o(glic)o(h)12 b(sind.)20
+b(Dab)q(ei)13 b(erk)o(enn)o(t)e(er)h(durc)o(h)g(Nac)o(hsc)o(hauen)g(in)g(der)
+h(W)l(orttab)q(elle,)f(ob)i(ein)164 488 y(b)q(etrac)o(h)o(tetes)f(T)l(eilst)
+557 490 y(\177)556 488 y(u)o(c)o(k)g(des)h(W)l(ortes)g(ein)f(W)l(ortb)q
+(estandteil)h(im)e(erw)1464 490 y(\177)1464 488 y(ahn)o(ten)h(Sinn)h(ist)164
+548 y(und)j(gegeb)q(enenfalls)f(v)o(on)g(w)o(elc)o(her)e(Art)i(es)g(ist.)237
+619 y(Auf)21 b(diese)f(W)l(eise)g(\014ndet)h(der)g(Algorithm)o(us)e(f)1136
+621 y(\177)1135 619 y(ur)i(jede)g(Zerlegung)f(alle)h(Haupt-)164
+679 y(trennstellen,)16 b(n)472 681 y(\177)472 679 y(amlic)o(h)f(zwisc)o(hen)h
+(der)h(letzten)f(Endung)i(eines)f(T)l(eilw)o(ortes)f(und)i(der)164
+739 y(folgenden)f(V)l(orsilb)q(e,)f(bzw.)h(dem)e(folgenden)i(Stamm.)22
+b(Au\031erdem)15 b(erk)o(enn)o(t)g(er)i(auc)o(h)164 799 y(sofort)h(alle)f
+(Neb)q(en)o(trennstellen)e(hin)o(ter)h(den)i(V)l(orsilb)q(en.)24
+b(F)1302 801 y(\177)1301 799 y(ur)17 b(den)h(Rest)f(jedes)g(Ein-)164
+860 y(zelw)o(orts,)d(b)q(estehend)h(aus)g(Stamm)e(und)i(Endungen,)g(m)o
+(u\031)f(man)g(die)g(Duden{Regeln)164 920 y(f)180 922 y(\177)179
+920 y(ur)g(die)f(Silb)q(en)o(trenn)o(ung)h(an)o(w)o(enden.)20
+b(Das)15 b(sind)f(solc)o(he)f(Regeln)g(wie)1473 950 y(")1495
+920 y(In)h(einer)f(F)l(olge)164 980 y(v)o(on)18 b(Konsonan)o(ten)h(ist)e(v)o
+(or)h(dem)e(letzten)h(zu)g(trennen)m(\\)s(,)h(z.B.)e(tre-ten,)i(F)1573
+982 y(\177)1572 980 y(ul-lungen,)164 1040 y(k)190 1042 y(\177)190
+1040 y(amp-fen.)23 b(Diese)17 b(Regeln)g(sind)g(mit)e(all)i(ihren)g
+(Ausnahmen,)f(z.B.)g(Sonderb)q(ehand-)164 1100 y(lung)j(v)o(on)f(st)g(und)h
+(c)o(k,)f(v)o(ollst)719 1102 y(\177)719 1100 y(a)o(ndig)h(in)f
+Fd(SiSiSi)24 b Ff(eingearb)q(eitet.)j(Eb)q(enso)19 b(wird)g(sc)o(hon)164
+1161 y(b)q(ei)d(der)g(Zerlegung)g(in)g(Einzelw)777 1163 y(\177)777
+1161 y(o)o(rter)g(die)f(3{Konsonan)o(ten{Regel)j(b)q(er)1528
+1163 y(\177)1527 1161 y(uc)o(ksic)o(h)o(tigt.)237 1231 y(Es)c(gibt)g(W)451
+1233 y(\177)451 1231 y(o)q(rter,)f(F)l(remdw)755 1233 y(\177)755
+1231 y(o)o(rter,)g(die)h(nic)o(h)o(t)e(nac)o(h)i(den)g(Duden{Regeln)f
+(getrenn)o(t)164 1292 y(w)o(erden,)g(z.B.)f(Pro-gramm)g(o)q(der)i(P)o
+(an-orama.)20 b(In)13 b(diesen)g(F)1301 1294 y(\177)1301 1292
+y(allen)g(ist)g(in)g(der)g(W)l(ortta-)164 1352 y(b)q(elle)j(der)g(Stamm)e
+(als)606 1382 y(")629 1352 y(Ausnahme)m(\\)19 b(deklariert)c(und)i(die)f(m)
+1334 1354 y(\177)1334 1352 y(o)o(glic)o(hen)f(T)l(rennstellen)164
+1412 y(sind)j(angegeb)q(en.)29 b(Der)18 b(Algorithm)o(us)f(b)q(er)980
+1414 y(\177)979 1412 y(uc)o(ksic)o(h)o(tigt)f(nat)1296 1414
+y(\177)1295 1412 y(u)q(rlic)o(h)h(solc)o(he)h(Angab)q(en.)164
+1472 y(Eine)e(ausf)362 1474 y(\177)361 1472 y(uhrlic)o(he)f(Besc)o(hreibung)g
+(des)h(V)l(erfahrens)g(\014ndet)g(sic)o(h)g(in)g([5].)164 1649
+y Fr(4)83 b(Mehrdeutigk)n(eiten)164 1770 y Ff(Nun)16 b(gibt)g(es)g(im)e
+(Deutsc)o(hen)i(das)g(Problem,)f(da\031)i(viele,)c(meist)i(zusammengesetzte)o
+(,)164 1830 y(W)214 1832 y(\177)214 1830 y(orter)g(existieren,)e(die)i(v)o
+(ersc)o(hieden)e(in)o(terpretiert)g(und)j(daher)f(auc)o(h)g(auf)h(v)o(ersc)o
+(hie-)164 1890 y(dene)11 b(Arten)f(getrenn)o(t)h(w)o(erden)f(k)783
+1892 y(\177)783 1890 y(o)q(nnen.)19 b(Das)12 b(ergibt)f(dann,)h(sofern)g(der)
+f(Algorithm)o(us)164 1950 y(eine)18 b(unpassende)j(T)l(rennstelle)d(w)818
+1952 y(\177)818 1950 y(ahlt,)i(sinnen)o(tstellende)d(Abtrenn)o(ungen,)i(die)g
+(das)164 2010 y(\015)192 2012 y(\177)191 2010 y(ussige)e(Lesen)f(ersc)o(h)o
+(w)o(eren.)j(Einige)d(Beispiele:)286 2123 y(W)l(ac)o(hs=tub)q(e/W)l(ac)o
+(h=stub)q(e)286 2204 y(Bau=mast/Baum=ast)286 2285 y(P)o(ersonal=mangel/P)o
+(erson=alm=angel)286 2366 y(Spiel=ende/spie-lende)961 2599
+y(4)p eop
+%%Page: 5 6
+bop 164 307 a Ff(Alle)20 b(anderen)i(T)l(renn)o(v)o(erfahren,)g(die)g(die)f
+(Einzelb)q(estandteile)f(v)o(on)i(zusammenge-)164 367 y(setzten)16
+b(W)380 369 y(\177)380 367 y(o)q(rtern)h(\(die)626 397 y(")649
+367 y(Morpheme)m(\\)s(\))f(nic)o(h)o(t)g(erk)o(ennen)f(\(also)j(auc)o(h)f
+(die)1579 397 y(")1601 367 y(pattern{)164 428 y(Metho)q(de)m(\\)s(\),)d
+(\014nden)g(diese)f(Mehrdeutigk)o(eiten)e(nic)o(h)o(t.)19 b
+Fd(SiSiSi)h Ff(\(in)13 b(S)1455 417 y(I)1473 428 y(T)1500 438
+y(E)1527 428 y(X\))g(hingegen)164 488 y(n)o(utzt)h(solc)o(he)g(unsic)o(heren)
+g(T)l(rennstellen)g(generell)f(nic)o(h)o(t)h(aus.)21 b(Im)13
+b(Beispiel)1604 518 y(")1626 488 y(Bettru-)164 548 y(he)m(\\)20
+b(wird)c(die)g(angegeb)q(ene)h(Haupttrennstelle)e(ignoriert.)22
+b(Nur)16 b(die)g(sic)o(here)f(Neb)q(en-)164 608 y(trennstelle)406
+638 y(")428 608 y(Bettru-he)m(\\)22 b(k)o(omm)o(t)16 b(in)j(F)l(rage.)30
+b(Hat)19 b(man)f(ab)q(er)i(n)o(ur)f(w)o(enige)f(sic)o(here)164
+668 y(T)l(rennstellen)d(in)g(langen,)h(zusammengesetzten)d(W)1150
+670 y(\177)1150 668 y(ortern,)i(so)i(k)1395 670 y(\177)1395
+668 y(onnen)f(in)g(manc)o(hen)164 729 y(Zeilen)11 b(\(b)q(ei)h(Randausgleic)o
+(h\))g(gro\031e)h(L)893 730 y(\177)892 729 y(u)q(c)o(k)o(en)e(bzw.)1136
+758 y(")1158 729 y(Stauc)o(h)o(ungen)m(\\)16 b(en)o(tstehen.)j(Das)164
+789 y(Sc)o(hriftbild)10 b(wird)h(unsc)o(h)625 791 y(\177)625
+789 y(on,)h(h)729 791 y(\177)729 789 y(a)q(u\014g)g(tritt)f(die)g(T)1046
+799 y(E)1073 789 y(X{W)l(arn)o(ung)1339 818 y(")1362 789 y(underfull)f(h)o(b)
+q(o)o(x)m(\\)15 b(auf.)237 857 y(Dieses)g(Problem)f(wird)h(in)746
+868 y(I)763 857 y(S)790 846 y(I)808 857 y(T)835 868 y(E)862
+857 y(X)g(durc)o(h)g(in)o(teraktiv)o(es)e(Eingreifen)h(in)h(den)g(Pro-)164
+917 y(duktionsv)o(organg)h(gel)590 919 y(\177)590 917 y(ost.)21
+b(T)l(ri\013t)813 928 y(I)831 917 y(S)858 906 y(I)875 917 y(T)902
+928 y(E)930 917 y(X)14 b(auf)h(ein)g(mehrdeutiges)e(W)l(ort,)i(so)h(w)o
+(erden)164 977 y(dem)j(Ben)o(utzer)h(alle)g(m)622 979 y(\177)622
+977 y(o)o(glic)o(hen)g(Zerlegungen)h(am)f(Bildsc)o(hirm)d(angezeigt,)22
+b(so)q(da\031)164 1038 y(er)17 b(die)g(in)h(seinem)d(Kon)o(text)i(sinngem)888
+1039 y(\177)888 1038 y(a)o(\031e)h(ausw)1080 1039 y(\177)1080
+1038 y(a)q(hlen)g(k)m(ann.)26 b(Diese)17 b(W)l(ahl)g(m)o(u\031)g(f)1738
+1039 y(\177)1737 1038 y(ur)164 1098 y(ein)c(solc)o(hes)g(mehrdeutiges)e(W)l
+(ort)j(n)o(ur)g(einmal)d(getro\013en)j(w)o(erden,)f(d.h.)g(b)q(ei)g(w)o
+(eiteren)164 1158 y(V)l(ork)o(ommen)c(desselb)q(en)j(W)l(ortes)g(in)g
+(demselb)q(en)e(Dokumen)o(t)h(soll)g(dann)i(immer)c(auto-)164
+1218 y(matisc)o(h)15 b(diese)h(ric)o(h)o(tige)f(T)l(renn)o(ung)i(gew)940
+1220 y(\177)940 1218 y(a)q(hlt)f(w)o(erden.)22 b(Dieser)16
+b(F)l(orderung)i(liegt)e(die)164 1278 y(Erfahrung)h(zugrunde,)f(da\031)h(ein)
+f(mehrdeutiges)e(W)l(ort)j(praktisc)o(h)e(nie)h(in)g(demselb)q(en)164
+1338 y(Dokumen)o(t)j(in)h(v)o(ersc)o(hiedenen)e(Bedeutungen)i(v)o(ork)o(omm)n
+(t.)31 b(Au\031erdem)18 b(sind)j(viele)164 1399 y(der)c(v)o(on)g
+Fd(SiSiSi)491 1428 y Ff(")514 1399 y(erk)m(ann)o(ten)m(\\)j(Mehrdeutigk)o
+(eiten)15 b(im)1227 1401 y(\177)1225 1399 y(ublic)o(hen)h(W)l(ortsc)o(hatz)h
+(nic)o(h)o(t)164 1459 y(gebr)256 1461 y(\177)256 1459 y(auc)o(hlic)o(h)e
+(\(siehe)i(das)g(Beispiel:)k(P)o(erson=alm=angel\).)h(W)l(eiters)16
+b(w)o(erden)g(auc)o(h)164 1519 y(f)180 1521 y(\177)179 1519
+y(ur)h(w)o(eitere)e(Durc)o(hl)554 1521 y(\177)554 1519 y(aufe)i(\(nac)o(h)g
+(erneutem)e(Editieren\))g(die)i(ric)o(h)o(tigen)e(T)l(rennstellen)164
+1579 y(gemerkt)f(und)j(wieder)e(v)o(erw)o(endet.)237 1647 y(F)270
+1649 y(\177)269 1647 y(ur)e(den)g(Sonderfall,)h(da\031)g(ein)e(mehrdeutiges)g
+(W)l(ort)h(in)g(mehreren)e(Bedeutungen)164 1708 y(v)o(ork)o(omm)n(t,)h(z.B.)
+506 1737 y(")529 1708 y(In)i(der)h(W)l(ac)o(hstub)q(e)g(liegt)f(eine)g(W)l
+(ac)o(hstub)q(e)m(\\)s(,)h(gibt)g(es)g(die)f(b)q(eiden)164
+1768 y(folgenden)i(M)427 1770 y(\177)427 1768 y(oglic)o(hk)o(eiten:)237
+1862 y Fb(\017)24 b Ff(Man)d(mac)o(h)o(t)555 1864 y(\177)553
+1862 y(ub)q(erhaupt)h(nic)o(h)o(ts.)33 b(Dann)21 b(w)o(erden)f(n)o(ur)h(die)e
+(sic)o(heren)h(T)l(renn-)286 1922 y(stellen)c(ausgen)o(utzt.)25
+b(Es)17 b(en)o(tstehen)g(k)o(eine)f(T)l(rennfehler,)g(allenfalls)g(wird)h
+(das)286 1982 y(Sc)o(hriftbild)d(et)o(w)o(as)i(unruhig.)237
+2079 y Fb(\017)24 b Ff(Mit)13 b(dem)g(T)508 2090 y(E)535 2079
+y(X{Befehl)g Fc(\\-)h Ff(tr)848 2081 y(\177)848 2079 y(a)q(gt)g(man)f(b)q
+(eim)g(Editieren)g(b)q(ei)h(allen)f(\(o)q(der)i(auc)o(h)286
+2139 y(n)o(ur)d(b)q(ei)h(einigen)f(ausgew)760 2141 y(\177)760
+2139 y(a)q(hlten\))g(V)l(ork)o(ommen)e(des)i(W)l(ortes)h(alle)f(T)l
+(rennstellen)286 2199 y(\(o)q(der)i(n)o(ur)f(einen)f(T)l(eil)g(da)o(v)o(on\))
+i(ein.)969 2210 y(I)987 2199 y(S)1014 2189 y(I)1032 2199 y(T)1059
+2210 y(E)1086 2199 y(X)f(n)o(utzt)f(dann)i(diese)f(v)o(orgegeb)q(enen)286
+2259 y(T)l(rennstellen)19 b(aus,)i(suc)o(h)o(t)e(ab)q(er)i(in)e(jedem)f(W)l
+(ort,)j(das)g(eine)e(solc)o(he)g(V)l(orgab)q(e)286 2320 y(en)o(th)380
+2322 y(\177)380 2320 y(alt,)c(nic)o(h)o(t)g(nac)o(h)h(w)o(eiteren)f(T)l
+(rennstellen.)237 2414 y(Ab)q(er)g(no)q(c)o(h)h(ein)e(V)l(orfall)h(m)o(u\031)
+f(b)q(eac)o(h)o(tet)g(w)o(erden.)20 b(Wie)15 b(k)m(ann)h(der)f(Ben)o(utzer,)e
+(der)164 2474 y(irrt)236 2476 y(\177)235 2474 y(umlic)o(h)h(f)410
+2476 y(\177)409 2474 y(ur)j(ein)f(mehrdeutiges)f(W)l(ort)i(eine)f(falsc)o(he)
+h(T)l(renn)o(v)m(arian)o(te)f(ausgew)1698 2476 y(\177)1698
+2474 y(a)q(hlt)961 2599 y(5)p eop
+%%Page: 6 7
+bop 164 307 a Ff(hat,)15 b(diesen)e(F)l(ehler)g(wieder)g(b)q(eseitigen?)21
+b(Bei)12 b(jedem)h(w)o(eiteren)f(Durc)o(hlauf)i(l)1613 309
+y(\177)1613 307 y(auft)g(das)164 367 y(Programm)h(ohne)h(Halt)634
+369 y(\177)632 367 y(ub)q(er)h(alle)e(V)l(ork)o(ommen)e(dieses)j(W)l(ortes)h
+(hin)o(w)o(eg,)e(es)h(h)1670 369 y(\177)1670 367 y(a)q(lt)g(ja)164
+428 y(das)h(Problem)d(dieser)i(Mehrdeutigk)o(eit)e(f)941 430
+y(\177)940 428 y(ur)i(gel)1062 430 y(\177)1062 428 y(ost.)21
+b(Deshalb)c(wurde)f(in)1549 438 y(I)1566 428 y(S)1593 417 y(I)1611
+428 y(T)1638 438 y(E)1665 428 y(X)g(am)164 488 y(Anfang)h(der)e(Behandlung)i
+(des)f(Dokumen)o(ts)f(ein)g(Halt)h(eingef)1343 490 y(\177)1342
+488 y(u)o(gt,)g(b)q(ei)g(dem)f(der)g(Be-)164 548 y(n)o(utzer)i(aufgefordert)h
+(wird,)f(et)o(w)o(aige)f(F)l(ehler)h(aus)h(v)o(orherigen)f(Durc)o(hl)1513
+550 y(\177)1513 548 y(a)o(ufen)h(wieder)164 608 y(zu)e(b)q(eseitigen.)164
+785 y Fr(5)83 b(Un)n(b)r(ek)-5 b(ann)n(te)26 b(W)831 789 y(\177)831
+785 y(o)q(rter)164 905 y Ff(Alle)14 b(W)315 907 y(\177)315
+905 y(o)q(rter,)h(f)464 907 y(\177)463 905 y(ur)h(die)g Fd(SiSiSi)22
+b Ff(k)o(eine)15 b(Zerlegung)g(\014ndet,)h(sind)g Fq(un)n(b)r(ek)m(ann)n(te)i
+(W)1713 908 y(\177)1713 905 y(or-)164 966 y(ter)p Ff(.)30 b(Das)21
+b(sind)e(W)536 968 y(\177)536 966 y(o)q(rter,)g(die)g(einen)f(Sc)o
+(hreibfehler)g(en)o(thalten,)h(ab)q(er)h(auc)o(h)f(solc)o(he,)164
+1026 y(die)f(ric)o(h)o(tig)g(gesc)o(hrieb)q(en,)g(dem)f Fd(SiSiSi)5
+b Ff({Algorithm)o(us)18 b(ab)q(er)i(no)q(c)o(h)f(un)o(b)q(ek)m(ann)o(t)g
+(sind)164 1086 y(\(d.h.)12 b(die)h(no)q(c)o(h)g(nic)o(h)o(t)f(in)h(der)f(W)l
+(orttab)q(elle)h(sind\).)20 b(Die)13 b(einfac)o(he)f(L)1423
+1088 y(\177)1423 1086 y(o)q(sung)h(v)o(on)g(S)1674 1075 y(I)1692
+1086 y(T)1719 1097 y(E)1746 1086 y(X)164 1146 y(lautet:)20
+b(Solc)o(he)13 b(W)l(orte)h(w)o(erden)g(nic)o(h)o(t)f(getrenn)o(t.)20
+b(Die)13 b(F)l(olgen)h(sind)g(die)g(gleic)o(hen)e(wie)164 1206
+y(b)q(ei)18 b(mehrdeutigen)d(W)603 1208 y(\177)603 1206 y(o)q(rtern:)24
+b(L)803 1208 y(\177)802 1206 y(u)q(c)o(k)o(en,)16 b(Stauc)o(h)o(ungen,)1258
+1236 y(")1281 1206 y(underfull)h(h)o(b)q(o)o(x)m(\\)k(|)d(und)164
+1267 y(wieder)c(aus)i(einem)c(f)558 1269 y(\177)557 1267 y(ur)j(den)g(Autor)g
+(des)g(Dokumen)o(ts)e(unerkl)1323 1269 y(\177)1323 1267 y(arlic)o(hen)g
+(Grund.)21 b(Ab)q(er)164 1327 y(denno)q(c)o(h)16 b(k)382 1329
+y(\177)382 1327 y(onnen)h(k)o(eine)d(T)l(rennfehler)h(en)o(tstehen!)237
+1398 y(Das)k(in)o(teraktiv)o(e)581 1408 y(I)598 1398 y(S)625
+1387 y(I)643 1398 y(T)670 1408 y(E)697 1398 y(X)e(bleibt)g(b)q(ei)g(jedem)f
+(un)o(b)q(ek)m(ann)o(ten)h(W)l(ort)h(stehen.)25 b(Der)164 1458
+y(Ben)o(utzer)16 b(k)m(ann)j(jetzt)e(en)o(tsc)o(heiden,)f(ob)i(es)g(sic)o(h)f
+(um)g(einen)g(Tippfehler)g(o)q(der)h(wirk-)164 1518 y(lic)o(h)f(um)h(ein)g
+(un)o(b)q(ek)m(ann)o(tes)h(W)l(ort,)h(d.h.)e(um)f(einen)h(Namen,)g(eine)g
+(Abk)1543 1520 y(\177)1542 1518 y(u)o(rzung,)i(ein)164 1578
+y(ausgefallenes)e(F)l(remdw)o(ort)e(o)q(der)j(et)o(w)o(as)958
+1568 y(\177)952 1578 y(A)o(hnlic)o(hes)e(handelt.)27 b(Diese)1508
+1608 y(")1530 1578 y(neuen)18 b(W)1723 1580 y(\177)1723 1578
+y(o)q(r-)164 1639 y(ter)m(\\)24 b(sollen)c(n)o(ur)h(einmal)d(als)j(un)o(b)q
+(ek)m(ann)o(t)g(gemeldet)d(w)o(erden,)j(also)h(in)e(den)h(folgen-)164
+1699 y(den)16 b(Pro)q(duktionsl)530 1701 y(\177)530 1699 y(a)q(ufen)f
+(desselb)q(en)g(Dokumen)o(ts)g(als)h(b)q(ek)m(ann)o(t)g(akzeptiert)e(w)o
+(erden.)164 1759 y(Tippfehler)h(sollen)h(hingegen)g(immer)d(angezeigt)j(w)o
+(erden.)237 1830 y(Da)22 b(ab)q(er)g(ein)f(Eingri\013)h(in)f(das)i(gerade)e
+(b)q(earb)q(eitete)g(T)1301 1841 y(E)1329 1830 y(X{File)f(nic)o(h)o(t)g(m)
+1661 1832 y(\177)1661 1830 y(o)o(glic)o(h)164 1890 y(ist)g(\(d.h.)f(ein)h
+(sofortiges)h(Ausb)q(essern)f(der)g(Tippfehler)f(im)g(Dokumen)o(t)g(ginge)h
+(w)o(eit)165 1952 y(\177)164 1950 y(ub)q(er)15 b(den)f(Ein\015u\031b)q(ereic)
+o(h)g(der)g(Silb)q(en)o(trenn)o(ung)g(hinaus)h(und)g(w)1387
+1952 y(\177)1386 1950 y(urde)g(w)o(eitreic)o(hende)164 2010
+y(Eingri\013e)e(in)g(T)439 2021 y(E)466 2010 y(X)g(erfordern\),)g(sp)q(eic)o
+(hert)959 2021 y(I)977 2010 y(S)1004 2000 y(I)1021 2010 y(T)1048
+2021 y(E)1076 2010 y(X)f(die)h(v)o(om)f(Ben)o(utzer)f(als)1578
+2040 y(")1600 2010 y(Tippfeh-)164 2071 y(ler)m(\\)16 b(b)q(ezeic)o(hneten)c
+(W)591 2073 y(\177)591 2071 y(orter)i(in)f(einem)e(File,)i(das)h(man)f(b)q
+(eim)f(n)1344 2073 y(\177)1344 2071 y(ac)o(hsten)h(Editieren)g(als)164
+2131 y(Ged)251 2133 y(\177)251 2131 y(ac)o(h)o(tnisst)440 2133
+y(\177)439 2131 y(utze)i(v)o(erw)o(enden)g(k)m(ann.)237 2202
+y(W)l(elc)o(he)h(neuen)h(M)592 2204 y(\177)592 2202 y(oglic)o(hk)o(eiten)859
+2212 y(I)877 2202 y(S)904 2191 y(I)922 2202 y(T)949 2212 y(E)976
+2202 y(X)g(bietet,)f(ist)h(zusammenfassend)e(in)i(Ab-)164 2262
+y(bildung)f(1)h(dargestellt.)961 2599 y(6)p eop
+%%Page: 7 8
+bop 180 2216 a @beginspecial @setspecial
+%%BeginDocument: inst_ber.fg1.ps
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/l {lineto} bind def
+/m {moveto} bind def
+/s {stroke} bind def
+/n {newpath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/clp {closepath} bind def
+/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+4 -2 roll mul setrgbcolor} bind def
+/col-1 {} def
+/col0 {0 0 0 setrgbcolor} bind def
+/col1 {0 0 1 setrgbcolor} bind def
+/col2 {0 1 0 setrgbcolor} bind def
+/col3 {0 1 1 setrgbcolor} bind def
+/col4 {1 0 0 setrgbcolor} bind def
+/col5 {1 0 1 setrgbcolor} bind def
+/col6 {1 1 0 setrgbcolor} bind def
+/col7 {1 1 1 setrgbcolor} bind def
+ end
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+0 setlinecap 0 setlinejoin
+-3.0 635.0 translate 0.720 -0.720 scale
+0.500 setlinewidth
+n 154 769 m 154 699 l 4 699 l 4 769 l
+ clp gs col-1 s gr
+n 279 659 m 279 699 l gs col-1 s gr
+n 279 659 m 469 699 l gs col-1 s gr
+n 279 769 m 279 819 l gs col-1 s gr
+n 79 769 m 79 819 l gs col-1 s gr
+n 359 349 m 359 299 l 199 299 l 199 349 l
+ clp gs col-1 s gr
+n 154 349 m 154 299 l 4 299 l 4 349 l
+ clp gs col-1 s gr
+n 279 259 m 279 299 l gs col-1 s gr
+n 279 259 m 464 299 l gs col-1 s gr
+n 279 259 m 79 299 l gs col-1 s gr
+n 279 349 m 279 399 l gs col-1 s gr
+n 464 349 m 464 399 l gs col-1 s gr
+n 79 349 m 79 399 l gs col-1 s gr
+n 359 259 m 359 209 l 199 209 l 199 259 l
+ clp gs col-1 s gr
+n 279 179 m 279 209 l gs col-1 s gr
+3.000 setlinewidth
+n 339 179 m 219 179 l 219 149 l 339 149 l
+ clp gs col-1 s gr
+0.500 setlinewidth
+n 279 659 m 79 699 l gs col-1 s gr
+n 359 659 m 359 609 l 199 609 l 199 659 l
+ clp gs col-1 s gr
+n 279 579 m 279 609 l gs col-1 s gr
+3.000 setlinewidth
+n 339 579 m 219 579 l 219 549 l 339 549 l
+ clp gs col-1 s gr
+0.500 setlinewidth
+n 539 769 m 539 699 l 404 699 l 404 769 l
+ clp gs col-1 s gr
+n 469 769 m 469 819 l gs col-1 s gr
+n 524 349 m 524 299 l 404 299 l 404 349 l
+ clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 719 m
+gs 1 -1 scale (mit angegebenen Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 740 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+n 379 769 m 379 699 l 179 699 l 179 769 l
+ clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 761 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+464 419 m
+gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 719 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 740 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 839 m
+gs 1 -1 scale (mit Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 860 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 881 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 839 m
+gs 1 -1 scale (untrennbar) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 860 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 881 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 319 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 340 m
+gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 319 m
+gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 419 m
+gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 440 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 461 m
+gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 419 m
+gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+79 440 m
+gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 250 m
+gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 229 m
+gs 1 -1 scale (Auswahl einer Trennung) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 169 m
+gs 1 -1 scale (mehrdeutiges Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 650 m
+gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 629 m
+gs 1 -1 scale (neues Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 569 m
+gs 1 -1 scale (unbekanntes Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+469 719 m
+gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+469 839 m
+gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+464 319 m
+gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+$F2psEnd
+%%EndDocument
+ @endspecial 561 2318 a Ff(Abbildung)16 b(1:)22 b(Die)15 b(neuen)h(M)1135
+2320 y(\177)1135 2318 y(oglic)o(hk)o(eiten)961 2599 y(7)p eop
+%%Page: 8 9
+bop 164 331 a Fr(6)288 347 y(I)319 331 y(S)365 315 y(I)396
+331 y(T)439 347 y(E)484 331 y(X)27 b(in)n(tern:)36 b(Die)28
+b(neuen)e(Files)164 451 y Ff(Um)20 b(die)i(obigen)g(Erw)o(eiterungen)g(zu)g
+(erm)993 453 y(\177)993 451 y(o)n(glic)o(hen,)g(w)o(erden)g(die)f(en)o
+(tsprec)o(henden)164 511 y(Informationen)16 b(in)i(drei)f(Files)f(gesp)q(eic)
+o(hert.)1033 541 y(")1055 511 y(doku)m(\\)22 b(steh)o(t)17
+b(im)f(F)l(olgenden)h(f)1644 513 y(\177)1643 511 y(ur)h(den)164
+571 y(Namen)d(des)h(gerade)g(b)q(earb)q(eiteten)g(Dokumen)o(ts.)237
+684 y Fb(\017)24 b Fq(doku.mem)o Ff(:)g(Der)18 b(Ben)o(utzer)g(w)922
+686 y(\177)922 684 y(ahlt)h(b)q(ei)f(mehrdeutigen)f(W)1466
+686 y(\177)1466 684 y(ortern)i(die)f(pas-)286 744 y(sende)e(Bedeutung)h(aus.)
+23 b(Diese)16 b(W)l(ahl)h(wird)g(in)f Fc(doku.mem)i Ff(gesp)q(eic)o(hert.)k
+(V)l(on)286 804 y(jetzt)h(an)i(w)o(erden)e(alle)g(V)l(ork)o(ommnisse)e
+(dieses)i(W)l(ortes)i(en)o(tsprec)o(hend)d(die-)286 864 y(ser)e(F)l
+(estlegung)g(getrenn)o(t.)33 b(Ac)o(h)o(tung!)g(Komm)o(t)17
+b(ein)j(W)l(ort)g(mit)f(v)o(ersc)o(hiede-)286 925 y(nen)i(Endungen)h(im)e(T)l
+(ext)h(v)o(or,)h(so)g(wird)g(f)1116 927 y(\177)1115 925 y(ur)f(jede)g(V)l
+(arian)o(te)f(extra)i(gefragt.)286 985 y(\(Komm)o(t)15 b(also)j(in)f(einem)e
+(Dokumen)o(t)h(zB.)g(dreimal)1286 1015 y(")1309 985 y(W)l(ac)o(hstub)q(e)m
+(\\)21 b(und)d(f)1699 987 y(\177)1698 985 y(unf-)286 1045 y(mal)388
+1075 y(")411 1045 y(W)l(ac)o(hstub)q(en)m(\\)27 b(v)o(or,)e(so)g(m)o(u\031)e
+(der)g(Ben)o(utzer)f(je)i(einmal)e(die)h(ric)o(h)o(tige)286
+1105 y(T)l(renn)o(ung)15 b(f)520 1107 y(\177)519 1105 y(ur)580
+1135 y(")603 1105 y(W)l(ac)o(hstub)q(e)m(\\)k(und)972 1135
+y(")994 1105 y(W)l(ac)o(hstub)q(en)m(\\)g(angeb)q(en.\))j(Eb)q(enso)16
+b(w)o(er-)286 1165 y(den)k(alle)f(W)525 1167 y(\177)525 1165
+y(o)q(rter,)h(die)g(dem)e(System)h(un)o(b)q(ek)m(ann)o(t)h(sind)h(und)f(f)
+1496 1167 y(\177)1495 1165 y(ur)g(das)h(Doku-)286 1226 y(men)o(t)f(sp)q
+(ezielle)f(F)l(remdw)784 1228 y(\177)784 1226 y(o)o(rter)i(o)q(der)i(Namen)d
+(darstellen,)h(durc)o(h)h(ein)f(Kom-)286 1286 y(mando)14 b(des)h(Ben)o
+(utzers)e(\(ev)o(en)o(tuell)f(mit)h(den)i(eingegeb)q(enen)f(T)l
+(rennstellen\))f(in)286 1346 y Fc(doku.mem)22 b Ff(gesp)q(eic)o(hert.)34
+b(Diese)21 b(Information)f(wird)g(dann)i(b)q(ei)f(allen)f(w)o(eite-)286
+1406 y(ren)371 1417 y(I)389 1406 y(S)416 1395 y(I)434 1406
+y(T)461 1417 y(E)488 1406 y(X)d(Pro)q(duktionsl)816 1408 y(\177)816
+1406 y(a)q(ufen)g(b)q(er)1019 1408 y(\177)1018 1406 y(uc)o(ksic)o(h)o(tigt)f
+(und)i(en)o(tsprec)o(hend)e(erw)o(ei-)286 1466 y(tert)e(\(w)o(enn)g(b)q(eim)e
+(w)o(eiteren)h(Editieren)g(neue)h(mehrdeutige)e(o)q(der)j(un)o(b)q(ek)m(ann)o
+(te)286 1527 y(W)336 1529 y(\177)336 1527 y(orter)h(hinzugef)634
+1529 y(\177)633 1527 y(ugt)g(wurden\).)237 1628 y Fb(\017)24
+b Fq(doku.lex)p Ff(:)c(Bei)15 b(mehrdeutigen)g(und)i(insb)q(esondere)f(b)q
+(ei)h(un)o(b)q(ek)m(ann)o(ten)f(W)1723 1630 y(\177)1723 1628
+y(o)q(r-)286 1688 y(tern,)i(k)m(ann)h(sic)o(h)e(der)h(Ben)o(utzer)e(dazu)j
+(en)o(tsc)o(hlie\031en,)d(da\031)j(sie)e(\(zus)1576 1690 y(\177)1576
+1688 y(a)q(tzlic)o(h)f(zu)286 1749 y(der)g(erw)446 1751 y(\177)446
+1749 y(ahn)o(ten)g(Ein)o(tragung)h(in)e Fc(doku.mem)p Ff(\))j(in)e(die)f(W)l
+(orttab)q(elle)h(v)o(on)g Fd(SiSiSi)286 1809 y Ff(eingetragen)k(w)o(erden)f
+(sollen.)33 b(Un)o(b)q(ek)m(ann)o(te)19 b(W)1210 1811 y(\177)1210
+1809 y(o)q(rter)g(k)o(ommen)e(daher)k(auto-)286 1869 y(matisc)o(h)e(und)i
+(mehrdeutige)e(W)907 1871 y(\177)907 1869 y(orter)i(auf)g(W)l(unsc)o(h)g(in)f
+(das)i(File)d Fc(doku.lex)p Ff(,)286 1929 y(damit)d(sie)h(leic)o(h)o(t)f(mit)
+g(dem)830 1959 y(")852 1929 y Fd(LEXIK)o(ON)8 b Ff({System)m(\\)20
+b(am)d(PC)h(in)f(die)g(W)l(ortta-)286 1989 y(b)q(elle)c(eingetragen)i(w)o
+(erden)f(k)849 1991 y(\177)849 1989 y(onnen.)20 b(So)15 b(ist)f(es)h(dem)e
+(Ben)o(utzer)g(m)1549 1991 y(\177)1549 1989 y(o)o(glic)o(h,)g(eine)286
+2050 y(sp)q(ezielle)h(W)l(orttab)q(elle)i(f)760 2052 y(\177)759
+2050 y(ur)g(seinen)g(p)q(ers)1056 2052 y(\177)1056 2050 y(o)q(nlic)o(hen)e(W)
+l(ortsc)o(hatz)j(zu)f(sc)o(ha\013en.)237 2151 y Fb(\017)24
+b Fq(doku.edt)p Ff(:)30 b(Alle)20 b(als)h(Tippfehler)f(erk)m(ann)o(ten)h(W)
+1252 2153 y(\177)1252 2151 y(o)q(rter)g(w)o(erden)f(in)h(das)h(File)286
+2211 y Fc(doku.edt)14 b Ff(gesc)o(hrieb)q(en.)19 b(Dieses)12
+b(File)f(un)o(tersc)o(heidet)f(sic)o(h)i(grunds)1554 2213 y(\177)1554
+2211 y(a)q(tzlic)o(h)f(v)o(on)286 2272 y(den)k(b)q(eiden)g(obigen.)22
+b(Ein)o(tragungen)16 b(in)f(diesem)e(File)i(w)o(erden)g(nic)o(h)o(t)f
+(automa-)286 2332 y(tisc)o(h)g(f)416 2334 y(\177)415 2332 y(ur)h(w)o(eitere)f
+(V)l(ork)o(omme)o(n)e(desselb)q(en)j(W)l(ortes)g(und)h(auc)o(h)f(nic)o(h)o(t)
+f(f)1638 2334 y(\177)1637 2332 y(ur)h(w)o(ei-)286 2392 y(tere)g(Durc)o(hl)528
+2394 y(\177)528 2392 y(aufe)g(v)o(erw)o(endet.)20 b(Es)c(ist)f(als)1090
+2422 y(")1113 2392 y(Merk\014le)m(\\)i(des)f(Ben)o(utzers)e(f)1651
+2394 y(\177)1650 2392 y(ur)i(das)286 2452 y(n)313 2454 y(\177)313
+2452 y(ac)o(hste)j(Editieren)g(gedac)o(h)o(t.)30 b(Er)20 b(k)m(ann)g(es)g
+(daher)g(ansc)o(hauen,)g(ausdruc)o(k)o(en,)961 2599 y(8)p eop
+%%Page: 9 10
+bop 286 307 a Ff(editieren)19 b(und)j(l)608 309 y(\177)608
+307 y(osc)o(hen.)35 b(W)l(eiters)21 b(wird)g(dieses)f(File)g(b)q(ei)h(jedem)e
+(Durc)o(hlauf)286 367 y(neu)g(angelegt.)28 b(Das)20 b(ist)f(sinn)o(v)o(oll,)e
+(w)o(eil)g(Tippfehler)h(ja)h(nic)o(h)o(t)f(hingenommen)286
+428 y(w)o(erden)d(sollen)f(\(w)o(eder)h(v)o(on)835 438 y(I)853
+428 y(S)880 417 y(I)897 428 y(T)924 438 y(E)952 428 y(X)f(no)q(c)o(h)i(v)o
+(om)e(Ben)o(utzer\).)19 b(Es)d(w)o(erden)e(also)286 488 y(imme)o(r)g(alle)i
+(Tippfehler)g(gemeldet.)21 b(Das)d(wiederholte)e(Aufmerksamm)n(ac)o(hen)286
+548 y(ist)g(durc)o(haus)g(b)q(eabsic)o(h)o(tigt.)164 660 y(Die)d(Files)e
+Fc(doku.mem)k Ff(und)e Fc(doku.lex)h Ff(d)929 662 y(\177)928
+660 y(u)q(rfen)e(nic)o(h)o(t)g(v)o(om)f(Ben)o(utzer)h(v)o(er)1542
+662 y(\177)1542 660 y(a)o(ndert)h(w)o(er-)164 721 y(den,)h(w)o(eil)g(sie)g(v)
+o(om)f(System)g(wieder)h(v)o(erw)o(endet)f(w)o(erden.)20 b
+Fc(doku.edt)c Ff(darf)f(ge)1645 723 y(\177)1645 721 y(andert)164
+781 y(o)q(der)i(zerst)375 783 y(\177)375 781 y(ort)f(w)o(erden.)164
+958 y Fr(7)83 b(Wie)24 b(erzeugt)f(man)h(ein)f(druc)n(kfertiges)g(Man)n(u-)
+288 1049 y(skript)j(mit)677 1065 y(I)709 1049 y(S)755 1033
+y(I)786 1049 y(T)829 1065 y(E)873 1049 y(X?)164 1169 y Ff(Beim)11
+b(ersten)16 b(Editieren)p 288 1177 340 2 v 12 w(b)q(ereitet)d(man)g(das)h
+(Man)o(uskript)f(genauso)i(wie)e(f)1550 1171 y(\177)1549 1169
+y(ur)1609 1199 y(")1631 1169 y(norma-)164 1230 y(les)m(\\)20
+b(T)287 1240 y(E)314 1230 y(X)d(auf.)24 b(Die)17 b(Befehle)e(f)750
+1232 y(\177)749 1230 y(ur)i(die)f(F)l(on)o(ts,)h(die)g(F)l(ormate,)e(usw.)j
+(f)1454 1232 y(\177)1453 1230 y(ugt)f(man)f(in)h(den)164 1290
+y(T)l(ext)f(ein.)237 1361 y(Beim)j(ersten)d(Durc)o(hlauf)p
+369 1369 355 2 v 21 w(durc)o(h)21 b(das)979 1371 y(I)996 1361
+y(S)1023 1350 y(I)1041 1361 y(T)1068 1371 y(E)1095 1361 y(X{System)f(b)q(ean)
+o(t)o(w)o(ortet)h(man)g(die)164 1421 y(F)l(ragen)e(des)h(Systems)e(b)q(ez)680
+1423 y(\177)679 1421 y(uglic)o(h)g(mehrdeutiger)f(und)i(un)o(b)q(ek)m(ann)o
+(ter)g(W)1557 1423 y(\177)1557 1421 y(o)q(rter)g(sinn-)164
+1481 y(v)o(oll.)25 b(Es)18 b(en)o(tstehen)f(die)h(Files)e Fc(doku.mem)p
+Ff(,)j Fc(doku.lex)h Ff(und)e Fc(doku.edt)h Ff(\(siehe)e(Ab-)164
+1541 y(bildung)f(2\).)237 1612 y(Im)d(allgemeinen)f(wird)j(man)f(auc)o(h)g
+(das)i(en)o(tstandene)e(File)h(druc)o(k)o(en)p 1258 1620 264
+2 v -2 w(,)g(um)f(w)o(eitere)164 1672 y(Hin)o(w)o(eise)j(f)385
+1674 y(\177)384 1672 y(ur)i(Korrekturen)g(im)e(Man)o(uskript)i(zu)g
+(erhalten.)30 b(In)19 b(diesem)e(Ausdruc)o(k)164 1733 y(sind)g(sc)o(hon)g
+(alle)g(T)l(rennstellen)f(b)q(er)843 1735 y(\177)842 1733 y(uc)o(ksic)o(h)o
+(tigt,)f(die)h(man)g(|)h(wie)g(in)g(Kapitel)f(6)i(b)q(e-)164
+1793 y(sc)o(hrieb)q(en)d(|)h(an)h(das)g(File)e Fc(doku.mem)i
+Ff(gemeldet)d(hat.)237 1864 y(Jetzt)k(k)m(ann)i(man)e(die)g(W)l(orttab)q
+(elle)p 675 1872 251 2 v 19 w(mit)f(dem)g(System)h Fd(LEXIK)o(ON)27
+b Ff(erw)o(eitern.)164 1924 y(Man)18 b(wird)g(\(siehe)f(Kapitel)f(10\))j
+(alle)e(sp)q(eziellen)f(W)1152 1926 y(\177)1152 1924 y(orter)i(dieses)f
+(Dokumen)o(ts,)f(bzw.)164 1984 y(des)f(F)l(ac)o(h)o(v)o(ok)m(abulars)g(ein)o
+(tragen.)21 b Fd(LEXIK)o(ON)i Ff(b)q(en)o(utzt)15 b(dab)q(ei)g(das)h(File)e
+Fc(doku.lex)p Ff(.)237 2055 y(Danac)o(h)20 b(erfolgt)f(das)h(n)690
+2057 y(\177)690 2055 y(a)q(c)o(hste)c(Editieren)p 663 2063
+371 2 v -2 w(.)31 b(Mit)19 b(den)g(Hin)o(w)o(eisen)e(aus)j(dem)e(File)164
+2115 y Fc(doku.edt)13 b Ff(und)f(den)f(Erk)o(enn)o(tnissen)f(v)o(om)g
+(Korrekturlesen)h(wird)g(man)g(insb)q(esondere)164 2175 y(alle)23
+b(Tippfehler)f(k)o(orrigieren,)h(ab)q(er)h(auc)o(h)g(andere)f(Korrekturen)g
+(im)e(Man)o(uskript)164 2236 y(v)o(ornehmen.)237 2306 y(Beim)13
+b(folgenden)j(n)608 2308 y(\177)608 2306 y(a)q(c)o(hsten)f(Durc)o(hlauf)p
+581 2314 413 2 v 16 w(bleibt)g(das)h(System)e(nic)o(h)o(t)h(mehr)f(b)q(ei)i
+(al-)164 2367 y(len)11 b(mehrdeutigen)e(und)j(un)o(b)q(ek)m(ann)o(ten)g(W)965
+2369 y(\177)965 2367 y(ortern,)g(die)f(in)g(einem)e(fr)1418
+2369 y(\177)1417 2367 y(uheren)i(Durc)o(hlauf)164 2427 y(in)j
+Fc(doku.mem)i Ff(eingetragen)e(wurden,)h(stehen.)20 b(Am)13
+b(Anfang)i(dieses)f(Durc)o(hlaufs)g(gibt)961 2599 y(9)p eop
+%%Page: 10 11
+bop 164 307 a Ff(es)17 b(jedo)q(c)o(h)h(Gelegenheit,)d(fr)692
+309 y(\177)691 307 y(uhere)i(falsc)o(he)g(F)l(estlegungen)g(zu)g(l)1356
+309 y(\177)1356 307 y(osc)o(hen.)24 b(Neue)16 b(mehr-)164 367
+y(deutige)d(o)q(der)h(un)o(b)q(ek)m(ann)o(te)f(W)746 369 y(\177)746
+367 y(o)q(rter)g(\(auc)o(h)g(alte)g(Tippfehler\))g(w)o(erden)g(wie)g(im)e
+(ersten)164 428 y(Durc)o(hgang)17 b(b)q(ehandelt.)237 498 y(Diese)e(V)l(org)
+466 500 y(\177)466 498 y(a)q(nge)h(w)o(erden)f(solange)i(wiederholt,)e(bis)g
+(die)h(Qualit)1459 500 y(\177)1459 498 y(at)f(des)h(gedruc)o(k-)164
+559 y(ten)g(Man)o(uskripts)g(den)g(Anspr)751 561 y(\177)750
+559 y(uc)o(hen)g(gen)964 561 y(\177)963 559 y(ugt.)237 630
+y(Die)g(W)l(ege,)f(die)h(die)f(Daten)i(nehmen,)d(sind)i(in)g(Abbildung)f(2)i
+(zusammenfassend)164 690 y(dargestellt.)164 867 y Fr(8)288
+906 y(")328 867 y(xxx)-6 b(\\)33 b(ist)28 b(ein)g(mehrdeutiges)f(W)-7
+b(ort!)40 b(|)29 b(w)n(as)288 958 y(tun?)164 1078 y Ff(W)l(enn)302
+1089 y(I)320 1078 y(S)347 1068 y(I)365 1078 y(T)392 1089 y(E)419
+1078 y(X)16 b(ein)g(mehrdeutiges)e(W)l(ort)j(\014ndet,)f(dann)h(sieh)o(t)f
+(das)h(folgenderma\031en)164 1139 y(aus)g(\(am)e(Beispiel)f(des)j(W)l(ortes)
+782 1168 y(")805 1139 y(W)l(ac)o(hstub)q(e)m(\\)s(\):)164 1251
+y Fc(`wachstube')28 b(ist)e(ein)h(mehrdeutiges)h(Wort!)190
+1311 y(0:)f(nur)f(die)h(sicheren)g(Trennstellen)h(waehlen)f(\(`wachstu-be'\))
+190 1371 y(1:)g(`wach=stu-be')190 1432 y(2:)g(`wachs=tu-be')190
+1492 y(9:)g(Tippfehler!)g(-)g(merken)g(im)f(File)h(`doku.edt')164
+1552 y(Bitte)g(waehlen)g(Sie)g(eine)f(Bedeutung)i(z.B.)f(`0'+`Enter')h(aus:)
+190 1612 y(\(zusaetzlich)g(E)e(z.B.)h(`0E'+`Enter':)216 1672
+y(Wort)g(auch)g(fuer)g(LEXIKON)g(vormerken\))164 1785 y Ff(Nun)17
+b(m)o(u\031)f(man)h(eine)f(Zi\013er)h(gefolgt)h(v)o(on)974
+1815 y(")996 1785 y(En)o(ter)m(\\)j(eingeb)q(en.)j(Ist)17 b(z.B.)f(die)h
+(Bedeu-)164 1845 y(tung)281 1875 y(")304 1845 y(W)l(ac)o(h=stub)q(e)m(\\)23
+b(die)c(gemein)o(te,)e(so)j(gibt)g(man)1202 1875 y(")1224 1845
+y(1)m(\\)s(+)1310 1875 y(")1333 1845 y(En)o(ter)m(\\)j(ein.)30
+b(Ab)20 b(jetzt)164 1905 y(wird)i(das)h(W)l(ort)504 1935 y(")527
+1905 y(W)l(ac)o(hstub)q(e)m(\\)j(im)20 b(ganzen)i(Dokumen)o(t)f(und)i(auc)o
+(h)f(in)f(k)1609 1907 y(\177)1608 1905 y(unftigen)164 1965
+y(Durc)o(hl)309 1967 y(\177)309 1965 y(aufen)d(en)o(tsprec)o(hend)f(getrenn)o
+(t.)27 b(T)l(ritt)18 b(der)1164 1967 y(\177)1163 1965 y(ub)q(eraus)h(seltene)
+e(F)l(all)h(auf,)h(da\031)164 2026 y(ein)i(W)l(ort)i(tats)460
+2028 y(\177)460 2026 y(a)q(c)o(hlic)o(h)d(in)h(mehreren)f(Bedeutungen)i(in)f
+(ein)h(und)g(demselb)q(en)e(Do-)164 2086 y(kumen)o(t)g(v)o(ork)o(omm)n(t,)g
+(so)i(k)m(ann)h(man)d(sic)o(h)h(durc)o(h)1145 2116 y(")1167
+2086 y(0)m(\\)s(+)1253 2116 y(")1276 2086 y(En)o(ter)m(\\)k(auf)d(die)f(sic)o
+(heren)164 2146 y(T)l(rennstellen)14 b(b)q(esc)o(hr)577 2148
+y(\177)577 2146 y(ank)o(en.)20 b(Will)14 b(man)g(das)i(W)l(ort)g(sp)1205
+2148 y(\177)1205 2146 y(ater)f(auc)o(h)g(in)g(die)f(W)l(orttab)q(el-)164
+2206 y(le)g(ein)o(tragen,)g(so)h(gibt)g(man)f(zus)771 2208
+y(\177)771 2206 y(a)q(tzlic)o(h)f(no)q(c)o(h)i(ein)1118 2236
+y(")1140 2206 y(E)m(\\)j(an)e(\(also)f(zB.)1479 2236 y(")1501
+2206 y(1E)m(\\)s(+)1620 2236 y(")1643 2206 y(En)o(ter)m(\\)164
+2266 y(statt)278 2296 y(")301 2266 y(1)m(\\)s(+)387 2296 y(")410
+2266 y(En)o(ter)m(\\)s(\).)20 b(Dadurc)o(h)15 b(wird)e(das)i(W)l(ort)f(zus)
+1186 2268 y(\177)1186 2266 y(a)q(tzlic)o(h)e(in)h(das)i(File)e
+Fc(doku.lex)164 2327 y Ff(eingetragen,)k(das)h(die)f(Arb)q(eit)g(mit)e(dem)h
+(Lexik)o(on{System)g(erleic)o(h)o(tert.)21 b(Gibt)d(man)164
+2416 y(")186 2387 y(9)m(\\)s(+)272 2416 y(")296 2387 y(En)o(ter)m(\\)c(ein,)e
+(so)h(wird)e(das)i(W)l(ort)f(n)o(ur)g(\(!\))20 b(ins)12 b(File)e
+Fc(doku.edt)k Ff(gesc)o(hrieb)q(en)d(und)164 2447 y(k)m(ann)17
+b(dann)g(b)q(eim)d(Editieren)h(v)o(on)i Fc(doku.tex)g Ff(gesuc)o(h)o(t)f(und)
+g(ausgeb)q(essert)i(w)o(erden.)949 2599 y(10)p eop
+%%Page: 11 12
+bop 180 2240 a @beginspecial @setspecial
+%%BeginDocument: inst_ber.fg2.ps
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/l {lineto} bind def
+/m {moveto} bind def
+/s {stroke} bind def
+/n {newpath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/clp {closepath} bind def
+/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+4 -2 roll mul setrgbcolor} bind def
+/col-1 {} def
+/col0 {0 0 0 setrgbcolor} bind def
+/col1 {0 0 1 setrgbcolor} bind def
+/col2 {0 1 0 setrgbcolor} bind def
+/col3 {0 1 1 setrgbcolor} bind def
+/col4 {1 0 0 setrgbcolor} bind def
+/col5 {1 0 1 setrgbcolor} bind def
+/col6 {1 1 0 setrgbcolor} bind def
+/col7 {1 1 1 setrgbcolor} bind def
+ end
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+0 setlinecap 0 setlinejoin
+-72.0 549.0 translate 0.900 -0.900 scale
+0.500 setlinewidth
+n 299 489 m 299 439 l 179 439 l 179 489 l
+ clp gs col-1 s gr
+n 324 609 m 324 559 l 154 559 l 154 609 l
+ clp gs col-1 s gr
+n 559 289 m 559 259 l 439 259 l 439 289 l
+ clp gs col-1 s gr
+n 256 184 m 249 184 249 197 7 arcto 4 {pop} repeat 249 204 302 204 7 arcto 4 {pop} repeat 309 204 309 191 7 arcto 4 {pop} repeat 309 184 256 184 7 arcto 4 {pop} repeat clp gs col-1 s gr
+n 136 364 m 129 364 129 377 7 arcto 4 {pop} repeat 129 384 182 384 7 arcto 4 {pop} repeat 189 384 189 371 7 arcto 4 {pop} repeat 189 364 136 364 7 arcto 4 {pop} repeat clp gs col-1 s gr
+n 256 404 m 249 404 249 417 7 arcto 4 {pop} repeat 249 424 302 424 7 arcto 4 {pop} repeat 309 424 309 411 7 arcto 4 {pop} repeat 309 404 256 404 7 arcto 4 {pop} repeat clp gs col-1 s gr
+n 256 524 m 249 524 249 537 7 arcto 4 {pop} repeat 249 544 302 544 7 arcto 4 {pop} repeat 309 544 309 531 7 arcto 4 {pop} repeat 309 524 256 524 7 arcto 4 {pop} repeat clp gs col-1 s gr
+n 239 149 m 239 259 l gs col-1 s gr
+n 241.000 251.000 m 239.000 259.000 l 237.000 251.000 l gs 2 setlinejoin col-1 s gr
+n 219 289 m 219 309 l 99 309 l 99 239 l
+ 219 239 l 219 259 l gs col-1 s gr
+n 221.000 251.000 m 219.000 259.000 l 217.000 251.000 l gs 2 setlinejoin col-1 s gr
+n 229 289 m 229 359 l 79 359 l 79 99 l
+ 229 99 l 229 119 l gs col-1 s gr
+n 231.000 111.000 m 229.000 119.000 l 227.000 111.000 l gs 2 setlinejoin col-1 s gr
+n 239 289 m 239 439 l gs col-1 s gr
+n 241.000 431.000 m 239.000 439.000 l 237.000 431.000 l gs 2 setlinejoin col-1 s gr
+n 259 289 m 259 309 l 499 309 l 499 289 l gs col-1 s gr
+n 497.000 297.000 m 499.000 289.000 l 501.000 297.000 l gs 2 setlinejoin col-1 s gr
+n 499 259 m 499 239 l 259 239 l 259 259 l gs col-1 s gr
+n 261.000 251.000 m 259.000 259.000 l 257.000 251.000 l gs 2 setlinejoin col-1 s gr
+n 239 489 m 239 559 l gs col-1 s gr
+n 241.000 551.000 m 239.000 559.000 l 237.000 551.000 l gs 2 setlinejoin col-1 s gr
+n 269 149 m 269 119 l 209 119 l 209 149 l
+ clp gs col-1 s gr
+n 269 289 m 269 259 l 209 259 l 209 289 l
+ clp gs col-1 s gr
+n 131 314 m 124 314 124 327 7 arcto 4 {pop} repeat 124 334 187 334 7 arcto 4 {pop} repeat 194 334 194 321 7 arcto 4 {pop} repeat 194 314 131 314 7 arcto 4 {pop} repeat clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+379 224 m
+gs 1 -1 scale (Worttabelle) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+n 356 314 m 349 314 349 327 7 arcto 4 {pop} repeat 349 334 402 334 7 arcto 4 {pop} repeat 409 334 409 321 7 arcto 4 {pop} repeat 409 314 356 314 7 arcto 4 {pop} repeat clp gs col-1 s gr
+n 346 204 m 339 204 339 227 7 arcto 4 {pop} repeat 339 234 412 234 7 arcto 4 {pop} repeat 419 234 419 211 7 arcto 4 {pop} repeat 419 204 346 204 7 arcto 4 {pop} repeat clp gs col-1 s gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 139 m
+gs 1 -1 scale (EDITOR) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 199 m
+gs 1 -1 scale (doku.tex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 279 m
+gs 1 -1 scale (iSiTeX) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+159 379 m
+gs 1 -1 scale (doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 459 m
+gs 1 -1 scale (DVI2PS) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 480 m
+gs 1 -1 scale (\(..dvi to Postscript\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 579 m
+gs 1 -1 scale (PRINT) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+239 600 m
+gs 1 -1 scale (\(Postscript-Laserdrucker\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 419 m
+gs 1 -1 scale (doku.dvi) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+279 539 m
+gs 1 -1 scale (doku.ps) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+499 279 m
+gs 1 -1 scale (LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+159 329 m
+gs 1 -1 scale (doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+/Times-Roman findfont 14.00 scalefont setfont
+379 329 m
+gs 1 -1 scale (doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr
+$F2psEnd
+%%EndDocument
+ @endspecial 608 2402 a Ff(Abbildung)15 b(2:)22 b(Die)16 b(W)l(ege)g(der)g
+(Daten)949 2599 y(11)p eop
+%%Page: 12 13
+bop 164 315 a Fr(9)288 354 y(")328 315 y(xxx)-6 b(\\)37 b(ist)c(ein)f(un)n(b)
+r(ek)-5 b(ann)n(tes)32 b(W)-7 b(ort!)54 b(|)33 b(w)n(as)288
+407 y(tun?)164 526 y Ff(W)l(enn)304 536 y(I)322 526 y(S)349
+515 y(I)367 526 y(T)394 536 y(E)421 526 y(X)18 b(ein)g(un)o(b)q(ek)m(ann)o
+(tes)g(W)l(ort)h(\014ndet,)g(dann)g(sieh)o(t)f(das)h(folgenderma\031en)164
+586 y(aus)e(\(am)e(Beispiel)f(des)j(W)l(ortes)782 616 y(")805
+586 y(Acet)o(ylsalicyl)o(s)1095 588 y(\177)1095 586 y(a)n(ure)m(\\)s(\):)164
+688 y Fc(`acetylsalicyls"aure')29 b(ist)e(ein)g(unbekanntes)g(Wort!)190
+748 y(0:)g(neues)f(Wort,)h(merken)g(in)g(`doku.lex')190 809
+y(1:)g(neues)f(Wort,)h(Trennstellen)h(angeben)g(und)e(merken)h(in)g
+(`doku.lex')190 869 y(9:)g(Tippfehler!)g(-)g(merken)g(im)f(File)h(`doku.edt')
+164 929 y(Bitte)g(waehlen)g(Sie)g(eine)f(Bedeutung)i(\(0,1,9\))f(aus:)164
+1032 y Ff(Nun)20 b(m)o(u\031)e(man)h(eine)g(Zi\013er)h(gefolgt)g(v)o(on)991
+1061 y(")1014 1032 y(En)o(ter)m(\\)j(eingeb)q(en.)31 b(Ist)20
+b(das)h(W)l(ort)f(b)q(ei-)164 1092 y(spielsw)o(eise)f(ein)h(kurzes)g(F)l
+(remdw)o(ort,)g(so)h(gibt)g(man)1196 1121 y(")1219 1092 y(0)m(\\)s(+)1305
+1121 y(")1328 1092 y(En)o(ter)m(\\)j(ein.)33 b(Ab)21 b(jetzt)164
+1152 y(ist)f(das)g(W)l(ort)g(b)q(ek)m(ann)o(t;)i(es)e(wird)f(jedo)q(c)o(h)h
+(nic)o(h)o(t)e(getrenn)o(t.)32 b(Es)20 b(wird)g(in)f(den)h(Files)164
+1212 y Fc(doku.mem)c Ff(und)e(auc)o(h)h Fc(doku.lex)g Ff(gesp)q(eic)o(hert,)f
+(um)f(es)h(nac)o(hher)g(ev)o(en)o(tuell)e(mit)g(dem)164 1272
+y Fd(LEXIK)o(ON)c Ff({System)17 b(leic)o(h)o(t)f(in)i(die)g(W)l(orttab)q
+(elle)g(ein)o(tragen)g(zu)g(k)1445 1274 y(\177)1445 1272 y(onnen.)28
+b(Handelt)164 1333 y(es)16 b(sic)o(h)g(b)q(ei)g(dem)f(un)o(b)q(ek)m(ann)o
+(ten)h(W)l(ort)h(ab)q(er)g(um)e(ein)g(langes)i(\(zusammengesetztes\))164
+1393 y(fremdes)k(W)l(ort,)i(so)g(ist)g(es)f(|)g(aus)h(den)f(ob)q(en)h(genann)
+o(ten)g(Gr)1385 1395 y(\177)1384 1393 y(unden)g(|)f(sinn)o(v)o(oll,)164
+1453 y(T)l(rennstellen)d(v)o(orzugeb)q(en.)33 b(Zu)20 b(diesem)e(Zw)o(ec)o(k)
+h(tippt)h(man)1364 1483 y(")1387 1453 y(1)m(\\)s(+)1473 1483
+y(")1496 1453 y(En)o(ter)m(\\)s(.)33 b(Dar-)164 1513 y(aufhin)16
+b(ersc)o(hein)o(t)f(dann)i(folgende)f(Eingab)q(eau\013orderung:)164
+1616 y Fc(Bitte)27 b(den)f(Trennvektor)i(angeben)190 1676 y(\(`-')f
+(Nebentrennstelle,)i(`=')d(Haupttrennstelle,)j(`.')e(Weiterruecken,)190
+1736 y(Trennstrich)h(unter)f(dem)f(Buchstaben)i(angeben,)f(hinter)h(dem)190
+1796 y(getrennt)f(werden)h(soll\):)164 1856 y(acetylsalicyls"aure)164
+1959 y Ff(Nun)16 b(k)m(ann)h(man)e(direkt)h(un)o(ter)f(dem)g(W)l(ort)i(die)e
+(T)l(rennstellen)g(angeb)q(en:)164 2061 y Fc(acetylsalicyls"aure)164
+2122 y(..-..=.-.-..=...-)164 2224 y Ff(Nac)o(hdem)20 b(man)498
+2254 y(")521 2224 y(En)o(ter)m(\\)25 b(gedr)779 2226 y(\177)778
+2224 y(uc)o(kt)c(hat,)j(ist)1073 2254 y(")1096 2224 y(acet)o(ylsalicyls)1374
+2226 y(\177)1374 2224 y(a)n(ure)m(\\)h(b)q(ek)m(ann)o(t)e(und)164
+2284 y(wird)16 b(gegeb)q(enenfalls)595 2314 y(")618 2284 y(ace-t)o
+(yl=sa-li-cyl=s)1020 2286 y(\177)1020 2284 y(a)n(u-re)m(\\)k(getrenn)o(t.)237
+2354 y(Als)e(dritte)f(W)l(ahlm)615 2356 y(\177)615 2354 y(o)o(glic)o(hk)o
+(eit)e(hat)k(man)e(no)q(c)o(h)1150 2383 y(")1173 2354 y(9)m(\\)s(+)1259
+2383 y(")1282 2354 y(En)o(ter)m(\\)s(.)26 b(Dann)19 b(wird)f(das)164
+2414 y(W)l(ort)23 b(ins)g(File)482 2444 y(")504 2414 y(doku.edt)m(\\)j(gesc)o
+(hrieb)q(en)c(und)h(k)m(ann)h(dann)f(b)q(eim)e(Editieren)h(v)o(on)164
+2504 y(")186 2474 y(doku.tex)m(\\)d(gesuc)o(h)o(t)d(und)h(ausgeb)q(essert)g
+(w)o(erden.)949 2599 y(12)p eop
+%%Page: 13 14
+bop 164 329 a Fr(10)340 315 y(\177)329 329 y(Anderung)27 b(der)g(W)-7
+b(orttab)r(elle)164 449 y Ff(Es)19 b(ist)f(zu)g(empfehlen,)e(sp)q(ezielle)g
+(W)863 451 y(\177)863 449 y(o)q(rter)i(des)g(b)q(en)o(utzereigenen)f(V)l(ok)m
+(abulars)i(auc)o(h)164 510 y(wirklic)o(h)j(in)h(die)g(W)l(orttab)q(elle)g
+(einzutragen.)43 b Fd(SiSiSi)29 b Ff(k)o(enn)o(t)23 b(n)1408
+512 y(\177)1408 510 y(amlic)o(h)e(nac)o(h)i(dem)164 570 y(Ein)o(tragen)18
+b(eines)g(solc)o(hen)f(neuen)h(W)l(ortes)h(auc)o(h)f(alle)g(Ab)o(w)o
+(andlungen)f(dieses)h(W)l(or-)164 630 y(tes,)e(die)g(durc)o(h)h(V)l
+(oransetzen)f(v)o(on)h(V)l(orsilb)q(en)f(o)q(der)h(auc)o(h)g(Anf)1360
+632 y(\177)1359 630 y(ugen)g(v)o(on)f(Endungen)164 690 y(en)o(tstehen,)24
+b(so)o(wie)f(alle)g(seine)g(Kom)o(binationen)f(mit)g(anderen)h(W)1453
+692 y(\177)1453 690 y(o)q(rtern.)43 b(Nat)1722 692 y(\177)1721
+690 y(ur-)164 750 y(lic)o(h)16 b(erk)o(enn)o(t)g Fd(SiSiSi)24
+b Ff(diese)17 b(W)753 752 y(\177)753 750 y(orter)g(dann)h(alle)f(ric)o(h)o
+(tig)f(und)i(trenn)o(t)f(sie)g(b)q(ei)g(Bedarf)164 811 y(k)o(orrekt.)28
+b(Beispielsw)o(eise)16 b(sind)j(k)o(eine)f(Tiernamen)f(in)h(der)h(normalen)f
+(W)l(orttab)q(elle.)164 871 y(T)l(r)214 873 y(\177)214 871
+y(agt)c(der)f(Ben)o(utzer,)f(der)g(ein)h(Tierbuc)o(h)f(sc)o(hreibt,)g(F)l(uc)
+o(hs)p 1148 879 122 2 v 13 w(als)h(Stamm)e(in)i(die)f(T)l(ab)q(el-)164
+931 y(le)17 b(ein,)h(dann)h(b)q(ehandelt)f Fd(SiSiSi)24 b Ff(auc)o(h)18
+b(F)l(uc)o(hses,)g(Silb)q(erfuc)o(hs,)f(F)l(uc)o(hssc)o(h)o(w)o(anz)g(und)164
+1021 y(")186 991 y(es)i(fuc)o(hst)f(mic)o(h)m(\\)h(k)o(orrekt)e(wie)h(jedes)g
+(andere)g(W)l(ort.)28 b(Allerdings)17 b(m)1505 993 y(\177)1504
+991 y(u)o(ssen)i(F)1669 993 y(\177)1668 991 y(uc)o(hse)164
+1051 y(w)o(egen)d(der)g(W)l(andlung)h(des)f(u)h(in)e(ein)890
+1053 y(\177)889 1051 y(u)h(gesondert)h(eingetragen)f(w)o(erden.)237
+1122 y(Man)25 b(sollte)g(n)o(ur)f(neue)h(W)l(ortst)860 1124
+y(\177)860 1122 y(a)q(mme)d(ein)o(tragen.)47 b(Bei)24 b(F)l(remdw)1539
+1124 y(\177)1539 1122 y(o)n(rtern)h(m)o(u\031)164 1182 y(man)c(jedo)q(c)o(h)i
+(darauf)g(ac)o(h)o(ten,)f(ob)h(eine)e(Ausnahme)g(zu)i(den)f(Duden{Regeln)g(v)
+o(or-)164 1243 y(liegt.)e(Dazu)15 b(m)o(u\031)f(man)g(sic)o(h)h(naturgem)929
+1245 y(\177)929 1243 y(a)o(\031)h(mit)d(dieser)h(Problematik)f(b)q(efassen,)j
+(z.B.)164 1303 y([5],)e([6])h(und)g([9].)20 b(Ausnahmen)14
+b(sind)h(z.B.)f(Pro-gramm,)f(Kata-strophe,)j(Pin-up-girl,)164
+1363 y(P)o(an-ora-ma.)22 b(Man)16 b(m)o(u\031)f(rec)o(h)o(t)g(sorgf)890
+1365 y(\177)890 1363 y(a)q(ltig)h(arb)q(eiten.)237 1434 y(Man)h(k)m(ann)f
+(folgende)g(Morphem-Arten)f(in)h(die)f(W)l(orttab)q(elle)h(ein)o(tragen:)p
+164 1511 1812 2 v 163 1571 2 61 v 237 1571 V 263 1553 a(Art)p
+854 1571 V 545 w(Kurzb)q(ezeic)o(hn)o(ung)p 1275 1571 V 52
+w(Erkl)1393 1555 y(\177)1393 1553 y(arung)p 1975 1571 V 164
+1573 1812 2 v 163 1693 2 121 v 189 1615 a(1)p 237 1693 V 50
+w(Stamm)p 854 1693 V 639 w(s)p 1275 1693 V 226 w(normaler)31
+b(Stamm,)i(wird)g(nac)o(h)1301 1675 y(Duden{Regeln)16 b(getrenn)o(t)p
+1975 1693 V 164 1695 1812 2 v 163 1935 2 241 v 189 1737 a(2)p
+237 1935 V 50 w(Stamm,)j(nic)o(h)o(t)f(geeignet)i(f)785 1739
+y(\177)784 1737 y(ur)263 1797 y(W)l(ortzusammensetzungen)p
+854 1935 V 1046 1737 a(st)p 1275 1935 V 217 w(Wie)49 b(1,)59
+b(jedo)q(c)o(h)50 b(k)m(ann)h(die-)1301 1797 y(ser)23 b(Stamm)d(nic)o(h)o(t)i
+(mit)e(anderen)1301 1857 y(zu)29 b(einem)e(zusammengesetzte)o(n)1301
+1917 y(W)l(ort)16 b(v)o(erkn)1545 1919 y(\177)1544 1917 y(u)o(pft)h(w)o
+(erden)p 1975 1935 V 164 1937 1812 2 v 163 2178 2 241 v 189
+1979 a(3)p 237 2178 V 50 w(Ausnahme)p 854 2178 V 426 w(a)g
+Fd(i)g(j)33 b Ff(o)q(der)g(a)17 b Fd(i)p 1275 2178 V 84 w Ff(Es)27
+b(wird)g(ab)o(w)o(eic)o(hend)f(v)o(on)h(den)1301 2039 y(Dudenregeln)k(nac)o
+(h)h(dem)e Fd(i)p Ff(-ten)1301 2100 y(und)14 b Fd(j)p Ff(-ten)h(Buc)o(hstab)q
+(en)f(getrenn)o(t)1301 2160 y(\(und)i(n)o(ur)g(dort\))p 1975
+2178 V 164 2179 1812 2 v 163 2420 2 241 v 189 2222 a(4)p 237
+2420 V 50 w(Ausnahme)f(mit)f(Ende{Mar-)263 2282 y(kierung)p
+854 2420 V 880 2222 a(au)j Fd(i)g(k)33 b Ff(o)q(der)g(au)17
+b Fd(k)p 1275 2420 V 50 w Ff(Wie)f(3,)g(jedo)q(c)o(h)h(de\014niert)e
+Fd(k)i Ff(k)o(eine)1301 2282 y(T)l(rennstelle,)37 b(nac)o(h)d(dem)e
+Fd(k)p Ff(-ten)1301 2342 y(Buc)o(hstab)q(en)17 b(setzen)f(die)h(Duden-)1301
+2402 y(Regeln)e(wieder)h(ein)p 1975 2420 V 164 2422 1812 2
+v 949 2599 a(13)p eop
+%%Page: 14 15
+bop 164 267 1805 2 v 163 328 2 61 v 237 328 V 263 309 a Ff(Art)p
+854 328 V 542 w(Kurzb)q(ezeic)o(hn)o(ung)p 1268 328 V 48 w(Erkl)1386
+311 y(\177)1386 309 y(arung)p 1968 328 V 164 329 1805 2 v 163
+450 2 121 v 189 371 a(5)p 237 450 V 50 w(V)l(orsilb)q(e)p 854
+450 V 613 w(v)p 1268 450 V 219 w(Nac)o(h)35 b(der)h(V)l(orsilb)q(e)g(wird)f
+(ge-)1294 432 y(trenn)o(t)p 1968 450 V 164 451 1805 2 v 163
+632 2 181 v 189 493 a(6)p 237 632 V 50 w(Endung)p 854 632 V
+623 w(e)p 1268 632 V 221 w(Die)16 b(Endung\(en\))i(wird)e(mit)f(dem)1294
+554 y(Stamm)9 b(zusammen)h(den)h(Duden{)1294 614 y(Regeln)16
+b(un)o(terw)o(orfen)p 1968 632 V 164 633 1805 2 v 237 709 a(Die)336
+698 y(\177)330 709 y(Anderung)21 b(der)g(W)l(orttab)q(elle)f(k)m(ann)i(man)d
+(auf)j(eine)d(der)i(folgenden)g(Arten)164 769 y(durc)o(hf)301
+771 y(\177)300 769 y(uhren:)218 881 y(a\))k(mit)14 b(dem)h(mitgelieferte)o(n)
+f(Lexik)o(on-System)g(auf)i(einem)e(PC)p 286 899 1148 2 v 286
+941 a(Auf)e(dem)g(PC)h(un)o(terst)713 943 y(\177)712 941 y(utzt)g(Sie)f(ein)g
+(Dialogsystem)g(b)q(eim)g(Einf)1466 943 y(\177)1465 941 y(u)o(gen)i(der)e
+(neuen)286 1002 y(W)336 1003 y(\177)336 1002 y(orter.)40 b(Sie)22
+b(brauc)o(hen)g(sic)o(h)f(um)h(Einzelheiten)e(der)i(Ko)q(dierung)h(nic)o(h)o
+(t)e(zu)286 1062 y(k)313 1064 y(\177)312 1062 y(ummern.)26
+b(Au\031erdem)17 b(zeigt)h(Ihnen)g(das)i(System)d(in)i(jedem)e(F)l(all)h(zur)
+g(Kon-)286 1122 y(trolle)d(an,)i(wie)e Fd(SiSiSi)23 b Ff(v)o(on)16
+b(n)o(un)g(an)h(die)e(fraglic)o(hen)g(W)1336 1124 y(\177)1336
+1122 y(o)q(rter)h(trennen)g(wird.)286 1203 y(Nac)o(h)i(der)505
+1192 y(\177)499 1203 y(Anderung)h(m)771 1205 y(\177)770 1203
+y(u)o(ssen)f(Sie)g(die)g(W)l(orttab)q(elle)g(w)o(orttab.h)o(tx)h(mit)d(dem)
+286 1263 y(h)o(tx2tex{Programm)d(in)h(die)g(un)o(ter)h(UNIX)1115
+1265 y(\177)1114 1263 y(ublic)o(he)e(Ko)q(dierung)i(\(4)g(f)1591
+1265 y(\177)1590 1263 y(ur)1651 1265 y(\177)1651 1263 y(a,)g
+Fa(:)8 b(:)g(:)f Ff(,)286 1323 y(1)17 b(f)343 1325 y(\177)342
+1323 y(ur)f(\031\))g(um)o(w)o(andeln.)k(Sie)15 b(erhalten)h(dadurc)o(h)g(das)
+h(neue)f(File)f(sih)o(yphen.tex.)215 1425 y(b\))25 b(durc)o(h)16
+b(Editieren)f(des)h(Files)f(sih)o(yphen.tex)p 286 1443 817
+2 v 286 1485 a(Sie)f(k)389 1487 y(\177)389 1485 y(onnen)h(unmittelbar)e(Ein)o
+(tragungen)i(in)f(der)h(Art)f(v)o(ornehmen,)f(wie)h(sie)g(in)286
+1545 y(obiger)20 b(T)l(ab)q(elle)f(b)q(esc)o(hrieb)q(en)g(sind.)31
+b(Sie)19 b(m)1135 1547 y(\177)1134 1545 y(u)o(ssen)h(dann)g(allerdings)g(die)
+f(\(b)q(e-)286 1606 y(n)o(utzerfreundlic)o(he)11 b(?\))21 b(Ko)q(dierung)15
+b(v)o(on)f(UNIX)e(b)q(eac)o(h)o(ten)h(und)i(erhalten)e(auc)o(h)286
+1666 y(k)o(eine)20 b(explizite)f(Angab)q(e)j(dar)870 1668 y(\177)869
+1666 y(u)q(b)q(er,)g(wie)f Fd(SiSiSi)28 b Ff(die)21 b(neuen)g(W)1528
+1668 y(\177)1528 1666 y(orter)h(sp)1699 1668 y(\177)1699 1666
+y(ater)286 1726 y(trennen)16 b(wird.)237 1838 y(Nac)o(h)i(Absc)o(hlu\031)f
+(dieser)723 1828 y(\177)717 1838 y(Anderungsarb)q(eiten)h(ist)g(in)g(b)q
+(eiden)g(F)1458 1840 y(\177)1458 1838 y(allen)f(a\))h(und)h(b\))164
+1899 y(S)191 1888 y(I)209 1899 y(T)236 1909 y(E)263 1899 y(X)c(bzw.)434
+1909 y(I)452 1899 y(S)479 1888 y(I)496 1899 y(T)523 1909 y(E)551
+1899 y(X)g(mit)f(initex)g(neu)i(zu)f(initialisieren,)e(so)j(wie)g(das)g(in)f
+(der)h(Instal-)164 1959 y(lationsanleitung)g(v)o(on)g(S)638
+1948 y(I)656 1959 y(T)683 1969 y(E)710 1959 y(X)g(bzw.)882
+1969 y(I)900 1959 y(S)927 1948 y(I)945 1959 y(T)972 1969 y(E)999
+1959 y(X)g(f)1068 1961 y(\177)1067 1959 y(ur)g(UNIX)e(b)q(esc)o(hrieb)q(en)i
+(ist.)949 2599 y(14)p eop
+%%Page: 15 16
+bop 164 315 a Fr(Literatur)191 436 y Ff([1])24 b(Kn)o(uth,)12
+b(Donald)h(E.:)19 b(T)703 446 y(E)731 436 y(X:)11 b(The)h(Program,)h(Addison)
+f(W)l(esley)l(,)g(Computers)f(and)267 496 y(T)o(yp)q(esetting,)k(V)l(ol.)h(B)
+191 598 y([2])24 b(Kn)o(uth,)16 b(Donald)h(E.:)k(The)16 b(T)813
+608 y(E)840 598 y(Xb)q(o)q(ok,)h(Addison)f(W)l(esley)191 699
+y([3])24 b(Lamp)q(ort,)30 b(Leslie:)43 b(L)687 693 y Fe(a)711
+699 y Ff(T)738 714 y(E)766 699 y(X.)27 b(A)g(do)q(cumen)o(t)f(preparation)i
+(system,)h(Addison)267 760 y(W)l(esley)191 861 y([4])24 b(Kopk)m(a,)17
+b(Helm)o(ut:)h(L)638 855 y Fe(a)662 861 y Ff(T)689 876 y(E)716
+861 y(X:)e(eine)f(Einf)973 863 y(\177)972 861 y(uhrung,)h(Addison)g(W)l
+(esley)191 963 y([5])24 b(Barth)15 b(W.,)f(Nirsc)o(hl)f(H.:)20
+b(Implem)o(en)o(ti)o(erung)12 b(eines)j(V)l(erfahrens)f(f)1498
+965 y(\177)1497 963 y(ur)h(die)f(Silb)q(en-)267 1023 y(trenn)o(ung,)h(TU)h
+(Wien,)f(Institut)g(f)910 1025 y(\177)909 1023 y(ur)h(Praktisc)o(he)f
+(Informatik,)f(Beric)o(h)o(t)g(Nr.)h(26,)267 1083 y(1985)191
+1185 y([6])24 b(Barth)14 b(W.,)g(Nirsc)o(hl)f(H.:)19 b(Sic)o(here)13
+b(sinnen)o(tsprec)o(hende)g(Silb)q(en)o(trenn)o(ung)g(f)1661
+1187 y(\177)1660 1185 y(ur)i(die)267 1245 y(deutsc)o(he)g(Sprac)o(he.)h
+(Angew)o(andte)g(Informatik)e(4,)j(S.)f(152{159)i(\(1985\))191
+1347 y([7])24 b(Barth)18 b(W.,)f(Steiner)g(H.:)24 b(Deutsc)o(he)17
+b(Silb)q(en)o(trenn)o(ung)g(f)1326 1349 y(\177)1325 1347 y(ur)h(T)1416
+1358 y(E)1443 1347 y(X)g(3.1,)g(D)o(ANTE,)267 1407 y(Die)e(T)383
+1418 y(E)410 1407 y(Xnisc)o(he)f(Kom)696 1409 y(\177)696 1407
+y(o)o(die,)g(Heft)h(1/1992)191 1509 y([8])24 b Fd(SiSiSi)h
+Ff(f)434 1511 y(\177)433 1509 y(ur)18 b(T)524 1520 y(E)551
+1509 y(X,)g(Installationsanleitung,)1114 1511 y(\177)1113 1509
+y(ub)q(er)h(anon)o(ymes)e(FTP)i(am)f(serv)o(er)267 1569 y Fc
+(eiunix.tuwien.ac.at)p Ff(.)191 1671 y([9])24 b(DUDEN,)12 b(Rec)o(h)o(tsc)o
+(hreibung)f(der)i(deutsc)o(hen)f(Sprac)o(he)h(und)g(der)g(F)l(remdw)1668
+1673 y(\177)1668 1671 y(o)o(rter.)267 1731 y(19.)24 b(Au\015age,)13
+b(Bibliographisc)o(hes)e(Institut,)h(Mannheim/Wien/Z)1531 1733
+y(\177)1530 1731 y(u)n(ric)o(h)f(\(1986\))949 2599 y(15)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex
new file mode 100644
index 0000000000..00609fa49f
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex
@@ -0,0 +1,678 @@
+\documentstyle[sigerman,12pt]{article}
+
+ \parskip0.5ex plus0.3ex minus0.2ex
+
+ \newcommand{\sisisi}{{\it SiSiSi\/}}
+ \newcommand{\lexikon}{{\it LEXIKON\/}}
+% \newcommand{\sitex}{{\it Si}\/\TeX}
+% \newcommand{\isitex}{{\it iSi}\/\TeX}
+ \newcommand{\sitex}{S\raisebox{0.5ex}{I}\TeX}
+ \newcommand{\isitex}{\raisebox{-0.5ex}{I}S\raisebox{0.5ex}{I}\TeX}
+
+ \setcounter{page}{0}
+
+\input{transfig}
+
+\begin{document}
+
+\renewcommand{\thefootnote}{\fnsymbol{footnote}}
+\title{\protect\isitex\\
+ Interaktive Silbentrennung f"ur die deutsche Sprache unter \TeX\
+ 3.14 und 3.141 unter UNIX\footnote[2]{UNIX ist Markenzeichen von AT\&T}}
+\renewcommand{\thefootnote}{\arabic{footnote}}
+\author{W. Barth \and H. Steiner \and H. Herbeck}
+
+% \onecolumn
+
+\thispagestyle{empty}
+\tableofcontents
+
+\maketitle
+
+\begin{abstract}
+Das speziell f"ur
+deutschsprachige Texte entwickelte \sisisi
+\begin{center}{\it
+SICHERE\\
+SINNENTSPRECHENDE\\
+SILBENTRENNUNG
+}\end{center}
+kann jetzt in \TeX\ und \LaTeX\ benutzt
+werden. Es gibt f"ur UNIX change--files und alle anderen
+notwendigen Files auf dem anonymous--FTP--server {\tt eiunix.tuwien.ac.at}.
+Dort findet man auch
+eine Installationsanleitung, mit der man das System leicht
+installieren kann. Dadurch wird ein
+neues System erzeugt, das das neue
+Verfahren f"ur die Silbentrennung
+verwendet. Alle anderen \TeX --Funktionen bleiben
+unver"andert.
+
+Es gibt zwei Varianten:
+Das einfache \sitex\ und das
+interaktive, voll ausgebaute \isitex. Das einfache \sitex\ kann nach der
+Installation genauso wie das urspr"ungliche \TeX\ verwendet werden. Es hat
+aber den Vorteil, da"s es auch bei unerwarteten Wortzusammensetzungen keine
+falschen Trennstellen erzeugt. Welche zus"atzlichen M"oglichkeiten
+\isitex\ bietet, ist in diesem Bericht beschrieben.
+\end{abstract}
+
+% \twocolumn
+
+\section{Terminologie}
+\begin{description}
+\item[{\rm \TeX}] ist Donald E.
+Knuths Formatierungsprogramm f"ur
+Texte \cite{KnuthProg},
+\cite{KnuthBook}.
+
+\item[\LaTeX] ist das von Leslie Lamport entwickelte Makro--Paket
+zu \TeX , das im deutschsprachigen Raum meist verwendet wird
+\cite{Lamport}, \cite{Kopka}. Ab sofort gilt \TeX\ synonym f"ur
+\TeX\ und \LaTeX, und
+die im folgenden beschriebenen Erweiterungen \sitex\ und \isitex\
+k"onnen sowohl auf \TeX\ als auch auf \LaTeX\ angewendet werden.
+
+\item[{\rm \sitex}] ist eine Variante von \TeX\ f"ur deutschsprachige Texte,
+die durch Austausch der "`hyphenation"' durch das von W.~Barth und
+H.~Nirschl entwickelte Verfahren zur "`sicheren
+sinnentsprechenden Silbentrennung (\sisisi)"' f"ur die deutsche
+Sprache \cite{BarthNi}, \cite{BarthNi2} entstanden ist.
+
+\item[{\rm \isitex}] ist eine um einige zus"atzliche M"oglichkeiten,
+insbesondere interaktive Komponenten, erweiterte Form von \sitex.
+\end{description}
+
+\section{SiSiSi}
+In der deutschen Sprache verwendet man gern lange,
+zusammengesetzte W"orter, wie z.B.:
+\begin{quote}
+Text=verarbeitungs=system oder
+Silben=trennungs=verfahren.
+\end{quote}
+ Wenn solche riesigen Gebilde nicht
+am Ende einer Zeile
+abgeteilt werden k"onnen, entsteht meist ein sehr
+unsch"ones Schriftbild. Das Hauptproblem bei der Silbentrennung
+ist das Finden der Nahtstellen (durch "`="' angezeigt) zwischen den
+Einzelw"ortern. Die Trennstellen
+innerhalb der Einzelw"orter lassen sich
+relativ leicht mit den im Duden
+\cite{duden} angegebenen Regeln
+ermitteln. \sisisi\ findet die
+Zerlegung der W"orter mit Hilfe einer Worttabelle,
+genauer einer Tabelle aller Wortbestandteile: Vorsilben,
+St"amme und Endungen. Weniger als 8000 Eintragungen reichen aus, um
+fast alle deutschen W"orter und die g"angigen Fremdw"orter zu
+erfassen. Durch die Abst"utzung des Verfahrens auf eine Worttabelle
+ist es nat"urlich m"oglich, auch mit unvorhersehbaren,
+ungew"ohnlichen Wortunget"umen fertig zu werden. Dieses
+Zerspalten zusammengesetzter W"orter mit einer einfachen,
+"uberschaubaren Methode bringt wesentliche Vorteile gegen"uber
+dem aus dem Amerikanischen "ubernommenen pattern--Verfahren.
+
+\sisisi\ sucht nach allen m"oglichen
+Zerlegungen eines Wortes. Bei manchen
+gibt es mehr als eine, wie z.B.:
+\begin{quote}
+Bau=mast/Baum=ast oder
+Stau=becken/Staub=ecken.
+\end{quote}
+ Wir bezeichnen das als
+{\bf Mehrdeutigkeit}. St"o"st \sisisi\ auf eine solche
+Mehrdeutigkeit,
+so nutzt die einfachere Implementierung \sitex\ die zweifelhafte Trennstelle
+nicht aus. Dadurch wird sichergestellt, da"s keine falschen Trennungen
+entstehen. Das interaktive
+\isitex\ h"alt w"ahrend der Bearbeitung
+des Dokuments bei
+jedem solchen mehrdeutigen Wort an, zeigt dem Benutzer alle
+m"oglichen Zerlegungen und erlaubt ihm, die passende
+auszuw"ahlen.
+
+Falls \sisisi\ f"ur ein Wort keine Zerlegung findet, dann handelt
+es sich dabei entweder um ein sehr ausgefallenes Wort (z.B.\
+Eigennamen oder "ahnliches), das nicht
+in der Worttabelle enthalten ist, oder das Wort wurde falsch
+geschrieben. Wir sprechen von einem
+{\bf unbekannten
+Wort}. Auch in diesen F"allen wird
+durch \sitex\ nicht getrennt, die
+Silbentrennung bleibt sicher. \isitex\ erlaubt aber
+dem Benutzer, je nachdem welcher Fall
+vorliegt, das unbekannte Wort zu
+korrigieren oder in die Worttabelle einzutragen.
+
+\sisisi\ unterst"utzt eine
+sinnentsprechende Trennung, indem es
+die {\bf Haupt\-trenn\-stellen} an
+den Nahtstellen
+zusammengesetzter W"orter gegen"uber
+den Nebentrennstellen in den
+Einzelw"ortern bevorzugt.
+
+Diese Bevorzugung wird durch
+Strafpunkte (penalties) gesteuert.
+Defaultm"a"sig erhalten die
+Nebentrennstellen einen h"oheren Wert
+als die Haupttrennstellen. Diese
+Relation kann aber von einem erfahrenen Benutzer durch
+den neuen \TeX--Befehl \verb/\nebenhyphenpenalty/ f"ur seine
+Installation ge"andert werden. Aber das wird f"ur normales
+Arbeiten kaum notwendig sein.
+
+\section{Kurzbeschreibung des Trennverfahrens}
+
+Jedes Wort ist eine Folge von einem oder mehreren
+Einzelw"ortern. Jedes Einzelwort besteht aus beliebig vielen
+Vorsilben (eventuell auch keinen), gefolgt von genau einem Stamm,
+abgeschlossen durch beliebig viele Endungen (ersatzweise
+Fugenzeichen). Eine Worttabelle enth"alt alle diese erw"ahnten
+Wortbestandteile (Morpheme).
+
+Der Algorithmus sucht f"ur jedes Wort, das eventuell getrennt
+werden soll, systematisch nach allen Zerlegungen, die nach der
+angegebenen Grammatik m"oglich sind. Dabei erkennt er durch
+Nachschauen in der Wort\-tabelle, ob ein betrachtetes Teilst"uck
+des Wortes ein Wortbestandteil im erw"ahnten Sinn ist und
+gegebenenfalls von welcher Art es ist.
+
+Auf diese Weise findet der Algorithmus f"ur jede Zerlegung alle
+Haupttrennstellen, n"amlich zwischen der letzten Endung eines
+Teilwortes und der folgenden Vorsilbe, bzw.\ dem folgenden Stamm.
+Au"serdem erkennt er auch sofort alle Nebentrennstellen hinter
+den Vorsilben. F"ur den Rest jedes Einzelworts, bestehend aus
+Stamm und Endungen, mu"s man die Duden--Regeln f"ur die Silbentrennung
+anwenden. Das sind solche Regeln wie "`In einer Folge von
+Konsonanten ist vor dem letzten zu trennen"', z.B. tre-ten,
+F"ul-lungen, k"amp-fen. Diese Regeln sind mit all ihren
+Ausnahmen, z.B. Sonderbehandlung von st und ck, vollst"andig in
+\sisisi\ eingearbeitet. Ebenso wird schon bei der Zerlegung in
+Einzelw"orter die
+3--Konsonanten--Regel ber"ucksichtigt.
+
+Es gibt W"orter, Fremdw"orter, die nicht nach
+den Duden--Regeln getrennt werden, z.B. Pro-gramm oder
+Pan-orama. In diesen F"allen ist in der Worttabelle der Stamm
+als "`Ausnahme"' deklariert und die m"oglichen Trennstellen sind
+angegeben. Der Algorithmus ber"ucksichtigt nat"urlich solche
+Angaben. Eine ausf"uhrliche Beschreibung des Verfahrens findet sich in
+\cite{BarthNi}.
+
+\section{Mehrdeutigkeiten}
+Nun gibt es im Deutschen das Problem,
+da"s viele, meist
+zusammengesetzte, W"orter existieren, die verschieden interpretiert
+und daher auch auf verschiedene Arten getrennt werden k"onnen.
+Das ergibt dann, sofern der Algorithmus eine unpassende
+Trennstelle w"ahlt, sinnentstellende Abtrennungen, die das
+fl"ussige Lesen erschweren. Einige Beispiele:
+\begin{quote}
+Wachs=tube/Wach=stube
+
+Bau=mast/Baum=ast
+
+Personal=mangel/Person=alm=angel
+
+Spiel=ende/spie-lende
+\end{quote}
+Alle anderen
+Trennverfahren, die die Einzelbestandteile von zusammengesetzten
+W"ortern (die "`Morpheme"') nicht
+erkennen (also auch die "`pattern--Methode"'), finden diese Mehrdeutigkeiten
+nicht. \sisisi\ (in \sitex) hingegen nutzt solche unsicheren
+Trennstellen generell nicht aus. Im Beispiel "`Bettruhe"' wird
+die angegebene Haupttrennstelle ignoriert. Nur die sichere
+Nebentrennstelle "`Bettru-he"' kommt in Frage. Hat man aber nur
+wenige sichere Trennstellen in langen, zusammengesetzten W"ortern,
+so k"onnen in manchen Zeilen (bei Randausgleich) gro"se L"ucken
+bzw.\ "`Stauchungen"' entstehen. Das Schriftbild wird unsch"on,
+h"aufig tritt die \TeX--Warnung "`underfull hbox"' auf.
+
+Dieses Problem wird in \isitex\ durch interaktives Eingreifen in
+den Produktionsvorgang gel"ost. Trifft \isitex\ auf ein
+mehrdeutiges Wort, so werden dem
+Benutzer alle m"oglichen Zerlegungen am
+Bildschirm angezeigt, soda"s er die in seinem Kontext sinngem"a"se
+ausw"ahlen kann. Diese Wahl mu"s f"ur ein solches mehrdeutiges
+Wort nur einmal getroffen werden, d.h.\ bei weiteren Vorkommen
+desselben Wortes in demselben Dokument
+soll dann immer automatisch
+diese richtige Trennung gew"ahlt werden. Dieser Forderung liegt
+die Erfahrung zugrunde, da"s ein
+mehrdeutiges Wort praktisch nie in
+demselben Dokument in verschiedenen
+Bedeutungen vorkommt. Au"serdem sind
+viele der von \sisisi\ "`erkannten"'
+Mehrdeutigkeiten im "ublichen Wortschatz nicht gebr"auchlich
+(siehe das Beispiel: Person=alm=angel). Weiters werden auch f"ur
+weitere Durchl"aufe (nach erneutem Editieren) die richtigen
+Trennstellen gemerkt und wieder verwendet.
+
+F"ur den Sonderfall, da"s ein mehrdeutiges Wort in mehreren
+Bedeutungen vorkommt, z.B. "`In der Wachstube liegt eine
+Wachstube"', gibt es die beiden folgenden M"oglichkeiten:
+\begin{itemize}
+\item Man macht "uberhaupt nichts. Dann werden nur die sicheren
+Trennstellen ausgenutzt. Es entstehen keine Trennfehler,
+allenfalls wird das Schriftbild etwas unruhig.
+\item Mit dem \TeX--Befehl \verb/\-/ tr"agt man beim Editieren
+bei allen (oder auch nur bei einigen ausgew"ahlten) Vorkommen
+des Wortes alle Trennstellen (oder nur einen Teil davon) ein.
+\isitex\ nutzt dann diese vorgegebenen Trennstellen aus, sucht
+aber in jedem Wort, das eine solche
+Vorgabe enth"alt, nicht nach
+weiteren Trennstellen.
+\end{itemize}
+
+Aber noch ein Vorfall mu"s beachtet werden. Wie kann der
+Benutzer, der irrt"umlich f"ur ein mehrdeutiges Wort eine
+falsche Trennvariante ausgew"ahlt hat, diesen Fehler wieder
+beseitigen? Bei jedem weiteren Durchlauf l"auft das Programm ohne Halt
+"uber alle Vorkommen dieses Wortes hinweg, es h"alt ja das
+Problem dieser Mehrdeutigkeit f"ur
+gel"ost. Deshalb wurde in
+\isitex\ am Anfang der Behandlung des Dokuments ein Halt
+eingef"ugt, bei dem der Benutzer aufgefordert wird, etwaige
+Fehler aus vorherigen Durchl"aufen wieder zu beseitigen.
+
+\section{Unbekannte W"orter}
+
+Alle W"orter, f"ur die \sisisi\ keine Zerlegung findet, sind
+{\bf unbekannte W"orter}. Das
+sind W"orter, die einen Schreibfehler
+enthalten, aber auch solche, die richtig
+geschrieben, dem \sisisi--Algorithmus aber noch unbekannt sind
+(d.h.\ die noch nicht in der
+Worttabelle sind). Die einfache L"osung
+von \sitex\ lautet: Solche Worte werden nicht getrennt. Die
+Folgen sind die gleichen wie bei mehrdeutigen W"ortern:
+L"ucken, Stauchungen, "`underfull
+hbox"' --- und wieder aus
+einem f"ur den Autor des Dokuments
+unerkl"arlichen Grund. Aber dennoch
+k"onnen keine Trennfehler entstehen!
+
+Das interaktive \isitex\ bleibt bei
+jedem unbekannten Wort stehen. Der Benutzer
+kann jetzt entscheiden, ob es sich um
+einen Tippfehler oder
+wirklich um ein unbekanntes Wort, d.h.\ um einen Namen, eine
+Abk"urzung, ein ausgefallenes Fremdwort oder etwas "Ahnliches
+handelt.
+Diese "`neuen W"orter"' sollen nur einmal als unbekannt gemeldet
+werden, also in den folgenden Produktionsl"aufen desselben
+Dokuments als bekannt akzeptiert werden. Tippfehler sollen
+hingegen immer angezeigt werden.
+
+Da aber ein Eingriff in das gerade bearbeitete \TeX--File nicht
+m"oglich ist (d.h.\ ein sofortiges Ausbessern der Tippfehler im
+Dokument ginge weit "uber den Einflu"sbereich der Silbentrennung
+hinaus und w"urde weitreichende Eingriffe in \TeX\ erfordern),
+speichert \isitex\ die vom Benutzer als "`Tippfehler"' bezeichneten W"orter
+in einem File, das man beim n"achsten Editieren als
+Ged"achtnisst"utze verwenden kann.
+
+ Welche neuen M"oglichkeiten \isitex\ bietet,
+ ist zusammenfassend in Abbildung~\ref{bild1} dargestellt.
+
+\begin{figure}
+\input{inst_ber.fg1}
+\caption{\label{bild1} Die neuen M"oglichkeiten}
+\end{figure}
+
+\section{\protect\isitex\ intern: Die neuen Files}
+\label{kapitel6}
+
+Um die obigen Erweiterungen zu erm"oglichen,
+werden die entsprechenden Informationen in
+drei Files gespeichert. "`doku"' steht im Folgenden f"ur
+den Namen des gerade bearbeiteten
+Dokuments.
+\begin{itemize}
+\item {\bf doku.mem}: Der Benutzer w"ahlt bei mehrdeutigen W"ortern
+die passende Bedeutung
+aus. Diese Wahl wird in \verb/doku.mem/ gespeichert.
+Von jetzt an werden
+alle Vorkommnisse dieses Wortes entsprechend dieser
+Festlegung getrennt.
+Achtung! Kommt ein Wort mit verschiedenen
+Endungen im Text vor, so
+wird f"ur jede Variante extra gefragt.
+(Kommt also in einem Dokument zB. dreimal
+"`Wachstube"' und f"unfmal "`Wachstuben"' vor,
+so mu"s der Benutzer je einmal die
+richtige Trennung f"ur "`Wachstube"' und
+"`Wachstuben"' angeben.) Ebenso werden
+alle W"orter, die dem System unbekannt
+sind und f"ur das Dokument spezielle
+Fremdw"orter oder Namen
+darstellen, durch ein Kommando des
+Benutzers (eventuell mit den
+eingegebenen Trennstellen) in \verb/doku.mem/ gespeichert.
+Diese Information wird dann bei allen weiteren
+\isitex\ Produktionsl"aufen
+ber"ucksichtigt und entsprechend erweitert (wenn beim
+weiteren Editieren neue mehrdeutige
+oder unbekannte W"orter hinzugef"ugt wurden).
+\item {\bf doku.lex}: Bei mehrdeutigen
+und insbesondere bei unbekannten
+W"ortern, kann sich der
+Benutzer dazu entschlie"sen, da"s sie
+(zus"atzlich zu der erw"ahnten
+Eintragung in \verb/doku.mem/) in die
+Worttabelle von \sisisi\ eingetragen
+werden sollen. Unbekannte W"orter kommen
+daher automatisch und mehrdeutige
+W"orter auf Wunsch in das File
+\verb/doku.lex/, damit sie leicht mit dem "`\lexikon--System"' am
+PC in die Worttabelle eingetragen
+werden k"onnen. So ist
+es dem Benutzer m"oglich, eine
+spezielle Worttabelle f"ur seinen
+pers"onlichen Wortschatz zu schaffen.
+
+\item {\bf doku.edt}: Alle als Tippfehler erkannten W"orter
+werden in das File \verb/doku.edt/
+ geschrieben. Dieses File unterscheidet sich
+grunds"atzlich von den beiden obigen. Eintragungen in diesem
+ File werden nicht automatisch f"ur weitere Vorkommen
+desselben Wortes und
+ auch nicht f"ur weitere Durchl"aufe verwendet. Es ist
+als "`Merkfile"' des
+ Benutzers f"ur das n"achste Editieren
+ gedacht. Er kann es daher anschauen, ausdrucken,
+editieren und l"oschen.
+ Weiters wird dieses File bei jedem
+ Durchlauf neu angelegt. Das ist sinnvoll, weil
+Tippfehler ja nicht hingenommen werden sollen (weder von \isitex\
+ noch vom Benutzer). Es werden
+ also immer alle Tippfehler gemeldet. Das wiederholte
+ Aufmerksammachen ist durchaus beabsichtigt.
+\end{itemize}
+Die Files \verb/doku.mem/ und
+\verb/doku.lex/ d"urfen nicht vom Benutzer
+ver"andert werden, weil sie vom System
+wieder verwendet werden.
+\verb/doku.edt/ darf ge"andert oder
+zerst"ort werden.
+
+\section{Wie erzeugt man ein
+druckfertiges Manuskript mit
+\protect\isitex ?}
+
+Beim \underline{ersten Editieren} bereitet
+man das Manuskript genauso wie f"ur
+"`normales"' \TeX\ auf. Die
+Befehle f"ur die Fonts, die
+Formate, usw.\ f"ugt man in den Text ein.
+
+Beim \underline{ersten Durchlauf} durch
+das \isitex--System beantwortet man die Fragen
+des Systems bez"uglich mehrdeutiger und
+unbekannter W"orter sinnvoll. Es entstehen die Files
+\verb/doku.mem/, \verb/doku.lex/ und
+\verb/doku.edt/ (siehe Abbildung
+\ref{bild2}).
+
+Im allgemeinen wird man
+auch das entstandene
+\underline{File drucken},
+um weitere Hinweise f"ur Korrekturen im
+Manuskript zu erhalten. In diesem
+Ausdruck sind schon alle Trennstellen
+ber"ucksichtigt, die man ---~wie in
+Kapitel~\ref{kapitel6} beschrieben~---
+an das File
+\verb/doku.mem/ gemeldet hat.
+
+Jetzt kann man die
+\underline{Worttabelle} mit dem System
+\lexikon\ erweitern. Man wird (siehe
+Kapitel~\ref{kapitel10}) alle speziellen
+W"orter dieses Dokuments, bzw.\ des
+Fachvokabulars eintragen. \lexikon\
+benutzt dabei das File \verb/doku.lex/.
+
+Danach erfolgt das \underline{n"achste
+Editieren}. Mit den Hinweisen aus dem
+File \verb/doku.edt/ und den
+Erkenntnissen vom Korrekturlesen wird
+man insbesondere alle Tippfehler
+korrigieren, aber auch andere
+Korrekturen im Manuskript vornehmen.
+
+Beim folgenden \underline{n"achsten Durchlauf}
+bleibt das System nicht mehr bei
+allen mehrdeutigen und unbekannten
+W"ortern, die in einem fr"uheren
+Durchlauf in \verb/doku.mem/
+eingetragen wurden, stehen. Am
+Anfang dieses Durchlaufs gibt es jedoch
+Gelegenheit, fr"uhere
+falsche Festlegungen zu l"oschen. Neue
+mehrdeutige oder unbekannte W"orter
+(auch alte Tippfehler) werden wie im
+ersten Durchgang behandelt.
+
+Diese Vorg"ange werden solange
+wiederholt, bis die Qualit"at des
+gedruckten Manuskripts den Anspr"uchen
+gen"ugt.
+
+Die Wege, die die Daten nehmen, sind in
+Abbildung~\ref{bild2} zusammenfassend
+dargestellt.
+
+\begin{figure}
+\input{inst_ber.fg2}
+\caption{\label{bild2} Die Wege der Daten}
+\end{figure}
+
+
+\section{"`xxx"' ist ein mehrdeutiges Wort! --- was tun?}
+
+ Wenn \isitex\ ein mehrdeutiges Wort findet, dann
+ sieht das folgenderma"sen aus (am Beispiel des
+ Wortes "`Wachstube"'):
+\begin{verbatim}
+`wachstube' ist ein mehrdeutiges Wort!
+ 0: nur die sicheren Trennstellen waehlen (`wachstu-be')
+ 1: `wach=stu-be'
+ 2: `wachs=tu-be'
+ 9: Tippfehler! - merken im File `doku.edt'
+Bitte waehlen Sie eine Bedeutung z.B. `0'+`Enter' aus:
+ (zusaetzlich E z.B. `0E'+`Enter':
+ Wort auch fuer LEXIKON vormerken)
+\end{verbatim}
+ Nun mu"s man eine Ziffer gefolgt von "`Enter"'
+ eingeben. Ist z.B. die Bedeutung "`Wach=stube"'
+ die gemeinte, so gibt man "`1"'+"`Enter"' ein. Ab
+ jetzt wird das Wort "`Wachstube"' im ganzen Dokument und
+auch in k"unftigen Durchl"aufen entsprechend getrennt. Tritt der
+"uberaus seltene
+ Fall auf, da"s ein Wort tats"achlich in mehreren
+Bedeutungen in ein und demselben Dokument
+ vorkommt, so kann man sich durch "`0"'+"`Enter"' auf
+ die sicheren Trennstellen beschr"anken. Will
+ man das Wort sp"ater auch in die Worttabelle eintragen,
+so gibt man zus"atzlich noch ein "`E"' an (also zB. "`1E"'+"`Enter"' statt
+"`1"'+"`Enter"'). Dadurch wird das Wort
+ zus"atzlich in das File \verb/doku.lex/ eingetragen, das
+die Arbeit mit dem Lexikon--System
+ erleichtert. Gibt man "`9"'+"`Enter"' ein, so wird
+ das Wort nur (!) ins File \verb/doku.edt/ geschrieben
+und kann dann beim Editieren von
+\verb/doku.tex/ gesucht und ausgebessert werden.
+
+\newpage
+
+\section{"`xxx"' ist ein unbekanntes Wort! --- was tun?}
+
+ Wenn \isitex\ ein unbekanntes Wort findet, dann
+ sieht das folgenderma"sen aus (am Beispiel des
+ Wortes "`Acetylsalicyls"aure"'):
+\begin{verbatim}
+`acetylsalicyls"aure' ist ein unbekanntes Wort!
+ 0: neues Wort, merken in `doku.lex'
+ 1: neues Wort, Trennstellen angeben und merken in `doku.lex'
+ 9: Tippfehler! - merken im File `doku.edt'
+Bitte waehlen Sie eine Bedeutung (0,1,9) aus:
+\end{verbatim}
+ Nun mu"s man eine Ziffer gefolgt von "`Enter"'
+ eingeben. Ist das Wort beispielsweise ein kurzes Fremdwort,
+so gibt man "`0"'+"`Enter"' ein. Ab
+ jetzt ist das Wort bekannt; es wird jedoch
+ nicht getrennt. Es wird in den Files
+\verb/doku.mem/ und auch \verb/doku.lex/
+gespeichert, um es nachher eventuell
+mit dem \lexikon--System leicht in die
+ Worttabelle eintragen zu k"onnen. Handelt es
+ sich bei dem unbekannten Wort aber um ein
+ langes (zusammengesetztes) fremdes
+Wort, so ist
+ es --- aus den oben genannten Gr"unden --- sinnvoll,
+Trennstellen vorzugeben. Zu diesem Zweck
+ tippt man "`1"'+"`Enter"'. Daraufhin erscheint dann
+ folgende Eingabeaufforderung:
+\begin{verbatim}
+Bitte den Trennvektor angeben
+ (`-' Nebentrennstelle, `=' Haupttrennstelle, `.' Weiterruecken,
+ Trennstrich unter dem Buchstaben angeben, hinter dem
+ getrennt werden soll):
+acetylsalicyls"aure
+\end{verbatim}
+ Nun kann man direkt unter dem Wort die Trennstellen angeben:
+\begin{verbatim}
+acetylsalicyls"aure
+..-..=.-.-..=...-
+\end{verbatim}
+ Nachdem man "`Enter"' gedr"uckt hat, ist
+ "`acetylsalicyls"aure"' bekannt und wird gegebenenfalls
+ "`ace-tyl=sa-li-cyl=s"au-re"' getrennt.
+
+ Als dritte Wahlm"oglichkeit hat man noch "`9"'+"`Enter"'. Dann
+wird das Wort ins File "`doku.edt"'
+ geschrieben und kann dann beim Editieren von
+ "`doku.tex"' gesucht und ausgebessert werden.
+
+\section{"Anderung der Worttabelle}
+\label{kapitel10}
+
+Es ist zu empfehlen, spezielle W"orter
+des benutzereigenen Vokabulars auch
+wirklich in die Worttabelle
+einzutragen. \sisisi\ kennt n"amlich
+nach dem Eintragen eines solchen neuen
+Wortes auch alle Abwandlungen dieses
+Wortes, die durch Voransetzen von
+Vorsilben oder auch Anf"ugen von
+Endungen entstehen, sowie alle seine
+Kombinationen mit anderen W"ortern.
+Nat"urlich erkennt \sisisi\ diese
+W"orter dann alle richtig und trennt
+sie bei Bedarf korrekt.
+Beispielsweise sind keine Tiernamen in
+der normalen Worttabelle. Tr"agt der
+Benutzer, der ein Tierbuch schreibt,
+\underline{Fuchs} als Stamm in die
+Tabelle ein, dann behandelt \sisisi\
+auch Fuchses, Silberfuchs, Fuchsschwanz
+und "`es fuchst mich"' korrekt wie
+jedes andere Wort. Allerdings m"ussen
+F"uchse wegen der Wandlung des u in ein
+"u gesondert eingetragen werden.
+
+Man sollte nur neue
+Wortst"amme eintragen. Bei
+Fremdw"ortern mu"s man jedoch darauf
+achten, ob eine Ausnahme zu den
+Duden--Regeln vorliegt. Dazu mu"s man
+sich naturgem"a"s mit dieser
+Problematik befassen, z.B.
+\cite{BarthNi}, \cite{BarthNi2} und \cite{duden}. Ausnahmen sind z.B.
+Pro-gramm, Kata-strophe, Pin-up-girl,
+Pan-ora-ma. Man mu"s recht sorgf"altig
+arbeiten.
+
+Man kann folgende Morphem-Arten in die Worttabelle eintragen:\\
+
+\noindent
+\begin{tabular}{|r|p{4.8cm}|c|p{5.5cm}|}\hline
+ & Art & Kurzbezeichnung & Erkl"arung\\ \hline
+1 & Stamm & s & normaler Stamm, wird nach Duden--Regeln getrennt\\ \hline
+2 & Stamm, nicht geeignet f"ur Wortzusammensetzungen & st & Wie 1, jedoch
+kann dieser Stamm nicht mit anderen zu einem zusammengesetzten Wort
+verkn"upft werden\\ \hline
+3 & Ausnahme & a {\it i j}~~oder~~a {\it i} & Es wird
+abweichend von den Dudenregeln nach dem {\it i}-ten und {\it j}-ten
+Buchstaben getrennt (und nur dort)\\ \hline
+4 & Ausnahme mit Ende--Mar\-kie\-rung & au {\it i k}~~oder~~au {\it k} &
+Wie 3, jedoch definiert {\it k} keine Trennstelle, nach dem
+{\it k}-ten Buchstaben setzen die Duden-Regeln wieder ein\\ \hline
+\end{tabular}
+\begin{tabular}{|r|p{4.8cm}|c|p{5.5cm}|}\hline
+ & Art & Kurzbezeichnung & Erkl"arung\\ \hline
+5 & Vorsilbe & v & Nach der Vorsilbe wird ge\-trennt\\ \hline
+6 & Endung & e & Die Endung(en) wird mit dem Stamm zusammen den
+Duden--Regeln unterworfen\\ \hline
+\end{tabular}\\
+
+Die "Anderung der Worttabelle kann man auf eine der folgenden Arten
+durchf"uhren:
+\begin{itemize}
+\item[a)] \underline{mit dem mitgelieferten Lexikon-System auf einem PC}\\
+Auf dem PC unterst"utzt Sie ein Dialogsystem beim Einf"ugen der neuen
+W"orter. Sie brauchen sich um Einzelheiten der Kodierung nicht zu k"ummern.
+Au"serdem zeigt Ihnen das System in jedem Fall zur Kontrolle an, wie
+\sisisi\ von nun an die fraglichen W"orter trennen wird.
+
+Nach der "Anderung m"ussen Sie die Worttabelle worttab.htx mit dem
+htx2tex--Programm in die unter UNIX "ubliche Kodierung (4 f"ur "a, \dots, 1
+f"ur "s) umwandeln. Sie erhalten dadurch das neue File sihyphen.tex.
+\item[b)] \underline{durch Editieren des Files sihyphen.tex}\\
+Sie k"onnen unmittelbar Eintragungen in der Art vornehmen, wie sie in
+obiger Tabelle beschrieben sind. Sie m"ussen dann allerdings die
+(benutzerfreundliche ?) Kodierung von UNIX beachten und erhalten auch keine
+explizite Angabe dar"uber, wie \sisisi\ die neuen W"orter sp"ater trennen
+wird.
+\end{itemize}
+
+Nach Abschlu"s dieser "Anderungsarbeiten ist in beiden F"allen a) und b)
+\sitex\ bzw. \isitex\ mit initex neu zu initialisieren, so wie das in der
+Installationsanleitung von \sitex\ bzw. \isitex\ f"ur UNIX beschrieben ist.
+
+\newpage
+
+\begin{thebibliography}{[8]}
+ \bibitem{KnuthProg} Knuth, Donald E.: \TeX: The
+Program, Addison Wesley, Computers and Typesetting, Vol.\ B
+ \bibitem{KnuthBook} Knuth, Donald E.: The \TeX book,
+Addison Wesley
+ \bibitem{Lamport} Lamport, Leslie: \LaTeX. A document
+preparation system, Addison Wesley
+ \bibitem{Kopka} Kopka, Helmut: \LaTeX: eine Einf"uhrung,
+Addison Wesley
+ \bibitem{BarthNi} Barth W., Nirschl H.: Implementierung eines
+Verfahrens f"ur die Silbentrennung, TU~Wien, Institut f"ur
+Praktische Informatik, Bericht Nr.~26, 1985
+ \bibitem{BarthNi2} Barth W., Nirschl
+H.: Sichere sinnentsprechende
+Silbentrennung f"ur die deutsche
+Sprache. Angewandte Informatik~4,
+S.~152--159 (1985)
+ \bibitem{Dante} Barth W., Steiner H.:
+Deutsche Silbentrennung f"ur \TeX\ 3.1,
+DANTE, Die \TeX nische Kom"odie, Heft 1/1992
+ \bibitem{FTP} \sisisi\ f"ur \TeX,
+Installationsanleitung, "uber anonymes
+FTP am server \verb/eiunix.tuwien.ac.at/.
+ \bibitem{duden} DUDEN, Rechtschreibung
+der deutschen Sprache und der
+Fremdw"orter. 19.~ Auflage,
+Bibliographisches Institut,
+Mannheim/Wien/Z"urich (1986)
+\end{thebibliography}
+
+\end{document}
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc
new file mode 100644
index 0000000000..5903a5939b
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc
@@ -0,0 +1,10 @@
+\contentsline {section}{\numberline {1}Terminologie}{2}
+\contentsline {section}{\numberline {2}SiSiSi}{2}
+\contentsline {section}{\numberline {3}Kurzbeschreibung des Trennverfahrens}{3}
+\contentsline {section}{\numberline {4}Mehrdeutigkeiten}{4}
+\contentsline {section}{\numberline {5}Unbekannte W\active@dq orter}{6}
+\contentsline {section}{\numberline {6}\isitex \ intern: Die neuen Files}{8}
+\contentsline {section}{\numberline {7}Wie erzeugt man ein druckfertiges Manuskript mit \isitex ?}{9}
+\contentsline {section}{\numberline {8}\active@dq `xxx\active@dq ' ist ein mehrdeutiges Wort! --- was tun?}{10}
+\contentsline {section}{\numberline {9}\active@dq `xxx\active@dq ' ist ein unbekanntes Wort! --- was tun?}{12}
+\contentsline {section}{\numberline {10}\active@dq Anderung der Worttabelle}{13}
diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex
new file mode 100644
index 0000000000..2f40b0af18
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex
@@ -0,0 +1 @@
+\typeout{TransFig: figures in PostScript.}
diff --git a/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex b/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex
new file mode 100644
index 0000000000..48e8ba0e57
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex
@@ -0,0 +1,48 @@
+% "DEF_UMLAUT.TEX" definitions of "dirty" umlauts
+
+\def\dirtyumlaut#1{\if#1A{\discretionary
+{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{{\accent"7F A}}}\else
+\if#1O{\discretionary
+{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{{\accent"7F O}}}\else
+\if#1U{\discretionary
+{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{{\accent"7F U}}}\else
+\if#1a{\discretionary
+{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{{\accent"7F a}}}\else
+\if#1o{\discretionary
+{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{{\accent"7F o}}}\else
+\if#1u{\discretionary
+{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{{\accent"7F u}}}\else
+\if#1s{%\discretionary --- test
+%{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{}
+{\ss}}\else{{\accent"7F #1}}\fi\fi\fi\fi\fi\fi\fi}
+
+
+\catcode`^^c4=11 % Ae
+\catcode`^^d6=11 % Oe
+\catcode`^^dc=11 % Ue
+\catcode`^^e4=11 % ae
+\catcode`^^f6=11 % oe
+\catcode`^^fc=11 % ue
+% \catcode`^^ff=11 % ss, sz
+
+\lccode`^^c4=`^^e4 % Ae --> ae
+\lccode`^^d6=`^^f6 % Oe --> oe
+\lccode`^^dc=`^^fc % Ue --> ue
+\lccode`^^e4=`^^e4 % ae --> ae
+\lccode`^^f6=`^^f6 % oe --> oe
+\lccode`^^fc=`^^fc % ue --> ue
+% \lccode`^^ff=`^^ff % ss, sz --> ss, sz
+
+\uccode`^^c4=`^^c4 % Ae --> Ae
+\uccode`^^d6=`^^d6 % Oe --> Oe
+\uccode`^^dc=`^^dc % Ue --> Ue
+\uccode`^^e4=`^^c4 % ae --> Ae
+\uccode`^^f6=`^^d6 % oe --> Oe
+\uccode`^^fc=`^^dc % ue --> Ue
+% \uccode`^^ff=`^^ff % ss, sz --> ss, sz ? uccode`^^ff=`^^df
+
+
+\catcode`^^Y=11 % ss,sz
+\lccode`^^Y=`^^Y
+\uccode`^^Y=`^^Y
+
diff --git a/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc b/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc
new file mode 100644
index 0000000000..fabcaf533f
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc
@@ -0,0 +1,27 @@
+==============================================================================
+
+HTX2TEX.exe dient zum Konvertieren der SISISI-Klarschrift-Worttabelle
+(mit LEXIKON.exe erstellt) in die f"ur TeX notwendige Form. Dabei werden
+vor allem die Umlaute nach folgendem Schema in Ziffern umcodiert:
+
+"a -> 4
+"o -> 3
+"u -> 2
+"s -> 1
+
+Weiters werden einige zus"atzliche Trennzeichen wie Punkte (.) und
+Beistriche (,) eingef"ugt. Die Attribute der einzelnen Wortbestandteile
+werden nicht ver"andert und haben folgende Bedeutung (x und y sind Ziffern):
+
+s ... Stamm
+v ... Vorsilbe
+e ... Endung
+st ... Stamm, der alleine stehen mu"s
+a x ... Ausnahme, Trennstelle nach dem x-ten Buchstaben
+a x y ... Ausnahme, Trennstellen nach dem x-ten Buchtaben und nach
+ dem y-ten Buchstaben
+au x ... Ausnahme, untrennbar bis zum x-ten Buchstaben
+au x y ... Ausnahme, Trennstelle nach dem x-ten Buchstaben, sonst nicht
+ trennen bis zum y-ten Buchstaben
+
+==============================================================================
diff --git a/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex b/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex
new file mode 100644
index 0000000000..90dbc8cd81
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex
@@ -0,0 +1,5577 @@
+\patterns{
+ab.vst,
+abakus.s,
+abel.e,
+abend.s,
+abenteuer.s,
+aber.vst,
+able.e,
+abonn.s,
+absolut.s,
+abstrahier.a.2,
+abstrakt.a.2,
+absurd.s,
+absze1.a.2,
+abt.s,
+ach.st,
+ache.s,
+achs.s,
+achsel.s,
+acht.s,
+acker.s,
+adapt.a.2,
+ad4quat.a.2,
+add.s,
+ade.s,
+adel.s,
+ader.s,
+adjektiv.s,
+adler.s,
+administrat.a.2.6,
+adress.a.5,
+advent.s,
+aero.v,
+aff.s,
+afrika.s,
+age.e,
+agent.s,
+aggress.a.2,
+aha.st,
+ahm.s,
+ahn.s,
+ahorn.s,
+aids.s,
+akadem.s,
+akazie.s,
+akkord.s,
+akkordeon.s,
+akt.s,
+aktiv.s,
+aktualit4t.s,
+aktuell.s,
+akust.s,
+akzept.s,
+akzeptanz.s,
+al.e,
+alarm.s,
+album.s,
+alemann.s,
+alfabet.s,
+alge.s,
+algebra.a.2.4,
+algorithm.s,
+algorithmus.s,
+alisch.e,
+alisier.e,
+alkohol.s,
+alkoholiker.s,
+all.s,
+allein.s,
+allerdings.s,
+alles.s,
+alli.s,
+allm4hlich.s,
+allzu.s,
+alm.s,
+almose.s,
+alp.s,
+alphabet.s,
+als.st,
+also.st,
+alt.s,
+altar.s,
+alter.s,
+alternativ.s,
+aluminium.s,
+am.st,
+amateur.s,
+ambition.s,
+ambo1.s,
+ambulat.s,
+ameise.s,
+amen.s,
+amerika.s,
+amok.s,
+ampel.s,
+amsel.s,
+amt.s,
+an.vst,
+analog.s,
+analys.s,
+analytisch.s,
+ananas.s,
+and.e,
+ander.s,
+anderer.s,
+anderswo.s,
+angel.s,
+anger.s,
+angina.s,
+angst.s,
+anim.s,
+animo.s,
+animus.s,
+anker.s,
+annuit4t.s,
+anonym.a.2,
+anorak.s,
+ans4ssig.s,
+ant.e,
+anteil.s,
+antenn.s,
+anthropo.a.2,
+anti.v,
+antlitz.s,
+antwort.s,
+anz.e,
+aper.s,
+apfel.s,
+apostel.s,
+apotheke.s,
+apparat.s,
+appell.s,
+appetit.s,
+applaudier.a.2,
+applaus.a.2,
+approxim.a.2.5,
+april.a,
+aquarium.s,
+arbeit.s,
+arbeiter.s,
+architekt.s,
+architekton.s,
+architektur.s,
+archiv.s,
+arg.s,
+argument.s,
+ariat.e,
+aristokrat.a.3.6,
+arit4t.e,
+arithmet.s,
+arm.s,
+armut.s,
+aroma.s,
+art.s,
+arthritis.a.2.6,
+artikel.s,
+artikul.s,
+arznei.s,
+arzt.s,
+asbest.s,
+asch.s,
+asiat.s,
+aspekt.au.4,
+asphalt.s,
+assistent.s,
+assistenz.s,
+assistier.s,
+ast.s,
+astro.au.4,
+a1.s,
+at.e,
+atelier.s,
+atem.s,
+athlet.s,
+ation.e,
+atlas.s,
+atm.s,
+atmosph4r.a.2.4,
+atom.s,
+atomar.s,
+attentat.s,
+attent4ter.s,
+attest.s,
+attrakt.a.2,
+au.s,
+auch.st,
+auf.vs,
+aufs.st,
+aug.s,
+august.s,
+aus.vst,
+austral.a.2,
+austria.a,
+au1en.s,
+au1er.s,
+au1erdem.s,
+auto.vs,
+autobahn.s,
+autodrom.a.4,
+automat.s,
+automatisch.s,
+autor.s,
+avanc.s,
+avantgard.s,
+axiom.s,
+axt.st,
+4cht.s,
+4chz.s,
+4ff.s,
+4hn.s,
+4hre.s,
+4lt.s,
+4mt.s,
+4nder.s,
+4ngst.s,
+4pfel.s,
+4quivalent.s,
+4quivalenz.s,
+4r.e,
+4rg.s,
+4rger.s,
+4rm.s,
+4rzt.s,
+4st.s,
+4sthet.a.2,
+4t.e,
+4tz.s,
+4ug.s,
+4u1er.s,
+4xte.s,
+baby.a.2,
+bach.s,
+back.s,
+bad.s,
+baff.s,
+bagger.s,
+bahn.s,
+bahr.s,
+balanc.s,
+bald.s,
+baldrian.s,
+balg.s,
+balken.s,
+balkon.s,
+ball.s,
+ballett.s,
+ballon.s,
+balsam.s,
+balz.s,
+banal.s,
+banane.s,
+band.s,
+bandag.s,
+bang.s,
+banjo.s,
+bank.s,
+bann.s,
+bar.evst,
+baracke.s,
+barg.s,
+barm.s,
+baro.v,
+barock.s,
+barren.s,
+barsch.s,
+bart.s,
+bas.s,
+basis.s,
+bast.s,
+ba1.s,
+bat.s,
+bau.s,
+bauch.s,
+bauer.s,
+baum.s,
+bausch.s,
+bazillen.s,
+bazillus.s,
+b4ch.s,
+b4ck.s,
+b4cker.s,
+b4d.s,
+b4hn.s,
+b4lk.s,
+b4ll.s,
+b4nd.s,
+b4ng.s,
+b4nk.s,
+b4r.s,
+b4rt.s,
+b4sse.s,
+b4uch.s,
+b4uer.s,
+b4um.s,
+b4usch.s,
+be.v,
+beb.s,
+becher.s,
+becken.s,
+beef.s,
+beer.s,
+beerd.a.2,
+beet.s,
+begann.s,
+beginn.s,
+begonn.s,
+behend.s,
+beh3rd.s,
+bei.vst,
+beicht.s,
+beid.s,
+beige.s,
+beil.s,
+beim.st,
+bein.s,
+beinhalt.a.2,
+bei1.s,
+beiz.s,
+bejah.s,
+bell.s,
+bengel.s,
+benzin.s,
+bequem.s,
+berg.s,
+bergab.a.4,
+bergauf.a.4,
+ber2chtigt.s,
+beschwerd.s,
+beschwerde.a.2,
+besen.s,
+besser.s,
+best.s,
+best4tig.s,
+besteh.s,
+bet.s,
+bet4ub.s,
+betrieb.a.2,
+bett.s,
+beug.s,
+beul.s,
+beut.s,
+beutel.s,
+bezirk.s,
+bibel.s,
+biber.s,
+bibl.s,
+biblio.a.2,
+bibliothek.a.2,
+bieg.s,
+biene.s,
+bier.s,
+biet.s,
+bikini.a.2.4,
+bilanz.s,
+bild.s,
+billig.s,
+billiger.s,
+bin.st,
+bin4r.s,
+bind.s,
+binnen.s,
+bio.v,
+biolog.s,
+birg.s,
+birk.s,
+birn.s,
+birne.s,
+bis.s,
+bischof.s,
+bisch3f.s,
+bisher.s,
+biskott.s,
+biskuit.a.3,
+biss.s,
+bist.st,
+bi1.s,
+bitt.s,
+bitter.s,
+blam.s,
+blank.s,
+blas.s,
+bla1.s,
+blatt.s,
+blau.s,
+bl4h.s,
+bl4s.s,
+bl4tt.s,
+bl4u.s,
+blech.s,
+blei.s,
+bleib.s,
+bleich.s,
+blend.s,
+blick.s,
+blieb.s,
+blies.s,
+blind.s,
+blink.s,
+blinz.s,
+blitz.s,
+block.s,
+blond.s,
+blo1.s,
+bl3cke.s,
+bl3d.s,
+bl3k.s,
+bl31.s,
+bluejean.a.4,
+bluff.s,
+blum.s,
+blunze.s,
+bluse.s,
+blut.s,
+bl2ff.s,
+bl2h.s,
+bl2m.s,
+bl2t.s,
+bob.s,
+bock.s,
+boden.s,
+bog.s,
+bohne.s,
+bohr.s,
+boiler.s,
+boje.s,
+bold.s,
+bolz.s,
+bombard.s,
+bombe.s,
+bonbon.s,
+bonbonniere.s,
+bonus.s,
+boom.s,
+boot.s,
+bord.s,
+bord2re.s,
+borg.s,
+borst.s,
+borte.s,
+bos.s,
+bot.s,
+botan.s,
+bottich.s,
+box.s,
+b3.s,
+b3ck.s,
+b3ller.s,
+b3rse.s,
+b3s.s,
+b3schung.s,
+b3t.s,
+brach.s,
+bracht.s,
+branche.s,
+brand.s,
+brannt.s,
+brat.s,
+brau.s,
+brauch.s,
+braun.s,
+brav.s,
+bravo.s,
+br4nd.s,
+br4t.s,
+br4u.s,
+br4uch.s,
+br4un.s,
+br4ut.s,
+br4utigam.s,
+brech.s,
+brei.s,
+breit.s,
+brems.s,
+brenn.s,
+brenz.s,
+brett.s,
+brezel.s,
+brich.s,
+brief.s,
+brikett.s,
+brill.s,
+bring.s,
+brise.s,
+broch.s,
+brock.s,
+brod.s,
+brodel.s,
+brom.s,
+bronchial.s,
+bronchitis.s,
+brosamen.s,
+brosch.s,
+brosch2re.s,
+brot.s,
+br3ck.s,
+br3sel.s,
+br3t.s,
+bruch.s,
+bruder.s,
+brumm.s,
+brunn.s,
+brunst.s,
+brust.s,
+brut.s,
+brutal.s,
+brutto.s,
+brutzel.s,
+br2ch.s,
+br2ck.s,
+br2der.s,
+br2h.s,
+br2ll.s,
+br2nett.s,
+br2st.s,
+br2t.s,
+bub.s,
+buch.s,
+buchstab.s,
+buck.s,
+bude.s,
+budel.s,
+budget.s,
+buffet.s,
+bug.s,
+buket.s,
+bummel.s,
+bummerl.s,
+bund.s,
+bunt.s,
+bure.s,
+burg.s,
+bursch.s,
+bus.s,
+busch.s,
+bussard.s,
+busserl.s,
+bu1.s,
+butt.s,
+butter.s,
+butzen.s,
+b2ch.s,
+b2ck.s,
+b2ffel.s,
+b2ffet.s,
+b2g.s,
+b2gel.s,
+b2hn.s,
+b2nd.s,
+b2rg.s,
+b2rgermeister.s,
+b2ro.s,
+b2rst.s,
+b2sch.s,
+b21.s,
+bzw.st,
+cafe.s,
+camp.s,
+camping.s,
+cellist.s,
+cello.s,
+cellophan.s,
+celsius.s,
+center.s,
+champagner.a.4.6,
+champignon.a.4.6,
+chance.s,
+chaos.s,
+chaot.s,
+charakter.s,
+charm.s,
+chauff.s,
+chef.s,
+chem.s,
+chemikal.s,
+chen.e,
+chiffr.a.4,
+china.s,
+chines.s,
+chip.s,
+chirurg.a.4,
+chlor.s,
+cholera.s,
+chor.s,
+choral.s,
+choreo.v,
+choreograph.a.3.6,
+christ.s,
+christus.s,
+chrom.s,
+city.s,
+clever.s,
+clown.s,
+club.s,
+cod.s,
+collage.s,
+compiler.s,
+computer.s,
+couch.s,
+courag.s,
+cousin.s,
+cowboy.s,
+creme.s,
+cup.s,
+da.svt,
+dabei.s,
+dach.s,
+dacht.s,
+dackel.s,
+dadurch.s,
+daf2r.s,
+daher.s,
+dahin.s,
+damal.s,
+dame.s,
+damit.st,
+damm.s,
+dampf.s,
+dampfer.s,
+dank.s,
+dann.st,
+dar.vst,
+daran.a.3,
+darauf.a.3,
+daraus.a.3,
+darb.s,
+darf.s,
+darin.a.3,
+darm.s,
+darum.a.3,
+das.st,
+dasjenige.s,
+dasselbe.s,
+da1.st,
+data.s,
+datei.s,
+daten.s,
+datier.s,
+dattel.s,
+datum.s,
+dau.s,
+dauer.s,
+davon.s,
+dazu.s,
+d4ch.s,
+d4mm.s,
+d4mmer.s,
+d4mpf.s,
+d4mpfer.s,
+d4rm.s,
+debakel.s,
+deck.s,
+defekt.s,
+definier.s,
+definition.s,
+defizit.s,
+degen.s,
+dehn.s,
+deich.s,
+deichsel.s,
+dein.s,
+deka.vs,
+dekan.s,
+deklar.a.2,
+dekor.s,
+deleg.s,
+delikat.s,
+delikatesse.s,
+delikt.s,
+delphin.s,
+dem.s,
+demokrat.a.2.4,
+demol.s,
+demonstr.a.2.5,
+demut.s,
+dem2tig.s,
+den.st,
+denen.st,
+dengel.s,
+denjenigen.s,
+denk.s,
+denn.s,
+dennoch.s,
+denselben.st,
+dentist.s,
+deponie.s,
+depress.a.2,
+deprim.a.2,
+der.s,
+derb.s,
+derby.s,
+derjenig.s,
+des.stv,
+deshalb.st,
+design.s,
+deskript.a.2,
+dessen.s,
+dessert.s,
+desto.s,
+deswegen.s,
+deszend.a.2,
+detail.s,
+detektiv.s,
+determin.s,
+deut.s,
+deutsam.s,
+deutsch.s,
+deutschen.s,
+dezember.s,
+dezi.v,
+dezimal.s,
+dia.s,
+diagnos.a.3,
+diagnose.a.3,
+diagonal.s,
+diagramm.a.3,
+dialekt.s,
+dialog.s,
+diamant.s,
+di4t.s,
+dich.st,
+dicht.s,
+dick.s,
+dickicht.s,
+didakt.s,
+die.s,
+dieb.s,
+diejenige.s,
+dien.s,
+dienst.s,
+dienstag.a.5,
+dies.s,
+diffam.s,
+different.s,
+differential.s,
+differenz.s,
+diffizil.s,
+digital.s,
+dikt.s,
+dilemma.s,
+dilett.s,
+dimension.s,
+dimensional.s,
+ding.s,
+di3zes.s,
+diphtherie.s,
+diplom.a.2,
+dir.st,
+direkt.s,
+dirig.s,
+dirigent.s,
+dirndl.s,
+dis.v,
+diskont.s,
+diskret.a.3,
+diskussion.s,
+diskut.s,
+dispon.s,
+dissert.s,
+distanz.s,
+distel.s,
+disziplin.a.3.5,
+diva.s,
+divergent.s,
+divergenz.s,
+divers.s,
+divid.s,
+divis.s,
+diwan.s,
+doch.st,
+docht.s,
+dogge.s,
+dohle.s,
+doktor.s,
+dokument.s,
+dokumentar.s,
+dokumentation.s,
+dolch.s,
+dollar.s,
+dolmetsch.s,
+dom.s,
+domino.s,
+dompt.s,
+donau.s,
+donner.s,
+donnerstag.a.3.7,
+doppel.s,
+doppl.s,
+dorb.s,
+dorf.s,
+dorn.s,
+dorr.s,
+dorsch.s,
+dort.s,
+dose.s,
+dot.s,
+dotter.s,
+dozent.s,
+dozier.s,
+d3rf.s,
+d3rr.s,
+drache.s,
+dragoner.s,
+draht.s,
+drama.s,
+dran.vst,
+drang.s,
+drap.s,
+drastisch.s,
+drauf.stv,
+draus.st,
+drau1en.st,
+dr4ht.s,
+dr4ng.s,
+drechseln.s,
+drechsler.s,
+dreck.s,
+dreh.s,
+drei.s,
+dreier.a.4,
+drei1ig.s,
+dresch.s,
+dress.s,
+dre1.s,
+dribb.s,
+drie1.s,
+drill.s,
+drin.st,
+dring.s,
+drinnen.st,
+drischt.s,
+dritt.s,
+droben.st,
+drog.s,
+droh.s,
+drollig.s,
+dromedar.s,
+drosch.s,
+dross.s,
+dro1.s,
+dr3hn.s,
+druck.s,
+drum.vst,
+drungen.s,
+drunter.st,
+dru1.s,
+dr2ben.st,
+dr2ber.s,
+dr2ck.s,
+dr2s.s,
+dschungel.s,
+dschunke.s,
+du.st,
+duck.s,
+dudel.s,
+duell.s,
+duett.s,
+duft.s,
+dukat.s,
+duktion.s,
+duld.s,
+dumm.s,
+dumpf.s,
+dung.s,
+dunkel.s,
+dunkl.s,
+dunst.s,
+dur.s,
+durch.vs,
+durchaus.a.5,
+durchs.st,
+durf.s,
+durst.s,
+dusch.s,
+dutzend.s,
+duz.s,
+d2bel.s,
+d2ft.s,
+d2mm.s,
+d2ng.s,
+d2nn.s,
+d2nst.s,
+d2rf.s,
+d2rr.s,
+d2rst.s,
+d2s.s,
+d2ster.s,
+dynam.s,
+dynamik.a.2,
+dynamisch.a.2,
+dynamo.s,
+dynast.s,
+e.e,
+eben.s,
+ebenso.st,
+eber.s,
+ebne.s,
+echo.s,
+echse.s,
+echt.s,
+eck.s,
+edel.s,
+edit.s,
+efeu.s,
+effekt.s,
+effektiv.s,
+effizient.s,
+effizienz.s,
+egal.s,
+egg.s,
+egoist.a.3,
+ehe.s,
+ehr.s,
+ei.es,
+eich.s,
+eid.s,
+eier.s,
+eifer.s,
+eifrig.s,
+eig.s,
+eigentlich.s,
+eil.s,
+eimer.s,
+ein.vs,
+einander.a.3,
+eine.s,
+einem.s,
+einen.s,
+einer.s,
+einheit.s,
+einig.s,
+einiger.s,
+eins.s,
+einsam.s,
+einzel.s,
+einzig.s,
+eis.s,
+eisen.s,
+eisern.s,
+eitel.s,
+eiter.s,
+eitrig.s,
+ekel.s,
+el.e,
+elast.s,
+elastizit4t.s,
+elefant.s,
+eleg.s,
+elegant.s,
+eleganz.s,
+elektr.a.4,
+elektrizit4t.a.4,
+elektro.a.4,
+element.s,
+elementar.s,
+elend.s,
+elf.s,
+elimin.s,
+ell.e,
+ellbogen.s,
+elle.e,
+ellen.e,
+ellenbogen.s,
+elles.e,
+ellipse.s,
+elliptisch.s,
+elnd.e,
+elster.s,
+eltern.s,
+em.e,
+email.s,
+emaill.s,
+emp.v,
+empir.s,
+empor.s,
+emp3r.s,
+emsig.s,
+en.e,
+end.es,
+energ.s,
+eng.s,
+enkel.s,
+enorm.s,
+ensemble.a.2.5,
+ent.ve,
+entbehr.s,
+ente.s,
+entgolt.s,
+entlich.e,
+entz2ckend.s,
+enz.e,
+enzian.s,
+epiped.s,
+episode.s,
+epoch.s,
+er.vset,
+erb.s,
+erd.s,
+erei.e,
+ergonom.s,
+erker.s,
+erl.s,
+ernd.e,
+ernst.s,
+ernte.s,
+erst.s,
+erz.s,
+es.est,
+esch.s,
+esel.s,
+eskal.s,
+eskapade.s,
+eskimo.s,
+espe.s,
+essant.s,
+esse.s,
+essig.s,
+e1.s,
+etage.s,
+etappe.s,
+eternit.s,
+eth.a.3,
+etikett.s,
+etliche.s,
+etui.s,
+etwa.s,
+etwaig.a.2.4,
+etwas.st,
+euch.st,
+euer.st,
+eule.s,
+eur.e,
+eure.est,
+europa.s,
+europ4.s,
+euter.s,
+evangel.s,
+eventuell.s,
+ewig.s,
+ex.v,
+exakt.a.2,
+exemplar.a.2.4,
+exerz.a.2,
+exil.s,
+existent.a.3,
+existenz.s,
+existier.s,
+exklud.a.2,
+exklus.a.2,
+exorbitant.a.2,
+exot.s,
+experiment.s,
+experte.s,
+explizi.a.2,
+explodier.a.2,
+explosion.a.2,
+exponent.s,
+export.s,
+expre1.a.2,
+exspekt.a.2,
+extern.s,
+extra.a.2,
+extrem.a.2,
+extrema.a.2,
+extremal.a.2,
+fabel.s,
+fabrik.a.2,
+fabrikant.a.2,
+fabrikat.a.2,
+fabrikation.a.2,
+fabrizier.s,
+fach.s,
+fackel.s,
+fad.s,
+faden.s,
+fahl.s,
+fahn.s,
+fahnd.s,
+fahr.s,
+fakt.s,
+fakult4t.s,
+falk.s,
+fall.s,
+falsch.s,
+falt.s,
+famili4r.s,
+familie.s,
+famos.s,
+fanat.s,
+fand.s,
+fanfare.s,
+fang.s,
+farb.s,
+farm.s,
+faschier.s,
+fasching.s,
+faser.s,
+fass.s,
+fasson.s,
+fast.s,
+fa1.s,
+fa1t.s,
+fauch.s,
+faul.s,
+faust.s,
+faxe.s,
+fazit.s,
+f4cher.s,
+f4d.s,
+f4den.s,
+f4hig.s,
+f4hr.s,
+f4hrd.s,
+f4ll.s,
+f4lsch.s,
+f4lt.s,
+f4ng.s,
+f4rb.s,
+f4ul.s,
+f4ust.s,
+feber.s,
+februar.a.2.5,
+fecht.s,
+feder.s,
+fee.s,
+feg.s,
+fehd.s,
+fehl.s,
+fehler.s,
+feier.a.3,
+feig.s,
+feil.s,
+feilsch.s,
+fein.s,
+feind.s,
+feld.s,
+felg.s,
+fell.s,
+fels.s,
+fenster.s,
+ferien.a.2.4,
+ferkel.s,
+fern.s,
+fers.s,
+fertig.s,
+fesch.s,
+fessel.s,
+fest.s,
+fe1l.s,
+fett.s,
+fetz.s,
+feucht.s,
+feuer.s,
+feurig.s,
+fiaker.s,
+fibel.s,
+ficht.s,
+fidel.s,
+fieber.s,
+fiebrig.s,
+fied.s,
+fiedel.s,
+fiehl.s,
+fiel.s,
+figur.s,
+fikt.s,
+file.au.3,
+filial.s,
+film.s,
+filter.s,
+filtr.s,
+filz.s,
+final.s,
+finanz.s,
+finanziell.s,
+find.s,
+finesse.s,
+fing.s,
+finger.s,
+finish.s,
+finit.s,
+fink.s,
+finster.s,
+firm.s,
+firma.s,
+firn.s,
+firnis.s,
+first.s,
+fisch.s,
+fischer.s,
+fistel.s,
+fit.s,
+fix.s,
+flach.s,
+flacker.s,
+flad.s,
+flagg.s,
+flamm.s,
+flanell.s,
+flank.s,
+flasche.s,
+flatter.s,
+flau.s,
+flaum.s,
+fl4ch.s,
+fl4sch.s,
+flecht.s,
+fleck.s,
+fleckerl.s,
+fledermaus.s,
+flegel.s,
+fleh.s,
+flehentlich.s,
+fleisch.s,
+flei1.s,
+fletsch.s,
+flexib.s,
+flexibilit4t.s,
+flicht.s,
+flick.s,
+flieder.s,
+flieg.s,
+flieh.s,
+flies.s,
+flie1.s,
+flimmer.s,
+flink.s,
+flint.s,
+flitter.s,
+flitz.s,
+flocht.s,
+flock.s,
+flog.s,
+floh.s,
+flosse.s,
+flo1.s,
+flott.s,
+fl31.s,
+fl3te.s,
+fluch.s,
+flucht.s,
+flug.s,
+flunker.s,
+flur.s,
+fluss.s,
+flu1.s,
+flut.s,
+fl2cht.s,
+fl2ge.s,
+fl2gel.s,
+fl2gge.s,
+fl2ss.s,
+fl2ster.s,
+focht.s,
+fohl.s,
+folg.s,
+folgend.s,
+folgender.s,
+folie.s,
+folter.s,
+fon.s,
+fonds.s,
+fopp.s,
+forc.s,
+forder.s,
+forelle.s,
+foren.s,
+form.s,
+formal.s,
+format.s,
+formel.s,
+formular.s,
+formulier.s,
+forsch.s,
+forst.s,
+fort.s,
+forum.s,
+foto.s,
+f3hn.s,
+f3hre.s,
+f3n.s,
+f3rder.s,
+f3rm.s,
+f3rst.s,
+fracht.s,
+frag.s,
+frank.s,
+frans.s,
+fra1.s,
+fratz.s,
+frau.s,
+fr4chter.s,
+fr4s.s,
+fr41.s,
+fr4ulein.s,
+frech.s,
+frei.s,
+freitag.s,
+fremd.s,
+frequentier.s,
+frequenz.s,
+fress.s,
+freu.s,
+freud.s,
+freund.s,
+frev.s,
+fried.s,
+frier.s,
+fris.s,
+frisch.s,
+frist.s,
+fri1.s,
+frittat.s,
+froh.s,
+fromm.s,
+fron.s,
+front.s,
+fror.s,
+frosch.s,
+frost.s,
+frott.s,
+frotzel.s,
+fr3h.s,
+fr3st.s,
+frucht.s,
+fr2cht.s,
+fr2h.s,
+fuchs.s,
+fug.s,
+fuhr.s,
+fund.s,
+funk.s,
+funktion.s,
+furch.s,
+furcht.s,
+furt.s,
+furunkel.s,
+fusion.s,
+fu1.s,
+futter.s,
+futteral.s,
+f2g.s,
+f2hl.s,
+f2hr.s,
+f2ll.s,
+f2nd.s,
+f2nf.s,
+f2r.vst,
+f2rcht.s,
+f2rst.s,
+f21.s,
+f2tter.s,
+gab.s,
+gabel.s,
+gacker.s,
+gaff.s,
+galant.s,
+galerie.s,
+galgen.s,
+gall.s,
+galopp.s,
+galt.s,
+gams.s,
+gang.s,
+gans.s,
+ganz.s,
+gar.s,
+garag.s,
+garaus.a.3,
+garb.s,
+garde.s,
+garnitur.s,
+garten.s,
+gas.s,
+gaso.v,
+gasse.s,
+gast.s,
+gatsch.s,
+gatt.s,
+gau.s,
+gaul.s,
+gaumen.s,
+gauner.s,
+g4b.s,
+g4hn.s,
+g4ng.s,
+g4ns.s,
+g4nz.s,
+g4r.s,
+g4rten.s,
+g4ste.s,
+g41.s,
+ge.v,
+geb.s,
+gebaut.s,
+geb4rd.s,
+geb4ud.s,
+geber.s,
+geboren.s,
+gebracht.a.2,
+geburt.s,
+geb2hr.s,
+gedeih.s,
+gediegen.s,
+gedieh.s,
+gegen.s,
+gegend.s,
+gegn.s,
+gegner.s,
+gegolten.s,
+geh.s,
+gehalt.s,
+geheim.s,
+geheuer.s,
+geheuren.s,
+geier.s,
+geig.s,
+geil.s,
+geisel.s,
+geist.s,
+gei1.s,
+geiz.s,
+gelb.s,
+geld.s,
+gelegentlich.s,
+geling.s,
+gell.s,
+gelse.s,
+gelt.s,
+gel2bd.s,
+gem4lde.s,
+gems.s,
+gem2s.s,
+genau.s,
+genauso.s,
+gendarm.s,
+general.s,
+generator.s,
+generell.s,
+generier.s,
+genes.s,
+genesen.s,
+genie1.s,
+genoss.s,
+geno1.st,
+genug.s,
+gen2g.s,
+geo.v,
+gerad.s,
+geradeaus.a.6,
+geradezu.s,
+gerb.s,
+germ.s,
+german.s,
+gern.s,
+gerste.s,
+gerte.s,
+ger2ch.s,
+ger2mpel.s,
+ges41.s,
+geschah.s,
+geschehen.s,
+geschieht.s,
+geschm4cker.a.2,
+geschmeid.a.2,
+geschwister.s,
+geschw2r.a.2,
+geselcht.s,
+gesell.s,
+gesind.s,
+gessen.s,
+gest.s,
+gestrig.s,
+gestr2pp.a.2,
+gest2t.s,
+gesund.s,
+gesungen.s,
+gesunken.s,
+ge1lich.s,
+getan.s,
+getreide.a.2,
+geud.s,
+gewalt.s,
+gewann.s,
+gewinn.s,
+gewi1.s,
+geziefer.s,
+geziem.s,
+gib.s,
+gicht.s,
+gieb.s,
+gier.s,
+gie1.s,
+gift.s,
+gigant.s,
+gilb.s,
+gilt.s,
+ging.s,
+ginster.s,
+gipfel.s,
+gips.s,
+giraffe.s,
+girlande.s,
+girr.s,
+gitarre.s,
+gitter.s,
+gladiole.s,
+glanz.s,
+glas.s,
+glatt.s,
+glatz.s,
+glaub.s,
+gl4nz.s,
+gl4s.s,
+gl4tt.s,
+gl4ub.s,
+gleich.s,
+gleis.s,
+gleit.s,
+gletscher.s,
+glich.s,
+glied.s,
+glimm.s,
+glimpf.s,
+glitschig.s,
+glitt.s,
+glitzer.s,
+glitzernd.s,
+global.s,
+globus.s,
+glock.s,
+glomm.s,
+gloss.s,
+glossar.s,
+glotz.s,
+gl3ck.s,
+glucks.s,
+glut.s,
+gl2ck.s,
+gl2h.s,
+gnade.s,
+gn4dig.s,
+gn2g.s,
+gockel.s,
+gold.s,
+golf.s,
+gonal.s,
+gondel.s,
+gong.s,
+gorilla.s,
+goss.s,
+go1.s,
+gott.s,
+g3nn.s,
+g3tt.s,
+grab.s,
+grad.s,
+graf.s,
+gram.s,
+gramm.s,
+grammatikalisch.s,
+granat.s,
+grandios.s,
+granit.s,
+grant.s,
+graph.s,
+graphik.s,
+gras.s,
+grat.s,
+gratis.s,
+gratul.s,
+grau.s,
+graupel.s,
+grav.s,
+gravierend.s,
+grazi.s,
+gr4b.s,
+gr4f.s,
+gr4m.s,
+gr4s.s,
+gr41lich.s,
+gr4te.s,
+gr4tsch.s,
+greif.s,
+greis.s,
+grei1ler.s,
+grell.s,
+gremien.a.3.5,
+gremium.s,
+grenz.s,
+greuel.s,
+grie1.s,
+griff.s,
+grill.s,
+grimasse.s,
+grimm.s,
+grind.s,
+grins.s,
+gripp.s,
+grob.s,
+grobian.s,
+groll.s,
+groschen.s,
+gro1.s,
+grott.s,
+gr3hl.s,
+gr31.s,
+grub.s,
+gruft.s,
+grund.s,
+grunz.s,
+gruppe.s,
+gruppier.s,
+grusel.s,
+gruss.s,
+gru1.s,
+gr2b.s,
+gr2n.s,
+gr2nd.s,
+gr21.s,
+guck.s,
+gugelhupf.s,
+gulasch.s,
+gulden.s,
+gummi.s,
+gunst.s,
+gurgel.s,
+gurk.s,
+gurt.s,
+guss.s,
+gu1.s,
+gut.s,
+g2ltig.s,
+g2nst.s,
+g2rt.s,
+g2ss.s,
+g2t.s,
+gymnasi.s,
+gymnasium.s,
+gymnast.s,
+haar.s,
+hab.s,
+habicht.s,
+habilit.s,
+hack.s,
+hader.s,
+hafen.s,
+hafer.s,
+hafner.s,
+haft.s,
+hag.s,
+hagel.s,
+hahn.s,
+hai.s,
+hain.s,
+hak.s,
+halb.s,
+halde.s,
+halfter.s,
+hall.s,
+hallo.s,
+halm.s,
+hals.s,
+halt.s,
+hammel.s,
+hammer.s,
+hampel.s,
+hamster.s,
+hand.s,
+handlung.s,
+hanf.s,
+hang.s,
+hangar.s,
+hantier.s,
+haper.s,
+happen.s,
+hardware.au.4.7,
+harfe.s,
+harm.s,
+harmon.s,
+harmonika.s,
+harn.s,
+harpun.s,
+harr.s,
+harsch.s,
+hart.s,
+hartn4ckig.s,
+harz.s,
+hasch.s,
+hase.s,
+hasel.s,
+hass.s,
+hast.s,
+ha1.s,
+hat.s,
+hatte.s,
+hau.s,
+haube.s,
+hauch.s,
+haufen.s,
+haupt.s,
+haus.s,
+haut.s,
+h4ftling.s,
+h4k.s,
+h4kel.s,
+h4lfte.s,
+h4lt.s,
+h4mmer.s,
+h4nd.s,
+h4ng.s,
+h4nseln.s,
+h4rchen.s,
+h4rt.s,
+h4s.s,
+h4ss.s,
+h41.s,
+h4tsch.s,
+h4tte.s,
+h4uf.s,
+h4upt.s,
+h4us.s,
+h4ut.s,
+heb.s,
+hecht.s,
+heck.s,
+heer.s,
+hefe.s,
+heft.s,
+heg.s,
+heid.s,
+heikel.s,
+heiklig.s,
+heil.s,
+heiland.s,
+heim.s,
+heimat.s,
+heirat.s,
+heiser.s,
+hei1.s,
+heit.e,
+heiter.s,
+heiz.s,
+hektar.s,
+hekto.v,
+held.s,
+helf.s,
+helikopter.s,
+hell.s,
+helm.s,
+hemd.s,
+hemm.s,
+hendl.s,
+hengst.s,
+henk.s,
+henne.s,
+her.vs,
+herab.a.3,
+heran.a.3,
+herauf.a.3,
+heraus.a.3,
+herb.s,
+herbst.s,
+herd.s,
+herein.a.3,
+hering.s,
+herr.s,
+herrsch.s,
+herum.a.3,
+herz.s,
+hetz.s,
+heu.s,
+heuchel.s,
+heuchler.s,
+heuer.s,
+heul.s,
+heut.s,
+hex.s,
+hieb.s,
+hielt.s,
+hier.s,
+hierarch.a.4.6,
+hierauf.a.4,
+hierbei.s,
+hierf2r.s,
+hierher.s,
+hierzu.s,
+hiesig.s,
+hie1.s,
+hilf.s,
+him.v,
+himmel.s,
+himmlisch.s,
+hin.vs,
+hinab.a.3,
+hinauf.a.3,
+hinaus.a.3,
+hinder.s,
+hindurch.s,
+hinein.a.3,
+hing.s,
+hink.s,
+hint.s,
+hinter.s,
+hinzu.s,
+hirn.s,
+hirsch.s,
+hirse.s,
+hirt.s,
+hiss.s,
+histor.s,
+hitz.s,
+hob.s,
+hobby.s,
+hoch.s,
+hock.s,
+hof.s,
+hoff.s,
+hoffentlich.st,
+hohe.s,
+hohl.s,
+hohn.s,
+hol.s,
+holf.s,
+holper.s,
+holprig.s,
+holz.s,
+homo.v,
+honig.s,
+hopf.s,
+hoppel.s,
+hoppla.s,
+hops.s,
+horch.s,
+horde.s,
+horizont.s,
+horizontal.s,
+horn.s,
+hornisse.s,
+horst.s,
+hort.s,
+hose.s,
+hospital.a.2,
+hospit4ler.a.2,
+hostie.s,
+hotel.s,
+h3chst.s,
+h3cker.s,
+h3f.s,
+h3h.s,
+h3ll.s,
+h3lz.s,
+h3r.s,
+h3s.s,
+hub.s,
+hudeln.s,
+huf.s,
+huhn.s,
+human.s,
+hummel.s,
+hummer.s,
+humor.s,
+humpel.s,
+humus.s,
+hund.s,
+hundert.s,
+hunger.s,
+hungrig.s,
+hup.s,
+hupf.s,
+hurra.s,
+hurtig.s,
+husch.s,
+hust.s,
+hut.s,
+h2bsch.s,
+h2ft.s,
+h2gel.s,
+h2hn.s,
+h2hner.s,
+h2hnerei.a.3.6,
+h2ll.s,
+h2ls.s,
+h2ndin.s,
+h2pf.s,
+h2rde.s,
+h2steln.s,
+h2t.s,
+hyazinth.s,
+hy4ne.a.3,
+hydrant.a.2,
+hygien.s,
+hymne.s,
+hypnotis.s,
+hypothese.s,
+hypothetisch.s,
+hyster.s,
+iade.e,
+ial.e,
+iat.e,
+ich.st,
+ideal.s,
+idee.s,
+ident.s,
+identifikation.s,
+idiot.s,
+ie.e,
+iell.e,
+ien.e,
+ier.e,
+ig.e,
+igel.s,
+ignor.s,
+ihm.st,
+ihn.s,
+ihr.s,
+ik.e,
+ika.e,
+ikum.e,
+illuster.s,
+illustr.a.2.4,
+im.st,
+imag.s,
+imbi1.s,
+imker.s,
+immer.s,
+immerzu.s,
+immun.s,
+impf.s,
+implement.a.2,
+implizi.a.2,
+import.s,
+impr4gn.a.2.5,
+improvis.a.2,
+impuls.s,
+imstand.s,
+in.vest,
+in4r.e,
+indes.s,
+indessen.s,
+index.s,
+individu.s,
+individuum.s,
+indiz.s,
+industri.a.2.4,
+infekt.s,
+infinitesimal.s,
+infiz.s,
+inflation.a.2,
+infolgedessen.s,
+informatik.s,
+information.s,
+infra.a.2,
+inhal.s,
+initi.a.2,
+injekt.s,
+inklus.a.2,
+inne.s,
+innere.s,
+innig.s,
+innung.s,
+ins.st,
+insbesonder.s,
+insekt.s,
+insel.s,
+inser.s,
+insgesamt.s,
+insolvent.s,
+insolvenz.s,
+inspekt.a.2,
+instanz.s,
+instinkt.s,
+institut.s,
+instrument.a.2,
+inszenier.a.2,
+integer.s,
+integr.a.2.4,
+integral.a.2.4,
+intelligent.s,
+intelligenz.s,
+intendant.s,
+intens.s,
+inter.v,
+interess.a.2.5,
+intern.s,
+interpret.a.2.5,
+intrig.a.2,
+invalid.s,
+inventar.s,
+inventur.s,
+invest.s,
+inwieweit.s,
+ion.e,
+ional.e,
+irdisch.s,
+irgend.s,
+irgendein.a.6,
+irgendwie.s,
+irgendwo.s,
+irr.s,
+irrelevant.s,
+irreversibel.s,
+isation.e,
+isch.e,
+isier.e,
+ismus.e,
+iso.v,
+isol.s,
+ist.ste,
+istisch.e,
+i1t.s,
+italien.s,
+it4t.e,
+iter.s,
+ition.e,
+ium.e,
+iv.e,
+iz.e,
+ja.s,
+jacht.s,
+jacke.s,
+jag.s,
+jagd.s,
+jahr.s,
+jahresende.a.3.6,
+jalousie.s,
+janker.s,
+januar.s,
+jauche.s,
+jauchz.s,
+jaul.s,
+jaus.s,
+jazz.s,
+j4ck.s,
+j4ger.s,
+j4h.s,
+j4hr.s,
+j4mmerlich.s,
+j4nner.s,
+j4te.s,
+je.st,
+jed.s,
+jedoch.st,
+jeglich.s,
+jeher.s,
+jemals.s,
+jemand.s,
+jen.s,
+jenseits.s,
+jesus.s,
+jetzig.s,
+jetzt.s,
+jeweil.s,
+job.s,
+joch.s,
+jod.s,
+jodel.s,
+jodler.s,
+joghurt.a.2,
+johannis.s,
+johl.s,
+jongl.s,
+joppe.s,
+journal.a.4,
+jubel.s,
+jubil.s,
+jubilar.s,
+jubil4um.s,
+juchz.s,
+juck.s,
+jud.s,
+judo.s,
+jugend.s,
+juli.s,
+jung.s,
+juni.s,
+justiz.s,
+jute.s,
+juwel.s,
+jux.s,
+j2d.s,
+j2ng.s,
+kabel.s,
+kabin.s,
+kachel.s,
+kaffee.s,
+kahl.s,
+kahn.s,
+kai.s,
+kaiser.s,
+kajak.s,
+kakao.s,
+kaktus.s,
+kalb.s,
+kalender.s,
+kalk.s,
+kalkul.s,
+kalt.s,
+kam.s,
+kamera.s,
+kamerad.s,
+kamill.s,
+kamm.s,
+kamp.s,
+kampf.s,
+kanal.s,
+kanarie.s,
+kan4le.s,
+kandid.s,
+kanin.s,
+kanister.s,
+kann.s,
+kanon.s,
+kanone.s,
+kant.s,
+kanu.s,
+kanz.s,
+kap.s,
+kapazit4t.s,
+kapital.s,
+kapit4n.s,
+kapitel.s,
+kaplan.a.2,
+kappe.s,
+kaputt.s,
+kapuz.s,
+kar.s,
+karabiner.s,
+karaffe.s,
+karawan.s,
+karbol.s,
+kardinal.s,
+karg.s,
+kari.s,
+karniese.s,
+karo.s,
+karosse.s,
+karott.s,
+karpfen.s,
+karte.s,
+kartei.s,
+kartoffel.s,
+karton.s,
+kasern.s,
+kasperl.s,
+kass.s,
+kassa.s,
+kastanie.s,
+kasten.s,
+katakomb.s,
+katalog.s,
+katarrh.s,
+katastroph.a.2.4,
+katastrophal.s,
+katech.s,
+kategor.s,
+kater.s,
+kathol.s,
+katze.s,
+kau.s,
+kauer.s,
+kauf.s,
+kaum.s,
+kautschuk.s,
+kauz.s,
+k4fer.s,
+k4fig.s,
+k4lt.s,
+k4m.s,
+k4mm.s,
+k4mpf.s,
+k4nguruh.s,
+k4pp.s,
+k4rg.s,
+k4rt.s,
+k4se.s,
+k4st.s,
+k4tz.s,
+k4ue.s,
+k4uf.s,
+keck.s,
+kegel.s,
+kehl.s,
+kehr.s,
+keif.s,
+keil.s,
+keim.s,
+kein.s,
+keit.e,
+keks.s,
+kelch.s,
+kell.s,
+kenn.s,
+kenter.s,
+keram.s,
+kerb.s,
+kerker.s,
+kerl.s,
+kern.s,
+kerze.s,
+kessel.s,
+kett.s,
+keuch.s,
+keule.s,
+keusch.s,
+kicher.s,
+kiebitz.s,
+kiefer.s,
+kiel.s,
+kieme.s,
+kien.s,
+kies.s,
+kilo.vs,
+kind.s,
+kinn.s,
+kino.s,
+kiosk.s,
+kipp.s,
+kirch.s,
+kirsch.s,
+kirtag.s,
+kissen.s,
+kist.s,
+kitsch.s,
+kitt.s,
+kitz.s,
+klag.s,
+klamm.s,
+klammer.s,
+klang.s,
+klappe.s,
+klappt.s,
+klaps.s,
+klar.s,
+klass.s,
+klassifizier.s,
+klatsch.s,
+klau.s,
+klaub.s,
+klausur.s,
+klavier.s,
+kl4ff.s,
+kl4g.s,
+kl4ng.s,
+kl4r.s,
+kleb.s,
+kleck.s,
+klee.s,
+kleid.s,
+kleie.s,
+klein.s,
+kleister.s,
+klemm.s,
+klett.s,
+klima.s,
+klimper.s,
+klin.s,
+kling.s,
+klink.s,
+klinker.s,
+klipp.s,
+klirr.s,
+klo.s,
+klopf.s,
+klosett.s,
+kloster.s,
+klotz.s,
+kl3ppel.s,
+klub.s,
+kluft.s,
+klug.s,
+klump.s,
+klung.s,
+kl2ft.s,
+knabber.s,
+knabe.s,
+knack.s,
+knall.s,
+knapp.s,
+knarr.s,
+knatt.s,
+knaus.s,
+kn4cke.s,
+kn4uel.s,
+knebel.s,
+knecht.s,
+knet.s,
+knick.s,
+knie.s,
+kniff.s,
+knips.s,
+knirps.s,
+knirsch.s,
+knister.s,
+knitter.s,
+knoblauch.s,
+knoch.s,
+knochen.s,
+knoll.s,
+knopf.s,
+knorpel.s,
+knorplig.s,
+knorr.s,
+knosp.s,
+knot.s,
+kn3ch.s,
+kn3del.s,
+kn3pf.s,
+knurr.s,
+knusper.s,
+knusprig.s,
+kn2ll.s,
+kn2pf.s,
+kn2ppel.s,
+koal.a.2,
+kobel.s,
+kobold.s,
+koch.s,
+kod.s,
+kodex.s,
+koeffizient.s,
+koffer.s,
+kogel.s,
+kognit.a.2,
+kohl.s,
+koje.s,
+kokos.s,
+koks.s,
+kolb.s,
+kolik.s,
+kollabier.s,
+kollaps.s,
+kolleg.s,
+kollekt.s,
+koller.s,
+kolonn.s,
+kolossal.s,
+kolo1.s,
+kombination.s,
+kombinator.s,
+kombinatorisch.s,
+kombinier.s,
+komm.s,
+komma.s,
+kommando.s,
+kommentar.s,
+kommentier.s,
+kommiss.s,
+kommun.s,
+kommuni.s,
+kompakt.s,
+kompanie.s,
+kompetent.s,
+kompetenz.s,
+komplett.a.3,
+komplex.a.3,
+kompliment.a.3,
+kompliz.a.3,
+kompon.s,
+komponente.s,
+kompott.s,
+kon.v,
+kondens.s,
+kondition.s,
+konditor.s,
+kondol.s,
+konfekt.s,
+konfer.s,
+konfession.s,
+konflikt.a.3,
+kongre1.a.3,
+kongruenz.a.3.6,
+konjunktur.s,
+konkav.s,
+konkret.a.3,
+konkurr.s,
+konkurrent.s,
+konn.s,
+konsequent.s,
+konsequenz.s,
+konserv.s,
+konsonant.s,
+konstant.s,
+konstruier.a.3,
+konstrukt.a.3,
+konsum.s,
+konsument.s,
+kontakt.s,
+konten.s,
+kontingent.s,
+kontinuier.s,
+konto.s,
+kontra.a.3,
+kontrakt.a.3,
+kontrast.a.3,
+kontroll.a.3,
+konvent.s,
+konvergent.s,
+konvergenz.s,
+konvex.s,
+konzentr.a.3.6,
+konzept.s,
+konzern.s,
+konzert.s,
+konzession.s,
+konzil.s,
+konzipier.s,
+kooperation.a.2,
+koordin.a.2,
+kopf.s,
+kopie.s,
+kopplung.s,
+koralle.s,
+korb.s,
+kork.s,
+korn.s,
+korrekt.s,
+korrektur.s,
+korrel.s,
+korrespond.a.3.5,
+korrigier.s,
+kosmet.s,
+kosmo.s,
+kost.s,
+kost2m.s,
+kot.s,
+kotz.s,
+k3ch.s,
+k3der.s,
+k3ffer.s,
+k3hl.s,
+k3mm.s,
+k3nig.s,
+k3nn.s,
+k3pf.s,
+k3rn.s,
+k3rper.s,
+k3st.s,
+krabbel.s,
+krach.s,
+kraft.s,
+kragen.s,
+krakeel.s,
+kralle.s,
+kram.s,
+krampen.s,
+krampf.s,
+kran.s,
+krank.s,
+kranz.s,
+krapfen.s,
+krass.s,
+kra1.s,
+krat.s,
+kratz.s,
+kraul.s,
+kraus.s,
+kraut.s,
+krawall.s,
+krawatte.s,
+krax.s,
+kr4chz.s,
+kr4ft.s,
+kr4gen.s,
+kr4h.s,
+kr4mer.s,
+kr4nk.s,
+kr4nz.s,
+kr4usel.s,
+kr4ut.s,
+kreat.s,
+krebs.s,
+kredenz.s,
+kredit.s,
+kreide.s,
+kreier.a.3,
+kreis.s,
+kremp.s,
+kren.s,
+krepp.s,
+kreuz.s,
+kribb.s,
+kriech.s,
+krieg.s,
+krimi.s,
+kripp.s,
+krise.s,
+krisis.s,
+kristall.s,
+krit.s,
+kriteri.s,
+kriterium.s,
+kritzel.s,
+kroch.s,
+krokodil.s,
+kron.s,
+kropf.s,
+kr3n.s,
+kr3te.s,
+krug.s,
+krumm.s,
+krust.s,
+kruzifix.s,
+kr2cke.s,
+kr2g.s,
+kr2mm.s,
+kr2ppel.s,
+krypto.v,
+kubisch.s,
+kubus.s,
+kuchen.s,
+kuckuck.s,
+kuf.s,
+kugel.s,
+kuh.s,
+kult.s,
+kultur.s,
+kummer.s,
+kund.s,
+kunft.s,
+kunst.s,
+kunterbunt.s,
+kupfer.s,
+kuppe.s,
+kuppel.s,
+kupplung.s,
+kur.s,
+kurbel.s,
+kurios.s,
+kurs.s,
+kurv.s,
+kurz.s,
+kusine.s,
+ku1.s,
+kutsch.s,
+kutte.s,
+kuvert.s,
+k2bel.s,
+k2che.s,
+k2cken.s,
+k2hl.s,
+k2hn.s,
+k2ken.s,
+k2mmel.s,
+k2mmer.s,
+k2nd.s,
+k2nft.s,
+k2nftig.s,
+k2nst.s,
+k2r.s,
+k2rbis.s,
+k2rschner.s,
+k2rz.s,
+k2ss.s,
+k2ste.s,
+kybernet.s,
+lab.s,
+lach.s,
+lack.s,
+lad.s,
+lag.s,
+lahm.s,
+laib.s,
+laich.s,
+laie.s,
+lall.s,
+lament.s,
+lamm.s,
+lampe.s,
+lampion.s,
+land.s,
+lang.s,
+lanze.s,
+lapp.s,
+larv.s,
+las.s,
+lasch.s,
+lass.s,
+lasso.s,
+last.s,
+la1.s,
+latein.s,
+latern.s,
+latsch.s,
+latte.s,
+latz.s,
+lau.s,
+laub.s,
+lauch.s,
+lauf.s,
+laug.s,
+laus.s,
+lausch.s,
+laut.s,
+lava.s,
+lawine.s,
+lax.s,
+lazarett.s,
+l4ch.s,
+l4dt.s,
+l4g.s,
+l4hm.s,
+l4nd.s,
+l4nder.s,
+l4ng.s,
+l4rm.s,
+l4ss.s,
+l4ster.s,
+l4stig.s,
+l41.s,
+l41t.s,
+l4uf.s,
+l4ufer.s,
+l4us.s,
+l4ut.s,
+le.e,
+leb.s,
+lechz.s,
+leck.s,
+leder.s,
+ledig.s,
+lee.s,
+leer.s,
+leg.s,
+legal.s,
+legitim.s,
+lehen.s,
+lehm.s,
+lehn.s,
+lehr.s,
+lei.e,
+leib.s,
+leich.s,
+leicht.s,
+leid.s,
+leier.s,
+leih.s,
+leim.s,
+lein.se,
+leise.s,
+leist.s,
+leit.s,
+lenk.s,
+lenz.s,
+lepra.a.2,
+ler.e,
+lerche.s,
+lern.s,
+les.s,
+letzt.s,
+leucht.s,
+leugn.s,
+leut.s,
+lexikon.s,
+libelle.s,
+lich.e,
+licher.e,
+licht.s,
+lid.s,
+lieb.s,
+lied.s,
+lief.s,
+lieg.s,
+lieh.s,
+lies.s,
+lie1.s,
+lift.s,
+lig.e,
+liga.s,
+lik3r.s,
+lila.s,
+limonade.s,
+limousine.s,
+lind.s,
+lineal.s,
+linear.s,
+ling.e,
+linguist.s,
+linie.s,
+linien.a.2.4,
+linig.s,
+link.s,
+linoleum.s,
+linse.s,
+lippe.s,
+lisch.e,
+lispel.s,
+list.s,
+liter.s,
+literatur.s,
+litt.s,
+liturg.s,
+livr.a.2,
+lizenz.s,
+lob.s,
+loch.s,
+lock.s,
+loden.s,
+log.s,
+loggia.s,
+logik.s,
+logisch.s,
+loh.s,
+lohn.s,
+lok.s,
+lokal.s,
+lokomotiv.s,
+lorbeer.s,
+los.vse,
+lot.s,
+lotto.s,
+l3b.s,
+l3ch.s,
+l3ck.s,
+l3ffel.s,
+l3hn.s,
+l3s.s,
+l3sch.s,
+l3t.s,
+l3w.s,
+lud.s,
+luft.s,
+luke.s,
+lump.s,
+lung.e,
+lunge.s,
+lupe.s,
+lust.s,
+lutsch.s,
+luv.s,
+luxuri3s.s,
+luxus.s,
+l2cke.s,
+l2ft.s,
+l2g.s,
+l2mmel.s,
+lys.e,
+lyt.e,
+m.e,
+mach.s,
+madonna.s,
+mag.s,
+magazin.s,
+magd.s,
+magistrat.a.2.4,
+magnet.a.2,
+magneto.a.2,
+mahagoni.s,
+mahd.s,
+mahl.s,
+mahn.s,
+mai.s,
+majest.s,
+majoran.s,
+makel.s,
+makkaroni.s,
+makler.s,
+mal.s,
+malus.s,
+malz.s,
+man.s,
+management.s,
+managen.s,
+manager.s,
+manch.s,
+mand.s,
+manege.s,
+mang.s,
+mangel.s,
+manifest.s,
+manipulation.s,
+manipulier.s,
+mann.s,
+man3v.s,
+mansarde.s,
+manschette.s,
+mantel.s,
+manu.s,
+manuell.s,
+mappe.s,
+marder.s,
+margarine.s,
+marginal.s,
+marionett.s,
+mark.s,
+markier.s,
+markise.s,
+markt.s,
+marmelade.s,
+marmor.s,
+marsch.s,
+marter.s,
+marzipan.s,
+masch.s,
+maschin.s,
+maser.s,
+mask.s,
+mass.s,
+masse.s,
+mast.s,
+ma1.s,
+matador.s,
+match.s,
+mater.s,
+material.s,
+materie.s,
+mathematik.s,
+mathematisch.s,
+matratze.a.2,
+matrikel.a.2.5,
+matrix.a.2,
+matrize.a.2.5,
+matsch.s,
+matt.s,
+matura.s,
+mauer.s,
+maul.s,
+maurer.s,
+maus.s,
+maut.s,
+maxim.s,
+maximal.s,
+maximum.s,
+mayonnaise.a.2.5,
+m4ch.s,
+m4dchen.s,
+m4del.s,
+m4dl.s,
+m4h.s,
+m4ngel.s,
+m4nn.s,
+m4ntel.s,
+m4rchen.s,
+m4rkte.s,
+m4rtyrer.s,
+m4rz.s,
+m4st.s,
+m41.s,
+m4us.s,
+mechan.s,
+mecker.s,
+medaille.s,
+medaillon.s,
+medial.s,
+medien.s,
+medikament.s,
+medium.s,
+medizin.s,
+meer.s,
+mehl.s,
+mehr.s,
+meid.s,
+meier.s,
+meile.s,
+mein.s,
+meind.s,
+meise.s,
+meist.s,
+mei1el.s,
+meld.s,
+melk.s,
+melod.s,
+melone.s,
+menagerie.s,
+meng.s,
+mensch.s,
+ment.e,
+mental.s,
+menu.s,
+men2.s,
+merk.s,
+merz.s,
+mess.s,
+messen.s,
+messer.s,
+messing.s,
+me1.s,
+meta.v,
+metall.s,
+metapher.s,
+meteor.s,
+meteoro.s,
+meter.s,
+method.s,
+metr.a.2,
+metropol.a.2,
+mett.s,
+metz.s,
+meut.s,
+mich.s,
+mied.s,
+mieden.s,
+mien.s,
+mies.s,
+miet.s,
+mikro.a.2,
+milch.s,
+mild.s,
+milit.s,
+milli.v,
+milliarde.s,
+million.s,
+milz.s,
+minder.s,
+mindest.s,
+mine.s,
+mineral.s,
+mini.s,
+miniatur.s,
+minimal.s,
+minimum.s,
+minister.s,
+ministerium.s,
+minus.s,
+minute.s,
+min2t.s,
+minz.s,
+mir.st,
+misch.s,
+miser.s,
+mismus.e,
+misse.s,
+mission.s,
+missionar.s,
+mist.s,
+mi1.vs,
+mit.vst,
+mitt.s,
+mittag.s,
+mitter.s,
+mittler.s,
+mittwoch.s,
+mix.s,
+mobil.s,
+mobilit4t.s,
+mocht.s,
+mod.s,
+modell.s,
+modi.s,
+modifikation.s,
+modifizier.s,
+modul.s,
+modular.s,
+modus.s,
+mogel.s,
+mohn.s,
+mohr.s,
+mokka.s,
+molk.s,
+moll.s,
+moment.s,
+momentan.s,
+monat.s,
+mond.s,
+monitor.s,
+mono.v,
+mont.s,
+montag.s,
+monument.s,
+moor.s,
+moos.s,
+moped.s,
+mops.s,
+moral.s,
+morast.s,
+morator.s,
+mord.s,
+morg.s,
+morgen.s,
+moritat.s,
+morph.s,
+morpho.v,
+morsch.s,
+mosaik.s,
+most.s,
+motiv.s,
+motor.s,
+motte.s,
+m3bel.s,
+m3bl.s,
+m3cht.s,
+m3g.s,
+m3nch.s,
+m3rder.s,
+m3rtel.s,
+m3we.s,
+mucks.s,
+muff.s,
+mulde.s,
+muli.s,
+mull.s,
+multi.s,
+multiplikand.a.3.5,
+multiplikat.a.3.5,
+mumie.s,
+mumps.s,
+mund.s,
+munition.s,
+munkel.s,
+munter.s,
+mure.s,
+murks.s,
+murmel.s,
+murr.s,
+mus.s,
+muschel.s,
+muse.s,
+museum.a.2.4,
+musik.s,
+musikal.s,
+musiz.s,
+muskel.s,
+muskulatur.s,
+muskul3s.s,
+muster.s,
+mu1.s,
+mut.s,
+mutter.s,
+m2cke.s,
+m2d.s,
+m2h.s,
+m2ll.s,
+m2nd.s,
+m2nz.s,
+m2rb.s,
+m2rr.s,
+m2ss.s,
+m21.s,
+m21te.s,
+m2t.s,
+m2tz.s,
+myst.s,
+mysteri.s,
+mystif.s,
+mythen.s,
+mythisch.s,
+mythos.s,
+n.e,
+nabe.s,
+nabel.s,
+nach.vs,
+nachdem.st,
+nacht.s,
+nacken.s,
+nackt.s,
+nadel.s,
+nadel3hr.a.2.5,
+nag.s,
+nah.s,
+nahezu.s,
+nahm.s,
+naiv.s,
+nam.s,
+namentlich.s,
+nannt.s,
+nano.v,
+narb.s,
+narkose.s,
+narr.s,
+narzisse.s,
+nas.s,
+nasch.s,
+na1.s,
+nation.s,
+national.s,
+natter.s,
+natur.s,
+nat2r.s,
+n4chst.s,
+n4cht.s,
+n4h.s,
+n4m.s,
+n4rr.s,
+n4rrisch.s,
+n4s.s,
+nebel.s,
+neben.s,
+nebenan.a.2.5,
+nebenbei.s,
+neblig.s,
+nebst.s,
+neck.s,
+neffe.s,
+negativ.s,
+neger.s,
+negrid.a.2,
+nehm.s,
+neid.s,
+neig.s,
+nein.s,
+nelke.s,
+nenn.s,
+neon.s,
+nephritis.a.2.6,
+nerv.s,
+nerv3s.s,
+nessel.s,
+nest.s,
+nett.s,
+netto.s,
+netz.s,
+neu.s,
+neugierde.s,
+neun.s,
+neuralg.a.4,
+neuro.v,
+neutral.a.3,
+neutrum.a.3,
+nicht.s,
+nick.s,
+nie.s,
+nied.s,
+niere.s,
+niet.s,
+nikolaus.s,
+nikotin.s,
+nil.s,
+nimm.s,
+nipp.s,
+nirgend.s,
+nirgendwo.s,
+nis.e,
+nische.s,
+nist.s,
+niveau.s,
+nixe.s,
+nobel.s,
+noch.s,
+nock.s,
+nom.s,
+nommen.s,
+nonne.s,
+nord.s,
+norm.s,
+normal.s,
+nostalg.a.4,
+not.s,
+notar.s,
+notiz.s,
+nougat.s,
+novell.s,
+november.s,
+n3rd.s,
+n3rg.s,
+n3t.s,
+nudel.s,
+nugat.s,
+nuklear.a.2,
+null.s,
+numer.s,
+numerier.s,
+numerisch.s,
+nummer.s,
+nun.st,
+nunft.s,
+nunmehr.st,
+nur.st,
+nu1.s,
+nut.s,
+nutz.s,
+nutzer.s,
+n2chter.s,
+n2nft.s,
+n2ster.s,
+n2tz.s,
+nylon.s,
+oase.s,
+ob.v,
+obacht.a.2,
+obdach.s,
+oben.s,
+ober.s,
+obig.s,
+objekt.s,
+oblate.s,
+obmann.s,
+oboe.s,
+obschon.s,
+obst.s,
+obwohl.st,
+ochs.s,
+ocker.s,
+oder.st,
+ofen.s,
+offen.s,
+offiz.s,
+offizier.s,
+oft.s,
+ohn.s,
+ohr.s,
+oktober.s,
+oliv.s,
+olymp.s,
+oma.s,
+omelett.s,
+omnibus.s,
+onkel.s,
+opa.s,
+oper.s,
+operat.s,
+operette.s,
+operier.s,
+opfer.s,
+opposit.s,
+opti.s,
+optik.s,
+option.s,
+opus.s,
+or.e,
+orange.s,
+orchester.s,
+ord.s,
+ordentlich.s,
+organ.s,
+organis.s,
+organisation.s,
+organisier.s,
+orgel.s,
+orientier.s,
+original.s,
+originell.s,
+orium.e,
+orkan.s,
+ornament.s,
+ort.s,
+ortho.v,
+ost.s,
+oster.s,
+otter.s,
+oval.s,
+ozean.s,
+3d.s,
+3fen.s,
+3ffentlich.s,
+3ffne.s,
+3ffnung.s,
+3ft.s,
+3hr.s,
+3ko.v,
+3l.s,
+3r.e,
+3rt.s,
+3rtlich.s,
+3s.e,
+3se.s,
+3st.s,
+3ster.s,
+paar.s,
+pacht.s,
+pack.s,
+padd.s,
+paket.s,
+palais.s,
+palast.s,
+palaver.s,
+paletot.s,
+palett.s,
+palm.s,
+pan.s,
+paneel.s,
+panorama.a.3,
+pansch.s,
+pantoffel.s,
+pantsch.s,
+panzer.s,
+papa.s,
+papagei.s,
+papier.s,
+papp.s,
+paprika.a.2,
+papst.s,
+par.st,
+para.v,
+parad.s,
+paradies.s,
+parallaxe.a.3,
+parallel.a.3,
+parallelo.a.3,
+pardon.s,
+parfum.s,
+parf2m.s,
+parier.s,
+parit.s,
+park.s,
+parlament.s,
+part.s,
+partei.s,
+parterre.s,
+partie.s,
+partizip.s,
+partner.s,
+party.s,
+parzell.s,
+pasch.s,
+pass.s,
+passable.a.3.5,
+passage.s,
+passagier.s,
+passier.s,
+pasta.s,
+paste.s,
+pastet.s,
+pasteurisier.s,
+pastor.s,
+pa1.s,
+pat.s,
+patent.s,
+patho.v,
+patient.s,
+patron.a.2,
+patsch.s,
+patschen.s,
+patz.s,
+pauk.s,
+paus.s,
+pauschal.s,
+pause.s,
+pavian.s,
+pavillon.s,
+p4chter.s,
+p4ck.s,
+p4dagog.a.3,
+p4pst.s,
+p4rchen.s,
+pech.s,
+pedal.s,
+pedit.s,
+pegel.s,
+pein.s,
+peitsch.s,
+pelikan.s,
+pelz.s,
+pend.s,
+pension.s,
+pensum.s,
+per.vst,
+perfekt.s,
+pergament.s,
+period.a.2.4,
+peripher.s,
+perl.s,
+perlon.s,
+permanent.s,
+perplex.a.3,
+person.s,
+personal.s,
+pers3n.s,
+per2cke.s,
+pessim.s,
+pest.s,
+petersil.s,
+petrol.a.2,
+petroleum.a.2.5,
+pfad.s,
+pfahl.s,
+pfand.s,
+pfanne.s,
+pfarr.s,
+pfau.s,
+pf4nd.s,
+pf4nde.s,
+pfeffer.s,
+pfeif.s,
+pfeil.s,
+pfennig.s,
+pferd.s,
+pfiff.s,
+pfingst.s,
+pfirsich.s,
+pflanz.s,
+pflaster.s,
+pflaume.s,
+pfleg.s,
+pflicht.s,
+pflock.s,
+pflug.s,
+pfl2ck.s,
+pfl2g.s,
+pfort.s,
+pfosten.s,
+pfote.s,
+pf3rt.s,
+pfropf.s,
+pfui.s,
+pfund.s,
+pfusch.s,
+pf2tze.s,
+phantas.s,
+phantast.s,
+phantom.s,
+phase.s,
+philo.s,
+phon.s,
+phor.e,
+photo.s,
+photograph.a.3.5,
+phys.s,
+physio.v,
+pianino.s,
+pianist.s,
+piano.s,
+pick.s,
+piekfein.s,
+piep.s,
+piesack.s,
+pigment.s,
+pik.s,
+pilger.s,
+pille.s,
+pilot.s,
+pilz.s,
+pingpong.s,
+pinguin.s,
+pink.s,
+pinne.s,
+pinsel.s,
+pinupgirl.a.3,
+pinzette.s,
+pionier.s,
+pirat.s,
+pirouette.s,
+pirsch.s,
+piste.s,
+pistol.s,
+pittoresk.s,
+plafond.s,
+plag.s,
+plagiat.s,
+plakat.s,
+plakette.s,
+plan.s,
+planet.s,
+planke.s,
+plankton.s,
+plansch.s,
+plantage.s,
+plapper.s,
+plasma.s,
+plast.s,
+plastik.s,
+plateau.s,
+platin.s,
+platit2de.s,
+platonisch.s,
+platsch.s,
+platt.s,
+platz.s,
+plauder.s,
+plausch.s,
+plausibel.s,
+plazet.s,
+plazier.s,
+pl4d.s,
+pl4doyer.s,
+pl4n.s,
+pl4rr.s,
+pl4tscher.s,
+pl4tt.s,
+pl4tz.s,
+plebej.s,
+plebiszit.a.3.5,
+plebs.s,
+pleite.s,
+plenar.s,
+plenum.s,
+pleuel.s,
+plexi.s,
+plissee.s,
+plizier.s,
+plomb.s,
+plos.s,
+pl3tzlich.s,
+plump.s,
+plunder.s,
+plunze.s,
+plural.s,
+plus.s,
+pl2nder.s,
+pl2sch.s,
+pneu.s,
+pneumat.s,
+poch.s,
+pock.s,
+podest.s,
+podex.s,
+podium.s,
+poem.s,
+poet.s,
+pokal.s,
+poker.s,
+pol.s,
+polar.s,
+polem.s,
+polen.s,
+police.s,
+poliklin.a.4,
+polio.s,
+polit.s,
+politur.s,
+poliz.s,
+polizei.s,
+polizze.s,
+polka.s,
+pollen.s,
+polster.s,
+polter.s,
+poly.v,
+polygam.s,
+polygon.s,
+polymer.s,
+polynom.s,
+polyp.s,
+pomad.s,
+pommes.s,
+pomp.s,
+ponton.s,
+pony.s,
+pool.s,
+pop.s,
+popul.s,
+pore.s,
+porno.s,
+por3s.s,
+port.s,
+portal.s,
+portefeuille.s,
+porti.s,
+porto.s,
+portrait.s,
+porzellan.s,
+pos.s,
+posaune.s,
+position.s,
+positiv.s,
+poss.s,
+post.s,
+postillion.s,
+postulat.s,
+potent.s,
+potenz.s,
+powidl.s,
+p3bel.s,
+p3kel.s,
+p3nal.s,
+p3st.s,
+pracht.s,
+pragmat.s,
+prahl.s,
+prakt.s,
+praktikabl.a.4.8,
+prall.s,
+prang.s,
+pranke.s,
+prass.s,
+prassel.s,
+praxis.s,
+pr4cht.s,
+pr4dikat.s,
+pr4g.s,
+pr4gnant.a.3,
+pr4lat.s,
+pr4mie.s,
+pr4par.s,
+pr4sent.s,
+pr4senz.s,
+pr4sident.s,
+pr4zis.s,
+predig.s,
+preis.s,
+preiserh3hung.a.5,
+prek4r.s,
+prell.s,
+press.s,
+pre1.s,
+prickel.s,
+pries.s,
+priester.s,
+prim.s,
+prima.s,
+primitiv.s,
+prinz.s,
+prinzessin.s,
+prinzip.s,
+priorit4t.s,
+prise.s,
+pritsche.s,
+privat.s,
+privileg.s,
+pro.vst,
+prob.s,
+probabil.s,
+problem.a.3,
+produkt.s,
+produzent.s,
+profess.s,
+professor.s,
+profil.s,
+prognos.a.3,
+programm.a.3,
+programmende.a.3.8,
+progress.a.3,
+progre1.a.3,
+projekt.s,
+projektil.s,
+projizier.s,
+promen.s,
+prompt.s,
+propag.s,
+propaganda.s,
+propeller.s,
+prophet.s,
+prophezei.a.3.6,
+proporz.s,
+prospekt.a.3,
+prothese.s,
+protokoll.s,
+protz.s,
+proviant.s,
+provinz.s,
+provis.s,
+prozedur.s,
+prozent.s,
+prozess.s,
+proze1.s,
+prunk.s,
+pr2f.s,
+pr2gel.s,
+pseudo.s,
+psych.s,
+psycho.s,
+publik.a.2,
+publikum.a.2.5,
+publiz.a.2,
+pudding.s,
+pudel.s,
+puder.s,
+puff.s,
+puffer.s,
+pullover.a.4,
+puls.s,
+pult.s,
+pulver.s,
+pump.s,
+punkt.s,
+pupille.s,
+pupp.s,
+pur.s,
+purpur.s,
+purzel.s,
+pute.s,
+putz.s,
+puzzle.s,
+p2nkt.s,
+p2ree.s,
+pyjama.s,
+pyknisch.a.2,
+pyramide.s,
+quader.s,
+quadrat.a.3,
+quadrier.a.3,
+quak.s,
+qual.s,
+qualit.s,
+quant.s,
+quantit.s,
+quart.s,
+quartal.s,
+quarz.s,
+quasi.s,
+quast.s,
+quatsch.s,
+qu4l.s,
+queck.s,
+quell.s,
+quelle.s,
+quer.s,
+querfeldein.a.4.8,
+quetsch.s,
+quick.s,
+quiek.s,
+quietsch.s,
+quirl.s,
+quitt.s,
+quiz.s,
+quot.s,
+r.e,
+rabatt.s,
+rabe.s,
+rabiat.s,
+rach.s,
+racker.s,
+rad.s,
+radikal.s,
+radio.s,
+radius.s,
+raff.s,
+raffin.s,
+rag.s,
+rahm.s,
+raiffeisen.a.5,
+rain.s,
+rakete.s,
+ramm.s,
+rampe.s,
+ramsch.s,
+rand.s,
+randalier.s,
+rang.s,
+rank.s,
+rann.s,
+ranz.s,
+rapid.s,
+rappe.s,
+raps.s,
+rar.s,
+ras.s,
+rasch.s,
+raspel.s,
+rat.s,
+raub.s,
+rauch.s,
+rauf.s,
+rauh.s,
+raum.s,
+raunz.s,
+raupe.s,
+raus.vst,
+rausch.s,
+r4ch.s,
+r4d.s,
+r4hm.s,
+r4nd.s,
+r4t.s,
+r4uber.s,
+r4ucher.s,
+r4ud.s,
+r4um.s,
+r4usch.s,
+r4usper.s,
+re.v,
+reag.s,
+real.s,
+realisation.s,
+realisier.s,
+realistisch.s,
+reb.s,
+rebe.s,
+rebeln.s,
+rechen.s,
+recherch.s,
+rechn.s,
+recht.s,
+reck.s,
+recorder.s,
+red.s,
+redakt.s,
+reduz.s,
+reell.s,
+refer.s,
+reflekt.a.2,
+reflex.a.2,
+refrain.a.2,
+reg.s,
+regal.s,
+regatta.s,
+regier.s,
+regiment.s,
+regisseur.s,
+registrat.a.2.4,
+registrier.a.2.4,
+reglement.a.2,
+regress.a.2,
+regre1.a.2,
+regul.s,
+reh.s,
+rehabilit.s,
+reib.s,
+reich.s,
+reif.s,
+reigen.s,
+reih.s,
+reim.s,
+rein.s,
+reis.s,
+rei1.s,
+rei1aus.a.4,
+reit.s,
+reiz.s,
+reklam.a.2,
+rekord.s,
+rektor.s,
+relat.s,
+relativ.s,
+relevant.s,
+relig.s,
+religi3s.s,
+remis.s,
+remp.s,
+renk.s,
+renn.s,
+renov.s,
+rent.s,
+rentab.s,
+rentabilit4t.s,
+rentner.s,
+reparatur.s,
+reparier.s,
+reptil.s,
+republik.a.2.4,
+reserv.s,
+reservier.s,
+resonanz.s,
+respekt.a.2,
+rest.s,
+restaur.s,
+resultat.s,
+resultier.s,
+retour.s,
+retrospektiv.a.2.5,
+rett.s,
+rettich.s,
+reu.s,
+revanch.s,
+revers.s,
+reversibel.s,
+revolt.s,
+revolut.s,
+revolver.s,
+rezept.s,
+rhabarber.s,
+rhetor.s,
+rheuma.s,
+rheumatisch.s,
+rhododendron.a.5.8,
+rhythm.s,
+rhythmus.s,
+ribisel.s,
+rich.e,
+richt.s,
+rieb.s,
+riech.s,
+rief.s,
+rieg.s,
+riem.s,
+ries.s,
+riet.s,
+rill.s,
+rind.s,
+ring.s,
+ringsum.a.5,
+rinn.s,
+ripp.s,
+rips.s,
+risiko.s,
+riskant.s,
+riskier.s,
+riss.s,
+rist.s,
+ri1.s,
+ritt.s,
+ritz.s,
+robe.s,
+roboter.s,
+robust.s,
+roch.s,
+rock.s,
+rod.s,
+rode.s,
+rodel.s,
+rogen.s,
+roggen.s,
+roh.s,
+rohr.s,
+roll.s,
+roman.s,
+ronn.s,
+rosa.s,
+rose.s,
+rosig.s,
+rosin.s,
+rost.s,
+ro1.s,
+rot.s,
+rotz.s,
+route.s,
+r3ch.s,
+r3hr.s,
+r3ll.s,
+r3m.s,
+r3ntgen.s,
+r3s.s,
+r3t.s,
+rubrik.a.2,
+ruch.s,
+ruck.s,
+rudel.s,
+ruder.s,
+ruf.s,
+ruh.s,
+ruin.s,
+rum.s,
+rumor.s,
+rump.s,
+rumpf.s,
+rund.s,
+runz.s,
+rupf.s,
+ru1.s,
+rute.s,
+rutsch.s,
+r2b.s,
+r2ck.s,
+r2d.s,
+r2g.s,
+r2hm.s,
+r2hr.s,
+r2lps.s,
+r2mpf.s,
+r2pel.s,
+r2sch.s,
+r2ssel.s,
+r2st.s,
+r2tt.s,
+s.e,
+saal.s,
+saar.s,
+saat.s,
+sach.s,
+sack.s,
+safari.s,
+saft.s,
+sag.s,
+sah.s,
+saison.s,
+saite.s,
+sakko.s,
+sakrament.a.2,
+sakristei.a.2,
+sal.e,
+salamander.s,
+salami.s,
+salat.s,
+salb.s,
+saldo.s,
+salon.s,
+salto.s,
+salut.s,
+salz.s,
+sam.e,
+same.s,
+samm.s,
+sammen.s,
+samstag.a.4,
+samt.s,
+sanatorien.s,
+sanatorium.s,
+sand.s,
+sandale.s,
+sandwich.s,
+sanft.s,
+sang.s,
+sanier.s,
+sanit4r.s,
+sanit4t.s,
+sank.s,
+sann.s,
+sardelle.s,
+sardine.s,
+sarg.s,
+sasse.s,
+sa1.s,
+satan.s,
+satellit.s,
+satt.s,
+satz.s,
+sau.s,
+sauber.s,
+sauce.s,
+sauciere.s,
+sauer.s,
+sauf.s,
+saug.s,
+saum.s,
+sauna.s,
+saus.s,
+saxophon.s,
+s4.s,
+s4bel.s,
+s4ch.s,
+s4en.s,
+s4g.s,
+s4le.s,
+s4mtlich.s,
+s4nft.s,
+s4nger.s,
+s4t.s,
+s4tt.s,
+s4tz.s,
+s4uber.s,
+s4uer.s,
+s4uf.s,
+s4ug.s,
+s4ule.s,
+s4um.s,
+s4ure.s,
+s4usel.s,
+schab.s,
+schablone.a.4,
+schach.s,
+schacht.s,
+schachtel.s,
+schad.s,
+schaf.s,
+schaff.s,
+schaft.s,
+schal.s,
+schale.s,
+schall.s,
+schalt.s,
+scham.s,
+schand.s,
+schank.s,
+schanz.s,
+schar.s,
+scharf.s,
+schatt.s,
+schattier.s,
+schatulle.s,
+schatz.s,
+schau.s,
+schauf.s,
+schauk.s,
+schaum.s,
+sch4big.s,
+sch4d.s,
+sch4fer.s,
+sch4ft.s,
+sch4hl.s,
+sch4l.s,
+sch4m.s,
+sch4nd.s,
+sch4rf.s,
+sch4tz.s,
+sch4um.s,
+scheck.s,
+scheffel.s,
+scheib.s,
+scheid.s,
+schein.s,
+scheit.s,
+schell.s,
+schelm.s,
+schema.s,
+schematisch.s,
+schemel.s,
+schenk.s,
+schepper.s,
+scher.s,
+scherbe.s,
+scherflein.s,
+scherz.s,
+scheu.s,
+scheuch.s,
+scheu1.s,
+schi.s,
+schicht.s,
+schick.s,
+schieb.s,
+schied.s,
+schief.s,
+schiel.s,
+schien.s,
+schie1.s,
+schiff.s,
+schikan.s,
+schild.s,
+schilf.s,
+schiller.s,
+schillernd.s,
+schilling.s,
+schimm.s,
+schimpanse.s,
+schimpf.s,
+schind.s,
+schinken.s,
+schirm.s,
+schirr.s,
+schizophren.a.4.6,
+schlacht.s,
+schlack.s,
+schlaf.s,
+schlaff.s,
+schlag.s,
+schlamm.s,
+schlamp.s,
+schlang.s,
+schlank.s,
+schlau.s,
+schlauch.s,
+schl4cht.s,
+schl4f.s,
+schl4g.s,
+schl4ngel.s,
+schlecht.s,
+schleck.s,
+schlegel.s,
+schleich.s,
+schleier.a.6,
+schleif.s,
+schleifenende.a.6.9,
+schleim.s,
+schlei1.s,
+schlemm.s,
+schlender.s,
+schlenker.s,
+schlepp.s,
+schleuder.s,
+schleunig.s,
+schleus.s,
+schlich.s,
+schlief.s,
+schlie1.s,
+schliff.s,
+schlimm.s,
+schling.s,
+schlitt.s,
+schlitz.s,
+schlosse.s,
+schlo1.s,
+schlot.s,
+schlotter.s,
+schlucht.s,
+schluchz.s,
+schluck.s,
+schlug.s,
+schlummer.s,
+schlund.s,
+schlupf.s,
+schluss.s,
+schlu1.s,
+schl2ck.s,
+schl2pf.s,
+schl2rf.s,
+schl2ss.s,
+schmach.s,
+schmack.s,
+schmal.s,
+schmalz.s,
+schmarotz.s,
+schmarren.s,
+schmatz.s,
+schmaus.s,
+schm4chtig.s,
+schm4h.s,
+schmeck.s,
+schmeich.s,
+schmei1.s,
+schmelz.s,
+schmerz.s,
+schmetter.s,
+schmied.s,
+schmieg.s,
+schmier.s,
+schmilzt.s,
+schmink.s,
+schmirg.s,
+schmiss.s,
+schmi1.s,
+schmoll.s,
+schmolz.s,
+schmor.s,
+schmuck.s,
+schmugg.s,
+schmunzel.s,
+schmutz.s,
+schm2ck.s,
+schnabel.s,
+schnabulier.s,
+schnall.s,
+schnalz.s,
+schnapp.s,
+schnaps.s,
+schnarch.s,
+schnarr.s,
+schnatter.s,
+schnaub.s,
+schnauf.s,
+schnauz.s,
+schn4uz.s,
+schnecke.s,
+schnee.s,
+schnei.s,
+schneid.s,
+schneien.a.6,
+schnell.s,
+schneuz.s,
+schnippisch.s,
+schnitt.s,
+schnitz.s,
+schnob.s,
+schnorchel.s,
+schn3rkel.s,
+schn3rks.s,
+schnuller.s,
+schnupf.s,
+schnuppe.s,
+schnupper.s,
+schnur.s,
+schnurr.s,
+schnurstracks.a.6,
+schn2ff.s,
+schn2r.s,
+schob.s,
+schock.s,
+schokolade.s,
+scholle.s,
+schon.s,
+schopf.s,
+schoppen.s,
+schornstein.s,
+schossen.s,
+scho1.s,
+schote.s,
+schott.s,
+sch3n.s,
+sch3pf.s,
+sch31.s,
+schraff.s,
+schrank.s,
+schraub.s,
+schr4g.s,
+schr4nk.s,
+schrebergarten.s,
+schreck.s,
+schrei.s,
+schreib.s,
+schreit.s,
+schrie.s,
+schrieb.s,
+schrift.s,
+schrill.s,
+schritt.s,
+schrocken.s,
+schroff.s,
+schrot.s,
+schr3pf.s,
+schrumpf.s,
+schub.s,
+schuf.s,
+schuft.s,
+schuh.s,
+schuko.s,
+schul.s,
+schuld.s,
+schulter.s,
+schund.s,
+schupp.s,
+schur.s,
+schurk.s,
+schurz.s,
+schussel.s,
+schuster.s,
+schu1.s,
+schutt.s,
+schutz.s,
+sch2chtern.s,
+sch2ler.s,
+sch2r.s,
+sch2rf.s,
+sch2rz.s,
+sch2ss.s,
+sch2tt.s,
+sch2tz.s,
+schwach.s,
+schwade.s,
+schwager.s,
+schwalbe.s,
+schwall.s,
+schwamm.s,
+schwan.s,
+schwand.s,
+schwang.s,
+schwank.s,
+schwanz.s,
+schwarm.s,
+schwarte.s,
+schwarz.s,
+schwatz.s,
+schw4ch.s,
+schw4ger.s,
+schw4nz.s,
+schw4nzel.s,
+schw4r.s,
+schw4rm.s,
+schw4rz.s,
+schw4tz.s,
+schweb.s,
+schwefel.s,
+schweif.s,
+schweig.s,
+schwein.s,
+schwei1.s,
+schweiz.s,
+schwel.s,
+schwell.s,
+schwemm.s,
+schwend.s,
+schwengel.s,
+schwenk.s,
+schwer.s,
+schwester.s,
+schwieg.s,
+schwiel.s,
+schwiele.s,
+schwierig.s,
+schwimm.s,
+schwind.s,
+schwing.s,
+schwips.s,
+schwirr.s,
+schwitz.s,
+schwoll.s,
+schwomm.s,
+schwor.s,
+schw3r.s,
+schwulst.s,
+schwund.s,
+schwung.s,
+schwur.s,
+schw2l.s,
+sechs.s,
+sechzehn.s,
+sechzig.s,
+see.s,
+seel.s,
+segel.s,
+segen.s,
+segler.s,
+segn.s,
+seh.s,
+sehr.s,
+sei.s,
+seicht.s,
+seid.s,
+seif.s,
+seih.s,
+seil.s,
+sein.s,
+seit.s,
+sekret.a.2,
+sekt.s,
+sekund.s,
+sekunde.s,
+selbe.s,
+selbst.s,
+selbst4ndig.s,
+selch.s,
+selekt.s,
+selig.s,
+sellerie.s,
+selt.s,
+semant.s,
+semantik.s,
+semester.s,
+semi.s,
+seminar.s,
+semmel.s,
+send.s,
+senf.s,
+seng.s,
+senior.s,
+senk.s,
+senn.s,
+sensation.s,
+sense.s,
+sensor.s,
+separat.s,
+september.s,
+sequent.s,
+sequenz.s,
+serie.s,
+serien.a.2.4,
+seri3s.s,
+serpentine.s,
+service.s,
+servier.s,
+serviette.a.3.5,
+sess.s,
+sessel.s,
+se1.s,
+set.es,
+setz.s,
+seuch.s,
+seufz.s,
+sex.s,
+shampoo.s,
+shopping.s,
+shorts.s,
+show.s,
+sich.st,
+sichel.s,
+sicher.s,
+sicht.s,
+sicker.s,
+sie.st,
+sieb.s,
+sieben.s,
+siech.s,
+sied.s,
+sieg.s,
+sieh.s,
+signal.a.2,
+signifik.a.2.5,
+silb.s,
+silbentrenn.a.3.6,
+silber.s,
+silbrig.s,
+silo.s,
+silvester.s,
+simpel.s,
+sims.s,
+simul.s,
+sind.st,
+sinfon.s,
+sing.s,
+sink.s,
+sinn.s,
+sintflut.a.4,
+siphon.s,
+sippe.s,
+sirene.s,
+sirup.s,
+sitt.s,
+sittich.s,
+situation.s,
+sitz.s,
+skala.s,
+skandal.s,
+skelett.s,
+ski.s,
+skizz.s,
+sklave.s,
+skop.s,
+skript.s,
+slalom.s,
+slip.s,
+smaragd.s,
+so.vst,
+socke.s,
+sockel.s,
+sod.s,
+soda.s,
+sodann.s,
+soda1.s,
+sofa.s,
+soff.s,
+sofort.s,
+software.au.4.7,
+sogar.st,
+sohl.s,
+sohn.s,
+sol.s,
+solch.s,
+soldat.s,
+soll.s,
+sollen.s,
+solo.s,
+somit.st,
+sommer.s,
+sonate.s,
+sonder.s,
+sonn.s,
+sonntag.s,
+sonst.s,
+soph.s,
+sopran.a.2,
+sorg.s,
+sort.s,
+sortiment.s,
+so1e.s,
+sott.s,
+soundso.a.2.5,
+souvenir.s,
+sowie.s,
+sowjet.s,
+sozial.s,
+sozio.v,
+s3hn.s,
+spachtel.s,
+spagat.s,
+spaghetti.a.3,
+spalier.s,
+spalt.s,
+span.s,
+spange.s,
+spann.s,
+spar.s,
+spargel.s,
+spass.s,
+spassig.s,
+spa1.s,
+spat.s,
+spatz.s,
+spazier.s,
+sp4h.s,
+sp4lt.s,
+sp4nn.s,
+sp4rlich.s,
+sp4t.s,
+specht.s,
+speck.s,
+spedit.s,
+speer.s,
+spei.s,
+speich.s,
+speicher.s,
+speien.a.4,
+speis.s,
+spektak.s,
+spektr.a.4,
+spektra.a.4,
+spektro.a.4,
+spektrum.a.4,
+spekul.s,
+spend.s,
+spengler.s,
+spenst.s,
+sperling.s,
+sperr.s,
+spesen.s,
+spezial.s,
+spezialis.s,
+speziell.a.3.5,
+spezifikation.s,
+spezifisch.s,
+spezifizier.s,
+spick.s,
+spiegel.s,
+spiegelei.a.4.7,
+spiel.s,
+spie1.s,
+spike.s,
+spinat.s,
+spindel.s,
+spinn.s,
+spion.s,
+spiral.s,
+spiritus.s,
+spital.s,
+spit4ler.a.3,
+spitz.s,
+splitt.s,
+spontan.s,
+sporn.s,
+sport.s,
+spott.s,
+sp3tt.s,
+sprach.s,
+sprang.s,
+spray.s,
+spr4ch.s,
+sprech.s,
+spreiz.s,
+spreng.s,
+sprenkel.s,
+spreu.s,
+sprich.s,
+sprie1.s,
+spring.s,
+springer.s,
+sprint.s,
+sprit.s,
+spritz.s,
+sprochen.s,
+spross.s,
+spro1.s,
+spr3d.s,
+spr31.s,
+spruch.s,
+sprud.s,
+sprudel.s,
+sprung.s,
+spr2ch.s,
+spr2h.s,
+spr2ng.s,
+spuck.s,
+spuk.s,
+spul.s,
+spund.s,
+spur.s,
+sp2l.s,
+sp2r.s,
+staat.s,
+stab.s,
+stabil.s,
+stach.s,
+stachel.s,
+stachl.s,
+stadel.s,
+stadion.s,
+stadium.s,
+stadt.s,
+stahl.s,
+stall.s,
+stalt.s,
+stamm.s,
+stampf.s,
+stand.s,
+standard.s,
+stang.s,
+stank.s,
+stanniol.s,
+stanz.s,
+stap.s,
+stapf.s,
+star.s,
+starb.s,
+stark.s,
+starr.s,
+start.s,
+stat.s,
+statik.s,
+station.s,
+statisch.s,
+statistik.s,
+statistisch.s,
+statt.s,
+statu.s,
+statue.s,
+status.s,
+stau.s,
+staub.s,
+stauch.s,
+staud.s,
+st4b.s,
+st4dt.s,
+st4hl.s,
+st4mm.s,
+st4nd.s,
+st4nker.s,
+st4rk.s,
+st4tt.s,
+steak.s,
+stech.s,
+steck.s,
+steg.s,
+steh.s,
+steif.s,
+steig.s,
+steil.s,
+stein.s,
+stell.s,
+stellung.s,
+stelz.s,
+stemm.s,
+stempel.s,
+stengel.s,
+steno.vst,
+stephan.s,
+stepp.s,
+steppe.s,
+sterb.s,
+stereo.s,
+steril.s,
+stern.s,
+sterz.s,
+stet.s,
+steuer.s,
+stich.s,
+stick.s,
+stief.s,
+stiefel.s,
+stieg.s,
+stiehlt.s,
+stiel.s,
+stier.s,
+stie1.s,
+stift.s,
+stil.s,
+still.s,
+stimm.s,
+stink.s,
+stipend.s,
+stirb.s,
+stirn.s,
+stoch.s,
+stock.s,
+stoff.s,
+stohl.s,
+stoisch.s,
+stollen.s,
+stolper.s,
+stolz.s,
+stop.s,
+stopf.s,
+stopp.s,
+storb.s,
+storch.s,
+sto1.s,
+stotter.s,
+st3ber.s,
+st3ck.s,
+st3hn.s,
+st3psel.s,
+st3r.s,
+st31.s,
+straf.s,
+straff.s,
+strahl.s,
+stramm.s,
+stramp.s,
+strand.s,
+strang.s,
+strapaz.s,
+stra1.s,
+strateg.s,
+strauch.s,
+strau1.s,
+str4f.s,
+str4hn.s,
+str41.s,
+str4ub.s,
+str4uch.s,
+str4u1.s,
+streb.s,
+streck.s,
+streich.s,
+streif.s,
+streik.s,
+streit.s,
+streng.s,
+stress.s,
+stre1.s,
+streu.s,
+strich.s,
+strichlier.s,
+strick.s,
+striegel.s,
+strieme.s,
+stritt.s,
+stroh.s,
+strolch.s,
+strom.s,
+stroph.s,
+strotz.s,
+str3m.s,
+strudel.s,
+struktur.s,
+strumpf.s,
+strunk.s,
+strupp.s,
+struwwelpeter.s,
+str2mpf.s,
+str2pp.s,
+stube.s,
+stud.s,
+student.s,
+studio.s,
+studium.s,
+stuf.s,
+stuhl.s,
+stulpe.s,
+stumm.s,
+stumpf.s,
+stund.s,
+stunk.s,
+sturm.s,
+sturz.s,
+stute.s,
+stutz.s,
+st2b.s,
+st2berl.s,
+st2ck.s,
+st2lp.s,
+st2mper.s,
+st2mpf.s,
+st2nd.s,
+st2rm.s,
+st2rz.s,
+st2tz.s,
+subtrahend.a.3,
+subtrahier.a.3,
+subtraktion.a.3,
+subvention.s,
+such.s,
+sucht.s,
+sud.s,
+suggerier.s,
+suggest.s,
+sukzess.s,
+summ.s,
+sumpf.s,
+super.vst,
+suppe.s,
+surr.s,
+suspekt.a.2,
+suspendier.a.3,
+suspens.a.3,
+s2cht.s,
+s2d.s,
+s2hn.s,
+s2mpf.s,
+s2nd.s,
+s21.s,
+swimming.s,
+symbol.a.3,
+symbolik.a.3,
+symbolisch.a.3,
+symbolis.a.3,
+symmetr.a.3.5,
+sympath.s,
+symphon.s,
+sympos.s,
+synchron.a.3,
+syndik.s,
+syndikus.s,
+synonym.au.3.5,
+syntax.s,
+synthese.s,
+system.a.2,
+systematik.a.2,
+systematisch.a.2,
+systematisier.a.2,
+szene.s,
+t.e,
+tabak.s,
+tabell.s,
+tabernakel.s,
+tablett.a.2,
+tacho.s,
+tadel.s,
+tafel.s,
+tag.s,
+taill.s,
+takt.s,
+tal.s,
+talent.s,
+taler.s,
+talg.s,
+talisman.s,
+talk.s,
+tandem.s,
+tangent.s,
+tangier.s,
+tank.s,
+tann.s,
+tante.s,
+tanz.s,
+tapet.s,
+tapezier.s,
+tapfer.s,
+tapp.s,
+tara.s,
+tarif.s,
+tarn.s,
+tasche.s,
+tasse.s,
+tastatur.s,
+tast.s,
+tat.s,
+tatsache.s,
+tatze.s,
+tau.s,
+taub.s,
+tauch.s,
+tauf.s,
+taug.s,
+tausch.s,
+tausend.s,
+tax.s,
+taxi.s,
+t4fel.s,
+t4g.s,
+t4nz.s,
+t4sch.s,
+t4t.s,
+t4tsch.s,
+t4ub.s,
+t4uf.s,
+t4usch.s,
+team.au.3,
+technik.s,
+techniker.s,
+technisch.s,
+techno.s,
+teddy.s,
+tee.s,
+teich.s,
+teig.s,
+teil.s,
+teint.s,
+tel.e,
+tele.vs,
+telex.s,
+teller.s,
+tempel.s,
+tempera.s,
+tempo.s,
+tendenz.s,
+tenne.s,
+tennis.s,
+tenor.s,
+teppich.s,
+term.s,
+termino.s,
+terpentin.s,
+terrasse.s,
+terrazzo.s,
+terror.s,
+terti.s,
+test.s,
+teuer.s,
+teuf.s,
+text.s,
+textil.s,
+theater.s,
+theist.a.3,
+thema.s,
+themen.s,
+theo.s,
+theoretisch.s,
+theorie.s,
+therap.s,
+thermal.s,
+thermo.s,
+thron.s,
+thunfisch.s,
+tick.s,
+tief.s,
+tiegel.s,
+tier.s,
+tiger.s,
+tilg.s,
+tinte.s,
+tip.s,
+tipp.s,
+tipptopp.s,
+tirol.s,
+tisch.s,
+titel.s,
+tob.s,
+tochter.s,
+tod.s,
+toilett.s,
+toler.s,
+toll.s,
+tolpatsch.s,
+tomate.s,
+tombola.s,
+ton.s,
+topf.s,
+topfit.s,
+topo.v,
+tor.s,
+torf.s,
+torkel.s,
+tos.s,
+tot.s,
+total.s,
+toto.s,
+tour.s,
+t3chter.s,
+t3dlich.s,
+t3lpel.s,
+t3n.s,
+t3pf.s,
+t3richt.s,
+t3s.s,
+t3t.s,
+trab.s,
+tracht.s,
+tradition.s,
+traf.s,
+trafo.s,
+trag.s,
+trag3d.s,
+train.s,
+trainer.s,
+training.s,
+trakt.s,
+tram.s,
+trampel.s,
+tramway.s,
+tran.s,
+trank.s,
+transfer.s,
+transit.s,
+transparent.s,
+transparenz.s,
+transport.s,
+transzend.s,
+transzendent.s,
+trapez.s,
+trasse.s,
+trat.s,
+tratsch.s,
+trau.s,
+traube.s,
+traum.s,
+travers.s,
+tr4cht.s,
+tr4g.s,
+tr4ller.s,
+tr4n.s,
+tr4nk.s,
+tr4uf.s,
+tr4um.s,
+treff.s,
+treib.s,
+trend.s,
+trenn.s,
+trepp.s,
+treppab.a.5,
+treppauf.a.5,
+tresor.s,
+tret.s,
+treu.s,
+trib2ne.s,
+trichter.s,
+trick.s,
+trieb.s,
+triff.s,
+trift.s,
+trikot.s,
+triller.s,
+trink.s,
+trio.s,
+trippel.s,
+tritt.s,
+triumph.s,
+trock.s,
+troffen.s,
+trog.s,
+tromm.s,
+trompete.s,
+trop.s,
+tropf.s,
+troph4e.au.3.6,
+trost.s,
+trott.s,
+trotz.s,
+tr3d.s,
+tr3pf.s,
+tr3st.s,
+trubel.s,
+trudeln.s,
+trug.s,
+truhe.s,
+trunk.s,
+trupp.s,
+trut.s,
+tr2b.s,
+tr2g.s,
+tr2mmer.s,
+tube.s,
+tuberkulose.s,
+tuberkul3s.s,
+tuch.s,
+tue.s,
+tuend.s,
+tugend.s,
+tulpe.s,
+tum.e,
+tummel.s,
+tumult.s,
+tun.st,
+tunell.s,
+tunk.s,
+tunnel.s,
+tupf.s,
+turbine.s,
+turm.s,
+turn.s,
+tusch.s,
+tut.s,
+t2ch.s,
+t2ck.s,
+t2ft.s,
+t2m.e,
+t2mmel.s,
+t2mpel.s,
+t2r.s,
+t2rk.s,
+t2rm.s,
+t2te.s,
+typ.s,
+typhus.s,
+tyrann.s,
+ufer.s,
+uhr.s,
+uhu.s,
+ul4r.e,
+ulme.s,
+ultimativ.s,
+ultimatum.s,
+ultimo.s,
+ultra.a.2,
+um.vst,
+ums.st,
+umso.s,
+un.v,
+und.s,
+ung.e,
+unget2m.s,
+uni.s,
+uniform.s,
+universit4t.s,
+uns.s,
+unten.st,
+unter.vs,
+unterdes.s,
+ur.ve,
+urbar.s,
+urne.s,
+utop.s,
+2b.s,
+2ber.vs,
+2beraus.a.4,
+2berein.a.4,
+2brig.s,
+2ppig.s,
+vagabund.s,
+vakuum.s,
+valid.s,
+vall.s,
+vanille.s,
+vari.s,
+variable.a.2.5,
+vater.s,
+v4ter.s,
+veilchen.s,
+vektor.s,
+vene.s,
+ventil.s,
+ver.v,
+veranda.s,
+verb.s,
+verdutzt.s,
+veredlung.a.3,
+verein.a.3,
+verflixt.a.3,
+verga1.s,
+vergess.s,
+vergi1.s,
+verletz.s,
+verleumd.s,
+verlier.s,
+verlor.s,
+vers.s,
+version.s,
+verteidig.s,
+vertikal.s,
+vertrackt.a.3,
+vetter.s,
+viadukt.s,
+video.v,
+vieh.s,
+viel.s,
+vier.s,
+villa.s,
+villen.s,
+violett.s,
+violin.s,
+viper.s,
+viren.s,
+virtuell.s,
+virtuos.s,
+virulent.s,
+virus.s,
+vision.s,
+visit.s,
+visualisier.s,
+vitamin.s,
+vize.s,
+vogel.s,
+vokabel.s,
+vokabular.s,
+vokal.s,
+volk.s,
+voll.s,
+volumen.s,
+vom.st,
+von.vst,
+vor.vs,
+vorab.a.3,
+voran.a.3,
+voraus.a.3,
+vorbei.s,
+vorder.s,
+vorher.s,
+v3gel.s,
+v3lk.s,
+v3ll.s,
+vulkan.s,
+waag.s,
+wabe.s,
+wach.s,
+wacholder.s,
+wachs.s,
+wackel.s,
+wade.s,
+waffe.s,
+waffel.s,
+wag.s,
+waggon.s,
+wahl.s,
+wahn.s,
+wahr.s,
+waid.s,
+wais.s,
+wal.s,
+wald.s,
+walk.s,
+wall.s,
+walt.s,
+walz.s,
+wand.s,
+wange.s,
+wank.s,
+wann.s,
+wanz.s,
+wapp.s,
+war.s,
+warb.s,
+warf.s,
+warm.s,
+wart.s,
+warum.a.3,
+warze.s,
+was.s,
+wasch.s,
+wasser.s,
+wate.s,
+watschel.s,
+watt.s,
+w4ch.s,
+w4g.s,
+w4hl.s,
+w4hn.s,
+w4hr.s,
+w4hrend.s,
+w4ld.s,
+w4lt.s,
+w4lz.s,
+w4nd.s,
+w4re.s,
+w4rm.s,
+w4rt.s,
+w4sch.s,
+w4sser.s,
+web.s,
+wechsel.s,
+wechselnd.s,
+wechsl.s,
+weck.s,
+wedel.s,
+weder.s,
+weg.s,
+wegen.s,
+weh.s,
+wehr.s,
+wehtun.s,
+weib.s,
+weich.s,
+weid.s,
+weiger.s,
+weih.s,
+weil.s,
+wein.s,
+weis.s,
+wei1.s,
+weit.s,
+weiter.s,
+weithin.a.4,
+weizen.s,
+welch.s,
+welk.s,
+well.s,
+welt.s,
+wem.st,
+wen.st,
+wend.s,
+wenig.s,
+wenigsten.s,
+wenn.s,
+wer.st,
+werb.s,
+werd.s,
+werf.s,
+werg.s,
+werk.s,
+werkstatt.s,
+wermut.s,
+werner.st,
+wert.s,
+wes.s,
+wesen.s,
+wesend.s,
+wesentlich.s,
+weshalb.s,
+wespe.s,
+west.s,
+weswegen.s,
+wett.s,
+wetz.s,
+wich.s,
+wichs.s,
+wicht.s,
+wickel.s,
+wicklung.s,
+widder.s,
+wider.vs,
+widm.s,
+widrig.s,
+wie.st,
+wieder.vst,
+wiederum.a.6,
+wieg.s,
+wieher.s,
+wien.s,
+wierig.s,
+wies.s,
+wieso.s,
+wieviel.s,
+wild.s,
+wildbret.a.4,
+will.s,
+wimmel.s,
+wimmer.s,
+wimpel.s,
+wimper.s,
+wind.s,
+wink.s,
+winsel.s,
+winter.s,
+winz.s,
+wipfel.s,
+wir.st,
+wirbel.s,
+wird.st,
+wirf.s,
+wirk.s,
+wirr.s,
+wirt.s,
+wisch.s,
+wispel.s,
+wiss.s,
+wi1.s,
+witt.s,
+witter.s,
+witwe.s,
+witwer.s,
+witz.s,
+wo.st,
+wobei.st,
+woben.s,
+woche.s,
+wochenende.a.2.6,
+wodurch.st,
+wof2r.st,
+wog.s,
+woher.s,
+wohin.s,
+wohl.s,
+wohlauf.a.4,
+wohn.s,
+wolf.s,
+wolk.s,
+woll.s,
+womit.s,
+wom3glich.s,
+wonach.s,
+wonne.s,
+woran.a.3,
+worauf.a.3,
+woraus.a.3,
+worb.s,
+worden.s,
+worfen.s,
+worin.a.3,
+wort.s,
+wor2ber.a.3,
+wovon.st,
+wovor.s,
+wozu.st,
+w3ch.s,
+w3chentlich.s,
+w3hn.s,
+w3lb.s,
+w3lk.s,
+w3rt.s,
+w3rter.s,
+wrack.s,
+wuch.s,
+wuchs.s,
+wulst.s,
+wund.s,
+wunder.s,
+wunsch.s,
+wurde.s,
+wurf.s,
+wurm.s,
+wurst.s,
+wurzel.s,
+wusch.s,
+wuschel.s,
+wust.s,
+wu1t.s,
+wut.s,
+w2chs.s,
+w2hl.s,
+w2nsch.s,
+w2rd.s,
+w2rf.s,
+w2rg.s,
+w2rm.s,
+w2rst.s,
+w2rz.s,
+w2st.s,
+w21t.s,
+w2t.s,
+xylophon.s,
+yankee.s,
+ypsilon.s,
+zack.s,
+zag.s,
+zahl.s,
+zahm.s,
+zahn.s,
+zange.s,
+zank.s,
+zapf.s,
+zappel.s,
+zart.s,
+zauber.s,
+zaum.s,
+zaun.s,
+zaus.s,
+z4h.s,
+z4hl.s,
+z4hm.s,
+z4hn.s,
+z4nk.s,
+z4pf.s,
+z4rt.s,
+z4un.s,
+zebra.a.2,
+zech.s,
+zeck.s,
+zeder.s,
+zeh.s,
+zehe.s,
+zehn.s,
+zehr.s,
+zeich.s,
+zeig.s,
+zeih.s,
+zeil.s,
+zeile.s,
+zeisig.s,
+zeit.s,
+zell.s,
+zellophan.s,
+zelt.s,
+zement.s,
+zensier.s,
+zensur.s,
+zenti.v,
+zentner.s,
+zentr.a.3,
+zentral.a.3,
+zentri.a.3,
+zentrum.a.3,
+zer.v,
+zeremonie.s,
+zerr.s,
+zettel.s,
+zeug.s,
+zicht.s,
+zick.s,
+ziege.s,
+ziegel.s,
+zieh.s,
+ziel.s,
+ziem.s,
+ziemlich.s,
+zier.s,
+zierde.s,
+ziffer.s,
+zig.e,
+zigarette.s,
+zigarre.s,
+zigeuner.s,
+zimmer.s,
+zimperlich.s,
+zimt.s,
+zink.s,
+zinn.s,
+zins.s,
+zipfel.s,
+zirka.s,
+zirkel.s,
+zirkul.s,
+zirkus.s,
+zirp.s,
+zisch.s,
+zitat.s,
+zither.s,
+zitier.s,
+zitrone.a.2,
+zitter.s,
+zittrig.s,
+zivil.s,
+zivilisation.s,
+zivilisier.s,
+zog.s,
+zoll.s,
+zone.s,
+zoo.s,
+zopf.s,
+zorn.s,
+zott.s,
+zottel.s,
+z3g.s,
+z3ll.s,
+zu.vst,
+zuber.s,
+zucht.s,
+zuck.s,
+zucker.s,
+zug.s,
+zuge.vs,
+zugeben.s,
+zum.st,
+zunge.s,
+zupf.s,
+zur.st,
+zurzeit.s,
+zusammengesetzt.s,
+z2cht.s,
+z2ck.s,
+z2g.s,
+z2nd.s,
+z2ngel.s,
+z2rn.s,
+zwang.s,
+zwanzig.s,
+zwar.st,
+zw4ng.s,
+zweck.s,
+zwei.s,
+zweier.a.4,
+zweif.s,
+zweifel.s,
+zweig.s,
+zwerchfell.s,
+zwerg.s,
+zwetsche.s,
+zwetschge.s,
+zwetschke.s,
+zwick.s,
+zwie.v,
+zwiebel.s,
+zwilling.s,
+zwing.s,
+zwinker.s,
+zwirn.s,
+zwischen.s,
+zwischendurch.s,
+zwist.s,
+zwitscher.s,
+zw3lf.s,
+zwung.s,
+zykl.a.2,
+zyklus.a.2,
+zylind.s,
+zyn.s,
+zypresse.a.2}
diff --git a/obsolete/systems/sisisi/unix/COMMON/worttab.htx b/obsolete/systems/sisisi/unix/COMMON/worttab.htx
new file mode 100644
index 0000000000..b297dd449e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/COMMON/worttab.htx
@@ -0,0 +1,5576 @@
+ab vst
+abakus s
+abel e
+abend s
+abenteuer s
+aber vst
+able e
+abonn s
+absolut s
+abstrahier a 2
+abstrakt a 2
+absurd s
+abszeá a 2
+abt s
+ach st
+ache s
+achs s
+achsel s
+acht s
+acker s
+adapt a 2
+ad„quat a 2
+add s
+ade s
+adel s
+ader s
+adjektiv s
+adler s
+administrat a 2 6
+adress a 5
+advent s
+aero v
+aff s
+afrika s
+age e
+agent s
+aggress a 2
+aha st
+ahm s
+ahn s
+ahorn s
+aids s
+akadem s
+akazie s
+akkord s
+akkordeon s
+akt s
+aktiv s
+aktualit„t s
+aktuell s
+akust s
+akzept s
+akzeptanz s
+al e
+alarm s
+album s
+alemann s
+alfabet s
+alge s
+algebra a 2 4
+algorithm s
+algorithmus s
+alisch e
+alisier e
+alkohol s
+alkoholiker s
+all s
+allein s
+allerdings s
+alles s
+alli s
+allm„hlich s
+allzu s
+alm s
+almose s
+alp s
+alphabet s
+als st
+also st
+alt s
+altar s
+alter s
+alternativ s
+aluminium s
+am st
+amateur s
+ambition s
+amboá s
+ambulat s
+ameise s
+amen s
+amerika s
+amok s
+ampel s
+amsel s
+amt s
+an vst
+analog s
+analys s
+analytisch s
+ananas s
+and e
+ander s
+anderer s
+anderswo s
+angel s
+anger s
+angina s
+angst s
+anim s
+animo s
+animus s
+anker s
+annuit„t s
+anonym a 2
+anorak s
+ans„ssig s
+ant e
+anteil s
+antenn s
+anthropo a 2
+anti v
+antlitz s
+antwort s
+anz e
+aper s
+apfel s
+apostel s
+apotheke s
+apparat s
+appell s
+appetit s
+applaudier a 2
+applaus a 2
+approxim a 2 5
+april a
+aquarium s
+arbeit s
+arbeiter s
+architekt s
+architekton s
+architektur s
+archiv s
+arg s
+argument s
+ariat e
+aristokrat a 3 6
+arit„t e
+arithmet s
+arm s
+armut s
+aroma s
+art s
+arthritis a 2 6
+artikel s
+artikul s
+arznei s
+arzt s
+asbest s
+asch s
+asiat s
+aspekt au 4
+asphalt s
+assistent s
+assistenz s
+assistier s
+ast s
+astro au 4
+aá s
+at e
+atelier s
+atem s
+athlet s
+ation e
+atlas s
+atm s
+atmosph„r a 2 4
+atom s
+atomar s
+attentat s
+attent„ter s
+attest s
+attrakt a 2
+au s
+auch st
+auf vs
+aufs st
+aug s
+august s
+aus vst
+austral a 2
+austria a
+auáen s
+auáer s
+auáerdem s
+auto vs
+autobahn s
+autodrom a 4
+automat s
+automatisch s
+autor s
+avanc s
+avantgard s
+axiom s
+axt st
+„cht s
+„chz s
+„ff s
+„hn s
+„hre s
+„lt s
+„mt s
+„nder s
+„ngst s
+„pfel s
+„quivalent s
+„quivalenz s
+„r e
+„rg s
+„rger s
+„rm s
+„rzt s
+„st s
+„sthet a 2
+„t e
+„tz s
+„ug s
+„uáer s
+„xte s
+baby a 2
+bach s
+back s
+bad s
+baff s
+bagger s
+bahn s
+bahr s
+balanc s
+bald s
+baldrian s
+balg s
+balken s
+balkon s
+ball s
+ballett s
+ballon s
+balsam s
+balz s
+banal s
+banane s
+band s
+bandag s
+bang s
+banjo s
+bank s
+bann s
+bar evst
+baracke s
+barg s
+barm s
+baro v
+barock s
+barren s
+barsch s
+bart s
+bas s
+basis s
+bast s
+baá s
+bat s
+bau s
+bauch s
+bauer s
+baum s
+bausch s
+bazillen s
+bazillus s
+b„ch s
+b„ck s
+b„cker s
+b„d s
+b„hn s
+b„lk s
+b„ll s
+b„nd s
+b„ng s
+b„nk s
+b„r s
+b„rt s
+b„sse s
+b„uch s
+b„uer s
+b„um s
+b„usch s
+be v
+beb s
+becher s
+becken s
+beef s
+beer s
+beerd a 2
+beet s
+begann s
+beginn s
+begonn s
+behend s
+beh”rd s
+bei vst
+beicht s
+beid s
+beige s
+beil s
+beim st
+bein s
+beinhalt a 2
+beiá s
+beiz s
+bejah s
+bell s
+bengel s
+benzin s
+bequem s
+berg s
+bergab a 4
+bergauf a 4
+berchtigt s
+beschwerd s
+beschwerde a 2
+besen s
+besser s
+best s
+best„tig s
+besteh s
+bet s
+bet„ub s
+betrieb a 2
+bett s
+beug s
+beul s
+beut s
+beutel s
+bezirk s
+bibel s
+biber s
+bibl s
+biblio a 2
+bibliothek a 2
+bieg s
+biene s
+bier s
+biet s
+bikini a 2 4
+bilanz s
+bild s
+billig s
+billiger s
+bin st
+bin„r s
+bind s
+binnen s
+bio v
+biolog s
+birg s
+birk s
+birn s
+birne s
+bis s
+bischof s
+bisch”f s
+bisher s
+biskott s
+biskuit a 3
+biss s
+bist st
+biá s
+bitt s
+bitter s
+blam s
+blank s
+blas s
+blaá s
+blatt s
+blau s
+bl„h s
+bl„s s
+bl„tt s
+bl„u s
+blech s
+blei s
+bleib s
+bleich s
+blend s
+blick s
+blieb s
+blies s
+blind s
+blink s
+blinz s
+blitz s
+block s
+blond s
+bloá s
+bl”cke s
+bl”d s
+bl”k s
+blӇ s
+bluejean a 4
+bluff s
+blum s
+blunze s
+bluse s
+blut s
+blff s
+blh s
+blm s
+blt s
+bob s
+bock s
+boden s
+bog s
+bohne s
+bohr s
+boiler s
+boje s
+bold s
+bolz s
+bombard s
+bombe s
+bonbon s
+bonbonniere s
+bonus s
+boom s
+boot s
+bord s
+bordre s
+borg s
+borst s
+borte s
+bos s
+bot s
+botan s
+bottich s
+box s
+b” s
+b”ck s
+b”ller s
+b”rse s
+b”s s
+b”schung s
+b”t s
+brach s
+bracht s
+branche s
+brand s
+brannt s
+brat s
+brau s
+brauch s
+braun s
+brav s
+bravo s
+br„nd s
+br„t s
+br„u s
+br„uch s
+br„un s
+br„ut s
+br„utigam s
+brech s
+brei s
+breit s
+brems s
+brenn s
+brenz s
+brett s
+brezel s
+brich s
+brief s
+brikett s
+brill s
+bring s
+brise s
+broch s
+brock s
+brod s
+brodel s
+brom s
+bronchial s
+bronchitis s
+brosamen s
+brosch s
+broschre s
+brot s
+br”ck s
+br”sel s
+br”t s
+bruch s
+bruder s
+brumm s
+brunn s
+brunst s
+brust s
+brut s
+brutal s
+brutto s
+brutzel s
+brch s
+brck s
+brder s
+brh s
+brll s
+brnett s
+brst s
+brt s
+bub s
+buch s
+buchstab s
+buck s
+bude s
+budel s
+budget s
+buffet s
+bug s
+buket s
+bummel s
+bummerl s
+bund s
+bunt s
+bure s
+burg s
+bursch s
+bus s
+busch s
+bussard s
+busserl s
+buá s
+butt s
+butter s
+butzen s
+bch s
+bck s
+bffel s
+bffet s
+bg s
+bgel s
+bhn s
+bnd s
+brg s
+brgermeister s
+bro s
+brst s
+bsch s
+bá s
+bzw st
+cafe s
+camp s
+camping s
+cellist s
+cello s
+cellophan s
+celsius s
+center s
+champagner a 4 6
+champignon a 4 6
+chance s
+chaos s
+chaot s
+charakter s
+charm s
+chauff s
+chef s
+chem s
+chemikal s
+chen e
+chiffr a 4
+china s
+chines s
+chip s
+chirurg a 4
+chlor s
+cholera s
+chor s
+choral s
+choreo v
+choreograph a 3 6
+christ s
+christus s
+chrom s
+city s
+clever s
+clown s
+club s
+cod s
+collage s
+compiler s
+computer s
+couch s
+courag s
+cousin s
+cowboy s
+creme s
+cup s
+da svt
+dabei s
+dach s
+dacht s
+dackel s
+dadurch s
+dafr s
+daher s
+dahin s
+damal s
+dame s
+damit st
+damm s
+dampf s
+dampfer s
+dank s
+dann st
+dar vst
+daran a 3
+darauf a 3
+daraus a 3
+darb s
+darf s
+darin a 3
+darm s
+darum a 3
+das st
+dasjenige s
+dasselbe s
+daá st
+data s
+datei s
+daten s
+datier s
+dattel s
+datum s
+dau s
+dauer s
+davon s
+dazu s
+d„ch s
+d„mm s
+d„mmer s
+d„mpf s
+d„mpfer s
+d„rm s
+debakel s
+deck s
+defekt s
+definier s
+definition s
+defizit s
+degen s
+dehn s
+deich s
+deichsel s
+dein s
+deka v s
+dekan s
+deklar a 2
+dekor s
+deleg s
+delikat s
+delikatesse s
+delikt s
+delphin s
+dem s
+demokrat a 2 4
+demol s
+demonstr a 2 5
+demut s
+demtig s
+den st
+denen st
+dengel s
+denjenigen s
+denk s
+denn s
+dennoch s
+denselben st
+dentist s
+deponie s
+depress a 2
+deprim a 2
+der s
+derb s
+derby s
+derjenig s
+des st v
+deshalb st
+design s
+deskript a 2
+dessen s
+dessert s
+desto s
+deswegen s
+deszend a 2
+detail s
+detektiv s
+determin s
+deut s
+deutsam s
+deutsch s
+deutschen s
+dezember s
+dezi v
+dezimal s
+dia s
+diagnos a 3
+diagnose a 3
+diagonal s
+diagramm a 3
+dialekt s
+dialog s
+diamant s
+di„t s
+dich st
+dicht s
+dick s
+dickicht s
+didakt s
+die s
+dieb s
+diejenige s
+dien s
+dienst s
+dienstag a 5
+dies s
+diffam s
+different s
+differential s
+differenz s
+diffizil s
+digital s
+dikt s
+dilemma s
+dilett s
+dimension s
+dimensional s
+ding s
+di”zes s
+diphtherie s
+diplom a 2
+dir st
+direkt s
+dirig s
+dirigent s
+dirndl s
+dis v
+diskont s
+diskret a 3
+diskussion s
+diskut s
+dispon s
+dissert s
+distanz s
+distel s
+disziplin a 3 5
+diva s
+divergent s
+divergenz s
+divers s
+divid s
+divis s
+diwan s
+doch st
+docht s
+dogge s
+dohle s
+doktor s
+dokument s
+dokumentar s
+dokumentation s
+dolch s
+dollar s
+dolmetsch s
+dom s
+domino s
+dompt s
+donau s
+donner s
+donnerstag a 3 7
+doppel s
+doppl s
+dorb s
+dorf s
+dorn s
+dorr s
+dorsch s
+dort s
+dose s
+dot s
+dotter s
+dozent s
+dozier s
+d”rf s
+d”rr s
+drache s
+dragoner s
+draht s
+drama s
+dran vst
+drang s
+drap s
+drastisch s
+drauf st v
+draus st
+drauáen st
+dr„ht s
+dr„ng s
+drechseln s
+drechsler s
+dreck s
+dreh s
+drei s
+dreier a 4
+dreiáig s
+dresch s
+dress s
+dreá s
+dribb s
+drieá s
+drill s
+drin st
+dring s
+drinnen st
+drischt s
+dritt s
+droben st
+drog s
+droh s
+drollig s
+dromedar s
+drosch s
+dross s
+droá s
+dr”hn s
+druck s
+drum vst
+drungen s
+drunter st
+druá s
+drben st
+drber s
+drck s
+drs s
+dschungel s
+dschunke s
+du st
+duck s
+dudel s
+duell s
+duett s
+duft s
+dukat s
+duktion s
+duld s
+dumm s
+dumpf s
+dung s
+dunkel s
+dunkl s
+dunst s
+dur s
+durch vs
+durchaus a5
+durchs st
+durf s
+durst s
+dusch s
+dutzend s
+duz s
+dbel s
+dft s
+dmm s
+dng s
+dnn s
+dnst s
+drf s
+drr s
+drst s
+ds s
+dster s
+dynam s
+dynamik a 2
+dynamisch a 2
+dynamo s
+dynast s
+e e
+eben s
+ebenso st
+eber s
+ebne s
+echo s
+echse s
+echt s
+eck s
+edel s
+edit s
+efeu s
+effekt s
+effektiv s
+effizient s
+effizienz s
+egal s
+egg s
+egoist a 3
+ehe s
+ehr s
+ei es
+eich s
+eid s
+eier s
+eifer s
+eifrig s
+eig s
+eigentlich s
+eil s
+eimer s
+ein vs
+einander a 3
+eine s
+einem s
+einen s
+einer s
+einheit s
+einig s
+einiger s
+eins s
+einsam s
+einzel s
+einzig s
+eis s
+eisen s
+eisern s
+eitel s
+eiter s
+eitrig s
+ekel s
+el e
+elast s
+elastizit„t s
+elefant s
+eleg s
+elegant s
+eleganz s
+elektr a4
+elektrizit„t a 4
+elektro a 4
+element s
+elementar s
+elend s
+elf s
+elimin s
+ell e
+ellbogen s
+elle e
+ellen e
+ellenbogen s
+elles e
+ellipse s
+elliptisch s
+elnd e
+elster s
+eltern s
+em e
+email s
+emaill s
+emp v
+empir s
+empor s
+emp”r s
+emsig s
+en e
+end es
+energ s
+eng s
+enkel s
+enorm s
+ensemble a 2 5
+ent ve
+entbehr s
+ente s
+entgolt s
+entlich e
+entzckend s
+enz e
+enzian s
+epiped s
+episode s
+epoch s
+er vset
+erb s
+erd s
+erei e
+ergonom s
+erker s
+erl s
+ernd e
+ernst s
+ernte s
+erst s
+erz s
+es est
+esch s
+esel s
+eskal s
+eskapade s
+eskimo s
+espe s
+essant s
+esse s
+essig s
+eá s
+etage s
+etappe s
+eternit s
+eth a 3
+etikett s
+etliche s
+etui s
+etwa s
+etwaig a 2 4
+etwas st
+euch st
+euer st
+eule s
+eur e
+eure est
+europa s
+europ„ s
+euter s
+evangel s
+eventuell s
+ewig s
+ex v
+exakt a 2
+exemplar a 2 4
+exerz a 2
+exil s
+existent a 3
+existenz s
+existier s
+exklud a2
+exklus a 2
+exorbitant a 2
+exot s
+experiment s
+experte s
+explizi a 2
+explodier a 2
+explosion a 2
+exponent s
+export s
+expreá a 2
+exspekt a 2
+extern s
+extra a 2
+extrem a 2
+extrema a 2
+extremal a 2
+fabel s
+fabrik a 2
+fabrikant a 2
+fabrikat a 2
+fabrikation a 2
+fabrizier s
+fach s
+fackel s
+fad s
+faden s
+fahl s
+fahn s
+fahnd s
+fahr s
+fakt s
+fakult„t s
+falk s
+fall s
+falsch s
+falt s
+famili„r s
+familie s
+famos s
+fanat s
+fand s
+fanfare s
+fang s
+farb s
+farm s
+faschier s
+fasching s
+faser s
+fass s
+fasson s
+fast s
+faá s
+faát s
+fauch s
+faul s
+faust s
+faxe s
+fazit s
+f„cher s
+f„d s
+f„den s
+f„hig s
+f„hr s
+f„hrd s
+f„ll s
+f„lsch s
+f„lt s
+f„ng s
+f„rb s
+f„ul s
+f„ust s
+feber s
+februar a 2 5
+fecht s
+feder s
+fee s
+feg s
+fehd s
+fehl s
+fehler s
+feier a 3
+feig s
+feil s
+feilsch s
+fein s
+feind s
+feld s
+felg s
+fell s
+fels s
+fenster s
+ferien a 2 4
+ferkel s
+fern s
+fers s
+fertig s
+fesch s
+fessel s
+fest s
+feál s
+fett s
+fetz s
+feucht s
+feuer s
+feurig s
+fiaker s
+fibel s
+ficht s
+fidel s
+fieber s
+fiebrig s
+fied s
+fiedel s
+fiehl s
+fiel s
+figur s
+fikt s
+file au 3
+filial s
+film s
+filter s
+filtr s
+filz s
+final s
+finanz s
+finanziell s
+find s
+finesse s
+fing s
+finger s
+finish s
+finit s
+fink s
+finster s
+firm s
+firma s
+firn s
+firnis s
+first s
+fisch s
+fischer s
+fistel s
+fit s
+fix s
+flach s
+flacker s
+flad s
+flagg s
+flamm s
+flanell s
+flank s
+flasche s
+flatter s
+flau s
+flaum s
+fl„ch s
+fl„sch s
+flecht s
+fleck s
+fleckerl s
+fledermaus s
+flegel s
+fleh s
+flehentlich s
+fleisch s
+fleiá s
+fletsch s
+flexib s
+flexibilit„t s
+flicht s
+flick s
+flieder s
+flieg s
+flieh s
+flies s
+flieá s
+flimmer s
+flink s
+flint s
+flitter s
+flitz s
+flocht s
+flock s
+flog s
+floh s
+flosse s
+floá s
+flott s
+flӇ s
+fl”te s
+fluch s
+flucht s
+flug s
+flunker s
+flur s
+fluss s
+fluá s
+flut s
+flcht s
+flge s
+flgel s
+flgge s
+flss s
+flster s
+focht s
+fohl s
+folg s
+folgend s
+folgender s
+folie s
+folter s
+fon s
+fonds s
+fopp s
+forc s
+forder s
+forelle s
+foren s
+form s
+formal s
+format s
+formel s
+formular s
+formulier s
+forsch s
+forst s
+fort s
+forum s
+foto s
+f”hn s
+f”hre s
+f”n s
+f”rder s
+f”rm s
+f”rst s
+fracht s
+frag s
+frank s
+frans s
+fraá s
+fratz s
+frau s
+fr„chter s
+fr„s s
+fr„á s
+fr„ulein s
+frech s
+frei s
+freitag s
+fremd s
+frequentier s
+frequenz s
+fress s
+freu s
+freud s
+freund s
+frev s
+fried s
+frier s
+fris s
+frisch s
+frist s
+friá s
+frittat s
+froh s
+fromm s
+fron s
+front s
+fror s
+frosch s
+frost s
+frott s
+frotzel s
+fr”h s
+fr”st s
+frucht s
+frcht s
+frh s
+fuchs s
+fug s
+fuhr s
+fund s
+funk s
+funktion s
+furch s
+furcht s
+furt s
+furunkel s
+fusion s
+fuá s
+futter s
+futteral s
+fg s
+fhl s
+fhr s
+fll s
+fnd s
+fnf s
+fr vst
+frcht s
+frst s
+fá s
+ftter s
+gab s
+gabel s
+gacker s
+gaff s
+galant s
+galerie s
+galgen s
+gall s
+galopp s
+galt s
+gams s
+gang s
+gans s
+ganz s
+gar s
+garag s
+garaus a 3
+garb s
+garde s
+garnitur s
+garten s
+gas s
+gaso v
+gasse s
+gast s
+gatsch s
+gatt s
+gau s
+gaul s
+gaumen s
+gauner s
+g„b s
+g„hn s
+g„ng s
+g„ns s
+g„nz s
+g„r s
+g„rten s
+g„ste s
+g„á s
+ge v
+geb s
+gebaut s
+geb„rd s
+geb„ud s
+geber s
+geboren s
+gebracht a 2
+geburt s
+gebhr s
+gedeih s
+gediegen s
+gedieh s
+gegen s
+gegend s
+gegn s
+gegner s
+gegolten s
+geh s
+gehalt s
+geheim s
+geheuer s
+geheuren s
+geier s
+geig s
+geil s
+geisel s
+geist s
+geiá s
+geiz s
+gelb s
+geld s
+gelegentlich s
+geling s
+gell s
+gelse s
+gelt s
+gelbd s
+gem„lde s
+gems s
+gems s
+genau s
+genauso s
+gendarm s
+general s
+generator s
+generell s
+generier s
+genes s
+genesen s
+genieá s
+genoss s
+genoá st
+genug s
+geng s
+geo v
+gerad s
+geradeaus a 6
+geradezu s
+gerb s
+germ s
+german s
+gern s
+gerste s
+gerte s
+gerch s
+germpel s
+ges„á s
+geschah s
+geschehen s
+geschieht s
+geschm„cker a 2
+geschmeid a 2
+geschwister s
+geschwr a 2
+geselcht s
+gesell s
+gesind s
+gessen s
+gest s
+gestrig s
+gestrpp a 2
+gestt s
+gesund s
+gesungen s
+gesunken s
+geálich s
+getan s
+getreide a 2
+geud s
+gewalt s
+gewann s
+gewinn s
+gewiá s
+geziefer s
+geziem s
+gib s
+gicht s
+gieb s
+gier s
+gieá s
+gift s
+gigant s
+gilb s
+gilt s
+ging s
+ginster s
+gipfel s
+gips s
+giraffe s
+girlande s
+girr s
+gitarre s
+gitter s
+gladiole s
+glanz s
+glas s
+glatt s
+glatz s
+glaub s
+gl„nz s
+gl„s s
+gl„tt s
+gl„ub s
+gleich s
+gleis s
+gleit s
+gletscher s
+glich s
+glied s
+glimm s
+glimpf s
+glitschig s
+glitt s
+glitzer s
+glitzernd s
+global s
+globus s
+glock s
+glomm s
+gloss s
+glossar s
+glotz s
+gl”ck s
+glucks s
+glut s
+glck s
+glh s
+gnade s
+gn„dig s
+gng s
+gockel s
+gold s
+golf s
+gonal s
+gondel s
+gong s
+gorilla s
+goss s
+goá s
+gott s
+g”nn s
+g”tt s
+grab s
+grad s
+graf s
+gram s
+gramm s
+grammatikalisch s
+granat s
+grandios s
+granit s
+grant s
+graph s
+graphik s
+gras s
+grat s
+gratis s
+gratul s
+grau s
+graupel s
+grav s
+gravierend s
+grazi s
+gr„b s
+gr„f s
+gr„m s
+gr„s s
+gr„álich s
+gr„te s
+gr„tsch s
+greif s
+greis s
+greiáler s
+grell s
+gremien a 3 5
+gremium s
+grenz s
+greuel s
+grieá s
+griff s
+grill s
+grimasse s
+grimm s
+grind s
+grins s
+gripp s
+grob s
+grobian s
+groll s
+groschen s
+groá s
+grott s
+gr”hl s
+grӇ s
+grub s
+gruft s
+grund s
+grunz s
+gruppe s
+gruppier s
+grusel s
+gruss s
+gruá s
+grb s
+grn s
+grnd s
+grá s
+guck s
+gugelhupf s
+gulasch s
+gulden s
+gummi s
+gunst s
+gurgel s
+gurk s
+gurt s
+guss s
+guá s
+gut s
+gltig s
+gnst s
+grt s
+gss s
+gt s
+gymnasi s
+gymnasium s
+gymnast s
+haar s
+hab s
+habicht s
+habilit s
+hack s
+hader s
+hafen s
+hafer s
+hafner s
+haft s
+hag s
+hagel s
+hahn s
+hai s
+hain s
+hak s
+halb s
+halde s
+halfter s
+hall s
+hallo s
+halm s
+hals s
+halt s
+hammel s
+hammer s
+hampel s
+hamster s
+hand s
+handlung s
+hanf s
+hang s
+hangar s
+hantier s
+haper s
+happen s
+hardware au 4 7
+harfe s
+harm s
+harmon s
+harmonika s
+harn s
+harpun s
+harr s
+harsch s
+hart s
+hartn„ckig s
+harz s
+hasch s
+hase s
+hasel s
+hass s
+hast s
+haá s
+hat s
+hatte s
+hau s
+haube s
+hauch s
+haufen s
+haupt s
+haus s
+haut s
+h„ftling s
+h„k s
+h„kel s
+h„lfte s
+h„lt s
+h„mmer s
+h„nd s
+h„ng s
+h„nseln s
+h„rchen s
+h„rt s
+h„s s
+h„ss s
+h„á s
+h„tsch s
+h„tte s
+h„uf s
+h„upt s
+h„us s
+h„ut s
+heb s
+hecht s
+heck s
+heer s
+hefe s
+heft s
+heg s
+heid s
+heikel s
+heiklig s
+heil s
+heiland s
+heim s
+heimat s
+heirat s
+heiser s
+heiá s
+heit e
+heiter s
+heiz s
+hektar s
+hekto v
+held s
+helf s
+helikopter s
+hell s
+helm s
+hemd s
+hemm s
+hendl s
+hengst s
+henk s
+henne s
+her vs
+herab a 3
+heran a 3
+herauf a 3
+heraus a 3
+herb s
+herbst s
+herd s
+herein a 3
+hering s
+herr s
+herrsch s
+herum a 3
+herz s
+hetz s
+heu s
+heuchel s
+heuchler s
+heuer s
+heul s
+heut s
+hex s
+hieb s
+hielt s
+hier s
+hierarch a 4 6
+hierauf a 4
+hierbei s
+hierfr s
+hierher s
+hierzu s
+hiesig s
+hieá s
+hilf s
+him v
+himmel s
+himmlisch s
+hin vs
+hinab a 3
+hinauf a 3
+hinaus a 3
+hinder s
+hindurch s
+hinein a 3
+hing s
+hink s
+hint s
+hinter s
+hinzu s
+hirn s
+hirsch s
+hirse s
+hirt s
+hiss s
+histor s
+hitz s
+hob s
+hobby s
+hoch s
+hock s
+hof s
+hoff s
+hoffentlich st
+hohe s
+hohl s
+hohn s
+hol s
+holf s
+holper s
+holprig s
+holz s
+homo v
+honig s
+hopf s
+hoppel s
+hoppla s
+hops s
+horch s
+horde s
+horizont s
+horizontal s
+horn s
+hornisse s
+horst s
+hort s
+hose s
+hospital a 2
+hospit„ler a 2
+hostie s
+hotel s
+h”chst s
+h”cker s
+h”f s
+h”h s
+h”ll s
+h”lz s
+h”r s
+h”s s
+hub s
+hudeln s
+huf s
+huhn s
+human s
+hummel s
+hummer s
+humor s
+humpel s
+humus s
+hund s
+hundert s
+hunger s
+hungrig s
+hup s
+hupf s
+hurra s
+hurtig s
+husch s
+hust s
+hut s
+hbsch s
+hft s
+hgel s
+hhn s
+hhner s
+hhnerei a 3 6
+hll s
+hls s
+hndin s
+hpf s
+hrde s
+hsteln s
+ht s
+hyazinth s
+hy„ne a 3
+hydrant a 2
+hygien s
+hymne s
+hypnotis s
+hypothese s
+hypothetisch s
+hyster s
+iade e
+ial e
+iat e
+ich st
+ideal s
+idee s
+ident s
+identifikation s
+idiot s
+ie e
+iell e
+ien e
+ier e
+ig e
+igel s
+ignor s
+ihm st
+ihn s
+ihr s
+ik e
+ika e
+ikum e
+illuster s
+illustr a 2 4
+im st
+imag s
+imbiá s
+imker s
+immer s
+immerzu s
+immun s
+impf s
+implement a 2
+implizi a 2
+import s
+impr„gn a 2 5
+improvis a 2
+impuls s
+imstand s
+in vest
+in„r e
+indes s
+indessen s
+index s
+individu s
+individuum s
+indiz s
+industri a 2 4
+infekt s
+infinitesimal s
+infiz s
+inflation a 2
+infolgedessen s
+informatik s
+information s
+infra a 2
+inhal s
+initi a 2
+injekt s
+inklus a2
+inne s
+innere s
+innig s
+innung s
+ins st
+insbesonder s
+insekt s
+insel s
+inser s
+insgesamt s
+insolvent s
+insolvenz s
+inspekt a 2
+instanz s
+instinkt s
+institut s
+instrument a 2
+inszenier a 2
+integer s
+integr a 2 4
+integral a 2 4
+intelligent s
+intelligenz s
+intendant s
+intens s
+inter v
+interess a 2 5
+intern s
+interpret a 2 5
+intrig a 2
+invalid s
+inventar s
+inventur s
+invest s
+inwieweit s
+ion e
+ional e
+irdisch s
+irgend s
+irgendein a 6
+irgendwie s
+irgendwo s
+irr s
+irrelevant s
+irreversibel s
+isation e
+isch e
+isier e
+ismus e
+iso v
+isol s
+ist st e
+istisch e
+iát s
+italien s
+it„t e
+iter s
+ition e
+ium e
+iv e
+iz e
+ja s
+jacht s
+jacke s
+jag s
+jagd s
+jahr s
+jahresende a 3 6
+jalousie s
+janker s
+januar s
+jauche s
+jauchz s
+jaul s
+jaus s
+jazz s
+j„ck s
+j„ger s
+j„h s
+j„hr s
+j„mmerlich s
+j„nner s
+j„te s
+je st
+jed s
+jedoch st
+jeglich s
+jeher s
+jemals s
+jemand s
+jen s
+jenseits s
+jesus s
+jetzig s
+jetzt s
+jeweil s
+job s
+joch s
+jod s
+jodel s
+jodler s
+joghurt a 2
+johannis s
+johl s
+jongl s
+joppe s
+journal a 4
+jubel s
+jubil s
+jubilar s
+jubil„um s
+juchz s
+juck s
+jud s
+judo s
+jugend s
+juli s
+jung s
+juni s
+justiz s
+jute s
+juwel s
+jux s
+jd s
+jng s
+kabel s
+kabin s
+kachel s
+kaffee s
+kahl s
+kahn s
+kai s
+kaiser s
+kajak s
+kakao s
+kaktus s
+kalb s
+kalender s
+kalk s
+kalkul s
+kalt s
+kam s
+kamera s
+kamerad s
+kamill s
+kamm s
+kamp s
+kampf s
+kanal s
+kanarie s
+kan„le s
+kandid s
+kanin s
+kanister s
+kann s
+kanon s
+kanone s
+kant s
+kanu s
+kanz s
+kap s
+kapazit„t s
+kapital s
+kapit„n s
+kapitel s
+kaplan a 2
+kappe s
+kaputt s
+kapuz s
+kar s
+karabiner s
+karaffe s
+karawan s
+karbol s
+kardinal s
+karg s
+kari s
+karniese s
+karo s
+karosse s
+karott s
+karpfen s
+karte s
+kartei s
+kartoffel s
+karton s
+kasern s
+kasperl s
+kass s
+kassa s
+kastanie s
+kasten s
+katakomb s
+katalog s
+katarrh s
+katastroph a 2 4
+katastrophal s
+katech s
+kategor s
+kater s
+kathol s
+katze s
+kau s
+kauer s
+kauf s
+kaum s
+kautschuk s
+kauz s
+k„fer s
+k„fig s
+k„lt s
+k„m s
+k„mm s
+k„mpf s
+k„nguruh s
+k„pp s
+k„rg s
+k„rt s
+k„se s
+k„st s
+k„tz s
+k„ue s
+k„uf s
+keck s
+kegel s
+kehl s
+kehr s
+keif s
+keil s
+keim s
+kein s
+keit e
+keks s
+kelch s
+kell s
+kenn s
+kenter s
+keram s
+kerb s
+kerker s
+kerl s
+kern s
+kerze s
+kessel s
+kett s
+keuch s
+keule s
+keusch s
+kicher s
+kiebitz s
+kiefer s
+kiel s
+kieme s
+kien s
+kies s
+kilo vs
+kind s
+kinn s
+kino s
+kiosk s
+kipp s
+kirch s
+kirsch s
+kirtag s
+kissen s
+kist s
+kitsch s
+kitt s
+kitz s
+klag s
+klamm s
+klammer s
+klang s
+klappe s
+klappt s
+klaps s
+klar s
+klass s
+klassifizier s
+klatsch s
+klau s
+klaub s
+klausur s
+klavier s
+kl„ff s
+kl„g s
+kl„ng s
+kl„r s
+kleb s
+kleck s
+klee s
+kleid s
+kleie s
+klein s
+kleister s
+klemm s
+klett s
+klima s
+klimper s
+klin s
+kling s
+klink s
+klinker s
+klipp s
+klirr s
+klo s
+klopf s
+klosett s
+kloster s
+klotz s
+kl”ppel s
+klub s
+kluft s
+klug s
+klump s
+klung s
+klft s
+knabber s
+knabe s
+knack s
+knall s
+knapp s
+knarr s
+knatt s
+knaus s
+kn„cke s
+kn„uel s
+knebel s
+knecht s
+knet s
+knick s
+knie s
+kniff s
+knips s
+knirps s
+knirsch s
+knister s
+knitter s
+knoblauch s
+knoch s
+knochen s
+knoll s
+knopf s
+knorpel s
+knorplig s
+knorr s
+knosp s
+knot s
+kn”ch s
+kn”del s
+kn”pf s
+knurr s
+knusper s
+knusprig s
+knll s
+knpf s
+knppel s
+koal a 2
+kobel s
+kobold s
+koch s
+kod s
+kodex s
+koeffizient s
+koffer s
+kogel s
+kognit a 2
+kohl s
+koje s
+kokos s
+koks s
+kolb s
+kolik s
+kollabier s
+kollaps s
+kolleg s
+kollekt s
+koller s
+kolonn s
+kolossal s
+koloá s
+kombination s
+kombinator s
+kombinatorisch s
+kombinier s
+komm s
+komma s
+kommando s
+kommentar s
+kommentier s
+kommiss s
+kommun s
+kommuni s
+kompakt s
+kompanie s
+kompetent s
+kompetenz s
+komplett a 3
+komplex a 3
+kompliment a 3
+kompliz a 3
+kompon s
+komponente s
+kompott s
+kon v
+kondens s
+kondition s
+konditor s
+kondol s
+konfekt s
+konfer s
+konfession s
+konflikt a 3
+kongreá a 3
+kongruenz a 3 6
+konjunktur s
+konkav s
+konkret a 3
+konkurr s
+konkurrent s
+konn s
+konsequent s
+konsequenz s
+konserv s
+konsonant s
+konstant s
+konstruier a 3
+konstrukt a 3
+konsum s
+konsument s
+kontakt s
+konten s
+kontingent s
+kontinuier s
+konto s
+kontra a 3
+kontrakt a3
+kontrast a 3
+kontroll a 3
+konvent s
+konvergent s
+konvergenz s
+konvex s
+konzentr a3 6
+konzept s
+konzern s
+konzert s
+konzession s
+konzil s
+konzipier s
+kooperation a 2
+koordin a 2
+kopf s
+kopie s
+kopplung s
+koralle s
+korb s
+kork s
+korn s
+korrekt s
+korrektur s
+korrel s
+korrespond a 3 5
+korrigier s
+kosmet s
+kosmo s
+kost s
+kostm s
+kot s
+kotz s
+k”ch s
+k”der s
+k”ffer s
+k”hl s
+k”mm s
+k”nig s
+k”nn s
+k”pf s
+k”rn s
+k”rper s
+k”st s
+krabbel s
+krach s
+kraft s
+kragen s
+krakeel s
+kralle s
+kram s
+krampen s
+krampf s
+kran s
+krank s
+kranz s
+krapfen s
+krass s
+kraá s
+krat s
+kratz s
+kraul s
+kraus s
+kraut s
+krawall s
+krawatte s
+krax s
+kr„chz s
+kr„ft s
+kr„gen s
+kr„h s
+kr„mer s
+kr„nk s
+kr„nz s
+kr„usel s
+kr„ut s
+kreat s
+krebs s
+kredenz s
+kredit s
+kreide s
+kreier a 3
+kreis s
+kremp s
+kren s
+krepp s
+kreuz s
+kribb s
+kriech s
+krieg s
+krimi s
+kripp s
+krise s
+krisis s
+kristall s
+krit s
+kriteri s
+kriterium s
+kritzel s
+kroch s
+krokodil s
+kron s
+kropf s
+kr”n s
+kr”te s
+krug s
+krumm s
+krust s
+kruzifix s
+krcke s
+krg s
+krmm s
+krppel s
+krypto v
+kubisch s
+kubus s
+kuchen s
+kuckuck s
+kuf s
+kugel s
+kuh s
+kult s
+kultur s
+kummer s
+kund s
+kunft s
+kunst s
+kunterbunt s
+kupfer s
+kuppe s
+kuppel s
+kupplung s
+kur s
+kurbel s
+kurios s
+kurs s
+kurv s
+kurz s
+kusine s
+kuá s
+kutsch s
+kutte s
+kuvert s
+kbel s
+kche s
+kcken s
+khl s
+khn s
+kken s
+kmmel s
+kmmer s
+knd s
+knft s
+knftig s
+knst s
+kr s
+krbis s
+krschner s
+krz s
+kss s
+kste s
+kybernet s
+lab s
+lach s
+lack s
+lad s
+lag s
+lahm s
+laib s
+laich s
+laie s
+lall s
+lament s
+lamm s
+lampe s
+lampion s
+land s
+lang s
+lanze s
+lapp s
+larv s
+las s
+lasch s
+lass s
+lasso s
+last s
+laá s
+latein s
+latern s
+latsch s
+latte s
+latz s
+lau s
+laub s
+lauch s
+lauf s
+laug s
+laus s
+lausch s
+laut s
+lava s
+lawine s
+lax s
+lazarett s
+l„ch s
+l„dt s
+l„g s
+l„hm s
+l„nd s
+l„nder s
+l„ng s
+l„rm s
+l„ss s
+l„ster s
+l„stig s
+l„á s
+l„át s
+l„uf s
+l„ufer s
+l„us s
+l„ut s
+le e
+leb s
+lechz s
+leck s
+leder s
+ledig s
+lee s
+leer s
+leg s
+legal s
+legitim s
+lehen s
+lehm s
+lehn s
+lehr s
+lei e
+leib s
+leich s
+leicht s
+leid s
+leier s
+leih s
+leim s
+lein s e
+leise s
+leist s
+leit s
+lenk s
+lenz s
+lepra a 2
+ler e
+lerche s
+lern s
+les s
+letzt s
+leucht s
+leugn s
+leut s
+lexikon s
+libelle s
+lich e
+licher e
+licht s
+lid s
+lieb s
+lied s
+lief s
+lieg s
+lieh s
+lies s
+lieá s
+lift s
+lig e
+liga s
+lik”r s
+lila s
+limonade s
+limousine s
+lind s
+lineal s
+linear s
+ling e
+linguist s
+linie s
+linien a 2 4
+linig s
+link s
+linoleum s
+linse s
+lippe s
+lisch e
+lispel s
+list s
+liter s
+literatur s
+litt s
+liturg s
+livr a 2
+lizenz s
+lob s
+loch s
+lock s
+loden s
+log s
+loggia s
+logik s
+logisch s
+loh s
+lohn s
+lok s
+lokal s
+lokomotiv s
+lorbeer s
+los vse
+lot s
+lotto s
+l”b s
+l”ch s
+l”ck s
+l”ffel s
+l”hn s
+l”s s
+l”sch s
+l”t s
+l”w s
+lud s
+luft s
+luke s
+lump s
+lung e
+lunge s
+lupe s
+lust s
+lutsch s
+luv s
+luxuri”s s
+luxus s
+lcke s
+lft s
+lg s
+lmmel s
+lys e
+lyt e
+m e
+mach s
+madonna s
+mag s
+magazin s
+magd s
+magistrat a2 4
+magnet a2
+magneto a2
+mahagoni s
+mahd s
+mahl s
+mahn s
+mai s
+majest s
+majoran s
+makel s
+makkaroni s
+makler s
+mal s
+malus s
+malz s
+man s
+management s
+managen s
+manager s
+manch s
+mand s
+manege s
+mang s
+mangel s
+manifest s
+manipulation s
+manipulier s
+mann s
+man”v s
+mansarde s
+manschette s
+mantel s
+manu s
+manuell s
+mappe s
+marder s
+margarine s
+marginal s
+marionett s
+mark s
+markier s
+markise s
+markt s
+marmelade s
+marmor s
+marsch s
+marter s
+marzipan s
+masch s
+maschin s
+maser s
+mask s
+mass s
+masse s
+mast s
+maá s
+matador s
+match s
+mater s
+material s
+materie s
+mathematik s
+mathematisch s
+matratze a 2
+matrikel a 2 5
+matrix a 2
+matrize a 2 5
+matsch s
+matt s
+matura s
+mauer s
+maul s
+maurer s
+maus s
+maut s
+maxim s
+maximal s
+maximum s
+mayonnaise a 2 5
+m„ch s
+m„dchen s
+m„del s
+m„dl s
+m„h s
+m„ngel s
+m„nn s
+m„ntel s
+m„rchen s
+m„rkte s
+m„rtyrer s
+m„rz s
+m„st s
+m„á s
+m„us s
+mechan s
+mecker s
+medaille s
+medaillon s
+medial s
+medien s
+medikament s
+medium s
+medizin s
+meer s
+mehl s
+mehr s
+meid s
+meier s
+meile s
+mein s
+meind s
+meise s
+meist s
+meiáel s
+meld s
+melk s
+melod s
+melone s
+menagerie s
+meng s
+mensch s
+ment e
+mental s
+menu s
+men s
+merk s
+merz s
+mess s
+messen s
+messer s
+messing s
+meá s
+meta v
+metall s
+metapher s
+meteor s
+meteoro s
+meter s
+method s
+metr a 2
+metropol a 2
+mett s
+metz s
+meut s
+mich s
+mied s
+mieden s
+mien s
+mies s
+miet s
+mikro a 2
+milch s
+mild s
+milit s
+milli v
+milliarde s
+million s
+milz s
+minder s
+mindest s
+mine s
+mineral s
+mini s
+miniatur s
+minimal s
+minimum s
+minister s
+ministerium s
+minus s
+minute s
+mint s
+minz s
+mir st
+misch s
+miser s
+mismus e
+misse s
+mission s
+missionar s
+mist s
+miá vs
+mit vst
+mitt s
+mittag s
+mitter s
+mittler s
+mittwoch s
+mix s
+mobil s
+mobilit„t s
+mocht s
+mod s
+modell s
+modi s
+modifikation s
+modifizier s
+modul s
+modular s
+modus s
+mogel s
+mohn s
+mohr s
+mokka s
+molk s
+moll s
+moment s
+momentan s
+monat s
+mond s
+monitor s
+mono v
+mont s
+montag s
+monument s
+moor s
+moos s
+moped s
+mops s
+moral s
+morast s
+morator s
+mord s
+morg s
+morgen s
+moritat s
+morph s
+morpho v
+morsch s
+mosaik s
+most s
+motiv s
+motor s
+motte s
+m”bel s
+m”bl s
+m”cht s
+m”g s
+m”nch s
+m”rder s
+m”rtel s
+m”we s
+mucks s
+muff s
+mulde s
+muli s
+mull s
+multi s
+multiplikand a 3 5
+multiplikat a 3 5
+mumie s
+mumps s
+mund s
+munition s
+munkel s
+munter s
+mure s
+murks s
+murmel s
+murr s
+mus s
+muschel s
+muse s
+museum a 2 4
+musik s
+musikal s
+musiz s
+muskel s
+muskulatur s
+muskul”s s
+muster s
+muá s
+mut s
+mutter s
+mcke s
+md s
+mh s
+mll s
+mnd s
+mnz s
+mrb s
+mrr s
+mss s
+má s
+máte s
+mt s
+mtz s
+myst s
+mysteri s
+mystif s
+mythen s
+mythisch s
+mythos s
+n e
+nabe s
+nabel s
+nach vs
+nachdem st
+nacht s
+nacken s
+nackt s
+nadel s
+nadel”hr a 2 5
+nag s
+nah s
+nahezu s
+nahm s
+naiv s
+nam s
+namentlich s
+nannt s
+nano v
+narb s
+narkose s
+narr s
+narzisse s
+nas s
+nasch s
+naá s
+nation s
+national s
+natter s
+natur s
+natr s
+n„chst s
+n„cht s
+n„h s
+n„m s
+n„rr s
+n„rrisch s
+n„s s
+nebel s
+neben s
+nebenan a2 5
+nebenbei s
+neblig s
+nebst s
+neck s
+neffe s
+negativ s
+neger s
+negrid a 2
+nehm s
+neid s
+neig s
+nein s
+nelke s
+nenn s
+neon s
+nephritis a 2 6
+nerv s
+nerv”s s
+nessel s
+nest s
+nett s
+netto s
+netz s
+neu s
+neugierde s
+neun s
+neuralg a 4
+neuro v
+neutral a 3
+neutrum a 3
+nicht s
+nick s
+nie s
+nied s
+niere s
+niet s
+nikolaus s
+nikotin s
+nil s
+nimm s
+nipp s
+nirgend s
+nirgendwo s
+nis e
+nische s
+nist s
+niveau s
+nixe s
+nobel s
+noch s
+nock s
+nom s
+nommen s
+nonne s
+nord s
+norm s
+normal s
+nostalg a 4
+not s
+notar s
+notiz s
+nougat s
+novell s
+november s
+n”rd s
+n”rg s
+n”t s
+nudel s
+nugat s
+nuklear a 2
+null s
+numer s
+numerier s
+numerisch s
+nummer s
+nun st
+nunft s
+nunmehr st
+nur st
+nuá s
+nut s
+nutz s
+nutzer s
+nchter s
+nnft s
+nster s
+ntz s
+nylon s
+oase s
+ob v
+obacht a 2
+obdach s
+oben s
+ober s
+obig s
+objekt s
+oblate s
+obmann s
+oboe s
+obschon s
+obst s
+obwohl st
+ochs s
+ocker s
+oder st
+ofen s
+offen s
+offiz s
+offizier s
+oft s
+ohn s
+ohr s
+oktober s
+oliv s
+olymp s
+oma s
+omelett s
+omnibus s
+onkel s
+opa s
+oper s
+operat s
+operette s
+operier s
+opfer s
+opposit s
+opti s
+optik s
+option s
+opus s
+or e
+orange s
+orchester s
+ord s
+ordentlich s
+organ s
+organis s
+organisation s
+organisier s
+orgel s
+orientier s
+original s
+originell s
+orium e
+orkan s
+ornament s
+ort s
+ortho v
+ost s
+oster s
+otter s
+oval s
+ozean s
+”d s
+”fen s
+”ffentlich s
+”ffne s
+”ffnung s
+”ft s
+”hr s
+”ko v
+”l s
+”r e
+”rt s
+”rtlich s
+”s e
+”se s
+”st s
+”ster s
+paar s
+pacht s
+pack s
+padd s
+paket s
+palais s
+palast s
+palaver s
+paletot s
+palett s
+palm s
+pan s
+paneel s
+panorama a 3
+pansch s
+pantoffel s
+pantsch s
+panzer s
+papa s
+papagei s
+papier s
+papp s
+paprika a 2
+papst s
+par st
+para v
+parad s
+paradies s
+parallaxe a 3
+parallel a 3
+parallelo a 3
+pardon s
+parfum s
+parfm s
+parier s
+parit s
+park s
+parlament s
+part s
+partei s
+parterre s
+partie s
+partizip s
+partner s
+party s
+parzell s
+pasch s
+pass s
+passable a 3 5
+passage s
+passagier s
+passier s
+pasta s
+paste s
+pastet s
+pasteurisier s
+pastor s
+paá s
+pat s
+patent s
+patho v
+patient s
+patron a 2
+patsch s
+patschen s
+patz s
+pauk s
+paus s
+pauschal s
+pause s
+pavian s
+pavillon s
+p„chter s
+p„ck s
+p„dagog a 3
+p„pst s
+p„rchen s
+pech s
+pedal s
+pedit s
+pegel s
+pein s
+peitsch s
+pelikan s
+pelz s
+pend s
+pension s
+pensum s
+per vst
+perfekt s
+pergament s
+period a 2 4
+peripher s
+perl s
+perlon s
+permanent s
+perplex a 3
+person s
+personal s
+pers”n s
+percke s
+pessim s
+pest s
+petersil s
+petrol a 2
+petroleum a 2 5
+pfad s
+pfahl s
+pfand s
+pfanne s
+pfarr s
+pfau s
+pf„nd s
+pf„nde s
+pfeffer s
+pfeif s
+pfeil s
+pfennig s
+pferd s
+pfiff s
+pfingst s
+pfirsich s
+pflanz s
+pflaster s
+pflaume s
+pfleg s
+pflicht s
+pflock s
+pflug s
+pflck s
+pflg s
+pfort s
+pfosten s
+pfote s
+pf”rt s
+pfropf s
+pfui s
+pfund s
+pfusch s
+pftze s
+phantas s
+phantast s
+phantom s
+phase s
+philo s
+phon s
+phor e
+photo s
+photograph a 3 5
+phys s
+physio v
+pianino s
+pianist s
+piano s
+pick s
+piekfein s
+piep s
+piesack s
+pigment s
+pik s
+pilger s
+pille s
+pilot s
+pilz s
+pingpong s
+pinguin s
+pink s
+pinne s
+pinsel s
+pinupgirl a3
+pinzette s
+pionier s
+pirat s
+pirouette s
+pirsch s
+piste s
+pistol s
+pittoresk s
+plafond s
+plag s
+plagiat s
+plakat s
+plakette s
+plan s
+planet s
+planke s
+plankton s
+plansch s
+plantage s
+plapper s
+plasma s
+plast s
+plastik s
+plateau s
+platin s
+platitde s
+platonisch s
+platsch s
+platt s
+platz s
+plauder s
+plausch s
+plausibel s
+plazet s
+plazier s
+pl„d s
+pl„doyer s
+pl„n s
+pl„rr s
+pl„tscher s
+pl„tt s
+pl„tz s
+plebej s
+plebiszit a 3 5
+plebs s
+pleite s
+plenar s
+plenum s
+pleuel s
+plexi s
+plissee s
+plizier s
+plomb s
+plos s
+pl”tzlich s
+plump s
+plunder s
+plunze s
+plural s
+plus s
+plnder s
+plsch s
+pneu s
+pneumat s
+poch s
+pock s
+podest s
+podex s
+podium s
+poem s
+poet s
+pokal s
+poker s
+pol s
+polar s
+polem s
+polen s
+police s
+poliklin a 4
+polio s
+polit s
+politur s
+poliz s
+polizei s
+polizze s
+polka s
+pollen s
+polster s
+polter s
+poly v
+polygam s
+polygon s
+polymer s
+polynom s
+polyp s
+pomad s
+pommes s
+pomp s
+ponton s
+pony s
+pool s
+pop s
+popul s
+pore s
+porno s
+por”s s
+port s
+portal s
+portefeuille s
+porti s
+porto s
+portrait s
+porzellan s
+pos s
+posaune s
+position s
+positiv s
+poss s
+post s
+postillion s
+postulat s
+potent s
+potenz s
+powidl s
+p”bel s
+p”kel s
+p”nal s
+p”st s
+pracht s
+pragmat s
+prahl s
+prakt s
+praktikabl a 4 8
+prall s
+prang s
+pranke s
+prass s
+prassel s
+praxis s
+pr„cht s
+pr„dikat s
+pr„g s
+pr„gnant a 3
+pr„lat s
+pr„mie s
+pr„par s
+pr„sent s
+pr„senz s
+pr„sident s
+pr„zis s
+predig s
+preis s
+preiserh”hung a5
+prek„r s
+prell s
+press s
+preá s
+prickel s
+pries s
+priester s
+prim s
+prima s
+primitiv s
+prinz s
+prinzessin s
+prinzip s
+priorit„t s
+prise s
+pritsche s
+privat s
+privileg s
+pro vst
+prob s
+probabil s
+problem a 3
+produkt s
+produzent s
+profess s
+professor s
+profil s
+prognos a 3
+programm a 3
+programmende a 3 8
+progress a 3
+progreá a 3
+projekt s
+projektil s
+projizier s
+promen s
+prompt s
+propag s
+propaganda s
+propeller s
+prophet s
+prophezei a 3 6
+proporz s
+prospekt a 3
+prothese s
+protokoll s
+protz s
+proviant s
+provinz s
+provis s
+prozedur s
+prozent s
+prozess s
+prozeá s
+prunk s
+prf s
+prgel s
+pseudo s
+psych s
+psycho s
+publik a2
+publikum a 2 5
+publiz a 2
+pudding s
+pudel s
+puder s
+puff s
+puffer s
+pullover a 4
+puls s
+pult s
+pulver s
+pump s
+punkt s
+pupille s
+pupp s
+pur s
+purpur s
+purzel s
+pute s
+putz s
+puzzle s
+pnkt s
+pree s
+pyjama s
+pyknisch a 2
+pyramide s
+quader s
+quadrat a3
+quadrier a3
+quak s
+qual s
+qualit s
+quant s
+quantit s
+quart s
+quartal s
+quarz s
+quasi s
+quast s
+quatsch s
+qu„l s
+queck s
+quell s
+quelle s
+quer s
+querfeldein a 4 8
+quetsch s
+quick s
+quiek s
+quietsch s
+quirl s
+quitt s
+quiz s
+quot s
+r e
+rabatt s
+rabe s
+rabiat s
+rach s
+racker s
+rad s
+radikal s
+radio s
+radius s
+raff s
+raffin s
+rag s
+rahm s
+raiffeisen a 5
+rain s
+rakete s
+ramm s
+rampe s
+ramsch s
+rand s
+randalier s
+rang s
+rank s
+rann s
+ranz s
+rapid s
+rappe s
+raps s
+rar s
+ras s
+rasch s
+raspel s
+rat s
+raub s
+rauch s
+rauf s
+rauh s
+raum s
+raunz s
+raupe s
+raus vst
+rausch s
+r„ch s
+r„d s
+r„hm s
+r„nd s
+r„t s
+r„uber s
+r„ucher s
+r„ud s
+r„um s
+r„usch s
+r„usper s
+re v
+reag s
+real s
+realisation s
+realisier s
+realistisch s
+reb s
+rebe s
+rebeln s
+rechen s
+recherch s
+rechn s
+recht s
+reck s
+recorder s
+red s
+redakt s
+reduz s
+reell s
+refer s
+reflekt a 2
+reflex a 2
+refrain a 2
+reg s
+regal s
+regatta s
+regier s
+regiment s
+regisseur s
+registrat a2 4
+registrier a 2 4
+reglement a 2
+regress a 2
+regreá a 2
+regul s
+reh s
+rehabilit s
+reib s
+reich s
+reif s
+reigen s
+reih s
+reim s
+rein s
+reis s
+reiá s
+reiáaus a 4
+reit s
+reiz s
+reklam a 2
+rekord s
+rektor s
+relat s
+relativ s
+relevant s
+relig s
+religi”s s
+remis s
+remp s
+renk s
+renn s
+renov s
+rent s
+rentab s
+rentabilit„t s
+rentner s
+reparatur s
+reparier s
+reptil s
+republik a 2 4
+reserv s
+reservier s
+resonanz s
+respekt a 2
+rest s
+restaur s
+resultat s
+resultier s
+retour s
+retrospektiv a 2 5
+rett s
+rettich s
+reu s
+revanch s
+revers s
+reversibel s
+revolt s
+revolut s
+revolver s
+rezept s
+rhabarber s
+rhetor s
+rheuma s
+rheumatisch s
+rhododendron a 5 8
+rhythm s
+rhythmus s
+ribisel s
+rich e
+richt s
+rieb s
+riech s
+rief s
+rieg s
+riem s
+ries s
+riet s
+rill s
+rind s
+ring s
+ringsum a 5
+rinn s
+ripp s
+rips s
+risiko s
+riskant s
+riskier s
+riss s
+rist s
+riá s
+ritt s
+ritz s
+robe s
+roboter s
+robust s
+roch s
+rock s
+rod s
+rode s
+rodel s
+rogen s
+roggen s
+roh s
+rohr s
+roll s
+roman s
+ronn s
+rosa s
+rose s
+rosig s
+rosin s
+rost s
+roá s
+rot s
+rotz s
+route s
+r”ch s
+r”hr s
+r”ll s
+r”m s
+r”ntgen s
+r”s s
+r”t s
+rubrik a 2
+ruch s
+ruck s
+rudel s
+ruder s
+ruf s
+ruh s
+ruin s
+rum s
+rumor s
+rump s
+rumpf s
+rund s
+runz s
+rupf s
+ruá s
+rute s
+rutsch s
+rb s
+rck s
+rd s
+rg s
+rhm s
+rhr s
+rlps s
+rmpf s
+rpel s
+rsch s
+rssel s
+rst s
+rtt s
+s e
+saal s
+saar s
+saat s
+sach s
+sack s
+safari s
+saft s
+sag s
+sah s
+saison s
+saite s
+sakko s
+sakrament a 2
+sakristei a2
+sal e
+salamander s
+salami s
+salat s
+salb s
+saldo s
+salon s
+salto s
+salut s
+salz s
+sam e
+same s
+samm s
+sammen s
+samstag a 4
+samt s
+sanatorien s
+sanatorium s
+sand s
+sandale s
+sandwich s
+sanft s
+sang s
+sanier s
+sanit„r s
+sanit„t s
+sank s
+sann s
+sardelle s
+sardine s
+sarg s
+sasse s
+saá s
+satan s
+satellit s
+satt s
+satz s
+sau s
+sauber s
+sauce s
+sauciere s
+sauer s
+sauf s
+saug s
+saum s
+sauna s
+saus s
+saxophon s
+s„ s
+s„bel s
+s„ch s
+s„en s
+s„g s
+s„le s
+s„mtlich s
+s„nft s
+s„nger s
+s„t s
+s„tt s
+s„tz s
+s„uber s
+s„uer s
+s„uf s
+s„ug s
+s„ule s
+s„um s
+s„ure s
+s„usel s
+schab s
+schablone a 4
+schach s
+schacht s
+schachtel s
+schad s
+schaf s
+schaff s
+schaft s
+schal s
+schale s
+schall s
+schalt s
+scham s
+schand s
+schank s
+schanz s
+schar s
+scharf s
+schatt s
+schattier s
+schatulle s
+schatz s
+schau s
+schauf s
+schauk s
+schaum s
+sch„big s
+sch„d s
+sch„fer s
+sch„ft s
+sch„hl s
+sch„l s
+sch„m s
+sch„nd s
+sch„rf s
+sch„tz s
+sch„um s
+scheck s
+scheffel s
+scheib s
+scheid s
+schein s
+scheit s
+schell s
+schelm s
+schema s
+schematisch s
+schemel s
+schenk s
+schepper s
+scher s
+scherbe s
+scherflein s
+scherz s
+scheu s
+scheuch s
+scheuá s
+schi s
+schicht s
+schick s
+schieb s
+schied s
+schief s
+schiel s
+schien s
+schieá s
+schiff s
+schikan s
+schild s
+schilf s
+schiller s
+schillernd s
+schilling s
+schimm s
+schimpanse s
+schimpf s
+schind s
+schinken s
+schirm s
+schirr s
+schizophren a 4 6
+schlacht s
+schlack s
+schlaf s
+schlaff s
+schlag s
+schlamm s
+schlamp s
+schlang s
+schlank s
+schlau s
+schlauch s
+schl„cht s
+schl„f s
+schl„g s
+schl„ngel s
+schlecht s
+schleck s
+schlegel s
+schleich s
+schleier a 6
+schleif s
+schleifenende a 6 9
+schleim s
+schleiá s
+schlemm s
+schlender s
+schlenker s
+schlepp s
+schleuder s
+schleunig s
+schleus s
+schlich s
+schlief s
+schlieá s
+schliff s
+schlimm s
+schling s
+schlitt s
+schlitz s
+schlosse s
+schloá s
+schlot s
+schlotter s
+schlucht s
+schluchz s
+schluck s
+schlug s
+schlummer s
+schlund s
+schlupf s
+schluss s
+schluá s
+schlck s
+schlpf s
+schlrf s
+schlss s
+schmach s
+schmack s
+schmal s
+schmalz s
+schmarotz s
+schmarren s
+schmatz s
+schmaus s
+schm„chtig s
+schm„h s
+schmeck s
+schmeich s
+schmeiá s
+schmelz s
+schmerz s
+schmetter s
+schmied s
+schmieg s
+schmier s
+schmilzt s
+schmink s
+schmirg s
+schmiss s
+schmiá s
+schmoll s
+schmolz s
+schmor s
+schmuck s
+schmugg s
+schmunzel s
+schmutz s
+schmck s
+schnabel s
+schnabulier s
+schnall s
+schnalz s
+schnapp s
+schnaps s
+schnarch s
+schnarr s
+schnatter s
+schnaub s
+schnauf s
+schnauz s
+schn„uz s
+schnecke s
+schnee s
+schnei s
+schneid s
+schneien a 6
+schnell s
+schneuz s
+schnippisch s
+schnitt s
+schnitz s
+schnob s
+schnorchel s
+schn”rkel s
+schn”rks s
+schnuller s
+schnupf s
+schnuppe s
+schnupper s
+schnur s
+schnurr s
+schnurstracks a 6
+schnff s
+schnr s
+schob s
+schock s
+schokolade s
+scholle s
+schon s
+schopf s
+schoppen s
+schornstein s
+schossen s
+schoá s
+schote s
+schott s
+sch”n s
+sch”pf s
+schӇ s
+schraff s
+schrank s
+schraub s
+schr„g s
+schr„nk s
+schrebergarten s
+schreck s
+schrei s
+schreib s
+schreit s
+schrie s
+schrieb s
+schrift s
+schrill s
+schritt s
+schrocken s
+schroff s
+schrot s
+schr”pf s
+schrumpf s
+schub s
+schuf s
+schuft s
+schuh s
+schuko s
+schul s
+schuld s
+schulter s
+schund s
+schupp s
+schur s
+schurk s
+schurz s
+schussel s
+schuster s
+schuá s
+schutt s
+schutz s
+schchtern s
+schler s
+schr s
+schrf s
+schrz s
+schss s
+schtt s
+schtz s
+schwach s
+schwade s
+schwager s
+schwalbe s
+schwall s
+schwamm s
+schwan s
+schwand s
+schwang s
+schwank s
+schwanz s
+schwarm s
+schwarte s
+schwarz s
+schwatz s
+schw„ch s
+schw„ger s
+schw„nz s
+schw„nzel s
+schw„r s
+schw„rm s
+schw„rz s
+schw„tz s
+schweb s
+schwefel s
+schweif s
+schweig s
+schwein s
+schweiá s
+schweiz s
+schwel s
+schwell s
+schwemm s
+schwend s
+schwengel s
+schwenk s
+schwer s
+schwester s
+schwieg s
+schwiel s
+schwiele s
+schwierig s
+schwimm s
+schwind s
+schwing s
+schwips s
+schwirr s
+schwitz s
+schwoll s
+schwomm s
+schwor s
+schw”r s
+schwulst s
+schwund s
+schwung s
+schwur s
+schwl s
+sechs s
+sechzehn s
+sechzig s
+see s
+seel s
+segel s
+segen s
+segler s
+segn s
+seh s
+sehr s
+sei s
+seicht s
+seid s
+seif s
+seih s
+seil s
+sein s
+seit s
+sekret a 2
+sekt s
+sekund s
+sekunde s
+selbe s
+selbst s
+selbst„ndig s
+selch s
+selekt s
+selig s
+sellerie s
+selt s
+semant s
+semantik s
+semester s
+semi s
+seminar s
+semmel s
+send s
+senf s
+seng s
+senior s
+senk s
+senn s
+sensation s
+sense s
+sensor s
+separat s
+september s
+sequent s
+sequenz s
+serie s
+serien a 2 4
+seri”s s
+serpentine s
+service s
+servier s
+serviette a 3 5
+sess s
+sessel s
+seá s
+set e s
+setz s
+seuch s
+seufz s
+sex s
+shampoo s
+shopping s
+shorts s
+show s
+sich st
+sichel s
+sicher s
+sicht s
+sicker s
+sie st
+sieb s
+sieben s
+siech s
+sied s
+sieg s
+sieh s
+signal a 2
+signifik a 2 5
+silb s
+silbentrenn a 3 6
+silber s
+silbrig s
+silo s
+silvester s
+simpel s
+sims s
+simul s
+sind st
+sinfon s
+sing s
+sink s
+sinn s
+sintflut a 4
+siphon s
+sippe s
+sirene s
+sirup s
+sitt s
+sittich s
+situation s
+sitz s
+skala s
+skandal s
+skelett s
+ski s
+skizz s
+sklave s
+skop s
+skript s
+slalom s
+slip s
+smaragd s
+so vst
+socke s
+sockel s
+sod s
+soda s
+sodann s
+sodaá s
+sofa s
+soff s
+sofort s
+software au 4 7
+sogar st
+sohl s
+sohn s
+sol s
+solch s
+soldat s
+soll s
+sollen s
+solo s
+somit st
+sommer s
+sonate s
+sonder s
+sonn s
+sonntag s
+sonst s
+soph s
+sopran a 2
+sorg s
+sort s
+sortiment s
+soáe s
+sott s
+soundso a 2 5
+souvenir s
+sowie s
+sowjet s
+sozial s
+sozio v
+s”hn s
+spachtel s
+spagat s
+spaghetti a 3
+spalier s
+spalt s
+span s
+spange s
+spann s
+spar s
+spargel s
+spass s
+spassig s
+spaá s
+spat s
+spatz s
+spazier s
+sp„h s
+sp„lt s
+sp„nn s
+sp„rlich s
+sp„t s
+specht s
+speck s
+spedit s
+speer s
+spei s
+speich s
+speicher s
+speien a4
+speis s
+spektak s
+spektr a 4
+spektra a 4
+spektro a 4
+spektrum a 4
+spekul s
+spend s
+spengler s
+spenst s
+sperling s
+sperr s
+spesen s
+spezial s
+spezialis s
+speziell a 3 5
+spezifikation s
+spezifisch s
+spezifizier s
+spick s
+spiegel s
+spiegelei a 4 7
+spiel s
+spieá s
+spike s
+spinat s
+spindel s
+spinn s
+spion s
+spiral s
+spiritus s
+spital s
+spit„ler a 3
+spitz s
+splitt s
+spontan s
+sporn s
+sport s
+spott s
+sp”tt s
+sprach s
+sprang s
+spray s
+spr„ch s
+sprech s
+spreiz s
+spreng s
+sprenkel s
+spreu s
+sprich s
+sprieá s
+spring s
+springer s
+sprint s
+sprit s
+spritz s
+sprochen s
+spross s
+sproá s
+spr”d s
+sprӇ s
+spruch s
+sprud s
+sprudel s
+sprung s
+sprch s
+sprh s
+sprng s
+spuck s
+spuk s
+spul s
+spund s
+spur s
+spl s
+spr s
+staat s
+stab s
+stabil s
+stach s
+stachel s
+stachl s
+stadel s
+stadion s
+stadium s
+stadt s
+stahl s
+stall s
+stalt s
+stamm s
+stampf s
+stand s
+standard s
+stang s
+stank s
+stanniol s
+stanz s
+stap s
+stapf s
+star s
+starb s
+stark s
+starr s
+start s
+stat s
+statik s
+station s
+statisch s
+statistik s
+statistisch s
+statt s
+statu s
+statue s
+status s
+stau s
+staub s
+stauch s
+staud s
+st„b s
+st„dt s
+st„hl s
+st„mm s
+st„nd s
+st„nker s
+st„rk s
+st„tt s
+steak s
+stech s
+steck s
+steg s
+steh s
+steif s
+steig s
+steil s
+stein s
+stell s
+stellung s
+stelz s
+stemm s
+stempel s
+stengel s
+steno vst
+stephan s
+stepp s
+steppe s
+sterb s
+stereo s
+steril s
+stern s
+sterz s
+stet s
+steuer s
+stich s
+stick s
+stief s
+stiefel s
+stieg s
+stiehlt s
+stiel s
+stier s
+stieá s
+stift s
+stil s
+still s
+stimm s
+stink s
+stipend s
+stirb s
+stirn s
+stoch s
+stock s
+stoff s
+stohl s
+stoisch s
+stollen s
+stolper s
+stolz s
+stop s
+stopf s
+stopp s
+storb s
+storch s
+stoá s
+stotter s
+st”ber s
+st”ck s
+st”hn s
+st”psel s
+st”r s
+stӇ s
+straf s
+straff s
+strahl s
+stramm s
+stramp s
+strand s
+strang s
+strapaz s
+straá s
+strateg s
+strauch s
+strauá s
+str„f s
+str„hn s
+str„á s
+str„ub s
+str„uch s
+str„uá s
+streb s
+streck s
+streich s
+streif s
+streik s
+streit s
+streng s
+stress s
+streá s
+streu s
+strich s
+strichlier s
+strick s
+striegel s
+strieme s
+stritt s
+stroh s
+strolch s
+strom s
+stroph s
+strotz s
+str”m s
+strudel s
+struktur s
+strumpf s
+strunk s
+strupp s
+struwwelpeter s
+strmpf s
+strpp s
+stube s
+stud s
+student s
+studio s
+studium s
+stuf s
+stuhl s
+stulpe s
+stumm s
+stumpf s
+stund s
+stunk s
+sturm s
+sturz s
+stute s
+stutz s
+stb s
+stberl s
+stck s
+stlp s
+stmper s
+stmpf s
+stnd s
+strm s
+strz s
+sttz s
+subtrahend a 3
+subtrahier a3
+subtraktion a3
+subvention s
+such s
+sucht s
+sud s
+suggerier s
+suggest s
+sukzess s
+summ s
+sumpf s
+super vst
+suppe s
+surr s
+suspekt a 2
+suspendier a 3
+suspens a 3
+scht s
+sd s
+shn s
+smpf s
+snd s
+sá s
+swimming s
+symbol a 3
+symbolik a 3
+symbolisch a 3
+symbolis a 3
+symmetr a 3 5
+sympath s
+symphon s
+sympos s
+synchron a 3
+syndik s
+syndikus s
+synonym au 3 5
+syntax s
+synthese s
+system a 2
+systematik a 2
+systematisch a 2
+systematisier a 2
+szene s
+t e
+tabak s
+tabell s
+tabernakel s
+tablett a 2
+tacho s
+tadel s
+tafel s
+tag s
+taill s
+takt s
+tal s
+talent s
+taler s
+talg s
+talisman s
+talk s
+tandem s
+tangent s
+tangier s
+tank s
+tann s
+tante s
+tanz s
+tapet s
+tapezier s
+tapfer s
+tapp s
+tara s
+tarif s
+tarn s
+tasche s
+tasse s
+tastatur s
+tast s
+tat s
+tatsache s
+tatze s
+tau s
+taub s
+tauch s
+tauf s
+taug s
+tausch s
+tausend s
+tax s
+taxi s
+t„fel s
+t„g s
+t„nz s
+t„sch s
+t„t s
+t„tsch s
+t„ub s
+t„uf s
+t„usch s
+team au 3
+technik s
+techniker s
+technisch s
+techno s
+teddy s
+tee s
+teich s
+teig s
+teil s
+teint s
+tel e
+tele vs
+telex s
+teller s
+tempel s
+tempera s
+tempo s
+tendenz s
+tenne s
+tennis s
+tenor s
+teppich s
+term s
+termino s
+terpentin s
+terrasse s
+terrazzo s
+terror s
+terti s
+test s
+teuer s
+teuf s
+text s
+textil s
+theater s
+theist a 3
+thema s
+themen s
+theo s
+theoretisch s
+theorie s
+therap s
+thermal s
+thermo s
+thron s
+thunfisch s
+tick s
+tief s
+tiegel s
+tier s
+tiger s
+tilg s
+tinte s
+tip s
+tipp s
+tipptopp s
+tirol s
+tisch s
+titel s
+tob s
+tochter s
+tod s
+toilett s
+toler s
+toll s
+tolpatsch s
+tomate s
+tombola s
+ton s
+topf s
+topfit s
+topo v
+tor s
+torf s
+torkel s
+tos s
+tot s
+total s
+toto s
+tour s
+t”chter s
+t”dlich s
+t”lpel s
+t”n s
+t”pf s
+t”richt s
+t”s s
+t”t s
+trab s
+tracht s
+tradition s
+traf s
+trafo s
+trag s
+trag”d s
+train s
+trainer s
+training s
+trakt s
+tram s
+trampel s
+tramway s
+tran s
+trank s
+transfer s
+transit s
+transparent s
+transparenz s
+transport s
+transzend s
+transzendent s
+trapez s
+trasse s
+trat s
+tratsch s
+trau s
+traube s
+traum s
+travers s
+tr„cht s
+tr„g s
+tr„ller s
+tr„n s
+tr„nk s
+tr„uf s
+tr„um s
+treff s
+treib s
+trend s
+trenn s
+trepp s
+treppab a 5
+treppauf a 5
+tresor s
+tret s
+treu s
+tribne s
+trichter s
+trick s
+trieb s
+triff s
+trift s
+trikot s
+triller s
+trink s
+trio s
+trippel s
+tritt s
+triumph s
+trock s
+troffen s
+trog s
+tromm s
+trompete s
+trop s
+tropf s
+troph„e au 3 6
+trost s
+trott s
+trotz s
+tr”d s
+tr”pf s
+tr”st s
+trubel s
+trudeln s
+trug s
+truhe s
+trunk s
+trupp s
+trut s
+trb s
+trg s
+trmmer s
+tube s
+tuberkulose s
+tuberkul”s s
+tuch s
+tue s
+tuend s
+tugend s
+tulpe s
+tum e
+tummel s
+tumult s
+tun st
+tunell s
+tunk s
+tunnel s
+tupf s
+turbine s
+turm s
+turn s
+tusch s
+tut s
+tch s
+tck s
+tft s
+tm e
+tmmel s
+tmpel s
+tr s
+trk s
+trm s
+tte s
+typ s
+typhus s
+tyrann s
+ufer s
+uhr s
+uhu s
+ul„r e
+ulme s
+ultimativ s
+ultimatum s
+ultimo s
+ultra a 2
+um vst
+ums st
+umso s
+un v
+und s
+ung e
+ungetm s
+uni s
+uniform s
+universit„t s
+uns s
+unten st
+unter vs
+unterdes s
+ur ve
+urbar s
+urne s
+utop s
+b s
+ber vs
+beraus a 4
+berein a 4
+brig s
+ppig s
+vagabund s
+vakuum s
+valid s
+vall s
+vanille s
+vari s
+variable a 2 5
+vater s
+v„ter s
+veilchen s
+vektor s
+vene s
+ventil s
+ver v
+veranda s
+verb s
+verdutzt s
+veredlung a 3
+verein a 3
+verflixt a 3
+vergaá s
+vergess s
+vergiá s
+verletz s
+verleumd s
+verlier s
+verlor s
+vers s
+version s
+verteidig s
+vertikal s
+vertrackt a 3
+vetter s
+viadukt s
+video v
+vieh s
+viel s
+vier s
+villa s
+villen s
+violett s
+violin s
+viper s
+viren s
+virtuell s
+virtuos s
+virulent s
+virus s
+vision s
+visit s
+visualisier s
+vitamin s
+vize s
+vogel s
+vokabel s
+vokabular s
+vokal s
+volk s
+voll s
+volumen s
+vom st
+von vst
+vor vs
+vorab a 3
+voran a3
+voraus a 3
+vorbei s
+vorder s
+vorher s
+v”gel s
+v”lk s
+v”ll s
+vulkan s
+waag s
+wabe s
+wach s
+wacholder s
+wachs s
+wackel s
+wade s
+waffe s
+waffel s
+wag s
+waggon s
+wahl s
+wahn s
+wahr s
+waid s
+wais s
+wal s
+wald s
+walk s
+wall s
+walt s
+walz s
+wand s
+wange s
+wank s
+wann s
+wanz s
+wapp s
+war s
+warb s
+warf s
+warm s
+wart s
+warum a 3
+warze s
+was s
+wasch s
+wasser s
+wate s
+watschel s
+watt s
+w„ch s
+w„g s
+w„hl s
+w„hn s
+w„hr s
+w„hrend s
+w„ld s
+w„lt s
+w„lz s
+w„nd s
+w„re s
+w„rm s
+w„rt s
+w„sch s
+w„sser s
+web s
+wechsel s
+wechselnd s
+wechsl s
+weck s
+wedel s
+weder s
+weg s
+wegen s
+weh s
+wehr s
+wehtun s
+weib s
+weich s
+weid s
+weiger s
+weih s
+weil s
+wein s
+weis s
+weiá s
+weit s
+weiter s
+weithin a 4
+weizen s
+welch s
+welk s
+well s
+welt s
+wem st
+wen st
+wend s
+wenig s
+wenigsten s
+wenn s
+wer st
+werb s
+werd s
+werf s
+werg s
+werk s
+werkstatt s
+wermut s
+werner st
+wert s
+wes s
+wesen s
+wesend s
+wesentlich s
+weshalb s
+wespe s
+west s
+weswegen s
+wett s
+wetz s
+wich s
+wichs s
+wicht s
+wickel s
+wicklung s
+widder s
+wider vs
+widm s
+widrig s
+wie st
+wieder vst
+wiederum a 6
+wieg s
+wieher s
+wien s
+wierig s
+wies s
+wieso s
+wieviel s
+wild s
+wildbret a 4
+will s
+wimmel s
+wimmer s
+wimpel s
+wimper s
+wind s
+wink s
+winsel s
+winter s
+winz s
+wipfel s
+wir st
+wirbel s
+wird st
+wirf s
+wirk s
+wirr s
+wirt s
+wisch s
+wispel s
+wiss s
+wiá s
+witt s
+witter s
+witwe s
+witwer s
+witz s
+wo st
+wobei st
+woben s
+woche s
+wochenende a 2 6
+wodurch st
+wofr st
+wog s
+woher s
+wohin s
+wohl s
+wohlauf a 4
+wohn s
+wolf s
+wolk s
+woll s
+womit s
+wom”glich s
+wonach s
+wonne s
+woran a 3
+worauf a 3
+woraus a 3
+worb s
+worden s
+worfen s
+worin a 3
+wort s
+worber a 3
+wovon st
+wovor s
+wozu st
+w”ch s
+w”chentlich s
+w”hn s
+w”lb s
+w”lk s
+w”rt s
+w”rter s
+wrack s
+wuch s
+wuchs s
+wulst s
+wund s
+wunder s
+wunsch s
+wurde s
+wurf s
+wurm s
+wurst s
+wurzel s
+wusch s
+wuschel s
+wust s
+wuát s
+wut s
+wchs s
+whl s
+wnsch s
+wrd s
+wrf s
+wrg s
+wrm s
+wrst s
+wrz s
+wst s
+wát s
+wt s
+xylophon s
+yankee s
+ypsilon s
+zack s
+zag s
+zahl s
+zahm s
+zahn s
+zange s
+zank s
+zapf s
+zappel s
+zart s
+zauber s
+zaum s
+zaun s
+zaus s
+z„h s
+z„hl s
+z„hm s
+z„hn s
+z„nk s
+z„pf s
+z„rt s
+z„un s
+zebra a 2
+zech s
+zeck s
+zeder s
+zeh s
+zehe s
+zehn s
+zehr s
+zeich s
+zeig s
+zeih s
+zeil s
+zeile s
+zeisig s
+zeit s
+zell s
+zellophan s
+zelt s
+zement s
+zensier s
+zensur s
+zenti v
+zentner s
+zentr a 3
+zentral a3
+zentri a 3
+zentrum a3
+zer v
+zeremonie s
+zerr s
+zettel s
+zeug s
+zicht s
+zick s
+ziege s
+ziegel s
+zieh s
+ziel s
+ziem s
+ziemlich s
+zier s
+zierde s
+ziffer s
+zig e
+zigarette s
+zigarre s
+zigeuner s
+zimmer s
+zimperlich s
+zimt s
+zink s
+zinn s
+zins s
+zipfel s
+zirka s
+zirkel s
+zirkul s
+zirkus s
+zirp s
+zisch s
+zitat s
+zither s
+zitier s
+zitrone a 2
+zitter s
+zittrig s
+zivil s
+zivilisation s
+zivilisier s
+zog s
+zoll s
+zone s
+zoo s
+zopf s
+zorn s
+zott s
+zottel s
+z”g s
+z”ll s
+zu vst
+zuber s
+zucht s
+zuck s
+zucker s
+zug s
+zuge vs
+zugeben s
+zum st
+zunge s
+zupf s
+zur st
+zurzeit s
+zusammengesetzt s
+zcht s
+zck s
+zg s
+znd s
+zngel s
+zrn s
+zwang s
+zwanzig s
+zwar st
+zw„ng s
+zweck s
+zwei s
+zweier a 4
+zweif s
+zweifel s
+zweig s
+zwerchfell s
+zwerg s
+zwetsche s
+zwetschge s
+zwetschke s
+zwick s
+zwie v
+zwiebel s
+zwilling s
+zwing s
+zwinker s
+zwirn s
+zwischen s
+zwischendurch s
+zwist s
+zwitscher s
+zw”lf s
+zwung s
+zykl a 2
+zyklus a 2
+zylind s
+zyn s
+zypresse a2
diff --git a/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex b/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex
diff --git a/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys b/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys
new file mode 100644
index 0000000000..8cb50412ce
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys
@@ -0,0 +1,27 @@
+c:\sisisi\
+xxx
+c:\sisisi\worttab
+c:\sisisi\worttab
+0 rechter Rand
+0 linker Rand
+2 Seitenumbruch
+0 Einrueckung
+2 Zeilenvorschub
+TRUE Randausgleich
+3 Kopfzone
+3 Fuszzone
+51 Seitenlaenge
+1 Seitennummer
+10 Dokument linker Rand
+72 Dokument rechter Rand
+2 Dokument Zeilenvorschub
+4 Druckertyp : NEC P6
+2 Zeilen zwischen Text und Fuánote
+. Zeichen fr Trennlinie
+10 Linker Rand der Trennlinie
+72 Rechter Rand der Trennlinie
+75 Max. Anzahl von Fuánoten auf einer Seite
+3 Zeilen eines Absatzes mssen auf neue Seite
+2 Zeilen eines Absatzes bleiben auf alter Seite
+8 max linker Rand der Bilder
+70 max rechter Rand der Bilder
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE b/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE
new file mode 100644
index 0000000000..ea97b1f343
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE
@@ -0,0 +1,184 @@
+
+
+ TeX mit SISISI-Silbentrennung
+ =============================
+
+ Technische Dokumentation fuer Fortgeschrittene
+ ==============================================
+
+
+(Hinweis: Dieses File enthaelt nur technische Information. Wenn Sie nur SiTeX
+installieren wollen, ohne sich fuer die Probleme und Hintergruende zu
+interessieren, brauchen Sie dieses File nicht zu lesen. Wenn allerdings bei
+der normalen Installation etwas schiefgehen sollte, kann Ihnen die in diesem
+File enthaltene Information vielleicht weiterhelfen.)
+
+0) Grundsaetzliches.
+--------------------
+
+Die SISISI Silbentrennung ist ein WEB-Changefile (sitex3.ch), das gewoehnlich
+in tex.web hineingetangle'd wird. Fuer die UNIX-Version von TeX wurde
+allerdings ein web2c Konverter geschrieben, der das von tangle erzeugte tex.p
+in C-Code konvertieren soll. Dieser Konverter kann mit den in sitex3.ch
+verwendeten Standard-Pascal Befehlen nicht umgehen, z.B. koennen keine
+statisch geschachtelten Prozeduren verarbeitet werden.
+
+Es war also notwendig, sitex3.ch so zu aendern, dass es von dem web2c
+Konverter verarbeitet werden kann. Ausserdem hat der web2c Konverter einige
+Eigenheiten (sprich Fehler :-), die es notwendig machen, den entstehenden
+C-Code einer Nachbearbeitung (sprich Korrektur) zu unterwerfen. Diese
+Aufgaben wurden im Rahmen eines Informatikpraktikums von den Studenten
+Hans-Juergen Szoldatics und Florian Zwerina geloest.
+
+1) Einbinden von SISISI in TeX.
+-------------------------------
+
+Das erste Problem entsteht dadurch, dass tangle nur ein einzelnes Changefile
+in ein .web Masterfile einbinden kann. In der C/UNIX Version ist es
+allerdings notwendig, zuerst sitex3.ch in tex.web einzubinden, und dann
+zusaetzlich noch ctex.ch. Diese Aufgabe kann mit tangle alleine nicht geloest
+werden. Es gibt allerdings ein Programm namens TIE, das dazu verwendet werden
+kann, mehrere Changefiles in ein Masterfile einzubinden, und das in einer C
+Version auf
+
+ ftp.th-darmstadt.de [130.83.55.75]
+ directory pub/programming/literate-programming/Tools
+ file tie-<version>.tar.Z
+
+zur Verfuegung steht.
+
+(Ich bin Klaus Guntermann fuer diese Information zu grossem Dank verpflichtet).
+
+Um Ihnen das Leben zu erleichtern, finden Sie tie-2.4.tar.Z gemeinsam mit den
+anderen SISISI-Files in diesem Verzeichnis. Um Ihnen das Leben noch leichter
+zu machen, finden Sie auch ein sitex.web, das nichts anderes ist als tex.web
+(Version 3.14) mit sitex3.ch hineingetie'd. Falls Sie allerdings vorhaben
+sollten, eine andere (neuere oder aeltere) Version von TeX zu verwenden,
+muessen Sie zuerst tie.c uebersetzen und das ebenfalls in diesem Verzeichnis
+vorhandene sitex3.ch in Ihr tex.web hineintie-en, um ein neues sitex.web zu
+erhalten. (Wenn Sie das `install' Skript verwenden wollen, muessen Sie nachher
+sitex.web compress-en, oder das `install' Skript entsprechend aendern.)
+
+2) Die Konversion von TeX (mit SISISI) nach C.
+----------------------------------------------
+
+Sobald Sie Ihr original tex.web durch sitex.web ersetzt haben (wobei Sie
+sitex.web in tex.web umbenennen muessen), koennen Sie ein `make' starten,
+genau wie bei der normalen Installation von TeX. Allerdings sind noch einige
+kleine Vorarbeiten notwendig, die Ihnen das `install' Skript abnimmt, die Sie
+aber bei haendischer Installation selbst tun muessen.
+
+Zunaechst einmal sind die internen Tabellen von tangle und web2c zu klein
+fuer SiTeX, und muessen vergroessert werden. Dazu gibt es neue Versionen von
+tangle.ch und web2c.c und web2c.h, die in ihre entsprechenden Verzeichnisse
+kopiert werden muessen (naemlich nach TEXSRC/web und TEXSRC/web2c). Ausserdem
+muessen einige Definitionen in ctex.ch geaendert werden, und deshalb wird
+auch dieses File mitgeliefert. Ausserdem gibt es noch neue Versionen der
+Makefiles, da 1) zwei neue Format-Files erzeugt werden muessen und 2) nicht
+mehr nur tex[0-8].c ensteht, sondern auch tex9.c.
+
+3) Jetzt beginnt der Aerger.
+----------------------------
+
+tex.web wird von tangle in tex.p konvertiert (mit ctex.ch als Changefile),
+und tex.p dann von einem Skript namens `convert' unter Verwendung von web2c
+in mehrere .c und .h Files umgewandelt. Dann versucht sich der C-Compiler an
+dem Resultat, und damit beginnen die Schwierigkeiten. Aus irgendwelchen
+unerfindlichen Gruenden wird '] ] )' von web2c in ') ] ]' umgewandelt, was
+natuerlich den obligaten Syntaxfehler erzeugt. Ausserdem wird ein Array, das
+in Pascal als Wertparameter an eine Prozedur uebergeben wird, automatisch zu
+einem Var-Parameter, da der Arrayname in C ja eigentlich nur ein Zeiger auf
+das erste Element des Arrays ist. In Pascal wird - wie es sich fuer einen
+Wertparameter gehoert - eine Kopie des gesamten Arrays erzeugt und diese dann
+an die Prozedur uebergeben. In C wird eine Kopie des Zeigers erzeugt und
+diese dann uebergeben. Was passiert, wenn dann das Array innerhalb der
+Prozedur modifiziert wird, kann man sich denken (in Pascal ist nur die lokale
+Kopie betroffen, in C ...). Aus diesem Grund muss explizit ein temporaeres
+Array in der Prozedur definiert werden, das den Wert des Parameters speichert
+und beim Verlassen der Prozedur wieder herstellt. Natuerlich muss die
+Zuweisung, die in Pascal ja auch fuer Arrays funktioniert, in C durch ein
+`memcpy' ersetzt werden.
+
+Ein weiterer Fehler wird durch die schlechte Konvertierung der Ein-/Ausgabe
+Anweisungen von Pascal erzeugt. Bei der Umwandlung von write() in fprintf()
+geht die Feldbreite verloren (write(x:4) wird zu printf("%d",x) anstelle von
+printf("%4d",x)). Ebenso gibt es Probleme bei der Eingabe, wenn
+selbstdefinierte Datentypen verwendet werden. Dadurch kommt es zu einem
+Fehler beim Abspeichern bzw. Einlesen der Hashtabelle, die im File hf3
+abgespeichert wird.
+
+Wieder ein anderes Problem entsteht durch die trickreiche Umsetzung von
+Prozedurdeklarationen und -aufrufen. Um die Unterscheidung von Wert- und
+Variablenparametern so transparent wie moeglich zu machen, werden alle
+Funktionen (im C-Code) umbenannt und stattdessen Makros definiert, die den
+Adressoperator auf alle Var-Parameter anwenden und damit die (jetzt
+umbenannte) Funktion aufrufen. Vorteil: Am Funktionsaufruf aendert sich gar
+nichts, nur wird statt der Funktion jetzt eben der Makro `aufgerufen', der
+dann fuer die richtige Uebergabe der Parameter sorgt. Leider tut web2c zuviel
+des Guten und erzeugt in den Makros auch noch Typecasts, damit die Parameter
+auch nur ja den richtigen Typ haben. Und GNU C vertraegt es leider nicht,
+wenn Casts auf Array-Typen vorgenommen werden, was in SiTeX nun halt einmal
+vorkommt. Deshalb muessen alle Casts, die Array-Typen spezifizieren, aus
+coerce.h entfernt werden (dort sind alle Makros und Funktionsprototypen
+definert).
+
+Um Ihnen diese Korrekturen abzunehmen, stehen die Files tex6.c, coerce.h und
+texd.h in bereits korrigierter Form zur Verfuegung, und muessen nach
+TEXSRC/tex kopiert werden, sobald `make' zum ersten Mal mit der Fehlermeldung
+`cast specifies array type' abbricht (wenn vorher ein anderer Fehler
+auftritt, ist etwas schiefgegangen !). Wenn Sie das `install' Skript
+verwenden, geschieht dies automatisch. Dann wird einfach wieder das `make' neu
+gestartet. Das Problem dabei ist, dass web2c eigentlich nur ein einziges
+grosses C-File erzeugt, das dann nachtraeglich in die einzelnen Files
+aufgespaltet wird, und dass keine Garantie dafuer besteht, dass das tex6.c,
+das Sie erhalten, genauso aussieht wie jenes, das bei mir enstanden ist und
+in dem ich die Fehler korrigiert habe. Sollten sich (was aber eher
+unwahrscheinlich ist) im weiteren Verlauf des `make' wieder Fehler ergeben,
+und zwar dass Symbole nicht bzw. doppelt deklariert wurden, ist genau dieser
+Fall eingetreten. Verstaendigen Sie mich dann bitte umgehend. Ansonsten
+sollten Sie aber jetzt ohne weitere Probleme initex und virtex in Ihrem
+TEXSRC/tex Verzeichnis erhalten.
+
+4) Die Installation des fertigen SiTeX.
+---------------------------------------
+
+Nachdem also nun initex und virtex erfolgreich erstellt wurden, muessen Sie
+noch die Format-Files erzeugen und alles in den entsprechenden Verzeichnissen
+installieren. Die Format-Files werden vom `install' Skript automatisch
+erzeugt, aber wenn Sie es haendisch tun wollen/muessen, sehen Sie am besten
+im Makefile in Ihrem SISISIDIR nach, wie man Format-Files erzeugt. Wenn Sie
+das `install' Skript verwendet haben, finden Sie neben sitex.fmt und
+silatex.fmt in TEXSRC/tex auch noch ein File namens sitex.pool und ein File
+namens hf3. Wenn Sie allerdings `install' nicht verwendet haben, heisst
+sitex.pool noch tex.pool und muss erst umbenannt werden. Das hf3 File wird
+automatisch generiert, sobald Sie das erste Format-File erzeugen.
+
+Sie sollten nun zuerst hf3 in ein Verzeichnis in Ihrem TEXINPUTS Pfad kopieren,
+und sitex.pool in das TEXPOOLDIR. Dann kommen sitex.fmt und silatex.fmt in
+das TEXFORMATS Verzeichnis, und in dem selben Verzeichnis erzeugen Sie auch
+einen Link namens siplain.fmt auf sitex.fmt.
+
+Jetzt muessen Sie sich entscheiden, ob Sie Ihr altes TeX/LaTeX behalten
+wollen oder nicht. Falls Sie auch weiterhin fremdsprachige Texte bearbeiten
+wollen, sollten Sie das neue initex und virtex unter neuem Namen (z.B.
+siinitex und sivirtex) in ein Verzeichnis in Ihrem Standard-Suchpfad
+kopieren, und Links namens sitex und silatex auf sivirtex erzeugen, in dem
+selben Verzeichnis.
+
+Falls Sie das alte TeX nicht mehr wollen, kopieren Sie einfach das neue
+virtex ueber das alte, und ebenso das neue initex ueber das alte initex, und
+stellen Sie die sitex und silatex Links her. Die alten Links, tex, latex,
+slitex etc. koennen Sie entfernen.
+
+5) Bugs, Probleme etc.
+----------------------
+
+Der Installationsprozess wurde auf einem 486 PC mit Interactive Unix SVR3.2
+und auf einer HP 9000/705 mit HP-UX 8.07 getestet. Auf beiden Maschinen sind
+die Resultate, die silatex liefert, identisch. Allerdings hatte ich bis jetzt
+keine Gelegenheit, silatex auf anderen Systemen, speziell BSD und AIX, zu
+testen. Deshalb muss silatex noch immer als Beta Version betrachtet werden,
+und alle Fehlermeldungen, Kommentare, (Verbesserungs-)Vorschlaege und
+Berichte ueber erfolgreiche Inbetriebnahme sind willkommen.
+
+Schicken Sie bitte EMail an heinz@eiunix.tuwien.ac.at .
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST b/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST
new file mode 100644
index 0000000000..765509e138
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST
@@ -0,0 +1,20 @@
+Dieses Verzeichnis enthaelt:
+============================
+
+LIESMICH Installationsanleitung auf Deutsch
+LIESMICH.EXPERTE Technische Beschreibung von SiTeX
+MANIFEST Dieses File
+Makefile Ersetzt Makefile in TEXSRC/tex
+README Installationsanleitung auf Englisch
+README.EXPERT Technische Beschreibung von SiTeX (Engl.)
+coerce.h Korrigierte Version, kommt nach TEXSRC/tex
+ctex.ch ditto
+install Installationsskript
+makefile Ersetzt makefile in TEXSRC
+sitex.web.Z TeX mit SISISI hineingetie'd
+sitex3.ch Changefile mit dem SISISI-Algorithmus
+tangle.ch Kommt nach TEXSRC/web
+tex6.c Korrigierte Version, kommt nach TEXSRC/tex
+texd.h Korrigierte Version, kommt nach TEXSRC/tex
+web2c.c Kommt nach TEXSRC/web2c
+web2c.h ditto
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile b/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile
new file mode 100644
index 0000000000..92d1e062cc
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile
@@ -0,0 +1,200 @@
+# This file makes TeX in its various incarnations.
+#
+# The file ../common/texmf.h uses the symbol `TeX' to define certain
+# things that are different for TeX and Metafont, hence the addition to
+# CFLAGS.
+
+SITEDIR=..
+CC=gcc
+OPT=-O
+CFLAGS=$(OPT) -I$(SITEDIR) -DTeX
+LDFLAGS=
+LOADLIBES=
+SHELL=/bin/sh
+LN=ln
+
+# The formats we know how to make.
+#
+formats=amstex.fmt etex.fmt latex.fmt slitex.fmt tex.fmt \
+texinfo.fmt picplus.fmt
+
+
+makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \
+ LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)"
+
+.SUFFIXES:
+.SUFFIXES: .o .c
+.c.o:
+ $(CC) $(CFLAGS) -c $*.c
+
+# Routines used everywhere.
+#
+commondefines=../common/common.defines ../common/texmf.defines
+commonh=../common/extra.h ../common/common.h
+commono=../common/alloca.o ../common/extra.o
+
+# Routines used in both TeX and Metafont.
+#
+extrac=../common/texmf.c
+extrah=../common/texmf.h ../common/endian.h
+extrao=texmf.o
+
+# Routines used in TeX, Metafont, and BibTeX.
+#
+fileioc=../common/fileio.c
+fileioh=../common/fileio.h
+fileioo=fileio.o
+
+# We don't add `$(commono)' here, since it doesn't depend on anything in
+# this directory, and we write a dependency for `$(objs)' below.
+#
+objs=$(fileioo) tex0.o tex1.o tex2.o tex3.o tex4.o tex5.o tex6.o tex7.o tex8.o tex9.o
+iobjs=iextra.o initex.o $(objs)
+vobjs=tex-extra.o itex.o $(objs)
+
+
+default: all
+
+all: initex virtex
+triptrap: triptex
+
+initex: stamp-convert $(iobjs) $(commono)
+ $(CC) -o initex $(LDFLAGS) $(iobjs) $(commono) $(LOADLIBES)
+
+virtex: stamp-convert $(vobjs) $(commono)
+ $(CC) -o virtex $(LDFLAGS) $(vobjs) $(commono) $(LOADLIBES)
+
+run-trip:
+ rm -f trip.tex
+ -$(LN) TeXtrip/trip.tex .
+ ../texware/pltotf TeXtrip/trip.pl trip.tfm
+ -$(SHELL) -c '. ./tripenv; \
+ ./triptex < TeXtrip/trip1.in > /dev/null 2>&1'
+ -diff TeXtrip/tripin.log trip.log
+ -$(SHELL) -c '. ./tripenv; \
+ ./triptex < TeXtrip/trip2.in > trip.fot'
+ -diff TeXtrip/trip.log trip.log
+ -diff TeXtrip/trip.fot trip.fot
+ $(SHELL) -c '. ./tripenv; \
+ ../texware/dvitype trip.dvi < TeXtrip/dvitype.in > trip.typ'
+ -diff TeXtrip/trip.typ trip.typ
+
+
+# Make format files automatically.
+#
+fmts: $(formats)
+
+amstex.fmt: tex.fmt
+ ./initex \&./tex amstex \\dump
+
+etex.fmt: tex.fmt
+ touch eplain.aux # Makes cross-reference warnings work right.
+ ./initex \&./tex eplain \\dump
+ mv eplain.fmt etex.fmt
+ mv eplain.log etex.log
+
+# Until LaTeX and SLiTeX are updated, we must use a hacked version, that
+# sets the new parameters to reasonable values.
+#
+latex.fmt:
+ ./initex lplain \\dump
+ mv lplain.fmt latex.fmt
+ mv lplain.log latex.log
+
+picplus.fmt: tex.fmt
+ ./initex \&./tex picplus \\dump
+
+slitex.fmt:
+ ./initex splain \\dump
+ mv splain.fmt slitex.fmt
+ mv splain.log slitex.log
+
+tex.fmt:
+ ./initex plain \\dump
+ mv plain.fmt tex.fmt
+ mv plain.log tex.log
+
+sitex.fmt:
+ ./initex siplain \\dump
+ mv siplain.fmt sitex.fmt
+ mv siplain.log sitex.log
+
+silatex.fmt:
+ ./initex silplain \\dump
+ mv silplain.fmt silatex.fmt
+ mv silplain.log silatex.log
+
+# texinfo changes the escape character from `\' to `@'.
+#
+texinfo.fmt: tex.fmt
+ ./initex \&./tex texinfo @dump
+
+
+# The `ini_to_trip' script changes texd.h, instead of the change file, so
+# retangling is not necessary. After changing constants, making a
+# triptex means making an initex.
+#
+triptex: stamp-trip $(iobjs) $(commono)
+ make $(makeargs) initex
+ mv initex triptex
+
+stamp-trip: stamp-convert
+ rm -f *.o
+ $(SHELL) ./ini_to_trip texd.h
+ touch stamp-trip
+
+# tangle produces tex.p and tex.pool.
+#
+tex.p: tex.web ctex.ch
+ ../web/tangle tex.web ctex.ch
+
+# The convert script produces tex[0-8].c, itex.c, coerce.h, and texd.h.
+# The (hand-coded) memory.h is included in one of tex?.c files; it isn't
+# really necessary to `convert' again if it changes, only to recompile
+# those files, but describing that relationship is ugly to do.
+# (Furthermore, memory.h is stable.)
+#
+stamp-convert: tex.p memory.h fixcoerce.h $(commondefines)
+ $(SHELL) ./convert
+ touch stamp-convert
+
+# The (hand-coded) file $(extrac) and the (generated) file itex.c have
+# #ifdefs for INITEX, so we compile them differently.
+#
+iextra.o: $(extrac) texd.h $(extrah) $(commonh)
+ $(CC) $(CFLAGS) -I. -DINITEX -DINI -c $(extrac)
+ mv $(extrao) iextra.o
+
+initex.o: itex.c texd.h $(extrah) $(commonh)
+ $(CC) $(CFLAGS) -DINITEX -c itex.c && mv itex.o initex.o
+
+$(objs): stamp-convert texd.h
+tex-extra.o: $(extrac) texd.h
+ rm -f tex-extra.c
+ $(LN) $(extrac) tex-extra.c
+ $(CC) $(CFLAGS) -I. -c tex-extra.c
+
+$(fileioo): $(fileioc) $(fileioh)
+ $(CC) $(CFLAGS) -I. -c $(fileioc)
+
+tex0.o: tex0.c
+tex1.o: tex1.c
+tex2.o: tex2.c
+tex3.o: tex3.c
+tex4.o: tex4.c
+tex5.o: tex5.c
+tex6.o: tex6.c
+tex7.o: tex7.c
+tex8.o: tex8.c
+tex9.o: tex9.c
+
+
+clean:
+ rm -f stamp-* *.o triptex initex virtex
+ rm -f texd.h coerce.h *.log *.fmt *.aux
+ rm -f 8terminal.tex trip.* tripos.tex dvitype.out
+ rm -f tex-extra.c
+
+veryclean: clean
+ rm -f tex?.c itex.c tex.p tex.pool texput.*
+ rm -f \#*\# *~ *.bak *.ckp core
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT b/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT
new file mode 100644
index 0000000000..0cd8f15ec3
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT
@@ -0,0 +1,155 @@
+
+
+ TeX with SISISI-Hyphenation
+ ===========================
+
+ Technical Guide for Expert Users
+ ================================
+
+
+(Note: This file contains technical information only. You don't have to read
+it, unless you are *really* interested in the problems of porting SISISI to
+UNIX, or unless somthing went wrong with the normal installation process.)
+
+0) Motivation.
+--------------
+
+The SISISI-Hyphenation comes as a WEB-changefile (sitex3.ch), which is
+usually tangle'd into tex.web. The problem with the C version of TeX is that
+the folks who wrote the web2c converter considered only a WEB-specific subset
+of PASCAL, but sitex3.ch makes full use of standard PASCAL constructs. For
+example, the web2c converter can't handle statically nested procedures, which
+SISISI uses quite extensively.
+
+Therefore, for the C version of TeX, it was necessary to modify sitex3.ch to
+allow conversion with web2c, and, since web2c shows some strange and
+inexplicable behaviour (read: bugs :-), it is also necessary to modify the C
+files that are generated by the converter. This was performed by students of
+computer science Hans-J"urgen Szoldatics and Florian Zwerina.
+
+1) Incorporating SISISI into TeX.
+---------------------------------
+
+The first problem is that tangle takes a .web and a single .ch file, and
+generates a .p file. But in the C version, we have two changefiles, sitex3.ch
+and ctex.ch, and we first have to tangle tex.web with sitex3.ch, and the
+resulting file with ctex.ch, which is not possible. Fortunately, there's a
+program called TIE, which can be used to incorporate many changefiles into a
+.web master file, and which is available in a C version from
+
+ ftp.th-darmstadt.de [130.83.55.75]
+ directory pub/programming/literate-programming/Tools
+ file tie-<version>.tar.Z
+
+(Thanks to Klaus Guntermann for providing this information).
+
+For convenience, tie-2.4.tar.Z is included in this distribution. Also for
+convenience, this distribution contains a file called sitex.web, which is
+the original tex.web (version 3.14) with sitex3.ch tie'd into it. In case you
+want to install a newer (or maybe an older) version of TeX, you will have to
+compile tie.c and tie sitex3.ch into your tex.web, thus creating your own
+sitex.web.
+
+
+2) Converting tex.web (with SISISI) into a C program.
+-----------------------------------------------------
+
+As soon as tex.web has been replaced with sitex.web, you can start `make',
+just as with the normal installation of TeX. There are some differences,
+however: SiTeX uses up all the namespace in tangle and in web2c, and you have
+to increase the symbol tables in these programs. That's the reason why
+tangle.ch and web2c.? are provided and copied to their appropriate places
+by `install'. Some definitions in ctex.ch have to be changed, and so this
+file is also provided. Finally, the makefiles have to be changed to take into
+account the 9th C-file generated by the conversion process and the SISISI
+format files.
+
+3) Now the problems start.
+--------------------------
+
+As soon as tex.web has been tangle'd into tex.p and tex.p been converted into
+several .c and .h files, the bugs in web2c strike. For some strange reason,
+the sequence '] ] )' is twisted into ') ] ]', with the obvious result of a C
+syntax error. Also, the pass-by-value mechanism of PASCAL turns into
+pass-by-reference as soon as arrays are used as actual parameters. This
+comes from the fact that an array variable in C is the same as a pointer to
+the first array element. Therefore, instead of a copy of the entire array
+(which is what happens in PASCAL), only the pointer to the first element
+is passed to the function. Guess what happens when the array is modified
+inside the function... As a consequence, a temporary array has to be
+introduced into the function which stores a copy of the original parameter
+and restores it at the end of the function. Needless to say, the PASCAL
+assignment for arrays has to be converted manually into a C `memcpy' library
+call.
+
+Another bug is web2c's handling of input/output. PASCAL's write() is not
+properly translated into C's fprintf(), when a field width is specified. That
+is, write(x:4) is translated into printf("%d",x), but really should be
+printf("%4d",x). Similar problems arise with the conversion of read() into
+fscanf(), when non-standard data types are used. This causes SISISI's hash
+table to be written to file hf3 in wrong format, and to be read back into
+memory in a wrong way.
+
+Other problems arise from the nifty mechanism web2c employs for the handling
+of PASCAL's VAR-parameters. The PASCAL functions and procedures are renamed
+and introduced C macros with the names of the original functions and
+procedures, which apply the C address operator (&) to the arguments that
+are pass-by-ref, and subsequently call the now renamed function. Unfortunately,
+web2c does too much of the good and also generates type casts for the
+function parameters to ensure proper data types, which causes GNU C to
+complain about `cast specifies array type', when casts to array types are
+attempted. It is therefore necessary to remove these casts from coerce.h,
+where macros and function prototypes are defined.
+
+For convenience, the files tex6.c, coerce.h and texd.h (with all bugs removed)
+are provided and can be copied into TEXSRC/tex as soon as the `make' stops
+for the first time (usually with the aforementioned complaint about casts to
+array types), replacing the buggy files. The `install' script does this for
+you. The danger here is that your tex6.c is not necessarily the same as my
+tex6.c (i.e. the tex6.c I got out of my converter and applied the necessary
+bug fixes to). If this should be the case, the compilation will again
+terminate with an error, either that some symbols are declared twice or that
+some symbols are missing. If this should happen, please contact me
+immediately. If no such errors occur, compilation should terminate normally
+and you should get initex and virtex.
+
+4) Installing SiTeX on your system.
+-----------------------------------
+
+After initex and virtex have been successfully generated, it's now time to
+install the program and format files on your system. To get sitex.fmt and
+silatex.fmt, look into SISISIDIR/Makefile how these files are generated. The
+`install' script performs this step automatically, so if you used `install' to
+create SiTeX, you will already have the SISISI format files. You will find
+all these files in your TEXDIR, along with a file named sitex.pool and a file
+named hf3.
+
+First, you should copy hf3 to your TEXINPUTS directory (more precisely:
+into a directory contained in the TEXINPUTS path), and sitex.pool to the
+TEXPOOL dir. Then copy sitex.fmt and silatex.fmt into TEXFORMATS, and
+create a link to sitex.fmt named siplain.fmt in the same directory.
+
+Now you have to decide whether you want to retain TeX with the original
+hyphenation algorithm (virtex, tex and latex). If not, simply remove the old
+virtex and initex and all the links to it (such as tex, latex, slitex, glatex
+etc.) and copy the new initex and virtex into a directory holding your
+executables. Then create links to the now new virtex with names sitex and
+silatex.
+
+If you want to keep the original TeX, you have to copy initex and virtex into
+your standard search path under different names, preferably siinitex and
+sivirtex, and create the sitex and silatex links. Note however, that you can't
+use silatex for non-German documents, as the hyphenation algorithm is designed
+for the German language only. So if you want to work with German and English
+documents, you have to retain the original TeX.
+
+5) Troubleshooting.
+-------------------
+
+I have tested the installation process on a 486 PC running Interactive SVR3.2,
+and on an HP 9000/705 running HP-UX 8.07. silatex gives the same results on
+both machines. I had no opportunity, however, to make and test silatex on other
+systems, especially not BSD systems and AIX. SiTeX has therefore to be regarded
+as being still in its beta version, and any bug reports, comments, critics or
+praise (no, seriously ! If you have successfully installed SiTeX please let
+me know too !) are welcome. Send EMail to heinz@eiunix.tuwien.ac.at .
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h b/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h
new file mode 100644
index 0000000000..f7672fe2ab
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h
@@ -0,0 +1,890 @@
+void initialize();
+#define initialize_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void println();
+#define println_regmem
+void zprintchar();
+#define printchar(s) zprintchar((ASCIIcode) (s))
+#define printchar_regmem register memoryword *eqtb=zeqtb;
+void zprint();
+#define print(s) zprint((integer) (s))
+#define print_regmem register memoryword *eqtb=zeqtb;
+void zslowprint();
+#define slowprint(s) zslowprint((integer) (s))
+#define slowprint_regmem register memoryword *eqtb=zeqtb;
+void zprintnl();
+#define printnl(s) zprintnl((strnumber) (s))
+#define printnl_regmem
+void zprintesc();
+#define printesc(s) zprintesc((strnumber) (s))
+#define printesc_regmem register memoryword *eqtb=zeqtb;
+void zprintthedigs();
+#define printthedigs(k) zprintthedigs((eightbits) (k))
+#define printthedigs_regmem
+void zprintint();
+#define printint(n) zprintint((integer) (n))
+#define printint_regmem
+void zprintcs();
+#define printcs(p) zprintcs((integer) (p))
+#define printcs_regmem register memoryword *eqtb=zeqtb;
+void zsprintcs();
+#define sprintcs(p) zsprintcs((halfword) (p))
+#define sprintcs_regmem
+void zprintfilename();
+#define printfilename(n, a, e) zprintfilename((integer) (n), (integer) (a), (integer) (e))
+#define printfilename_regmem
+void zprintsize();
+#define printsize(s) zprintsize((integer) (s))
+#define printsize_regmem
+void zprintwritewhatsit();
+#define printwritewhatsit(s, p) zprintwritewhatsit((strnumber) (s), (halfword) (p))
+#define printwritewhatsit_regmem register memoryword *mem=zmem;
+void jumpout();
+#define jumpout_regmem
+void error();
+#define error_regmem
+void zfatalerror();
+#define fatalerror(s) zfatalerror((strnumber) (s))
+#define fatalerror_regmem
+void zoverflow();
+#define overflow(s, n) zoverflow((strnumber) (s), (integer) (n))
+#define overflow_regmem
+void zconfusion();
+#define confusion(s) zconfusion((strnumber) (s))
+#define confusion_regmem
+boolean initterminal();
+#define initterminal_regmem
+strnumber makestring();
+#define makestring_regmem
+boolean zstreqbuf();
+#define streqbuf(s, k) zstreqbuf((strnumber) (s), (integer) (k))
+#define streqbuf_regmem
+boolean zstreqstr();
+#define streqstr(s, t) zstreqstr((strnumber) (s), (strnumber) (t))
+#define streqstr_regmem
+boolean getstringsstarted();
+#define getstringsstarted_regmem
+void zprinttwo();
+#define printtwo(n) zprinttwo((integer) (n))
+#define printtwo_regmem
+void zprinthex();
+#define printhex(n) zprinthex((integer) (n))
+#define printhex_regmem
+void zprintromanint();
+#define printromanint(n) zprintromanint((integer) (n))
+#define printromanint_regmem
+void printcurrentstring();
+#define printcurrentstring_regmem
+void terminput();
+#define terminput_regmem
+void zinterror();
+#define interror(n) zinterror((integer) (n))
+#define interror_regmem
+void normalizeselector();
+#define normalizeselector_regmem
+void pauseforinstructions();
+#define pauseforinstructions_regmem
+integer zhalf();
+#define half(x) zhalf((integer) (x))
+#define half_regmem
+scaled zrounddecimals();
+#define rounddecimals(k) zrounddecimals((smallnumber) (k))
+#define rounddecimals_regmem
+void zprintscaled();
+#define printscaled(s) zprintscaled((scaled) (s))
+#define printscaled_regmem
+scaled zmultandadd();
+#define multandadd(n, x, y, maxanswer) zmultandadd((integer) (n), (scaled) (x), (scaled) (y), (scaled) (maxanswer))
+#define multandadd_regmem
+scaled zxovern();
+#define xovern(x, n) zxovern((scaled) (x), (integer) (n))
+#define xovern_regmem
+scaled zxnoverd();
+#define xnoverd(x, n, d) zxnoverd((scaled) (x), (integer) (n), (integer) (d))
+#define xnoverd_regmem
+halfword zbadness();
+#define badness(t, s) zbadness((scaled) (t), (scaled) (s))
+#define badness_regmem
+void zprintword();
+#define printword(w) zprintword((memoryword) (w))
+#define printword_regmem
+void zshowtokenlist();
+#define showtokenlist(p, q, l) zshowtokenlist((integer) (p), (integer) (q), (integer) (l))
+#define showtokenlist_regmem register memoryword *mem=zmem;
+void runaway();
+#define runaway_regmem register memoryword *mem=zmem;
+halfword getavail();
+#define getavail_regmem register memoryword *mem=zmem;
+void zflushlist();
+#define flushlist(p) zflushlist((halfword) (p))
+#define flushlist_regmem register memoryword *mem=zmem;
+halfword zgetnode();
+#define getnode(s) zgetnode((integer) (s))
+#define getnode_regmem register memoryword *mem=zmem;
+void zfreenode();
+#define freenode(p, s) zfreenode((halfword) (p), (halfword) (s))
+#define freenode_regmem register memoryword *mem=zmem;
+void sortavail();
+#define sortavail_regmem register memoryword *mem=zmem;
+halfword newnullbox();
+#define newnullbox_regmem register memoryword *mem=zmem;
+halfword newrule();
+#define newrule_regmem register memoryword *mem=zmem;
+halfword znewligature();
+#define newligature(f, c, q) znewligature((quarterword) (f), (quarterword) (c), (halfword) (q))
+#define newligature_regmem register memoryword *mem=zmem;
+halfword znewligitem();
+#define newligitem(c) znewligitem((quarterword) (c))
+#define newligitem_regmem register memoryword *mem=zmem;
+halfword newdisc();
+#define newdisc_regmem register memoryword *mem=zmem;
+halfword znewmath();
+#define newmath(w, s) znewmath((scaled) (w), (smallnumber) (s))
+#define newmath_regmem register memoryword *mem=zmem;
+halfword znewspec();
+#define newspec(p) znewspec((halfword) (p))
+#define newspec_regmem register memoryword *mem=zmem;
+halfword znewparamglue();
+#define newparamglue(n) znewparamglue((smallnumber) (n))
+#define newparamglue_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword znewglue();
+#define newglue(q) znewglue((halfword) (q))
+#define newglue_regmem register memoryword *mem=zmem;
+halfword znewskipparam();
+#define newskipparam(n) znewskipparam((smallnumber) (n))
+#define newskipparam_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword znewkern();
+#define newkern(w) znewkern((scaled) (w))
+#define newkern_regmem register memoryword *mem=zmem;
+halfword znewpenalty();
+#define newpenalty(m) znewpenalty((integer) (m))
+#define newpenalty_regmem register memoryword *mem=zmem;
+void zcheckmem();
+#define checkmem(printlocs) zcheckmem((boolean) (printlocs))
+#define checkmem_regmem register memoryword *mem=zmem;
+void zsearchmem();
+#define searchmem(p) zsearchmem((halfword) (p))
+#define searchmem_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zshortdisplay();
+#define shortdisplay(p) zshortdisplay((integer) (p))
+#define shortdisplay_regmem register memoryword *mem=zmem;
+void zprintfontandchar();
+#define printfontandchar(p) zprintfontandchar((integer) (p))
+#define printfontandchar_regmem register memoryword *mem=zmem;
+void zprintmark();
+#define printmark(p) zprintmark((integer) (p))
+#define printmark_regmem register memoryword *mem=zmem;
+void zprintruledimen();
+#define printruledimen(d) zprintruledimen((scaled) (d))
+#define printruledimen_regmem
+void zprintglue();
+#define printglue(d, order, s) zprintglue((scaled) (d), (integer) (order), (strnumber) (s))
+#define printglue_regmem
+void zprintspec();
+#define printspec(p, s) zprintspec((integer) (p), (strnumber) (s))
+#define printspec_regmem register memoryword *mem=zmem;
+void zprintfamandchar();
+#define printfamandchar(p) zprintfamandchar((halfword) (p))
+#define printfamandchar_regmem register memoryword *mem=zmem;
+void zprintdelimiter();
+#define printdelimiter(p) zprintdelimiter((halfword) (p))
+#define printdelimiter_regmem register memoryword *mem=zmem;
+void zprintsubsidiarydata();
+#define printsubsidiarydata(p, c) zprintsubsidiarydata((halfword) (p), (ASCIIcode) (c))
+#define printsubsidiarydata_regmem register memoryword *mem=zmem;
+void zprintstyle();
+#define printstyle(c) zprintstyle((integer) (c))
+#define printstyle_regmem
+void zprintskipparam();
+#define printskipparam(n) zprintskipparam((integer) (n))
+#define printskipparam_regmem
+void zshownodelist();
+#define shownodelist(p) zshownodelist((integer) (p))
+#define shownodelist_regmem register memoryword *mem=zmem;
+void zshowbox();
+#define showbox(p) zshowbox((halfword) (p))
+#define showbox_regmem register memoryword *eqtb=zeqtb;
+void zdeletetokenref();
+#define deletetokenref(p) zdeletetokenref((halfword) (p))
+#define deletetokenref_regmem register memoryword *mem=zmem;
+void zdeleteglueref();
+#define deleteglueref(p) zdeleteglueref((halfword) (p))
+#define deleteglueref_regmem register memoryword *mem=zmem;
+void zflushnodelist();
+#define flushnodelist(p) zflushnodelist((halfword) (p))
+#define flushnodelist_regmem register memoryword *mem=zmem;
+halfword zcopynodelist();
+#define copynodelist(p) zcopynodelist((halfword) (p))
+#define copynodelist_regmem register memoryword *mem=zmem;
+void zprintmode();
+#define printmode(m) zprintmode((integer) (m))
+#define printmode_regmem
+void pushnest();
+#define pushnest_regmem
+void popnest();
+#define popnest_regmem register memoryword *mem=zmem;
+void showactivities();
+#define showactivities_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zprintparam();
+#define printparam(n) zprintparam((integer) (n))
+#define printparam_regmem
+void begindiagnostic();
+#define begindiagnostic_regmem register memoryword *eqtb=zeqtb;
+void zenddiagnostic();
+#define enddiagnostic(blankline) zenddiagnostic((boolean) (blankline))
+#define enddiagnostic_regmem
+void zprintlengthparam();
+#define printlengthparam(n) zprintlengthparam((integer) (n))
+#define printlengthparam_regmem
+void zprintcmdchr();
+#define printcmdchr(cmd, chrcode) zprintcmdchr((quarterword) (cmd), (halfword) (chrcode))
+#define printcmdchr_regmem
+void zshoweqtb();
+#define showeqtb(n) zshoweqtb((halfword) (n))
+#define showeqtb_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zidlookup();
+#define idlookup(j, l) zidlookup((integer) (j), (integer) (l))
+#define idlookup_regmem
+void zprimitive();
+#define primitive(s, c, o) zprimitive((strnumber) (s), (quarterword) (c), (halfword) (o))
+#define primitive_regmem register memoryword *eqtb=zeqtb;
+void znewsavelevel();
+#define newsavelevel(c) znewsavelevel((groupcode) (c))
+#define newsavelevel_regmem
+void zeqdestroy();
+#define eqdestroy(w) zeqdestroy((memoryword) (w))
+#define eqdestroy_regmem register memoryword *mem=zmem;
+void zeqsave();
+#define eqsave(p, l) zeqsave((halfword) (p), (quarterword) (l))
+#define eqsave_regmem register memoryword *eqtb=zeqtb;
+void zeqdefine();
+#define eqdefine(p, t, e) zeqdefine((halfword) (p), (quarterword) (t), (halfword) (e))
+#define eqdefine_regmem register memoryword *eqtb=zeqtb;
+void zeqworddefine();
+#define eqworddefine(p, w) zeqworddefine((halfword) (p), (integer) (w))
+#define eqworddefine_regmem register memoryword *eqtb=zeqtb;
+void zgeqdefine();
+#define geqdefine(p, t, e) zgeqdefine((halfword) (p), (quarterword) (t), (halfword) (e))
+#define geqdefine_regmem register memoryword *eqtb=zeqtb;
+void zgeqworddefine();
+#define geqworddefine(p, w) zgeqworddefine((halfword) (p), (integer) (w))
+#define geqworddefine_regmem register memoryword *eqtb=zeqtb;
+void zsaveforafter();
+#define saveforafter(t) zsaveforafter((halfword) (t))
+#define saveforafter_regmem
+void zrestoretrace();
+#define restoretrace(p, s) zrestoretrace((halfword) (p), (strnumber) (s))
+#define restoretrace_regmem
+void unsave();
+#define unsave_regmem register memoryword *eqtb=zeqtb;
+void preparemag();
+#define preparemag_regmem register memoryword *eqtb=zeqtb;
+void ztokenshow();
+#define tokenshow(p) ztokenshow((halfword) (p))
+#define tokenshow_regmem register memoryword *mem=zmem;
+void printmeaning();
+#define printmeaning_regmem
+void showcurcmdchr();
+#define showcurcmdchr_regmem
+void showcontext();
+#define showcontext_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zbegintokenlist();
+#define begintokenlist(p, t) zbegintokenlist((halfword) (p), (quarterword) (t))
+#define begintokenlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void endtokenlist();
+#define endtokenlist_regmem
+void backinput();
+#define backinput_regmem register memoryword *mem=zmem;
+void backerror();
+#define backerror_regmem
+void inserror();
+#define inserror_regmem
+void beginfilereading();
+#define beginfilereading_regmem
+void endfilereading();
+#define endfilereading_regmem
+void clearforerrorprompt();
+#define clearforerrorprompt_regmem
+void checkoutervalidity();
+#define checkoutervalidity_regmem register memoryword *mem=zmem;
+void getnext();
+#define getnext_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void firmuptheline();
+#define firmuptheline_regmem register memoryword *eqtb=zeqtb;
+void gettoken();
+#define gettoken_regmem
+void macrocall();
+#define macrocall_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void insertrelax();
+#define insertrelax_regmem
+void expand();
+#define expand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void getxtoken();
+#define getxtoken_regmem
+void xtoken();
+#define xtoken_regmem
+void scanleftbrace();
+#define scanleftbrace_regmem
+void scanoptionalequals();
+#define scanoptionalequals_regmem
+boolean zscankeyword();
+#define scankeyword(s) zscankeyword((strnumber) (s))
+#define scankeyword_regmem register memoryword *mem=zmem;
+void muerror();
+#define muerror_regmem
+void scaneightbitint();
+#define scaneightbitint_regmem
+void scancharnum();
+#define scancharnum_regmem
+void scanfourbitint();
+#define scanfourbitint_regmem
+void scanfifteenbitint();
+#define scanfifteenbitint_regmem
+void scantwentysevenbitint();
+#define scantwentysevenbitint_regmem
+void scanfontident();
+#define scanfontident_regmem register memoryword *eqtb=zeqtb;
+void zfindfontdimen();
+#define findfontdimen(writing) zfindfontdimen((boolean) (writing))
+#define findfontdimen_regmem
+void zscansomethinginternal();
+#define scansomethinginternal(level, negative) zscansomethinginternal((smallnumber) (level), (boolean) (negative))
+#define scansomethinginternal_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void scanint();
+#define scanint_regmem
+void zscandimen();
+#define scandimen(mu, inf, shortcut) zscandimen((boolean) (mu), (boolean) (inf), (boolean) (shortcut))
+#define scandimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanglue();
+#define scanglue(level) zscanglue((smallnumber) (level))
+#define scanglue_regmem register memoryword *mem=zmem;
+halfword scanrulespec();
+#define scanrulespec_regmem register memoryword *mem=zmem;
+halfword zstrtoks();
+#define strtoks(b) zstrtoks((poolpointer) (b))
+#define strtoks_regmem register memoryword *mem=zmem;
+halfword thetoks();
+#define thetoks_regmem register memoryword *mem=zmem;
+void insthetoks();
+#define insthetoks_regmem register memoryword *mem=zmem;
+void convtoks();
+#define convtoks_regmem register memoryword *mem=zmem;
+halfword zscantoks();
+#define scantoks(macrodef, xpand) zscantoks((boolean) (macrodef), (boolean) (xpand))
+#define scantoks_regmem register memoryword *mem=zmem;
+void zreadtoks();
+#define readtoks(n, r) zreadtoks((integer) (n), (halfword) (r))
+#define readtoks_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void passtext();
+#define passtext_regmem
+void zchangeiflimit();
+#define changeiflimit(l, p) zchangeiflimit((smallnumber) (l), (halfword) (p))
+#define changeiflimit_regmem register memoryword *mem=zmem;
+void conditional();
+#define conditional_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void beginname();
+#define beginname_regmem
+boolean zmorename();
+#define morename(c) zmorename((ASCIIcode) (c))
+#define morename_regmem
+void endname();
+#define endname_regmem
+void zpackfilename();
+#define packfilename(n, a, e) zpackfilename((strnumber) (n), (strnumber) (a), (strnumber) (e))
+#define packfilename_regmem
+void zpackbufferedname();
+#define packbufferedname(n, a, b) zpackbufferedname((smallnumber) (n), (integer) (a), (integer) (b))
+#define packbufferedname_regmem
+strnumber makenamestring();
+#define makenamestring_regmem
+strnumber zamakenamestring();
+#define amakenamestring(f) zamakenamestring((alphafile *) &(f))
+#define amakenamestring_regmem
+strnumber zbmakenamestring();
+#define bmakenamestring(f) zbmakenamestring((bytefile *) &(f))
+#define bmakenamestring_regmem
+strnumber zwmakenamestring();
+#define wmakenamestring(f) zwmakenamestring((wordfile *) &(f))
+#define wmakenamestring_regmem
+void scanfilename();
+#define scanfilename_regmem
+void zpackjobname();
+#define packjobname(s) zpackjobname((strnumber) (s))
+#define packjobname_regmem
+void zpromptfilename();
+#define promptfilename(s, e) zpromptfilename((strnumber) (s), (strnumber) (e))
+#define promptfilename_regmem
+void openlogfile();
+#define openlogfile_regmem register memoryword *eqtb=zeqtb;
+void startinput();
+#define startinput_regmem register memoryword *eqtb=zeqtb;
+internalfontnumber zreadfontinfo();
+#define readfontinfo(u, nom, aire, s) zreadfontinfo((halfword) (u), (strnumber) (nom), (strnumber) (aire), (scaled) (s))
+#define readfontinfo_regmem register memoryword *eqtb=zeqtb;
+void zcharwarning();
+#define charwarning(f, c) zcharwarning((internalfontnumber) (f), (eightbits) (c))
+#define charwarning_regmem register memoryword *eqtb=zeqtb;
+halfword znewcharacter();
+#define newcharacter(f, c) znewcharacter((internalfontnumber) (f), (eightbits) (c))
+#define newcharacter_regmem register memoryword *mem=zmem;
+void dviswap();
+#define dviswap_regmem
+void zdvifour();
+#define dvifour(x) zdvifour((integer) (x))
+#define dvifour_regmem
+void zdvipop();
+#define dvipop(l) zdvipop((integer) (l))
+#define dvipop_regmem
+void zdvifontdef();
+#define dvifontdef(f) zdvifontdef((internalfontnumber) (f))
+#define dvifontdef_regmem
+void zmovement();
+#define movement(w, o) zmovement((scaled) (w), (eightbits) (o))
+#define movement_regmem register memoryword *mem=zmem;
+void zprunemovements();
+#define prunemovements(l) zprunemovements((integer) (l))
+#define prunemovements_regmem register memoryword *mem=zmem;
+void zspecialout();
+#define specialout(p) zspecialout((halfword) (p))
+#define specialout_regmem register memoryword *mem=zmem;
+void zwriteout();
+#define writeout(p) zwriteout((halfword) (p))
+#define writeout_regmem register memoryword *mem=zmem;
+void zoutwhat();
+#define outwhat(p) zoutwhat((halfword) (p))
+#define outwhat_regmem register memoryword *mem=zmem;
+void hlistout();
+#define hlistout_regmem register memoryword *mem=zmem;
+void vlistout();
+#define vlistout_regmem register memoryword *mem=zmem;
+void zshipout();
+#define shipout(p) zshipout((halfword) (p))
+#define shipout_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanspec();
+#define scanspec(c, threecodes) zscanspec((groupcode) (c), (boolean) (threecodes))
+#define scanspec_regmem
+halfword zhpack();
+#define hpack(p, w, m) zhpack((halfword) (p), (scaled) (w), (smallnumber) (m))
+#define hpack_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zvpackage();
+#define vpackage(p, h, m, l) zvpackage((halfword) (p), (scaled) (h), (smallnumber) (m), (scaled) (l))
+#define vpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zappendtovlist();
+#define appendtovlist(b) zappendtovlist((halfword) (b))
+#define appendtovlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword newnoad();
+#define newnoad_regmem register memoryword *mem=zmem;
+halfword znewstyle();
+#define newstyle(s) znewstyle((smallnumber) (s))
+#define newstyle_regmem register memoryword *mem=zmem;
+halfword newchoice();
+#define newchoice_regmem register memoryword *mem=zmem;
+void showinfo();
+#define showinfo_regmem register memoryword *mem=zmem;
+halfword zfractionrule();
+#define fractionrule(t) zfractionrule((scaled) (t))
+#define fractionrule_regmem register memoryword *mem=zmem;
+halfword zoverbar();
+#define overbar(b, k, t) zoverbar((halfword) (b), (scaled) (k), (scaled) (t))
+#define overbar_regmem register memoryword *mem=zmem;
+halfword zcharbox();
+#define charbox(f, c) zcharbox((internalfontnumber) (f), (quarterword) (c))
+#define charbox_regmem register memoryword *mem=zmem;
+void zstackintobox();
+#define stackintobox(b, f, c) zstackintobox((halfword) (b), (internalfontnumber) (f), (quarterword) (c))
+#define stackintobox_regmem register memoryword *mem=zmem;
+scaled zheightplusdepth();
+#define heightplusdepth(f, c) zheightplusdepth((internalfontnumber) (f), (quarterword) (c))
+#define heightplusdepth_regmem
+halfword zvardelimiter();
+#define vardelimiter(d, s, v) zvardelimiter((halfword) (d), (smallnumber) (s), (scaled) (v))
+#define vardelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zrebox();
+#define rebox(b, w) zrebox((halfword) (b), (scaled) (w))
+#define rebox_regmem register memoryword *mem=zmem;
+halfword zmathglue();
+#define mathglue(g, m) zmathglue((halfword) (g), (scaled) (m))
+#define mathglue_regmem register memoryword *mem=zmem;
+void zmathkern();
+#define mathkern(p, m) zmathkern((halfword) (p), (scaled) (m))
+#define mathkern_regmem register memoryword *mem=zmem;
+void flushmath();
+#define flushmath_regmem register memoryword *mem=zmem;
+halfword zcleanbox();
+#define cleanbox(p, s) zcleanbox((halfword) (p), (smallnumber) (s))
+#define cleanbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zfetch();
+#define fetch(a) zfetch((halfword) (a))
+#define fetch_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeover();
+#define makeover(q) zmakeover((halfword) (q))
+#define makeover_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeunder();
+#define makeunder(q) zmakeunder((halfword) (q))
+#define makeunder_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakevcenter();
+#define makevcenter(q) zmakevcenter((halfword) (q))
+#define makevcenter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeradical();
+#define makeradical(q) zmakeradical((halfword) (q))
+#define makeradical_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakemathaccent();
+#define makemathaccent(q) zmakemathaccent((halfword) (q))
+#define makemathaccent_regmem register memoryword *mem=zmem;
+void zmakefraction();
+#define makefraction(q) zmakefraction((halfword) (q))
+#define makefraction_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+scaled zmakeop();
+#define makeop(q) zmakeop((halfword) (q))
+#define makeop_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeord();
+#define makeord(q) zmakeord((halfword) (q))
+#define makeord_regmem register memoryword *mem=zmem;
+void zmakescripts();
+#define makescripts(q, delta) zmakescripts((halfword) (q), (scaled) (delta))
+#define makescripts_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber zmakeleftright();
+#define makeleftright(q, style, maxd, maxh) zmakeleftright((halfword) (q), (smallnumber) (style), (scaled) (maxd), (scaled) (maxh))
+#define makeleftright_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mlisttohlist();
+#define mlisttohlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void pushalignment();
+#define pushalignment_regmem register memoryword *mem=zmem;
+void popalignment();
+#define popalignment_regmem register memoryword *mem=zmem;
+void getpreambletoken();
+#define getpreambletoken_regmem register memoryword *eqtb=zeqtb;
+void initalign();
+#define initalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zinitspan();
+#define initspan(p) zinitspan((halfword) (p))
+#define initspan_regmem
+void initrow();
+#define initrow_regmem register memoryword *mem=zmem;
+void initcol();
+#define initcol_regmem register memoryword *mem=zmem;
+boolean fincol();
+#define fincol_regmem register memoryword *mem=zmem;
+void finrow();
+#define finrow_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void finalign();
+#define finalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alignpeek();
+#define alignpeek_regmem
+halfword zfiniteshrink();
+#define finiteshrink(p) zfiniteshrink((halfword) (p))
+#define finiteshrink_regmem register memoryword *mem=zmem;
+void ztrybreak();
+#define trybreak(pi, breaktype) ztrybreak((integer) (pi), (smallnumber) (breaktype))
+#define trybreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zpostlinebreak();
+#define postlinebreak(finalwidowpenalty) zpostlinebreak((integer) (finalwidowpenalty))
+#define postlinebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber zreconstitute();
+#define reconstitute(j, n, bchar, hchar) zreconstitute((smallnumber) (j), (smallnumber) (n), (halfword) (bchar), (halfword) (hchar))
+#define reconstitute_regmem register memoryword *mem=zmem;
+void zhashfunk();
+#define hashfunk(w, anfang, ende, v, ind, k) zhashfunk( (w), (integer) (anfang), (integer) (ende), (v), (ind), (k))
+#define hashfunk_regmem
+void zunpackinfo();
+#define unpackinfo(b, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein) zunpackinfo((infobyte) (b), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein))
+#define unpackinfo_regmem
+void zunpackentry();
+#define unpackentry(h, etabv, etabb, efrei, ewiederfrei) zunpackentry( (h), (verdschlue *) &(etabv), (infobyte *) &(etabb), (boolean *) &(efrei), (boolean *) &(ewiederfrei))
+#define unpackentry_regmem
+void zhashsuch();
+#define hashsuch(v, ind, k, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein, g) zhashsuch((verdschlue) (v), (integer) (ind), (integer) (k), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein), (boolean *) &(g))
+#define hashsuch_regmem
+void zhashload();
+#define hashload(status) zhashload((integer *) &(status))
+#define hashload_regmem
+void inittrennen();
+#define inittrennen_regmem
+void zpackinfo();
+#define packinfo(i, b) zpackinfo((i), (infobyte *) &(b))
+#define packinfo_regmem
+void zpackentry();
+#define packentry(e, h) zpackentry((e), (h))
+#define packentry_regmem
+void zhashetr();
+#define hashetr(w, laenge, i, g) zhashetr( (w), (integer) (laenge), (i), (boolean *) &(g))
+#define hashetr_regmem
+void hashempty();
+#define hashempty_regmem
+void zhashsave();
+#define hashsave(status) zhashsave((integer *) &(status))
+#define hashsave_regmem
+integer hashsize();
+#define hashsize_regmem
+void zzahl();
+#define zahl(line, i, ende, j) zzahl( (line), (integer *) &(i), (integer) (ende), (integer *) &(j))
+#define zahl_regmem
+void zinfobau();
+#define infobau(line, anfang, ende, informausnahme, informuntrennbar, informerste, informzweite, informendung, informvorsilbe, informstamm, informehervor, informstammallein, g) zinfobau( (line), (integer) (anfang), (integer) (ende), (boolean *) &(informausnahme), (boolean *) &(informuntrennbar), (integer *) &(informerste), (integer *) &(informzweite), (boolean *) &(informendung), (boolean *) &(informvorsilbe), (boolean *) &(informstamm), (boolean *) &(informehervor), (boolean *) &(informstammallein), (boolean *) &(g))
+#define infobau_regmem
+void zeintragen();
+#define eintragen(line, l) zeintragen( (line), (integer) (l))
+#define eintragen_regmem
+void znaechsterbst();
+#define naechsterbst(i, tr, dudstop, b, w) znaechsterbst((integer *) &(i), (tr), (dudstop), (buchstabe *) &(b), (w))
+#define naechsterbst_regmem
+void zduden();
+#define duden(tr, w, tr1, dudtr, dud, dudstop, laenge, ok, zerlegungen) zduden( (tr), (w), (tr1), (dudtr), (dud), (dudstop), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen))
+#define duden_regmem
+void ztrennen();
+#define trennen(zustand, anfang, spv, ok1, tr, dudtr, zerlegungen, dud, v, ind, k, dudstop, w, tr1, laenge) ztrennen((integer) (zustand), (integer) (anfang), (spv), (boolean *) &(ok1), (tr), (dudtr), (integer *) &(zerlegungen), (dud), (v), (ind), (k), (dudstop), (w), (tr1), (integer) (laenge))
+#define trennen_regmem
+void zabteilen();
+#define abteilen(w, tr1, laenge, ok, zerlegungen) zabteilen( (w), (tr1), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen))
+#define abteilen_regmem
+boolean zisdirtyumlaut();
+#define isdirtyumlaut(p) zisdirtyumlaut((halfword) (p))
+#define isdirtyumlaut_regmem register memoryword *mem=zmem;
+integer zgetcharof();
+#define getcharof(s) zgetcharof((halfword) (s))
+#define getcharof_regmem register memoryword *mem=zmem;
+integer zgetfontof();
+#define getfontof(s) zgetfontof((halfword) (s))
+#define getfontof_regmem register memoryword *mem=zmem;
+void hyphenate();
+#define hyphenate_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+trieopcode znewtrieop();
+#define newtrieop(d, n, v) znewtrieop((smallnumber) (d), (smallnumber) (n), (trieopcode) (v))
+#define newtrieop_regmem
+triepointer ztrienode();
+#define trienode(p) ztrienode((triepointer) (p))
+#define trienode_regmem
+triepointer zcompresstrie();
+#define compresstrie(p) zcompresstrie((triepointer) (p))
+#define compresstrie_regmem
+void zfirstfit();
+#define firstfit(p) zfirstfit((triepointer) (p))
+#define firstfit_regmem
+void ztriepack();
+#define triepack(p) ztriepack((triepointer) (p))
+#define triepack_regmem
+void ztriefix();
+#define triefix(p) ztriefix((triepointer) (p))
+#define triefix_regmem
+void newpatterns();
+#define newpatterns_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void inittrie();
+#define inittrie_regmem
+void zlinebreak();
+#define linebreak(finalwidowpenalty) zlinebreak((integer) (finalwidowpenalty))
+#define linebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void newhyphexceptions();
+#define newhyphexceptions_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zprunepagetop();
+#define prunepagetop(p) zprunepagetop((halfword) (p))
+#define prunepagetop_regmem register memoryword *mem=zmem;
+halfword zvertbreak();
+#define vertbreak(p, h, d) zvertbreak((halfword) (p), (scaled) (h), (scaled) (d))
+#define vertbreak_regmem register memoryword *mem=zmem;
+halfword zvsplit();
+#define vsplit(n, h) zvsplit((eightbits) (n), (scaled) (h))
+#define vsplit_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void printtotals();
+#define printtotals_regmem
+void zfreezepagespecs();
+#define freezepagespecs(s) zfreezepagespecs((smallnumber) (s))
+#define freezepagespecs_regmem register memoryword *eqtb=zeqtb;
+void zboxerror();
+#define boxerror(n) zboxerror((eightbits) (n))
+#define boxerror_regmem register memoryword *eqtb=zeqtb;
+void zensurevbox();
+#define ensurevbox(n) zensurevbox((eightbits) (n))
+#define ensurevbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zfireup();
+#define fireup(c) zfireup((halfword) (c))
+#define fireup_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void buildpage();
+#define buildpage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appspace();
+#define appspace_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void insertdollarsign();
+#define insertdollarsign_regmem
+void youcant();
+#define youcant_regmem
+void reportillegalcase();
+#define reportillegalcase_regmem
+boolean privileged();
+#define privileged_regmem
+boolean itsallover();
+#define itsallover_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appendglue();
+#define appendglue_regmem register memoryword *mem=zmem;
+void appendkern();
+#define appendkern_regmem register memoryword *mem=zmem;
+void offsave();
+#define offsave_regmem register memoryword *mem=zmem;
+void extrarightbrace();
+#define extrarightbrace_regmem
+void normalparagraph();
+#define normalparagraph_regmem register memoryword *eqtb=zeqtb;
+void zboxend();
+#define boxend(boxcontext) zboxend((integer) (boxcontext))
+#define boxend_regmem register memoryword *mem=zmem;
+void zbeginbox();
+#define beginbox(boxcontext) zbeginbox((integer) (boxcontext))
+#define beginbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanbox();
+#define scanbox(boxcontext) zscanbox((integer) (boxcontext))
+#define scanbox_regmem
+void zpackage();
+#define package(c) zpackage((smallnumber) (c))
+#define package_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber znormmin();
+#define normmin(h) znormmin((integer) (h))
+#define normmin_regmem
+void znewgraf();
+#define newgraf(indented) znewgraf((boolean) (indented))
+#define newgraf_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void indentinhmode();
+#define indentinhmode_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void headforvmode();
+#define headforvmode_regmem
+void endgraf();
+#define endgraf_regmem register memoryword *eqtb=zeqtb;
+void begininsertoradjust();
+#define begininsertoradjust_regmem
+void makemark();
+#define makemark_regmem register memoryword *mem=zmem;
+void appendpenalty();
+#define appendpenalty_regmem register memoryword *mem=zmem;
+void deletelast();
+#define deletelast_regmem register memoryword *mem=zmem;
+void unpackage();
+#define unpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appenditaliccorrection();
+#define appenditaliccorrection_regmem register memoryword *mem=zmem;
+void appenddiscretionary();
+#define appenddiscretionary_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void builddiscretionary();
+#define builddiscretionary_regmem register memoryword *mem=zmem;
+void makeaccent();
+#define makeaccent_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alignerror();
+#define alignerror_regmem
+void noalignerror();
+#define noalignerror_regmem
+void omiterror();
+#define omiterror_regmem
+void doendv();
+#define doendv_regmem
+void cserror();
+#define cserror_regmem
+void zpushmath();
+#define pushmath(c) zpushmath((groupcode) (c))
+#define pushmath_regmem
+void initmath();
+#define initmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void starteqno();
+#define starteqno_regmem register memoryword *eqtb=zeqtb;
+void zscanmath();
+#define scanmath(p) zscanmath((halfword) (p))
+#define scanmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zsetmathchar();
+#define setmathchar(c) zsetmathchar((integer) (c))
+#define setmathchar_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mathlimitswitch();
+#define mathlimitswitch_regmem register memoryword *mem=zmem;
+void zscandelimiter();
+#define scandelimiter(p, r) zscandelimiter((halfword) (p), (boolean) (r))
+#define scandelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mathradical();
+#define mathradical_regmem register memoryword *mem=zmem;
+void mathac();
+#define mathac_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appendchoices();
+#define appendchoices_regmem register memoryword *mem=zmem;
+halfword zfinmlist();
+#define finmlist(p) zfinmlist((halfword) (p))
+#define finmlist_regmem register memoryword *mem=zmem;
+void buildchoices();
+#define buildchoices_regmem register memoryword *mem=zmem;
+void subsup();
+#define subsup_regmem register memoryword *mem=zmem;
+void mathfraction();
+#define mathfraction_regmem register memoryword *mem=zmem;
+void mathleftright();
+#define mathleftright_regmem register memoryword *mem=zmem;
+void aftermath();
+#define aftermath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void resumeafterdisplay();
+#define resumeafterdisplay_regmem
+void getrtoken();
+#define getrtoken_regmem
+void trapzeroglue();
+#define trapzeroglue_regmem register memoryword *mem=zmem;
+void zdoregistercommand();
+#define doregistercommand(a) zdoregistercommand((smallnumber) (a))
+#define doregistercommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alteraux();
+#define alteraux_regmem
+void alterprevgraf();
+#define alterprevgraf_regmem
+void alterpagesofar();
+#define alterpagesofar_regmem
+void alterinteger();
+#define alterinteger_regmem
+void alterboxdimen();
+#define alterboxdimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void znewfont();
+#define newfont(a) znewfont((smallnumber) (a))
+#define newfont_regmem register memoryword *eqtb=zeqtb;
+void newinteraction();
+#define newinteraction_regmem
+void prefixedcommand();
+#define prefixedcommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void doassignments();
+#define doassignments_regmem
+void openorclosein();
+#define openorclosein_regmem
+void issuemessage();
+#define issuemessage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void shiftcase();
+#define shiftcase_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void showwhatever();
+#define showwhatever_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void storefmtfile();
+#define storefmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void znewwhatsit();
+#define newwhatsit(s, w) znewwhatsit((smallnumber) (s), (smallnumber) (w))
+#define newwhatsit_regmem register memoryword *mem=zmem;
+void znewwritewhatsit();
+#define newwritewhatsit(w) znewwritewhatsit((smallnumber) (w))
+#define newwritewhatsit_regmem register memoryword *mem=zmem;
+void doextension();
+#define doextension_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void fixlanguage();
+#define fixlanguage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void handlerightbrace();
+#define handlerightbrace_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void maincontrol();
+#define maincontrol_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void giveerrhelp();
+#define giveerrhelp_regmem register memoryword *eqtb=zeqtb;
+boolean openfmtfile();
+#define openfmtfile_regmem
+boolean loadfmtfile();
+#define loadfmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void closefilesandterminate();
+#define closefilesandterminate_regmem register memoryword *eqtb=zeqtb;
+void finalcleanup();
+#define finalcleanup_regmem register memoryword *mem=zmem;
+void initprim();
+#define initprim_regmem register memoryword *eqtb=zeqtb;
+void debughelp();
+#define debughelp_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void texbody();
+#define texbody_regmem register memoryword *eqtb=zeqtb;
+/*
+ * The C compiler ignores most unnecessary casts (i.e., casts of something
+ * to its own type). However, for structures, it doesn't. Therefore,
+ * we have to redefine these two macros so that they don't try to cast
+ * the argument (a memoryword) as a memoryword.
+ */
+#undef eqdestroy
+#define eqdestroy(x) zeqdestroy(x)
+#undef printword
+#define printword(x) zprintword(x)
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch
new file mode 100644
index 0000000000..0219aedbf2
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch
@@ -0,0 +1,1877 @@
+% Change file for TeX in C, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ../ChangeLog.W2C)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting, 1986.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner (changed to show trie extension version)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)'
+@y
+@d banner=='This is TeX, C Version 3.14t3 (+SISISI 1.0)' {printed when \TeX\ starts}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size becomes FILENAMESIZE.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:SITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=72000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=7500; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=74000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=100000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=24000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns}
+@!neg_trie_op_size=-750; {for lower trie_op_hash array bound}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='sitex.pool';
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constants, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above), since to needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name)+1] := ' ';
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read SITEX3.POOL.');
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read sitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! sitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! sitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! sitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin print(format_ident); print_ln;
+ end;
+@y
+if format_ident>0 then print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in
+% the basic version.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] Put the memory structure into an include file, since it's too
+% hard to translate automatically. Also, remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "memory.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.534] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try without |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ pack_cur_name; {Try adding |".tex"|, even if we already have an extension.}
+ if name_length < file_name_size + 5 {Don't overflow the array.}
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+@z
+
+% Knuth should fix this bug.
+@x
+if term_offset+length(name)>max_print_line-2 then print_ln
+@y
+if term_offset+length(name)>max_print_line-3 then print_ln
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Fix TFM file opening.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened:=false;
+pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+%@x
+% begin if trie_op(z)<>min_quarterword then
+%@y
+% begin if trie_op(z)<>min_trie_op then
+%@z
+%@x
+%until v=min_quarterword;
+%@y
+%until v=min_trie_op;
+%@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.?] Hack around the negative lower bound here.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size+trie_op_size)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] And another.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ pack_cur_name;
+ if name_length < file_name_size + 5 {Don't overflow the array.}
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print(log_name); print_char(".");
+ end;
+ end;
+@y
+ print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/install b/obsolete/systems/sisisi/unix/SiTeX3.14/install
new file mode 100644
index 0000000000..42018ad32e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/install
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX3.14"
+TEXDIR=$TEXSRC/tex
+WEBDIR=$TEXSRC/web
+WEB2CDIR=$TEXSRC/web2c
+SISISIDIR="/users/heinz/src/tex/sisisi"
+
+echo
+echo "Do not forget to copy the files *.sty and *.tex"
+echo "from $SISISIDIR to your TEXINPUTS-Directory."
+echo
+echo "Press 'q' to interrupt this installation and do it now, <cr> to continue"
+read x
+if [ "$x" = "q" ]
+then
+ exit
+fi
+
+cd $TEXSRC
+
+( cd $SISISIDIR; uncompress <sitex.web.Z >$TEXDIR/tex.web;\
+ cp web2c* $WEB2CDIR; \
+ cp tangle.ch $WEBDIR; cp makefile $TEXSRC; cp Makefile ctex.ch $TEXDIR )
+
+make "CC=gcc" TeX
+if [ ! -f $TEXDIR/stamp-convert ]
+then
+ echo "*** SISISI: tex.p not converted. Something's gone wrong. Stop." 1>&2
+ exit 1
+fi
+
+( cd $SISISIDIR; cp tex6.c texd.h coerce.h $TEXDIR )
+
+make "CC=gcc" TeX
+if [ ! -f $TEXDIR/virtex ]
+then
+ echo "*** SISISI: make failed. Stop." 1>&2
+ exit 2
+fi
+
+( cd $TEXDIR; mv tex.pool sitex.pool )
+
+make formats
+if [ ! -f $TEXSRC/stamp-formats ]
+then
+ echo "*** SISISI: make formats failed. Stop." 1>&2
+ exit 2
+fi
+
+echo
+echo "SISISI has been successfully compiled, and the format files have been"
+echo "generated. Now follow the guidelines from the README file for further"
+echo "installation. Do not forget to copy $TEXDIR/sitex.pool"
+echo "to your TEXPOOL-Directory, and $TEXDIR/hf3 to your"
+echo "TEXINPUTS-Directory."
+echo
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/makefile b/obsolete/systems/sisisi/unix/SiTeX3.14/makefile
new file mode 100644
index 0000000000..c72607bcef
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/makefile
@@ -0,0 +1,280 @@
+# Overall Makefile for making TeX, Metafont, and friends, using WEB to C.
+
+
+# TeX 3.14 + Metafont 2.7 + web2c b.
+#
+version=5.84b
+
+# Directory that site.h is in relative to subdirectories, i.e., `..'
+# means the directory containing this Makefile.
+SITEDIR=..
+
+# Default C compiler.
+CC=gcc
+
+# Default flags to give the C compiler. (Don't define CFLAGS directly.)
+OPT=-O
+
+# Default flags to give to the loader.
+LDFLAGS=
+
+# Default libraries with which to link (libraries for the Metafont
+# support are specified separately).
+LOADLIBES=
+
+# Make sure we use the sh. If your sh is broken, you might try bash,
+# the GNU replacement.
+SHELL=/bin/sh
+
+# The yacc program to use on web2c/web2c.yacc.
+YACC=bison -y
+
+# The lex program to use on web2c/web2c.lex.
+LEX=lex
+# -ll for lex, -lfl for flex.
+LEXLIB=-ll
+
+# Need -D_POSIX_SOURCE here, perhaps, if on a POSIX system.
+LEXCFLAGS=
+
+# How to make a link.
+LN=ln -s
+
+# Support libraries for Metafont.
+x10lib=-lX
+x11lib=-lXt -lX11
+sunlib=-lsuntool -lsunwindow -lpixrect
+
+# This line should select the libraries that match what you said in site.h.
+wlibs=$(x11lib)
+
+# These lines define the format and base files that `make fmts' and
+# `make bases' will try to make, and `make install' will try to install.
+# See README.W2C for a brief description of each of these formats.
+formats=sitex.fmt silatex.fmt
+# etex.fmt \
+# amstex.fmt amslatex.fmt picplus.fmt texinfo.fmt
+bases=mf.base cmmf.base
+
+# The name of the file that defines your local devices, for use with
+# Metafont. (Only relevant during `make bases'.) I urge you to get the
+# file `modes.mf', which defines all known modes, plus useful
+# definitions for all fonts. It's available from ftp.cs.umb.edu
+# [192.12.26.23] as pub/tex/modes.mf, among other places.
+localmodes=modes
+
+# You may need INSTALL=cp on system V, if you don't have GNU install.
+# Or you can install the programs by hand.
+# $(fileinstall) is used for the format and base files, man files, and
+# other non-executables, and $(programinstall) is used for
+# the executables.
+INSTALL=install -g tex -c
+fileinstall=$(INSTALL) -m 664
+proginstall=$(INSTALL) -m 775 -s
+
+# These pathnames are used to customize the manual pages with local
+# directory names; some of them are used in `make install'. They should
+# match the system directories in the paths defined in `./site.h'.
+bindir=/usr/local/bin
+manext=l
+mandir=/usr/man/man$(manext)
+
+texlibdir=/usr/local/lib/tex
+texpooldir=$(texlibdir)
+texinputdir=$(texlibdir)/inputs
+texfontdir=$(texlibdir)/fonts
+formatdir=$(texlibdir)/formats
+
+mflibdir=/usr/local/lib/mf
+mfpooldir=$(mflibdir)
+mfinputdir=$(mflibdir)/inputs
+basedir=$(mflibdir)/bases
+
+# Where the Computer Modern sources are.
+# (The man pages claim that you have installed the standard utility
+# sources, like `grayf.mf' and `expr.mf', somewhere in $(mfinputdir).)
+cmsources=/usr/local/src/other/TeX+MF/typefaces/cm
+
+default: all
+
+
+# Stuff below here probably doesn't need to be changed.
+#
+alldirs=web tex mf texware mfware fontutil bibtex dviutil
+triptrapdirs=tex texware mf mfware
+
+makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \
+SHELL="$(SHELL)" LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" wlibs="$(wlibs)"
+
+web2c=web2c
+web2cprograms=$(web2c)/web2c $(web2c)/regfix $(web2c)/splitup \
+ $(web2c)/fixwrites
+commonsources=common/alloca.c common/extra.c common/main.c common/endian.c
+
+triptrap: stamp-tangle stamp-common
+ for name in $(triptrapdirs); \
+ do \
+ (cd $${name}; make $(makeargs) LN="$(LN)" triptrap); \
+ done
+
+run-triptrap: run-trip run-trap
+
+clean-triptrap:
+ cd tex; make veryclean
+ cd mf; make veryclean
+
+all: stamp-web2c stamp-common
+ for name in $(alldirs); \
+ do \
+ (cd $${name}; echo $${name}; make $(makeargs) all); \
+ done
+
+TeX: stamp-web2c stamp-tangle stamp-common
+ cd tex; make $(makeargs) all
+
+BibTeX: stamp-web2c stamp-tangle stamp-common
+ cd bibtex; make $(makeargs) all
+
+run-trip:
+ cd tex; make run-trip
+
+MF: stamp-web2c stamp-tangle stamp-common
+ cd mf; make $(makeargs) all
+
+run-trap:
+ cd mf; make run-trap
+
+
+# The targets below must be up to date for anything to be made.
+#
+
+stamp-web2c:
+ cd $(web2c); \
+ make $(makeargs) YACC="$(YACC)" LEX="$(LEX)" LEXLIB="$(LEXLIB)" all
+ touch stamp-web2c
+
+stamp-common: $(commonsources)
+ cd common; make $(makeargs) all
+ touch stamp-common
+
+stamp-tangle: stamp-web2c stamp-common
+ cd web; make $(makeargs) tangle
+ touch stamp-tangle
+
+
+manpages:
+ cd man; make SITEDIR=$(SITEDIR) \
+ bindir=$(bindir) texlibdir=$(texlibdir) \
+ texpooldir=$(texpooldir) formatdir=$(formatdir) \
+ texinputdir=$(texinputdir) texfontdir=$(texfontdir) \
+ mflibdir=$(mflibdir) mfpooldir=$(mfpooldir) \
+ basedir=$(basedir) mfinputdir=$(mfinputdir) \
+ cmsources=$(cmsources) \
+ all
+
+bases: stamp-bases
+stamp-bases:
+ cd mf; MFPOOL=.; export MFPOOL; \
+ make bases="$(bases)" localmodes="$(localmodes)" bases
+ touch stamp-bases
+
+formats: stamp-formats
+stamp-formats:
+ cd tex; TEXPOOL=.; export TEXPOOL; make formats="$(formats)" fmts
+ touch stamp-formats
+
+
+# Installation targets.
+#
+install-manpages:
+ cd man; make mandir=$(mandir) INSTALL="$(fileinstall)" \
+ SITEDIR="$(SITEDIR)" manext=$(manext) install
+
+install:
+ if test -d $(bindir); then exit 0; else mkdir $(bindir); fi
+ $(proginstall) tex/initex $(bindir)/initex
+ $(proginstall) tex/virtex $(bindir)/virtex
+ $(proginstall) mf/inimf $(bindir)/inimf
+ $(proginstall) mf/virmf $(bindir)/virmf
+ $(proginstall) web/tangle $(bindir)/tangle
+ $(proginstall) web/weave $(bindir)/weave
+ $(proginstall) texware/dvitype $(bindir)/dvitype
+ $(proginstall) texware/pltotf $(bindir)/pltotf
+ $(proginstall) texware/tftopl $(bindir)/tftopl
+ $(proginstall) mfware/gftodvi $(bindir)/gftodvi
+ $(proginstall) mfware/gftopk $(bindir)/gftopk
+ $(proginstall) mfware/gftype $(bindir)/gftype
+ $(proginstall) mfware/mft $(bindir)/mft
+ $(proginstall) fontutil/pktogf $(bindir)/pktogf
+ $(proginstall) fontutil/pktype $(bindir)/pktype
+ $(proginstall) fontutil/vftovp $(bindir)/vftovp
+ $(proginstall) fontutil/vptovf $(bindir)/vptovf
+ $(proginstall) bibtex/bibtex $(bindir)/bibtex
+ $(proginstall) dviutil/dvicopy $(bindir)/dvicopy
+ if test -d $(texpooldir); then exit 0; else mkdir $(texpooldir); fi
+ -if test -s tex/tex.pool; \
+ then (cd tex; $(fileinstall) tex.pool $(texpooldir) ); fi
+ if test -d $(mfpooldir); then exit 0; else mkdir $(mfpooldir); fi
+ -if test -s mf/mf.pool; \
+ then (cd mf; $(fileinstall) mf.pool $(mfpooldir) ); fi
+
+install-formats: stamp-formats
+ if test -d $(formatdir); then exit 0; else -mkdir $(formatdir); fi
+ for f in $(formats); \
+ do \
+ rm -f $(bindir)/`basename $$f .fmt`; \
+ ln $(bindir)/virtex $(bindir)/`basename $$f .fmt`; \
+ $(fileinstall) tex/$$f $(formatdir); \
+ done
+ cd $(formatdir); rm -f plain.fmt; ln tex.fmt plain.fmt
+
+install-bases: stamp-bases
+ if test -d $(basedir); then exit 0; else -mkdir $(basedir); fi
+ for f in $(bases); \
+ do \
+ rm -f $(bindir)/`basename $$f .base`; \
+ ln $(bindir)/virmf $(bindir)/`basename $$f .base`; \
+ $(fileinstall) mf/$$f $(basedir); \
+ done
+ cd $(basedir); rm -f plain.base; ln mf.base plain.base
+
+
+# Need GNU tar for this.
+#
+web2c-dist: web/tangleboot.pas
+ @echo -n "check -linet;tangleboot"
+ @echo "big{tex,mf.ch; trie change"
+ mv ChangeLog ChangeLog.W2C
+ cd ..; \
+ find src-$(version) \! -name '*.web' -type f -print > /tmp/files; \
+ tar czfT web2c-$(version).tar.Z /tmp/files; \
+ ls -ld web*
+ mv ChangeLog.W2C ChangeLog
+
+web-dist: web/tangleboot.pas
+ cd ..; \
+ find src-$(version) -name '*.web' -print > /tmp/webfest; \
+ tar czfT web-$(version).tar.Z /tmp/webfest; \
+ ls -ld web*
+
+web/tangleboot.pas:
+ cd web; make tangle.p; cp tangle.p tangleboot.pas; make veryclean
+
+clean:
+ rm -f stamp-*
+ for name in web2c common $(alldirs); \
+ do \
+ (cd $${name}; make clean); \
+ done
+
+veryclean:
+ rm -f stamp-*
+ for name in web2c common man $(alldirs); \
+ do \
+ (cd $${name}; make veryclean); \
+ done
+ rm -f \#*\# *~ *.bak *.ckp core
+
+.PHONY: default triptrap run-triptrap clean-triptrap all TeX run-trip \
+ MF run-trap manpages bases formats install-manpages install \
+ install-formats install-bases web2c-dist web-dist clean veryclean
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz
new file mode 100644
index 0000000000..13fb851bfe
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz
Binary files differ
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch
new file mode 100644
index 0000000000..048d9433cb
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch
@@ -0,0 +1,2827 @@
+=========================================================================
+
+SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991
+ (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl
+ (c) for TeX changes: Heini Hofstaedter, Harald Mueller
+
+ additional changes until 10. October 1991 HH
+=========================================================================
+
+This is the change file for inclusion of SISISI into TeX V.3.14.
+
+There are three main changes in this file (which are of course quite
+intermingled):
+
+ 1) the replacement of Liang's hyphenation by SISISI.
+
+ 2) the change of the interface of the actual hyphenation
+ to the post-hyphenation and the line-break algorithm.
+
+ This change is necessary because in original TeX, only the
+ information "hyphen - no hyphen" can be transmitted to the
+ line break algorithm because of two "bottlenecks":
+
+ 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i
+ is marked by the 1-bit information odd(hyf[i]).
+ 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked
+ by the existence of a discretionary node.
+
+ From SISISI, there must be more information flowing to the
+ line-break algorithm:
+
+ a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end,
+ a change is made such that a penalty node is allowed as
+ the first node in the prebreak list of a discretionary
+ node. This penalty node contains the penalty associated with
+ this specific hyphen. For "nebenhyphens", this value is set
+ by an additional primitive "\nebenhyphenpenalty".
+ Instead of the hyf-array, an array hyfpen is used that
+ contains the actual penalties; the old "if odd(hyf[i])" now
+ is converted ti "if hyfpen[i] <> inf_penalty".
+
+ b. A hyphen may be more complicated than a single -: ck-hyphens
+ and triple-consonant-hyphens may be present. To include these,
+ another array hyf_disc is introduced that contains ready-made
+ discretionary nodes for such hyphens.
+
+ At first, we simply wanted to include these discretionary
+ during the post-hyphenation into the new node list. But then
+ Heini felt that the impossiblity of ligatures with parts of such
+ a discretionary node was not acceptable; therefore he introdiced
+ the "x-mechanism" (characterized by many variables starting with
+ "x") and changed the reconstitute function so that more than the
+ single hyphen_char could be introduced into the reconstitution
+ process.
+
+ 3) "Dirty" changes for the hyphenation of words with umlauts.
+ These changes are necessary because the umlauts in TeX are not
+ (necessarily) real characters, but something else (see definition
+ of umlauts in plain.tex or german.tex).
+ Ordinarily, the hyphenation only accepts sequences of letters,
+ ligatures (which are expanded to their single characters), and
+ so-called "implicit kerns". An umlaut, however, is usually
+ represented as a letter character and another character consisting
+ of two dots ("dieresis character"), which are connected by
+ explicit kerns (not implicite ones!). Therefore, words containing
+ umlauts are not hyphenable words in TeX, which is not acceptable
+ for german texts.
+
+ Therefore, we devised a "bypass" for umlauts as follows: An umlaut
+ is now represented as a special discretionary node (so-called
+ "dirty umlaut") as follows:
+ \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}%
+ {}%
+ {<umlaut>}
+ where the 4321sp is a "marker" for the "dirty umlaut", the "m"
+ letter is used to derive the font of the umlaut, <code> is
+ the font number that should be associated with this umlaut (the
+ font numbers of the umlauts are given below); and <back> is used
+ to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>).
+
+ In other words, the prebreak list contains the information that
+ this is an umlaut (albeit a "dirty" one) and some more
+ information needed for the hyphenation, the postbreak list is
+ empty, and the main list contains the umlaut proper. By a
+ special if-statement in the line-break algorithm, a hyphenation
+ at a discretionary node of this format is suppressed, so that
+ always the umlaut of the main list is printed.
+ The font numbers for the lowercase umlauts (which are given
+ in the second \kern node) must be:
+ ae 228
+ oe 246
+ ue 252
+ The codes for the uppercase umlauts can be chosen arbitrarily.
+
+ In order to get the hyphenation for these "dirty umlauts"
+ running, one must include lccode assignments of the form
+ \lccode<code>=<lccode>
+ for each of the new letters (see example below).
+
+ A typical declaration of the "dirty umlauts" runs like this:
+
+%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%%
+\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}}
+\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}}
+\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}}
+\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}}
+\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}}
+\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}}
+\lccode196=228 % uppercase umlaut A
+\lccode214=246 % uppercase umlaut O
+\lccode220=252 % uppercase umlaut U
+\lccode228=228 % uppercase umlaut a
+\lccode246=246 % uppercase umlaut o
+\lccode252=252 % uppercase umlaut u
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the
+third kind can be eliminated. How long this will take ... well, wait and
+see.
+But when they arrive, it's not longer possible to choose the codes for
+uppercase umlauts arbitrarily. The codes for uppercase umlauts will
+then be those, shown in the example above.
+
+=========================================================================
+
+At first, we add a control sequence \SISISI.
+@x
+\def\PASCAL{Pascal}
+@y
+\def\SISISI{{\sl SISISI}}
+\def\PASCAL{Pascal}
+
+\let\maybe=\iffalse % print only changed modules
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@d banner=='This is TeX, Version 3.14' {printed when \TeX\ starts}
+@y
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)'
+@z
+
+-------------------------------------------------------------------------
+
+A number of procedures of SISISI are declared after the TeX program. As
+these procedures are used in the hyphenation, of course, they must be
+declared as `forward'.
+ In web2c gibt es keine forward's !!!!
+%@x
+%procedure initialize; {this procedure gets things started properly}
+%@y
+%@<forward declarations@>
+%procedure initialize; {this procedure gets things started properly}
+%@z
+
+-------------------------------------------------------------------------
+%@x
+%@d pool_name_length=8
+%@y
+%@d pool_name_length=11
+% {number of characters of ``pool_f_name''}
+%@z
+%see the following change of the pool file name "pool_f_name"
+-------------------------------------------------------------------------
+
+@x
+@!pool_name='TeXformats:TEX.POOL ';
+@y
+@!pool_name='TeXformats:SITEX3.POOL ';
+@z
+
+-------------------------------------------------------------------------
+
+@x
+else bad_pool('! I can''t read TEX.POOL.')
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read SITEX3.POOL.');
+@.I can't read TEX.POOL@>
+@z
+=========================================================================
+
+To have all messages, coming from SI_TEX, displayed on screen
+and written to the log-file simultanously, we make the following,
+additional definitions.
+ temp nicht mehr vorhanden, in log ve„ndert.
+@x
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+@y
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+
+@d si_put(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog(#);
+ end
+@d si_put_ln(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm_ln(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog_ln(#);
+ end
+@d si_put_cr == print_ln
+
+
+@d dbg_put(#) == {}
+@d dbg_put_ln(#) == {}
+@d dbg_put_cr == {}
+@z
+=========================================================================
+
+We add a new primitive \nebenhyphenpenalty for setting the penalty of a
+minor hyphen:
+
+@x
+@d int_pars=55 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@y
+@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen}
+@d si_debug_code=56 {value is treated as an set of active debugging sections}
+@d supress_debug_mark_code=57 {same as above; if a section number is set, then
+ the output of the section number and the debugging output banner
+ of this section is supressed}
+@d int_pars=58 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@z
+-------------------------------------------------------------------------
+@x
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@y
+@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code)
+@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin
+ if not odd(int_par(supress_debug_mark_code)div #) then
+ begin
+ si_put_cr;
+ si_put_ln(' <* debugging output section #',#:#,' *>');
+ end; {marking supression}
+ { dig_count entfernt !!! }
+@d gubed_si == end
+@f si_debug == begin
+@f gubed_si == end
+@f gubed == nil
+
+
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@z
+-------------------------------------------------------------------------
+@x
+othercases print("[unknown integer parameter!]")
+@y
+neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty");
+si_debug_code:print_esc("sidebug");
+supress_debug_mark_code:print_esc("supressdebugmark");
+othercases print("[unknown integer parameter!]")
+@z
+-------------------------------------------------------------------------
+@x
+@ @<Cases of |print_cmd_chr|...@>=
+@y
+primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/
+@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@>
+primitive("sidebug",assign_int,int_base+si_debug_code);
+primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code);
+@ @<Cases of |print_cmd_chr|...@>=
+@z
+
+=========================================================================
+
+As now hyphens may have different penalties, we must somehow associate
+a penalty with a discretionary node. We do this by allowing a penalty
+node as the first node in the prebreak list of a discretionary node.
+
+The following changes are in two case statements that check the nodes
+in the sublists of a discretionary node; we add an empty case for
+penalty nodes (two more case statements follow a little bit later).
+
+@x
+ othercases confusion("disc1")
+@y
+ penalty_node: ;
+ othercases confusion("disc1")
+@z
+-------------------------------------------------------------------------
+@x
+ othercases confusion("disc2")
+@y
+ penalty_node: ;
+ othercases confusion("disc2")
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The following change is in the line-break section, where try_break is
+given the penalty stored in the penalty node. This change is the reason
+for all other changes concerning penalties. Moreover, in this change
+a line break is suppressed if the discretionary node is actually
+a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break").
+
+@x
+begin s:=pre_break(cur_p); disc_width:=0;
+if s=null then try_break(ex_hyphen_penalty,hyphenated)
+else begin repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ try_break(hyphen_penalty,hyphenated);
+ act_width:=act_width-disc_width;
+ end;
+r:=replace_count(cur_p); s:=link(cur_p);
+while r>0 do
+ begin @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@y
+begin
+ s:=pre_break(cur_p); disc_width:=0;
+ if s=null then try_break(ex_hyphen_penalty,hyphenated)
+ else if (type(s)=penalty_node) and (link(s)=null) then begin
+ flush_node_list(s); s := null;
+ try_break(ex_hyphen_penalty,hyphenated); end
+ else if not is_dirty_umlaut(cur_p) then begin
+ if type(s)=penalty_node then s:=link(s);
+ repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ if type(pre_break(cur_p))=penalty_node then begin
+ try_break(penalty(pre_break(cur_p)),hyphenated) end
+ else begin try_break(hyphen_penalty,hyphenated); end;
+ act_width:=act_width-disc_width;
+ end;
+ r:=replace_count(cur_p); s:=link(cur_p);
+ while r>0 do begin
+ @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+ prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@z
+
+=========================================================================
+
+Two more case statements.
+
+@x
+ othercases confusion("disc3")
+@y
+ penalty_node: ;
+ othercases confusion("disc3")
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ othercases confusion("disc4")
+@y
+ penalty_node: ;
+ othercases confusion("disc4")
+@z
+
+=========================================================================
+
+There's a little problem, converting a device independent (``.dvi'')
+to a post script file (``.ps''). I think that this program part could
+cause this problem. so let's see...
+
+!a <-- = --> @x With this, i want to try to reproduce this error.
+ Because, after i had inserted this change, that error didn`t occur
+ again!
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin if type(q)=disc_node then
+ @<Change discretionary to compulsory and set
+ |disc_break:=true|@>
+ else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end
+else begin q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @y
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin
+ if type(q)=disc_node then begin
+ hyfdeb_b:=false;
+ if is_dirty_umlaut(q) then begin
+ si_debug(64) hyfdeb_b:=true; gubed_si;
+ si_put_cr;
+ si_put_ln(' ??? There's a line break at a dirty umlaut!?');
+ end;
+ if not hyfdeb_b then begin
+ @<Change discretionary to compulsory and set |disc_break:=true|@>
+ end;
+ end else
+ if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end else begin
+ q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @z
+
+
+=========================================================================
+
+If the break actually occurs, the penalty node is made a separate list
+with only one node, which is immediately flushed.
+
+@x
+begin s:=pre_break(q); link(q):=s;
+while link(s)<>null do s:=link(s);
+pre_break(q):=null; q:=s;
+end
+@y
+begin
+ s:=pre_break(q);
+ if type(s)=penalty_node then begin
+ s:=link(s);
+ link(pre_break(q)):= null;
+ flush_node_list(pre_break(q));
+ end;
+ link(q):=s;
+ while link(s)<>null do s:=link(s);
+ pre_break(q):=null; q:=s;
+end
+@z
+
+=========================================================================
+
+The type `array[0..65] of 0..256' is needed more often, so we make it
+an explicit type (see big SISISI change at end of change file). hc is
+now declared of this type.
+
+@x
+@!hc:array[0..65] of 0..256; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+@y
+@!hc:a_word; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+{ some variables for debugging output }
+@!hyfdeb_i,hyfdeb_j: integer;
+@!hyfdeb_b:boolean;
+@!si_p, si_q, si_r, si_s: pointer;
+@z
+
+-------------------------------------------------------------------------
+
+Our hyphenation routines need even more "more local variables".
+
+@x
+@ Hyphenation routines need a few more local variables.
+@y
+@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a
+ whatsit node occurs inbetween a word. This can happen due to
+ Partl's changes in ``german.sty'' }
+
+@ Hyphenation routines need a few more local variables.
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@!j:small_number; {an index into |hc| or |hu|}
+@y
+@!qq:pointer;
+@!j:small_number; {two indices into |hc| or |hu|}
+@!jj:integer;
+@z
+
+=========================================================================
+
+The dirty_umlaut array must be initialized for each word.
+And we enable watching the node list, representing the word
+to be hyphenated.
+
+@x
+if s<>null then
+ begin @<Skip to node |ha|, or |goto done1| if no hyphenation
+@y
+si_p:=cur_p; si_q:=null;
+for jj:=-1 to 64 do dirty_umlaut[jj] := null;
+if s<>null then begin
+ si_debug(1)
+{ hyfdeb_i:=depth_threshold; depth_threshold:=100;
+ hyfdeb_j:=breadth_max; breadth_max:=100;
+}
+ show_node_list(si_p);
+{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; }
+ gubed_si;
+ @<Skip to node |ha|, or |goto done1| if no hyphenation
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ hyphenate;
+ end;
+done1: end
+@y
+ hyphenate;
+ end;
+done1:
+si_debug(32)
+ hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max;
+ if si_q<>null then begin
+ depth_threshold:=100; {show all levels of a list}
+ breadth_max:=200; {show all nodes of one level of a list}
+ si_r:=link(si_q); link(si_q):=null;
+ end else begin
+ (* take the values, set by the user, for this variables! *)
+ breadth_max:=show_box_breadth; depth_threshold:=show_box_depth;
+ end;
+ show_node_list(si_p);
+ si_put_cr;
+ if si_q <> null then link( si_q ) := si_r;
+
+ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j;
+gubed_si;
+end
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Here, we add the SISISI-procedure abteilen for use in hyphenate and
+another label done1.
+
+@x
+procedure hyphenate;
+label common_ending,done,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@y
+
+@<Handling of dirty umlauts@>
+
+procedure hyphenate;
+label common_ending,done,done1,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+The prehyphenation loop must now also skip over the "dirty umlauts".
+
+@x
+loop@+ begin if is_char_node(s) then
+ begin c:=qo(character(s)); hf:=font(s);
+ end
+ else if type(s)=ligature_node then
+ if lig_ptr(s)=null then goto continue
+ else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then
+ begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end
+ else goto done1;
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@y
+loop@+ begin
+ if is_char_node(s) then begin
+ c:=qo(character(s)); hf:=font(s);
+ end else if type(s)=ligature_node then begin
+ if lig_ptr(s)=null then goto continue
+ else begin
+ q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ end else if is_dirty_umlaut(s) then begin
+ c:=get_char_of(s); hf:=get_font_of(s);
+ end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end else goto done1;
+
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The interface variables for the hyphenation are extended: hyfpen[i]
+holds the actual penalty of a hyphen at position i, hyf_disc[i]
+contains a "special discretionary" for triple-consonant-hyphens and
+ck-hyphens. hc_si is the word as given to the SISISI algorithm;
+hyf_si is returned from SISISI and contains markers for the hyphens.
+
+After this change, there are many changes where `odd(hyf[i])' is
+simply replaced by `hyfpen[i]<>inf_penalty'.
+
+Another procedure to be changed is `reconstitute': It now has to handle
+special dicretionary nodes. For a detailed feeling about the code changes
+in reconstitute, either (1) look through it bit by bit, or (2) ask Heini
+Hofstaedter.
+
+@x
+ end
+ else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@y
+ end else if is_dirty_umlaut(s) then begin
+ if get_font_of(s)<>hf then goto done3;
+ c:=get_char_of(s);
+ if lc_code(c)=0 then goto done3;
+ if hn=63 then goto done3;
+ hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c);
+ dirty_umlaut[hn]:=s;
+ for jj:=1 to replace_count(s) do s:=link(s);
+ end else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ dirty_umlaut[-1]:=s;
+ end else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+Also in the conversion loop (where the node list is shuffled into the
+hc array), we must skip a "dirty umlaut".
+
+@x
+loop@+ begin if not(is_char_node(s)) then
+ case type(s) of
+ ligature_node: do_nothing;
+@y
+loop@+ begin
+if not(is_char_node(s)) then
+ if is_dirty_umlaut(s) then begin
+ for jj:=1 to replace_count(s)-1 do s:=link(s);
+ end else
+ case type(s) of
+ ligature_node: do_nothing;
+@z
+
+=========================================================================
+
+Well, there are a lot of new variables that are necessary for the new
+hyphenation. Most of them are necessary for Heini's change in the
+reconstitute function, where now discretionary nodes for hyphens with
+more than one character (e.g. the german ck-hyphens or
+three-consonant-hyphens) can be inserted.
+
+@x
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+@y
+@!hyfpen:array [0..64] of integer; {penalties for possible discretionary
+ hyphens}
+@!hyf_si:trennvektor;
+@!hc_si:wort;
+@!hyf_disc:array [0..64] of pointer;
+
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+
+@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|}
+@!add_char, {additional characters when hyphenating e.g.\
+ Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here
+ |add_char| = 1}
+@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| }
+@!spec_hyf: pointer; {special hyphen; causes different spelling of the
+ word, when it is hyphenated at this point}
+@!si_j:integer;
+@z
+
+=========================================================================
+
+An odd->inf_penalty change.
+
+@x
+for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1;
+@y
+for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1;
+@z
+
+=========================================================================
+
+The new variable hold_r is initialized (the kern node is a dummy node,
+as far as I can see).
+
+@x
+if not is_char_node(hb) then
+ if type(hb)=ligature_node then if odd(subtype(hb)) then
+@y
+hold_r := new_kern(1235); link(hold_r):=r;
+if not is_char_node(hb) then
+ if type(hb)=ligature_node then if odd(subtype(hb)) then
+@z
+
+=========================================================================
+
+Initialize some variables if the list starts with a "dirty umlaut".
+
+@x
+else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@y
+else if is_dirty_umlaut(ha) then begin
+ if get_font_of(ha) <> hf then goto found2
+ else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha);
+ end
+end else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+unhinge all "dirty umlauts".
+
+@x
+common_ending: flush_node_list(r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@y
+common_ending:
+qq:=hold_r;
+for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin
+ while link(qq) <> dirty_umlaut[kk] do qq := link(qq);
+ qr := link(qq);
+ for i:=1 to replace_count(qr) do
+ if qr<>null then qr:=link(qr)
+ else begin {test:}
+ si_put_ln('...??..X --> ????? !');
+ end; {:test}
+ if qr<>null then begin
+ link(qq):=link(qr); link(qr):=null;
+ end else link(qq):=null;
+end;
+if dirty_umlaut[-1]<>null then begin
+ qq:=hold_r;
+ while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq);
+ if link(qq)=dirty_umlaut[-1] then begin
+ link(qq):=link(dirty_umlaut[-1]);
+ link(dirty_umlaut[-1]):=null;
+ end else begin
+ si_put(' *** ERROR: node list is damaged! ');
+ si_put_ln('(post hyphenation - unhinge a whatsit node)');
+ end;
+end;
+{}
+r:=hold_r;
+while link(r)<>null do begin
+ if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r)
+ else begin
+ wlog_cr; wterm_cr;
+ wlog_ln('???$ - ERROR in node list!');
+ wterm_ln('???$ - ERROR in node list!');
+ kk:=depth_threshold; l:=breadth_max;
+ depth_threshold:=100; breadth_max:=100;
+ show_node_list(hold_r);
+ link(r):=null;
+ depth_threshold:=kk; breadth_max:=l;
+ end;
+end;
+{}
+flush_node_list(hold_r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@z
+
+------------------------------------------------------------------------
+
+Another odd->inf_penalty change (this time only textual).
+
+@x
+If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]|
+is odd and such that the result of |reconstitute| would have been different
+if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed|
+to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero.
+@y
+If there exists an index |k| in the range $j\le k\le m$ such that
+|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute|
+would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute|
+sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets
+|hyphen_passed| to zero.
+@z
+
+-------------------------------------------------------------------------
+
+In the reconstitute function, we set the boundary value n immediately
+before the next "dirty umlaut" by a simple for-loop starting at the
+original n.
+
+@x
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+@y
+@!ii:small_number;
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+for ii:=n downto j do
+ if dirty_umlaut[ii] <> null then n:=ii-1;
+@z
+
+-------------------------------------------------------------------------
+
+Another odd->inf_penalty change.
+
+@x
+ if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char;
+@y
+ if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char;
+@z
+
+=========================================================================
+
+A first change in the reconstitute function.
+
+@x
+ else begin if hchar<non_char then if odd(hyf[j]) then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@y
+ else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@z
+
+
+-------------------------------------------------------------------------
+
+Now we are in the post-hyphenation's main loop; here must append a
+"dirty umlaut" to the growing node list. This is simply done by an
+if-statement that checks for the presence of a "dirty umlaut" and
+appends it.
+
+Moreover, we have another textual odd->inf_penalty change.
+
+@x
+repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+if hyphen_passed=0 then
+ begin link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if odd(hyf[j-1]) then
+ begin l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q
+
+@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is
+odd, when both branches of the previous discretionary end at position |j-1|.
+@y
+if dirty_umlaut[-1]<>null then begin
+ {hook in the previous saved whatsit node before the first
+ character of the hyphenated word}
+ link(s):=dirty_umlaut[-1];
+ s:=link(s);
+end;
+repeat
+ if dirty_umlaut[j]<>null then begin
+ link(s):=dirty_umlaut[j];
+ while link(s)>null do s:=link(s);
+ link(hold_head):=null;
+ j:=j+1; hyphen_passed:=0;
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1;
+ si_debug(16)
+ si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!');
+ gubed_si;
+ end;
+ end else begin
+ l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+ if hyphen_passed=0 then begin
+ link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+ end; {if dirty_umlaut[j]<>null then-else}
+ if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q;
+si_q:=s; {save the last node of the hyphenated word for debugging output}
+for j:=0 to 64 do if hyf_disc[j]<>null then begin
+ flush_node_list( hyf_disc[j]);
+end
+
+@ In this repeat loop we will insert another discretionary if
+|hyfpen[j-1]<>inf_penalty|, when both branches of the previous
+discretionary end at position |j-1|.
+@z
+
+=========================================================================
+
+Another odd->inf_penalty change.
+
+@x
+hyphen_passed:=j-1; link(hold_head):=null;
+until not odd(hyf[j-1])
+@y
+hyphen_passed:=j-1; link(hold_head):=null;
+until (hyfpen[j-1]=inf_penalty)
+@z
+
+=========================================================================
+
+Here comes the big reconstitution action (cheers to Heini!).
+
+@x
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char);
+if hyf_node<>null then
+ begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+ end;
+while l<=i do
+ begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@y
+As the value of |hyfpen[i]| is necessary for creating a penalty node,
+we must create this node before we ``kill'' the hyphenation information in
+|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the
+pointer to the penalty node or |null|, if no such node has been created.
+
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty)
+ then minor_tail:=new_penalty(hyfpen[i])
+ else minor_tail:=null;
+hyfpen[i]:=inf_penalty;
+pre_break(r):=minor_tail;
+
+hyf_node:=new_character(hf,hyf_char);
+{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|}
+xchg_k:=i;
+if hyf_disc[xchg_k]<>null then begin
+ spec_hyf:=pre_break(hyf_disc[xchg_k]);
+ add_char:=subtype(spec_hyf);
+ xchg_i:=1;
+ repeat
+ spec_hyf:=link(spec_hyf);
+ if spec_hyf<>null then begin
+ xchg_char[xchg_i]:=qo(character(spec_hyf));
+ incr(xchg_i);
+ end;{if}
+ until spec_hyf=null;
+ if hyf_node<>null then begin
+ xchg_char[xchg_i]:=hyf_char;
+ free_avail(hyf_node);
+ end else decr(xchg_i);
+ xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first
+ character is replaced by a character of the
+ |pre_break|-list of |spec_hyf|}
+ for xchg_k:=1 to xchg_i do begin
+ xchg_char[0]:=hu[xchg_hu];
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ xchg_char[xchg_k]:=xchg_char[0];
+ incr(xchg_hu);
+ end; {|for|}
+ xchg_k:=i;
+ i:=xchg_hu-1;
+ xchg_hu:=xchg_hu-xchg_i;
+end {|if hyf_disc[]<>null|}
+else if hyf_node<>null then begin
+ incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+end;
+while l<=i do begin
+ l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@z
+
+-------------------------------------------------------------------------
+
+... continued:
+
+@x
+if hyf_node<>null then
+ begin hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@y
+ if hyf_disc[xchg_k]<>null then begin
+{ Restore the original word in |hu| }
+ i:=xchg_k; l:=i+1;
+ for xchg_k:=1 to xchg_i do begin
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ incr(xchg_hu);
+ end;{for}
+ end else if hyf_node<>null then begin
+ hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Finally, we come to the SISISI hyphenation. At first, we define two
+variables:
+
+@x
+@ Assuming that these auxiliary tables have been set up properly, the
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+
+@ Assuming that these auxiliary tables have been set up properly, the
+@z
+
+-------------------------------------------------------------------------
+
+And off we go; at first only slowly, ...
+
+@x
+@<Find hyphen locations for the word in |hc|...@>=
+@y
+{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!}
+
+
+@<Find hyphen locations for the word in |hc|...@>=
+@z
+
+-------------------------------------------------------------------------
+
+... but now we kill all of Liang's code and replace it by some re- and
+back-en- and decoding, a call to abteilen, and the construction of the
+special discretionaries. Then we go right into the SISISI hyphenation.
+=========================================================================
+@x
+if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|}
+hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters}
+for j:=0 to hn-r_hyf+1 do
+ begin z:=trie_link(cur_lang+1)+hc[j]; l:=j;
+ while hc[l]=qo(trie_char(z)) do
+ begin if trie_op(z)<>min_quarterword then
+ @<Store \(m)maximum values in the |hyf| table@>;
+ incr(l); z:=trie_link(z)+hc[l];
+ end;
+ end;
+found: for j:=0 to l_hyf-1 do hyf[j]:=0;
+for j:=0 to r_hyf-1 do hyf[hn-j]:=0
+
+@ @<Store \(m)maximum values in the |hyf| table@>=
+begin v:=trie_op(z);
+repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v];
+if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v];
+v:=hyf_next[v];
+until v=min_quarterword;
+end
+
+@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is
+@y
+ for j:=0 to hn do
+ hc_si[j] := ktab[hc[j]];
+ si_debug(2)
+ si_put(' hc:');
+ for j:=0 to hn do si_put( xchr[hc[j]] );
+ si_put_ln(':');
+ si_put(' hc_si:');
+ for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] );
+ si_put_ln(':');
+ gubed_si;
+ si_debug(4)
+ si_put_ln('< decimal character codes >');
+ si_put(' hc:');
+ for j:=0 to hn do begin
+ si_put(hc[j]:3,'-');
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr;
+ si_put(' hc_si:');
+ for j:=0 to hn do begin
+ si_put( rev_tab[hc_si[j]]:3,'-' );
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr; si_put_cr;
+ gubed_si;
+
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+ if funktioniert then
+ for j:=0 to hn do begin
+ if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty
+ else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty
+ else if hyf_si[j]=nebenck then begin
+ hyfpen[j+1] := neben_hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j+1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s);
+ subtype(s):=0; { number of additional characters }
+ link(s):=new_character(hf,hu[j+2]); {'k' oder'K'}
+ link(link(s)):=null;
+ s:=hyf_disc[j+1];
+ post_break(s):=null; link(s):=null;
+ end
+ else if hyf_si[j]=haupt3 then begin
+ hyfpen[j-1]:=hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j-1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s);
+ subtype(s):=1;
+ link(s):=new_character(hf,hu[j]); { Dreifachkonsonant }
+ link(link(s)):=null;
+ {|post_break|- und |link|-Liste: }
+ s:=hyf_disc[j-1];
+ post_break(s):=null;
+ link(s):=null;
+ end
+ end; {|if funktioniert|}
+ si_debug(8)
+ if funktioniert then begin
+ for j:=0 to hn do
+ if hyfpen[j]<>inf_penalty then begin
+ if hyf_disc[j]<>null then begin
+ if subtype(pre_break(hyf_disc[j]))=0 then
+ si_put( xchr[hu[j+1]], '-' )
+ else {if subty...}
+ si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' );
+ { i hope so }
+ end else begin
+ si_put( xchr[hu[j]] );
+ if hyfpen[j]=hyphen_penalty then
+ si_put('=')
+ else si_put('-');
+ end;
+ end else begin
+ si_put( xchr[hu[j]] );
+ end;
+ end else begin
+ si_put_ln(' no hyphens were found in this word!');
+ end;
+ si_put_cr;
+ gubed_si;
+ goto done1;
+
+found:
+hyfpen[0]:=inf_penalty;
+for j:=1 to hn do
+ if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty
+ else hyfpen[j]:=inf_penalty;
+
+done1:
+
+@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe
+dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort
+nach Trennstellen zu untersuchen und die gefundenen Trennstellen in
+hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen
+einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im
+INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT
+F\"UR PRAKTISCHE INFORMATIK.
+
+Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem
+Start von TeX aufgerufen werden.
+
+@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen|
+n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang
+ausgef\"uhrt werden sollen.
+
+@<Set initial values of ...@>=
+ inittrennen;
+
+@ @<Constants in the outer block@>=
+ maxwl = 64; { Maximale Wortlaenge }
+ sonderzeichen= 0;
+ bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7;
+ bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14;
+ bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21;
+ bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27;
+ bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31;
+ keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5;
+
+ tabsize = 8191; { 2**13 - 1 }
+ spec_letter_ID = 4321;
+ { const definitionen }
+ vok_a = 1;
+ vok_e = 2;
+ vok_i = 3;
+ vok_o = 4;
+ vok_u = 5;
+ vok_ae = 6;
+ vok_oe = 7;
+ vok_ue = 8;
+ vok_ie = 9;
+ vok_ai = 10;
+ vok_ei = 11;
+ vok_au = 12;
+ vok_aeu= 13;
+ vok_eu = 14;
+ vok_y = 15;
+ kons = 16;
+
+@
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+ rev_tab: array[0..255]of integer;
+
+
+@ Prozedurdefinitionen
+
+function dig_count( v: integer): integer;
+ { calculates the number of decimal digits of ``v'' }
+ var x, e, c: integer;
+begin
+ x := v div 10; e:=1; c:=1;
+ while e<=x do begin
+ e := e * 10; incr(c);
+ end;
+ dig_count:=c;
+end;
+
+@<Handling of dirty umlauts@>=
+
+procedure hashfunk (var w:wort; anfang,ende:integer;
+ var v:varr; var ind,k:intarr );
+
+ { -PRAK!- in C long statt integer }
+ var vacc, indacc, kacc : integer;
+ i : integer;
+begin
+ vacc := 31415; indacc := 152; kacc := 271;
+dbg_put_ln(' * HFNC =');
+ for i := anfang to ende do begin
+dbg_put(' * HFNC ',i-anfang:3,' A');
+ vacc := (vacc * 31 + w [i]) mod 8388648;
+dbg_put('B');
+ v[i] := vacc;
+dbg_put('C');
+ indacc := (indacc * 33 + w[i]) mod (tabsize+1);
+dbg_put('D');
+ ind[i] := indacc;
+dbg_put('E');
+ kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2);
+dbg_put('F');
+ k[i] := 2*kacc + 1;
+dbg_put_ln('G');
+ end; {|for|}
+end; {|hashfunk|}
+
+procedure unpackinfo ( b:infobyte;
+ { var i:infotype }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean );
+begin
+ { with i do begin }
+ if odd(b) then begin { 87654321 }
+ iausnahme:= true;
+ b:= b div 2; { 08765432 }
+ if odd(b) then iuntrennbar:= true
+ else iuntrennbar:= false;
+ b:=b div 2; { 00876543 }
+ ierste := b mod 8; { 00876xxx }
+ izweite := b div 8; { 00000876 }
+ end else begin
+ iausnahme:= false; { 87654321 }
+ b:= b div 2; { 08765432 }
+ if odd(b) then iendung:= true
+ else iendung:= false;
+ b:= b div 2; { 00876543 }
+ if odd(b) then ivorsilbe:= true
+ else ivorsilbe:= false;
+ b:= b div 2; { 00087654 }
+ if odd(b) then istamm:= true
+ else istamm:= false;
+ b:= b div 2; { 00008765 }
+ if odd(b) then iehervor:= true
+ else iehervor:= false;
+ b:= b div 2; { 00000876 }
+ if odd(b) then istammallein:= true
+ else istammallein:= false;
+ end; {|if-then-else|}
+ { end; |with|}
+end; {|unpackinfo|}
+
+
+procedure unpackentry( h:hashelement;
+ { var e:tableentry }
+ var etabv:verdschlue;
+ var etabb:infobyte;
+ var efrei:boolean;
+ var ewiederfrei:boolean );
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' ==> UPCKNTY 1');
+ etabv:= h[0]+h[1]*256+h[2]*256*256;
+dbg_put(' 2');
+ if odd(h[3]) then begin { Ausnahme }
+dbg_put(' 3 A');
+ etabb:= h[3];
+dbg_put('1');
+ efrei:= false;
+ ewiederfrei:= false;
+ end
+ else begin
+dbg_put(' 3 B');
+ etabb:= h[3] mod 64;
+dbg_put('1');
+ { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher
+ nicht ver„ndert werden. }
+dbg_put('2');
+ { durch folgende 2 Abfragen ersetzt. -PRAK!- }
+ if odd(h[3] div 64) then efrei := true
+ else efrei := false;
+ if odd(h[3] div 128) then ewiederfrei := true
+ else ewiederfrei := false;
+ end;
+dbg_put_ln('- 4');
+ { end; |with|}
+end; {|unpackentry|}
+
+
+procedure hashsuch ( v:verdschlue;
+ ind,k : integer;
+ { var i:infotype; }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean;
+ var g:boolean );
+
+{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden }
+ var
+ gef,ngef:boolean;
+ j:integer;
+ entry : tableentry;
+
+begin
+ gef := false; ngef := false; j := ind;
+ repeat
+ unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+ if entry.frei then ngef := true
+ else if (v = entry.tabv) and not entry.wiederfrei then begin
+ unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite,
+ iendung,ivorsilbe,istamm,iehervor,istammallein);
+ gef := true;
+ end else
+ j := (j+k) mod (tabsize + 1)
+ until gef or ngef;
+ g := gef;
+end; {|hashsuch|}
+
+
+procedure hashload ( var status:integer );
+{ einlesen der Hash-Tabelle von file fn }
+ var i : integer;
+ e : tableentry;
+begin
+ { Orginal sitex3.cha -PRAK!-
+ for i:=1 to file_name_size do name_of_file:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ if a_open_in(hashfile) then begin
+ }
+
+ { geaendert !! -PRAK!- }
+ for i:=1 to file_name_size do name_of_file[i]:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ { -PRAK!- texinputpath fr C notwendig }
+ if a_open_in(hashfile, TEX_INPUT_PATH) then begin
+ for i := 0 to tabsize do begin
+ { -PRAK!- in C Probleme mit den typen beim einlesen }
+ read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of }
+ read (hashfile, htab[i][1]); { hashelement, und }
+ read (hashfile, htab[i][2]); { hashelement = packed array 0..3 }
+ read (hashfile, htab[i][3]);
+ unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei);
+ if not e.frei and not e.wiederfrei then anzahl := anzahl + 1;
+ end; {|for|}
+ status:= 0;
+ a_close(hashfile);
+ end else status:= 1;
+end; {|hashload|}
+
+
+procedure inittrennen;
+ var ch: 0..255;
+ bst: buchstabe;
+ i, status: integer;
+ is_iniTeX: boolean;
+begin
+ { Konversionstabelle |ktab| initialisieren }
+ { ======================================== }
+
+ for ch := 0 to 255 do begin
+
+ { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then }
+
+ case ch of
+ " ",",",";",":","-","/","?","!","(",")",".","""","'","^":
+
+ if ch="." then ktab[ch]:= "."
+ else ktab[ch] := trennzeichen
+ { else ktab[ch] := sonderzeichen geht nicht !!}
+ end; { case }
+
+if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen;
+
+ end; { for }
+ for bst := bst_a to bst_z do begin
+ ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst;
+ ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst
+ end;
+
+ { Umlaute und scharfes s - f\"ur ``production \TeX version'' }
+ ktab[255]:=bst_sz;
+ ktab[246]:=bst_oe;
+ ktab[252]:=bst_ue;
+ ktab[228]:=bst_ae;
+
+ { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' }
+ ktab["1"]:=bst_sz;
+ ktab["2"]:=bst_ue;
+ ktab["3"]:=bst_oe;
+ ktab["4"]:=bst_ae;
+ ktab[25]:=bst_sz; {?-wieso? HH}
+
+{testing:}
+for i:=0 to 255 do rev_tab[ktab[i]]:=i;
+rev_tab[ktab[255]]:=223;
+xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246);
+xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223);
+{:end of testing}
+
+ { Kombinationstabelle |kombtab| initialisieren }
+ { ============================================ }
+ { Diese Tabelle muss symetrisch sein,
+ kombtab[a,b] = kombtab[b,a] }
+ kombtab[ keine, keine] := keine;
+ kombtab[ keine, neben] := keine;
+ kombtab[ keine,nebenck] := keine;
+ kombtab[ keine, haupt] := keine;
+ kombtab[ keine, haupt3] := keine;
+
+ kombtab[ neben, keine] := keine;
+ kombtab[ neben, neben] := neben;
+ kombtab[ neben,nebenck] := keine;
+ kombtab[ neben, haupt] := neben;
+ kombtab[ neben, haupt3] := keine;
+
+ kombtab[nebenck, keine] := keine;
+ kombtab[nebenck, neben] := keine;
+ kombtab[nebenck,nebenck] := nebenck;
+ kombtab[nebenck, haupt] := keine;
+ kombtab[nebenck, haupt3] := keine;
+
+ kombtab[ haupt, keine] := keine;
+ kombtab[ haupt, neben] := neben;
+ kombtab[ haupt,nebenck] := keine;
+ kombtab[ haupt, haupt] := haupt;
+ kombtab[ haupt, haupt3] := keine;
+
+ kombtab[ haupt3, keine] := keine;
+ kombtab[ haupt3, neben] := keine;
+ kombtab[ haupt3,nebenck] := keine;
+ kombtab[ haupt3, haupt] := keine;
+ kombtab[ haupt3, haupt3] := haupt3;
+
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+
+{ ================== Hashtabelle |htab| initialisieren ======================
+
+Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf
+keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob
+dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig
+davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf
+(production-version) von \TeX ist.
+
+=============================================================================}
+ is_iniTeX:=false;
+ init is_iniTeX:=true; tini
+ if not is_iniTeX then begin
+ hashload(status);
+ if status <> 0 then begin
+ si_put_cr;
+ si_put_ln
+(' * * * * * * * * * *!');
+ si_put_ln('**** ERROR: Can not read hash-file!');
+ si_put_cr;
+ jump_out;
+ end;
+ end; {|not iniTeX|}
+end; {|inittrennen|}
+
+
+procedure packinfo ( i:infotype; var b : infobyte );
+{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ }
+{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / }
+
+begin
+ b:=0;
+dbg_put_cr;
+ { with i do begin }
+ if i.ausnahme then
+begin
+dbg_put(' ### PCKINF 1A utr:');
+if i.untrennbar then dbg_put('Y') else dbg_put('N');
+dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3);
+ b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite
+; dbg_put('B');
+end
+ else
+begin
+dbg_put(' ### PCKINF 2A');
+ b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor)
+ +32*ord(i.stammallein);
+dbg_put('B');
+end;
+ { end; with }
+dbg_put_ln('-3');
+end; {|packinfo|}
+
+procedure packentry( e:tableentry; var h:hashelement );
+{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ }
+
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' +++ PCKNTY A');
+ h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx}
+dbg_put('B');
+ e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh}
+dbg_put('C');
+ h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx}
+dbg_put('D');
+ h[2]:= e.tabv div 256; { 000000000000000087654321}
+
+dbg_put('E');
+ if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! }
+ else
+begin
+dbg_put('F1');
+ h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx }
+dbg_put('-2');
+end;
+dbg_put_ln('G');
+ { end; |with|}
+end; {|packentry|}
+
+
+
+procedure hashetr ( var w:wort; laenge:integer; i:infotype;
+ var g:boolean );
+
+ var v1: varr;
+ ind1, k1: intarr;
+ v: verdschlue;
+ ind, k, j, e: integer;
+ gef,ngef:boolean;
+ entry: tableentry;
+ helem: hashelement;
+
+begin
+dbg_put_ln(' ** HTR 1');
+ if anzahl >= tabsize then begin
+dbg_put_ln(' ** HTR 2a');
+ g := false;
+ end
+ else begin
+dbg_put_ln(' ** HTR 2b');
+ if (anzahl < 10) or (anzahl mod 100 = 0) then begin
+ si_put_cr; si_put(' -Anzahl:',anzahl,'. ');
+ end;
+dbg_put_ln(' ** HTR 3');
+ hashfunk(w,1,laenge,v1,ind1,k1);
+dbg_put_ln(' ** HTR 4');
+ v := v1[laenge];
+ ind := ind1[laenge];
+ k := k1[laenge];
+ gef := false; ngef := false;
+ repeat
+dbg_put_ln(' ** HTR 5 A');
+ unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+dbg_put_ln(' ** HTR B');
+ if entry.frei or entry.wiederfrei then begin
+ anzahl := anzahl + 1;
+ ngef := true;
+ entry.tabv := v;
+dbg_put_ln(' ** HTR C1');
+ packinfo (i,entry.tabb);
+dbg_put_ln(' ** HTR D1');
+ entry.frei := false;
+ entry.wiederfrei := false;
+dbg_put_ln(' ** HTR E1');
+ packentry(entry,helem);
+dbg_put_ln(' ** HTR F1');
+ htab[ind] := helem; { -PRAK!- in C memcpy() }
+ end else begin
+dbg_put_ln(' ** HTR C2');
+ gef := v = entry.tabv;
+ if not gef then ind := (ind+k) mod (tabsize + 1);
+dbg_put_ln(' ** HTR D2');
+ end;
+ until gef or ngef;
+dbg_put_ln(' ** HTR 6');
+ g := ngef;
+ end
+end; {|hashetr|}
+
+procedure hashempty;
+ var i:integer;
+ elem : tableentry;
+ he : hashelement;
+begin
+ { with elem do begin }
+ elem.tabv:=0;
+ elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen.
+ ( Und dies ist eine Beleidigung fuer jeden Affen ) HM }
+ elem.frei := true;
+ elem.wiederfrei := false;
+ { end; }
+ packentry (elem, he);
+ for i := 0 to tabsize do htab[i] := he; { -PRAK!- in C memcpy() }
+ anzahl := 0;
+end; {|hashempty|}
+
+procedure hashsave (var status:integer);
+{ abspeichern der Hash-Tabelle auf file }
+ var i: integer;
+begin
+ for i:=1 to file_name_size do name_of_file[i]:=' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length:=3;
+ if a_open_out(hashfile) then begin
+ for i := 0 to tabsize do begin
+ write (hashfile, htab[i][0]:4);
+ write (hashfile, htab[i][1]:4);
+ write (hashfile, htab[i][2]:4);
+ write (hashfile, htab[i][3]:4);
+ write_ln (hashfile);
+ end;
+ status:=0;
+ a_close(hashfile);
+ end else status:=1;
+end; {|hashsave|}
+
+
+function hashsize :integer;
+begin
+ hashsize:=anzahl;
+end;
+
+
+procedure zahl(line:string80;var i:integer; ende:integer; var j:integer);
+ var aus: boolean;
+begin
+ j:=0;
+ repeat
+ if i<=ende then
+ if ktab[line[i]]="." then i:=i+1
+ else aus:=true
+ else aus:=true
+ until aus;
+ repeat
+ if i<=ende then begin
+ { if line[i] in ["0".."9"] then begin }
+ case line[i] of
+ "0","1","2","3","4","5","6","7","8","9":
+ begin j:=10*j+line[i]-"0";i:=i+1
+ end;
+ { else aus:=true geht nicht !!! }
+ end;
+ if (line[i] <> "0") and
+ (line[i] <> "1") and
+ (line[i] <> "2") and
+ (line[i] <> "3") and
+ (line[i] <> "4") and
+ (line[i] <> "5") and
+ (line[i] <> "6") and
+ (line[i] <> "7") and
+ (line[i] <> "8") and
+ (line[i] <> "9") then aus :=true;
+ end else aus:=true
+ until aus;
+end; {|zahl|}
+
+
+procedure infobau(line: string80; anfang,ende: integer;
+ { var inform: infotype;}
+ var informausnahme :boolean;
+ var informuntrennbar :boolean;
+ var informerste :integer;
+ var informzweite :integer;
+ var informendung :boolean;
+ var informvorsilbe :boolean;
+ var informstamm :boolean;
+ var informehervor :boolean;
+ var informstammallein:boolean;
+ var g: boolean);
+
+ var i,j:integer;ok,fehler:boolean;
+ b:buchstabe;
+begin
+ g:=false;
+ { with inform do begin } { initialisierung }
+ informausnahme:=false;
+ informendung:=false;
+ informvorsilbe:=false;
+ informehervor:=false;
+ informstamm:=false;
+ informstammallein:=false;
+ i:=anfang; ok:=false; fehler:=false;
+ repeat
+ if i<=ende then
+ if line[i]="." then i:=i+1 else ok:=true
+ else fehler:=true
+ until ok or fehler;
+ if not fehler then begin
+ b:=ktab[line[i]];
+ if b = bst_a then begin
+ {ausnahme}
+ informausnahme:=true;
+ i:=i+1;
+ if ktab[line[i]] = bst_u then begin
+ i := i + 1; informuntrennbar := true;
+ end else informuntrennbar := false;
+ zahl(line,i,ende,j);
+ if j=0 then begin
+ informerste:=7; informzweite:=7;
+ { Record-komponente ``zweite'' wird }
+ { initialisiert, damit beim packen keine }
+ { undefinierten Ergebnisse entstehen (die u.U. zu }
+ { RUN-TIME-ERRORS f\"uhren k\"onnen!) }
+ end else begin
+ j:=j-2;
+ if (j>=0) and (j<=6) then informerste:=j
+ else fehler:=true;
+ zahl(line,i,ende,j);
+ if j=0 then informzweite:=7
+ else begin
+ j:=j-informerste-4;
+ if (j>=0) and (j<=6) then informzweite:=j
+ else fehler:=true;
+ end;
+ end;
+ if not fehler then g:=true;
+ end {|if b = bst_a |}
+ else begin
+ ok:=false;
+ repeat
+ case b of
+ {bst_v} 22: informvorsilbe:=true;
+ {bst_e} 5: informendung:=true;
+ {bst_s} 19: informstamm:=true;
+ {bst_b} 2: informehervor:=true;
+ {bst_t} 20: informstammallein:=true;
+ {trennzeichen} 31:;
+ othercases fehler:=true
+ endcases;
+ if i=ende then ok:=true
+ else begin
+ i:=i+1;
+ b:=ktab[line[i]]
+ end
+ until ok or fehler;
+ if not fehler then
+ g := (informvorsilbe or informendung or informstamm)
+ and (not informehervor or informvorsilbe and informendung)
+ and (not informstammallein or informstamm);
+ end; {|if b = bst_a then-else|}
+ end {|if not fehler|}
+ { end |with inform|}
+end; {|infobau|}
+
+
+procedure eintragen (line: string80; l: integer );
+ var i, laenge: integer;
+ inform: infotype;
+ w: wort;
+ g: boolean;
+begin
+ laenge := 1;
+ while line [laenge] <> "." do laenge := laenge + 1;
+ laenge := laenge -1;
+ if laenge >= 1 then begin
+ if laenge <= maxwl then begin
+ infobau(line,laenge+1,l,
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,g);
+
+ if not g then begin
+ si_put_cr; si_put(' Info falsch: ')
+ end else begin
+ for i:= 1 to laenge do w[i]:=ktab[line[i]];
+ hashetr(w,laenge,inform,g);
+ if not g then begin
+ si_put_cr; si_put(' Tabellenfehler: ');
+ end;
+ end;
+ if not g then begin
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge <= maxwl|}
+ else begin
+ si_put_cr; si_put_ln(' zu langes Wort: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge >= 1|}
+ else begin
+ si_put_cr; si_put_ln(' Falsche Zeile: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+end; {|eintragen|}
+
+{---------------------------------------------------------------------------}
+
+{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) }
+
+procedure naechsterbst(var i:integer;var tr:trennvektor;
+ var dudstop:sperrvektor;var b:buchstabe;
+ var w:wort);
+ begin
+ if (i>0) and (tr[i]=keine) and not dudstop[i]
+ then begin b:=w[i];i:=i-1 end
+ else b:=trennzeichen
+ end;
+{---------------------------------------------------------------------------}
+{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) }
+
+ procedure duden (tr:trennvektor;
+ var w:wort;
+ var tr1 :trennvektor;
+ var dudtr:trennvektor;
+ dud :dudt; { array [0..maxwl] of boolean; }
+ var dudstop:sperrvektor;
+ laenge : integer;
+ var ok :boolean;
+ var zerlegungen:integer );
+
+ { traegt in dudtr die Trennstellen nach Dudenregeln ein }
+
+ { frueher mtype laut = (.....) }
+
+ var i:integer;
+ j:integer;
+ zust:integer;
+ aus:boolean;
+ tre:integer;
+ letzte:integer;
+ l,lalt:integer;{ vormals laut }
+ b:buchstabe;
+
+
+ begin { duden }
+ i:=laenge;
+ for j := 0 to laenge do dudtr[j] := tr[j];
+ while (i>0) and not dud [i] do i:=i-1;
+ while i>0 do begin
+ zust:=1; aus:=false; letzte := 0;
+ l:=kons;
+ b:=w[i];
+ i:=i-1;
+ repeat
+ {naechsten Laut lesen}
+ { procedure nlaut; }
+ begin { nlaut }
+ tre:=i+1;
+ lalt:=l;
+ case b of
+ {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_e } 5:begin
+ l:=vok_e; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_i then begin
+ l:=vok_ie;
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin
+ {ungetbst = } i := i + 1;
+ l:=vok_e;
+ b := bst_i;
+ end;
+ end
+ end;
+ {bst_i} 9:begin
+ l:=vok_i; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_u} 21:begin
+ l:=vok_u; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_t} 20:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_h} 8:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_c then begin
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end
+ else if b = bst_p then naechsterbst(i,tr,dudstop,b,w)
+ else if b = bst_t then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m,
+ bst_n, bst_p,
+ bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz }
+
+ 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 :
+
+ begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_y} 25:begin
+ l:=vok_y;
+ naechsterbst(i,tr,dudstop,b,w);
+ end;
+ {trennzeichen,sonderzeichen}
+ 31,0 :aus:=true
+ end;
+ end; { nlaut }
+
+ if not aus then
+ {Naechster Zustand}
+ case zust of
+ 1:if l=kons then zust:=2
+ else zust:=4;
+ 2:if l<>kons then zust:=3;
+ 3:if l=kons then zust:=6
+ else if l<>lalt then begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end;
+ 4:if l=kons then zust:=6
+ else zust:=3;
+ 6:if l=kons then begin
+ zust:=2;
+ letzte:=tre;
+ if (w[tre]=bst_c) and (w[tre+1] = bst_k) then
+ dudtr[letzte]:=nebenck
+ else dudtr[letzte]:=neben
+ end
+ else begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end
+ end
+ until aus;
+ if zust=2 then dudtr[letzte]:=keine
+ else if zust=4 then
+ { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then }
+ if (lalt < vok_ie) or (lalt > vok_eu) then
+ dudtr[letzte]:=keine;
+ while (i>0) and not dud[i] do i:=i-1
+ end;
+ end { duden };
+{---------------------------------------------------------------------------}
+{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor;
+ var ok1 : boolean);
+}
+
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+
+ { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen,
+ rechts muss noch ein Stamm kommen.
+ 2 ... Es kann Endung, Vorsilbe oder Stamm kommen.
+ 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden,
+ rechts muss noch ein Stamm kommen.
+ 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden.
+ 5 ... Trennstelle mit entfallenem Konsonanten }
+
+ var
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+
+ { procedure p_endung(var endok:boolean); }
+
+ { procedure p_vorsilbe(var vorok:boolean); }
+
+ { procedure p_stamm(var stok:boolean); }
+
+ { procedure p_stammallein (var staok:boolean); }
+
+ begin { trennen }
+ spvtmp := spv;
+ ok1:=false;
+ if anfang = laenge + 1
+ then { Ende des Wortes erreicht}
+ if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten }
+ begin
+ dud[anfang-1]:=true;
+
+ {duden(tr);}
+ duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen);
+
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+ end
+ else { kein Stamm im Wortrest ok1 = false }
+ else { restlichen Teil zerschneiden }
+ begin
+ hashfunk (w,anfang,laenge,v,ind,k);
+ schnitt := laenge;
+ nichtok := false;
+ repeat
+ { links abschneiden }
+ repeat
+ if spv[schnitt] then { Schnittstelle gesperrt }
+ gef:=false
+ else
+ begin
+ hashsuch (v[schnitt],ind[schnitt],k[schnitt],
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,gef);
+ end;
+ if gef then
+ spv[schnitt]:=true
+ else
+ schnitt := schnitt - 1
+ until gef or (schnitt = anfang - 1);
+
+ if gef then { teilwortanfang ist bekanntes wort }
+ begin
+ if not inform.ausnahme then
+ begin
+ if inform.endung and (zustand=2) then
+ begin
+
+ { --- p_endung(ok_end); --- }
+ ok_end:=false;
+ if (w[anfang]=bst_c) or (w[anfang]=bst_h) then
+ begin
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=neben
+ end;
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv[schnitt+1]:=true;
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_help
+ end;
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_end or ok_help;
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_endung(ok_end) - ende --- }
+
+ ok1 := ok1 or ok_end
+ end
+ else
+ ok_end:=false;
+ if inform.vorsilbe
+ then begin
+
+ { --- p_vorsilbe(ok_vor); --- }
+ { Trennstelle(n) vor der Vorsilbe eintragen }
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt;
+ end;
+ { Trennstellen innerhalb der Vorsilbe eintragen }
+ dud[schnitt]:=true;
+ { Rest des Wortes zerschneiden }
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ dud[schnitt]:=false;
+ { --- p_vorsilbe(ok_vor) - ende --- }
+
+ ok1 := ok1 or ok_vor
+ end
+ else
+ ok_vor := false;
+ if inform.stamm and not ok_vor
+ then begin
+ if not inform.stammallein
+ then begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true
+ end
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end
+ else
+ if (anfang=1) and (schnitt=laenge)
+ then begin
+
+ { --- p_stammallein(ok_stamm); --- }
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=haupt;
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_stammallein(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+ end
+ end
+ else begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true;
+ end;
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+
+ {naechsten Schleifendurchlauf vorbereiten}
+ schnitt := schnitt - 1;
+ nichtok := schnitt = anfang - 1
+ end
+ else { kein bekanntes Wort am Beginn des Teilwortes }
+ nichtok := true;
+
+ until nichtok
+ end;
+ spv := spvtmp; { spv wiederherstellen, fr die C Version. -PRAK!- }
+ end { trennen };
+
+{----------------------------------------------------------------------------}
+
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+
+ label 99;
+
+ { kommt in den outer Block }
+ { mtype sperrvektor=array [0..maxwl] of boolean; }
+
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+
+ begin { abteilen }
+ tr1[0] := keine;
+ for i:=0 to laenge do begin
+ tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false;
+ if i > 0 then
+ if (w[i] = trennzeichen) or (w[i] = sonderzeichen)
+ then begin
+ zerlegungen := 0;
+ ok := false;
+ goto 99;
+ end;
+ end;
+ zerlegungen:=0;
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+99:
+ end;{ abteilen }
+{----------------------------------------------------------------------------}
+
+ {identification number for dirty umlauts; see description in
+ change file}
+
+ function is_dirty_umlaut(p:pointer):boolean;
+ var res:boolean;
+ q:pointer;
+ begin
+ res:=false;
+ if p<>null then
+ if type(p)=disc_node then
+ if pre_break(p)<>null then
+ if link(pre_break(p))<>null then
+ if link(link(pre_break(p)))<>null then begin
+ q:=pre_break(p);
+ if type(q)=penalty_node then q:=link(q);
+ if (type(q)=kern_node)and(width(q)=spec_letter_ID)and
+ is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true;
+ end;
+ is_dirty_umlaut:=res;
+ end; {|is_dirty_umlaut|}
+
+ function get_char_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_char_of:=width(link(link(q)));
+ end; {|get_char_of|}
+
+ function get_font_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_font_of:=font(link(q));
+ end; {|get_font_of|}
+
+{----------------------------------------------------------------------------}
+
+@ Ende ...
+@z
+
+=========================================================================
+
+@x
+@ Now let's go back to the easier problem, of building the linked
+trie. When \.{INITEX} has scanned the `\.{\\patterns}' control
+sequence, it calls on |new_patterns| to do the right thing.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+label done, done1;
+var k,@!l:small_number; {indices into |hc| and |hyf|}
+@!digit_sensed:boolean; {should the next digit be treated as a letter?}
+@!v:quarterword; {trie op code}
+@!p,@!q:trie_pointer; {nodes of trie traversed during insertion}
+@!first_child:boolean; {is |p=trie_l[q]|?}
+@!c:ASCII_code; {character being inserted}
+begin if trie_not_ready then
+ begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+ @<Enter all of the patterns into a linked trie, until coming to a right
+ brace@>;
+ end
+else begin print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@y
+@ We do not build a trie (wether a linked nor a packed). Instead, we
+create a hash table for the \SISISI-hyphenation algorithm. But we
+still use the data provided by the `\.{\\patterns}' primitive.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+ label done;
+ var k: small_number; {index into |zeile|}
+ @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle }
+ @!status:integer;
+ @!c:ASCII_code; {character being inserted}
+begin
+ if trie_not_ready then begin
+ set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+
+ hashempty; { create the empty hash table }
+ @<Enter all of the patterns into a hash table, until coming to a right
+ brace; then skip an optional space@>;
+ hashsave(status);
+ if status<>0 then begin
+ wterm_ln('Fehler bei hash save !!!!!'{?});
+ wlog_ln( 'Fehler bei hash save !!!!!'{?});
+ end;
+ end else begin
+ print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@z
+
+
+--------------------------------------------------------------------------
+
+
+@x
+@ Novices are not supposed to be using \.{\\patterns}, so the error
+messages are terse. (Note that all error messages appear in \TeX's string
+pool, even if they are used only by \.{INITEX}.)
+
+@<Enter all of the patterns into a linked trie...@>=
+k:=0; hyf[0]:=0; digit_sensed:=false;
+loop@+ begin get_x_token;
+ case cur_cmd of
+ letter,other_char:@<Append a new letter or a hyphen level@>;
+ spacer,right_brace: begin if k>0 then
+ @<Insert a new pattern into the linked trie@>;
+ if cur_cmd=right_brace then goto done;
+ k:=0; hyf[0]:=0; digit_sensed:=false;
+ end;
+ othercases begin print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end
+ endcases;
+ end;
+done:
+@y
+@ Here we build the hash table for the \SISISI-hyphenation.
+
+@<Enter all of the patterns into a hash table, until coming to a right...@>=
+for k:=0 to maxwl do zeile[k]:=" ";
+k:=0;
+loop@+ begin
+ get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'.
+ Der Beistrich wird eigens abgefragt, da er in TeX
+ umdefiniert werden kann. }
+ if (cur_cmd = right_brace)or(cur_chr = ",") then
+ begin
+ { Ein Eintrag der Worttabelle - letzter
+ (|cur_cmd|=|right_brace|) - gelesen }
+ if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden }
+ if cur_cmd = right_brace then goto done;
+ k := 0; { hyf[] ist \"uberfl\"ussig, da die
+ Trenninformation in zeile mitverpackt ist. }
+ end
+ else { Das Wort ist noch nicht fertig gelesen }
+ if (cur_cmd = letter) or (cur_cmd = other_char)
+ or (cur_cmd = spacer) or (cur_chr = ".")
+ then begin
+ @<Append a new letter or a hyphen level@>;
+ end else begin
+ print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end;
+end; {|loop|}
+done:
+@z
+
+-----------------------------------------------------------------------------
+
+
+@x
+@ @<Append a new letter or a hyphen level@>=
+if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then
+ begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter}
+ else begin cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then
+ begin print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error;
+ end;
+ end;
+ if k<63 then
+ begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false;
+ end;
+ end
+else if k<63 then
+ begin hyf[k]:=cur_chr-"0"; digit_sensed:=true;
+ end
+@y
+@ @<Append a new letter or a hyphen level@>=
+if (cur_chr<>" ")then begin
+ { Das Leerzeichen wird \"uberlesen! }
+ if (cur_chr <> ".") then begin
+ { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten }
+ if (cur_chr<"0")or(cur_chr>"9") then begin
+ cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then begin
+ print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error; cur_chr:=128;
+ end;
+ end;
+ end;
+ if k<63 then begin
+ incr(k); zeile[k]:=cur_chr;
+ end;
+end;
+@z
+
+----------------------------------------------------------------------------
+
+
+@x
+@ When the following code comes into play, the pattern $p_1\ldots p_k$
+appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots
+n_k$ appears in |hyf[0..k]|.
+
+@<Insert a new pattern into the linked trie@>=
+begin @<Compute the trie op code, |v|, and set |l:=0|@>;
+q:=0; hc[0]:=cur_lang;
+while l<=k do
+ begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true;
+ while (p>0)and(c>so(trie_c[p])) do
+ begin q:=p; p:=trie_r[q]; first_child:=false;
+ end;
+ if (p=0)or(c<so(trie_c[p])) then
+ @<Insert a new trie node between |q| and |p|, and
+ make |p| point to it@>;
+ q:=p; {now node |q| represents $p_1\ldots p_l$}
+ end;
+if trie_o[q]<>min_quarterword then
+ begin print_err("Duplicate pattern");
+@.Duplicate pattern@>
+ help1("(See Appendix H.)"); error;
+ end;
+trie_o[q]:=v;
+end
+@y
+@ Well, that was everything about the initialization of the \SISISI hash
+table (at this place).
+
+All following sections, describing the initialization of the trie are
+replaced by ``empty sections'' in order to have same section numbering
+in SI\TeX as in \TeX.
+@z
+
+----------------------------------------------------------------------------
+
+@x
+@ @<Insert a new trie node between |q| and |p|...@>=
+begin if trie_ptr=trie_size then overflow("pattern memory",trie_size);
+@:TeX capacity exceeded pattern memory}{\quad pattern memory@>
+incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0;
+if first_child then trie_l[q]:=p@+else trie_r[q]:=p;
+trie_c[p]:=si(c); trie_o[p]:=min_quarterword;
+end
+@y
+@ ``Empty section''.
+@z
+------------------------------------------------------------------------------
+@x
+@ @<Compute the trie op code, |v|...@>=
+if hc[1]=0 then hyf[0]:=0;
+if hc[k]=0 then hyf[k]:=0;
+l:=k; v:=min_quarterword;
+loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v);
+ if l>0 then decr(l)@+else goto done1;
+ end;
+done1:
+@y
+@ Further ``empty section''.
+@z
+
+@x
+@ Finally we put everything together: Here is how the trie gets to its
+final, efficient form.
+The following packing routine is rigged so that the root of the linked
+tree gets mapped into location 1 of |trie|, as required by the hyphenation
+algorithm. This happens because the first call of |first_fit| will
+``take'' location~1.
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+var @!p:trie_pointer; {pointer for initialization}
+@!j,@!k,@!t:integer; {all-purpose registers for initialization}
+@!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+@!h:two_halves; {template used to zero out |trie|'s holes}
+begin @<Get ready to compress the trie@>;
+if trie_root<>0 then
+ begin first_fit(trie_root); trie_pack(trie_root);
+ end;
+@y
+@ Because we do not use the trie, we fill it with dummy data.
+But the main reason, why we do not remove this procedure is, that
+it is called and the used variables are referenced somewhere in \TeX.
+
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+ var @!p:trie_pointer; {pointer for initialization}
+ @!j,@!k,@!t:integer; {all-purpose registers for initialization}
+ @!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+begin
+ trie_root:=0;
+@z
+
+=========================================================================
+
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch
new file mode 100644
index 0000000000..4c0e00a9da
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch
@@ -0,0 +1,687 @@
+% tangle.ch for C compilation with web2c.
+% The original version of this file was created by Howard Trickey and
+% Pavel Curtis.
+%
+% History:
+%
+% (more recent changes in ../ChangeLog.W2C)
+%
+% 10/9/82 (HT) Original version
+% 11/29 (HT) New version, with conversion to lowercase handled properly
+% Also, new control sequence:
+% @=...text...@> Put ...text... verbatim on a line
+% by itself in the Pascal output.
+% (argument must fit on one line)
+% This control sequence facilitates putting #include "gcons.h"
+% (for example) in files meant for the pc compiler.
+% Also, changed command line usage, so that the absence of a
+% change file implies no change file, rather than one with the
+% same name as the web file, with .ch at the end.
+% 1/15/83 (HT) Changed to work with version 1.2, which incorporates the
+% above change (though unbundling the output line breaking),
+% so mainly had to remove stuff.
+% 2/17 (HT) Fixed bug that caused 0-9 in identifiers to be converted to
+% Q-Y on output.
+% 3/18 (HT) Brought up to work with Version 1.5. Added -r command line
+% flag to cause a .rpl file to be written with all the lines
+% of the .web file that were replaced because of the .ch file
+% (useful for comparing with previous .rpl files, to see if a
+% change file will still work with a new version of a .web file)
+% Also, made it write a newline just before exit.
+% 4/12 (PC) Merged with Pavel's version, including adding a call to exit()
+% at the end depending upon the value of history.
+% 4/16 (PC) Brought up to date with version 1.5 released April, 1983.
+% 6/28 (HWT) Brought up to date with version 1.7 released June, 1983.
+% With new change file format, the -r option is now unnecessary.
+% 7/17 (HWT) Brought up to date with version 2.0 released July, 1983.
+% 12/18/83 (ETM) Brought up to date with version 2.5 released November, 1983.
+% 11/07/84 (ETM) Brought up to date with version 2.6.
+% 12/15/85 (ETM) Brought up to date with version 2.8.
+% 03/07/88 (ETM) Converted for use with WEB2C
+% 01/02/89 (PAM) Cosmetic upgrade to version 2.9
+% 11/30/89 (KB) Version 4.
+% (more recent changes in ../ChangeLog.W2C)
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print only changes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+\pageno=\contentspagenumber \advance\pageno by 1
+@y
+\pageno=\contentspagenumber \advance\pageno by 1
+\let\maybe=\iffalse
+\def\title{TANGLE changes for C}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1] Change banner message
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TANGLE, Version 4.2'
+@y
+@d banner=='This is TANGLE, C Version 4.2'
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2] add input and output, remove other files, add ref to scan_args,
+% and #include external definition for exit().
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d end_of_TANGLE = 9999 {go here to wrap it up}
+
+@p @t\4@>@<Compiler directives@>@/
+program TANGLE(@!web_file,@!change_file,@!Pascal_file,@!pool);
+label end_of_TANGLE; {go here to finish}
+const @<Constants in the outer block@>@/
+type @<Types in the outer block@>@/
+var @<Globals in the outer block@>@/
+@<Error handling procedures@>@/
+@y
+@d end_of_TANGLE = 9999 {go here to wrap it up}
+
+@p program TANGLE;
+label end_of_TANGLE; {go here to finish}
+const @<Constants in the outer block@>@/
+type @<Types in the outer block@>@/
+var @<Globals in the outer block@>@/
+@<Error handling procedures@>@/
+@<Declaration of |scan_args|@>@/
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4] compiler options
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@=(*$C-*)@> {no range check}
+@!debug @=(*$C+*)@>@+ gubed {but turn everything on when debugging}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8] Constants: increase id lengths
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!max_names=4000; {number of identifiers, strings, module names;
+ must be less than 10240}
+@!max_texts=2000; {number of replacement texts, must be less than 10240}
+@!hash_size=353; {should be prime}
+@!longest_name=400; {module names shouldn't be longer than this}
+@!line_length=72; {lines of \PASCAL\ output have at most this many characters}
+@!out_buf_size=144; {length of output buffer, should be twice |line_length|}
+@!stack_size=50; {number of simultaneous levels of macro expansion}
+@!max_id_length=12; {long identifiers are chopped to this length, which must
+ not exceed |line_length|}
+@!unambig_length=7; {identifiers must be unique if chopped to this length}
+ {note that 7 is more strict than \PASCAL's 8, but this can be varied}
+@y
+@!max_names=9000; {number of identifiers, strings, module names;
+ must be less than 10240}
+@!max_texts=2000; {number of replacement texts, must be less than 10240}
+@!hash_size=353; {should be prime}
+@!longest_name=400; {module names shouldn't be longer than this}
+@!line_length=72; {lines of \PASCAL\ output have at most this many characters}
+@!out_buf_size=144; {length of output buffer, should be twice |line_length|}
+@!stack_size=100; {number of simultaneous levels of macro expansion}
+@!max_id_length=50; {long identifiers are chopped to this length, which must
+ not exceed |line_length|}
+@!unambig_length=20; {identifiers must be unique if chopped to this length}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17] enable maximum character set
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=1 to @'37 do xchr[i]:=' ';
+for i:=@'200 to @'377 do xchr[i]:=' ';
+@y
+for i:=1 to @'37 do xchr[i]:=chr(i);
+for i:=@'200 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [20] terminal output: use standard i/o
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d print(#)==write(term_out,#) {`|print|' means write on the terminal}
+@y
+@d term_out==stdout
+@d print(#)==write(term_out,#) {`|print|' means write on the terminal}
+@z
+
+@x
+@<Globals...@>=
+@!term_out:text_file; {the terminal as an output file}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [21] init terminal
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Different systems have different ways of specifying that the output on a
+certain file will appear on the user's terminal. Here is one way to do this
+on the \PASCAL\ system that was used in \.{TANGLE}'s initial development:
+@^system dependencies@>
+
+@<Set init...@>=
+rewrite(term_out,'TTY:'); {send |term_out| output to the terminal}
+@y
+@ Different systems have different ways of specifying that the output on a
+certain file will appear on the user's terminal.
+@^system dependencies@>
+
+@<Set init...@>=
+ {Nothing need be done for C.}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22] flush terminal buffer
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@y
+@d update_terminal == flush(term_out) {empty the terminal output buffer}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24] open input files
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following code opens the input files. Since these files were listed
+in the program header, we assume that the \PASCAL\ runtime system has
+already checked that suitable file names have been given; therefore no
+additional error checking needs to be done.
+@^system dependencies@>
+
+@p procedure open_input; {prepare to read |web_file| and |change_file|}
+begin reset(web_file); reset(change_file);
+end;
+@y
+@ The following code opens the input files.
+This happens after the |initialize| procedure has executed.
+That will have called the |scan_args| procedure to set up the global
+variables |web_name| and |chg_name| to the appropriate file
+names.
+These globals, and the |scan_args| procedure will be defined at the end
+where they won't disturb the module numbering.
+@^system dependencies@>
+
+@p procedure open_input; {prepare to read |web_file| and |change_file|}
+begin
+reset(web_file,web_name); reset(change_file,chg_name);
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26] Open output files (except for the pool file).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following code opens |Pascal_file| and |pool|.
+Since these files were listed in the program header, we assume that the
+\PASCAL\ runtime system has checked that suitable external file names have
+been given.
+@^system dependencies@>
+
+@<Set init...@>=
+rewrite(Pascal_file); rewrite(pool);
+@y
+@ The following code opens |Pascal_file| and |pool|.
+Use the |scan_args| procedure to fill the global file names,
+according to the names given on the command line.
+@^system dependencies@>
+
+@<Set init...@>=
+scan_args;
+rewrite(Pascal_file,pascal_file_name);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28] Fix f^.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin buffer[limit]:=xord[f^]; get(f);
+ incr(limit);
+ if buffer[limit-1]<>" " then final_limit:=limit;
+ if limit=buf_size then
+ begin while not eoln(f) do get(f);
+@y
+ begin buffer[limit]:=xord[getc(f)];
+ incr(limit);
+ if buffer[limit-1]<>" " then final_limit:=limit;
+ if limit=buf_size then
+ begin while not eoln(f) do vgetc(f);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Fix `jump_out'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fatal_error(#)==begin new_line; print(#); error; mark_fatal; jump_out;
+ end
+
+@<Error handling...@>=
+procedure jump_out;
+begin goto end_of_TANGLE;
+end;
+@y
+@d jump_out==uexit(1)
+@d fatal_error(#)==begin new_line; print(#); error; mark_fatal; uexit(1);
+ end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38] Provide for a larger `byte_mem' and `tok_mem'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x Extra capacity:
+@d ww=2 {we multiply the byte capacity by approximately this amount}
+@d zz=3 {we multiply the token capacity by approximately this amount}
+@y
+@d ww=3 {we multiply the byte capacity by approximately this amount}
+@d zz=4 {we multiply the token capacity by approximately this amount}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [63] Remove conversion to uppercase
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if c>="a" then c:=c-@'40; {merge lowercase with uppercase}
+@y
+ begin
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [64] Delayed pool file opening.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Define and output a new string...@>=
+begin ilk[p]:=numeric; {strings are like numeric macros}
+if l-double_chars=2 then {this string is for a single character}
+ equiv[p]:=buffer[id_first+1]+@'100000
+else begin equiv[p]:=string_ptr+@'100000;
+ l:=l-double_chars-1;
+@y
+@<Define and output a new string...@>=
+begin ilk[p]:=numeric; {strings are like numeric macros}
+if l-double_chars=2 then {this string is for a single character}
+ equiv[p]:=buffer[id_first+1]+@'100000
+else begin
+ if string_ptr = 256 then rewrite(pool,pool_file_name);
+ equiv[p]:=string_ptr+@'100000;
+ l:=l-double_chars-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [105] Accept DIV, div, MOD, and mod
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ (((out_contrib[1]="D")and(out_contrib[2]="I")and(out_contrib[3]="V")) or@|
+ ((out_contrib[1]="M")and(out_contrib[2]="O")and(out_contrib[3]="D")) ))or@|
+@^uppercase@>
+@y
+ (((out_contrib[1]="D")and(out_contrib[2]="I")and(out_contrib[3]="V")) or@|
+ ((out_contrib[1]="d")and(out_contrib[2]="i")and(out_contrib[3]="v")) or@|
+ ((out_contrib[1]="M")and(out_contrib[2]="O")and(out_contrib[3]="D")) or@|
+ ((out_contrib[1]="m")and(out_contrib[2]="o")and(out_contrib[3]="d")) ))or@|
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [110] lowercase ids
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@^uppercase@>
+ if ((out_buf[out_ptr-3]="D")and(out_buf[out_ptr-2]="I")and
+ (out_buf[out_ptr-1]="V"))or @/
+ ((out_buf[out_ptr-3]="M")and(out_buf[out_ptr-2]="O")and
+ (out_buf[out_ptr-1]="D")) then@/ goto bad_case
+@y
+ if ((out_buf[out_ptr-3]="D")and(out_buf[out_ptr-2]="I")and
+ (out_buf[out_ptr-1]="V"))or @/
+ ((out_buf[out_ptr-3]="d")and(out_buf[out_ptr-2]="i")and
+ (out_buf[out_ptr-1]="v"))or @/
+ ((out_buf[out_ptr-3]="M")and(out_buf[out_ptr-2]="O")and
+ (out_buf[out_ptr-1]="D"))or @/
+ ((out_buf[out_ptr-3]="m")and(out_buf[out_ptr-2]="o")and
+ (out_buf[out_ptr-1]="d")) then@/ goto bad_case
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [114] lowercase operators (`and', `or', etc.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+and_sign: begin out_contrib[1]:="A"; out_contrib[2]:="N"; out_contrib[3]:="D";
+@^uppercase@>
+ send_out(ident,3);
+ end;
+not_sign: begin out_contrib[1]:="N"; out_contrib[2]:="O"; out_contrib[3]:="T";
+ send_out(ident,3);
+ end;
+set_element_sign: begin out_contrib[1]:="I"; out_contrib[2]:="N";
+ send_out(ident,2);
+ end;
+or_sign: begin out_contrib[1]:="O"; out_contrib[2]:="R"; send_out(ident,2);
+@y
+and_sign: begin out_contrib[1]:="a"; out_contrib[2]:="n"; out_contrib[3]:="d";
+ send_out(ident,3);
+ end;
+not_sign: begin out_contrib[1]:="n"; out_contrib[2]:="o"; out_contrib[3]:="t";
+ send_out(ident,3);
+ end;
+set_element_sign: begin out_contrib[1]:="i"; out_contrib[2]:="n";
+ send_out(ident,2);
+ end;
+or_sign: begin out_contrib[1]:="o"; out_contrib[2]:="r"; send_out(ident,2);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [116] Remove conversion to uppercase
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Single-character identifiers represent themselves, while longer ones
+appear in |byte_mem|. All must be converted to uppercase,
+with underlines removed. Extremely long identifiers must be chopped.
+
+(Some \PASCAL\ compilers work with lowercase letters instead of
+uppercase. If this module of \.{TANGLE} is changed, it's also necessary
+to change from uppercase to lowercase in the modules that are
+listed in the index under ``uppercase''.)
+@^system dependencies@>
+@^uppercase@>
+
+@d up_to(#)==#-24,#-23,#-22,#-21,#-20,#-19,#-18,#-17,#-16,#-15,#-14,
+ #-13,#-12,#-11,#-10,#-9,#-8,#-7,#-6,#-5,#-4,#-3,#-2,#-1,#
+
+@<Cases related to identifiers@>=
+"A",up_to("Z"): begin out_contrib[1]:=cur_char; send_out(ident,1);
+ end;
+"a",up_to("z"): begin out_contrib[1]:=cur_char-@'40; send_out(ident,1);
+ end;
+identifier: begin k:=0; j:=byte_start[cur_val]; w:=cur_val mod ww;
+ while (k<max_id_length)and(j<byte_start[cur_val+ww]) do
+ begin incr(k); out_contrib[k]:=byte_mem[w,j]; incr(j);
+ if out_contrib[k]>="a" then out_contrib[k]:=out_contrib[k]-@'40
+ else if out_contrib[k]="_" then decr(k);
+ end;
+ send_out(ident,k);
+ end;
+@y
+@ Single-character identifiers represent themselves, while longer ones
+appear in |byte_mem|. All must be converted to lowercase,
+with underlines removed. Extremely long identifiers must be chopped.
+@^system dependencies@>
+
+@d up_to(#)==#-24,#-23,#-22,#-21,#-20,#-19,#-18,#-17,#-16,#-15,#-14,
+ #-13,#-12,#-11,#-10,#-9,#-8,#-7,#-6,#-5,#-4,#-3,#-2,#-1,#
+
+@<Cases related to identifiers@>=
+"A",up_to("Z"),
+"a",up_to("z"): begin out_contrib[1]:=cur_char; send_out(ident,1);
+ end;
+identifier: begin k:=0; j:=byte_start[cur_val]; w:=cur_val mod ww;
+ while (k<max_id_length)and(j<byte_start[cur_val+ww]) do
+ begin incr(k); out_contrib[k]:=byte_mem[w,j]; incr(j);
+ if out_contrib[k]="_" then decr(k);
+ end;
+ send_out(ident,k);
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Fix casting bug
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d add_in(#)==begin accumulator:=accumulator+next_sign*(#); next_sign:=+1;
+ end
+@y
+@d add_in(#)==begin accumulator:=accumulator+next_sign*toint(#); next_sign:=+1;
+ end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [179] make term_in = input
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+any error stop will set |debug_cycle| to zero.
+@y
+any error stop will set |debug_cycle| to zero.
+
+@d term_in==stdin
+@z
+
+@x
+@!term_in:text_file; {the user's terminal as an input file}
+@y
+
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [180] remove term_in reset
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+reset(term_in,'TTY:','/I'); {open |term_in| as the terminal, don't do a |get|}
+@y
+
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [182] write newline just before exit; use value of |history|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+We have defined plenty of procedures, and it is time to put the last
+pieces of the puzzle in place. Here is where \.{TANGLE} starts, and where
+it ends.
+@^system dependencies@>
+@y
+We have defined plenty of procedures, and it is time to put the last
+pieces of the puzzle in place. Here is where \.{TANGLE} starts, and where
+it ends.
+@^system dependencies@>
+@z
+
+@x
+@<Print the job |history|@>;
+@y
+@<Print the job |history|@>;
+new_line;
+if (history <> spotless) and (history <> harmless_message)
+then uexit (1)
+else uexit (0);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [188] system dependent changes--the |scan_args| procedure.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This module should be replaced, if necessary, by changes to the program
+that are necessary to make \.{TANGLE} work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous modules preserve the module numbering; then everybody's version
+will be consistent with the printed program. More extensive changes,
+which introduce new modules, can be inserted here; then only the index
+itself will get a new module number.
+@^system dependencies@>
+@y
+This module should be replaced, if necessary, by changes to the program
+that are necessary to make \.{TANGLE} work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous modules preserve the module numbering; then everybody's version
+will be consistent with the printed program. More extensive changes,
+which introduce new modules, can be inserted here; then only the index
+itself will get a new module number.
+@^system dependencies@>
+
+@ The user calls \.{TANGLE} with arguments on the command line. These
+are either file names or flags (beginning with `\.-'). The following
+globals are for communicating the user's desires to the rest of the
+program. The various filename variables contain strings with the full
+names of those files, as {\mc UNIX} knows them.
+
+There are no flags that affect \.{TANGLE} at the moment.
+
+@d max_file_name_length==FILENAMESIZE
+
+@<Globals...@>=
+@!web_name,@!chg_name,@!pascal_file_name,@!pool_file_name:
+ array[1..max_file_name_length] of char;
+
+@ The |scan_args| procedure looks at the command line arguments and sets
+the |file_name| variables accordingly. At least one file name must be
+present: the \.{WEB} file. It may have an extension, or it may omit it
+to get |'.web'| added. The \PASCAL\ output file name is formed by
+replacing the \.{WEB} file name extension by |'.p'|. Similarly, the
+pool file name is formed using a |'.pool'| extension.
+
+If there is another file name present among the arguments, it is the
+change file, again either with an extension or without one to get
+|'.ch'| An omitted change file argument means that |'/dev/null'| should
+be used, when no changes are desired.
+
+@<Declaration of |scan_args|@>=
+procedure scan_args;
+ var dot_pos, slash_pos, i, a: integer; {indices}
+ c: char;
+ @!fname: array[1..max_file_name_length] of char; {temporary argument holder}
+ @!found_web,@!found_change: boolean; {|true| when those file names have
+ been seen}
+begin
+ found_web := false;
+ found_change := false;
+
+ for a := 1 to argc - 1
+ do begin
+ argv(a,fname); {put argument number |a| into |fname|}
+ if fname[1] <> '-'
+ then begin
+ if not found_web
+ then @<Get |web_name|, |pascal_file_name|,
+ and |pool_file_name| variables from |fname|@>
+ else if not found_change
+ then @<Get |chg_name| from |fname|@>
+ else @<Print usage error message and quit@>;
+ end else
+ @<Handle flag argument in |fname|@>;
+ end;
+
+ if not found_web then @<Print usage error message and quit@>;
+ if not found_change then @<Set up null change file@>;
+end;
+
+@ Use all of |fname| for the |web_name| if there is a |'.'| in it,
+otherwise add |'.web'|. The other file names come from adding things
+after the dot. The |argv| procedure will not put more than
+|max_file_name_length-5| characters into |fname|, and this leaves enough
+room in the |file_name| variables to add the extensions.
+
+The end of a file name is marked with a |' '|, the convention assumed by
+the |reset| and |rewrite| procedures.
+
+@<Get |web_name|...@>=
+begin
+ dot_pos := -1;
+ slash_pos := -1;
+ i := 1;
+ while (fname[i] <> ' ') and (i <= max_file_name_length - 5)
+ do begin
+ web_name[i] := fname[i];
+ if fname[i] = '.' then dot_pos := i;
+ if fname[i] = '/' then slash_pos := i;
+ incr (i);
+ end;
+ web_name[i] := ' ';
+
+ if (dot_pos = -1) or (dot_pos < slash_pos)
+ then begin
+ dot_pos := i;
+ web_name[dot_pos] := '.';
+ web_name[dot_pos+1] := 'w';
+ web_name[dot_pos+2] := 'e';
+ web_name[dot_pos+3] := 'b';
+ web_name[dot_pos+4] := ' ';
+ end;
+
+ for i := 1 to dot_pos
+ do begin
+ c := web_name[i];
+ pascal_file_name[i] := c;
+ pool_file_name[i] := c;
+ end;
+
+ pascal_file_name[dot_pos+1] := 'p';
+ pascal_file_name[dot_pos+2] := ' ';
+
+ pool_file_name[dot_pos+1] := 'p';
+ pool_file_name[dot_pos+2] := 'o';
+ pool_file_name[dot_pos+3] := 'o';
+ pool_file_name[dot_pos+4] := 'l';
+ pool_file_name[dot_pos+5] := ' ';
+
+ found_web := true;
+end
+
+@ @<Get |chg_name|...@>=
+begin
+ dot_pos := -1;
+ slash_pos := -1;
+ i := 1;
+ while (fname[i] <> ' ') and (i <= max_file_name_length - 5)
+ do begin
+ chg_name[i] := fname[i];
+ if fname[i] = '.' then dot_pos := i;
+ if fname[i] = '/' then slash_pos := i;
+ incr (i);
+ end;
+ chg_name[i] := ' ';
+
+ if (dot_pos = -1) or (dot_pos < slash_pos)
+ then begin
+ dot_pos := i;
+ chg_name[dot_pos] := '.';
+ chg_name[dot_pos+1] := 'c';
+ chg_name[dot_pos+2] := 'h';
+ chg_name[dot_pos+3] := ' ';
+ end;
+
+ found_change := true;
+end
+
+@ @<Set up null...@>=
+begin
+ chg_name[1]:='/';
+ chg_name[2]:='d';
+ chg_name[3]:='e';
+ chg_name[4]:='v';
+ chg_name[5]:='/';
+ chg_name[6]:='n';
+ chg_name[7]:='u';
+ chg_name[8]:='l';
+ chg_name[9]:='l';
+ chg_name[10]:=' ';
+end
+
+@ There are no flags currently used by \.{TANGLE}, but this module can be
+used as a hook to introduce flags.
+
+@<Handle flag...@>=
+begin
+ @<Print usage error message and quit@>;
+end
+
+@ @<Print usage error message and quit@>=
+begin
+ print_ln ('Usage: tangle webfile[.web] [changefile[.ch]].');
+ uexit (1);
+end
+@z
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c b/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c
new file mode 100644
index 0000000000..b3bebfedf1
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c
@@ -0,0 +1,2492 @@
+#define EXTERN extern
+#include "texd.h"
+
+void zpostlinebreak ( finalwidowpenalty )
+integer finalwidowpenalty ;
+{/* 30 31 */ postlinebreak_regmem
+ halfword q, r, s ;
+ boolean discbreak ;
+ boolean postdiscbreak ;
+ scaled curwidth ;
+ scaled curindent ;
+ quarterword t ;
+ integer pen ;
+ halfword curline ;
+ q = mem [ bestbet + 1 ] .hh .v.RH ;
+ curp = 0 ;
+ do {
+ r = q ;
+ q = mem [ q + 1 ] .hh .v.LH ;
+ mem [ r + 1 ] .hh .v.LH = curp ;
+ curp = r ;
+ } while ( ! ( q == 0 ) ) ;
+ curline = curlist .pgfield + 1 ;
+ do {
+ q = mem [ curp + 1 ] .hh .v.RH ;
+ discbreak = false ;
+ postdiscbreak = false ;
+ if ( q != 0 )
+ if ( mem [ q ] .hh.b0 == 10 )
+ {
+ deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ;
+ mem [ q + 1 ] .hh .v.LH = eqtb [ 10290 ] .hh .v.RH ;
+ mem [ q ] .hh.b1 = 9 ;
+ incr ( mem [ eqtb [ 10290 ] .hh .v.RH ] .hh .v.RH ) ;
+ goto lab30 ;
+ }
+ else {
+
+ if ( mem [ q ] .hh.b0 == 7 )
+ {
+ t = mem [ q ] .hh.b1 ;
+ if ( t == 0 )
+ r = mem [ q ] .hh .v.RH ;
+ else {
+
+ r = q ;
+ while ( t > 1 ) {
+
+ r = mem [ r ] .hh .v.RH ;
+ decr ( t ) ;
+ }
+ s = mem [ r ] .hh .v.RH ;
+ r = mem [ s ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ q ] .hh .v.RH ) ;
+ mem [ q ] .hh.b1 = 0 ;
+ }
+ if ( mem [ q + 1 ] .hh .v.RH != 0 )
+ {
+ s = mem [ q + 1 ] .hh .v.RH ;
+ while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = r ;
+ r = mem [ q + 1 ] .hh .v.RH ;
+ mem [ q + 1 ] .hh .v.RH = 0 ;
+ postdiscbreak = true ;
+ }
+ if ( mem [ q + 1 ] .hh .v.LH != 0 )
+ {
+ s = mem [ q + 1 ] .hh .v.LH ;
+ if ( mem [ s ] .hh.b0 == 12 )
+ {
+ s = mem [ s ] .hh .v.RH ;
+ mem [ mem [ q + 1 ] .hh .v.LH ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ q + 1 ] .hh .v.LH ) ;
+ }
+ mem [ q ] .hh .v.RH = s ;
+ while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ q + 1 ] .hh .v.LH = 0 ;
+ q = s ;
+ }
+ mem [ q ] .hh .v.RH = r ;
+ discbreak = true ;
+ }
+ else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) )
+ mem [ q + 1 ] .cint = 0 ;
+ }
+ else {
+
+ q = memtop - 3 ;
+ while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ;
+ }
+ r = newparamglue ( 8 ) ;
+ mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ;
+ mem [ q ] .hh .v.RH = r ;
+ q = r ;
+ lab30: ;
+ r = mem [ q ] .hh .v.RH ;
+ mem [ q ] .hh .v.RH = 0 ;
+ q = mem [ memtop - 3 ] .hh .v.RH ;
+ mem [ memtop - 3 ] .hh .v.RH = r ;
+ if ( eqtb [ 10289 ] .hh .v.RH != 0 )
+ {
+ r = newparamglue ( 7 ) ;
+ mem [ r ] .hh .v.RH = q ;
+ q = r ;
+ }
+ if ( curline > lastspecialline )
+ {
+ curwidth = secondwidth ;
+ curindent = secondindent ;
+ }
+ else if ( eqtb [ 10812 ] .hh .v.RH == 0 )
+ {
+ curwidth = firstwidth ;
+ curindent = firstindent ;
+ }
+ else {
+
+ curwidth = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline ] .cint ;
+ curindent = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline - 1 ] .cint ;
+ }
+ adjusttail = memtop - 5 ;
+ justbox = hpack ( q , curwidth , 0 ) ;
+ mem [ justbox + 4 ] .cint = curindent ;
+ appendtovlist ( justbox ) ;
+ if ( memtop - 5 != adjusttail )
+ {
+ mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ;
+ curlist .tailfield = adjusttail ;
+ }
+ adjusttail = 0 ;
+ if ( curline + 1 != bestline )
+ {
+ pen = eqtb [ 12676 ] .cint ;
+ if ( curline == curlist .pgfield + 1 )
+ pen = pen + eqtb [ 12668 ] .cint ;
+ if ( curline + 2 == bestline )
+ pen = pen + finalwidowpenalty ;
+ if ( discbreak )
+ pen = pen + eqtb [ 12671 ] .cint ;
+ if ( pen != 0 )
+ {
+ r = newpenalty ( pen ) ;
+ mem [ curlist .tailfield ] .hh .v.RH = r ;
+ curlist .tailfield = r ;
+ }
+ }
+ incr ( curline ) ;
+ curp = mem [ curp + 1 ] .hh .v.LH ;
+ if ( curp != 0 )
+ if ( ! postdiscbreak )
+ {
+ r = memtop - 3 ;
+ while ( true ) {
+
+ q = mem [ r ] .hh .v.RH ;
+ if ( q == mem [ curp + 1 ] .hh .v.RH )
+ goto lab31 ;
+ if ( ( q >= himemmin ) )
+ goto lab31 ;
+ if ( ( mem [ q ] .hh.b0 < 9 ) )
+ goto lab31 ;
+ if ( mem [ q ] .hh.b1 == 2 )
+ if ( mem [ q ] .hh.b0 == 11 )
+ goto lab31 ;
+ r = q ;
+ }
+ lab31: if ( r != memtop - 3 )
+ {
+ mem [ r ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ;
+ mem [ memtop - 3 ] .hh .v.RH = q ;
+ }
+ }
+ } while ( ! ( curp == 0 ) ) ;
+ if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) )
+ confusion ( 935 ) ;
+ curlist .pgfield = bestline - 1 ;
+}
+smallnumber zreconstitute ( j , n , bchar , hchar )
+smallnumber j ;
+smallnumber n ;
+halfword bchar ;
+halfword hchar ;
+{/* 22 30 */ register smallnumber Result; reconstitute_regmem
+ halfword p ;
+ halfword t ;
+ fourquarters q ;
+ halfword currh ;
+ halfword testchar ;
+ scaled w ;
+ fontindex k ;
+ smallnumber ii ;
+ hyphenpassed = 0 ;
+ t = memtop - 4 ;
+ w = 0 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ {register integer for_end; ii = n ; for_end = j ; if ( ii >= for_end) do
+ if ( dirtyumlaut [ ii ] != 0 )
+ n = ii - 1 ;
+ while ( ii-- > for_end ) ; }
+ curl = hu [ j ] ;
+ curq = t ;
+ if ( j == 0 )
+ {
+ ligaturepresent = initlig ;
+ p = initlist ;
+ if ( ligaturepresent )
+ lfthit = initlft ;
+ while ( p > 0 ) {
+
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = mem [ p ] .hh.b1 ;
+ }
+ p = mem [ p ] .hh .v.RH ;
+ }
+ }
+ else if ( curl < 256 )
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = curl ;
+ }
+ ligstack = 0 ;
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ lab22: if ( curl == 256 )
+ {
+ k = bcharlabel [ hf ] ;
+ if ( k == fontmemsize )
+ goto lab30 ;
+ else q = fontinfo [ k ] .qqqq ;
+ }
+ else {
+
+ q = fontinfo [ charbase [ hf ] + curl ] .qqqq ;
+ if ( ( ( q .b2 ) % 4 ) != 1 )
+ goto lab30 ;
+ k = ligkernbase [ hf ] + q .b3 ;
+ q = fontinfo [ k ] .qqqq ;
+ if ( q .b0 > 128 )
+ {
+ k = ligkernbase [ hf ] + 256 * q .b2 + q .b3 + 32768L - 256 * ( 128 ) ;
+ q = fontinfo [ k ] .qqqq ;
+ }
+ }
+ if ( currh < 256 )
+ testchar = currh ;
+ else testchar = curr ;
+ while ( true ) {
+
+ if ( q .b1 == testchar )
+ if ( q .b0 <= 128 )
+ if ( currh < 256 )
+ {
+ hyphenpassed = j ;
+ hchar = 256 ;
+ currh = 256 ;
+ goto lab22 ;
+ }
+ else {
+
+ if ( hchar < 256 )
+ if ( hyfpen [ j ] != 10000 )
+ {
+ hyphenpassed = j ;
+ hchar = 256 ;
+ }
+ if ( q .b2 < 128 )
+ {
+ if ( curl == 256 )
+ lfthit = true ;
+ if ( j == n )
+ if ( ligstack == 0 )
+ rthit = true ;
+ {
+ if ( interrupt != 0 )
+ pauseforinstructions () ;
+ }
+ switch ( q .b2 )
+ {case 1 :
+ case 5 :
+ {
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ }
+ break ;
+ case 2 :
+ case 6 :
+ {
+ curr = q .b3 ;
+ if ( ligstack > 0 )
+ mem [ ligstack ] .hh.b1 = curr ;
+ else {
+
+ ligstack = newligitem ( curr ) ;
+ if ( j == n )
+ bchar = 256 ;
+ else {
+
+ p = getavail () ;
+ mem [ ligstack + 1 ] .hh .v.RH = p ;
+ mem [ p ] .hh.b1 = hu [ j + 1 ] ;
+ mem [ p ] .hh.b0 = hf ;
+ }
+ }
+ }
+ break ;
+ case 3 :
+ {
+ curr = q .b3 ;
+ p = ligstack ;
+ ligstack = newligitem ( curr ) ;
+ mem [ ligstack ] .hh .v.RH = p ;
+ }
+ break ;
+ case 7 :
+ case 11 :
+ {
+ if ( ligaturepresent )
+ {
+ p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ;
+ if ( lfthit )
+ {
+ mem [ p ] .hh.b1 = 2 ;
+ lfthit = false ;
+ }
+ if ( false )
+ if ( ligstack == 0 )
+ {
+ incr ( mem [ p ] .hh.b1 ) ;
+ rthit = false ;
+ }
+ mem [ curq ] .hh .v.RH = p ;
+ t = p ;
+ ligaturepresent = false ;
+ }
+ curq = t ;
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ }
+ break ;
+ default:
+ {
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ if ( ligstack > 0 )
+ {
+ if ( mem [ ligstack + 1 ] .hh .v.RH > 0 )
+ {
+ mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ;
+ t = mem [ t ] .hh .v.RH ;
+ incr ( j ) ;
+ }
+ p = ligstack ;
+ ligstack = mem [ p ] .hh .v.RH ;
+ freenode ( p , 2 ) ;
+ if ( ligstack == 0 )
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ else curr = mem [ ligstack ] .hh.b1 ;
+ }
+ else if ( j == n )
+ goto lab30 ;
+ else {
+
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = curr ;
+ }
+ incr ( j ) ;
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ }
+ }
+ break ;
+ }
+ if ( q .b2 > 4 )
+ if ( q .b2 != 7 )
+ goto lab30 ;
+ goto lab22 ;
+ }
+ w = fontinfo [ kernbase [ hf ] + 256 * q .b2 + q .b3 ] .cint ;
+ goto lab30 ;
+ }
+ if ( q .b0 >= 128 )
+ if ( currh == 256 )
+ goto lab30 ;
+ else {
+
+ currh = 256 ;
+ goto lab22 ;
+ }
+ k = k + q .b0 + 1 ;
+ q = fontinfo [ k ] .qqqq ;
+ }
+ lab30: ;
+ if ( ligaturepresent )
+ {
+ p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ;
+ if ( lfthit )
+ {
+ mem [ p ] .hh.b1 = 2 ;
+ lfthit = false ;
+ }
+ if ( rthit )
+ if ( ligstack == 0 )
+ {
+ incr ( mem [ p ] .hh.b1 ) ;
+ rthit = false ;
+ }
+ mem [ curq ] .hh .v.RH = p ;
+ t = p ;
+ ligaturepresent = false ;
+ }
+ if ( w != 0 )
+ {
+ mem [ t ] .hh .v.RH = newkern ( w ) ;
+ t = mem [ t ] .hh .v.RH ;
+ w = 0 ;
+ }
+ if ( ligstack > 0 )
+ {
+ curq = t ;
+ curl = mem [ ligstack ] .hh.b1 ;
+ ligaturepresent = true ;
+ {
+ if ( mem [ ligstack + 1 ] .hh .v.RH > 0 )
+ {
+ mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ;
+ t = mem [ t ] .hh .v.RH ;
+ incr ( j ) ;
+ }
+ p = ligstack ;
+ ligstack = mem [ p ] .hh .v.RH ;
+ freenode ( p , 2 ) ;
+ if ( ligstack == 0 )
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ else curr = mem [ ligstack ] .hh.b1 ;
+ }
+ goto lab22 ;
+ }
+ Result = j ;
+ return(Result) ;
+}
+void zhashfunk ( w , anfang , ende , v , ind , k )
+wort w ;
+integer anfang ;
+integer ende ;
+varr v ;
+intarr ind ;
+intarr k ;
+{hashfunk_regmem
+ long vacc, indacc, kacc ;
+ integer i ;
+ vacc = 31415L ;
+ indacc = 152L ;
+ kacc = 271L ;
+ {register integer for_end; i = anfang ; for_end = ende ; if ( i <= for_end)
+ do
+ {
+ ;
+ vacc = ( vacc * 31 + w [ i ] ) % 8388648L ;
+ v [ i ] = vacc ;
+ indacc = ( indacc * 33 + w [ i ] ) % ( tabsize + 1 ) ;
+ ind [ i ] = indacc ;
+ kacc = ( kacc * 15 + w [ i ] ) % ( ( tabsize + 1 ) / 2 ) ;
+ k [ i ] = 2 * kacc + 1 ;
+ }
+ while ( i++ < for_end ) ; }
+}
+void zunpackinfo ( b , iausnahme , iuntrennbar , ierste , izweite , iendung ,
+ivorsilbe , istamm , iehervor , istammallein )
+infobyte b ;
+boolean * iausnahme ;
+boolean * iuntrennbar ;
+integer * ierste ;
+integer * izweite ;
+boolean * iendung ;
+boolean * ivorsilbe ;
+boolean * istamm ;
+boolean * iehervor ;
+boolean * istammallein ;
+{unpackinfo_regmem
+ if ( odd ( b ) )
+ {
+* iausnahme = true ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* iuntrennbar = true ;
+ else *iuntrennbar = false ;
+ b = b / 2 ;
+* ierste = b % 8 ;
+* izweite = b / 8 ;
+ }
+ else {
+
+* iausnahme = false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* iendung = true ;
+ else *iendung = false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* ivorsilbe = true ;
+ else *ivorsilbe = false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* istamm = true ;
+ else *istamm = false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* iehervor = true ;
+ else *iehervor = false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+* istammallein = true ;
+ else *istammallein = false ;
+ }
+}
+void zunpackentry ( h , etabv , etabb , efrei , ewiederfrei )
+hashelement h ;
+verdschlue * etabv ;
+infobyte * etabb ;
+boolean * efrei ;
+boolean * ewiederfrei ;
+{unpackentry_regmem
+ ;
+* etabv = h [ 0 ] + h [ 1 ] * 256 + h [ 2 ] * 256 * 256 ;
+ if ( odd ( h [ 3 ] ) )
+ {
+ ;
+* etabb = h [ 3 ] ;
+* efrei = false ;
+* ewiederfrei = false ;
+ }
+ else {
+
+ ;
+* etabb = h [ 3 ] % 64 ;
+ if ( odd ( h [ 3 ] / 64 ) )
+* efrei = true ;
+ else *efrei = false ;
+ if ( odd ( h [ 3 ] / 128 ) )
+* ewiederfrei = true ;
+ else *ewiederfrei = false ;
+ }
+}
+void zhashsuch ( v , ind , k , iausnahme , iuntrennbar , ierste , izweite ,
+iendung , ivorsilbe , istamm , iehervor , istammallein , g )
+verdschlue v ;
+integer ind ;
+integer k ;
+boolean * iausnahme ;
+boolean * iuntrennbar ;
+integer * ierste ;
+integer * izweite ;
+boolean * iendung ;
+boolean * ivorsilbe ;
+boolean * istamm ;
+boolean * iehervor ;
+boolean * istammallein ;
+boolean * g ;
+{hashsuch_regmem
+ boolean gef, ngef ;
+ integer j ;
+ tableentry entry ;
+ gef = false ;
+ ngef = false ;
+ j = ind ;
+ do {
+ unpackentry ( htab [ j ] , entry .tabv , entry .tabb , entry .frei ,
+ entry .wiederfrei ) ;
+ if ( entry .frei )
+ ngef = true ;
+ else if ( ( v == entry .tabv ) && ! entry .wiederfrei )
+ {
+ unpackinfo ( entry .tabb , *iausnahme , *iuntrennbar , *ierste , *izweite , *
+ iendung , *ivorsilbe , *istamm , *iehervor , *istammallein ) ;
+ gef = true ;
+ }
+ else j = ( j + k ) % ( tabsize + 1 ) ;
+ } while ( ! ( gef || ngef ) ) ;
+* g = gef ;
+}
+void zhashload ( status )
+integer * status ;
+{hashload_regmem
+ integer i ;
+ tableentry e ;
+ {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <=
+ for_end) do
+ nameoffile [ i ] = ' ' ;
+ while ( i++ < for_end ) ; }
+ nameoffile [ 1 ] = 'h' ;
+ nameoffile [ 2 ] = 'f' ;
+ nameoffile [ 3 ] = '3' ;
+ namelength = 3 ;
+ anzahl = 0 ;
+ if ( aopenin ( hashfile , TEXINPUTPATH ) )
+ {
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ {
+ int help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][0] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][1] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][2] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][3] = (eightbits) help;
+ unpackentry ( htab [ i ] , e .tabv , e .tabb , e .frei , e .wiederfrei
+ ) ;
+ if ( ! e .frei && ! e .wiederfrei )
+ anzahl = anzahl + 1 ;
+ }
+ while ( i++ < for_end ) ; }
+* status = 0 ;
+ aclose ( hashfile ) ;
+ }
+ else *status = 1 ;
+}
+void zpackinfo ( i , b )
+infotype i ;
+infobyte * b ;
+{packinfo_regmem
+* b = 0 ;
+ if ( i .ausnahme )
+ {
+ ;
+ if ( i .untrennbar )
+ ;
+ else ;
+* b = 1 + 2 * ord ( i .untrennbar ) + 4 * i .erste + 32 * i .zweite ;
+ }
+ else {
+
+ ;
+* b = 2 * ord ( i .endung ) + 4 * ord ( i .vorsilbe ) + 8 * ord ( i .stamm )
+ + 16 * ord ( i .ehervor ) + 32 * ord ( i .stammallein ) ;
+ }
+}
+void zpackentry ( e , h )
+tableentry e ;
+hashelement h ;
+{packentry_regmem
+ ;
+ h [ 0 ] = e .tabv % 256 ;
+ e .tabv = e .tabv / 256 ;
+ h [ 1 ] = e .tabv % 256 ;
+ h [ 2 ] = e .tabv / 256 ;
+ if ( odd ( e .tabb ) )
+ h [ 3 ] = e .tabb ;
+ else {
+
+ ;
+ h [ 3 ] = e .tabb + 64 * ord ( e .frei ) + 128 * ord ( e .wiederfrei ) ;
+ }
+}
+void zhashetr ( w , laenge , i , g )
+wort w ;
+integer laenge ;
+infotype i ;
+boolean * g ;
+{hashetr_regmem
+ varr v1 ;
+ intarr ind1, k1 ;
+ verdschlue v ;
+ integer ind, k, j, e ;
+ boolean gef, ngef ;
+ tableentry entry ;
+ hashelement helem ;
+ if ( anzahl >= tabsize )
+ {
+ ;
+* g = false ;
+ }
+ else {
+
+ ;
+ if ( ( anzahl < 10 ) || ( anzahl % 100 == 0 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ;
+ }
+ }
+ hashfunk ( w , 1 , laenge , v1 , ind1 , k1 ) ;
+ v = v1 [ laenge ] ;
+ ind = ind1 [ laenge ] ;
+ k = k1 [ laenge ] ;
+ gef = false ;
+ ngef = false ;
+ do {
+ ;
+ unpackentry ( htab [ ind ] , entry .tabv , entry .tabb , entry .frei ,
+ entry .wiederfrei ) ;
+ if ( entry .frei || entry .wiederfrei )
+ {
+ anzahl = anzahl + 1 ;
+ ngef = true ;
+ entry .tabv = v ;
+ packinfo ( i , entry .tabb ) ;
+ entry .frei = false ;
+ entry .wiederfrei = false ;
+ packentry ( entry , helem ) ;
+ memcpy((void *)htab [ ind ] , (void *)helem , sizeof(hashelement));
+ }
+ else {
+
+ ;
+ gef = v == entry .tabv ;
+ if ( ! gef )
+ ind = ( ind + k ) % ( tabsize + 1 ) ;
+ }
+ } while ( ! ( gef || ngef ) ) ;
+* g = ngef ;
+ }
+}
+void hashempty ( )
+{hashempty_regmem
+ integer i ;
+ tableentry elem ;
+ hashelement he ;
+ elem .tabv = 0 ;
+ elem .tabb = 0 ;
+ elem .frei = true ;
+ elem .wiederfrei = false ;
+ packentry ( elem , he ) ;
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ memcpy((void *)htab [ i ] , (void *)he, sizeof(hashelement));
+ while ( i++ < for_end ) ; }
+ anzahl = 0 ;
+}
+void zhashsave ( status )
+integer * status ;
+{hashsave_regmem
+ integer i ;
+ {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <=
+ for_end) do
+ nameoffile [ i ] = ' ' ;
+ while ( i++ < for_end ) ; }
+ nameoffile [ 1 ] = 'h' ;
+ nameoffile [ 2 ] = 'f' ;
+ nameoffile [ 3 ] = '3' ;
+ namelength = 3 ;
+ if ( aopenout ( hashfile ) )
+ {
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ {
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 0 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 1 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 2 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 3 ] ) ;
+ (void) putc('\n', hashfile );
+ }
+ while ( i++ < for_end ) ; }
+* status = 0 ;
+ aclose ( hashfile ) ;
+ }
+ else *status = 1 ;
+}
+integer hashsize ( )
+{register integer Result; hashsize_regmem
+ Result = anzahl ;
+ return(Result) ;
+}
+void zzahl ( line , i , ende , j )
+string80 line ;
+integer * i ;
+integer ende ;
+integer * j ;
+{zahl_regmem
+ boolean aus ;
+* j = 0 ;
+ do {
+ if ( *i <= ende )
+ if ( ktab [ line [ *i ] ] == 46 )
+* i = *i + 1 ;
+ else aus = true ;
+ else aus = true ;
+ } while ( ! ( aus ) ) ;
+ do {
+ if ( *i <= ende )
+ {
+ switch ( line [ *i ] )
+ {case 48 :
+ case 49 :
+ case 50 :
+ case 51 :
+ case 52 :
+ case 53 :
+ case 54 :
+ case 55 :
+ case 56 :
+ case 57 :
+ {
+* j = 10 * *j + line [ *i ] - 48 ;
+* i = *i + 1 ;
+ }
+ break ;
+ }
+ if ( ( line [ *i ] != 48 ) && ( line [ *i ] != 49 ) && ( line [ *i ] != 50
+ ) && ( line [ *i ] != 51 ) && ( line [ *i ] != 52 ) && ( line [ *i ] != 53
+ ) && ( line [ *i ] != 54 ) && ( line [ *i ] != 55 ) && ( line [ *i ] != 56
+ ) && ( line [ *i ] != 57 ) )
+ aus = true ;
+ }
+ else aus = true ;
+ } while ( ! ( aus ) ) ;
+}
+void zinfobau ( line , anfang , ende , informausnahme , informuntrennbar ,
+informerste , informzweite , informendung , informvorsilbe , informstamm ,
+informehervor , informstammallein , g )
+string80 line ;
+integer anfang ;
+integer ende ;
+boolean * informausnahme ;
+boolean * informuntrennbar ;
+integer * informerste ;
+integer * informzweite ;
+boolean * informendung ;
+boolean * informvorsilbe ;
+boolean * informstamm ;
+boolean * informehervor ;
+boolean * informstammallein ;
+boolean * g ;
+{infobau_regmem
+ integer i, j ;
+ boolean ok, fehler ;
+ buchstabe b ;
+* g = false ;
+* informausnahme = false ;
+* informendung = false ;
+* informvorsilbe = false ;
+* informehervor = false ;
+* informstamm = false ;
+* informstammallein = false ;
+ i = anfang ;
+ ok = false ;
+ fehler = false ;
+ do {
+ if ( i <= ende )
+ if ( line [ i ] == 46 )
+ i = i + 1 ;
+ else ok = true ;
+ else fehler = true ;
+ } while ( ! ( ok || fehler ) ) ;
+ if ( ! fehler )
+ {
+ b = ktab [ line [ i ] ] ;
+ if ( b == bsta )
+ {
+* informausnahme = true ;
+ i = i + 1 ;
+ if ( ktab [ line [ i ] ] == bstu )
+ {
+ i = i + 1 ;
+* informuntrennbar = true ;
+ }
+ else *informuntrennbar = false ;
+ zahl ( line , i , ende , j ) ;
+ if ( j == 0 )
+ {
+* informerste = 7 ;
+* informzweite = 7 ;
+ }
+ else {
+
+ j = j - 2 ;
+ if ( ( j >= 0 ) && ( j <= 6 ) )
+* informerste = j ;
+ else fehler = true ;
+ zahl ( line , i , ende , j ) ;
+ if ( j == 0 )
+* informzweite = 7 ;
+ else {
+
+ j = j - *informerste - 4 ;
+ if ( ( j >= 0 ) && ( j <= 6 ) )
+* informzweite = j ;
+ else fehler = true ;
+ }
+ }
+ if ( ! fehler )
+* g = true ;
+ }
+ else {
+
+ ok = false ;
+ do {
+ switch ( b )
+ {case 22 :
+* informvorsilbe = true ;
+ break ;
+ case 5 :
+* informendung = true ;
+ break ;
+ case 19 :
+* informstamm = true ;
+ break ;
+ case 2 :
+* informehervor = true ;
+ break ;
+ case 20 :
+* informstammallein = true ;
+ break ;
+ case 31 :
+ ;
+ break ;
+ default:
+ fehler = true ;
+ break ;
+ }
+ if ( i == ende )
+ ok = true ;
+ else {
+
+ i = i + 1 ;
+ b = ktab [ line [ i ] ] ;
+ }
+ } while ( ! ( ok || fehler ) ) ;
+ if ( ! fehler )
+* g = ( *informvorsilbe || *informendung || *informstamm ) && ( ! *
+ informehervor || *informvorsilbe && *informendung ) && ( ! *
+ informstammallein || *informstamm ) ;
+ }
+ }
+}
+void zeintragen ( line , l )
+string80 line ;
+integer l ;
+{eintragen_regmem
+ integer i, laenge ;
+ infotype inform ;
+ wort w ;
+ boolean g ;
+ laenge = 1 ;
+ while ( line [ laenge ] != 46 ) laenge = laenge + 1 ;
+ laenge = laenge - 1 ;
+ if ( laenge >= 1 )
+ {
+ if ( laenge <= maxwl )
+ {
+ infobau ( line , laenge + 1 , l , inform .ausnahme , inform .untrennbar
+ , inform .erste , inform .zweite , inform .endung , inform .vorsilbe ,
+ inform .stamm , inform .ehervor , inform .stammallein , g ) ;
+ if ( ! g )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " Info falsch: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " Info falsch: " ) ;
+ }
+ }
+ else {
+
+ {register integer for_end; i = 1 ; for_end = laenge ; if ( i <=
+ for_end) do
+ w [ i ] = ktab [ line [ i ] ] ;
+ while ( i++ < for_end ) ; }
+ hashetr ( w , laenge , inform , g ) ;
+ if ( ! g )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " Tabellenfehler: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " Tabellenfehler: " ) ;
+ }
+ }
+ }
+ if ( ! g )
+ {
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end)
+ do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+ }
+ else {
+
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " zu langes Wort: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " zu langes Wort: " ) ;
+ }
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+ }
+ else {
+
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " Falsche Zeile: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " Falsche Zeile: " ) ;
+ }
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+}
+void znaechsterbst ( i , tr , dudstop , b , w )
+integer * i ;
+trennvektor tr ;
+sperrvektor dudstop ;
+buchstabe * b ;
+wort w ;
+{naechsterbst_regmem
+ if ( ( *i > 0 ) && ( tr [ *i ] == keine ) && ! dudstop [ *i ] )
+ {
+* b = w [ *i ] ;
+* i = *i - 1 ;
+ }
+ else *b = trennzeichen ;
+}
+void zduden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , zerlegungen
+)
+trennvektor tr ;
+wort w ;
+trennvektor tr1 ;
+trennvektor dudtr ;
+dudt dud ;
+sperrvektor dudstop ;
+integer laenge ;
+boolean * ok ;
+integer * zerlegungen ;
+{duden_regmem
+ integer i ;
+ integer j ;
+ integer zust ;
+ boolean aus ;
+ integer tre ;
+ integer letzte ;
+ integer l, lalt ;
+ buchstabe b ;
+ i = laenge ;
+ {register integer for_end; j = 0 ; for_end = laenge ; if ( j <= for_end) do
+ dudtr [ j ] = tr [ j ] ;
+ while ( j++ < for_end ) ; }
+ while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ;
+ while ( i > 0 ) {
+
+ zust = 1 ;
+ aus = false ;
+ letzte = 0 ;
+ l = kons ;
+ b = w [ i ] ;
+ i = i - 1 ;
+ do {
+ {
+ tre = i + 1 ;
+ lalt = l ;
+ switch ( b )
+ {case 1 :
+ {
+ l = voka ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 15 :
+ {
+ l = voko ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 29 :
+ {
+ l = vokue ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 28 :
+ {
+ l = vokoe ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 27 :
+ {
+ l = vokae ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 5 :
+ {
+ l = voke ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsti )
+ {
+ l = vokie ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ i = i + 1 ;
+ l = voke ;
+ b = bsti ;
+ }
+ }
+ }
+ break ;
+ case 9 :
+ {
+ l = voki ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ l = vokei ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bsta )
+ {
+ l = vokai ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ }
+ break ;
+ case 21 :
+ {
+ l = voku ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ l = vokeu ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bsta )
+ {
+ l = vokau ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstae )
+ {
+ l = vokaeu ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstq )
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ }
+ break ;
+ case 20 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsts )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 8 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bstc )
+ {
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsts )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstp )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ else if ( b == bstt )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 2 :
+ case 3 :
+ case 4 :
+ case 6 :
+ case 7 :
+ case 10 :
+ case 11 :
+ case 12 :
+ case 13 :
+ case 14 :
+ case 16 :
+ case 17 :
+ case 18 :
+ case 19 :
+ case 22 :
+ case 23 :
+ case 24 :
+ case 26 :
+ case 30 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 25 :
+ {
+ l = voky ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 31 :
+ case 0 :
+ aus = true ;
+ break ;
+ }
+ }
+ if ( ! aus )
+ switch ( zust )
+ {case 1 :
+ if ( l == kons )
+ zust = 2 ;
+ else zust = 4 ;
+ break ;
+ case 2 :
+ if ( l != kons )
+ zust = 3 ;
+ break ;
+ case 3 :
+ if ( l == kons )
+ zust = 6 ;
+ else if ( l != lalt )
+ {
+ zust = 4 ;
+ letzte = tre ;
+ dudtr [ letzte ] = neben ;
+ }
+ break ;
+ case 4 :
+ if ( l == kons )
+ zust = 6 ;
+ else zust = 3 ;
+ break ;
+ case 6 :
+ if ( l == kons )
+ {
+ zust = 2 ;
+ letzte = tre ;
+ if ( ( w [ tre ] == bstc ) && ( w [ tre + 1 ] == bstk ) )
+ dudtr [ letzte ] = nebenck ;
+ else dudtr [ letzte ] = neben ;
+ }
+ else {
+
+ zust = 4 ;
+ letzte = tre ;
+ dudtr [ letzte ] = neben ;
+ }
+ break ;
+ }
+ } while ( ! ( aus ) ) ;
+ if ( zust == 2 )
+ dudtr [ letzte ] = keine ;
+ else if ( zust == 4 )
+ if ( ( lalt < vokie ) || ( lalt > vokeu ) )
+ dudtr [ letzte ] = keine ;
+ while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ;
+ }
+}
+void ztrennen ( zustand , anfang , spv , ok1 , tr , dudtr , zerlegungen , dud
+, v , ind , k , dudstop , w , tr1 , laenge )
+integer zustand ;
+integer anfang ;
+sperrvektor spv ;
+boolean * ok1 ;
+trennvektor tr ;
+trennvektor dudtr ;
+integer * zerlegungen ;
+dudt dud ;
+varr v ;
+intarr ind ;
+intarr k ;
+sperrvektor dudstop ;
+wort w ;
+trennvektor tr1 ;
+integer laenge ;
+{trennen_regmem
+ boolean gef, nichtok ;
+ integer schnitt ;
+ infotype inform ;
+ integer i ;
+ boolean okstamm, okvor, okend, okhelp ;
+ integer tri ;
+ integer i1, tre ;
+ boolean ok ;
+ integer stopptr ;
+ sperrvektor spvtmp ;
+ memcpy((void *)spvtmp, (void *)spv, sizeof(sperrvektor)) ;
+* ok1 = false ;
+ if ( anfang == laenge + 1 )
+ if ( ( zustand == 2 ) || ( zustand == 4 ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ duden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , *zerlegungen )
+ ;
+ {register integer for_end; i = laenge ; for_end = 1 ; if ( i >= for_end)
+ do
+ {
+ if ( dudtr [ i - 1 ] == haupt3 )
+ {
+ dudtr [ i - 1 ] = keine ;
+ tri = haupt3 ;
+ }
+ else tri = dudtr [ i ] ;
+ if ( *zerlegungen == 0 )
+ tr1 [ i ] = tri ;
+ else tr1 [ i ] = kombtab [ tr1 [ i ] ][ tri ] ;
+ }
+ while ( i-- > for_end ) ; }
+* zerlegungen = *zerlegungen + 1 ;
+* ok1 = true ;
+ }
+ else ;
+ else {
+
+ hashfunk ( w , anfang , laenge , v , ind , k ) ;
+ schnitt = laenge ;
+ nichtok = false ;
+ do {
+ do { if ( spv [ schnitt ] )
+ gef = false ;
+ else {
+
+ hashsuch ( v [ schnitt ] , ind [ schnitt ] , k [ schnitt ] , inform
+ .ausnahme , inform .untrennbar , inform .erste , inform .zweite ,
+ inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor
+ , inform .stammallein , gef ) ;
+ }
+ if ( gef )
+ spv [ schnitt ] = true ;
+ else schnitt = schnitt - 1 ;
+ } while ( ! ( gef || ( schnitt == anfang - 1 ) ) ) ;
+ if ( gef )
+ {
+ if ( ! inform .ausnahme )
+ {
+ if ( inform .endung && ( zustand == 2 ) )
+ {
+ okend = false ;
+ if ( ( w [ anfang ] == bstc ) || ( w [ anfang ] == bsth ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ tr [ anfang - 1 ] = neben ;
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okend = okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okend = okend || okhelp ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+* ok1 = *ok1 || okend ;
+ }
+ else okend = false ;
+ if ( inform .vorsilbe )
+ {
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ dud [ schnitt ] = true ;
+ trennen ( 1 , schnitt + 1 , spv , okvor , tr , dudtr , *zerlegungen
+ , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ dud [ schnitt ] = false ;
+* ok1 = *ok1 || okvor ;
+ }
+ else okvor = false ;
+ if ( inform .stamm && ! okvor )
+ {
+ if ( ! inform .stammallein )
+ {
+ okstamm = false ;
+ stopptr = 0 ;
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ if ( inform .ausnahme )
+ {
+ if ( inform .erste != 7 )
+ {
+ tre = anfang + inform .erste + 1 ;
+ tr [ tre ] = neben ;
+ if ( inform .zweite != 7 )
+ {
+ tre = tre + inform .zweite + 2 ;
+ if ( inform .untrennbar )
+ {
+ stopptr = tre ;
+ dudstop [ stopptr ] = true ;
+ }
+ else tr [ tre ] = neben ;
+ }
+ else {
+
+ if ( inform .untrennbar )
+ {
+ tr [ tre ] = keine ;
+ stopptr = tre ;
+ dudstop [ tre ] = true ;
+ }
+ }
+ }
+ else {
+
+ stopptr = schnitt - 1 ;
+ dudstop [ stopptr ] = true ;
+ }
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge )
+ ;
+ okstamm = okhelp ;
+ }
+ if ( ( schnitt >= 2 ) && ( schnitt < laenge ) )
+ if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt +
+ 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) )
+ {
+ trennen ( 5 , schnitt , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge )
+ ;
+ okstamm = okstamm || okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ if ( inform .ausnahme )
+ {register integer for_end; i1 = anfang - 1 ; for_end = schnitt
+ ; if ( i1 <= for_end) do
+ {
+ tr [ i1 ] = keine ;
+ dud [ i1 ] = false ;
+ dudstop [ stopptr ] = false ;
+ }
+ while ( i1++ < for_end ) ; }
+ else {
+
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ }
+* ok1 = *ok1 || okstamm ;
+ }
+ else if ( ( anfang == 1 ) && ( schnitt == laenge ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ tr [ anfang - 1 ] = haupt ;
+ trennen ( 4 , schnitt + 1 , spv , okstamm , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+* ok1 = *ok1 || okstamm ;
+ }
+ }
+ }
+ else {
+
+ okstamm = false ;
+ stopptr = 0 ;
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ if ( inform .ausnahme )
+ {
+ if ( inform .erste != 7 )
+ {
+ tre = anfang + inform .erste + 1 ;
+ tr [ tre ] = neben ;
+ if ( inform .zweite != 7 )
+ {
+ tre = tre + inform .zweite + 2 ;
+ if ( inform .untrennbar )
+ {
+ stopptr = tre ;
+ dudstop [ stopptr ] = true ;
+ }
+ else tr [ tre ] = neben ;
+ }
+ else {
+
+ if ( inform .untrennbar )
+ {
+ tr [ tre ] = keine ;
+ stopptr = tre ;
+ dudstop [ tre ] = true ;
+ }
+ }
+ }
+ else {
+
+ stopptr = schnitt - 1 ;
+ dudstop [ stopptr ] = true ;
+ }
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , *
+ zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okhelp ;
+ }
+ if ( ( schnitt >= 2 ) && ( schnitt < laenge ) )
+ if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ]
+ ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) )
+ {
+ trennen ( 5 , schnitt , spv , okhelp , tr , dudtr , *zerlegungen ,
+ dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , *zerlegungen
+ , dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ if ( inform .ausnahme )
+ {register integer for_end; i1 = anfang - 1 ; for_end = schnitt
+ ; if ( i1 <= for_end) do
+ {
+ tr [ i1 ] = keine ;
+ dud [ i1 ] = false ;
+ dudstop [ stopptr ] = false ;
+ }
+ while ( i1++ < for_end ) ; }
+ else {
+
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ }
+* ok1 = *ok1 || okstamm ;
+ }
+ schnitt = schnitt - 1 ;
+ nichtok = schnitt == anfang - 1 ;
+ }
+ else nichtok = true ;
+ } while ( ! ( nichtok ) ) ;
+ }
+ memcpy((void *)spv, (void *)spvtmp, sizeof(sperrvektor)) ;
+}
+void zabteilen ( w , tr1 , laenge , ok , zerlegungen )
+wort w ;
+trennvektor tr1 ;
+integer laenge ;
+boolean * ok ;
+integer * zerlegungen ;
+{/* 99 */ abteilen_regmem
+ integer i ;
+ dudt dud ;
+ varr v ;
+ intarr ind, k ;
+ sperrvektor spv, dudstop ;
+ trennvektor tr, dudtr ;
+ tr1 [ 0 ] = keine ;
+ {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do
+ {
+ tr [ i ] = keine ;
+ spv [ i ] = false ;
+ dudstop [ i ] = false ;
+ dud [ i ] = false ;
+ if ( i > 0 )
+ if ( ( w [ i ] == trennzeichen ) || ( w [ i ] == sonderzeichen ) )
+ {
+* zerlegungen = 0 ;
+* ok = false ;
+ goto lab99 ;
+ }
+ }
+ while ( i++ < for_end ) ; }
+* zerlegungen = 0 ;
+ trennen ( 3 , 1 , spv , *ok , tr , dudtr , *zerlegungen , dud , v , ind , k ,
+ dudstop , w , tr1 , laenge ) ;
+ {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do
+ if ( tr1 [ i ] == nebenck )
+ {
+ tr1 [ i ] = keine ;
+ tr1 [ i - 1 ] = nebenck ;
+ }
+ while ( i++ < for_end ) ; }
+ lab99: ;
+}
+boolean zisdirtyumlaut ( p )
+halfword p ;
+{register boolean Result; isdirtyumlaut_regmem
+ boolean res ;
+ halfword q ;
+ res = false ;
+ if ( p != 0 )
+ if ( mem [ p ] .hh.b0 == 7 )
+ if ( mem [ p + 1 ] .hh .v.LH != 0 )
+ if ( mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH != 0 )
+ if ( mem [ mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH ] .hh .v.RH != 0 )
+ {
+ q = mem [ p + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ if ( ( mem [ q ] .hh.b0 == 11 ) && ( mem [ q + 1 ] .cint == specletterID )
+ && ( mem [ q ] .hh .v.RH >= himemmin ) && ( mem [ mem [ mem [ q ] .hh
+ .v.RH ] .hh .v.RH ] .hh.b0 == 11 ) )
+ res = true ;
+ }
+ Result = res ;
+ return(Result) ;
+}
+integer zgetcharof ( s )
+halfword s ;
+{register integer Result; getcharof_regmem
+ halfword q ;
+ q = mem [ s + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ Result = mem [ mem [ mem [ q ] .hh .v.RH ] .hh .v.RH + 1 ] .cint ;
+ return(Result) ;
+}
+integer zgetfontof ( s )
+halfword s ;
+{register integer Result; getfontof_regmem
+ halfword q ;
+ q = mem [ s + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ Result = mem [ mem [ q ] .hh .v.RH ] .hh.b0 ;
+ return(Result) ;
+}
+void hyphenate ( )
+{/* 50 30 31 40 41 42 45 10 */ hyphenate_regmem
+ schar i, j, l, kk ;
+ halfword q, r, s, qq, qr, holdr ;
+ halfword bchar ;
+ short xchgchar[11] ;
+ schar addchar, xchgi, xchgk, xchghu ;
+ halfword spechyf ;
+ integer sij ;
+ halfword majortail, minortail ;
+ ASCIIcode c ;
+ schar cloc ;
+ integer rcount ;
+ halfword hyfnode ;
+ triepointer z ;
+ integer v ;
+ boolean funktioniert ;
+ integer zerleg ;
+ hyphpointer h ;
+ strnumber k ;
+ poolpointer u ;
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ hyf [ j ] = 0 ;
+ while ( j++ < for_end ) ; }
+ h = hc [ 1 ] ;
+ incr ( hn ) ;
+ hc [ hn ] = curlang ;
+ {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do
+ h = ( h + h + hc [ j ] ) % 607 ;
+ while ( j++ < for_end ) ; }
+ while ( true ) {
+
+ k = hyphword [ h ] ;
+ if ( k == 0 )
+ goto lab45 ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn )
+ goto lab45 ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn )
+ {
+ j = 1 ;
+ u = strstart [ k ] ;
+ do {
+ if ( strpool [ u ] < hc [ j ] )
+ goto lab45 ;
+ if ( strpool [ u ] > hc [ j ] )
+ goto lab30 ;
+ incr ( j ) ;
+ incr ( u ) ;
+ } while ( ! ( j > hn ) ) ;
+ s = hyphlist [ h ] ;
+ while ( s != 0 ) {
+
+ hyf [ mem [ s ] .hh .v.LH ] = 1 ;
+ s = mem [ s ] .hh .v.RH ;
+ }
+ decr ( hn ) ;
+ goto lab40 ;
+ }
+ lab30: ;
+ if ( h > 0 )
+ decr ( h ) ;
+ else h = 607 ;
+ }
+ lab45: decr ( hn ) ;
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ hcsi [ j ] = ktab [ hc [ j ] ] ;
+ while ( j++ < for_end ) ; }
+ if ( odd ( eqtb [ 12719 ] .cint / 2 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 2 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hc [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hc [ j ] ) , logfile );
+ }
+ while ( j++ < for_end ) ; }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c\n", ':' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c\n", ':' ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc_si:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc_si:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , logfile );
+ }
+ while ( j++ < for_end ) ; }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c\n", ':' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c\n", ':' ) ;
+ }
+ }
+ if ( odd ( eqtb [ 12719 ] .cint / 4 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 4 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "< decimal character codes >" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "< decimal character codes >" ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%ld%c", (long)hc [ j ] , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%ld%c", (long)hc [ j ] , '-' ) ;
+ }
+ if ( ( ( j + 1 ) % 16 ) == 0 )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " " ) ;
+ }
+ }
+ }
+ while ( j++ < for_end ) ; }
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc_si:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc_si:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ;
+ }
+ if ( ( ( j + 1 ) % 16 ) == 0 )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " " ) ;
+ }
+ }
+ }
+ while ( j++ < for_end ) ; }
+ println () ;
+ println () ;
+ }
+ abteilen ( hcsi , hyfsi , hn , funktioniert , zerleg ) ;
+ {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do
+ {
+ hyfdisc [ j ] = 0 ;
+ hyfpen [ j ] = 10000 ;
+ }
+ while ( j++ < for_end ) ; }
+ if ( funktioniert )
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( hyfsi [ j ] == neben )
+ hyfpen [ j ] = eqtb [ 12718 ] .cint ;
+ else if ( hyfsi [ j ] == haupt )
+ hyfpen [ j ] = eqtb [ 12666 ] .cint ;
+ else if ( hyfsi [ j ] == nebenck )
+ {
+ hyfpen [ j + 1 ] = eqtb [ 12718 ] .cint ;
+ s = getnode ( 2 ) ;
+ mem [ s ] .hh.b0 = 7 ;
+ hyfdisc [ j + 1 ] = s ;
+ mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12718 ] .cint ) ;
+ s = mem [ s + 1 ] .hh .v.LH ;
+ mem [ s ] .hh.b1 = 0 ;
+ mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j + 2 ] ) ;
+ mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ;
+ s = hyfdisc [ j + 1 ] ;
+ mem [ s + 1 ] .hh .v.RH = 0 ;
+ mem [ s ] .hh .v.RH = 0 ;
+ }
+ else if ( hyfsi [ j ] == haupt3 )
+ {
+ hyfpen [ j - 1 ] = eqtb [ 12666 ] .cint ;
+ s = getnode ( 2 ) ;
+ mem [ s ] .hh.b0 = 7 ;
+ hyfdisc [ j - 1 ] = s ;
+ mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12666 ] .cint ) ;
+ s = mem [ s + 1 ] .hh .v.LH ;
+ mem [ s ] .hh.b1 = 1 ;
+ mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j ] ) ;
+ mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ;
+ s = hyfdisc [ j - 1 ] ;
+ mem [ s + 1 ] .hh .v.RH = 0 ;
+ mem [ s ] .hh .v.RH = 0 ;
+ }
+ }
+ while ( j++ < for_end ) ; }
+ if ( odd ( eqtb [ 12719 ] .cint / 8 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 8 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) ;
+ }
+ }
+ if ( funktioniert )
+ {
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ if ( hyfpen [ j ] != 10000 )
+ {
+ if ( hyfdisc [ j ] != 0 )
+ {
+ if ( mem [ mem [ hyfdisc [ j ] + 1 ] .hh .v.LH ] .hh.b1 == 0 )
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ;
+ }
+ else {
+
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ;
+ }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hu [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hu [ j ] ) , logfile );
+ }
+ if ( hyfpen [ j ] == eqtb [ 12666 ] .cint )
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( '=' , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( '=' , logfile );
+ }
+ else {
+
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( '-' , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( '-' , logfile );
+ }
+ }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hu [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hu [ j ] ) , logfile );
+ }
+ }
+ while ( j++ < for_end ) ; }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " no hyphens were found in this word!" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " no hyphens were found in this word!" ) ;
+ }
+ }
+ println () ;
+ }
+ goto lab31 ;
+ lab40: hyfpen [ 0 ] = 10000 ;
+ {register integer for_end; j = 1 ; for_end = hn ; if ( j <= for_end) do
+ if ( odd ( hyf [ j ] ) )
+ hyfpen [ j ] = eqtb [ 12666 ] .cint ;
+ else hyfpen [ j ] = 10000 ;
+ while ( j++ < for_end ) ; }
+ lab31: ;
+ {register integer for_end; j = lhyf ; for_end = hn - rhyf ; if ( j <=
+ for_end) do
+ if ( hyfpen [ j ] != 10000 )
+ goto lab41 ;
+ while ( j++ < for_end ) ; }
+ return ;
+ lab41: ;
+ q = mem [ hb ] .hh .v.RH ;
+ mem [ hb ] .hh .v.RH = 0 ;
+ r = mem [ ha ] .hh .v.RH ;
+ mem [ ha ] .hh .v.RH = 0 ;
+ bchar = 256 ;
+ holdr = newkern ( 1235 ) ;
+ mem [ holdr ] .hh .v.RH = r ;
+ if ( ! ( hb >= himemmin ) )
+ if ( mem [ hb ] .hh.b0 == 6 )
+ if ( odd ( mem [ hb ] .hh.b1 ) )
+ bchar = fontbchar [ hf ] ;
+ if ( ( ha >= himemmin ) )
+ if ( mem [ ha ] .hh.b0 != hf )
+ goto lab42 ;
+ else {
+
+ initlist = ha ;
+ initlig = false ;
+ hu [ 0 ] = mem [ ha ] .hh.b1 ;
+ }
+ else if ( isdirtyumlaut ( ha ) )
+ {
+ if ( getfontof ( ha ) != hf )
+ goto lab42 ;
+ else {
+
+ initlist = ha ;
+ initlig = false ;
+ hu [ 0 ] = getcharof ( ha ) ;
+ }
+ }
+ else if ( mem [ ha ] .hh.b0 == 6 )
+ if ( mem [ ha + 1 ] .hh.b0 != hf )
+ goto lab42 ;
+ else {
+
+ initlist = mem [ ha + 1 ] .hh .v.RH ;
+ initlig = true ;
+ initlft = ( mem [ ha ] .hh.b1 > 1 ) ;
+ hu [ 0 ] = mem [ ha + 1 ] .hh.b1 ;
+ if ( initlist == 0 )
+ if ( initlft )
+ {
+ hu [ 0 ] = 256 ;
+ initlig = false ;
+ }
+ freenode ( ha , 2 ) ;
+ }
+ else {
+
+ if ( ! ( r >= himemmin ) )
+ if ( mem [ r ] .hh.b0 == 6 )
+ if ( mem [ r ] .hh.b1 > 1 )
+ goto lab42 ;
+ j = 1 ;
+ s = ha ;
+ initlist = 0 ;
+ goto lab50 ;
+ }
+ s = curp ;
+ while ( mem [ s ] .hh .v.RH != ha ) s = mem [ s ] .hh .v.RH ;
+ j = 0 ;
+ goto lab50 ;
+ lab42: s = ha ;
+ j = 0 ;
+ hu [ 0 ] = 256 ;
+ initlig = false ;
+ initlist = 0 ;
+ lab50: qq = holdr ;
+ {register integer for_end; kk = j ; for_end = hn ; if ( kk <= for_end) do
+ if ( dirtyumlaut [ kk ] != 0 )
+ {
+ while ( mem [ qq ] .hh .v.RH != dirtyumlaut [ kk ] ) qq = mem [ qq ] .hh
+ .v.RH ;
+ qr = mem [ qq ] .hh .v.RH ;
+ {register integer for_end; i = 1 ; for_end = mem [ qr ] .hh.b1 ; if ( i
+ <= for_end) do
+ if ( qr != 0 )
+ qr = mem [ qr ] .hh .v.RH ;
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "...??..X --> ????? !" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "...??..X --> ????? !" ) ;
+ }
+ }
+ while ( i++ < for_end ) ; }
+ if ( qr != 0 )
+ {
+ mem [ qq ] .hh .v.RH = mem [ qr ] .hh .v.RH ;
+ mem [ qr ] .hh .v.RH = 0 ;
+ }
+ else mem [ qq ] .hh .v.RH = 0 ;
+ }
+ while ( kk++ < for_end ) ; }
+ if ( dirtyumlaut [ -1 ] != 0 )
+ {
+ qq = holdr ;
+ while ( ( mem [ qq ] .hh .v.RH != dirtyumlaut [ -1 ] ) && ( mem [ qq ] .hh
+ .v.RH != 0 ) ) qq = mem [ qq ] .hh .v.RH ;
+ if ( mem [ qq ] .hh .v.RH == dirtyumlaut [ -1 ] )
+ {
+ mem [ qq ] .hh .v.RH = mem [ dirtyumlaut [ -1 ] ] .hh .v.RH ;
+ mem [ dirtyumlaut [ -1 ] ] .hh .v.RH = 0 ;
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " *** ERROR: node list is damaged! " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " *** ERROR: node list is damaged! " ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ;
+ }
+ }
+ }
+ r = holdr ;
+ while ( mem [ r ] .hh .v.RH != 0 ) {
+
+ if ( ( memmin <= mem [ r ] .hh .v.RH ) && ( mem [ r ] .hh .v.RH <= memmax
+ ) )
+ r = mem [ r ] .hh .v.RH ;
+ else {
+
+ (void) putc('\n', logfile );
+ (void) putc('\n', stdout );
+ (void) fprintf( logfile , "%s\n", "???$ - ERROR in node list!" ) ;
+ (void) fprintf( stdout , "%s\n", "???$ - ERROR in node list!" ) ;
+ kk = depththreshold ;
+ l = breadthmax ;
+ depththreshold = 100 ;
+ breadthmax = 100 ;
+ shownodelist ( holdr ) ;
+ mem [ r ] .hh .v.RH = 0 ;
+ depththreshold = kk ;
+ breadthmax = l ;
+ }
+ }
+ flushnodelist ( holdr ) ;
+ if ( dirtyumlaut [ -1 ] != 0 )
+ {
+ mem [ s ] .hh .v.RH = dirtyumlaut [ -1 ] ;
+ s = mem [ s ] .hh .v.RH ;
+ }
+ do {
+ if ( dirtyumlaut [ j ] != 0 )
+ {
+ mem [ s ] .hh .v.RH = dirtyumlaut [ j ] ;
+ while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ j = j + 1 ;
+ hyphenpassed = 0 ;
+ if ( hyfpen [ j - 1 ] != 10000 )
+ {
+ l = j ;
+ hyphenpassed = j - 1 ;
+ if ( odd ( eqtb [ 12719 ] .cint / 16 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 16 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ;
+ }
+ }
+ }
+ }
+ else {
+
+ l = j ;
+ j = reconstitute ( j , hn , bchar , hyfchar ) + 1 ;
+ if ( hyphenpassed == 0 )
+ {
+ mem [ s ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ;
+ if ( hyfpen [ j - 1 ] != 10000 )
+ {
+ l = j ;
+ hyphenpassed = j - 1 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ }
+ }
+ }
+ if ( hyphenpassed > 0 )
+ do {
+ r = getnode ( 2 ) ;
+ mem [ r ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ mem [ r ] .hh.b0 = 7 ;
+ majortail = r ;
+ rcount = 0 ;
+ while ( mem [ majortail ] .hh .v.RH > 0 ) {
+
+ majortail = mem [ majortail ] .hh .v.RH ;
+ incr ( rcount ) ;
+ }
+ i = hyphenpassed ;
+ hyf [ i ] = 0 ;
+ if ( ( hyfpen [ i ] != 10000 ) && ( hyfpen [ i ] != eqtb [ 12666 ] .cint
+ ) )
+ minortail = newpenalty ( hyfpen [ i ] ) ;
+ else minortail = 0 ;
+ hyfpen [ i ] = 10000 ;
+ mem [ r + 1 ] .hh .v.LH = minortail ;
+ hyfnode = newcharacter ( hf , hyfchar ) ;
+ xchgk = i ;
+ if ( hyfdisc [ xchgk ] != 0 )
+ {
+ spechyf = mem [ hyfdisc [ xchgk ] + 1 ] .hh .v.LH ;
+ addchar = mem [ spechyf ] .hh.b1 ;
+ xchgi = 1 ;
+ do {
+ spechyf = mem [ spechyf ] .hh .v.RH ;
+ if ( spechyf != 0 )
+ {
+ xchgchar [ xchgi ] = mem [ spechyf ] .hh.b1 ;
+ incr ( xchgi ) ;
+ }
+ } while ( ! ( spechyf == 0 ) ) ;
+ if ( hyfnode != 0 )
+ {
+ xchgchar [ xchgi ] = hyfchar ;
+ {
+ mem [ hyfnode ] .hh .v.RH = avail ;
+ avail = hyfnode ;
+ ;
+#ifdef STAT
+ decr ( dynused ) ;
+#endif /* STAT */
+ }
+ }
+ else decr ( xchgi ) ;
+ xchghu = i - xchgi + addchar + 2 ;
+ {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk
+ <= for_end) do
+ {
+ xchgchar [ 0 ] = hu [ xchghu ] ;
+ hu [ xchghu ] = xchgchar [ xchgk ] ;
+ xchgchar [ xchgk ] = xchgchar [ 0 ] ;
+ incr ( xchghu ) ;
+ }
+ while ( xchgk++ < for_end ) ; }
+ xchgk = i ;
+ i = xchghu - 1 ;
+ xchghu = xchghu - xchgi ;
+ }
+ else if ( hyfnode != 0 )
+ {
+ incr ( i ) ;
+ c = hu [ i ] ;
+ hu [ i ] = hyfchar ;
+ {
+ mem [ hyfnode ] .hh .v.RH = avail ;
+ avail = hyfnode ;
+ ;
+#ifdef STAT
+ decr ( dynused ) ;
+#endif /* STAT */
+ }
+ }
+ while ( l <= i ) {
+
+ l = reconstitute ( l , i , fontbchar [ hf ] , 256 ) + 1 ;
+ if ( mem [ memtop - 4 ] .hh .v.RH > 0 )
+ {
+ if ( minortail == 0 )
+ mem [ r + 1 ] .hh .v.LH = mem [ memtop - 4 ] .hh .v.RH ;
+ else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ minortail = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [
+ minortail ] .hh .v.RH ;
+ }
+ }
+ if ( hyfdisc [ xchgk ] != 0 )
+ {
+ i = xchgk ;
+ l = i + 1 ;
+ {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk
+ <= for_end) do
+ {
+ hu [ xchghu ] = xchgchar [ xchgk ] ;
+ incr ( xchghu ) ;
+ }
+ while ( xchgk++ < for_end ) ; }
+ }
+ else if ( hyfnode != 0 )
+ {
+ hu [ i ] = c ;
+ l = i ;
+ decr ( i ) ;
+ }
+ minortail = 0 ;
+ mem [ r + 1 ] .hh .v.RH = 0 ;
+ cloc = 0 ;
+ if ( bcharlabel [ hf ] < fontmemsize )
+ {
+ decr ( l ) ;
+ c = hu [ l ] ;
+ cloc = l ;
+ hu [ l ] = 256 ;
+ }
+ while ( l < j ) {
+
+ do {
+ l = reconstitute ( l , hn , bchar , 256 ) + 1 ;
+ if ( cloc > 0 )
+ {
+ hu [ cloc ] = c ;
+ cloc = 0 ;
+ }
+ if ( mem [ memtop - 4 ] .hh .v.RH > 0 )
+ {
+ if ( minortail == 0 )
+ mem [ r + 1 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ minortail = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [
+ minortail ] .hh .v.RH ;
+ }
+ } while ( ! ( l >= j ) ) ;
+ while ( l > j ) {
+
+ j = reconstitute ( j , hn , bchar , 256 ) + 1 ;
+ mem [ majortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ majortail ] .hh .v.RH > 0 ) {
+
+ majortail = mem [ majortail ] .hh .v.RH ;
+ incr ( rcount ) ;
+ }
+ }
+ }
+ if ( rcount > 127 )
+ {
+ mem [ s ] .hh .v.RH = mem [ r ] .hh .v.RH ;
+ mem [ r ] .hh .v.RH = 0 ;
+ flushnodelist ( r ) ;
+ }
+ else {
+
+ mem [ s ] .hh .v.RH = r ;
+ mem [ r ] .hh.b1 = rcount ;
+ }
+ s = majortail ;
+ hyphenpassed = j - 1 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ } while ( ! ( ( hyfpen [ j - 1 ] == 10000 ) ) ) ;
+ } while ( ! ( j > hn ) ) ;
+ mem [ s ] .hh .v.RH = q ;
+ siq = s ;
+ {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do
+ if ( hyfdisc [ j ] != 0 )
+ {
+ flushnodelist ( hyfdisc [ j ] ) ;
+ }
+ while ( j++ < for_end ) ; }
+ flushlist ( initlist ) ;
+}
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h b/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h
new file mode 100644
index 0000000000..d53c464953
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h
@@ -0,0 +1,485 @@
+#undef TRIP
+#undef TRAP
+#define STAT
+#undef DEBUG
+#include "../common/texmf.h"
+#define memmax 262140L
+#define memmin 0
+#define bufsize 3000
+#define errorline 79
+#define halferrorline 50
+#define maxprintline 79
+#define stacksize 300
+#define maxinopen 15
+#define fontmax 255
+#define fontmemsize 72000L
+#define paramsize 60
+#define nestsize 40
+#define maxstrings 7500
+#define stringvacancies 74000L
+#define poolsize 100000L
+#define savesize 4000
+#define triesize 24000
+#define trieopsize 750
+#define negtrieopsize -750
+#define mintrieop 0
+#define maxtrieop 500
+#define dvibufsize 16384
+#define poolname "sitex.pool"
+#define memtop 262140L
+#define maxwl 64
+#define sonderzeichen 0
+#define bsta 1
+#define bstb 2
+#define bstc 3
+#define bstd 4
+#define bste 5
+#define bstf 6
+#define bstg 7
+#define bsth 8
+#define bsti 9
+#define bstj 10
+#define bstk 11
+#define bstl 12
+#define bstm 13
+#define bstn 14
+#define bsto 15
+#define bstp 16
+#define bstq 17
+#define bstr 18
+#define bsts 19
+#define bstt 20
+#define bstu 21
+#define bstv 22
+#define bstw 23
+#define bstx 24
+#define bsty 25
+#define bstz 26
+#define bstae 27
+#define bstoe 28
+#define bstue 29
+#define bstsz 30
+#define trennzeichen 31
+#define keine 1
+#define neben 2
+#define nebenck 3
+#define haupt 4
+#define haupt3 5
+#define tabsize 8191
+#define specletterID 4321
+#define voka 1
+#define voke 2
+#define voki 3
+#define voko 4
+#define voku 5
+#define vokae 6
+#define vokoe 7
+#define vokue 8
+#define vokie 9
+#define vokai 10
+#define vokei 11
+#define vokau 12
+#define vokaeu 13
+#define vokeu 14
+#define voky 15
+#define kons 16
+typedef unsigned char ASCIIcode ;
+typedef unsigned char eightbits ;
+typedef integer poolpointer ;
+typedef integer strnumber ;
+typedef unsigned char packedASCIIcode ;
+typedef integer scaled ;
+typedef integer nonnegativeinteger ;
+typedef schar smallnumber ;
+typedef unsigned char quarterword ;
+typedef integer halfword ;
+typedef schar twochoices ;
+typedef schar fourchoices ;
+#include "memory.h"
+typedef schar glueord ;
+typedef struct {
+ short modefield ;
+ halfword headfield, tailfield ;
+ integer pgfield, mlfield ;
+ memoryword auxfield ;
+ quarterword lhmfield, rhmfield ;
+} liststaterecord ;
+typedef schar groupcode ;
+typedef struct {
+ quarterword statefield, indexfield ;
+ halfword startfield, locfield, limitfield, namefield ;
+} instaterecord ;
+typedef integer internalfontnumber ;
+typedef integer fontindex ;
+typedef integer dviindex ;
+typedef integer trieopcode ;
+typedef integer triepointer ;
+typedef eightbits string80 [81] ;
+typedef eightbits buchstabe ;
+typedef short aword [maxwl + 1] ;
+typedef aword wort ;
+typedef boolean sperrvektor [maxwl + 1] ;
+typedef boolean dudt [maxwl + 1] ;
+typedef integer trennvektor [maxwl + 1] ;
+typedef buchstabe ktabtype [256] ;
+typedef unsigned long verdschlue ;
+typedef verdschlue varr [maxwl + 1] ;
+typedef integer intarr [maxwl + 1] ;
+typedef struct {
+ boolean ausnahme ;
+ boolean untrennbar ;
+ integer erste ;
+ integer zweite ;
+ boolean endung, vorsilbe, stamm, ehervor, stammallein ;
+} infotype ;
+typedef eightbits infobyte ;
+typedef struct {
+ verdschlue tabv ;
+ infobyte tabb ;
+ boolean frei ;
+ boolean wiederfrei ;
+} tableentry ;
+typedef eightbits hashelement [4] ;
+typedef hashelement htabtype [tabsize + 1] ;
+typedef short hyphpointer ;
+EXTERN integer bad ;
+EXTERN ASCIIcode xord[256] ;
+EXTERN ASCIIcode xchr[256] ;
+EXTERN char nameoffile[FILENAMESIZE + 1] ;
+EXTERN integer namelength ;
+EXTERN ASCIIcode buffer[bufsize + 1] ;
+EXTERN integer first ;
+EXTERN integer last ;
+EXTERN integer maxbufstack ;
+EXTERN packedASCIIcode strpool[poolsize + 1] ;
+EXTERN poolpointer strstart[maxstrings + 1] ;
+EXTERN poolpointer poolptr ;
+EXTERN strnumber strptr ;
+EXTERN poolpointer initpoolptr ;
+EXTERN strnumber initstrptr ;
+#ifdef INITEX
+EXTERN alphafile poolfile ;
+#endif /* INITEX */
+EXTERN alphafile logfile ;
+EXTERN schar selector ;
+EXTERN schar dig[23] ;
+EXTERN integer tally ;
+EXTERN integer termoffset ;
+EXTERN integer fileoffset ;
+EXTERN ASCIIcode trickbuf[errorline + 1] ;
+EXTERN integer trickcount ;
+EXTERN integer firstcount ;
+EXTERN schar interaction ;
+EXTERN boolean deletionsallowed ;
+EXTERN schar history ;
+EXTERN schar errorcount ;
+EXTERN strnumber helpline[6] ;
+EXTERN schar helpptr ;
+EXTERN boolean useerrhelp ;
+EXTERN integer interrupt ;
+EXTERN boolean OKtointerrupt ;
+EXTERN boolean aritherror ;
+EXTERN scaled remainder ;
+EXTERN halfword tempptr ;
+EXTERN memoryword
+#define zmem (zzzaa - (int)(memmin))
+ zzzaa[memmax - memmin + 1] ;
+EXTERN halfword lomemmax ;
+EXTERN halfword himemmin ;
+EXTERN integer varused, dynused ;
+EXTERN halfword avail ;
+EXTERN halfword memend ;
+EXTERN halfword rover ;
+#ifdef DEBUG
+EXTERN boolean
+#define freearr (zzzab - (int)(memmin))
+ zzzab[memmax - memmin + 1] ;
+EXTERN boolean
+#define wasfree (zzzac - (int)(memmin))
+ zzzac[memmax - memmin + 1] ;
+EXTERN halfword wasmemend, waslomax, washimin ;
+EXTERN boolean panicking ;
+#endif /* DEBUG */
+EXTERN integer fontinshortdisplay ;
+EXTERN integer depththreshold ;
+EXTERN integer breadthmax ;
+EXTERN liststaterecord nest[nestsize + 1] ;
+EXTERN integer nestptr ;
+EXTERN integer maxneststack ;
+EXTERN liststaterecord curlist ;
+EXTERN short shownmode ;
+EXTERN schar oldsetting ;
+EXTERN memoryword zeqtb[13510] ;
+EXTERN quarterword
+#define xeqlevel (zzzad -12663)
+ zzzad[847] ;
+EXTERN twohalves
+#define hash (zzzae -514)
+ zzzae[9767] ;
+EXTERN halfword hashused ;
+EXTERN boolean nonewcontrolsequence ;
+EXTERN integer cscount ;
+EXTERN memoryword savestack[savesize + 1] ;
+EXTERN integer saveptr ;
+EXTERN integer maxsavestack ;
+EXTERN quarterword curlevel ;
+EXTERN groupcode curgroup ;
+EXTERN integer curboundary ;
+EXTERN integer magset ;
+EXTERN eightbits curcmd ;
+EXTERN halfword curchr ;
+EXTERN halfword curcs ;
+EXTERN halfword curtok ;
+EXTERN instaterecord inputstack[stacksize + 1] ;
+EXTERN integer inputptr ;
+EXTERN integer maxinstack ;
+EXTERN instaterecord curinput ;
+EXTERN integer inopen ;
+EXTERN integer openparens ;
+EXTERN alphafile inputfile[maxinopen + 1] ;
+EXTERN integer line ;
+EXTERN integer linestack[maxinopen + 1] ;
+EXTERN schar scannerstatus ;
+EXTERN halfword warningindex ;
+EXTERN halfword defref ;
+EXTERN halfword paramstack[paramsize + 1] ;
+EXTERN integer paramptr ;
+EXTERN integer maxparamstack ;
+EXTERN integer alignstate ;
+EXTERN integer baseptr ;
+EXTERN halfword parloc ;
+EXTERN halfword partoken ;
+EXTERN boolean forceeof ;
+EXTERN halfword curmark[5] ;
+EXTERN schar longstate ;
+EXTERN halfword pstack[9] ;
+EXTERN integer curval ;
+EXTERN schar curvallevel ;
+EXTERN smallnumber radix ;
+EXTERN glueord curorder ;
+EXTERN alphafile readfile[16] ;
+EXTERN schar readopen[17] ;
+EXTERN halfword condptr ;
+EXTERN schar iflimit ;
+EXTERN smallnumber curif ;
+EXTERN integer ifline ;
+EXTERN integer skipline ;
+EXTERN strnumber curname ;
+EXTERN strnumber curarea ;
+EXTERN strnumber curext ;
+EXTERN poolpointer areadelimiter ;
+EXTERN poolpointer extdelimiter ;
+EXTERN integer formatdefaultlength ;
+EXTERN ccharpointer TEXformatdefault ;
+EXTERN boolean nameinprogress ;
+EXTERN strnumber jobname ;
+EXTERN boolean logopened ;
+EXTERN bytefile dvifile ;
+EXTERN strnumber outputfilename ;
+EXTERN strnumber logname ;
+EXTERN bytefile tfmfile ;
+EXTERN memoryword fontinfo[fontmemsize + 1] ;
+EXTERN fontindex fmemptr ;
+EXTERN internalfontnumber fontptr ;
+EXTERN fourquarters fontcheck[fontmax + 1] ;
+EXTERN scaled fontsize[fontmax + 1] ;
+EXTERN scaled fontdsize[fontmax + 1] ;
+EXTERN halfword fontparams[fontmax + 1] ;
+EXTERN strnumber fontname[fontmax + 1] ;
+EXTERN strnumber fontarea[fontmax + 1] ;
+EXTERN eightbits fontbc[fontmax + 1] ;
+EXTERN eightbits fontec[fontmax + 1] ;
+EXTERN halfword fontglue[fontmax + 1] ;
+EXTERN boolean fontused[fontmax + 1] ;
+EXTERN integer hyphenchar[fontmax + 1] ;
+EXTERN integer skewchar[fontmax + 1] ;
+EXTERN fontindex bcharlabel[fontmax + 1] ;
+EXTERN short fontbchar[fontmax + 1] ;
+EXTERN short fontfalsebchar[fontmax + 1] ;
+EXTERN integer charbase[fontmax + 1] ;
+EXTERN integer widthbase[fontmax + 1] ;
+EXTERN integer heightbase[fontmax + 1] ;
+EXTERN integer depthbase[fontmax + 1] ;
+EXTERN integer italicbase[fontmax + 1] ;
+EXTERN integer ligkernbase[fontmax + 1] ;
+EXTERN integer kernbase[fontmax + 1] ;
+EXTERN integer extenbase[fontmax + 1] ;
+EXTERN integer parambase[fontmax + 1] ;
+EXTERN fourquarters nullcharacter ;
+EXTERN integer totalpages ;
+EXTERN scaled maxv ;
+EXTERN scaled maxh ;
+EXTERN integer maxpush ;
+EXTERN integer lastbop ;
+EXTERN integer deadcycles ;
+EXTERN boolean doingleaders ;
+EXTERN quarterword c, f ;
+EXTERN scaled ruleht, ruledp, rulewd ;
+EXTERN halfword g ;
+EXTERN integer lq, lr ;
+EXTERN eightbits dvibuf[dvibufsize + 1] ;
+EXTERN dviindex halfbuf ;
+EXTERN dviindex dvilimit ;
+EXTERN dviindex dviptr ;
+EXTERN integer dvioffset ;
+EXTERN integer dvigone ;
+EXTERN halfword downptr, rightptr ;
+EXTERN scaled dvih, dviv ;
+EXTERN scaled curh, curv ;
+EXTERN internalfontnumber dvif ;
+EXTERN integer curs ;
+EXTERN scaled totalstretch[4], totalshrink[4] ;
+EXTERN integer lastbadness ;
+EXTERN halfword adjusttail ;
+EXTERN integer packbeginline ;
+EXTERN twohalves emptyfield ;
+EXTERN fourquarters nulldelimiter ;
+EXTERN halfword curmlist ;
+EXTERN smallnumber curstyle ;
+EXTERN smallnumber cursize ;
+EXTERN scaled curmu ;
+EXTERN boolean mlistpenalties ;
+EXTERN internalfontnumber curf ;
+EXTERN quarterword curc ;
+EXTERN fourquarters curi ;
+EXTERN integer magicoffset ;
+EXTERN halfword curalign ;
+EXTERN halfword curspan ;
+EXTERN halfword curloop ;
+EXTERN halfword alignptr ;
+EXTERN halfword curhead, curtail ;
+EXTERN halfword justbox ;
+EXTERN halfword passive ;
+EXTERN halfword printednode ;
+EXTERN halfword passnumber ;
+EXTERN scaled activewidth[7] ;
+EXTERN scaled curactivewidth[7] ;
+EXTERN scaled background[7] ;
+EXTERN scaled breakwidth[7] ;
+EXTERN boolean noshrinkerroryet ;
+EXTERN halfword curp ;
+EXTERN boolean secondpass ;
+EXTERN boolean finalpass ;
+EXTERN integer threshold ;
+EXTERN integer minimaldemerits[4] ;
+EXTERN integer minimumdemerits ;
+EXTERN halfword bestplace[4] ;
+EXTERN halfword bestplline[4] ;
+EXTERN scaled discwidth ;
+EXTERN halfword easyline ;
+EXTERN halfword lastspecialline ;
+EXTERN scaled firstwidth ;
+EXTERN scaled secondwidth ;
+EXTERN scaled firstindent ;
+EXTERN scaled secondindent ;
+EXTERN halfword bestbet ;
+EXTERN integer fewestdemerits ;
+EXTERN halfword bestline ;
+EXTERN integer actuallooseness ;
+EXTERN integer linediff ;
+EXTERN aword hc ;
+EXTERN smallnumber hn ;
+EXTERN halfword ha, hb ;
+EXTERN integer hyfdebi, hyfdebj ;
+EXTERN boolean hyfdebb ;
+EXTERN halfword sip, siq, sir, sis ;
+EXTERN internalfontnumber hf ;
+EXTERN short hu[64] ;
+EXTERN integer hyfchar ;
+EXTERN ASCIIcode curlang ;
+EXTERN integer lhyf, rhyf ;
+EXTERN halfword
+#define dirtyumlaut (zzzaf +1)
+ zzzaf[66] ;
+EXTERN schar hyf[65] ;
+EXTERN halfword initlist ;
+EXTERN boolean initlig ;
+EXTERN boolean initlft ;
+EXTERN integer hyfpen[65] ;
+EXTERN trennvektor hyfsi ;
+EXTERN wort hcsi ;
+EXTERN halfword hyfdisc[65] ;
+EXTERN smallnumber hyphenpassed ;
+EXTERN halfword curl, curr ;
+EXTERN halfword curq ;
+EXTERN halfword ligstack ;
+EXTERN boolean ligaturepresent ;
+EXTERN boolean lfthit, rthit ;
+EXTERN halfword trietrl[triesize + 1] ;
+EXTERN halfword trietro[triesize + 1] ;
+EXTERN quarterword trietrc[triesize + 1] ;
+EXTERN smallnumber hyfdistance[trieopsize + 1] ;
+EXTERN smallnumber hyfnum[trieopsize + 1] ;
+EXTERN quarterword hyfnext[trieopsize + 1] ;
+EXTERN integer opstart[256] ;
+EXTERN ktabtype ktab ;
+EXTERN htabtype htab ;
+EXTERN integer anzahl ;
+EXTERN alphafile hashfile ;
+EXTERN integer kombtab[6][6] ;
+EXTERN boolean konsonant[31] ;
+EXTERN integer revtab[256] ;
+EXTERN strnumber hyphword[608] ;
+EXTERN halfword hyphlist[608] ;
+EXTERN hyphpointer hyphcount ;
+#ifdef INITEX
+EXTERN integer
+#define trieophash (zzzag - (int)(negtrieopsize))
+ zzzag[trieopsize - negtrieopsize + 1] ;
+EXTERN trieopcode trieused[256] ;
+EXTERN ASCIIcode trieoplang[trieopsize + 1] ;
+EXTERN trieopcode trieopval[trieopsize + 1] ;
+EXTERN integer trieopptr ;
+#endif /* INITEX */
+EXTERN trieopcode maxopused ;
+EXTERN boolean smallop ;
+#ifdef INITEX
+EXTERN packedASCIIcode triec[triesize + 1] ;
+EXTERN trieopcode trieo[triesize + 1] ;
+EXTERN triepointer triel[triesize + 1] ;
+EXTERN triepointer trier[triesize + 1] ;
+EXTERN triepointer trieptr ;
+EXTERN triepointer triehash[triesize + 1] ;
+#endif /* INITEX */
+#ifdef INITEX
+EXTERN boolean trietaken[triesize + 1] ;
+EXTERN triepointer triemin[256] ;
+EXTERN triepointer triemax ;
+EXTERN boolean trienotready ;
+#endif /* INITEX */
+EXTERN scaled bestheightplusdepth ;
+EXTERN halfword pagetail ;
+EXTERN schar pagecontents ;
+EXTERN scaled pagemaxdepth ;
+EXTERN halfword bestpagebreak ;
+EXTERN integer leastpagecost ;
+EXTERN scaled bestsize ;
+EXTERN scaled pagesofar[8] ;
+EXTERN halfword lastglue ;
+EXTERN integer lastpenalty ;
+EXTERN scaled lastkern ;
+EXTERN integer insertpenalties ;
+EXTERN boolean outputactive ;
+EXTERN internalfontnumber mainf ;
+EXTERN fourquarters maini ;
+EXTERN fourquarters mainj ;
+EXTERN fontindex maink ;
+EXTERN halfword mainp ;
+EXTERN integer mains ;
+EXTERN halfword bchar ;
+EXTERN halfword falsebchar ;
+EXTERN boolean cancelboundary ;
+EXTERN boolean insdisc ;
+EXTERN halfword curbox ;
+EXTERN halfword aftertoken ;
+EXTERN boolean longhelpseen ;
+EXTERN strnumber formatident ;
+EXTERN wordfile fmtfile ;
+EXTERN integer readyalready ;
+EXTERN alphafile writefile[16] ;
+EXTERN boolean writeopen[18] ;
+EXTERN halfword writeloc ;
+EXTERN poolpointer editnamestart ;
+EXTERN integer editnamelength, editline, tfmtemp ;
+
+#include "coerce.h"
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c
new file mode 100644
index 0000000000..f4a956fd17
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c
@@ -0,0 +1,334 @@
+/*
+ * This program converts (mostly) the pseudo-Pascal generated by Tangle to C.
+ * The output depends on many C macros and some postprocessing by other
+ * programs.
+ *
+ * Arguments:
+ * -f: force strict interpretation of semantics of for stmt
+ * (never used with TeX and friends)
+ * -t: special optimizations for tex.p->tex.c
+ * -m: special optimizations for mf.p->mf.c
+ * -c: supply the base part of the name of the coerce.h file
+ * -h: supply the name of the standard header file
+ * -a: generate ANSI-style function prototypes
+ * -d: generate some additional debugging output
+ *
+ * The majority of this program (which includes ptoc.yacc and ptoc.lex)
+ * was written by Tomas Rokicki, with modifications by Tim Morgan, et al.
+ */
+
+#include <stdio.h>
+#include "web2cy.h"
+#include "web2c.h"
+
+
+/* Changing this value will probably stimulate bugs in some
+ preprocessors---those which want to put the expansion of a macro
+ entirely on one line. */
+#define max_line_length (78)
+#define max_strings (50000)
+#define hash_prime (101)
+#define sym_table_size (5000)
+#define unused (271828)
+
+/* Says whether to give voluminous progress reports. */
+boolean debug=FALSE;
+int indent = 0;
+int line_pos = 0;
+int last_brace = 0;
+int block_level = 0;
+int last_tok;
+int tex = 0, strict_for = 0, mf = 0;
+
+char safe_string[80];
+char var_list[500];
+char field_list[500];
+char last_id[80];
+char z_id[80];
+char next_temp[] = "zzzaa";
+char coerce_name[100] = "coerce.h";
+
+long last_i_num;
+int ii, l_s;
+long lower_bound, upper_bound;
+extern FILE *fopen();
+FILE *std;
+FILE *coerce;
+int pf_count = 1;
+#ifdef ANSI
+boolean ansi = TRUE;
+#else
+boolean ansi = FALSE;
+#endif
+
+char *std_header = "null.h"; /* Default include filename */
+
+char strings[max_strings];
+int hash_list[hash_prime];
+short global = 1;
+#ifdef MS_DOS
+struct sym_entry huge sym_table[sym_table_size];
+#else
+struct sym_entry sym_table[sym_table_size];
+#endif
+int next_sym_free = -1, next_string_free = 0;
+int mark_sym_free, mark_string_free;
+
+extern int yyleng;
+#ifdef FLEX
+extern char *yytext;
+#else /* LEX */
+#ifdef HP
+extern unsigned char yytext[];
+#else /* not HP */
+extern char yytext[];
+#endif /* not HP */
+#endif /* LEX */
+
+void find_next_temp()
+{
+ next_temp[4]++;
+ if (next_temp[4] > 'z') {
+ next_temp[4] = 'a';
+ next_temp[3]++;
+ }
+}
+
+void normal()
+{
+ std = stdout;
+}
+
+void new_line()
+{
+ if (!std)
+ return;
+ if (line_pos > 0) {
+ (void) putc('\n', std);
+ line_pos = 0;
+ }
+}
+
+void indent_line()
+{
+ new_line();
+}
+
+
+/* Output the string S to `std'. */
+
+void
+my_output (s)
+ char *s;
+{
+ int len = strlen (s);
+ int less_indent = 0;
+
+ if (!std)
+ return;
+
+ if (line_pos + len > max_line_length)
+ indent_line ();
+
+ if (indent > 1 && (strcmp(s, "case") == 0 || strcmp(s, "default") == 0))
+ less_indent = 2;
+
+ while (line_pos < indent * 2 - less_indent)
+ {
+ fputs (" ", std);
+ line_pos += 2;
+ }
+
+ (void) fprintf (std, "%s ", s);
+ line_pos += len + 1;
+
+ last_brace = (s[0] == '}');
+}
+
+void semicolon()
+{
+ if (!last_brace) {
+ my_output(";");
+ indent_line();
+ last_brace = 1;
+ }
+}
+
+
+/* Since a syntax error can never be recovered from, we exit here with
+ bad status. */
+
+void yyerror(s) char *s;
+{
+ (void) fflush(stdout);
+ (void) fprintf(stderr, " %s\n", s);
+ (void) fprintf(stderr, "Last token = %d, ", last_tok);
+ (void) fprintf(stderr, "error buffer = `%s',\n\t", yytext);
+ (void) fprintf(stderr, "last id = `%s' (", last_id);
+ ii = search_table(last_id);
+ if (ii == -1)
+ (void) fprintf(stderr, "not in symbol table");
+ else
+ switch (sym_table[ii].typ) {
+ case undef_id_tok:
+ (void) fprintf(stderr, "undefined");
+ break;
+ case var_id_tok:
+ (void) fprintf(stderr, "variable");
+ break;
+ case const_id_tok:
+ (void) fprintf(stderr, "constant");
+ break;
+ case type_id_tok:
+ (void) fprintf(stderr, "type");
+ break;
+ case proc_id_tok:
+ (void) fprintf(stderr, "parameterless procedure");
+ break;
+ case proc_param_tok:
+ (void) fprintf(stderr, "procedure with parameters");
+ break;
+ case fun_id_tok:
+ (void) fprintf(stderr, "parameterless function");
+ break;
+ case fun_param_tok:
+ (void) fprintf(stderr, "function with parameters");
+ break;
+ default:
+ (void) fprintf(stderr, "unknown!");
+ break;
+ }
+ fprintf(stderr, ").\n");
+ exit(1);
+ if (debug) {
+ (void) fprintf(stderr, "Next sym free = %d\n", next_sym_free);
+ (void) fprintf(stderr, "Mark sym = %d\n", mark_sym_free);
+ (void) fprintf(stderr, "Next string free = %d\n", next_string_free);
+ (void) fprintf(stderr, "Mark string = %d\n", mark_string_free);
+ }
+}
+
+int hash(id) char *id;
+{
+ register int i = 0, j;
+ for (j = 0; id[j] != 0; j++)
+ i = (i + i + id[j]) % hash_prime;
+ return (i);
+}
+
+int search_table(id) char *id;
+{
+ int ptr;
+ ptr = hash_list[hash(id)];
+ while (ptr != -1) {
+ if (strcmp(id, sym_table[ptr].id) == 0)
+ return (ptr);
+ else
+ ptr = sym_table[ptr].next;
+ }
+ return (-1);
+}
+
+int add_to_table(id) char *id;
+{
+ int h, ptr;
+ h = hash(id);
+ ptr = hash_list[h];
+ hash_list[h] = (++next_sym_free);
+ sym_table[next_sym_free].next = ptr;
+ sym_table[next_sym_free].val = unused;
+ sym_table[next_sym_free].id = strings + next_string_free;
+ sym_table[next_sym_free].var_formal = FALSE;
+ sym_table[next_sym_free].var_not_needed = FALSE;
+ (void) strcpy(strings + next_string_free, id);
+ next_string_free += strlen(id) + 1;
+ return (next_sym_free);
+}
+
+void remove_locals()
+{
+ int h, ptr;
+ for (h = 0; h < hash_prime; h++) {
+ next_sym_free = mark_sym_free;
+ next_string_free = mark_string_free;
+ ptr = hash_list[h];
+ while (ptr > next_sym_free)
+ ptr = sym_table[ptr].next;
+ hash_list[h] = ptr;
+ }
+ global = 1;
+}
+
+void
+mark()
+{
+ mark_sym_free = next_sym_free;
+ mark_string_free = next_string_free;
+ global = 0;
+}
+
+
+void
+initialize()
+{
+ register int i;
+
+ for (i = 0; i < hash_prime; hash_list[i++] = -1)
+ ;
+
+ normal ();
+
+ coerce = fopen (coerce_name, "w");
+ if (coerce == NULL)
+ {
+ perror (coerce_name);
+ exit (1);
+ }
+}
+
+void
+main (argc, argv)
+ int argc;
+ char *argv[];
+{
+ int error, i;
+
+ for (i=1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) {
+ case 't':
+ tex = TRUE;
+ break;
+ case 'm':
+ mf = TRUE;
+ break;
+ case 'f':
+ strict_for = TRUE;
+ break;
+ case 'h':
+ std_header = &argv[i][2];
+ break;
+ case 'd':
+ debug = TRUE;
+ break;
+ case 'a':
+ ansi = TRUE;
+ break;
+ case 'c':
+ (void) sprintf(coerce_name, "%s.h", &argv[i][2]);
+ break;
+ default:
+ fprintf(stderr, "Unknown option %s, ignored\n", argv[i]);
+ break;
+ }
+ else {
+ fprintf(stderr, "Unknown option %s, ignored\n", argv[i]);
+ }
+
+ initialize ();
+ error = yyparse ();
+ new_line ();
+
+ if (debug)
+ (void) fprintf(stderr, "%d symbols.\n", next_sym_free);
+
+ exit(error);
+}
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h
new file mode 100644
index 0000000000..44fe85653c
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h
@@ -0,0 +1,93 @@
+/* web2c.h: general includes for web2c. */
+
+#include <stdio.h>
+#include "site.h"
+#include "common.h"
+
+#ifdef SYSV
+#define bcopy(s,d,n) memcpy((d),(s),(n))
+#define bcmp(s1,s2,n) memcmp((s1),(s2),(n))
+#define bzero(s,n) memset((s),0,(n))
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else
+#ifdef sparc
+#include <alloca.h>
+#else
+char *alloca ();
+#endif
+#endif
+
+#define ex_32 (2)
+#define ex_real (3)
+#define max(a,b) ((a>b)?a:b)
+
+extern int indent;
+extern int line_pos;
+extern int last_brace;
+extern int block_level;
+extern int ii;
+extern int last_tok;
+
+extern char safe_string[80];
+extern char var_list[500];
+extern char field_list[500];
+extern char last_id[80];
+extern char z_id[80];
+extern char next_temp[];
+
+extern long last_i_num;
+extern int ii, l_s;
+extern long lower_bound, upper_bound;
+extern FILE *fopen();
+extern FILE *std;
+extern int pf_count;
+
+#include "symtab.h"
+
+extern char strings[];
+extern int hash_list[];
+extern short global;
+#ifdef MS_DOS
+extern struct sym_entry huge sym_table[];
+#else
+extern struct sym_entry sym_table[];
+#endif
+extern int next_sym_free, next_string_free;
+extern int mark_sym_free, mark_string_free;
+
+#ifdef FLEX_SCANNER
+extern char *yytext;
+
+#else /* LEX */
+#ifdef HP
+extern unsigned char yytext[];
+#else
+extern char yytext[];
+#endif
+
+#endif /* LEX */
+
+#ifdef ANSI
+extern void exit(int);
+extern int yyparse(void);
+void find_next_temp(void);
+void normal(void);
+void new_line(void);
+void indent_line(void);
+void my_output(char *);
+void semicolon(void);
+void yyerror(char *);
+int hash(char *);
+int search_table(char *);
+int add_to_table(char *);
+void remove_locals(void);
+void mark(void);
+void initialize(void);
+void main(int,char * *);
+#else /* not ANSI */
+void find_next_temp(), normal(), new_line(), indent_line(), my_output();
+void semicolon(), yyerror(), remove_locals(), mark(), initialize();
+#endif /* not ANSI */
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/install b/obsolete/systems/sisisi/unix/SiTeX3.141/install
new file mode 100644
index 0000000000..8b56943f99
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/install
@@ -0,0 +1,205 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141"
+MAKEDIR=$TEXSRC
+TEXDIR=$MAKEDIR/tex
+WEBDIR=$MAKEDIR/web
+WEB2CDIR=$MAKEDIR/web2c
+SISISIDIR="/users/heinz/src/tex/sisisi/SiTeX3.141"
+
+echo "*** SiTeX 3.141 Installation program"
+echo "*** ================================"
+echo "***"
+echo "*** Do not forget to retrieve the files *.tex and *.sty"
+echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and"
+echo "*** copy them into your TEXINPUTS path."
+echo "***"
+echo "***"
+echo "*** Before the installation can continue, you have to"
+echo "*** follow the guidelines from the TeX3.141 distribution"
+echo "*** and set the pathnames in the several Makefile.in"
+echo "*** for your site's needs."
+echo "*** Do not run configure, it is started by this script."
+echo "***"
+echo "*** If you want to stop the installation, press 'q' now."
+echo "*** Press <cr> to continue."
+
+read x
+if [ "$x" = "q" ]
+then
+ exit
+fi
+
+
+echo
+echo "Starting installation of SiTeX3.141"
+echo
+
+cd $TEXDIR
+echo "Changing to $TEXDIR"
+if [ ! -f tex.web.orig ]
+then
+ echo "Saving tex.web in tex.web.orig"
+ mv tex.web tex.web.orig
+fi
+if [ ! -f tex.ch.orig ]
+then
+ echo "Saving tex.ch in tex.ch.orig"
+ mv tex.ch tex.ch.orig
+fi
+if [ ! -f Makefile.orig ]
+then
+ echo "Saving Makefile in Makefile.orig"
+ mv Makefile Makefile.orig
+fi
+echo "Modifying Makefile for tex9.c"
+sed -e 's/^objs=/objs=tex9.o /' -e 's/tex9\.o: tex8\.c/tex9.o: tex9.c/'\
+ < Makefile.orig > Makefile
+
+cd $SISISIDIR
+echo "Changing to $SISISIDIR"
+echo "Uncompressing sitex.web.Z to $TEXDIR/tex.web"
+uncompress <sitex.web.Z >$TEXDIR/tex.web
+echo "Copying tex.ch to $TEXDIR/tex.ch"
+cp tex.ch $TEXDIR/tex.ch
+
+cd $WEBDIR
+echo "Changing to $WEBDIR"
+if [ ! -f tangle.ch.orig ]
+then
+ echo "Saving tangle.ch in tangle.ch.orig"
+ mv tangle.ch tangle.ch.orig
+fi
+echo "Modifying tangle.ch for bigger name space"
+sed -e '/@!stack_size=50/i\
+@!max_names=4000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@y\
+@!max_names=9000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@z\
+\
+@x' < tangle.ch.orig > tangle.ch
+sleep 5
+touch tangleboot.p
+sleep 5
+touch tangleboot.c tangleboot.h
+
+cd $WEB2CDIR
+echo "Changing to $WEB2CDIR"
+if [ ! -f web2c.c.orig ]
+then
+ echo "Saving web2c.c in web2c.c.orig"
+ mv web2c.c web2c.c.orig
+fi
+if [ ! -f web2c.h.orig ]
+then
+ echo "Saving web2c.h in web2c.h.orig"
+ mv web2c.h web2c.h.orig
+fi
+echo "Modifying web2c.[ch] for bigger tables"
+sed -e 's/var_list\[200]/var_list\[500]/'\
+ -e 's/field_list\[200]/field_list\[500]/' < web2c.c.orig > web2c.c
+sed -e 's/var_list\[200]/var_list\[500]/'\
+ -e 's/field_list\[200]/field_list\[500]/' < web2c.h.orig > web2c.h
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Running configure"
+./configure
+
+echo "*** Now that configure has finished, you might want"
+echo "*** to inspect or change the Makefiles, as suggested"
+echo "*** in TeX3.141's INSTALL file (Step 4)."
+echo "*** Press 's' to suspend the installation and start"
+echo "*** an interactive shell, <cr> to continue."
+
+read x
+if [ "$x" = "s" ]
+then
+ echo "Type 'exit' to quit the shell and continue with the installation."
+ ${SHELL:-/bin/sh}
+fi
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Now starting: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+echo "Now starting error correction"
+echo "Changing to $TEXDIR"
+echo "Correcting coerce.h"
+sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\
+ -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\
+ -e 's/(trennvektor)//g' -e 's/(hashelement)//g'\
+ -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new
+mv coerce.h.new coerce.h
+echo "Correcting texd.h"
+sed -e 's/typedef integer verdschlue/typedef unsigned long verdschlue/'\
+ < texd.h > texd.h.new
+mv texd.h.new texd.h
+echo "Correcting tex6.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\
+ -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\
+ -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\
+ integer help;'\
+ -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\
+ fscanf ( hashfile, "%d", \&help );\
+ htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new
+mv tex6.c.new tex6.c
+
+cd $MAKEDIR
+echo "Returning to $MAKEDIR"
+echo "Continuing: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+if [ ! -x virtex ]
+then
+ echo "*** There seems to be something wrong; virtex doesn't exist."
+ echo "*** Obviously, the installation has failed."
+ exit 1
+fi
+
+echo "Creating the formatfiles in $TEXDIR"
+echo
+echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not"
+echo "in one of the TEXINPUTS directories, you will now run into trouble."
+echo "(You will be prompted for their pathnames and have to type in"
+echo "the whole stuff.)"
+
+mv tex.pool sitex.pool
+TEXPOOL=. ./initex siplain.tex \\dump
+if [ -f siplain.fmt ]
+then
+ mv siplain.fmt sitex.fmt
+ echo "...sitex.fmt created"
+else
+ echo "siplain.fmt not created for unknown reasons."
+fi
+TEXPOOL=. ./initex silplain.tex \\dump
+if [ -f silplain.fmt ]
+then
+ mv silplain.fmt silatex.fmt
+ echo "...silatex.fmt created"
+else
+ echo "silplain.fmt not created for unknown reasons."
+fi
+
+echo "*** The installation is now complete."
+echo "*** You should find the following files in $TEXDIR:"
+echo "***"
+echo "*** sitex.fmt, silatex.fmt, hf3,"
+echo "*** sitex.pool, virtex and initex."
+echo "***"
+echo "*** Now copy sitex.fmt and silatex.fmt into a TEXFORMAT-Dir,"
+echo "*** virtex and initex into a directory holding executables"
+echo "*** (preferably as sivirtex and siinitex), hf3 into"
+echo "*** a TEXINPUTDIR, and sitex.pool into the TEXPOOLDIR."
+echo "*** Also create links silatex and sitex to sivirtex, and"
+echo "*** a link named siplain.fmt to sitex.fmt, all in the"
+echo "*** appropriate directories."
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/install.other b/obsolete/systems/sisisi/unix/SiTeX3.141/install.other
new file mode 100644
index 0000000000..072f2ca78c
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/install.other
@@ -0,0 +1,204 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141"
+MAKEDIR=$TEXSRC/web2c-5.851d
+TEXDIR=$MAKEDIR/tex
+WEBDIR=$MAKEDIR/web
+WEB2CDIR=$MAKEDIR/web2c
+SISISIDIR="/users/heinz/src/tex/sisisi/SiTeX3.141"
+
+echo "*** SiTeX 3.141 Installation program"
+echo "*** ================================"
+echo "***"
+echo "*** Do not forget to retrieve the files *.tex and *.sty"
+echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and"
+echo "*** copy them into your TEXINPUTS path."
+echo "***"
+echo "***"
+echo "*** Before the installation can continue, you have to"
+echo "*** follow the guidelines from the TeX3.141 distribution"
+echo "*** and set the pathnames in the several Makefile.in"
+echo "*** for your site's needs."
+echo "*** Do not run configure, it is started by this script."
+echo "***"
+echo "*** If you want to stop the installation, press 'q' now."
+echo "*** Press <cr> to continue."
+
+read x
+if [ "$x" = "q" ]
+then
+ exit
+fi
+
+
+echo
+echo "Starting installation of SiTeX3.141"
+echo
+
+cd $TEXDIR
+echo "Changing to $TEXDIR"
+if [ ! -f tex.web.orig ]
+then
+ echo "Saving tex.web in tex.web.orig"
+ mv tex.web tex.web.orig
+fi
+if [ ! -f tex.ch.orig ]
+then
+ echo "Saving tex.ch in tex.ch.orig"
+ mv tex.ch tex.ch.orig
+fi
+if [ ! -f Makefile.in.orig ]
+then
+ echo "Saving Makefile.in in Makefile.in.orig"
+ mv Makefile.in Makefile.in.orig
+fi
+echo "Modifying Makefile.in for tex9.c"
+sed -e 's/#.*tex9_o/tex9_o/' < Makefile.in.orig > Makefile.in
+
+cd $SISISIDIR
+echo "Changing to $SISISIDIR"
+echo "Uncompressing sitex.web.Z to $TEXDIR/tex.web"
+uncompress <sitex.web.Z >$TEXDIR/tex.web
+echo "Copying tex.ch to $TEXDIR/tex.ch"
+cp tex.ch $TEXDIR/tex.ch
+
+cd $WEBDIR
+echo "Changing to $WEBDIR"
+if [ ! -f tangle.ch.orig ]
+then
+ echo "Saving tangle.ch in tangle.ch.orig"
+ mv tangle.ch tangle.ch.orig
+fi
+echo "Modifying tangle.ch for bigger name space"
+sed -e '/@!stack_size=50/i\
+@!max_names=4000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@y\
+@!max_names=9000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@z\
+\
+@x' < tangle.ch.orig > tangle.ch
+sleep 5
+touch tangleboot.p
+sleep 5
+touch tangleboot.c tangleboot.h
+
+cd $WEB2CDIR
+echo "Changing to $WEB2CDIR"
+if [ ! -f web2c.c.orig ]
+then
+ echo "Saving web2c.c in web2c.c.orig"
+ mv web2c.c web2c.c.orig
+fi
+if [ ! -f web2c.h.orig ]
+then
+ echo "Saving web2c.h in web2c.h.orig"
+ mv web2c.h web2c.h.orig
+fi
+echo "Modifying web2c.[ch] for bigger tables"
+sed -e 's/var_list\[200]/var_list\[500]/'\
+ -e 's/field_list\[200]/field_list\[500]/' < web2c.c.orig > web2c.c
+sed -e 's/var_list\[200]/var_list\[500]/'\
+ -e 's/field_list\[200]/field_list\[500]/' < web2c.h.orig > web2c.h
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Running configure"
+./configure
+
+echo "*** Now that configure has finished, you might want"
+echo "*** to inspect or change the Makefiles, as suggested"
+echo "*** in TeX3.141's INSTALL file (Step 4)."
+echo "*** Press 's' to suspend the installation and start"
+echo "*** an interactive shell, <cr> to continue."
+
+read x
+if [ "$x" = "s" ]
+then
+ echo "Type 'exit' to quit the shell and continue with the installation."
+ ${SHELL:-/bin/sh}
+fi
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Now starting: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+echo "Now starting error correction"
+echo "Changing to $TEXDIR"
+echo "Correcting coerce.h"
+sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\
+ -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\
+ -e 's/(trennvektor)//g' -e 's/(hashelement)//g'\
+ -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new
+mv coerce.h.new coerce.h
+echo "Correcting texd.h"
+sed -e 's/typedef integer verdschlue/typedef unsigned long verdschlue/'\
+ < texd.h > texd.h.new
+mv texd.h.new texd.h
+echo "Correcting tex6.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\
+ -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\
+ -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\
+ integer help;'\
+ -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\
+ fscanf ( hashfile, "%d", \&help );\
+ htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new
+mv tex6.c.new tex6.c
+
+cd $MAKEDIR
+echo "Returning to $MAKEDIR"
+echo "Continuing: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+if [ ! -x virtex ]
+then
+ echo "*** There seems to be something wrong; virtex doesn't exist."
+ echo "*** Obviously, the installation has failed."
+ exit 1
+fi
+
+echo "Creating the formatfiles in $TEXDIR"
+echo
+echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not"
+echo "in one of the TEXINPUTS directories, you will now run into trouble."
+echo "(You will be prompted for their pathnames and have to type in"
+echo "the whole stuff.)"
+
+mv tex.pool sitex.pool
+TEXPOOL=. ./initex siplain.tex \\dump
+if [ -f siplain.fmt ]
+then
+ mv siplain.fmt sitex.fmt
+ echo "...sitex.fmt created"
+else
+ echo "siplain.fmt not created for unknown reasons."
+fi
+TEXPOOL=. ./initex silplain.tex \\dump
+if [ -f silplain.fmt ]
+then
+ mv silplain.fmt silatex.fmt
+ echo "...silatex.fmt created"
+else
+ echo "silplain.fmt not created for unknown reasons."
+fi
+
+echo "*** The installation is now complete."
+echo "*** You should find the following files in $TEXDIR:"
+echo "***"
+echo "*** sitex.fmt, silatex.fmt, hf3,"
+echo "*** sitex.pool, virtex and initex."
+echo "***"
+echo "*** Now copy sitex.fmt and silatex.fmt into a TEXFORMAT-Dir,"
+echo "*** virtex and initex into a directory holding executables"
+echo "*** (preferably as sivirtex and siinitex), hf3 into"
+echo "*** a TEXINPUTDIR, and sitex.pool into the TEXPOOLDIR."
+echo "*** Also create links silatex and sitex to sivirtex, and"
+echo "*** a link named siplain.fmt to sitex.fmt, all in the"
+echo "*** appropriate directories."
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz
new file mode 100644
index 0000000000..c4842ccebf
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz
Binary files differ
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch
new file mode 100644
index 0000000000..3c9a647f72
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch
@@ -0,0 +1,2834 @@
+=========================================================================
+
+SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991
+ (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl
+ (c) for TeX changes: Heini Hofstaedter, Harald Mueller
+ (c) UNIX Version: F. Zwerina, H.-J. Szoldatics, Heinz Herbeck
+
+ additional changes until 10. October 1991 HH
+ additional changes for TeX3.141 July 1993 Heinz Herbeck
+=========================================================================
+
+This is the change file for inclusion of SISISI into TeX V.3.14.
+
+There are three main changes in this file (which are of course quite
+intermingled):
+
+ 1) the replacement of Liang's hyphenation by SISISI.
+
+ 2) the change of the interface of the actual hyphenation
+ to the post-hyphenation and the line-break algorithm.
+
+ This change is necessary because in original TeX, only the
+ information "hyphen - no hyphen" can be transmitted to the
+ line break algorithm because of two "bottlenecks":
+
+ 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i
+ is marked by the 1-bit information odd(hyf[i]).
+ 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked
+ by the existence of a discretionary node.
+
+ From SISISI, there must be more information flowing to the
+ line-break algorithm:
+
+ a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end,
+ a change is made such that a penalty node is allowed as
+ the first node in the prebreak list of a discretionary
+ node. This penalty node contains the penalty associated with
+ this specific hyphen. For "nebenhyphens", this value is set
+ by an additional primitive "\nebenhyphenpenalty".
+ Instead of the hyf-array, an array hyfpen is used that
+ contains the actual penalties; the old "if odd(hyf[i])" now
+ is converted ti "if hyfpen[i] <> inf_penalty".
+
+ b. A hyphen may be more complicated than a single -: ck-hyphens
+ and triple-consonant-hyphens may be present. To include these,
+ another array hyf_disc is introduced that contains ready-made
+ discretionary nodes for such hyphens.
+
+ At first, we simply wanted to include these discretionary
+ during the post-hyphenation into the new node list. But then
+ Heini felt that the impossiblity of ligatures with parts of such
+ a discretionary node was not acceptable; therefore he introdiced
+ the "x-mechanism" (characterized by many variables starting with
+ "x") and changed the reconstitute function so that more than the
+ single hyphen_char could be introduced into the reconstitution
+ process.
+
+ 3) "Dirty" changes for the hyphenation of words with umlauts.
+ These changes are necessary because the umlauts in TeX are not
+ (necessarily) real characters, but something else (see definition
+ of umlauts in plain.tex or german.tex).
+ Ordinarily, the hyphenation only accepts sequences of letters,
+ ligatures (which are expanded to their single characters), and
+ so-called "implicit kerns". An umlaut, however, is usually
+ represented as a letter character and another character consisting
+ of two dots ("dieresis character"), which are connected by
+ explicit kerns (not implicite ones!). Therefore, words containing
+ umlauts are not hyphenable words in TeX, which is not acceptable
+ for german texts.
+
+ Therefore, we devised a "bypass" for umlauts as follows: An umlaut
+ is now represented as a special discretionary node (so-called
+ "dirty umlaut") as follows:
+ \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}%
+ {}%
+ {<umlaut>}
+ where the 4321sp is a "marker" for the "dirty umlaut", the "m"
+ letter is used to derive the font of the umlaut, <code> is
+ the font number that should be associated with this umlaut (the
+ font numbers of the umlauts are given below); and <back> is used
+ to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>).
+
+ In other words, the prebreak list contains the information that
+ this is an umlaut (albeit a "dirty" one) and some more
+ information needed for the hyphenation, the postbreak list is
+ empty, and the main list contains the umlaut proper. By a
+ special if-statement in the line-break algorithm, a hyphenation
+ at a discretionary node of this format is suppressed, so that
+ always the umlaut of the main list is printed.
+ The font numbers for the lowercase umlauts (which are given
+ in the second \kern node) must be:
+ ae 228
+ oe 246
+ ue 252
+ The codes for the uppercase umlauts can be chosen arbitrarily.
+
+ In order to get the hyphenation for these "dirty umlauts"
+ running, one must include lccode assignments of the form
+ \lccode<code>=<lccode>
+ for each of the new letters (see example below).
+
+ A typical declaration of the "dirty umlauts" runs like this:
+
+%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%%
+\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}}
+\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}}
+\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}}
+\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}}
+\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}}
+\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}}
+\lccode196=228 % uppercase umlaut A
+\lccode214=246 % uppercase umlaut O
+\lccode220=252 % uppercase umlaut U
+\lccode228=228 % uppercase umlaut a
+\lccode246=246 % uppercase umlaut o
+\lccode252=252 % uppercase umlaut u
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the
+third kind can be eliminated. How long this will take ... well, wait and
+see.
+But when they arrive, it's not longer possible to choose the codes for
+uppercase umlauts arbitrarily. The codes for uppercase umlauts will
+then be those, shown in the example above.
+
+=========================================================================
+
+At first, we add a control sequence \SISISI.
+@x
+\def\PASCAL{Pascal}
+@y
+\def\SISISI{{\sl SISISI}}
+\def\PASCAL{Pascal}
+
+\let\maybe=\iffalse % print only changed modules
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts}
+@y
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
+@z
+
+-------------------------------------------------------------------------
+
+A number of procedures of SISISI are declared after the TeX program. As
+these procedures are used in the hyphenation, of course, they must be
+declared as `forward'.
+ In web2c gibt es keine forward's !!!!
+%@x
+%procedure initialize; {this procedure gets things started properly}
+%@y
+%@<forward declarations@>
+%procedure initialize; {this procedure gets things started properly}
+%@z
+
+-------------------------------------------------------------------------
+%@x
+%@d pool_name_length=8
+%@y
+%@d pool_name_length=11
+% {number of characters of ``pool_f_name''}
+%@z
+%see the following change of the pool file name "pool_f_name"
+-------------------------------------------------------------------------
+
+@x
+@!pool_name='TeXformats:TEX.POOL ';
+@y
+@!pool_name='TeXformats:SITEX3.POOL ';
+@z
+
+-------------------------------------------------------------------------
+
+@x
+else bad_pool('! I can''t read TEX.POOL.')
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read SITEX3.POOL.')
+@.I can't read TEX.POOL@>
+@z
+=========================================================================
+
+To have all messages, coming from SI_TEX, displayed on screen
+and written to the log-file simultanously, we make the following,
+additional definitions.
+ temp nicht mehr vorhanden, in log ve„ndert.
+@x
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+@y
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+
+@d si_put(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog(#);
+ end
+@d si_put_ln(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm_ln(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog_ln(#);
+ end
+@d si_put_cr == print_ln
+
+
+@d dbg_put(#) == {}
+@d dbg_put_ln(#) == {}
+@d dbg_put_cr == {}
+@z
+=========================================================================
+
+We add a new primitive \nebenhyphenpenalty for setting the penalty of a
+minor hyphen:
+
+@x
+@d int_pars=55 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@y
+@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen}
+@d si_debug_code=56 {value is treated as an set of active debugging sections}
+@d supress_debug_mark_code=57 {same as above; if a section number is set, then
+ the output of the section number and the debugging output banner
+ of this section is supressed}
+@d int_pars=58 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@z
+-------------------------------------------------------------------------
+@x
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@y
+@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code)
+@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin
+ if not odd(int_par(supress_debug_mark_code)div #) then
+ begin
+ si_put_cr;
+ si_put_ln(' <* debugging output section #',#:#,' *>');
+ end; {marking supression}
+ { dig_count entfernt !!! }
+@d gubed_si == end
+@f si_debug == begin
+@f gubed_si == end
+@f gubed == nil
+
+
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@z
+-------------------------------------------------------------------------
+@x
+othercases print("[unknown integer parameter!]")
+@y
+neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty");
+si_debug_code:print_esc("sidebug");
+supress_debug_mark_code:print_esc("supressdebugmark");
+othercases print("[unknown integer parameter!]")
+@z
+-------------------------------------------------------------------------
+@x
+@ @<Cases of |print_cmd_chr|...@>=
+@y
+primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/
+@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@>
+primitive("sidebug",assign_int,int_base+si_debug_code);
+primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code);
+@ @<Cases of |print_cmd_chr|...@>=
+@z
+
+=========================================================================
+
+As now hyphens may have different penalties, we must somehow associate
+a penalty with a discretionary node. We do this by allowing a penalty
+node as the first node in the prebreak list of a discretionary node.
+
+The following changes are in two case statements that check the nodes
+in the sublists of a discretionary node; we add an empty case for
+penalty nodes (two more case statements follow a little bit later).
+
+@x
+ othercases confusion("disc1")
+@y
+ penalty_node: ;
+ othercases confusion("disc1")
+@z
+-------------------------------------------------------------------------
+@x
+ othercases confusion("disc2")
+@y
+ penalty_node: ;
+ othercases confusion("disc2")
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The following change is in the line-break section, where try_break is
+given the penalty stored in the penalty node. This change is the reason
+for all other changes concerning penalties. Moreover, in this change
+a line break is suppressed if the discretionary node is actually
+a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break").
+
+@x
+begin s:=pre_break(cur_p); disc_width:=0;
+if s=null then try_break(ex_hyphen_penalty,hyphenated)
+else begin repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ try_break(hyphen_penalty,hyphenated);
+ act_width:=act_width-disc_width;
+ end;
+r:=replace_count(cur_p); s:=link(cur_p);
+while r>0 do
+ begin @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@y
+begin
+ s:=pre_break(cur_p); disc_width:=0;
+ if s=null then try_break(ex_hyphen_penalty,hyphenated)
+ else if (type(s)=penalty_node) and (link(s)=null) then begin
+ flush_node_list(s); s := null;
+ try_break(ex_hyphen_penalty,hyphenated); end
+ else if not is_dirty_umlaut(cur_p) then begin
+ if type(s)=penalty_node then s:=link(s);
+ repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ if type(pre_break(cur_p))=penalty_node then begin
+ try_break(penalty(pre_break(cur_p)),hyphenated) end
+ else begin try_break(hyphen_penalty,hyphenated); end;
+ act_width:=act_width-disc_width;
+ end;
+ r:=replace_count(cur_p); s:=link(cur_p);
+ while r>0 do begin
+ @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+ prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@z
+
+=========================================================================
+
+Two more case statements.
+
+@x
+ othercases confusion("disc3")
+@y
+ penalty_node: ;
+ othercases confusion("disc3")
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ othercases confusion("disc4")
+@y
+ penalty_node: ;
+ othercases confusion("disc4")
+@z
+
+=========================================================================
+
+There's a little problem, converting a device independent (``.dvi'')
+to a post script file (``.ps''). I think that this program part could
+cause this problem. so let's see...
+
+!a <-- = --> @x With this, i want to try to reproduce this error.
+ Because, after i had inserted this change, that error didn`t occur
+ again!
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin if type(q)=disc_node then
+ @<Change discretionary to compulsory and set
+ |disc_break:=true|@>
+ else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end
+else begin q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @y
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin
+ if type(q)=disc_node then begin
+ hyfdeb_b:=false;
+ if is_dirty_umlaut(q) then begin
+ si_debug(64) hyfdeb_b:=true; gubed_si;
+ si_put_cr;
+ si_put_ln(' ??? There's a line break at a dirty umlaut!?');
+ end;
+ if not hyfdeb_b then begin
+ @<Change discretionary to compulsory and set |disc_break:=true|@>
+ end;
+ end else
+ if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end else begin
+ q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @z
+
+
+=========================================================================
+
+If the break actually occurs, the penalty node is made a separate list
+with only one node, which is immediately flushed.
+
+@x
+begin s:=pre_break(q); link(q):=s;
+while link(s)<>null do s:=link(s);
+pre_break(q):=null; q:=s;
+end
+@y
+begin
+ s:=pre_break(q);
+ if type(s)=penalty_node then begin
+ s:=link(s);
+ link(pre_break(q)):= null;
+ flush_node_list(pre_break(q));
+ end;
+ link(q):=s;
+ while link(s)<>null do s:=link(s);
+ pre_break(q):=null; q:=s;
+end
+@z
+
+=========================================================================
+
+The type `array[0..65] of 0..256' is needed more often, so we make it
+an explicit type (see big SISISI change at end of change file). hc is
+now declared of this type.
+
+@x
+@!hc:array[0..65] of 0..256; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+@y
+@!hc:a_word; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+{ some variables for debugging output }
+@!hyfdeb_i,hyfdeb_j: integer;
+@!hyfdeb_b:boolean;
+@!si_p, si_q, si_r, si_s: pointer;
+@z
+
+-------------------------------------------------------------------------
+
+Our hyphenation routines need even more "more local variables".
+
+@x
+@ Hyphenation routines need a few more local variables.
+@y
+@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a
+ whatsit node occurs inbetween a word. This can happen due to
+ Partl's changes in ``german.sty'' }
+
+@ Hyphenation routines need a few more local variables.
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@!j:small_number; {an index into |hc| or |hu|}
+@y
+@!qq:pointer;
+@!j:small_number; {two indices into |hc| or |hu|}
+@!jj:integer;
+@z
+
+=========================================================================
+
+The dirty_umlaut array must be initialized for each word.
+And we enable watching the node list, representing the word
+to be hyphenated.
+
+@x
+if s<>null then
+ begin @<Skip to node |ha|, or |goto done1| if no hyphenation
+@y
+si_p:=cur_p; si_q:=null;
+for jj:=-1 to 64 do dirty_umlaut[jj] := null;
+if s<>null then begin
+ si_debug(1)
+{ hyfdeb_i:=depth_threshold; depth_threshold:=100;
+ hyfdeb_j:=breadth_max; breadth_max:=100;
+}
+ show_node_list(si_p);
+{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; }
+ gubed_si;
+ @<Skip to node |ha|, or |goto done1| if no hyphenation
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ hyphenate;
+ end;
+done1: end
+@y
+ hyphenate;
+ end;
+done1:
+si_debug(32)
+ hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max;
+ if si_q<>null then begin
+ depth_threshold:=100; {show all levels of a list}
+ breadth_max:=200; {show all nodes of one level of a list}
+ si_r:=link(si_q); link(si_q):=null;
+ end else begin
+ (* take the values, set by the user, for this variables! *)
+ breadth_max:=show_box_breadth; depth_threshold:=show_box_depth;
+ end;
+ show_node_list(si_p);
+ si_put_cr;
+ if si_q <> null then link( si_q ) := si_r;
+
+ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j;
+gubed_si;
+end
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Here, we add the SISISI-procedure abteilen for use in hyphenate and
+another label done1.
+
+@x
+procedure hyphenate;
+label common_ending,done,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@y
+
+@<Handling of dirty umlauts@>
+
+procedure hyphenate;
+label common_ending,done,done1,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+The prehyphenation loop must now also skip over the "dirty umlauts".
+
+@x
+loop@+ begin if is_char_node(s) then
+ begin c:=qo(character(s)); hf:=font(s);
+ end
+ else if type(s)=ligature_node then
+ if lig_ptr(s)=null then goto continue
+ else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then
+ begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end
+ else goto done1;
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@y
+loop@+ begin
+ if is_char_node(s) then begin
+ c:=qo(character(s)); hf:=font(s);
+ end else if type(s)=ligature_node then begin
+ if lig_ptr(s)=null then goto continue
+ else begin
+ q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ end else if is_dirty_umlaut(s) then begin
+ c:=get_char_of(s); hf:=get_font_of(s);
+ end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end else goto done1;
+
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The interface variables for the hyphenation are extended: hyfpen[i]
+holds the actual penalty of a hyphen at position i, hyf_disc[i]
+contains a "special discretionary" for triple-consonant-hyphens and
+ck-hyphens. hc_si is the word as given to the SISISI algorithm;
+hyf_si is returned from SISISI and contains markers for the hyphens.
+
+After this change, there are many changes where `odd(hyf[i])' is
+simply replaced by `hyfpen[i]<>inf_penalty'.
+
+Another procedure to be changed is `reconstitute': It now has to handle
+special dicretionary nodes. For a detailed feeling about the code changes
+in reconstitute, either (1) look through it bit by bit, or (2) ask Heini
+Hofstaedter.
+
+@x
+ end
+ else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@y
+ end else if is_dirty_umlaut(s) then begin
+ if get_font_of(s)<>hf then goto done3;
+ c:=get_char_of(s);
+ if lc_code(c)=0 then goto done3;
+ if hn=63 then goto done3;
+ hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c);
+ dirty_umlaut[hn]:=s;
+ for jj:=1 to replace_count(s) do s:=link(s);
+ end else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ dirty_umlaut[-1]:=s;
+ end else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+Also in the conversion loop (where the node list is shuffled into the
+hc array), we must skip a "dirty umlaut".
+
+@x
+loop@+ begin if not(is_char_node(s)) then
+ case type(s) of
+ ligature_node: do_nothing;
+@y
+loop@+ begin
+if not(is_char_node(s)) then
+ if is_dirty_umlaut(s) then begin
+ for jj:=1 to replace_count(s)-1 do s:=link(s);
+ end else
+ case type(s) of
+ ligature_node: do_nothing;
+@z
+
+=========================================================================
+
+Well, there are a lot of new variables that are necessary for the new
+hyphenation. Most of them are necessary for Heini's change in the
+reconstitute function, where now discretionary nodes for hyphens with
+more than one character (e.g. the german ck-hyphens or
+three-consonant-hyphens) can be inserted.
+
+@x
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+@y
+@!hyfpen:array [0..64] of integer; {penalties for possible discretionary
+ hyphens}
+@!hyf_si:trennvektor;
+@!hc_si:wort;
+@!hyf_disc:array [0..64] of pointer;
+
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+
+@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|}
+@!add_char, {additional characters when hyphenating e.g.\
+ Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here
+ |add_char| = 1}
+@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| }
+@!spec_hyf: pointer; {special hyphen; causes different spelling of the
+ word, when it is hyphenated at this point}
+@!si_j:integer;
+@z
+
+=========================================================================
+
+An odd->inf_penalty change.
+
+@x
+for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1;
+@y
+for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1;
+@z
+
+=========================================================================
+
+The new variable hold_r is initialized (the kern node is a dummy node,
+as far as I can see).
+
+@x
+if is_char_node(ha) then
+ if font(ha)<>hf then goto found2
+@y
+hold_r := new_kern(1235); link(hold_r):=r;
+if is_char_node(ha) then
+ if font(ha)<>hf then goto found2
+@z
+
+=========================================================================
+
+Initialize some variables if the list starts with a "dirty umlaut".
+
+@x
+else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@y
+else if is_dirty_umlaut(ha) then begin
+ if get_font_of(ha) <> hf then goto found2
+ else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha);
+ end
+end else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+unhinge all "dirty umlauts".
+
+@x
+common_ending: flush_node_list(r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@y
+common_ending:
+qq:=hold_r;
+for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin
+ while link(qq) <> dirty_umlaut[kk] do qq := link(qq);
+ qr := link(qq);
+ for i:=1 to replace_count(qr) do
+ if qr<>null then qr:=link(qr)
+ else begin {test:}
+ si_put_ln('...??..X --> ????? !');
+ end; {:test}
+ if qr<>null then begin
+ link(qq):=link(qr); link(qr):=null;
+ end else link(qq):=null;
+end;
+if dirty_umlaut[-1]<>null then begin
+ qq:=hold_r;
+ while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq);
+ if link(qq)=dirty_umlaut[-1] then begin
+ link(qq):=link(dirty_umlaut[-1]);
+ link(dirty_umlaut[-1]):=null;
+ end else begin
+ si_put(' *** ERROR: node list is damaged! ');
+ si_put_ln('(post hyphenation - unhinge a whatsit node)');
+ end;
+end;
+{}
+r:=hold_r;
+while link(r)<>null do begin
+ if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r)
+ else begin
+ wlog_cr; wterm_cr;
+ wlog_ln('???$ - ERROR in node list!');
+ wterm_ln('???$ - ERROR in node list!');
+ kk:=depth_threshold; l:=breadth_max;
+ depth_threshold:=100; breadth_max:=100;
+ show_node_list(hold_r);
+ link(r):=null;
+ depth_threshold:=kk; breadth_max:=l;
+ end;
+end;
+{}
+flush_node_list(hold_r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@z
+
+------------------------------------------------------------------------
+
+Another odd->inf_penalty change (this time only textual).
+
+@x
+If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]|
+is odd and such that the result of |reconstitute| would have been different
+if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed|
+to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero.
+@y
+If there exists an index |k| in the range $j\le k\le m$ such that
+|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute|
+would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute|
+sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets
+|hyphen_passed| to zero.
+@z
+
+-------------------------------------------------------------------------
+
+In the reconstitute function, we set the boundary value n immediately
+before the next "dirty umlaut" by a simple for-loop starting at the
+original n.
+
+@x
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+@y
+@!ii:small_number;
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+for ii:=n downto j do
+ if dirty_umlaut[ii] <> null then n:=ii-1;
+@z
+
+-------------------------------------------------------------------------
+
+Another odd->inf_penalty change.
+
+@x
+ if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char;
+@y
+ if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char;
+@z
+
+=========================================================================
+
+A first change in the reconstitute function.
+
+@x
+ else begin if hchar<non_char then if odd(hyf[j]) then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@y
+ else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@z
+
+
+-------------------------------------------------------------------------
+
+Now we are in the post-hyphenation's main loop; here must append a
+"dirty umlaut" to the growing node list. This is simply done by an
+if-statement that checks for the presence of a "dirty umlaut" and
+appends it.
+
+Moreover, we have another textual odd->inf_penalty change.
+
+@x
+repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+if hyphen_passed=0 then
+ begin link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if odd(hyf[j-1]) then
+ begin l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q
+
+@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is
+odd, when both branches of the previous discretionary end at position |j-1|.
+@y
+if dirty_umlaut[-1]<>null then begin
+ {hook in the previous saved whatsit node before the first
+ character of the hyphenated word}
+ link(s):=dirty_umlaut[-1];
+ s:=link(s);
+end;
+repeat
+ if dirty_umlaut[j]<>null then begin
+ link(s):=dirty_umlaut[j];
+ while link(s)>null do s:=link(s);
+ link(hold_head):=null;
+ j:=j+1; hyphen_passed:=0;
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1;
+ si_debug(16)
+ si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!');
+ gubed_si;
+ end;
+ end else begin
+ l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+ if hyphen_passed=0 then begin
+ link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+ end; {if dirty_umlaut[j]<>null then-else}
+ if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q;
+si_q:=s; {save the last node of the hyphenated word for debugging output}
+for j:=0 to 64 do if hyf_disc[j]<>null then begin
+ flush_node_list( hyf_disc[j]);
+end
+
+@ In this repeat loop we will insert another discretionary if
+|hyfpen[j-1]<>inf_penalty|, when both branches of the previous
+discretionary end at position |j-1|.
+@z
+
+=========================================================================
+
+Another odd->inf_penalty change.
+
+@x
+hyphen_passed:=j-1; link(hold_head):=null;
+until not odd(hyf[j-1])
+@y
+hyphen_passed:=j-1; link(hold_head):=null;
+until (hyfpen[j-1]=inf_penalty)
+@z
+
+=========================================================================
+
+Here comes the big reconstitution action (cheers to Heini!).
+
+@x
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char);
+if hyf_node<>null then
+ begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+ end;
+while l<=i do
+ begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@y
+As the value of |hyfpen[i]| is necessary for creating a penalty node,
+we must create this node before we ``kill'' the hyphenation information in
+|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the
+pointer to the penalty node or |null|, if no such node has been created.
+
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty)
+ then minor_tail:=new_penalty(hyfpen[i])
+ else minor_tail:=null;
+hyfpen[i]:=inf_penalty;
+pre_break(r):=minor_tail;
+
+hyf_node:=new_character(hf,hyf_char);
+{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|}
+xchg_k:=i;
+if hyf_disc[xchg_k]<>null then begin
+ spec_hyf:=pre_break(hyf_disc[xchg_k]);
+ add_char:=subtype(spec_hyf);
+ xchg_i:=1;
+ repeat
+ spec_hyf:=link(spec_hyf);
+ if spec_hyf<>null then begin
+ xchg_char[xchg_i]:=qo(character(spec_hyf));
+ incr(xchg_i);
+ end;{if}
+ until spec_hyf=null;
+ if hyf_node<>null then begin
+ xchg_char[xchg_i]:=hyf_char;
+ free_avail(hyf_node);
+ end else decr(xchg_i);
+ xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first
+ character is replaced by a character of the
+ |pre_break|-list of |spec_hyf|}
+ for xchg_k:=1 to xchg_i do begin
+ xchg_char[0]:=hu[xchg_hu];
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ xchg_char[xchg_k]:=xchg_char[0];
+ incr(xchg_hu);
+ end; {|for|}
+ xchg_k:=i;
+ i:=xchg_hu-1;
+ xchg_hu:=xchg_hu-xchg_i;
+end {|if hyf_disc[]<>null|}
+else if hyf_node<>null then begin
+ incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+end;
+while l<=i do begin
+ l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@z
+
+-------------------------------------------------------------------------
+
+... continued:
+
+@x
+if hyf_node<>null then
+ begin hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@y
+ if hyf_disc[xchg_k]<>null then begin
+{ Restore the original word in |hu| }
+ i:=xchg_k; l:=i+1;
+ for xchg_k:=1 to xchg_i do begin
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ incr(xchg_hu);
+ end;{for}
+ end else if hyf_node<>null then begin
+ hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Finally, we come to the SISISI hyphenation. At first, we define two
+variables:
+
+@x
+@ Assuming that these auxiliary tables have been set up properly, the
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+
+@ Assuming that these auxiliary tables have been set up properly, the
+@z
+
+-------------------------------------------------------------------------
+
+And off we go; at first only slowly, ...
+
+@x
+@<Find hyphen locations for the word in |hc|...@>=
+@y
+{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!}
+
+
+@<Find hyphen locations for the word in |hc|...@>=
+@z
+
+-------------------------------------------------------------------------
+
+... but now we kill all of Liang's code and replace it by some re- and
+back-en- and decoding, a call to abteilen, and the construction of the
+special discretionaries. Then we go right into the SISISI hyphenation.
+=========================================================================
+@x
+if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|}
+hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters}
+for j:=0 to hn-r_hyf+1 do
+ begin z:=trie_link(cur_lang+1)+hc[j]; l:=j;
+ while hc[l]=qo(trie_char(z)) do
+ begin if trie_op(z)<>min_quarterword then
+ @<Store \(m)maximum values in the |hyf| table@>;
+ incr(l); z:=trie_link(z)+hc[l];
+ end;
+ end;
+found: for j:=0 to l_hyf-1 do hyf[j]:=0;
+for j:=0 to r_hyf-1 do hyf[hn-j]:=0
+
+@ @<Store \(m)maximum values in the |hyf| table@>=
+begin v:=trie_op(z);
+repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v];
+if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v];
+v:=hyf_next[v];
+until v=min_quarterword;
+end
+
+@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is
+@y
+ for j:=0 to hn do
+ hc_si[j] := ktab[hc[j]];
+ si_debug(2)
+ si_put(' hc:');
+ for j:=0 to hn do si_put( xchr[hc[j]] );
+ si_put_ln(':');
+ si_put(' hc_si:');
+ for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] );
+ si_put_ln(':');
+ gubed_si;
+ si_debug(4)
+ si_put_ln('< decimal character codes >');
+ si_put(' hc:');
+ for j:=0 to hn do begin
+ si_put(hc[j]:3,'-');
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr;
+ si_put(' hc_si:');
+ for j:=0 to hn do begin
+ si_put( rev_tab[hc_si[j]]:3,'-' );
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr; si_put_cr;
+ gubed_si;
+
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+ if funktioniert then
+ for j:=0 to hn do begin
+ if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty
+ else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty
+ else if hyf_si[j]=nebenck then begin
+ hyfpen[j+1] := neben_hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j+1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s);
+ subtype(s):=0; { number of additional characters }
+ link(s):=new_character(hf,hu[j+2]); {'k' oder'K'}
+ link(link(s)):=null;
+ s:=hyf_disc[j+1];
+ post_break(s):=null; link(s):=null;
+ end
+ else if hyf_si[j]=haupt3 then begin
+ hyfpen[j-1]:=hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j-1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s);
+ subtype(s):=1;
+ link(s):=new_character(hf,hu[j]); { Dreifachkonsonant }
+ link(link(s)):=null;
+ {|post_break|- und |link|-Liste: }
+ s:=hyf_disc[j-1];
+ post_break(s):=null;
+ link(s):=null;
+ end
+ end; {|if funktioniert|}
+ si_debug(8)
+ if funktioniert then begin
+ for j:=0 to hn do
+ if hyfpen[j]<>inf_penalty then begin
+ if hyf_disc[j]<>null then begin
+ if subtype(pre_break(hyf_disc[j]))=0 then
+ si_put( xchr[hu[j+1]], '-' )
+ else {if subty...}
+ si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' );
+ { i hope so }
+ end else begin
+ si_put( xchr[hu[j]] );
+ if hyfpen[j]=hyphen_penalty then
+ si_put('=')
+ else si_put('-');
+ end;
+ end else begin
+ si_put( xchr[hu[j]] );
+ end;
+ end else begin
+ si_put_ln(' no hyphens were found in this word!');
+ end;
+ si_put_cr;
+ gubed_si;
+ goto done1;
+
+found:
+hyfpen[0]:=inf_penalty;
+for j:=1 to hn do
+ if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty
+ else hyfpen[j]:=inf_penalty;
+
+done1:
+
+@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe
+dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort
+nach Trennstellen zu untersuchen und die gefundenen Trennstellen in
+hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen
+einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im
+INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT
+F\"UR PRAKTISCHE INFORMATIK.
+
+Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem
+Start von TeX aufgerufen werden.
+
+@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen|
+n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang
+ausgef\"uhrt werden sollen.
+
+@<Set initial values of ...@>=
+ inittrennen;
+
+@ @<Constants in the outer block@>=
+ maxwl = 64; { Maximale Wortlaenge }
+ sonderzeichen= 0;
+ bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7;
+ bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14;
+ bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21;
+ bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27;
+ bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31;
+ keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5;
+
+ tabsize = 8191; { 2**13 - 1 }
+ spec_letter_ID = 4321;
+ { const definitionen }
+ vok_a = 1;
+ vok_e = 2;
+ vok_i = 3;
+ vok_o = 4;
+ vok_u = 5;
+ vok_ae = 6;
+ vok_oe = 7;
+ vok_ue = 8;
+ vok_ie = 9;
+ vok_ai = 10;
+ vok_ei = 11;
+ vok_au = 12;
+ vok_aeu= 13;
+ vok_eu = 14;
+ vok_y = 15;
+ kons = 16;
+
+@
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+ rev_tab: array[0..255]of integer;
+
+
+@ Prozedurdefinitionen
+
+function dig_count( v: integer): integer;
+ { calculates the number of decimal digits of ``v'' }
+ var x, e, c: integer;
+begin
+ x := v div 10; e:=1; c:=1;
+ while e<=x do begin
+ e := e * 10; incr(c);
+ end;
+ dig_count:=c;
+end;
+
+@<Handling of dirty umlauts@>=
+
+procedure hashfunk (var w:wort; anfang,ende:integer;
+ var v:varr; var ind,k:intarr );
+
+ { -PRAK!- in C long statt integer }
+ var vacc, indacc, kacc : integer;
+ i : integer;
+begin
+ vacc := 31415; indacc := 152; kacc := 271;
+dbg_put_ln(' * HFNC =');
+ for i := anfang to ende do begin
+dbg_put(' * HFNC ',i-anfang:3,' A');
+ vacc := (vacc * 31 + w [i]) mod 8388648;
+dbg_put('B');
+ v[i] := vacc;
+dbg_put('C');
+ indacc := (indacc * 33 + w[i]) mod (tabsize+1);
+dbg_put('D');
+ ind[i] := indacc;
+dbg_put('E');
+ kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2);
+dbg_put('F');
+ k[i] := 2*kacc + 1;
+dbg_put_ln('G');
+ end; {|for|}
+end; {|hashfunk|}
+
+procedure unpackinfo ( b:infobyte;
+ { var i:infotype }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean );
+begin
+ { with i do begin }
+ if odd(b) then begin { 87654321 }
+ iausnahme:= true;
+ b:= b div 2; { 08765432 }
+ if odd(b) then iuntrennbar:= true
+ else iuntrennbar:= false;
+ b:=b div 2; { 00876543 }
+ ierste := b mod 8; { 00876xxx }
+ izweite := b div 8; { 00000876 }
+ end else begin
+ iausnahme:= false; { 87654321 }
+ b:= b div 2; { 08765432 }
+ if odd(b) then iendung:= true
+ else iendung:= false;
+ b:= b div 2; { 00876543 }
+ if odd(b) then ivorsilbe:= true
+ else ivorsilbe:= false;
+ b:= b div 2; { 00087654 }
+ if odd(b) then istamm:= true
+ else istamm:= false;
+ b:= b div 2; { 00008765 }
+ if odd(b) then iehervor:= true
+ else iehervor:= false;
+ b:= b div 2; { 00000876 }
+ if odd(b) then istammallein:= true
+ else istammallein:= false;
+ end; {|if-then-else|}
+ { end; |with|}
+end; {|unpackinfo|}
+
+
+procedure unpackentry( h:hashelement;
+ { var e:tableentry }
+ var etabv:verdschlue;
+ var etabb:infobyte;
+ var efrei:boolean;
+ var ewiederfrei:boolean );
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' ==> UPCKNTY 1');
+ etabv:= h[0]+h[1]*256+h[2]*256*256;
+dbg_put(' 2');
+ if odd(h[3]) then begin { Ausnahme }
+dbg_put(' 3 A');
+ etabb:= h[3];
+dbg_put('1');
+ efrei:= false;
+ ewiederfrei:= false;
+ end
+ else begin
+dbg_put(' 3 B');
+ etabb:= h[3] mod 64;
+dbg_put('1');
+ { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher
+ nicht ver„ndert werden. }
+dbg_put('2');
+ { durch folgende 2 Abfragen ersetzt. -PRAK!- }
+ if odd(h[3] div 64) then efrei := true
+ else efrei := false;
+ if odd(h[3] div 128) then ewiederfrei := true
+ else ewiederfrei := false;
+ end;
+dbg_put_ln('- 4');
+ { end; |with|}
+end; {|unpackentry|}
+
+
+procedure hashsuch ( v:verdschlue;
+ ind,k : integer;
+ { var i:infotype; }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean;
+ var g:boolean );
+
+{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden }
+ var
+ gef,ngef:boolean;
+ j:integer;
+ entry : tableentry;
+
+begin
+ gef := false; ngef := false; j := ind;
+ repeat
+ unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+ if entry.frei then ngef := true
+ else if (v = entry.tabv) and not entry.wiederfrei then begin
+ unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite,
+ iendung,ivorsilbe,istamm,iehervor,istammallein);
+ gef := true;
+ end else
+ j := (j+k) mod (tabsize + 1)
+ until gef or ngef;
+ g := gef;
+end; {|hashsuch|}
+
+
+procedure hashload ( var status:integer );
+{ einlesen der Hash-Tabelle von file fn }
+ var i : integer;
+ e : tableentry;
+begin
+ { Orginal sitex3.cha -PRAK!-
+ for i:=1 to file_name_size do name_of_file:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ if a_open_in(hashfile) then begin
+ }
+
+ { geaendert !! -PRAK!- }
+ for i:=1 to file_name_size do name_of_file[i]:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ { -PRAK!- texinputpath fr C notwendig }
+ if a_open_in(hashfile, TEX_INPUT_PATH) then begin
+ for i := 0 to tabsize do begin
+ { -PRAK!- in C Probleme mit den typen beim einlesen }
+ read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of }
+ read (hashfile, htab[i][1]); { hashelement, und }
+ read (hashfile, htab[i][2]); { hashelement = packed array 0..3 }
+ read (hashfile, htab[i][3]);
+ unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei);
+ if not e.frei and not e.wiederfrei then anzahl := anzahl + 1;
+ end; {|for|}
+ status:= 0;
+ a_close(hashfile);
+ end else status:= 1;
+end; {|hashload|}
+
+
+procedure inittrennen;
+ var ch: 0..255;
+ bst: buchstabe;
+ i, status: integer;
+ is_iniTeX: boolean;
+begin
+ { Konversionstabelle |ktab| initialisieren }
+ { ======================================== }
+
+ for ch := 0 to 255 do begin
+
+ { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then }
+
+ case ch of
+ " ",",",";",":","-","/","?","!","(",")",".","""","'","^":
+
+ if ch="." then ktab[ch]:= "."
+ else ktab[ch] := trennzeichen
+ { else ktab[ch] := sonderzeichen geht nicht !!}
+ end; { case }
+
+if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen;
+
+ end; { for }
+ for bst := bst_a to bst_z do begin
+ ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst;
+ ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst
+ end;
+
+ { Umlaute und scharfes s - f\"ur ``production \TeX version'' }
+ ktab[255]:=bst_sz;
+ ktab[246]:=bst_oe;
+ ktab[252]:=bst_ue;
+ ktab[228]:=bst_ae;
+
+ { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' }
+ ktab["1"]:=bst_sz;
+ ktab["2"]:=bst_ue;
+ ktab["3"]:=bst_oe;
+ ktab["4"]:=bst_ae;
+ ktab[25]:=bst_sz; {?-wieso? HH}
+
+{testing:}
+for i:=0 to 255 do rev_tab[ktab[i]]:=i;
+rev_tab[ktab[255]]:=223;
+xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246);
+xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223);
+{:end of testing}
+
+ { Kombinationstabelle |kombtab| initialisieren }
+ { ============================================ }
+ { Diese Tabelle muss symetrisch sein,
+ kombtab[a,b] = kombtab[b,a] }
+ kombtab[ keine, keine] := keine;
+ kombtab[ keine, neben] := keine;
+ kombtab[ keine,nebenck] := keine;
+ kombtab[ keine, haupt] := keine;
+ kombtab[ keine, haupt3] := keine;
+
+ kombtab[ neben, keine] := keine;
+ kombtab[ neben, neben] := neben;
+ kombtab[ neben,nebenck] := keine;
+ kombtab[ neben, haupt] := neben;
+ kombtab[ neben, haupt3] := keine;
+
+ kombtab[nebenck, keine] := keine;
+ kombtab[nebenck, neben] := keine;
+ kombtab[nebenck,nebenck] := nebenck;
+ kombtab[nebenck, haupt] := keine;
+ kombtab[nebenck, haupt3] := keine;
+
+ kombtab[ haupt, keine] := keine;
+ kombtab[ haupt, neben] := neben;
+ kombtab[ haupt,nebenck] := keine;
+ kombtab[ haupt, haupt] := haupt;
+ kombtab[ haupt, haupt3] := keine;
+
+ kombtab[ haupt3, keine] := keine;
+ kombtab[ haupt3, neben] := keine;
+ kombtab[ haupt3,nebenck] := keine;
+ kombtab[ haupt3, haupt] := keine;
+ kombtab[ haupt3, haupt3] := haupt3;
+
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+
+{ ================== Hashtabelle |htab| initialisieren ======================
+
+Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf
+keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob
+dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig
+davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf
+(production-version) von \TeX ist.
+
+=============================================================================}
+ is_iniTeX:=false;
+ init is_iniTeX:=true; tini
+ if not is_iniTeX then begin
+ hashload(status);
+ if status <> 0 then begin
+ si_put_cr;
+ si_put_ln
+(' * * * * * * * * * *!');
+ si_put_ln('**** ERROR: Can not read hash-file!');
+ si_put_cr;
+ jump_out;
+ end;
+ end; {|not iniTeX|}
+end; {|inittrennen|}
+
+
+procedure packinfo ( i:infotype; var b : infobyte );
+{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ }
+{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / }
+
+begin
+ b:=0;
+dbg_put_cr;
+ { with i do begin }
+ if i.ausnahme then
+begin
+dbg_put(' ### PCKINF 1A utr:');
+if i.untrennbar then dbg_put('Y') else dbg_put('N');
+dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3);
+ b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite
+; dbg_put('B');
+end
+ else
+begin
+dbg_put(' ### PCKINF 2A');
+ b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor)
+ +32*ord(i.stammallein);
+dbg_put('B');
+end;
+ { end; with }
+dbg_put_ln('-3');
+end; {|packinfo|}
+
+procedure packentry( e:tableentry; var h:hashelement );
+{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ }
+
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' +++ PCKNTY A');
+ h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx}
+dbg_put('B');
+ e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh}
+dbg_put('C');
+ h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx}
+dbg_put('D');
+ h[2]:= e.tabv div 256; { 000000000000000087654321}
+
+dbg_put('E');
+ if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! }
+ else
+begin
+dbg_put('F1');
+ h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx }
+dbg_put('-2');
+end;
+dbg_put_ln('G');
+ { end; |with|}
+end; {|packentry|}
+
+
+
+procedure hashetr ( var w:wort; laenge:integer; i:infotype;
+ var g:boolean );
+
+ var v1: varr;
+ ind1, k1: intarr;
+ v: verdschlue;
+ ii,ind, k, j, e: integer;
+ gef,ngef:boolean;
+ entry: tableentry;
+ helem: hashelement;
+
+begin
+dbg_put_ln(' ** HTR 1');
+ if anzahl >= tabsize then begin
+dbg_put_ln(' ** HTR 2a');
+ g := false;
+ end
+ else begin
+dbg_put_ln(' ** HTR 2b');
+ if (anzahl < 10) or (anzahl mod 100 = 0) then begin
+ si_put_cr; si_put(' -Anzahl:',anzahl,'. ');
+ end;
+dbg_put_ln(' ** HTR 3');
+ hashfunk(w,1,laenge,v1,ind1,k1);
+dbg_put_ln(' ** HTR 4');
+ v := v1[laenge];
+ ind := ind1[laenge];
+ k := k1[laenge];
+ gef := false; ngef := false;
+ repeat
+dbg_put_ln(' ** HTR 5 A');
+ unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+dbg_put_ln(' ** HTR B');
+ if entry.frei or entry.wiederfrei then begin
+ anzahl := anzahl + 1;
+ ngef := true;
+ entry.tabv := v;
+dbg_put_ln(' ** HTR C1');
+ packinfo (i,entry.tabb);
+dbg_put_ln(' ** HTR D1');
+ entry.frei := false;
+ entry.wiederfrei := false;
+dbg_put_ln(' ** HTR E1');
+ packentry(entry,helem);
+dbg_put_ln(' ** HTR F1');
+ for ii := 0 to 3 do
+ htab[ind][ii] := helem[ii];
+ end else begin
+dbg_put_ln(' ** HTR C2');
+ gef := v = entry.tabv;
+ if not gef then ind := (ind+k) mod (tabsize + 1);
+dbg_put_ln(' ** HTR D2');
+ end;
+ until gef or ngef;
+dbg_put_ln(' ** HTR 6');
+ g := ngef;
+ end
+end; {|hashetr|}
+
+procedure hashempty;
+ var i,j:integer;
+ elem : tableentry;
+ he : hashelement;
+begin
+ { with elem do begin }
+ elem.tabv:=0;
+ elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen.
+ ( Und dies ist eine Beleidigung fuer jeden Affen ) HM }
+ elem.frei := true;
+ elem.wiederfrei := false;
+ { end; }
+ packentry (elem, he);
+ for i := 0 to tabsize do
+ for j := 0 to 3 do
+ htab[i][j] := he[j];
+ anzahl := 0;
+end; {|hashempty|}
+
+procedure hashsave (var status:integer);
+{ abspeichern der Hash-Tabelle auf file }
+ var i: integer;
+begin
+ for i:=1 to file_name_size do name_of_file[i]:=' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length:=3;
+ if a_open_out(hashfile) then begin
+ for i := 0 to tabsize do begin
+ write (hashfile, htab[i][0]:4);
+ write (hashfile, htab[i][1]:4);
+ write (hashfile, htab[i][2]:4);
+ write (hashfile, htab[i][3]:4);
+ write_ln (hashfile);
+ end;
+ status:=0;
+ a_close(hashfile);
+ end else status:=1;
+end; {|hashsave|}
+
+
+function hashsize :integer;
+begin
+ hashsize:=anzahl;
+end;
+
+
+procedure zahl(line:string80;var i:integer; ende:integer; var j:integer);
+ var aus: boolean;
+begin
+ j:=0;
+ repeat
+ if i<=ende then
+ if ktab[line[i]]="." then i:=i+1
+ else aus:=true
+ else aus:=true
+ until aus;
+ repeat
+ if i<=ende then begin
+ { if line[i] in ["0".."9"] then begin }
+ case line[i] of
+ "0","1","2","3","4","5","6","7","8","9":
+ begin j:=10*j+line[i]-"0";i:=i+1
+ end;
+ { else aus:=true geht nicht !!! }
+ end;
+ if (line[i] <> "0") and
+ (line[i] <> "1") and
+ (line[i] <> "2") and
+ (line[i] <> "3") and
+ (line[i] <> "4") and
+ (line[i] <> "5") and
+ (line[i] <> "6") and
+ (line[i] <> "7") and
+ (line[i] <> "8") and
+ (line[i] <> "9") then aus :=true;
+ end else aus:=true
+ until aus;
+end; {|zahl|}
+
+
+procedure infobau(line: string80; anfang,ende: integer;
+ { var inform: infotype;}
+ var informausnahme :boolean;
+ var informuntrennbar :boolean;
+ var informerste :integer;
+ var informzweite :integer;
+ var informendung :boolean;
+ var informvorsilbe :boolean;
+ var informstamm :boolean;
+ var informehervor :boolean;
+ var informstammallein:boolean;
+ var g: boolean);
+
+ var i,j:integer;ok,fehler:boolean;
+ b:buchstabe;
+begin
+ g:=false;
+ { with inform do begin } { initialisierung }
+ informausnahme:=false;
+ informendung:=false;
+ informvorsilbe:=false;
+ informehervor:=false;
+ informstamm:=false;
+ informstammallein:=false;
+ i:=anfang; ok:=false; fehler:=false;
+ repeat
+ if i<=ende then
+ if line[i]="." then i:=i+1 else ok:=true
+ else fehler:=true
+ until ok or fehler;
+ if not fehler then begin
+ b:=ktab[line[i]];
+ if b = bst_a then begin
+ {ausnahme}
+ informausnahme:=true;
+ i:=i+1;
+ if ktab[line[i]] = bst_u then begin
+ i := i + 1; informuntrennbar := true;
+ end else informuntrennbar := false;
+ zahl(line,i,ende,j);
+ if j=0 then begin
+ informerste:=7; informzweite:=7;
+ { Record-komponente ``zweite'' wird }
+ { initialisiert, damit beim packen keine }
+ { undefinierten Ergebnisse entstehen (die u.U. zu }
+ { RUN-TIME-ERRORS f\"uhren k\"onnen!) }
+ end else begin
+ j:=j-2;
+ if (j>=0) and (j<=6) then informerste:=j
+ else fehler:=true;
+ zahl(line,i,ende,j);
+ if j=0 then informzweite:=7
+ else begin
+ j:=j-informerste-4;
+ if (j>=0) and (j<=6) then informzweite:=j
+ else fehler:=true;
+ end;
+ end;
+ if not fehler then g:=true;
+ end {|if b = bst_a |}
+ else begin
+ ok:=false;
+ repeat
+ case b of
+ {bst_v} 22: informvorsilbe:=true;
+ {bst_e} 5: informendung:=true;
+ {bst_s} 19: informstamm:=true;
+ {bst_b} 2: informehervor:=true;
+ {bst_t} 20: informstammallein:=true;
+ {trennzeichen} 31:;
+ othercases fehler:=true
+ endcases;
+ if i=ende then ok:=true
+ else begin
+ i:=i+1;
+ b:=ktab[line[i]]
+ end
+ until ok or fehler;
+ if not fehler then
+ g := (informvorsilbe or informendung or informstamm)
+ and (not informehervor or informvorsilbe and informendung)
+ and (not informstammallein or informstamm);
+ end; {|if b = bst_a then-else|}
+ end {|if not fehler|}
+ { end |with inform|}
+end; {|infobau|}
+
+
+procedure eintragen (line: string80; l: integer );
+ var i, laenge: integer;
+ inform: infotype;
+ w: wort;
+ g: boolean;
+begin
+ laenge := 1;
+ while line [laenge] <> "." do laenge := laenge + 1;
+ laenge := laenge -1;
+ if laenge >= 1 then begin
+ if laenge <= maxwl then begin
+ infobau(line,laenge+1,l,
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,g);
+
+ if not g then begin
+ si_put_cr; si_put(' Info falsch: ')
+ end else begin
+ for i:= 1 to laenge do w[i]:=ktab[line[i]];
+ hashetr(w,laenge,inform,g);
+ if not g then begin
+ si_put_cr; si_put(' Tabellenfehler: ');
+ end;
+ end;
+ if not g then begin
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge <= maxwl|}
+ else begin
+ si_put_cr; si_put_ln(' zu langes Wort: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge >= 1|}
+ else begin
+ si_put_cr; si_put_ln(' Falsche Zeile: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+end; {|eintragen|}
+
+{---------------------------------------------------------------------------}
+
+{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) }
+
+procedure naechsterbst(var i:integer;var tr:trennvektor;
+ var dudstop:sperrvektor;var b:buchstabe;
+ var w:wort);
+ begin
+ if (i>0) and (tr[i]=keine) and not dudstop[i]
+ then begin b:=w[i];i:=i-1 end
+ else b:=trennzeichen
+ end;
+{---------------------------------------------------------------------------}
+{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) }
+
+ procedure duden (tr:trennvektor;
+ var w:wort;
+ var tr1 :trennvektor;
+ var dudtr:trennvektor;
+ dud :dudt; { array [0..maxwl] of boolean; }
+ var dudstop:sperrvektor;
+ laenge : integer;
+ var ok :boolean;
+ var zerlegungen:integer );
+
+ { traegt in dudtr die Trennstellen nach Dudenregeln ein }
+
+ { frueher mtype laut = (.....) }
+
+ var i:integer;
+ j:integer;
+ zust:integer;
+ aus:boolean;
+ tre:integer;
+ letzte:integer;
+ l,lalt:integer;{ vormals laut }
+ b:buchstabe;
+
+
+ begin { duden }
+ i:=laenge;
+ for j := 0 to laenge do dudtr[j] := tr[j];
+ while (i>0) and not dud [i] do i:=i-1;
+ while i>0 do begin
+ zust:=1; aus:=false; letzte := 0;
+ l:=kons;
+ b:=w[i];
+ i:=i-1;
+ repeat
+ {naechsten Laut lesen}
+ { procedure nlaut; }
+ begin { nlaut }
+ tre:=i+1;
+ lalt:=l;
+ case b of
+ {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_e } 5:begin
+ l:=vok_e; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_i then begin
+ l:=vok_ie;
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin
+ {ungetbst = } i := i + 1;
+ l:=vok_e;
+ b := bst_i;
+ end;
+ end
+ end;
+ {bst_i} 9:begin
+ l:=vok_i; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_u} 21:begin
+ l:=vok_u; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_t} 20:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_h} 8:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_c then begin
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end
+ else if b = bst_p then naechsterbst(i,tr,dudstop,b,w)
+ else if b = bst_t then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m,
+ bst_n, bst_p,
+ bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz }
+
+ 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 :
+
+ begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_y} 25:begin
+ l:=vok_y;
+ naechsterbst(i,tr,dudstop,b,w);
+ end;
+ {trennzeichen,sonderzeichen}
+ 31,0 :aus:=true
+ end;
+ end; { nlaut }
+
+ if not aus then
+ {Naechster Zustand}
+ case zust of
+ 1:if l=kons then zust:=2
+ else zust:=4;
+ 2:if l<>kons then zust:=3;
+ 3:if l=kons then zust:=6
+ else if l<>lalt then begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end;
+ 4:if l=kons then zust:=6
+ else zust:=3;
+ 6:if l=kons then begin
+ zust:=2;
+ letzte:=tre;
+ if (w[tre]=bst_c) and (w[tre+1] = bst_k) then
+ dudtr[letzte]:=nebenck
+ else dudtr[letzte]:=neben
+ end
+ else begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end
+ end
+ until aus;
+ if zust=2 then dudtr[letzte]:=keine
+ else if zust=4 then
+ { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then }
+ if (lalt < vok_ie) or (lalt > vok_eu) then
+ dudtr[letzte]:=keine;
+ while (i>0) and not dud[i] do i:=i-1
+ end;
+ end { duden };
+{---------------------------------------------------------------------------}
+{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor;
+ var ok1 : boolean);
+}
+
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+
+ { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen,
+ rechts muss noch ein Stamm kommen.
+ 2 ... Es kann Endung, Vorsilbe oder Stamm kommen.
+ 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden,
+ rechts muss noch ein Stamm kommen.
+ 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden.
+ 5 ... Trennstelle mit entfallenem Konsonanten }
+
+ var
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+
+ { procedure p_endung(var endok:boolean); }
+
+ { procedure p_vorsilbe(var vorok:boolean); }
+
+ { procedure p_stamm(var stok:boolean); }
+
+ { procedure p_stammallein (var staok:boolean); }
+
+ begin { trennen }
+ for i := 0 to maxwl do
+ spvtmp[i] := spv[i];
+ ok1:=false;
+ if anfang = laenge + 1
+ then { Ende des Wortes erreicht}
+ if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten }
+ begin
+ dud[anfang-1]:=true;
+
+ {duden(tr);}
+ duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen);
+
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+ end
+ else { kein Stamm im Wortrest ok1 = false }
+ else { restlichen Teil zerschneiden }
+ begin
+ hashfunk (w,anfang,laenge,v,ind,k);
+ schnitt := laenge;
+ nichtok := false;
+ repeat
+ { links abschneiden }
+ repeat
+ if spv[schnitt] then { Schnittstelle gesperrt }
+ gef:=false
+ else
+ begin
+ hashsuch (v[schnitt],ind[schnitt],k[schnitt],
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,gef);
+ end;
+ if gef then
+ spv[schnitt]:=true
+ else
+ schnitt := schnitt - 1
+ until gef or (schnitt = anfang - 1);
+
+ if gef then { teilwortanfang ist bekanntes wort }
+ begin
+ if not inform.ausnahme then
+ begin
+ if inform.endung and (zustand=2) then
+ begin
+
+ { --- p_endung(ok_end); --- }
+ ok_end:=false;
+ if (w[anfang]=bst_c) or (w[anfang]=bst_h) then
+ begin
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=neben
+ end;
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv[schnitt+1]:=true;
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_help
+ end;
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_end or ok_help;
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_endung(ok_end) - ende --- }
+
+ ok1 := ok1 or ok_end
+ end
+ else
+ ok_end:=false;
+ if inform.vorsilbe
+ then begin
+
+ { --- p_vorsilbe(ok_vor); --- }
+ { Trennstelle(n) vor der Vorsilbe eintragen }
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt;
+ end;
+ { Trennstellen innerhalb der Vorsilbe eintragen }
+ dud[schnitt]:=true;
+ { Rest des Wortes zerschneiden }
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ dud[schnitt]:=false;
+ { --- p_vorsilbe(ok_vor) - ende --- }
+
+ ok1 := ok1 or ok_vor
+ end
+ else
+ ok_vor := false;
+ if inform.stamm and not ok_vor
+ then begin
+ if not inform.stammallein
+ then begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true
+ end
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end
+ else
+ if (anfang=1) and (schnitt=laenge)
+ then begin
+
+ { --- p_stammallein(ok_stamm); --- }
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=haupt;
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_stammallein(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+ end
+ end
+ else begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true;
+ end;
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+
+ {naechsten Schleifendurchlauf vorbereiten}
+ schnitt := schnitt - 1;
+ nichtok := schnitt = anfang - 1
+ end
+ else { kein bekanntes Wort am Beginn des Teilwortes }
+ nichtok := true;
+
+ until nichtok
+ end;
+ for i := 0 to maxwl do
+ spv[i] := spvtmp[i]; {spv wiederherstellen, C Version. -PRAK!- }
+ end { trennen };
+
+{----------------------------------------------------------------------------}
+
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+
+ label 99;
+
+ { kommt in den outer Block }
+ { mtype sperrvektor=array [0..maxwl] of boolean; }
+
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+
+ begin { abteilen }
+ tr1[0] := keine;
+ for i:=0 to laenge do begin
+ tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false;
+ if i > 0 then
+ if (w[i] = trennzeichen) or (w[i] = sonderzeichen)
+ then begin
+ zerlegungen := 0;
+ ok := false;
+ goto 99;
+ end;
+ end;
+ zerlegungen:=0;
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+99:
+ end;{ abteilen }
+{----------------------------------------------------------------------------}
+
+ {identification number for dirty umlauts; see description in
+ change file}
+
+ function is_dirty_umlaut(p:pointer):boolean;
+ var res:boolean;
+ q:pointer;
+ begin
+ res:=false;
+ if p<>null then
+ if type(p)=disc_node then
+ if pre_break(p)<>null then
+ if link(pre_break(p))<>null then
+ if link(link(pre_break(p)))<>null then begin
+ q:=pre_break(p);
+ if type(q)=penalty_node then q:=link(q);
+ if (type(q)=kern_node)and(width(q)=spec_letter_ID)and
+ is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true;
+ end;
+ is_dirty_umlaut:=res;
+ end; {|is_dirty_umlaut|}
+
+ function get_char_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_char_of:=width(link(link(q)));
+ end; {|get_char_of|}
+
+ function get_font_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_font_of:=font(link(q));
+ end; {|get_font_of|}
+
+{----------------------------------------------------------------------------}
+
+@ Ende ...
+@z
+
+=========================================================================
+
+@x
+@ Now let's go back to the easier problem, of building the linked
+trie. When \.{INITEX} has scanned the `\.{\\patterns}' control
+sequence, it calls on |new_patterns| to do the right thing.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+label done, done1;
+var k,@!l:small_number; {indices into |hc| and |hyf|}
+@!digit_sensed:boolean; {should the next digit be treated as a letter?}
+@!v:quarterword; {trie op code}
+@!p,@!q:trie_pointer; {nodes of trie traversed during insertion}
+@!first_child:boolean; {is |p=trie_l[q]|?}
+@!c:ASCII_code; {character being inserted}
+begin if trie_not_ready then
+ begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+ @<Enter all of the patterns into a linked trie, until coming to a right
+ brace@>;
+ end
+else begin print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@y
+@ We do not build a trie (wether a linked nor a packed). Instead, we
+create a hash table for the \SISISI-hyphenation algorithm. But we
+still use the data provided by the `\.{\\patterns}' primitive.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+ label done;
+ var k: small_number; {index into |zeile|}
+ @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle }
+ @!status:integer;
+ @!c:ASCII_code; {character being inserted}
+begin
+ if trie_not_ready then begin
+ set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+
+ hashempty; { create the empty hash table }
+ @<Enter all of the patterns into a hash table, until coming to a right
+ brace; then skip an optional space@>;
+ hashsave(status);
+ if status<>0 then begin
+ wterm_ln('Fehler bei hash save !!!!!'{?});
+ wlog_ln( 'Fehler bei hash save !!!!!'{?});
+ end;
+ end else begin
+ print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@z
+
+
+--------------------------------------------------------------------------
+
+
+@x
+@ Novices are not supposed to be using \.{\\patterns}, so the error
+messages are terse. (Note that all error messages appear in \TeX's string
+pool, even if they are used only by \.{INITEX}.)
+
+@<Enter all of the patterns into a linked trie...@>=
+k:=0; hyf[0]:=0; digit_sensed:=false;
+loop@+ begin get_x_token;
+ case cur_cmd of
+ letter,other_char:@<Append a new letter or a hyphen level@>;
+ spacer,right_brace: begin if k>0 then
+ @<Insert a new pattern into the linked trie@>;
+ if cur_cmd=right_brace then goto done;
+ k:=0; hyf[0]:=0; digit_sensed:=false;
+ end;
+ othercases begin print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end
+ endcases;
+ end;
+done:
+@y
+@ Here we build the hash table for the \SISISI-hyphenation.
+
+@<Enter all of the patterns into a hash table, until coming to a right...@>=
+for k:=0 to maxwl do zeile[k]:=" ";
+k:=0;
+loop@+ begin
+ get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'.
+ Der Beistrich wird eigens abgefragt, da er in TeX
+ umdefiniert werden kann. }
+ if (cur_cmd = right_brace)or(cur_chr = ",") then
+ begin
+ { Ein Eintrag der Worttabelle - letzter
+ (|cur_cmd|=|right_brace|) - gelesen }
+ if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden }
+ if cur_cmd = right_brace then goto done;
+ k := 0; { hyf[] ist \"uberfl\"ussig, da die
+ Trenninformation in zeile mitverpackt ist. }
+ end
+ else { Das Wort ist noch nicht fertig gelesen }
+ if (cur_cmd = letter) or (cur_cmd = other_char)
+ or (cur_cmd = spacer) or (cur_chr = ".")
+ then begin
+ @<Append a new letter or a hyphen level@>;
+ end else begin
+ print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end;
+end; {|loop|}
+done:
+@z
+
+-----------------------------------------------------------------------------
+
+
+@x
+@ @<Append a new letter or a hyphen level@>=
+if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then
+ begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter}
+ else begin cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then
+ begin print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error;
+ end;
+ end;
+ if k<63 then
+ begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false;
+ end;
+ end
+else if k<63 then
+ begin hyf[k]:=cur_chr-"0"; digit_sensed:=true;
+ end
+@y
+@ @<Append a new letter or a hyphen level@>=
+if (cur_chr<>" ")then begin
+ { Das Leerzeichen wird \"uberlesen! }
+ if (cur_chr <> ".") then begin
+ { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten }
+ if (cur_chr<"0")or(cur_chr>"9") then begin
+ cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then begin
+ print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error; cur_chr:=128;
+ end;
+ end;
+ end;
+ if k<63 then begin
+ incr(k); zeile[k]:=cur_chr;
+ end;
+end;
+@z
+
+----------------------------------------------------------------------------
+
+
+@x
+@ When the following code comes into play, the pattern $p_1\ldots p_k$
+appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots
+n_k$ appears in |hyf[0..k]|.
+
+@<Insert a new pattern into the linked trie@>=
+begin @<Compute the trie op code, |v|, and set |l:=0|@>;
+q:=0; hc[0]:=cur_lang;
+while l<=k do
+ begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true;
+ while (p>0)and(c>so(trie_c[p])) do
+ begin q:=p; p:=trie_r[q]; first_child:=false;
+ end;
+ if (p=0)or(c<so(trie_c[p])) then
+ @<Insert a new trie node between |q| and |p|, and
+ make |p| point to it@>;
+ q:=p; {now node |q| represents $p_1\ldots p_l$}
+ end;
+if trie_o[q]<>min_quarterword then
+ begin print_err("Duplicate pattern");
+@.Duplicate pattern@>
+ help1("(See Appendix H.)"); error;
+ end;
+trie_o[q]:=v;
+end
+@y
+@ Well, that was everything about the initialization of the \SISISI hash
+table (at this place).
+
+All following sections, describing the initialization of the trie are
+replaced by ``empty sections'' in order to have same section numbering
+in SI\TeX as in \TeX.
+@z
+
+----------------------------------------------------------------------------
+
+@x
+@ @<Insert a new trie node between |q| and |p|...@>=
+begin if trie_ptr=trie_size then overflow("pattern memory",trie_size);
+@:TeX capacity exceeded pattern memory}{\quad pattern memory@>
+incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0;
+if first_child then trie_l[q]:=p@+else trie_r[q]:=p;
+trie_c[p]:=si(c); trie_o[p]:=min_quarterword;
+end
+@y
+@ ``Empty section''.
+@z
+------------------------------------------------------------------------------
+@x
+@ @<Compute the trie op code, |v|...@>=
+if hc[1]=0 then hyf[0]:=0;
+if hc[k]=0 then hyf[k]:=0;
+l:=k; v:=min_quarterword;
+loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v);
+ if l>0 then decr(l)@+else goto done1;
+ end;
+done1:
+@y
+@ Further ``empty section''.
+@z
+
+@x
+@ Finally we put everything together: Here is how the trie gets to its
+final, efficient form.
+The following packing routine is rigged so that the root of the linked
+tree gets mapped into location 1 of |trie|, as required by the hyphenation
+algorithm. This happens because the first call of |first_fit| will
+``take'' location~1.
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+var @!p:trie_pointer; {pointer for initialization}
+@!j,@!k,@!t:integer; {all-purpose registers for initialization}
+@!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+@!h:two_halves; {template used to zero out |trie|'s holes}
+begin @<Get ready to compress the trie@>;
+if trie_root<>0 then
+ begin first_fit(trie_root); trie_pack(trie_root);
+ end;
+@y
+@ Because we do not use the trie, we fill it with dummy data.
+But the main reason, why we do not remove this procedure is, that
+it is called and the used variables are referenced somewhere in \TeX.
+
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+ var @!p:trie_pointer; {pointer for initialization}
+ @!j,@!k,@!t:integer; {all-purpose registers for initialization}
+ @!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+begin
+ trie_root:=0;
+@z
+
+=========================================================================
+
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch
new file mode 100644
index 0000000000..107fff2fe0
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch
@@ -0,0 +1,1937 @@
+% Change file for TeX in C, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ../ChangeLog.W2C and ChangeLog)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting, 1986.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
+@y
+@d banner=='This is TeX, C Version 3.141 (+SISISI 1.0)'
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size is set from the system constant.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:SITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == PATH_MAX
+
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=100000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=15000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=100000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=124000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=24000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns}
+@!neg_trie_op_size=-750; {for lower trie_op_hash array bound}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='sitex.pool'; {name comes from \.{site.h}.}
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constants, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above), since to needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name) +1 ] := ' ';
+name_length := strlen (pool_name);
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read SITEX3.POOL.')
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read sitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! sitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! sitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! sitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin slow_print(format_ident); print_ln;
+ end;
+@y
+if format_ident>0 then slow_print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ slow_print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.104] `remainder' is a library routine on some systems, so change
+% its name to avoid conflicts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@y
+@d remainder == tex_remainder
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in
+% the basic version.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] We've put the memory structure into the include file
+% `texmf.h', since it's too hard to translate automatically. Also,
+% remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "texmfmem.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.519] In pack_file_name, leave room for the extra null we append at
+% the end of a filename in make_c_string.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.523] Change to pack_buffered_name as with pack_file_name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.532] `logname' is declared in <unistd.h> on some systems.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+@y
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+
+@d log_name == texmf_log_name
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.534] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try with |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ {Don't add |".tex"| if it's already there,
+ don't overflow |name_of_file|,
+ and don't add |".tex"| if |"foo"| and |"foo.tex"| are really the same
+ file, because of operating-system filename length limitations (e.g.,
+ |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ {Try without |".tex"|.}
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+@z
+
+% Knuth should fix this bug.
+@x
+if term_offset+length(name)>max_print_line-2 then print_ln
+@y
+if term_offset+length(name)>max_print_line-3 then print_ln
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Fix TFM file opening.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened:=false;
+pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+@x
+@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code}
+@y
+@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.?] Hack around the negative lower bound here.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size+trie_op_size)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] A casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+@x
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name; {Try with |".tex"|.}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name; {Try without |".tex"|.}
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+@y
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other
new file mode 100644
index 0000000000..ef710b8def
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other
@@ -0,0 +1,1964 @@
+% tex.ch for C compilation with web2c, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ChangeLog)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
+@y
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' {more is printed later}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size is set from the system constant.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:SITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == PATH_MAX
+
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=100000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=15000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=100000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=124000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=30000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX. This much is
+ needed for English, German, and Portuguese.}
+@!trie_op_size=751; {space for ``opcodes'' in the hyphenation patterns;
+ should be relatively prime to 313, 361, and 1009, and prime.}
+@!neg_trie_op_size=-751; {for lower |trie_op_hash| array bound;
+ must be equal to |-trie_op_size|.}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='sitex.pool';
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|,
+ equal to |mem_max| in \.{INITEX}, else not greater than |mem_max|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constant, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above) -- it needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name) +1 ] := ' ';
+name_length := strlen (pool_name);
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read SITEX3.POOL.')
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read sitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! sitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! sitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! sitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+wterm(banner);
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin slow_print(format_ident); print_ln;
+ end;
+@y
+wterm (banner);
+wterm (version_string);
+if format_ident>0 then slow_print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ slow_print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.104] `remainder' is a library routine on some systems, so change
+% its name to avoid conflicts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@y
+@d remainder == tex_remainder
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to change constants. Do not increase
+% max_quarterword without changing the memoryword structure in
+% `texmfmem.h'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] We've put the memory structure into the include file
+% `texmf.h', since it's too hard to translate automatically. Also,
+% remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "texmfmem.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.519] In pack_file_name, leave room for the extra null we append at
+% the end of a filename in make_c_string.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.523] Change to pack_buffered_name as with pack_file_name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.532] `logname' is declared in <unistd.h> on some systems.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+@y
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+
+@d log_name == texmf_log_name
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.536] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+begin wlog(banner);
+slow_print(format_ident); print(" ");
+print_int(day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+begin wlog (banner);
+wlog (version_string);
+slow_print(format_ident); print(" ");
+print_int(day); print_char(" ");
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try with |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ {Don't add |".tex"| if it's already there,
+ if it would overflow |name_of_file|,
+ or if |"foo"| and |"foo.tex"| are really the same
+ file, because of operating-system filename length limitations (e.g.,
+ |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+
+ {Try without |".tex"|.}
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+
+ {Couldn't find the file. Put |".tex"| back into the filename if we
+ removed it, and then invoke an external program. If it succeeds, try
+ opening the file once more.}
+ if cur_ext = "" then begin
+ cur_ext := ".tex";
+ pack_cur_name;
+ end;
+ if make_tex_tex then begin
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ end;
+@z
+
+% Knuth should fix this -- sometimes lines go over the |max_print_line|.
+% I don't remember what caused this, so I'll comment this out until it
+% happens again.
+% @x
+% if term_offset+length(name)>max_print_line-2 then print_ln
+% @y
+% if term_offset+length(name)>max_print_line-3 then print_ln
+% @z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Don't use font_area's in TFM opening, and invoke an external
+% program if the first open fails.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened := false;
+pack_file_name (nom, aire, ".tfm");
+if not b_open_in(tfm_file) then begin
+ if make_tex_tfm then begin
+ if not b_open_in(tfm_file) then abort;
+ end else
+ abort;
+end;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+@x
+@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code}
+@y
+@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] web2c can't parse negative lower bounds in arrays. Sorry.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem, and use |neg_trie_op_size|.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+ - trie_op_size;
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size - neg_trie_op_size)
+ + neg_trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] A casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+@x
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name; {Try with |".tex"|.}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name; {Try without |".tex"|.}
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+@y
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST b/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST
new file mode 100644
index 0000000000..74f1f775bf
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST
@@ -0,0 +1,20 @@
+Dieses Verzeichnis enthaelt:
+============================
+
+MANIFEST Dieses File
+install Installationsskript fuer ISITEX
+isiMakefile Ersetzt TEXDIR/Makefile
+isicoerce.h Kommt nach TEXDIR/coerce.h
+isiconvert Ersetzt TEXDIR/convert
+isictex.ch Ersetzt TEXDIR/ctex.ch
+isimakefile Ersetzt TEXSRC/makefile
+isitex.defines Kommt nach TEXDIR, enthaelt zusaetzl. Definitionen
+isitex.web.Z tex.web mit SISISI und ISITEX hineingetie'd
+isitex10.c Kommt nach TEXDIR/tex10.c
+isitex3.ch Changefile mit ISITEX
+isitex6.c Kommt nach TEXDIR/tex6.c
+isitex7.c Kommt nach TEXDIR/tex7.c
+isitexd.h Kommt nach TEXDIR/texd.h
+isiweb2c.c WEB2C Konverter mit groesseren Tabellen
+isiweb2c.h ditto
+isiweb2c.yacc Grammatik fuer WEB2C; auch fuer Zeigertypen
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/install b/obsolete/systems/sisisi/unix/iSiTeX3.14/install
new file mode 100644
index 0000000000..bf477b1a0e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/install
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX3.14"
+TEXDIR=$TEXSRC/tex
+WEBDIR=$TEXSRC/web
+WEB2CDIR=$TEXSRC/web2c
+ISITEXDIR="/users/heinz/src/tex/sisisi/isitex"
+
+cd $TEXSRC
+
+( cd $ISITEXDIR; uncompress <isitex.web.Z >$TEXDIR/tex.web;\
+ cp isiMakefile $TEXDIR/Makefile;\
+ cp isiconvert $TEXDIR/convert; cp isictex.ch $TEXDIR/ctex.ch;\
+ cp isimakefile $TEXSRC/makefile; cp isitex.defines $TEXDIR;\
+ cp isiweb2c.h $WEB2CDIR/web2c.h; cp isiweb2c.c $WEB2CDIR/web2c.c;\
+ cp isiweb2c.yacc $WEB2CDIR/web2c.yacc )
+
+make "CC=gcc" TeX
+if [ ! -f $TEXDIR/stamp-convert ]
+then
+ echo "*** ISITEX: tex.p not converted. Something's gone wrong. Stop." 1>&2
+ exit 1
+fi
+
+( cd $ISITEXDIR; cp isitex6.c $TEXDIR/tex6.c; cp isitex7.c $TEXDIR/tex7.c;\
+ cp isitex10.c $TEXDIR/tex10.c; cp isitexd.h $TEXDIR/texd.h;\
+ cp isicoerce.h $TEXDIR/coerce.h )
+
+make "CC=gcc" TeX
+if [ ! -f $TEXDIR/virtex ]
+then
+ echo "*** ISITEX: make failed. Stop." 1>&2
+ exit 2
+fi
+
+( cd $TEXDIR; mv tex.pool isitex.pool )
+
+make formats
+if [ ! -f $TEXSRC/stamp-formats ]
+then
+ echo "*** ISITEX: make formats failed. Stop." 1>&2
+ exit 2
+fi
+
+echo
+echo "ISITEX has been successfully compiled, and the format files have been"
+echo "generated. Now follow the guidelines from the README file for further"
+echo "installation. Do not forget to copy $TEXDIR/isitex.pool"
+echo "to your TEXPOOL-Directory."
+echo
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile
new file mode 100644
index 0000000000..2392cf8f21
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile
@@ -0,0 +1,201 @@
+# This file makes TeX in its various incarnations.
+#
+# The file ../common/texmf.h uses the symbol `TeX' to define certain
+# things that are different for TeX and Metafont, hence the addition to
+# CFLAGS.
+
+SITEDIR=..
+CC=gcc
+OPT=-O
+CFLAGS=$(OPT) -I$(SITEDIR) -DTeX
+LDFLAGS=
+LOADLIBES=
+SHELL=/bin/sh
+LN=ln
+
+# The formats we know how to make.
+#
+formats=amstex.fmt etex.fmt latex.fmt slitex.fmt tex.fmt \
+texinfo.fmt picplus.fmt
+
+
+makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \
+ LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)"
+
+.SUFFIXES:
+.SUFFIXES: .o .c
+.c.o:
+ $(CC) $(CFLAGS) -c $*.c
+
+# Routines used everywhere.
+#
+commondefines=../common/common.defines ../common/texmf.defines
+commonh=../common/extra.h ../common/common.h
+commono=../common/alloca.o ../common/extra.o
+
+# Routines used in both TeX and Metafont.
+#
+extrac=../common/texmf.c
+extrah=../common/texmf.h ../common/endian.h
+extrao=texmf.o
+
+# Routines used in TeX, Metafont, and BibTeX.
+#
+fileioc=../common/fileio.c
+fileioh=../common/fileio.h
+fileioo=fileio.o
+
+# We don't add `$(commono)' here, since it doesn't depend on anything in
+# this directory, and we write a dependency for `$(objs)' below.
+#
+objs=$(fileioo) tex0.o tex1.o tex2.o tex3.o tex4.o tex5.o tex6.o tex7.o tex8.o tex9.o tex10.o
+iobjs=iextra.o initex.o $(objs)
+vobjs=tex-extra.o itex.o $(objs)
+
+
+default: all
+
+all: initex virtex
+triptrap: triptex
+
+initex: stamp-convert $(iobjs) $(commono)
+ $(CC) -o initex $(LDFLAGS) $(iobjs) $(commono) $(LOADLIBES)
+
+virtex: stamp-convert $(vobjs) $(commono)
+ $(CC) -o virtex $(LDFLAGS) $(vobjs) $(commono) $(LOADLIBES)
+
+run-trip:
+ rm -f trip.tex
+ -$(LN) TeXtrip/trip.tex .
+ ../texware/pltotf TeXtrip/trip.pl trip.tfm
+ -$(SHELL) -c '. ./tripenv; \
+ ./triptex < TeXtrip/trip1.in > /dev/null 2>&1'
+ -diff TeXtrip/tripin.log trip.log
+ -$(SHELL) -c '. ./tripenv; \
+ ./triptex < TeXtrip/trip2.in > trip.fot'
+ -diff TeXtrip/trip.log trip.log
+ -diff TeXtrip/trip.fot trip.fot
+ $(SHELL) -c '. ./tripenv; \
+ ../texware/dvitype trip.dvi < TeXtrip/dvitype.in > trip.typ'
+ -diff TeXtrip/trip.typ trip.typ
+
+
+# Make format files automatically.
+#
+fmts: $(formats)
+
+amstex.fmt: tex.fmt
+ ./initex \&./tex amstex \\dump
+
+etex.fmt: tex.fmt
+ touch eplain.aux # Makes cross-reference warnings work right.
+ ./initex \&./tex eplain \\dump
+ mv eplain.fmt etex.fmt
+ mv eplain.log etex.log
+
+# Until LaTeX and SLiTeX are updated, we must use a hacked version, that
+# sets the new parameters to reasonable values.
+#
+latex.fmt:
+ ./initex lplain \\dump
+ mv lplain.fmt latex.fmt
+ mv lplain.log latex.log
+
+picplus.fmt: tex.fmt
+ ./initex \&./tex picplus \\dump
+
+slitex.fmt:
+ ./initex splain \\dump
+ mv splain.fmt slitex.fmt
+ mv splain.log slitex.log
+
+tex.fmt:
+ ./initex plain \\dump
+ mv plain.fmt tex.fmt
+ mv plain.log tex.log
+
+isitex.fmt:
+ ./initex siplain \\dump
+ mv siplain.fmt isitex.fmt
+ mv siplain.log isitex.log
+
+isilatex.fmt:
+ ./initex silplain \\dump
+ mv silplain.fmt isilatex.fmt
+ mv silplain.log isilatex.log
+
+# texinfo changes the escape character from `\' to `@'.
+#
+texinfo.fmt: tex.fmt
+ ./initex \&./tex texinfo @dump
+
+
+# The `ini_to_trip' script changes texd.h, instead of the change file, so
+# retangling is not necessary. After changing constants, making a
+# triptex means making an initex.
+#
+triptex: stamp-trip $(iobjs) $(commono)
+ make $(makeargs) initex
+ mv initex triptex
+
+stamp-trip: stamp-convert
+ rm -f *.o
+ $(SHELL) ./ini_to_trip texd.h
+ touch stamp-trip
+
+# tangle produces tex.p and tex.pool.
+#
+tex.p: tex.web ctex.ch
+ ../web/tangle tex.web ctex.ch
+
+# The convert script produces tex[0-8].c, itex.c, coerce.h, and texd.h.
+# The (hand-coded) memory.h is included in one of tex?.c files; it isn't
+# really necessary to `convert' again if it changes, only to recompile
+# those files, but describing that relationship is ugly to do.
+# (Furthermore, memory.h is stable.)
+#
+stamp-convert: tex.p memory.h fixcoerce.h $(commondefines)
+ $(SHELL) ./convert
+ touch stamp-convert
+
+# The (hand-coded) file $(extrac) and the (generated) file itex.c have
+# #ifdefs for INITEX, so we compile them differently.
+#
+iextra.o: $(extrac) texd.h $(extrah) $(commonh)
+ $(CC) $(CFLAGS) -I. -DINITEX -DINI -c $(extrac)
+ mv $(extrao) iextra.o
+
+initex.o: itex.c texd.h $(extrah) $(commonh)
+ $(CC) $(CFLAGS) -DINITEX -c itex.c && mv itex.o initex.o
+
+$(objs): stamp-convert texd.h
+tex-extra.o: $(extrac) texd.h
+ rm -f tex-extra.c
+ $(LN) $(extrac) tex-extra.c
+ $(CC) $(CFLAGS) -I. -c tex-extra.c
+
+$(fileioo): $(fileioc) $(fileioh)
+ $(CC) $(CFLAGS) -I. -c $(fileioc)
+
+tex0.o: tex0.c
+tex1.o: tex1.c
+tex2.o: tex2.c
+tex3.o: tex3.c
+tex4.o: tex4.c
+tex5.o: tex5.c
+tex6.o: tex6.c
+tex7.o: tex7.c
+tex8.o: tex8.c
+tex9.o: tex9.c
+tex10.o: tex10.c
+
+
+clean:
+ rm -f stamp-* *.o triptex initex virtex
+ rm -f texd.h coerce.h *.log *.fmt *.aux
+ rm -f 8terminal.tex trip.* tripos.tex dvitype.out
+ rm -f tex-extra.c
+
+veryclean: clean
+ rm -f tex?.c itex.c tex.p tex.pool texput.*
+ rm -f \#*\# *~ *.bak *.ckp core
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h
new file mode 100644
index 0000000000..57554163e7
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h
@@ -0,0 +1,927 @@
+void initialize();
+#define initialize_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void println();
+#define println_regmem
+void zprintchar();
+#define printchar(s) zprintchar((ASCIIcode) (s))
+#define printchar_regmem register memoryword *eqtb=zeqtb;
+void zprint();
+#define print(s) zprint((integer) (s))
+#define print_regmem register memoryword *eqtb=zeqtb;
+void zslowprint();
+#define slowprint(s) zslowprint((integer) (s))
+#define slowprint_regmem register memoryword *eqtb=zeqtb;
+void zprintnl();
+#define printnl(s) zprintnl((strnumber) (s))
+#define printnl_regmem
+void zprintesc();
+#define printesc(s) zprintesc((strnumber) (s))
+#define printesc_regmem register memoryword *eqtb=zeqtb;
+void zprintthedigs();
+#define printthedigs(k) zprintthedigs((eightbits) (k))
+#define printthedigs_regmem
+void zprintint();
+#define printint(n) zprintint((integer) (n))
+#define printint_regmem
+void zprintcs();
+#define printcs(p) zprintcs((integer) (p))
+#define printcs_regmem register memoryword *eqtb=zeqtb;
+void zsprintcs();
+#define sprintcs(p) zsprintcs((halfword) (p))
+#define sprintcs_regmem
+void zprintfilename();
+#define printfilename(n, a, e) zprintfilename((integer) (n), (integer) (a), (integer) (e))
+#define printfilename_regmem
+void zprintsize();
+#define printsize(s) zprintsize((integer) (s))
+#define printsize_regmem
+void zprintwritewhatsit();
+#define printwritewhatsit(s, p) zprintwritewhatsit((strnumber) (s), (halfword) (p))
+#define printwritewhatsit_regmem register memoryword *mem=zmem;
+void jumpout();
+#define jumpout_regmem
+void error();
+#define error_regmem
+void zfatalerror();
+#define fatalerror(s) zfatalerror((strnumber) (s))
+#define fatalerror_regmem
+void zoverflow();
+#define overflow(s, n) zoverflow((strnumber) (s), (integer) (n))
+#define overflow_regmem
+void zconfusion();
+#define confusion(s) zconfusion((strnumber) (s))
+#define confusion_regmem
+boolean initterminal();
+#define initterminal_regmem
+strnumber makestring();
+#define makestring_regmem
+boolean zstreqbuf();
+#define streqbuf(s, k) zstreqbuf((strnumber) (s), (integer) (k))
+#define streqbuf_regmem
+boolean zstreqstr();
+#define streqstr(s, t) zstreqstr((strnumber) (s), (strnumber) (t))
+#define streqstr_regmem
+boolean getstringsstarted();
+#define getstringsstarted_regmem
+void zprinttwo();
+#define printtwo(n) zprinttwo((integer) (n))
+#define printtwo_regmem
+void zprinthex();
+#define printhex(n) zprinthex((integer) (n))
+#define printhex_regmem
+void zprintromanint();
+#define printromanint(n) zprintromanint((integer) (n))
+#define printromanint_regmem
+void printcurrentstring();
+#define printcurrentstring_regmem
+void terminput();
+#define terminput_regmem
+void zinterror();
+#define interror(n) zinterror((integer) (n))
+#define interror_regmem
+void normalizeselector();
+#define normalizeselector_regmem
+void pauseforinstructions();
+#define pauseforinstructions_regmem
+integer zhalf();
+#define half(x) zhalf((integer) (x))
+#define half_regmem
+scaled zrounddecimals();
+#define rounddecimals(k) zrounddecimals((smallnumber) (k))
+#define rounddecimals_regmem
+void zprintscaled();
+#define printscaled(s) zprintscaled((scaled) (s))
+#define printscaled_regmem
+scaled zmultandadd();
+#define multandadd(n, x, y, maxanswer) zmultandadd((integer) (n), (scaled) (x), (scaled) (y), (scaled) (maxanswer))
+#define multandadd_regmem
+scaled zxovern();
+#define xovern(x, n) zxovern((scaled) (x), (integer) (n))
+#define xovern_regmem
+scaled zxnoverd();
+#define xnoverd(x, n, d) zxnoverd((scaled) (x), (integer) (n), (integer) (d))
+#define xnoverd_regmem
+halfword zbadness();
+#define badness(t, s) zbadness((scaled) (t), (scaled) (s))
+#define badness_regmem
+void zprintword();
+#define printword(w) zprintword((memoryword) (w))
+#define printword_regmem
+void zshowtokenlist();
+#define showtokenlist(p, q, l) zshowtokenlist((integer) (p), (integer) (q), (integer) (l))
+#define showtokenlist_regmem register memoryword *mem=zmem;
+void runaway();
+#define runaway_regmem register memoryword *mem=zmem;
+halfword getavail();
+#define getavail_regmem register memoryword *mem=zmem;
+void zflushlist();
+#define flushlist(p) zflushlist((halfword) (p))
+#define flushlist_regmem register memoryword *mem=zmem;
+halfword zgetnode();
+#define getnode(s) zgetnode((integer) (s))
+#define getnode_regmem register memoryword *mem=zmem;
+void zfreenode();
+#define freenode(p, s) zfreenode((halfword) (p), (halfword) (s))
+#define freenode_regmem register memoryword *mem=zmem;
+void sortavail();
+#define sortavail_regmem register memoryword *mem=zmem;
+halfword newnullbox();
+#define newnullbox_regmem register memoryword *mem=zmem;
+halfword newrule();
+#define newrule_regmem register memoryword *mem=zmem;
+halfword znewligature();
+#define newligature(f, c, q) znewligature((quarterword) (f), (quarterword) (c), (halfword) (q))
+#define newligature_regmem register memoryword *mem=zmem;
+halfword znewligitem();
+#define newligitem(c) znewligitem((quarterword) (c))
+#define newligitem_regmem register memoryword *mem=zmem;
+halfword newdisc();
+#define newdisc_regmem register memoryword *mem=zmem;
+halfword znewmath();
+#define newmath(w, s) znewmath((scaled) (w), (smallnumber) (s))
+#define newmath_regmem register memoryword *mem=zmem;
+halfword znewspec();
+#define newspec(p) znewspec((halfword) (p))
+#define newspec_regmem register memoryword *mem=zmem;
+halfword znewparamglue();
+#define newparamglue(n) znewparamglue((smallnumber) (n))
+#define newparamglue_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword znewglue();
+#define newglue(q) znewglue((halfword) (q))
+#define newglue_regmem register memoryword *mem=zmem;
+halfword znewskipparam();
+#define newskipparam(n) znewskipparam((smallnumber) (n))
+#define newskipparam_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword znewkern();
+#define newkern(w) znewkern((scaled) (w))
+#define newkern_regmem register memoryword *mem=zmem;
+halfword znewpenalty();
+#define newpenalty(m) znewpenalty((integer) (m))
+#define newpenalty_regmem register memoryword *mem=zmem;
+void zcheckmem();
+#define checkmem(printlocs) zcheckmem((boolean) (printlocs))
+#define checkmem_regmem register memoryword *mem=zmem;
+void zsearchmem();
+#define searchmem(p) zsearchmem((halfword) (p))
+#define searchmem_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zshortdisplay();
+#define shortdisplay(p) zshortdisplay((integer) (p))
+#define shortdisplay_regmem register memoryword *mem=zmem;
+void zprintfontandchar();
+#define printfontandchar(p) zprintfontandchar((integer) (p))
+#define printfontandchar_regmem register memoryword *mem=zmem;
+void zprintmark();
+#define printmark(p) zprintmark((integer) (p))
+#define printmark_regmem register memoryword *mem=zmem;
+void zprintruledimen();
+#define printruledimen(d) zprintruledimen((scaled) (d))
+#define printruledimen_regmem
+void zprintglue();
+#define printglue(d, order, s) zprintglue((scaled) (d), (integer) (order), (strnumber) (s))
+#define printglue_regmem
+void zprintspec();
+#define printspec(p, s) zprintspec((integer) (p), (strnumber) (s))
+#define printspec_regmem register memoryword *mem=zmem;
+void zprintfamandchar();
+#define printfamandchar(p) zprintfamandchar((halfword) (p))
+#define printfamandchar_regmem register memoryword *mem=zmem;
+void zprintdelimiter();
+#define printdelimiter(p) zprintdelimiter((halfword) (p))
+#define printdelimiter_regmem register memoryword *mem=zmem;
+void zprintsubsidiarydata();
+#define printsubsidiarydata(p, c) zprintsubsidiarydata((halfword) (p), (ASCIIcode) (c))
+#define printsubsidiarydata_regmem register memoryword *mem=zmem;
+void zprintstyle();
+#define printstyle(c) zprintstyle((integer) (c))
+#define printstyle_regmem
+void zprintskipparam();
+#define printskipparam(n) zprintskipparam((integer) (n))
+#define printskipparam_regmem
+void zshownodelist();
+#define shownodelist(p) zshownodelist((integer) (p))
+#define shownodelist_regmem register memoryword *mem=zmem;
+void zshowbox();
+#define showbox(p) zshowbox((halfword) (p))
+#define showbox_regmem register memoryword *eqtb=zeqtb;
+void zdeletetokenref();
+#define deletetokenref(p) zdeletetokenref((halfword) (p))
+#define deletetokenref_regmem register memoryword *mem=zmem;
+void zdeleteglueref();
+#define deleteglueref(p) zdeleteglueref((halfword) (p))
+#define deleteglueref_regmem register memoryword *mem=zmem;
+void zflushnodelist();
+#define flushnodelist(p) zflushnodelist((halfword) (p))
+#define flushnodelist_regmem register memoryword *mem=zmem;
+halfword zcopynodelist();
+#define copynodelist(p) zcopynodelist((halfword) (p))
+#define copynodelist_regmem register memoryword *mem=zmem;
+void zprintmode();
+#define printmode(m) zprintmode((integer) (m))
+#define printmode_regmem
+void pushnest();
+#define pushnest_regmem
+void popnest();
+#define popnest_regmem register memoryword *mem=zmem;
+void showactivities();
+#define showactivities_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zprintparam();
+#define printparam(n) zprintparam((integer) (n))
+#define printparam_regmem
+void begindiagnostic();
+#define begindiagnostic_regmem register memoryword *eqtb=zeqtb;
+void zenddiagnostic();
+#define enddiagnostic(blankline) zenddiagnostic((boolean) (blankline))
+#define enddiagnostic_regmem
+void zprintlengthparam();
+#define printlengthparam(n) zprintlengthparam((integer) (n))
+#define printlengthparam_regmem
+void zprintcmdchr();
+#define printcmdchr(cmd, chrcode) zprintcmdchr((quarterword) (cmd), (halfword) (chrcode))
+#define printcmdchr_regmem
+void zshoweqtb();
+#define showeqtb(n) zshoweqtb((halfword) (n))
+#define showeqtb_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zidlookup();
+#define idlookup(j, l) zidlookup((integer) (j), (integer) (l))
+#define idlookup_regmem
+void zprimitive();
+#define primitive(s, c, o) zprimitive((strnumber) (s), (quarterword) (c), (halfword) (o))
+#define primitive_regmem register memoryword *eqtb=zeqtb;
+void znewsavelevel();
+#define newsavelevel(c) znewsavelevel((groupcode) (c))
+#define newsavelevel_regmem
+void zeqdestroy();
+#define eqdestroy(w) zeqdestroy((memoryword) (w))
+#define eqdestroy_regmem register memoryword *mem=zmem;
+void zeqsave();
+#define eqsave(p, l) zeqsave((halfword) (p), (quarterword) (l))
+#define eqsave_regmem register memoryword *eqtb=zeqtb;
+void zeqdefine();
+#define eqdefine(p, t, e) zeqdefine((halfword) (p), (quarterword) (t), (halfword) (e))
+#define eqdefine_regmem register memoryword *eqtb=zeqtb;
+void zeqworddefine();
+#define eqworddefine(p, w) zeqworddefine((halfword) (p), (integer) (w))
+#define eqworddefine_regmem register memoryword *eqtb=zeqtb;
+void zgeqdefine();
+#define geqdefine(p, t, e) zgeqdefine((halfword) (p), (quarterword) (t), (halfword) (e))
+#define geqdefine_regmem register memoryword *eqtb=zeqtb;
+void zgeqworddefine();
+#define geqworddefine(p, w) zgeqworddefine((halfword) (p), (integer) (w))
+#define geqworddefine_regmem register memoryword *eqtb=zeqtb;
+void zsaveforafter();
+#define saveforafter(t) zsaveforafter((halfword) (t))
+#define saveforafter_regmem
+void zrestoretrace();
+#define restoretrace(p, s) zrestoretrace((halfword) (p), (strnumber) (s))
+#define restoretrace_regmem
+void unsave();
+#define unsave_regmem register memoryword *eqtb=zeqtb;
+void preparemag();
+#define preparemag_regmem register memoryword *eqtb=zeqtb;
+void ztokenshow();
+#define tokenshow(p) ztokenshow((halfword) (p))
+#define tokenshow_regmem register memoryword *mem=zmem;
+void printmeaning();
+#define printmeaning_regmem
+void showcurcmdchr();
+#define showcurcmdchr_regmem
+void showcontext();
+#define showcontext_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zbegintokenlist();
+#define begintokenlist(p, t) zbegintokenlist((halfword) (p), (quarterword) (t))
+#define begintokenlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void endtokenlist();
+#define endtokenlist_regmem
+void backinput();
+#define backinput_regmem register memoryword *mem=zmem;
+void backerror();
+#define backerror_regmem
+void inserror();
+#define inserror_regmem
+void beginfilereading();
+#define beginfilereading_regmem
+void endfilereading();
+#define endfilereading_regmem
+void clearforerrorprompt();
+#define clearforerrorprompt_regmem
+void checkoutervalidity();
+#define checkoutervalidity_regmem register memoryword *mem=zmem;
+void getnext();
+#define getnext_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void firmuptheline();
+#define firmuptheline_regmem register memoryword *eqtb=zeqtb;
+void gettoken();
+#define gettoken_regmem
+void macrocall();
+#define macrocall_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void insertrelax();
+#define insertrelax_regmem
+void expand();
+#define expand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void getxtoken();
+#define getxtoken_regmem
+void xtoken();
+#define xtoken_regmem
+void scanleftbrace();
+#define scanleftbrace_regmem
+void scanoptionalequals();
+#define scanoptionalequals_regmem
+boolean zscankeyword();
+#define scankeyword(s) zscankeyword((strnumber) (s))
+#define scankeyword_regmem register memoryword *mem=zmem;
+void muerror();
+#define muerror_regmem
+void scaneightbitint();
+#define scaneightbitint_regmem
+void scancharnum();
+#define scancharnum_regmem
+void scanfourbitint();
+#define scanfourbitint_regmem
+void scanfifteenbitint();
+#define scanfifteenbitint_regmem
+void scantwentysevenbitint();
+#define scantwentysevenbitint_regmem
+void scanfontident();
+#define scanfontident_regmem register memoryword *eqtb=zeqtb;
+void zfindfontdimen();
+#define findfontdimen(writing) zfindfontdimen((boolean) (writing))
+#define findfontdimen_regmem
+void zscansomethinginternal();
+#define scansomethinginternal(level, negative) zscansomethinginternal((smallnumber) (level), (boolean) (negative))
+#define scansomethinginternal_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void scanint();
+#define scanint_regmem
+void zscandimen();
+#define scandimen(mu, inf, shortcut) zscandimen((boolean) (mu), (boolean) (inf), (boolean) (shortcut))
+#define scandimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanglue();
+#define scanglue(level) zscanglue((smallnumber) (level))
+#define scanglue_regmem register memoryword *mem=zmem;
+halfword scanrulespec();
+#define scanrulespec_regmem register memoryword *mem=zmem;
+halfword zstrtoks();
+#define strtoks(b) zstrtoks((poolpointer) (b))
+#define strtoks_regmem register memoryword *mem=zmem;
+halfword thetoks();
+#define thetoks_regmem register memoryword *mem=zmem;
+void insthetoks();
+#define insthetoks_regmem register memoryword *mem=zmem;
+void convtoks();
+#define convtoks_regmem register memoryword *mem=zmem;
+halfword zscantoks();
+#define scantoks(macrodef, xpand) zscantoks((boolean) (macrodef), (boolean) (xpand))
+#define scantoks_regmem register memoryword *mem=zmem;
+void zreadtoks();
+#define readtoks(n, r) zreadtoks((integer) (n), (halfword) (r))
+#define readtoks_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void passtext();
+#define passtext_regmem
+void zchangeiflimit();
+#define changeiflimit(l, p) zchangeiflimit((smallnumber) (l), (halfword) (p))
+#define changeiflimit_regmem register memoryword *mem=zmem;
+void conditional();
+#define conditional_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void beginname();
+#define beginname_regmem
+boolean zmorename();
+#define morename(c) zmorename((ASCIIcode) (c))
+#define morename_regmem
+void endname();
+#define endname_regmem
+void zpackfilename();
+#define packfilename(n, a, e) zpackfilename((strnumber) (n), (strnumber) (a), (strnumber) (e))
+#define packfilename_regmem
+void zpackbufferedname();
+#define packbufferedname(n, a, b) zpackbufferedname((smallnumber) (n), (integer) (a), (integer) (b))
+#define packbufferedname_regmem
+strnumber makenamestring();
+#define makenamestring_regmem
+strnumber zamakenamestring();
+#define amakenamestring(f) zamakenamestring((alphafile *) &(f))
+#define amakenamestring_regmem
+strnumber zbmakenamestring();
+#define bmakenamestring(f) zbmakenamestring((bytefile *) &(f))
+#define bmakenamestring_regmem
+strnumber zwmakenamestring();
+#define wmakenamestring(f) zwmakenamestring((wordfile *) &(f))
+#define wmakenamestring_regmem
+void scanfilename();
+#define scanfilename_regmem
+void zpackjobname();
+#define packjobname(s) zpackjobname((strnumber) (s))
+#define packjobname_regmem
+void zpromptfilename();
+#define promptfilename(s, e) zpromptfilename((strnumber) (s), (strnumber) (e))
+#define promptfilename_regmem
+void openlogfile();
+#define openlogfile_regmem register memoryword *eqtb=zeqtb;
+void startinput();
+#define startinput_regmem register memoryword *eqtb=zeqtb;
+internalfontnumber zreadfontinfo();
+#define readfontinfo(u, nom, aire, s) zreadfontinfo((halfword) (u), (strnumber) (nom), (strnumber) (aire), (scaled) (s))
+#define readfontinfo_regmem register memoryword *eqtb=zeqtb;
+void zcharwarning();
+#define charwarning(f, c) zcharwarning((internalfontnumber) (f), (eightbits) (c))
+#define charwarning_regmem register memoryword *eqtb=zeqtb;
+halfword znewcharacter();
+#define newcharacter(f, c) znewcharacter((internalfontnumber) (f), (eightbits) (c))
+#define newcharacter_regmem register memoryword *mem=zmem;
+void dviswap();
+#define dviswap_regmem
+void zdvifour();
+#define dvifour(x) zdvifour((integer) (x))
+#define dvifour_regmem
+void zdvipop();
+#define dvipop(l) zdvipop((integer) (l))
+#define dvipop_regmem
+void zdvifontdef();
+#define dvifontdef(f) zdvifontdef((internalfontnumber) (f))
+#define dvifontdef_regmem
+void zmovement();
+#define movement(w, o) zmovement((scaled) (w), (eightbits) (o))
+#define movement_regmem register memoryword *mem=zmem;
+void zprunemovements();
+#define prunemovements(l) zprunemovements((integer) (l))
+#define prunemovements_regmem register memoryword *mem=zmem;
+void zspecialout();
+#define specialout(p) zspecialout((halfword) (p))
+#define specialout_regmem register memoryword *mem=zmem;
+void zwriteout();
+#define writeout(p) zwriteout((halfword) (p))
+#define writeout_regmem register memoryword *mem=zmem;
+void zoutwhat();
+#define outwhat(p) zoutwhat((halfword) (p))
+#define outwhat_regmem register memoryword *mem=zmem;
+void hlistout();
+#define hlistout_regmem register memoryword *mem=zmem;
+void vlistout();
+#define vlistout_regmem register memoryword *mem=zmem;
+void zshipout();
+#define shipout(p) zshipout((halfword) (p))
+#define shipout_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanspec();
+#define scanspec(c, threecodes) zscanspec((groupcode) (c), (boolean) (threecodes))
+#define scanspec_regmem
+halfword zhpack();
+#define hpack(p, w, m) zhpack((halfword) (p), (scaled) (w), (smallnumber) (m))
+#define hpack_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zvpackage();
+#define vpackage(p, h, m, l) zvpackage((halfword) (p), (scaled) (h), (smallnumber) (m), (scaled) (l))
+#define vpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zappendtovlist();
+#define appendtovlist(b) zappendtovlist((halfword) (b))
+#define appendtovlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword newnoad();
+#define newnoad_regmem register memoryword *mem=zmem;
+halfword znewstyle();
+#define newstyle(s) znewstyle((smallnumber) (s))
+#define newstyle_regmem register memoryword *mem=zmem;
+halfword newchoice();
+#define newchoice_regmem register memoryword *mem=zmem;
+void showinfo();
+#define showinfo_regmem register memoryword *mem=zmem;
+halfword zfractionrule();
+#define fractionrule(t) zfractionrule((scaled) (t))
+#define fractionrule_regmem register memoryword *mem=zmem;
+halfword zoverbar();
+#define overbar(b, k, t) zoverbar((halfword) (b), (scaled) (k), (scaled) (t))
+#define overbar_regmem register memoryword *mem=zmem;
+halfword zcharbox();
+#define charbox(f, c) zcharbox((internalfontnumber) (f), (quarterword) (c))
+#define charbox_regmem register memoryword *mem=zmem;
+void zstackintobox();
+#define stackintobox(b, f, c) zstackintobox((halfword) (b), (internalfontnumber) (f), (quarterword) (c))
+#define stackintobox_regmem register memoryword *mem=zmem;
+scaled zheightplusdepth();
+#define heightplusdepth(f, c) zheightplusdepth((internalfontnumber) (f), (quarterword) (c))
+#define heightplusdepth_regmem
+halfword zvardelimiter();
+#define vardelimiter(d, s, v) zvardelimiter((halfword) (d), (smallnumber) (s), (scaled) (v))
+#define vardelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zrebox();
+#define rebox(b, w) zrebox((halfword) (b), (scaled) (w))
+#define rebox_regmem register memoryword *mem=zmem;
+halfword zmathglue();
+#define mathglue(g, m) zmathglue((halfword) (g), (scaled) (m))
+#define mathglue_regmem register memoryword *mem=zmem;
+void zmathkern();
+#define mathkern(p, m) zmathkern((halfword) (p), (scaled) (m))
+#define mathkern_regmem register memoryword *mem=zmem;
+void flushmath();
+#define flushmath_regmem register memoryword *mem=zmem;
+halfword zcleanbox();
+#define cleanbox(p, s) zcleanbox((halfword) (p), (smallnumber) (s))
+#define cleanbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zfetch();
+#define fetch(a) zfetch((halfword) (a))
+#define fetch_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeover();
+#define makeover(q) zmakeover((halfword) (q))
+#define makeover_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeunder();
+#define makeunder(q) zmakeunder((halfword) (q))
+#define makeunder_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakevcenter();
+#define makevcenter(q) zmakevcenter((halfword) (q))
+#define makevcenter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeradical();
+#define makeradical(q) zmakeradical((halfword) (q))
+#define makeradical_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakemathaccent();
+#define makemathaccent(q) zmakemathaccent((halfword) (q))
+#define makemathaccent_regmem register memoryword *mem=zmem;
+void zmakefraction();
+#define makefraction(q) zmakefraction((halfword) (q))
+#define makefraction_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+scaled zmakeop();
+#define makeop(q) zmakeop((halfword) (q))
+#define makeop_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zmakeord();
+#define makeord(q) zmakeord((halfword) (q))
+#define makeord_regmem register memoryword *mem=zmem;
+void zmakescripts();
+#define makescripts(q, delta) zmakescripts((halfword) (q), (scaled) (delta))
+#define makescripts_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber zmakeleftright();
+#define makeleftright(q, style, maxd, maxh) zmakeleftright((halfword) (q), (smallnumber) (style), (scaled) (maxd), (scaled) (maxh))
+#define makeleftright_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mlisttohlist();
+#define mlisttohlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void pushalignment();
+#define pushalignment_regmem register memoryword *mem=zmem;
+void popalignment();
+#define popalignment_regmem register memoryword *mem=zmem;
+void getpreambletoken();
+#define getpreambletoken_regmem register memoryword *eqtb=zeqtb;
+void initalign();
+#define initalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zinitspan();
+#define initspan(p) zinitspan((halfword) (p))
+#define initspan_regmem
+void initrow();
+#define initrow_regmem register memoryword *mem=zmem;
+void initcol();
+#define initcol_regmem register memoryword *mem=zmem;
+boolean fincol();
+#define fincol_regmem register memoryword *mem=zmem;
+void finrow();
+#define finrow_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void finalign();
+#define finalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alignpeek();
+#define alignpeek_regmem
+halfword zfiniteshrink();
+#define finiteshrink(p) zfiniteshrink((halfword) (p))
+#define finiteshrink_regmem register memoryword *mem=zmem;
+void ztrybreak();
+#define trybreak(pi, breaktype) ztrybreak((integer) (pi), (smallnumber) (breaktype))
+#define trybreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zpostlinebreak();
+#define postlinebreak(finalwidowpenalty) zpostlinebreak((integer) (finalwidowpenalty))
+#define postlinebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber zreconstitute();
+#define reconstitute(j, n, bchar, hchar) zreconstitute((smallnumber) (j), (smallnumber) (n), (halfword) (bchar), (halfword) (hchar))
+#define reconstitute_regmem register memoryword *mem=zmem;
+void zhashfunk();
+#define hashfunk(w, anfang, ende, v, ind, k) zhashfunk( (w), (integer) (anfang), (integer) (ende), (v), (ind), (k))
+#define hashfunk_regmem
+void zunpackinfo();
+#define unpackinfo(b, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein) zunpackinfo((infobyte) (b), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein))
+#define unpackinfo_regmem
+void zunpackentry();
+#define unpackentry(h, etabv, etabb, efrei, ewiederfrei) zunpackentry( (h), (verdschlue *) &(etabv), (infobyte *) &(etabb), (boolean *) &(efrei), (boolean *) &(ewiederfrei))
+#define unpackentry_regmem
+void zhashsuch();
+#define hashsuch(v, ind, k, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein, g) zhashsuch((verdschlue) (v), (integer) (ind), (integer) (k), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein), (boolean *) &(g))
+#define hashsuch_regmem
+void zhashload();
+#define hashload(status) zhashload((integer *) &(status))
+#define hashload_regmem
+void inittrennen();
+#define inittrennen_regmem
+void zpackinfo();
+#define packinfo(i, b) zpackinfo((infotype) (i), (infobyte *) &(b))
+#define packinfo_regmem
+void zpackentry();
+#define packentry(e, h) zpackentry((tableentry) (e), (h))
+#define packentry_regmem
+void zhashetr();
+#define hashetr(w, laenge, i, g) zhashetr( (w), (integer) (laenge), (infotype) (i), (boolean *) &(g))
+#define hashetr_regmem
+void hashempty();
+#define hashempty_regmem
+void zhashsave();
+#define hashsave(status) zhashsave((integer *) &(status))
+#define hashsave_regmem
+integer hashsize();
+#define hashsize_regmem
+void zzahl();
+#define zahl(line, i, ende, j) zzahl( (line), (integer *) &(i), (integer) (ende), (integer *) &(j))
+#define zahl_regmem
+void zinfobau();
+#define infobau(line, anfang, ende, informausnahme, informuntrennbar, informerste, informzweite, informendung, informvorsilbe, informstamm, informehervor, informstammallein, g) zinfobau( (line), (integer) (anfang), (integer) (ende), (boolean *) &(informausnahme), (boolean *) &(informuntrennbar), (integer *) &(informerste), (integer *) &(informzweite), (boolean *) &(informendung), (boolean *) &(informvorsilbe), (boolean *) &(informstamm), (boolean *) &(informehervor), (boolean *) &(informstammallein), (boolean *) &(g))
+#define infobau_regmem
+void zeintragen();
+#define eintragen(line, l) zeintragen( (line), (integer) (l))
+#define eintragen_regmem
+void znaechsterbst();
+#define naechsterbst(i, tr, dudstop, b, w) znaechsterbst((integer *) &(i), (tr), (dudstop), (buchstabe *) &(b), (w))
+#define naechsterbst_regmem
+void zduden();
+#define duden(tr, w, tr1, dudtr, dud, dudstop, laenge, ok, zerlegungen) zduden( (tr), (w), (tr1), (dudtr), (dud), (dudstop), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen))
+#define duden_regmem
+void ztrennen();
+#define trennen(zustand, anfang, spv, ok1, alletr, tr, dudtr, zerlegungen, dud, v, ind, k, dudstop, w, tr1, laenge) ztrennen((integer) (zustand), (integer) (anfang), (spv), (boolean *) &(ok1), (alletr), (tr), (dudtr), (integer *) &(zerlegungen), (dud), (v), (ind), (k), (dudstop), (w), (tr1), (integer) (laenge))
+#define trennen_regmem
+void zwchar();
+#define wchar(c) zwchar((halfword) (c))
+#define wchar_regmem
+void zwwort();
+#define wwort(w, l) zwwort( (w), (integer) (l))
+#define wwort_regmem
+void zwritewt();
+#define writewt(w, l, tr) zwritewt( (w), (integer) (l), (tr))
+#define writewt_regmem
+void wjob();
+#define wjob_regmem
+integer zvergl();
+#define vergl(wrt1, l1, wrt2, l2) zvergl( (wrt1), (integer) (l1), (wrt2), (integer) (l2))
+#define vergl_regmem
+void zgleicheweg();
+#define gleicheweg(alletr, zerleg, laenge) zgleicheweg( (alletr), (integer *) &(zerleg), (integer) (laenge))
+#define gleicheweg_regmem
+void zmdbeintragen();
+#define mdbeintragen(w, l, tr, neu, used, mdb) zmdbeintragen( (w), (integer) (l), (tr), (boolean) (neu), (boolean) (used), (mdbknoten *) &(mdb))
+#define mdbeintragen_regmem
+void zmdmeintragen();
+#define mdmeintragen(w, l, tr, neu, mdm) zmdmeintragen( (w), (integer) (l), (tr), (boolean) (neu), (mdmknoten *) &(mdm))
+#define mdmeintragen_regmem
+void zmdleintragen();
+#define mdleintragen(w, l, mdl) zmdleintragen( (w), (integer) (l), (mdlknoten *) &(mdl))
+#define mdleintragen_regmem
+void zmdeeintragen();
+#define mdeeintragen(w, l, mde) zmdeeintragen( (w), (integer) (l), (mdeknoten *) &(mde))
+#define mdeeintragen_regmem
+boolean zmdsuchen();
+#define mdsuchen(w, l, mdb, tr) zmdsuchen( (w), (integer) (l), (mdbknoten *) &(mdb), (tr))
+#define mdsuchen_regmem
+boolean zinuse();
+#define inuse(w, l, mdb) zinuse( (w), (integer) (l), (mdbknoten) (mdb))
+#define inuse_regmem
+void hsinit();
+#define hsinit_regmem
+void zabteilen();
+#define abteilen(w, tr1, alletr, laenge, ok, zerlegungen) zabteilen( (w), (tr1), (alletr), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen))
+#define abteilen_regmem
+boolean zisdirtyumlaut();
+#define isdirtyumlaut(p) zisdirtyumlaut((halfword) (p))
+#define isdirtyumlaut_regmem register memoryword *mem=zmem;
+integer zgetcharof();
+#define getcharof(s) zgetcharof((halfword) (s))
+#define getcharof_regmem register memoryword *mem=zmem;
+integer zgetfontof();
+#define getfontof(s) zgetfontof((halfword) (s))
+#define getfontof_regmem register memoryword *mem=zmem;
+void hyphenate();
+#define hyphenate_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+trieopcode znewtrieop();
+#define newtrieop(d, n, v) znewtrieop((smallnumber) (d), (smallnumber) (n), (trieopcode) (v))
+#define newtrieop_regmem
+triepointer ztrienode();
+#define trienode(p) ztrienode((triepointer) (p))
+#define trienode_regmem
+triepointer zcompresstrie();
+#define compresstrie(p) zcompresstrie((triepointer) (p))
+#define compresstrie_regmem
+void zfirstfit();
+#define firstfit(p) zfirstfit((triepointer) (p))
+#define firstfit_regmem
+void ztriepack();
+#define triepack(p) ztriepack((triepointer) (p))
+#define triepack_regmem
+void ztriefix();
+#define triefix(p) ztriefix((triepointer) (p))
+#define triefix_regmem
+void newpatterns();
+#define newpatterns_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void inittrie();
+#define inittrie_regmem
+void zlinebreak();
+#define linebreak(finalwidowpenalty) zlinebreak((integer) (finalwidowpenalty))
+#define linebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void newhyphexceptions();
+#define newhyphexceptions_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+halfword zprunepagetop();
+#define prunepagetop(p) zprunepagetop((halfword) (p))
+#define prunepagetop_regmem register memoryword *mem=zmem;
+halfword zvertbreak();
+#define vertbreak(p, h, d) zvertbreak((halfword) (p), (scaled) (h), (scaled) (d))
+#define vertbreak_regmem register memoryword *mem=zmem;
+halfword zvsplit();
+#define vsplit(n, h) zvsplit((eightbits) (n), (scaled) (h))
+#define vsplit_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void printtotals();
+#define printtotals_regmem
+void zfreezepagespecs();
+#define freezepagespecs(s) zfreezepagespecs((smallnumber) (s))
+#define freezepagespecs_regmem register memoryword *eqtb=zeqtb;
+void zboxerror();
+#define boxerror(n) zboxerror((eightbits) (n))
+#define boxerror_regmem register memoryword *eqtb=zeqtb;
+void zensurevbox();
+#define ensurevbox(n) zensurevbox((eightbits) (n))
+#define ensurevbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zfireup();
+#define fireup(c) zfireup((halfword) (c))
+#define fireup_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void buildpage();
+#define buildpage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appspace();
+#define appspace_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void insertdollarsign();
+#define insertdollarsign_regmem
+void youcant();
+#define youcant_regmem
+void reportillegalcase();
+#define reportillegalcase_regmem
+boolean privileged();
+#define privileged_regmem
+boolean itsallover();
+#define itsallover_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appendglue();
+#define appendglue_regmem register memoryword *mem=zmem;
+void appendkern();
+#define appendkern_regmem register memoryword *mem=zmem;
+void offsave();
+#define offsave_regmem register memoryword *mem=zmem;
+void extrarightbrace();
+#define extrarightbrace_regmem
+void normalparagraph();
+#define normalparagraph_regmem register memoryword *eqtb=zeqtb;
+void zboxend();
+#define boxend(boxcontext) zboxend((integer) (boxcontext))
+#define boxend_regmem register memoryword *mem=zmem;
+void zbeginbox();
+#define beginbox(boxcontext) zbeginbox((integer) (boxcontext))
+#define beginbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zscanbox();
+#define scanbox(boxcontext) zscanbox((integer) (boxcontext))
+#define scanbox_regmem
+void zpackage();
+#define package(c) zpackage((smallnumber) (c))
+#define package_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+smallnumber znormmin();
+#define normmin(h) znormmin((integer) (h))
+#define normmin_regmem
+void znewgraf();
+#define newgraf(indented) znewgraf((boolean) (indented))
+#define newgraf_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void indentinhmode();
+#define indentinhmode_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void headforvmode();
+#define headforvmode_regmem
+void endgraf();
+#define endgraf_regmem register memoryword *eqtb=zeqtb;
+void begininsertoradjust();
+#define begininsertoradjust_regmem
+void makemark();
+#define makemark_regmem register memoryword *mem=zmem;
+void appendpenalty();
+#define appendpenalty_regmem register memoryword *mem=zmem;
+void deletelast();
+#define deletelast_regmem register memoryword *mem=zmem;
+void unpackage();
+#define unpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appenditaliccorrection();
+#define appenditaliccorrection_regmem register memoryword *mem=zmem;
+void appenddiscretionary();
+#define appenddiscretionary_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void builddiscretionary();
+#define builddiscretionary_regmem register memoryword *mem=zmem;
+void makeaccent();
+#define makeaccent_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alignerror();
+#define alignerror_regmem
+void noalignerror();
+#define noalignerror_regmem
+void omiterror();
+#define omiterror_regmem
+void doendv();
+#define doendv_regmem
+void cserror();
+#define cserror_regmem
+void zpushmath();
+#define pushmath(c) zpushmath((groupcode) (c))
+#define pushmath_regmem
+void initmath();
+#define initmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void starteqno();
+#define starteqno_regmem register memoryword *eqtb=zeqtb;
+void zscanmath();
+#define scanmath(p) zscanmath((halfword) (p))
+#define scanmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void zsetmathchar();
+#define setmathchar(c) zsetmathchar((integer) (c))
+#define setmathchar_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mathlimitswitch();
+#define mathlimitswitch_regmem register memoryword *mem=zmem;
+void zscandelimiter();
+#define scandelimiter(p, r) zscandelimiter((halfword) (p), (boolean) (r))
+#define scandelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void mathradical();
+#define mathradical_regmem register memoryword *mem=zmem;
+void mathac();
+#define mathac_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void appendchoices();
+#define appendchoices_regmem register memoryword *mem=zmem;
+halfword zfinmlist();
+#define finmlist(p) zfinmlist((halfword) (p))
+#define finmlist_regmem register memoryword *mem=zmem;
+void buildchoices();
+#define buildchoices_regmem register memoryword *mem=zmem;
+void subsup();
+#define subsup_regmem register memoryword *mem=zmem;
+void mathfraction();
+#define mathfraction_regmem register memoryword *mem=zmem;
+void mathleftright();
+#define mathleftright_regmem register memoryword *mem=zmem;
+void aftermath();
+#define aftermath_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void resumeafterdisplay();
+#define resumeafterdisplay_regmem
+void getrtoken();
+#define getrtoken_regmem
+void trapzeroglue();
+#define trapzeroglue_regmem register memoryword *mem=zmem;
+void zdoregistercommand();
+#define doregistercommand(a) zdoregistercommand((smallnumber) (a))
+#define doregistercommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void alteraux();
+#define alteraux_regmem
+void alterprevgraf();
+#define alterprevgraf_regmem
+void alterpagesofar();
+#define alterpagesofar_regmem
+void alterinteger();
+#define alterinteger_regmem
+void alterboxdimen();
+#define alterboxdimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void znewfont();
+#define newfont(a) znewfont((smallnumber) (a))
+#define newfont_regmem register memoryword *eqtb=zeqtb;
+void newinteraction();
+#define newinteraction_regmem
+void prefixedcommand();
+#define prefixedcommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void doassignments();
+#define doassignments_regmem
+void openorclosein();
+#define openorclosein_regmem
+void issuemessage();
+#define issuemessage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void shiftcase();
+#define shiftcase_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void showwhatever();
+#define showwhatever_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void storefmtfile();
+#define storefmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void znewwhatsit();
+#define newwhatsit(s, w) znewwhatsit((smallnumber) (s), (smallnumber) (w))
+#define newwhatsit_regmem register memoryword *mem=zmem;
+void znewwritewhatsit();
+#define newwritewhatsit(w) znewwritewhatsit((smallnumber) (w))
+#define newwritewhatsit_regmem register memoryword *mem=zmem;
+void doextension();
+#define doextension_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void fixlanguage();
+#define fixlanguage_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void handlerightbrace();
+#define handlerightbrace_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void maincontrol();
+#define maincontrol_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void giveerrhelp();
+#define giveerrhelp_regmem register memoryword *eqtb=zeqtb;
+boolean openfmtfile();
+#define openfmtfile_regmem
+boolean loadfmtfile();
+#define loadfmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void closefilesandterminate();
+#define closefilesandterminate_regmem register memoryword *eqtb=zeqtb;
+void finalcleanup();
+#define finalcleanup_regmem register memoryword *mem=zmem;
+void initprim();
+#define initprim_regmem register memoryword *eqtb=zeqtb;
+void debughelp();
+#define debughelp_regmem register memoryword *mem=zmem, *eqtb=zeqtb;
+void texbody();
+#define texbody_regmem register memoryword *eqtb=zeqtb;
+/*
+ * The C compiler ignores most unnecessary casts (i.e., casts of something
+ * to its own type). However, for structures, it doesn't. Therefore,
+ * we have to redefine these two macros so that they don't try to cast
+ * the argument (a memoryword) as a memoryword.
+ */
+#undef eqdestroy
+#define eqdestroy(x) zeqdestroy(x)
+#undef printword
+#define printword(x) zprintword(x)
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert
new file mode 100644
index 0000000000..9fdda3605e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Convert TeX to C.
+#
+
+cat ../common/common.defines ../common/texmf.defines isitex.defines tex.p \
+ | ../web2c/web2c -t -h../common/texmf.h \
+ | ../web2c/fixwrites -t \
+ | ../web2c/regfix \
+ | ../web2c/splitup
+
+cat coerce.h fixcoerce.h > xcoerce.h
+mv xcoerce.h coerce.h
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch
new file mode 100644
index 0000000000..7e33680ab4
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch
@@ -0,0 +1,1878 @@
+% Change file for TeX in C, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ../ChangeLog.W2C)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting, 1986.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner (changed to show trie extension version)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0) {+iSi 92}'
+@y
+@d banner=='This is TeX, C Version 3.14t3 (+SISISI 1.0) {+iSi 92}' {printed when \TeX\ starts}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size becomes FILENAMESIZE.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:ISITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=72000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=7500; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=74000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=100000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=24000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns}
+@!neg_trie_op_size=-750; {for lower trie_op_hash array bound}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='isitex.pool';
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constants, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above), since to needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name)+1] := ' ';
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read ISITEX3.POOL.');
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read isitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! isitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! isitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! isitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin print(format_ident); print_ln;
+ end;
+@y
+if format_ident>0 then print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in
+% the basic version.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] Put the memory structure into an include file, since it's too
+% hard to translate automatically. Also, remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "memory.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.534] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try without |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ pack_cur_name; {Try adding |".tex"|, even if we already have an extension.}
+ if name_length < file_name_size + 5 {Don't overflow the array.}
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+@z
+
+% Knuth should fix this bug.
+@x
+if term_offset+length(name)>max_print_line-2 then print_ln
+@y
+if term_offset+length(name)>max_print_line-3 then print_ln
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Fix TFM file opening.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened:=false;
+pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+%@x
+% begin if trie_op(z)<>min_quarterword then
+%@y
+% begin if trie_op(z)<>min_trie_op then
+%@z
+%@x
+%until v=min_quarterword;
+%@y
+%until v=min_trie_op;
+%@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.?] Hack around the negative lower bound here.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size+trie_op_size)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] And another.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ pack_cur_name;
+ if name_length < file_name_size + 5 {Don't overflow the array.}
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print(log_name); print_char(".");
+ end;
+ end;
+@y
+ print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile b/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile
new file mode 100644
index 0000000000..3a1d2425b7
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile
@@ -0,0 +1,280 @@
+# Overall Makefile for making TeX, Metafont, and friends, using WEB to C.
+
+
+# TeX 3.14 + Metafont 2.7 + web2c b.
+#
+version=5.84b
+
+# Directory that site.h is in relative to subdirectories, i.e., `..'
+# means the directory containing this Makefile.
+SITEDIR=..
+
+# Default C compiler.
+CC=gcc
+
+# Default flags to give the C compiler. (Don't define CFLAGS directly.)
+OPT=-O
+
+# Default flags to give to the loader.
+LDFLAGS=
+
+# Default libraries with which to link (libraries for the Metafont
+# support are specified separately).
+LOADLIBES=
+
+# Make sure we use the sh. If your sh is broken, you might try bash,
+# the GNU replacement.
+SHELL=/bin/sh
+
+# The yacc program to use on web2c/web2c.yacc.
+YACC=bison -y
+
+# The lex program to use on web2c/web2c.lex.
+LEX=lex
+# -ll for lex, -lfl for flex.
+LEXLIB=-ll
+
+# Need -D_POSIX_SOURCE here, perhaps, if on a POSIX system.
+LEXCFLAGS=
+
+# How to make a link.
+LN=ln -s
+
+# Support libraries for Metafont.
+x10lib=-lX
+x11lib=-lXt -lX11
+sunlib=-lsuntool -lsunwindow -lpixrect
+
+# This line should select the libraries that match what you said in site.h.
+wlibs=$(x11lib)
+
+# These lines define the format and base files that `make fmts' and
+# `make bases' will try to make, and `make install' will try to install.
+# See README.W2C for a brief description of each of these formats.
+formats=isitex.fmt isilatex.fmt
+# etex.fmt \
+# amstex.fmt amslatex.fmt picplus.fmt texinfo.fmt
+bases=mf.base cmmf.base
+
+# The name of the file that defines your local devices, for use with
+# Metafont. (Only relevant during `make bases'.) I urge you to get the
+# file `modes.mf', which defines all known modes, plus useful
+# definitions for all fonts. It's available from ftp.cs.umb.edu
+# [192.12.26.23] as pub/tex/modes.mf, among other places.
+localmodes=modes
+
+# You may need INSTALL=cp on system V, if you don't have GNU install.
+# Or you can install the programs by hand.
+# $(fileinstall) is used for the format and base files, man files, and
+# other non-executables, and $(programinstall) is used for
+# the executables.
+INSTALL=install -g tex -c
+fileinstall=$(INSTALL) -m 664
+proginstall=$(INSTALL) -m 775 -s
+
+# These pathnames are used to customize the manual pages with local
+# directory names; some of them are used in `make install'. They should
+# match the system directories in the paths defined in `./site.h'.
+bindir=/usr/local/bin
+manext=l
+mandir=/usr/man/man$(manext)
+
+texlibdir=/usr/local/lib/tex
+texpooldir=$(texlibdir)
+texinputdir=$(texlibdir)/inputs
+texfontdir=$(texlibdir)/fonts
+formatdir=$(texlibdir)/formats
+
+mflibdir=/usr/local/lib/mf
+mfpooldir=$(mflibdir)
+mfinputdir=$(mflibdir)/inputs
+basedir=$(mflibdir)/bases
+
+# Where the Computer Modern sources are.
+# (The man pages claim that you have installed the standard utility
+# sources, like `grayf.mf' and `expr.mf', somewhere in $(mfinputdir).)
+cmsources=/usr/local/src/other/TeX+MF/typefaces/cm
+
+default: all
+
+
+# Stuff below here probably doesn't need to be changed.
+#
+alldirs=web tex mf texware mfware fontutil bibtex dviutil
+triptrapdirs=tex texware mf mfware
+
+makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \
+SHELL="$(SHELL)" LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" wlibs="$(wlibs)"
+
+web2c=web2c
+web2cprograms=$(web2c)/web2c $(web2c)/regfix $(web2c)/splitup \
+ $(web2c)/fixwrites
+commonsources=common/alloca.c common/extra.c common/main.c common/endian.c
+
+triptrap: stamp-tangle stamp-common
+ for name in $(triptrapdirs); \
+ do \
+ (cd $${name}; make $(makeargs) LN="$(LN)" triptrap); \
+ done
+
+run-triptrap: run-trip run-trap
+
+clean-triptrap:
+ cd tex; make veryclean
+ cd mf; make veryclean
+
+all: stamp-web2c stamp-common
+ for name in $(alldirs); \
+ do \
+ (cd $${name}; echo $${name}; make $(makeargs) all); \
+ done
+
+TeX: stamp-web2c stamp-tangle stamp-common
+ cd tex; make $(makeargs) all
+
+BibTeX: stamp-web2c stamp-tangle stamp-common
+ cd bibtex; make $(makeargs) all
+
+run-trip:
+ cd tex; make run-trip
+
+MF: stamp-web2c stamp-tangle stamp-common
+ cd mf; make $(makeargs) all
+
+run-trap:
+ cd mf; make run-trap
+
+
+# The targets below must be up to date for anything to be made.
+#
+
+stamp-web2c:
+ cd $(web2c); \
+ make $(makeargs) YACC="$(YACC)" LEX="$(LEX)" LEXLIB="$(LEXLIB)" all
+ touch stamp-web2c
+
+stamp-common: $(commonsources)
+ cd common; make $(makeargs) all
+ touch stamp-common
+
+stamp-tangle: stamp-web2c stamp-common
+ cd web; make $(makeargs) tangle
+ touch stamp-tangle
+
+
+manpages:
+ cd man; make SITEDIR=$(SITEDIR) \
+ bindir=$(bindir) texlibdir=$(texlibdir) \
+ texpooldir=$(texpooldir) formatdir=$(formatdir) \
+ texinputdir=$(texinputdir) texfontdir=$(texfontdir) \
+ mflibdir=$(mflibdir) mfpooldir=$(mfpooldir) \
+ basedir=$(basedir) mfinputdir=$(mfinputdir) \
+ cmsources=$(cmsources) \
+ all
+
+bases: stamp-bases
+stamp-bases:
+ cd mf; MFPOOL=.; export MFPOOL; \
+ make bases="$(bases)" localmodes="$(localmodes)" bases
+ touch stamp-bases
+
+formats: stamp-formats
+stamp-formats:
+ cd tex; TEXPOOL=.; export TEXPOOL; make formats="$(formats)" fmts
+ touch stamp-formats
+
+
+# Installation targets.
+#
+install-manpages:
+ cd man; make mandir=$(mandir) INSTALL="$(fileinstall)" \
+ SITEDIR="$(SITEDIR)" manext=$(manext) install
+
+install:
+ if test -d $(bindir); then exit 0; else mkdir $(bindir); fi
+ $(proginstall) tex/initex $(bindir)/initex
+ $(proginstall) tex/virtex $(bindir)/virtex
+ $(proginstall) mf/inimf $(bindir)/inimf
+ $(proginstall) mf/virmf $(bindir)/virmf
+ $(proginstall) web/tangle $(bindir)/tangle
+ $(proginstall) web/weave $(bindir)/weave
+ $(proginstall) texware/dvitype $(bindir)/dvitype
+ $(proginstall) texware/pltotf $(bindir)/pltotf
+ $(proginstall) texware/tftopl $(bindir)/tftopl
+ $(proginstall) mfware/gftodvi $(bindir)/gftodvi
+ $(proginstall) mfware/gftopk $(bindir)/gftopk
+ $(proginstall) mfware/gftype $(bindir)/gftype
+ $(proginstall) mfware/mft $(bindir)/mft
+ $(proginstall) fontutil/pktogf $(bindir)/pktogf
+ $(proginstall) fontutil/pktype $(bindir)/pktype
+ $(proginstall) fontutil/vftovp $(bindir)/vftovp
+ $(proginstall) fontutil/vptovf $(bindir)/vptovf
+ $(proginstall) bibtex/bibtex $(bindir)/bibtex
+ $(proginstall) dviutil/dvicopy $(bindir)/dvicopy
+ if test -d $(texpooldir); then exit 0; else mkdir $(texpooldir); fi
+ -if test -s tex/tex.pool; \
+ then (cd tex; $(fileinstall) tex.pool $(texpooldir) ); fi
+ if test -d $(mfpooldir); then exit 0; else mkdir $(mfpooldir); fi
+ -if test -s mf/mf.pool; \
+ then (cd mf; $(fileinstall) mf.pool $(mfpooldir) ); fi
+
+install-formats: stamp-formats
+ if test -d $(formatdir); then exit 0; else -mkdir $(formatdir); fi
+ for f in $(formats); \
+ do \
+ rm -f $(bindir)/`basename $$f .fmt`; \
+ ln $(bindir)/virtex $(bindir)/`basename $$f .fmt`; \
+ $(fileinstall) tex/$$f $(formatdir); \
+ done
+ cd $(formatdir); rm -f plain.fmt; ln tex.fmt plain.fmt
+
+install-bases: stamp-bases
+ if test -d $(basedir); then exit 0; else -mkdir $(basedir); fi
+ for f in $(bases); \
+ do \
+ rm -f $(bindir)/`basename $$f .base`; \
+ ln $(bindir)/virmf $(bindir)/`basename $$f .base`; \
+ $(fileinstall) mf/$$f $(basedir); \
+ done
+ cd $(basedir); rm -f plain.base; ln mf.base plain.base
+
+
+# Need GNU tar for this.
+#
+web2c-dist: web/tangleboot.pas
+ @echo -n "check -linet;tangleboot"
+ @echo "big{tex,mf.ch; trie change"
+ mv ChangeLog ChangeLog.W2C
+ cd ..; \
+ find src-$(version) \! -name '*.web' -type f -print > /tmp/files; \
+ tar czfT web2c-$(version).tar.Z /tmp/files; \
+ ls -ld web*
+ mv ChangeLog.W2C ChangeLog
+
+web-dist: web/tangleboot.pas
+ cd ..; \
+ find src-$(version) -name '*.web' -print > /tmp/webfest; \
+ tar czfT web-$(version).tar.Z /tmp/webfest; \
+ ls -ld web*
+
+web/tangleboot.pas:
+ cd web; make tangle.p; cp tangle.p tangleboot.pas; make veryclean
+
+clean:
+ rm -f stamp-*
+ for name in web2c common $(alldirs); \
+ do \
+ (cd $${name}; make clean); \
+ done
+
+veryclean:
+ rm -f stamp-*
+ for name in web2c common man $(alldirs); \
+ do \
+ (cd $${name}; make veryclean); \
+ done
+ rm -f \#*\# *~ *.bak *.ckp core
+
+.PHONY: default triptrap run-triptrap clean-triptrap all TeX run-trip \
+ MF run-trap manpages bases formats install-manpages install \
+ install-formats install-bases web2c-dist web-dist clean veryclean
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines
new file mode 100644
index 0000000000..276fe7eafc
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines
@@ -0,0 +1,5 @@
+{Definitions for IsITeX: new(p) must be translated in p := malloc(sizeof(^p)),
+ so we have to define malloc and sizeof for web2c.}
+
+@define function malloc ();
+@define function sizeof ();
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz
new file mode 100644
index 0000000000..3c502f8696
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz
Binary files differ
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c
new file mode 100644
index 0000000000..9e1b407c06
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c
@@ -0,0 +1,498 @@
+#define EXTERN extern
+#include "texd.h"
+
+void giveerrhelp ( )
+{giveerrhelp_regmem
+ tokenshow ( eqtb [ 10821 ] .hh .v.RH ) ;
+}
+boolean openfmtfile ( )
+{/* 40 10 */ register boolean Result; openfmtfile_regmem
+ integer j ;
+ j = curinput .locfield ;
+ if ( buffer [ curinput .locfield ] == 38 )
+ {
+ incr ( curinput .locfield ) ;
+ j = curinput .locfield ;
+ buffer [ last ] = 32 ;
+ while ( buffer [ j ] != 32 ) incr ( j ) ;
+ packbufferedname ( 0 , curinput .locfield , j - 1 ) ;
+ if ( wopenin ( fmtfile ) )
+ goto lab40 ;
+ (void) fprintf( stdout , "%s%s\n", "Sorry, I can't find that format;" , " will try the default." ) ;
+ flush ( stdout ) ;
+ }
+ packbufferedname ( formatdefaultlength - 4 , 1 , 0 ) ;
+ if ( ! wopenin ( fmtfile ) )
+ {
+ ;
+ (void) fprintf( stdout , "%s\n", "I can't find the default format file!" ) ;
+ Result = false ;
+ return(Result) ;
+ }
+ lab40: curinput .locfield = j ;
+ Result = true ;
+ return(Result) ;
+}
+void closefilesandterminate ( )
+{closefilesandterminate_regmem
+ integer k ;
+ {register integer for_end; k = 0 ; for_end = 15 ; if ( k <= for_end) do
+ if ( writeopen [ k ] )
+ aclose ( writefile [ k ] ) ;
+ while ( k++ < for_end ) ; }
+ {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <=
+ for_end) do
+ {
+ nameoffile [ hsii ] = ' ' ;
+ }
+ while ( hsii++ < for_end ) ; }
+ hsij = strstart [ jobname ] ;
+ hsii = 1 ;
+ while ( hsij < strstart [ jobname + 1 ] ) {
+
+ nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ;
+ hsij = hsij + 1 ;
+ hsii = hsii + 1 ;
+ }
+ nameoffile [ hsii ] = '.' ;
+ nameoffile [ hsii + 1 ] = 'm' ;
+ nameoffile [ hsii + 2 ] = 'e' ;
+ nameoffile [ hsii + 3 ] = 'm' ;
+ if ( ! aopenout ( hsmem ) )
+ {
+ (void) fprintf( stdout , "%s\n", " =iSi=> cant a_open_out " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".mem " ) ;
+ (void) putc('\n', stdout );
+ }
+ else {
+
+ while ( mdm != nil ) {
+
+ if ( inuse ( mdm ->w12 , mdm ->l1 , mdb ) )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> writing to " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".mem: " ) ;
+ writewt ( mdm ->w12 , mdm ->l1 , mdm ->tr1 ) ;
+ (void) putc('\n', stdout );
+ }
+ (void) fprintf( hsmem , " %ld\n", (long)mdm ->l1 ) ;
+ {register integer for_end; k = 1 ; for_end = mdm ->l1 ; if ( k <=
+ for_end) do
+ {
+ (void) fprintf( hsmem , " %ld", (long)mdm ->w12 [ k ] ) ;
+ }
+ while ( k++ < for_end ) ; }
+ (void) putc('\n', hsmem );
+ {register integer for_end; k = 1 ; for_end = mdm ->l1 ; if ( k <=
+ for_end) do
+ {
+ (void) fprintf( hsmem , " %ld", (long)mdm ->tr1 [ k ] ) ;
+ }
+ while ( k++ < for_end ) ; }
+ (void) putc('\n', hsmem );
+ if ( mdm ->neu1 )
+ {
+ (void) putc( Xchr ( 116 ) , hsmem );
+ (void) putc('\n', hsmem );
+ mdleintragen ( mdm ->w12 , mdm ->l1 , mdl ) ;
+ }
+ else {
+
+ (void) putc( Xchr ( 102 ) , hsmem );
+ (void) putc('\n', hsmem );
+ }
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> " ) ;
+ wwort ( mdm ->w12 , mdm ->l1 ) ;
+ (void) Fputs( stdout , " not in use" ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+ mdm = mdm ->li ;
+ }
+ aclose ( hsmem ) ;
+ }
+ {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <=
+ for_end) do
+ {
+ nameoffile [ hsii ] = ' ' ;
+ }
+ while ( hsii++ < for_end ) ; }
+ hsij = strstart [ jobname ] ;
+ hsii = 1 ;
+ while ( hsij < strstart [ jobname + 1 ] ) {
+
+ nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ;
+ hsij = hsij + 1 ;
+ hsii = hsii + 1 ;
+ }
+ nameoffile [ hsii ] = '.' ;
+ nameoffile [ hsii + 1 ] = 'l' ;
+ nameoffile [ hsii + 2 ] = 'e' ;
+ nameoffile [ hsii + 3 ] = 'x' ;
+ if ( ! aopenout ( hslex ) )
+ (void) fprintf( stdout , "%s\n", " =iSi=> cant open hslex" ) ;
+ else {
+
+ while ( mdl != nil ) {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> writing to " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".lex: " ) ;
+ wwort ( mdl ->w12 , mdl ->l1 ) ;
+ (void) putc('\n', stdout );
+ }
+ (void) putc( Xchr ( mdl ->l1 ) , hslex );
+ {register integer for_end; k = 1 ; for_end = mdl ->l1 ; if ( k <=
+ for_end) do
+ {
+ if ( mdl ->w12 [ k ] <= 26 )
+ {
+ (void) putc( Xchr ( mdl ->w12 [ k ] + 96 ) , hslex );
+ }
+ else {
+
+ if ( mdl ->w12 [ k ] == 27 )
+ {
+ (void) Fputs( hslex , "\"a" ) ;
+ }
+ else if ( mdl ->w12 [ k ] == 28 )
+ {
+ (void) Fputs( hslex , "\"o" ) ;
+ }
+ else if ( mdl ->w12 [ k ] == 29 )
+ {
+ (void) Fputs( hslex , "\"u" ) ;
+ }
+ else if ( mdl ->w12 [ k ] == 30 )
+ {
+ (void) Fputs( hslex , "\"s" ) ;
+ }
+ else {
+
+ (void) putc( '-' , hslex );
+ }
+ }
+ }
+ while ( k++ < for_end ) ; }
+ (void) putc('\n', hslex );
+ mdl = mdl ->li ;
+ }
+ aclose ( hslex ) ;
+ }
+ {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <=
+ for_end) do
+ {
+ nameoffile [ hsii ] = ' ' ;
+ }
+ while ( hsii++ < for_end ) ; }
+ hsij = strstart [ jobname ] ;
+ hsii = 1 ;
+ while ( hsij < strstart [ jobname + 1 ] ) {
+
+ nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ;
+ hsij = hsij + 1 ;
+ hsii = hsii + 1 ;
+ }
+ nameoffile [ hsii ] = '.' ;
+ nameoffile [ hsii + 1 ] = 'e' ;
+ nameoffile [ hsii + 2 ] = 'd' ;
+ nameoffile [ hsii + 3 ] = 't' ;
+ if ( ! aopenout ( hsedt ) )
+ (void) fprintf( stdout , "%s\n", " =iSi=> cant open hsedt" ) ;
+ else {
+
+ while ( mde != nil ) {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> writing to " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".edt: " ) ;
+ wwort ( mde ->w12 , mde ->l1 ) ;
+ (void) putc('\n', stdout );
+ }
+ {register integer for_end; k = 1 ; for_end = mde ->l1 ; if ( k <=
+ for_end) do
+ {
+ if ( mde ->w12 [ k ] <= 26 )
+ {
+ (void) putc( Xchr ( mde ->w12 [ k ] + 96 ) , hsedt );
+ }
+ else {
+
+ if ( mde ->w12 [ k ] == 27 )
+ {
+ (void) Fputs( hsedt , "\"a" ) ;
+ }
+ else if ( mde ->w12 [ k ] == 28 )
+ {
+ (void) Fputs( hsedt , "\"o" ) ;
+ }
+ else if ( mde ->w12 [ k ] == 29 )
+ {
+ (void) Fputs( hsedt , "\"u" ) ;
+ }
+ else if ( mde ->w12 [ k ] == 30 )
+ {
+ (void) Fputs( hsedt , "\"s" ) ;
+ }
+ else {
+
+ (void) Fputs( hsedt , "--" ) ;
+ }
+ }
+ }
+ while ( k++ < for_end ) ; }
+ (void) putc('\n', hsedt );
+ mde = mde ->li ;
+ }
+ aclose ( hsedt ) ;
+ }
+ ;
+#ifdef STAT
+ if ( eqtb [ 12694 ] .cint > 0 )
+ if ( logopened )
+ {
+ (void) fprintf( logfile , "%c\n", ' ' ) ;
+ (void) fprintf( logfile , "%s%s\n", "Here is how much of TeX's memory" , " you used:" ) ;
+ (void) fprintf( logfile , "%c%ld%s", ' ' , (long)strptr - initstrptr , " string" ) ;
+ if ( strptr != initstrptr + 1 )
+ (void) putc( 's' , logfile );
+ (void) fprintf( logfile , "%s%ld\n", " out of " , (long)maxstrings - initstrptr ) ;
+ (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)poolptr - initpoolptr , " string characters out of " , (long)poolsize - initpoolptr ) ;
+ (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)lomemmax - memmin + memend - himemmin + 2 , " words of memory out of " , (long)memend + 1 - memmin ) ;
+ (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)cscount , " multiletter control sequences out of " , (long)9500 ) ;
+ (void) fprintf( logfile , "%c%ld%s%ld%s", ' ' , (long)fmemptr , " words of font info for " , (long)fontptr - 0 , " font" ) ;
+ if ( fontptr != 1 )
+ (void) putc( 's' , logfile );
+ (void) fprintf( logfile , "%s%ld%s%ld\n", ", out of " , (long)fontmemsize , " for " , (long)fontmax - 0 ) ;
+ (void) fprintf( logfile , "%c%ld%s", ' ' , (long)hyphcount , " hyphenation exception" ) ;
+ if ( hyphcount != 1 )
+ (void) putc( 's' , logfile );
+ (void) fprintf( logfile , "%s%ld\n", " out of " , (long)607 ) ;
+ (void) fprintf( logfile , "%c%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%c\n", ' ' , (long)maxinstack , "i," , (long)maxneststack , "n," , (long)maxparamstack , "p," , (long)maxbufstack + 1 , "b," , (long)maxsavestack + 6 , "s stack positions out of " , (long)stacksize , "i," , (long)nestsize , "n," , (long)paramsize , "p," , (long)bufsize , "b," , (long)savesize , 's' ) ;
+ }
+#endif /* STAT */
+ while ( curs > -1 ) {
+
+ if ( curs > 0 )
+ {
+ dvibuf [ dviptr ] = 142 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ else {
+
+ {
+ dvibuf [ dviptr ] = 140 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ incr ( totalpages ) ;
+ }
+ decr ( curs ) ;
+ }
+ if ( totalpages == 0 )
+ printnl ( 833 ) ;
+ else {
+
+ {
+ dvibuf [ dviptr ] = 248 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ dvifour ( lastbop ) ;
+ lastbop = dvioffset + dviptr - 5 ;
+ dvifour ( 25400000L ) ;
+ dvifour ( 473628672L ) ;
+ preparemag () ;
+ dvifour ( eqtb [ 12680 ] .cint ) ;
+ dvifour ( maxv ) ;
+ dvifour ( maxh ) ;
+ {
+ dvibuf [ dviptr ] = maxpush / 256 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ {
+ dvibuf [ dviptr ] = maxpush % 256 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ {
+ dvibuf [ dviptr ] = ( totalpages / 256 ) % 256 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ {
+ dvibuf [ dviptr ] = totalpages % 256 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ while ( fontptr > 0 ) {
+
+ if ( fontused [ fontptr ] )
+ dvifontdef ( fontptr ) ;
+ decr ( fontptr ) ;
+ }
+ {
+ dvibuf [ dviptr ] = 249 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ dvifour ( lastbop ) ;
+ {
+ dvibuf [ dviptr ] = 2 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ k = 4 + ( ( dvibufsize - dviptr ) % 4 ) ;
+ while ( k > 0 ) {
+
+ {
+ dvibuf [ dviptr ] = 223 ;
+ incr ( dviptr ) ;
+ if ( dviptr == dvilimit )
+ dviswap () ;
+ }
+ decr ( k ) ;
+ }
+ if ( dvilimit == halfbuf )
+ writedvi ( halfbuf , dvibufsize - 1 ) ;
+ if ( dviptr > 0 )
+ writedvi ( 0 , dviptr - 1 ) ;
+ printnl ( 834 ) ;
+ print ( outputfilename ) ;
+ print ( 284 ) ;
+ printint ( totalpages ) ;
+ print ( 835 ) ;
+ if ( totalpages != 1 )
+ printchar ( 115 ) ;
+ print ( 836 ) ;
+ printint ( dvioffset + dviptr ) ;
+ print ( 837 ) ;
+ bclose ( dvifile ) ;
+ }
+ if ( logopened )
+ {
+ (void) putc('\n', logfile );
+ aclose ( logfile ) ;
+ selector = selector - 2 ;
+ if ( selector == 17 )
+ {
+ printnl ( 1268 ) ;
+ print ( logname ) ;
+ printchar ( 46 ) ;
+ }
+ }
+ println () ;
+ if ( ( editnamestart != 0 ) && ( interaction > 0 ) )
+ calledit ( strpool , editnamestart , editnamelength , editline ) ;
+}
+#ifdef DEBUG
+void debughelp ( )
+{/* 888 10 */ debughelp_regmem
+ integer k, l, m, n ;
+ while ( true ) {
+
+ ;
+ printnl ( 1277 ) ;
+ flush ( stdout ) ;
+ read ( stdin , m ) ;
+ if ( m < 0 )
+ return ;
+ else if ( m == 0 )
+ dumpcore () ;
+ else {
+
+ read ( stdin , n ) ;
+ switch ( m )
+ {case 1 :
+ printword ( mem [ n ] ) ;
+ break ;
+ case 2 :
+ printint ( mem [ n ] .hh .v.LH ) ;
+ break ;
+ case 3 :
+ printint ( mem [ n ] .hh .v.RH ) ;
+ break ;
+ case 4 :
+ printword ( eqtb [ n ] ) ;
+ break ;
+ case 5 :
+ printword ( fontinfo [ n ] ) ;
+ break ;
+ case 6 :
+ printword ( savestack [ n ] ) ;
+ break ;
+ case 7 :
+ showbox ( n ) ;
+ break ;
+ case 8 :
+ {
+ breadthmax = 10000 ;
+ depththreshold = poolsize - poolptr - 10 ;
+ shownodelist ( n ) ;
+ }
+ break ;
+ case 9 :
+ showtokenlist ( n , 0 , 1000 ) ;
+ break ;
+ case 10 :
+ print ( n ) ;
+ break ;
+ case 11 :
+ checkmem ( n > 0 ) ;
+ break ;
+ case 12 :
+ searchmem ( n ) ;
+ break ;
+ case 13 :
+ {
+ read ( stdin , l ) ;
+ printcmdchr ( n , l ) ;
+ }
+ break ;
+ case 14 :
+ {register integer for_end; k = 0 ; for_end = n ; if ( k <= for_end)
+ do
+ print ( buffer [ k ] ) ;
+ while ( k++ < for_end ) ; }
+ break ;
+ case 15 :
+ {
+ fontinshortdisplay = 0 ;
+ shortdisplay ( n ) ;
+ }
+ break ;
+ case 16 :
+ panicking = ! panicking ;
+ break ;
+ default:
+ print ( 63 ) ;
+ break ;
+ }
+ }
+ }
+}
+#endif /* DEBUG */
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch
new file mode 100644
index 0000000000..7bd37ad9c4
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch
@@ -0,0 +1,1410 @@
+@x
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)'
+@y
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0) {+iSi 92}'
+@z
+
+
+@x
+@!pool_name='TeXformats:SITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@!pool_name='TeXformats:ISITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@z
+
+
+@x
+else bad_pool('! I can''t read SITEX3.POOL.');
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read ISITEX3.POOL.');
+@.I can't read TEX.POOL@>
+@z
+
+
+@x
+@!funktioniert: boolean;
+@!zerleg: integer;
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+@!alletr: trenn16; {iSi 920114}
+@!auswahl, schnuller: char;
+@!memkorr: boolean; {iSi 920914 doku.mem korrigieren ja/nein}
+@!indexi: integer;
+@!uebersprungen: boolean; {iSi 920921}
+@!lex_ja, lex_ok: boolean; {iSi 920930 neue Eingabe `1E' statt `B'}
+@z
+
+
+
+@x
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+@y
+ if not hsstart then begin
+{ wterm(' =iSi=> running hsinit'); wterm_cr; }
+ hsinit;
+ hsstart := true;
+{ wterm(' =iSi=> finished hsinit'); wterm_cr }
+ end;
+
+ if isidebug=1 then begin
+ wterm(' =iSi=> abteilen von '); wwort(hc_si, hn);
+ end;
+
+ abteilen(hc_si,hyf_si, alletr {iSi 920114}, hn,funktioniert,zerleg);
+
+ if not funktioniert then begin
+ if isidebug=1 then begin
+ wterm_cr;
+ wterm(' =iSi=> unbekanntes Wort: '); wwort(hc_si, hn);
+ wterm_cr;
+ wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
+ end;
+ if md_suchen(hc_si, hn, mdb, hyf_si) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> gefunden in mdb: ');
+ writewt(hc_si, hn, hyf_si);
+ wterm_cr
+ end;
+ funktioniert := true
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> nicht gefunden in mdb: ');
+ wwort(hc_si, hn); wterm_cr;
+ end;
+ repeat
+ wterm_cr; wterm_cr;
+ wterm('"');
+ wwort(hc_si, hn);
+ wterm('" ist ein unbekanntes Wort!');
+ wterm_cr;
+ wterm(0:2);
+ wterm(': neues Wort, merken in "'); wjob; wterm('.lex"');
+ wterm_cr;
+ wterm(1:2);
+ wterm(': neues Wort, Trennstellen angeben und merken in "'); wjob;
+ wterm('.lex"');
+ wterm_cr;
+ wterm(9:2);
+ wterm(': Tippfehler! - merken im File "'); wjob; wterm('.edt"');
+ wterm_cr;
+ wterm('Bitte waehlen Sie eine Bedeutung (0,1,9) aus:');
+ wterm_cr;
+ read(term_in, schnuller);
+ auswahl := schnuller;
+ read_ln(term_in);
+ until ((xord[auswahl] >= 48) and (xord[auswahl] <= 49)) or
+ (auswahl = '9');
+ if (auswahl = '0') then begin
+ { Da abteilen bei not funktioniert hyf_si unver"andert l"asst, }
+ { muss hier jetzt hyf_si ``gel"oscht'' werden. }
+ for indexi := 1 to hn do begin
+ hyf_si[indexi] := keine
+ end;
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
+ funktioniert := true
+ end else if (auswahl = '9') then begin
+ mde_eintragen(hc_si, hn, mde)
+ end else begin
+ wterm('Bitte den Trennvektor angeben'); wterm_cr;
+ wterm(' ("-" Nebentrennstelle, "=" Haupttrennstelle, ');
+ wterm('"." Weiterruecken,'); wterm_cr;
+ wterm(' Trennstrich unter den Buchstaben angeben, hinter dem ');
+ wterm('getrennt werden soll):'); wterm_cr;
+ wwort(hc_si, hn); wterm_cr;
+ indexi := 1; uebersprungen := false;
+ read(term_in, auswahl);
+ while (xord[auswahl] <> 10) and (indexi <= hn) do begin
+ if (hc_si[indexi] >= 27) and
+ (hc_si[indexi] <= 30) and
+ not uebersprungen then begin
+ { Ist in hc_si[] ein Umlaut, so steht am Bildschirm "x. }
+ { Die Trennvektoreingabe unter dem " muss uebersprungen }
+ { werden. }
+ uebersprungen := true
+ end else begin
+ if auswahl = '.' then begin
+ hyf_si[indexi] := keine
+ end else if auswahl = '-' then begin
+ hyf_si[indexi] := neben
+ end else if auswahl = '=' then begin
+ hyf_si[indexi] := haupt
+ end else begin
+ hyf_si[indexi] := keine
+ end;
+ uebersprungen := false;
+ indexi := indexi+1
+ end;
+ read(term_in, auswahl)
+ end;
+ while (indexi) <= hn do begin {Rest von hyf_si mit . auff"ullen}
+ hyf_si[indexi] := keine;
+ indexi := indexi+1
+ end;
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
+ funktioniert := true
+ end
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(': '); writewt(hc_si, hn, hyf_si); wterm_cr
+ end
+ end;
+
+ if zerleg >= 2 then begin
+ gleiche_weg(alletr, zerleg, hn); { eliminiert gleiche Trennvektoren }
+ if zerleg >= 2 then begin { jetzt sind es echte Alternativen }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mehrdeutiges Wort: '); writewt(hc_si, hn, hyf_si);
+ wterm_cr;
+ wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
+ end;
+ if md_suchen(hc_si, hn, mdb, hyf_si) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> gefunden in mdb: '); writewt(hc_si, hn, hyf_si);
+ wterm_cr
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> nicht gefunden in mdb: ');
+ wwort(hc_si, hn); wterm_cr
+ end;
+ if mehrdanz then begin
+ repeat
+ wterm_cr; wterm_cr;
+ wterm('`');
+ wwort(hc_si, hn);
+ wterm(''' ist ein mehrdeutiges Wort!');
+ wterm_cr;
+ wterm(0:2); { wterm('/A'); }
+ wterm(': nur die sicheren Trennstellen waehlen (also `');
+ writewt(hc_si, hn, hyf_si);
+ wterm(''')');
+ wterm_cr;
+ for indexi := 1 to zerleg do begin
+ wterm(indexi:2); { wterm('/'); wterm(xchr[65+indexi]); }
+ wterm(': `');
+ writewt(hc_si, hn, alletr[indexi]);
+ wterm('''');
+ wterm_cr
+ end;
+ wterm(9:2);
+ wterm(': Tippfehler! - merken im File `'); wjob; wterm('.edt''');
+ wterm_cr;
+ wterm('Bitte waehlen Sie eine Bedeutung z.B. `0''+`Enter'' aus:');
+ wterm_cr;
+ wterm(' (zusaetzlich `E'' z.B. `0E''+`Enter'': ');
+ wterm('Wort auch fuer LEXIKON vormerken)');
+ wterm_cr;
+ read(term_in, schnuller);
+ auswahl := schnuller;
+ lex_ja := false; lex_ok := true;
+ if xord[schnuller] <> 32 then begin
+ read(term_in, schnuller);
+ if xord[schnuller] <> 10 then begin
+ if (schnuller = 'e') or (schnuller = 'E') then begin
+ lex_ja := true; { lex_ok := true }
+ end else begin
+ { lex_ja := false; } lex_ok := false
+ end;
+ read_ln(term_in);
+ end
+ end;
+ until (((xord[auswahl] >= 48) and (xord[auswahl] <= 48+zerleg)) or
+ (auswahl = '9')) and lex_ok;
+ if (auswahl = '0') or ((auswahl = '0') and lex_ja) then begin
+ if (auswahl = '0') and not lex_ja then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
+ end else begin { '0E' }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
+ end;
+ end else if (auswahl = '9') then begin
+ mde_eintragen(hc_si, hn, mde)
+ end else begin
+ hyf_si := alletr[xord[auswahl]-48];
+ if not lex_ja then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
+ end else begin { lex_ja }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
+ end {if not lex_ja ...}
+ end {if (auswahl = ...}
+ end {if mehrdanz}
+ end {if md_suchen ...}
+ end {if zerleg >= 2}
+ end; {if zerleg >= 2}
+
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+@z
+
+
+@x
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@y
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+ trenn16 = array [1..16] of trennvektor; {iSi 921005 trenn8 -> trenn16}
+
+ {iSi 920103 begin}
+ mdb_knoten = ^mdb_k;
+ mdm_knoten = ^mdm_k;
+ mdl_knoten = ^mdl_k;
+ mde_knoten = ^mde_k; {HHHHH}
+
+ mdb_k = record
+ w12: wort;
+ l1: integer;
+ tr1: trennvektor;
+ neu1: boolean;
+ del1: boolean; {gel"oscht ja/nein}
+ used1: boolean; {noch in Verwendung ja/nein}
+ li, re: mdb_knoten;
+ end;
+ {iSi 920103 end}
+
+ {iSi 920110 begin}
+
+ mdm_k = record
+ w12: wort;
+ l1: integer;
+ tr1: trennvektor;
+ neu1: boolean;
+ li, re: mdm_knoten;
+ end;
+ mdl_k = record
+ w12: wort;
+ l1: integer;
+ li, re: mdl_knoten;
+ end;
+ mde_k = record {HHHHH}
+ w12: wort;
+ l1: integer;
+ li, re: mde_knoten;
+ end;
+
+ {iSi 920110 end}
+
+@z
+
+
+
+@x
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+@y
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+
+ hsmem, hslex, hsedt: alpha_file; {iSi 920111}
+
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+
+ hsstart: boolean; {iSi 920114} {ist mdb schon initialisiert?}
+ isidebug: integer; {iSi 920917}
+ auswahl, schnuller: char; {iSi 920917}
+ mehrdanz: boolean; {iSi 920924} {mehrdeutige W"orter anzeigen?}
+ mdb: mdb_knoten; {iSi 920111}
+ mdm: mdm_knoten; {iSi 920111}
+ mdl: mdl_knoten; {iSi 920114}
+ mde: mde_knoten; {iSi 920114}
+ mdb_schnuller: mdb_k; {iSi HH; um web2c zu ueberlisten: sizeof(var) statt }
+ mdm_schnuller: mdm_k; {sizeof(typ) }
+ mdl_schnuller: mdl_k;
+ mde_schnuller: mde_k;
+
+ hsii, hsij: integer; {iSi 920114} {HS_Index_i, HS_Index_j}
+@z
+
+
+
+@x
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+@y
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+{ wterm_cr; wterm_cr;
+ wterm_ln('====================');
+ wterm_ln('This is iSiTeX, HS92');
+ wterm_ln('====================');
+ wterm_cr;
+
+ wterm_ln(' =iSi=> init mdb, mdm, mdl, mde'); }
+ mdb := nil;
+ mdm := nil;
+ mdl := nil;
+ mde := nil;
+
+ hsstart := false;
+ isidebug := 0;
+
+@z
+
+
+@x
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+@y
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var alletr: trenn16; {iSi HH}
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+@z
+
+@x
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+@y
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+ trlast: trennvektor; {iSi 920114}
+@z
+
+@x
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+@y
+ for i := laenge downto 1 do begin
+ if dudtr[i-1] = haupt3 then begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+
+ trlast[i] := tri; {iSi 920114}
+
+ end;
+ zerlegungen:=zerlegungen+1;
+
+ alletr[zerlegungen] := trlast; {iSi 920114}
+
+ ok1:= true
+@z
+
+
+@x
+
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(1, schnitt+1, spv, ok_vor, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(5, schnitt, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (4, schnitt+1, spv, ok_stamm, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(5, schnitt, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+
+@x
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+@y
+
+procedure wchar(c: halfword);
+begin
+ if c = 27 then begin
+ wterm('"a')
+ end else if c = 28 then begin
+ wterm('"o')
+ end else if c = 29 then begin
+ wterm('"u')
+ end else if c = 30 then begin
+ wterm('"s')
+ end else begin
+ wterm(xchr[c+96])
+ end
+end;
+
+procedure wwort(w: wort;
+ l: integer);
+ var i: integer;
+begin
+ for i := 1 to l do begin
+ wchar(w[i])
+ end
+end;
+
+procedure writewt(w: wort;
+ l: integer;
+ tr: trennvektor);
+ var i: integer;
+begin
+ wchar(w[1]);
+ for i := 2 to l-1 do begin
+ if (tr[i-1] = nebenck) {and (w[i] = bst_c)} then begin
+ wterm('k');
+ wterm('-')
+ end else if (tr[i] = haupt3) then begin
+ wterm(xchr[w[i]+96]);
+ wterm('=');
+ wterm(xchr[w[i]+96]);
+ end else if (tr[i] = haupt) then begin
+ wchar(w[i]);
+ wterm('=')
+ end else if (tr[i] = neben) then begin
+ wchar(w[i]);
+ wterm('-')
+ end else begin
+ wchar(w[i])
+ end
+ end;
+ wchar(w[l])
+end;
+
+procedure wjob;
+ var i:integer;
+begin
+ for i := str_start[job_name] to str_start[job_name+1]-1 do begin
+ wterm(xchr[str_pool[i]])
+ end
+end;
+
+function vergl(wrt1: wort;
+ l1: integer;
+ wrt2: wort;
+ l2: integer): integer;
+ label 99;
+ var i: integer;
+begin
+ i := 1;
+ while (i <= l1) and (i <= l2) do begin
+ if wrt1[i] < wrt2[i] then begin
+ vergl := -1;
+ goto 99
+ end else if wrt1[i] > wrt2[i] then begin
+ vergl := 1;
+ goto 99
+ end;
+ i := i+1
+ end;
+ if l1 < l2 then begin
+ vergl := -1;
+ goto 99
+ end else if l1 > l2 then begin
+ vergl := 1;
+ goto 99
+ end else begin
+ vergl := 0;
+ goto 99
+ end;
+ 99:
+end;
+
+procedure gleiche_weg (var alletr: trenn16;
+ var zerleg: integer;
+ laenge: integer);
+
+{ eliminiert bei Mehrdeutigkeiten (zerleg >= 2 !!!) eventuell gleiche }
+{ trennvektoren und korrigiert alletr & zerleg }
+
+ var i, j, k: integer;
+ gleich: boolean;
+
+begin
+ i := 1;
+ repeat
+ j := i+1; { zerleg >= 2 }
+ repeat
+ gleich := true;
+ k := 1; { laenge >= 1 }
+ repeat
+ if alletr[i][k] = alletr[j][k] then begin
+ k := k+1
+ end else begin
+ gleich := false
+ end
+ until (k > laenge) or (gleich = false);
+ if gleich then begin
+ for k := j to zerleg-1 do begin
+ alletr[k] := alletr[k+1]
+ end;
+ zerleg := zerleg-1
+ end else begin
+ j := j+1
+ end
+ until j > zerleg;
+ i := i+1
+ until i > zerleg-1
+end;
+
+procedure mdb_eintragen(w: wort;
+ l: integer;
+ tr: trennvektor;
+ neu: boolean;
+ used: boolean;
+ var mdb: mdb_knoten);
+
+ var test: integer;
+begin
+{ wterm(' =iSi=> mdb_eintragen von '); writewt(w, l, tr); wterm_cr; }
+ if mdb = nil then begin
+ { new(mdb); }
+ mdb := malloc(sizeof(mdb_schnuller));
+ mdb^.w12 := w;
+ mdb^.l1 := l;
+ mdb^.tr1 := tr;
+ mdb^.neu1 := neu;
+ mdb^.used1 := used;
+ mdb^.del1 := false;
+ mdb^.li := nil;
+ mdb^.re := nil;
+ if isidebug=1 then begin
+ wterm_cr
+ end
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ if isidebug=1 then begin
+{ wterm(' =iSi=> kleiner als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
+ wterm('/')
+ end;
+ mdb_eintragen(w, l, tr, neu, used, mdb^.li)
+ end else if test = 1 then begin
+ if isidebug=1 then begin
+{ wterm(' =iSi=> gr"osser als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
+ wterm('\')
+ end;
+ mdb_eintragen(w, l, tr, neu, used, mdb^.re)
+ end else begin
+ wterm(' =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!');
+ wterm_cr
+ end
+ end
+end;
+
+{iSi 920102 end}
+{iSi 920110 begin}
+
+ procedure mdm_eintragen(w: wort;
+ l: integer;
+ tr: trennvektor;
+ neu: boolean;
+ var mdm: mdm_knoten);
+ var rechts: mdm_knoten;
+ begin
+ if mdm = nil then begin
+ { new(mdm); }
+ mdm := malloc(sizeof(mdm_schnuller));
+ mdm^.w12 := w;
+ mdm^.l1 := l;
+ mdm^.tr1 := tr;
+ mdm^.neu1 := neu;
+ mdm^.li := nil;
+ mdm^.re := nil
+ end else if mdm^.re = nil then begin
+ { new(mdm^.re); }
+ mdm^.re := malloc(sizeof(mdm_schnuller));
+ mdm^.re^.w12 := w;
+ mdm^.re^.l1 := l;
+ mdm^.re^.tr1 := tr;
+ mdm^.re^.neu1 := neu;
+ mdm^.re^.li := nil;
+ mdm^.re^.re := nil;
+ mdm^.li := mdm^.re
+ end else begin
+ rechts := mdm^.re;
+ { new(mdm^.re); }
+ mdm^.re := malloc(sizeof(mdm_schnuller));
+ mdm^.re^.w12 := w;
+ mdm^.re^.l1 := l;
+ mdm^.re^.tr1 := tr;
+ mdm^.re^.neu1 := neu;
+ mdm^.re^.li := nil;
+ mdm^.re^.re := nil;
+ rechts^.li := mdm^.re
+ end
+ end;
+
+ procedure mdl_eintragen(w: wort;
+ l: integer;
+ var mdl: mdl_knoten);
+ var rechts: mdl_knoten;
+ begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdl_eintragen von '); wwort(w, l); wterm_cr;
+ end;
+ if mdl = nil then begin
+ { new(mdl); }
+ mdl := malloc(sizeof(mdl_schnuller));
+ mdl^.w12 := w;
+ mdl^.l1 := l;
+ mdl^.li := nil;
+ mdl^.re := nil
+ end else if mdl^.re = nil then begin
+ { new(mdl^.re); }
+ mdl^.re := malloc(sizeof(mdl_schnuller));
+ mdl^.re^.w12 := w;
+ mdl^.re^.l1 := l;
+ mdl^.re^.li := nil;
+ mdl^.re^.re := nil;
+ mdl^.li := mdl^.re
+ end else begin
+ rechts := mdl^.re;
+ { new(mdl^.re); }
+ mdl^.re := malloc(sizeof(mdl_schnuller));
+ mdl^.re^.w12 := w;
+ mdl^.re^.l1 := l;
+ mdl^.re^.li := nil;
+ mdl^.re^.re := nil;
+ rechts^.li := mdl^.re
+ end
+ end;
+ procedure mde_eintragen(w: wort;
+ l: integer;
+ var mde: mde_knoten);
+ var rechts: mde_knoten;
+ begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mde_eintragen von '); wwort(w, l); wterm_cr;
+ end;
+ if mde = nil then begin
+ { new(mde); }
+ mde := malloc(sizeof(mde_schnuller));
+ mde^.w12 := w;
+ mde^.l1 := l;
+ mde^.li := nil;
+ mde^.re := nil
+ end else if mde^.re = nil then begin
+ { new(mde^.re); }
+ mde^.re := malloc(sizeof(mde_schnuller));
+ mde^.re^.w12 := w;
+ mde^.re^.l1 := l;
+ mde^.re^.li := nil;
+ mde^.re^.re := nil;
+ mde^.li := mde^.re
+ end else begin
+ rechts := mde^.re;
+ { new(mde^.re); }
+ mde^.re := malloc(sizeof(mde_schnuller));
+ mde^.re^.w12 := w;
+ mde^.re^.l1 := l;
+ mde^.re^.li := nil;
+ mde^.re^.re := nil;
+ rechts^.li := mde^.re
+ end
+ end;
+
+{iSi 920110 end}
+{isi 920111 begin}
+
+function md_suchen (w: wort;
+ l: integer;
+ var mdb: mdb_knoten;
+ var tr: trennvektor): boolean;
+ var test: integer;
+begin
+ if mdb = nil then begin
+ md_suchen := false
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ md_suchen := md_suchen(w, l, mdb^.li, tr)
+ end else if test = 1 then begin
+ md_suchen := md_suchen(w, l, mdb^.re, tr)
+ end else begin
+ tr := mdb^.tr1;
+ mdb^.used1 := true;
+ md_suchen := true
+ end
+ end
+end;
+
+function in_use (w: wort;
+ l: integer;
+ mdb: mdb_knoten): boolean;
+ var test: integer;
+begin
+ if mdb = nil then begin
+ wterm(' =iSi=> in_use Fehler: '); wwort(w, l);
+ wterm(' nicht in mdb'); wterm_cr
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ in_use := in_use(w, l, mdb^.li)
+ end else if test = 1 then begin
+ in_use := in_use(w, l, mdb^.re)
+ end else begin
+ in_use := mdb^.used1;
+ if isidebug=1 then begin
+ if mdb^.used1 then begin
+ wterm(' =iSi=> '); wwort(w, l); wterm(' in use'); wterm_cr
+ end else begin
+ wterm(' =iSi=> '); wwort(w, l); wterm(' not in use'); wterm_cr
+ end
+ end
+ end
+ end
+end;
+
+procedure hsinit;
+ var i, j, l: integer;
+ tr: trennvektor;
+ w: wort;
+ temp, auswahl, schnuller: char;
+ neu, memkorr: boolean;
+begin
+
+ wterm_cr; wterm_cr;
+ repeat
+ wterm_ln('iSi debug Info ? [J/N]');
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl] = 74) or (xord[auswahl] = 106) then begin
+ isidebug := 1
+ end else begin
+ isidebug := 0
+ end;
+
+ for i := 1 to file_name_size do begin
+ name_of_file[i] := ' '
+ end;
+ j := str_start[job_name];
+ i := 1;
+ while (j < str_start[job_name+1]) and
+ (i < file_name_size - 4) do begin
+ name_of_file[i] := xchr[str_pool[j]];
+ j := j+1;
+ i := i+1
+ end;
+ name_of_file[i] := '.';
+ name_of_file[i+1] := 'm';
+ name_of_file[i+2] := 'e';
+ name_of_file[i+3] := 'm';
+
+ if not a_open_in(hsmem,TEX_INPUT_PATH) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> cant a_open_in '); wjob; wterm('.mem');
+ wterm_cr
+ end
+ end else begin
+
+ repeat
+ wterm_cr;
+ wterm('Sollen Fehleintr"age gel"oscht werden? [J/N]'); wterm_cr;
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr; wterm_cr;
+ if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
+ memkorr := true
+ end else begin
+ memkorr := false
+ end;
+
+ while not eof(hsmem) do begin
+ read(hsmem, l);
+ read_ln(hsmem);
+ for i := 1 to l do begin
+ read(hsmem, w[i]);
+ end;
+ read_ln(hsmem);
+ for i := 1 to l do begin
+ read(hsmem, tr[i]);
+ end;
+ read_ln(hsmem);
+ read(hsmem, temp);
+ read_ln(hsmem);
+ if temp = xchr[116] then neu := true else neu := false; {116 = t}
+ if isidebug=1 then begin
+ wterm(' =iSi=> reading from '); wjob; wterm('.mem: '); wwort(w, l);
+ wterm(', neu = '); wterm(temp); wterm_cr;
+ end;
+
+ if memkorr then begin
+ repeat
+ wterm_cr;
+ wterm('Soll ');
+ writewt(w, l, tr);
+ wterm(' gel"oscht werden? [J/N]'); wterm_cr;
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
+ { nichts tun, Wort wird nicht eingetragen }
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
+ wterm_cr
+ end;
+ mdb_eintragen(w, l, tr, neu, false {used}, mdb);
+ mdm_eintragen(w, l, tr, neu, mdm);
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
+ wterm_cr
+ end;
+ mdb_eintragen(w, l, tr, neu, false {used}, mdb);
+ mdm_eintragen(w, l, tr, neu, mdm)
+ end
+ end;
+ if isidebug=1 then begin
+ wterm_cr;
+{ wterm(' =iSi=> closing '); wjob; wterm('.mem'); wterm_cr; }
+ end;
+ a_close(hsmem);
+ end;
+
+ repeat
+ wterm_cr;
+ wterm_ln('Sollen mehrdeutige W"orter angezeigt werden? [J/N]');
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl]=74) or (xord[auswahl]=106) then begin
+ mehrdanz := true
+ end else begin
+ mehrdanz := false
+ end
+
+end;
+
+{iSi 920111 end}
+
+procedure abteilen (var w:wort; var tr1:trennvektor;
+ var alletr: trenn16; {iSi 920114}
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer);
+@z
+
+
+
+@x
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+@y
+ var
+ i:integer;
+ iSi_j: integer; {iSi 920114}
+ dud:dudt; {array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ tr, dudtr:trennvektor;
+ spv,dudstop:sperrvektor;
+@z
+
+
+@x
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(3, 1, spv, ok, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+
+@x
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+@y
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+
+ for iSi_j := 1 to zerlegungen do begin {iSi 920114 begin}
+ if (alletr[iSi_j][i] = nebenck) then begin
+ alletr[iSi_j][i] := keine;
+ alletr[iSi_j][i-1] := nebenck
+ end
+ end {iSi 920114 end}
+
+ end;
+@z
+
+
+
+@x
+@ @<Finish the extensions@>=
+for k:=0 to 15 do if write_open[k] then a_close(write_file[k])
+@y
+@ @<Finish the extensions@>=
+for k:=0 to 15 do if write_open[k] then a_close(write_file[k]);
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'm';
+name_of_file[hsii+2] := 'e';
+name_of_file[hsii+3] := 'm';
+
+if not a_open_out(hsmem) then begin
+ wterm_ln(' =iSi=> cant a_open_out '); wjob; wterm('.mem ');
+ wterm_cr
+end else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.mem '); wterm_cr; }
+ while mdm <> nil do begin
+ if in_use(mdm^.w12, mdm^.l1, mdb) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.mem: ');
+ writewt(mdm^.w12, mdm^.l1, mdm^.tr1); wterm_cr;
+ end;
+ write_ln(hsmem, mdm^.l1);
+ for k := 1 to mdm^.l1 do begin
+ write(hsmem, mdm^.w12[k]);
+ end;
+ write_ln(hsmem);
+ for k := 1 to mdm^.l1 do begin
+ write(hsmem, mdm^.tr1[k]);
+ end;
+ write_ln(hsmem);
+ if mdm^.neu1 then begin
+ write(hsmem, xchr[116]);
+ write_ln(hsmem);
+ mdl_eintragen(mdm^.w12, mdm^.l1, mdl)
+ end else begin
+ write(hsmem, xchr[102]);
+ write_ln(hsmem)
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> '); wwort(mdm^.w12, mdm^.l1);
+ wterm(' not in use');
+ wterm_cr
+ end
+ end;
+ mdm := mdm^.li
+ end;
+ a_close(hsmem);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.mem '); wterm_cr; }
+end;
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'l';
+name_of_file[hsii+2] := 'e';
+name_of_file[hsii+3] := 'x';
+
+if not a_open_out(hslex) then
+ wterm_ln(' =iSi=> cant open hslex')
+else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.lex '); wterm_cr; }
+ while mdl <> nil do begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.lex: ');
+ wwort(mdl^.w12, mdl^.l1);
+ wterm_cr
+ end;
+ write(hslex, xchr[mdl^.l1]);
+ for k := 1 to mdl^.l1 do begin
+ if mdl^.w12[k] <= 26 then begin
+ write(hslex, xchr[mdl^.w12[k]+96])
+ end else begin
+ if mdl^.w12[k] = 27 then begin
+ write(hslex, '"a')
+ end else if mdl^.w12[k] = 28 then begin
+ write(hslex, '"o')
+ end else if mdl^.w12[k] = 29 then begin
+ write(hslex, '"u')
+ end else if mdl^.w12[k] = 30 then begin
+ write(hslex, '"s')
+ end else begin
+ write(hslex, '-')
+ end
+ end
+ end;
+ write_ln(hslex);
+ mdl := mdl^.li
+ end;
+ a_close(hslex);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.lex '); wterm_cr; }
+end;
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'e';
+name_of_file[hsii+2] := 'd';
+name_of_file[hsii+3] := 't';
+
+if not a_open_out(hsedt) then
+ wterm_ln(' =iSi=> cant open hsedt')
+else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.edt '); wterm_cr; }
+ while mde <> nil do begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.edt: ');
+ wwort(mde^.w12, mde^.l1);
+ wterm_cr
+ end;
+ for k := 1 to mde^.l1 do begin
+ if mde^.w12[k] <= 26 then begin
+ write(hsedt, xchr[mde^.w12[k]+96])
+ end else begin
+ if mde^.w12[k] = 27 then begin
+ write(hsedt, '"a')
+ end else if mde^.w12[k] = 28 then begin
+ write(hsedt, '"o')
+ end else if mde^.w12[k] = 29 then begin
+ write(hsedt, '"u')
+ end else if mde^.w12[k] = 30 then begin
+ write(hsedt, '"s')
+ end else begin
+ write(hsedt, '--')
+ end
+ end
+ end;
+ write_ln(hsedt);
+ mde := mde^.li
+ end;
+ a_close(hsedt);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.edt '); wterm_cr; }
+end;
+@z
+
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c
new file mode 100644
index 0000000000..9f42dcdf35
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c
@@ -0,0 +1,2013 @@
+#define EXTERN extern
+#include "texd.h"
+
+void zpostlinebreak ( finalwidowpenalty )
+integer finalwidowpenalty ;
+{/* 30 31 */ postlinebreak_regmem
+ halfword q, r, s ;
+ boolean discbreak ;
+ boolean postdiscbreak ;
+ scaled curwidth ;
+ scaled curindent ;
+ quarterword t ;
+ integer pen ;
+ halfword curline ;
+ q = mem [ bestbet + 1 ] .hh .v.RH ;
+ curp = 0 ;
+ do {
+ r = q ;
+ q = mem [ q + 1 ] .hh .v.LH ;
+ mem [ r + 1 ] .hh .v.LH = curp ;
+ curp = r ;
+ } while ( ! ( q == 0 ) ) ;
+ curline = curlist .pgfield + 1 ;
+ do {
+ q = mem [ curp + 1 ] .hh .v.RH ;
+ discbreak = false ;
+ postdiscbreak = false ;
+ if ( q != 0 )
+ if ( mem [ q ] .hh.b0 == 10 )
+ {
+ deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ;
+ mem [ q + 1 ] .hh .v.LH = eqtb [ 10290 ] .hh .v.RH ;
+ mem [ q ] .hh.b1 = 9 ;
+ incr ( mem [ eqtb [ 10290 ] .hh .v.RH ] .hh .v.RH ) ;
+ goto lab30 ;
+ }
+ else {
+
+ if ( mem [ q ] .hh.b0 == 7 )
+ {
+ t = mem [ q ] .hh.b1 ;
+ if ( t == 0 )
+ r = mem [ q ] .hh .v.RH ;
+ else {
+
+ r = q ;
+ while ( t > 1 ) {
+
+ r = mem [ r ] .hh .v.RH ;
+ decr ( t ) ;
+ }
+ s = mem [ r ] .hh .v.RH ;
+ r = mem [ s ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ q ] .hh .v.RH ) ;
+ mem [ q ] .hh.b1 = 0 ;
+ }
+ if ( mem [ q + 1 ] .hh .v.RH != 0 )
+ {
+ s = mem [ q + 1 ] .hh .v.RH ;
+ while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = r ;
+ r = mem [ q + 1 ] .hh .v.RH ;
+ mem [ q + 1 ] .hh .v.RH = 0 ;
+ postdiscbreak = true ;
+ }
+ if ( mem [ q + 1 ] .hh .v.LH != 0 )
+ {
+ s = mem [ q + 1 ] .hh .v.LH ;
+ if ( mem [ s ] .hh.b0 == 12 )
+ {
+ s = mem [ s ] .hh .v.RH ;
+ mem [ mem [ q + 1 ] .hh .v.LH ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ q + 1 ] .hh .v.LH ) ;
+ }
+ mem [ q ] .hh .v.RH = s ;
+ while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ q + 1 ] .hh .v.LH = 0 ;
+ q = s ;
+ }
+ mem [ q ] .hh .v.RH = r ;
+ discbreak = true ;
+ }
+ else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) )
+ mem [ q + 1 ] .cint = 0 ;
+ }
+ else {
+
+ q = memtop - 3 ;
+ while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ;
+ }
+ r = newparamglue ( 8 ) ;
+ mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ;
+ mem [ q ] .hh .v.RH = r ;
+ q = r ;
+ lab30: ;
+ r = mem [ q ] .hh .v.RH ;
+ mem [ q ] .hh .v.RH = 0 ;
+ q = mem [ memtop - 3 ] .hh .v.RH ;
+ mem [ memtop - 3 ] .hh .v.RH = r ;
+ if ( eqtb [ 10289 ] .hh .v.RH != 0 )
+ {
+ r = newparamglue ( 7 ) ;
+ mem [ r ] .hh .v.RH = q ;
+ q = r ;
+ }
+ if ( curline > lastspecialline )
+ {
+ curwidth = secondwidth ;
+ curindent = secondindent ;
+ }
+ else if ( eqtb [ 10812 ] .hh .v.RH == 0 )
+ {
+ curwidth = firstwidth ;
+ curindent = firstindent ;
+ }
+ else {
+
+ curwidth = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline ] .cint ;
+ curindent = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline - 1 ] .cint ;
+ }
+ adjusttail = memtop - 5 ;
+ justbox = hpack ( q , curwidth , 0 ) ;
+ mem [ justbox + 4 ] .cint = curindent ;
+ appendtovlist ( justbox ) ;
+ if ( memtop - 5 != adjusttail )
+ {
+ mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ;
+ curlist .tailfield = adjusttail ;
+ }
+ adjusttail = 0 ;
+ if ( curline + 1 != bestline )
+ {
+ pen = eqtb [ 12676 ] .cint ;
+ if ( curline == curlist .pgfield + 1 )
+ pen = pen + eqtb [ 12668 ] .cint ;
+ if ( curline + 2 == bestline )
+ pen = pen + finalwidowpenalty ;
+ if ( discbreak )
+ pen = pen + eqtb [ 12671 ] .cint ;
+ if ( pen != 0 )
+ {
+ r = newpenalty ( pen ) ;
+ mem [ curlist .tailfield ] .hh .v.RH = r ;
+ curlist .tailfield = r ;
+ }
+ }
+ incr ( curline ) ;
+ curp = mem [ curp + 1 ] .hh .v.LH ;
+ if ( curp != 0 )
+ if ( ! postdiscbreak )
+ {
+ r = memtop - 3 ;
+ while ( true ) {
+
+ q = mem [ r ] .hh .v.RH ;
+ if ( q == mem [ curp + 1 ] .hh .v.RH )
+ goto lab31 ;
+ if ( ( q >= himemmin ) )
+ goto lab31 ;
+ if ( ( mem [ q ] .hh.b0 < 9 ) )
+ goto lab31 ;
+ if ( mem [ q ] .hh.b1 == 2 )
+ if ( mem [ q ] .hh.b0 == 11 )
+ goto lab31 ;
+ r = q ;
+ }
+ lab31: if ( r != memtop - 3 )
+ {
+ mem [ r ] .hh .v.RH = 0 ;
+ flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ;
+ mem [ memtop - 3 ] .hh .v.RH = q ;
+ }
+ }
+ } while ( ! ( curp == 0 ) ) ;
+ if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) )
+ confusion ( 935 ) ;
+ curlist .pgfield = bestline - 1 ;
+}
+smallnumber zreconstitute ( j , n , bchar , hchar )
+smallnumber j ;
+smallnumber n ;
+halfword bchar ;
+halfword hchar ;
+{/* 22 30 */ register smallnumber Result; reconstitute_regmem
+ halfword p ;
+ halfword t ;
+ fourquarters q ;
+ halfword currh ;
+ halfword testchar ;
+ scaled w ;
+ fontindex k ;
+ smallnumber ii ;
+ hyphenpassed = 0 ;
+ t = memtop - 4 ;
+ w = 0 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ {register integer for_end; ii = n ; for_end = j ; if ( ii >= for_end) do
+ if ( dirtyumlaut [ ii ] != 0 )
+ n = ii - 1 ;
+ while ( ii-- > for_end ) ; }
+ curl = hu [ j ] ;
+ curq = t ;
+ if ( j == 0 )
+ {
+ ligaturepresent = initlig ;
+ p = initlist ;
+ if ( ligaturepresent )
+ lfthit = initlft ;
+ while ( p > 0 ) {
+
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = mem [ p ] .hh.b1 ;
+ }
+ p = mem [ p ] .hh .v.RH ;
+ }
+ }
+ else if ( curl < 256 )
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = curl ;
+ }
+ ligstack = 0 ;
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ lab22: if ( curl == 256 )
+ {
+ k = bcharlabel [ hf ] ;
+ if ( k == fontmemsize )
+ goto lab30 ;
+ else q = fontinfo [ k ] .qqqq ;
+ }
+ else {
+
+ q = fontinfo [ charbase [ hf ] + curl ] .qqqq ;
+ if ( ( ( q .b2 ) % 4 ) != 1 )
+ goto lab30 ;
+ k = ligkernbase [ hf ] + q .b3 ;
+ q = fontinfo [ k ] .qqqq ;
+ if ( q .b0 > 128 )
+ {
+ k = ligkernbase [ hf ] + 256 * q .b2 + q .b3 + 32768L - 256 * ( 128 ) ;
+ q = fontinfo [ k ] .qqqq ;
+ }
+ }
+ if ( currh < 256 )
+ testchar = currh ;
+ else testchar = curr ;
+ while ( true ) {
+
+ if ( q .b1 == testchar )
+ if ( q .b0 <= 128 )
+ if ( currh < 256 )
+ {
+ hyphenpassed = j ;
+ hchar = 256 ;
+ currh = 256 ;
+ goto lab22 ;
+ }
+ else {
+
+ if ( hchar < 256 )
+ if ( hyfpen [ j ] != 10000 )
+ {
+ hyphenpassed = j ;
+ hchar = 256 ;
+ }
+ if ( q .b2 < 128 )
+ {
+ if ( curl == 256 )
+ lfthit = true ;
+ if ( j == n )
+ if ( ligstack == 0 )
+ rthit = true ;
+ {
+ if ( interrupt != 0 )
+ pauseforinstructions () ;
+ }
+ switch ( q .b2 )
+ {case 1 :
+ case 5 :
+ {
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ }
+ break ;
+ case 2 :
+ case 6 :
+ {
+ curr = q .b3 ;
+ if ( ligstack > 0 )
+ mem [ ligstack ] .hh.b1 = curr ;
+ else {
+
+ ligstack = newligitem ( curr ) ;
+ if ( j == n )
+ bchar = 256 ;
+ else {
+
+ p = getavail () ;
+ mem [ ligstack + 1 ] .hh .v.RH = p ;
+ mem [ p ] .hh.b1 = hu [ j + 1 ] ;
+ mem [ p ] .hh.b0 = hf ;
+ }
+ }
+ }
+ break ;
+ case 3 :
+ {
+ curr = q .b3 ;
+ p = ligstack ;
+ ligstack = newligitem ( curr ) ;
+ mem [ ligstack ] .hh .v.RH = p ;
+ }
+ break ;
+ case 7 :
+ case 11 :
+ {
+ if ( ligaturepresent )
+ {
+ p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ;
+ if ( lfthit )
+ {
+ mem [ p ] .hh.b1 = 2 ;
+ lfthit = false ;
+ }
+ if ( false )
+ if ( ligstack == 0 )
+ {
+ incr ( mem [ p ] .hh.b1 ) ;
+ rthit = false ;
+ }
+ mem [ curq ] .hh .v.RH = p ;
+ t = p ;
+ ligaturepresent = false ;
+ }
+ curq = t ;
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ }
+ break ;
+ default:
+ {
+ curl = q .b3 ;
+ ligaturepresent = true ;
+ if ( ligstack > 0 )
+ {
+ if ( mem [ ligstack + 1 ] .hh .v.RH > 0 )
+ {
+ mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ;
+ t = mem [ t ] .hh .v.RH ;
+ incr ( j ) ;
+ }
+ p = ligstack ;
+ ligstack = mem [ p ] .hh .v.RH ;
+ freenode ( p , 2 ) ;
+ if ( ligstack == 0 )
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ else curr = mem [ ligstack ] .hh.b1 ;
+ }
+ else if ( j == n )
+ goto lab30 ;
+ else {
+
+ {
+ mem [ t ] .hh .v.RH = getavail () ;
+ t = mem [ t ] .hh .v.RH ;
+ mem [ t ] .hh.b0 = hf ;
+ mem [ t ] .hh.b1 = curr ;
+ }
+ incr ( j ) ;
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ }
+ }
+ break ;
+ }
+ if ( q .b2 > 4 )
+ if ( q .b2 != 7 )
+ goto lab30 ;
+ goto lab22 ;
+ }
+ w = fontinfo [ kernbase [ hf ] + 256 * q .b2 + q .b3 ] .cint ;
+ goto lab30 ;
+ }
+ if ( q .b0 >= 128 )
+ if ( currh == 256 )
+ goto lab30 ;
+ else {
+
+ currh = 256 ;
+ goto lab22 ;
+ }
+ k = k + q .b0 + 1 ;
+ q = fontinfo [ k ] .qqqq ;
+ }
+ lab30: ;
+ if ( ligaturepresent )
+ {
+ p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ;
+ if ( lfthit )
+ {
+ mem [ p ] .hh.b1 = 2 ;
+ lfthit = false ;
+ }
+ if ( rthit )
+ if ( ligstack == 0 )
+ {
+ incr ( mem [ p ] .hh.b1 ) ;
+ rthit = false ;
+ }
+ mem [ curq ] .hh .v.RH = p ;
+ t = p ;
+ ligaturepresent = false ;
+ }
+ if ( w != 0 )
+ {
+ mem [ t ] .hh .v.RH = newkern ( w ) ;
+ t = mem [ t ] .hh .v.RH ;
+ w = 0 ;
+ }
+ if ( ligstack > 0 )
+ {
+ curq = t ;
+ curl = mem [ ligstack ] .hh.b1 ;
+ ligaturepresent = true ;
+ {
+ if ( mem [ ligstack + 1 ] .hh .v.RH > 0 )
+ {
+ mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ;
+ t = mem [ t ] .hh .v.RH ;
+ incr ( j ) ;
+ }
+ p = ligstack ;
+ ligstack = mem [ p ] .hh .v.RH ;
+ freenode ( p , 2 ) ;
+ if ( ligstack == 0 )
+ {
+ if ( j < n )
+ curr = hu [ j + 1 ] ;
+ else curr = bchar ;
+ if ( hyfpen [ j ] != 10000 )
+ currh = hchar ;
+ else currh = 256 ;
+ }
+ else curr = mem [ ligstack ] .hh.b1 ;
+ }
+ goto lab22 ;
+ }
+ Result = j ;
+ return(Result) ;
+}
+void zhashfunk ( w , anfang , ende , v , ind , k )
+wort w ;
+integer anfang ;
+integer ende ;
+varr v ;
+intarr ind ;
+intarr k ;
+{hashfunk_regmem
+ long vacc, indacc, kacc ;
+ integer i ;
+ vacc = 31415L ;
+ indacc = 152L ;
+ kacc = 271L ;
+ {register integer for_end; i = anfang ; for_end = ende ; if ( i <= for_end)
+ do
+ {
+ ;
+ vacc = ( vacc * 31 + w [ i ] ) % 8388648L ;
+ v [ i ] = vacc ;
+ indacc = ( indacc * 33 + w [ i ] ) % ( tabsize + 1 ) ;
+ ind [ i ] = indacc ;
+ kacc = ( kacc * 15 + w [ i ] ) % ( ( tabsize + 1 ) / 2 ) ;
+ k [ i ] = 2 * kacc + 1 ;
+ }
+ while ( i++ < for_end ) ; }
+}
+void zunpackinfo ( b , iausnahme , iuntrennbar , ierste , izweite , iendung ,
+ivorsilbe , istamm , iehervor , istammallein )
+infobyte b ;
+boolean * iausnahme ;
+boolean * iuntrennbar ;
+integer * ierste ;
+integer * izweite ;
+boolean * iendung ;
+boolean * ivorsilbe ;
+boolean * istamm ;
+boolean * iehervor ;
+boolean * istammallein ;
+{unpackinfo_regmem
+ if ( odd ( b ) )
+ {
+(* iausnahme )= true ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* iuntrennbar )= true ;
+ else (*iuntrennbar )= false ;
+ b = b / 2 ;
+(* ierste )= b % 8 ;
+(* izweite )= b / 8 ;
+ }
+ else {
+
+(* iausnahme )= false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* iendung )= true ;
+ else (*iendung )= false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* ivorsilbe )= true ;
+ else (*ivorsilbe )= false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* istamm )= true ;
+ else (*istamm )= false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* iehervor )= true ;
+ else (*iehervor )= false ;
+ b = b / 2 ;
+ if ( odd ( b ) )
+(* istammallein )= true ;
+ else (*istammallein )= false ;
+ }
+}
+void zunpackentry ( h , etabv , etabb , efrei , ewiederfrei )
+hashelement h ;
+verdschlue * etabv ;
+infobyte * etabb ;
+boolean * efrei ;
+boolean * ewiederfrei ;
+{unpackentry_regmem
+ ;
+(* etabv )= h [ 0 ] + h [ 1 ] * 256 + h [ 2 ] * 256 * 256 ;
+ if ( odd ( h [ 3 ] ) )
+ {
+ ;
+(* etabb )= h [ 3 ] ;
+(* efrei )= false ;
+(* ewiederfrei )= false ;
+ }
+ else {
+
+ ;
+(* etabb )= h [ 3 ] % 64 ;
+ if ( odd ( h [ 3 ] / 64 ) )
+(* efrei )= true ;
+ else (*efrei )= false ;
+ if ( odd ( h [ 3 ] / 128 ) )
+(* ewiederfrei )= true ;
+ else (*ewiederfrei )= false ;
+ }
+}
+void zhashsuch ( v , ind , k , iausnahme , iuntrennbar , ierste , izweite ,
+iendung , ivorsilbe , istamm , iehervor , istammallein , g )
+verdschlue v ;
+integer ind ;
+integer k ;
+boolean * iausnahme ;
+boolean * iuntrennbar ;
+integer * ierste ;
+integer * izweite ;
+boolean * iendung ;
+boolean * ivorsilbe ;
+boolean * istamm ;
+boolean * iehervor ;
+boolean * istammallein ;
+boolean * g ;
+{hashsuch_regmem
+ boolean gef, ngef ;
+ integer j ;
+ tableentry entry ;
+ gef = false ;
+ ngef = false ;
+ j = ind ;
+ do {
+ unpackentry ( htab [ j ] , entry .tabv , entry .tabb , entry .frei ,
+ entry .wiederfrei ) ;
+ if ( entry .frei )
+ ngef = true ;
+ else if ( ( v == entry .tabv ) && ! entry .wiederfrei )
+ {
+ unpackinfo ( entry .tabb , (*iausnahme ), (*iuntrennbar ), (*ierste ), (*izweite ), (*
+ iendung ), (*ivorsilbe ), (*istamm ), (*iehervor ), (*istammallein )) ;
+ gef = true ;
+ }
+ else j = ( j + k ) % ( tabsize + 1 ) ;
+ } while ( ! ( gef || ngef ) ) ;
+(* g )= gef ;
+}
+void zhashload ( status )
+integer * status ;
+{hashload_regmem
+ integer i ;
+ tableentry e ;
+ {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <=
+ for_end) do
+ nameoffile [ i ] = ' ' ;
+ while ( i++ < for_end ) ; }
+ nameoffile [ 1 ] = 'h' ;
+ nameoffile [ 2 ] = 'f' ;
+ nameoffile [ 3 ] = '3' ;
+ namelength = 3 ;
+ anzahl = 0 ;
+ if ( aopenin ( hashfile , TEXINPUTPATH ) )
+ {
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ {
+ int help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][0] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][1] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][2] = (eightbits) help;
+ fscanf ( hashfile, "%d", &help );
+ htab [i][3] = (eightbits) help;
+ unpackentry ( htab [ i ] , e .tabv , e .tabb , e .frei , e .wiederfrei
+ ) ;
+ if ( ! e .frei && ! e .wiederfrei )
+ anzahl = anzahl + 1 ;
+ }
+ while ( i++ < for_end ) ; }
+(* status )= 0 ;
+ aclose ( hashfile ) ;
+ }
+ else (*status )= 1 ;
+}
+void zpackinfo ( i , b )
+infotype i ;
+infobyte * b ;
+{packinfo_regmem
+(* b )= 0 ;
+ if ( i .ausnahme )
+ {
+ ;
+ if ( i .untrennbar )
+ ;
+ else ;
+(* b )= 1 + 2 * ord ( i .untrennbar ) + 4 * i .erste + 32 * i .zweite ;
+ }
+ else {
+
+ ;
+(* b )= 2 * ord ( i .endung ) + 4 * ord ( i .vorsilbe ) + 8 * ord ( i .stamm )
+ + 16 * ord ( i .ehervor ) + 32 * ord ( i .stammallein ) ;
+ }
+}
+void zpackentry ( e , h )
+tableentry e ;
+hashelement h ;
+{packentry_regmem
+ ;
+ h [ 0 ] = e .tabv % 256 ;
+ e .tabv = e .tabv / 256 ;
+ h [ 1 ] = e .tabv % 256 ;
+ h [ 2 ] = e .tabv / 256 ;
+ if ( odd ( e .tabb ) )
+ h [ 3 ] = e .tabb ;
+ else {
+
+ ;
+ h [ 3 ] = e .tabb + 64 * ord ( e .frei ) + 128 * ord ( e .wiederfrei ) ;
+ }
+}
+void zhashetr ( w , laenge , i , g )
+wort w ;
+integer laenge ;
+infotype i ;
+boolean * g ;
+{hashetr_regmem
+ varr v1 ;
+ intarr ind1, k1 ;
+ verdschlue v ;
+ integer ind, k, j, e ;
+ boolean gef, ngef ;
+ tableentry entry ;
+ hashelement helem ;
+ if ( anzahl >= tabsize )
+ {
+ ;
+(* g )= false ;
+ }
+ else {
+
+ ;
+ if ( ( anzahl < 10 ) || ( anzahl % 100 == 0 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ;
+ }
+ }
+ hashfunk ( w , 1 , laenge , v1 , ind1 , k1 ) ;
+ v = v1 [ laenge ] ;
+ ind = ind1 [ laenge ] ;
+ k = k1 [ laenge ] ;
+ gef = false ;
+ ngef = false ;
+ do {
+ ;
+ unpackentry ( htab [ ind ] , entry .tabv , entry .tabb , entry .frei ,
+ entry .wiederfrei ) ;
+ if ( entry .frei || entry .wiederfrei )
+ {
+ anzahl = anzahl + 1 ;
+ ngef = true ;
+ entry .tabv = v ;
+ packinfo ( i , entry .tabb ) ;
+ entry .frei = false ;
+ entry .wiederfrei = false ;
+ packentry ( entry , helem ) ;
+ memcpy((void *)htab [ ind ] , (void *)helem , sizeof(hashelement));
+ }
+ else {
+
+ ;
+ gef = v == entry .tabv ;
+ if ( ! gef )
+ ind = ( ind + k ) % ( tabsize + 1 ) ;
+ }
+ } while ( ! ( gef || ngef ) ) ;
+(* g )= ngef ;
+ }
+}
+void hashempty ( )
+{hashempty_regmem
+ integer i ;
+ tableentry elem ;
+ hashelement he ;
+ elem .tabv = 0 ;
+ elem .tabb = 0 ;
+ elem .frei = true ;
+ elem .wiederfrei = false ;
+ packentry ( elem , he ) ;
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ memcpy((void *)htab [ i ] , (void *)he, sizeof(hashelement));
+ while ( i++ < for_end ) ; }
+ anzahl = 0 ;
+}
+void zhashsave ( status )
+integer * status ;
+{hashsave_regmem
+ integer i ;
+ {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <=
+ for_end) do
+ nameoffile [ i ] = ' ' ;
+ while ( i++ < for_end ) ; }
+ nameoffile [ 1 ] = 'h' ;
+ nameoffile [ 2 ] = 'f' ;
+ nameoffile [ 3 ] = '3' ;
+ namelength = 3 ;
+ if ( aopenout ( hashfile ) )
+ {
+ {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end)
+ do
+ {
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 0 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 1 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 2 ] ) ;
+ (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 3 ] ) ;
+ (void) putc('\n', hashfile );
+ }
+ while ( i++ < for_end ) ; }
+(* status )= 0 ;
+ aclose ( hashfile ) ;
+ }
+ else (*status )= 1 ;
+}
+integer hashsize ( )
+{register integer Result; hashsize_regmem
+ Result = anzahl ;
+ return(Result) ;
+}
+void zzahl ( line , i , ende , j )
+string80 line ;
+integer * i ;
+integer ende ;
+integer * j ;
+{zahl_regmem
+ boolean aus ;
+(* j )= 0 ;
+ do {
+ if ( (*i )<= ende )
+ if ( ktab [ line [ (*i )] ] == 46 )
+(* i )= (*i )+ 1 ;
+ else aus = true ;
+ else aus = true ;
+ } while ( ! ( aus ) ) ;
+ do {
+ if ( (*i )<= ende )
+ {
+ switch ( line [ (*i )] )
+ {case 48 :
+ case 49 :
+ case 50 :
+ case 51 :
+ case 52 :
+ case 53 :
+ case 54 :
+ case 55 :
+ case 56 :
+ case 57 :
+ {
+(* j )= 10 * (*j )+ line [ (*i )] - 48 ;
+(* i )= (*i )+ 1 ;
+ }
+ break ;
+ }
+ if ( ( line [ (*i )] != 48 ) && ( line [ (*i )] != 49 ) && ( line [ (*i )] != 50
+ ) && ( line [ (*i )] != 51 ) && ( line [ (*i )] != 52 ) && ( line [ (*i )] != 53
+ ) && ( line [ (*i )] != 54 ) && ( line [ (*i )] != 55 ) && ( line [ (*i )] != 56
+ ) && ( line [ (*i )] != 57 ) )
+ aus = true ;
+ }
+ else aus = true ;
+ } while ( ! ( aus ) ) ;
+}
+void zinfobau ( line , anfang , ende , informausnahme , informuntrennbar ,
+informerste , informzweite , informendung , informvorsilbe , informstamm ,
+informehervor , informstammallein , g )
+string80 line ;
+integer anfang ;
+integer ende ;
+boolean * informausnahme ;
+boolean * informuntrennbar ;
+integer * informerste ;
+integer * informzweite ;
+boolean * informendung ;
+boolean * informvorsilbe ;
+boolean * informstamm ;
+boolean * informehervor ;
+boolean * informstammallein ;
+boolean * g ;
+{infobau_regmem
+ integer i, j ;
+ boolean ok, fehler ;
+ buchstabe b ;
+(* g )= false ;
+(* informausnahme )= false ;
+(* informendung )= false ;
+(* informvorsilbe )= false ;
+(* informehervor )= false ;
+(* informstamm )= false ;
+(* informstammallein )= false ;
+ i = anfang ;
+ ok = false ;
+ fehler = false ;
+ do {
+ if ( i <= ende )
+ if ( line [ i ] == 46 )
+ i = i + 1 ;
+ else ok = true ;
+ else fehler = true ;
+ } while ( ! ( ok || fehler ) ) ;
+ if ( ! fehler )
+ {
+ b = ktab [ line [ i ] ] ;
+ if ( b == bsta )
+ {
+(* informausnahme )= true ;
+ i = i + 1 ;
+ if ( ktab [ line [ i ] ] == bstu )
+ {
+ i = i + 1 ;
+(* informuntrennbar )= true ;
+ }
+ else (*informuntrennbar )= false ;
+ zahl ( line , i , ende , j ) ;
+ if ( j == 0 )
+ {
+(* informerste )= 7 ;
+(* informzweite )= 7 ;
+ }
+ else {
+
+ j = j - 2 ;
+ if ( ( j >= 0 ) && ( j <= 6 ) )
+(* informerste )= j ;
+ else fehler = true ;
+ zahl ( line , i , ende , j ) ;
+ if ( j == 0 )
+(* informzweite )= 7 ;
+ else {
+
+ j = j - (*informerste )- 4 ;
+ if ( ( j >= 0 ) && ( j <= 6 ) )
+(* informzweite )= j ;
+ else fehler = true ;
+ }
+ }
+ if ( ! fehler )
+(* g )= true ;
+ }
+ else {
+
+ ok = false ;
+ do {
+ switch ( b )
+ {case 22 :
+(* informvorsilbe )= true ;
+ break ;
+ case 5 :
+(* informendung )= true ;
+ break ;
+ case 19 :
+(* informstamm )= true ;
+ break ;
+ case 2 :
+(* informehervor )= true ;
+ break ;
+ case 20 :
+(* informstammallein )= true ;
+ break ;
+ case 31 :
+ ;
+ break ;
+ default:
+ fehler = true ;
+ break ;
+ }
+ if ( i == ende )
+ ok = true ;
+ else {
+
+ i = i + 1 ;
+ b = ktab [ line [ i ] ] ;
+ }
+ } while ( ! ( ok || fehler ) ) ;
+ if ( ! fehler )
+(* g )= ( (*informvorsilbe )|| (*informendung )|| (*informstamm )) && ( ! (*
+ informehervor )|| (*informvorsilbe )&& (*informendung )) && ( ! (*
+ informstammallein )|| (*informstamm )) ;
+ }
+ }
+}
+void zeintragen ( line , l )
+string80 line ;
+integer l ;
+{eintragen_regmem
+ integer i, laenge ;
+ infotype inform ;
+ wort w ;
+ boolean g ;
+ laenge = 1 ;
+ while ( line [ laenge ] != 46 ) laenge = laenge + 1 ;
+ laenge = laenge - 1 ;
+ if ( laenge >= 1 )
+ {
+ if ( laenge <= maxwl )
+ {
+ infobau ( line , laenge + 1 , l , inform .ausnahme , inform .untrennbar
+ , inform .erste , inform .zweite , inform .endung , inform .vorsilbe ,
+ inform .stamm , inform .ehervor , inform .stammallein , g ) ;
+ if ( ! g )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " Info falsch: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " Info falsch: " ) ;
+ }
+ }
+ else {
+
+ {register integer for_end; i = 1 ; for_end = laenge ; if ( i <=
+ for_end) do
+ w [ i ] = ktab [ line [ i ] ] ;
+ while ( i++ < for_end ) ; }
+ hashetr ( w , laenge , inform , g ) ;
+ if ( ! g )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " Tabellenfehler: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " Tabellenfehler: " ) ;
+ }
+ }
+ }
+ if ( ! g )
+ {
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end)
+ do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+ }
+ else {
+
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " zu langes Wort: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " zu langes Wort: " ) ;
+ }
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+ }
+ else {
+
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " Falsche Zeile: " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " Falsche Zeile: " ) ;
+ }
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( line [ i ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( line [ i ] ) , logfile );
+ }
+ while ( i++ < for_end ) ; }
+ println () ;
+ }
+}
+void znaechsterbst ( i , tr , dudstop , b , w )
+integer * i ;
+trennvektor tr ;
+sperrvektor dudstop ;
+buchstabe * b ;
+wort w ;
+{naechsterbst_regmem
+ if ( ( (*i )> 0 ) && ( tr [ (*i )] == keine ) && ! dudstop [ (*i )] )
+ {
+(* b )= w [ (*i )] ;
+(* i )= (*i )- 1 ;
+ }
+ else (*b )= trennzeichen ;
+}
+void zduden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , zerlegungen
+)
+trennvektor tr ;
+wort w ;
+trennvektor tr1 ;
+trennvektor dudtr ;
+dudt dud ;
+sperrvektor dudstop ;
+integer laenge ;
+boolean * ok ;
+integer * zerlegungen ;
+{duden_regmem
+ integer i ;
+ integer j ;
+ integer zust ;
+ boolean aus ;
+ integer tre ;
+ integer letzte ;
+ integer l, lalt ;
+ buchstabe b ;
+ i = laenge ;
+ {register integer for_end; j = 0 ; for_end = laenge ; if ( j <= for_end) do
+ dudtr [ j ] = tr [ j ] ;
+ while ( j++ < for_end ) ; }
+ while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ;
+ while ( i > 0 ) {
+
+ zust = 1 ;
+ aus = false ;
+ letzte = 0 ;
+ l = kons ;
+ b = w [ i ] ;
+ i = i - 1 ;
+ do {
+ {
+ tre = i + 1 ;
+ lalt = l ;
+ switch ( b )
+ {case 1 :
+ {
+ l = voka ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 15 :
+ {
+ l = voko ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 29 :
+ {
+ l = vokue ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 28 :
+ {
+ l = vokoe ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 27 :
+ {
+ l = vokae ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 5 :
+ {
+ l = voke ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsti )
+ {
+ l = vokie ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ i = i + 1 ;
+ l = voke ;
+ b = bsti ;
+ }
+ }
+ }
+ break ;
+ case 9 :
+ {
+ l = voki ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ l = vokei ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bsta )
+ {
+ l = vokai ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ }
+ break ;
+ case 21 :
+ {
+ l = voku ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bste )
+ {
+ l = vokeu ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bsta )
+ {
+ l = vokau ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstae )
+ {
+ l = vokaeu ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstq )
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ }
+ break ;
+ case 20 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsts )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 8 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bstc )
+ {
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ if ( b == bsts )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ else if ( b == bstp )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ else if ( b == bstt )
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 2 :
+ case 3 :
+ case 4 :
+ case 6 :
+ case 7 :
+ case 10 :
+ case 11 :
+ case 12 :
+ case 13 :
+ case 14 :
+ case 16 :
+ case 17 :
+ case 18 :
+ case 19 :
+ case 22 :
+ case 23 :
+ case 24 :
+ case 26 :
+ case 30 :
+ {
+ l = kons ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 25 :
+ {
+ l = voky ;
+ naechsterbst ( i , tr , dudstop , b , w ) ;
+ }
+ break ;
+ case 31 :
+ case 0 :
+ aus = true ;
+ break ;
+ }
+ }
+ if ( ! aus )
+ switch ( zust )
+ {case 1 :
+ if ( l == kons )
+ zust = 2 ;
+ else zust = 4 ;
+ break ;
+ case 2 :
+ if ( l != kons )
+ zust = 3 ;
+ break ;
+ case 3 :
+ if ( l == kons )
+ zust = 6 ;
+ else if ( l != lalt )
+ {
+ zust = 4 ;
+ letzte = tre ;
+ dudtr [ letzte ] = neben ;
+ }
+ break ;
+ case 4 :
+ if ( l == kons )
+ zust = 6 ;
+ else zust = 3 ;
+ break ;
+ case 6 :
+ if ( l == kons )
+ {
+ zust = 2 ;
+ letzte = tre ;
+ if ( ( w [ tre ] == bstc ) && ( w [ tre + 1 ] == bstk ) )
+ dudtr [ letzte ] = nebenck ;
+ else dudtr [ letzte ] = neben ;
+ }
+ else {
+
+ zust = 4 ;
+ letzte = tre ;
+ dudtr [ letzte ] = neben ;
+ }
+ break ;
+ }
+ } while ( ! ( aus ) ) ;
+ if ( zust == 2 )
+ dudtr [ letzte ] = keine ;
+ else if ( zust == 4 )
+ if ( ( lalt < vokie ) || ( lalt > vokeu ) )
+ dudtr [ letzte ] = keine ;
+ while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ;
+ }
+}
+void ztrennen ( zustand , anfang , spv , ok1 , alletr , tr , dudtr ,
+zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge )
+integer zustand ;
+integer anfang ;
+sperrvektor spv ;
+boolean * ok1 ;
+trenn16 alletr ;
+trennvektor tr ;
+trennvektor dudtr ;
+integer * zerlegungen ;
+dudt dud ;
+varr v ;
+intarr ind ;
+intarr k ;
+sperrvektor dudstop ;
+wort w ;
+trennvektor tr1 ;
+integer laenge ;
+{trennen_regmem
+ boolean gef, nichtok ;
+ integer schnitt ;
+ infotype inform ;
+ integer i ;
+ boolean okstamm, okvor, okend, okhelp ;
+ integer tri ;
+ integer i1, tre ;
+ boolean ok ;
+ integer stopptr ;
+ sperrvektor spvtmp ;
+ trennvektor trlast ;
+ memcpy((void *)spvtmp, (void *)spv, sizeof(sperrvektor)) ;
+(* ok1 )= false ;
+ if ( anfang == laenge + 1 )
+ if ( ( zustand == 2 ) || ( zustand == 4 ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ duden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , (*zerlegungen ))
+ ;
+ {register integer for_end; i = laenge ; for_end = 1 ; if ( i >= for_end)
+ do
+ {
+ if ( dudtr [ i - 1 ] == haupt3 )
+ {
+ dudtr [ i - 1 ] = keine ;
+ tri = haupt3 ;
+ }
+ else tri = dudtr [ i ] ;
+ if ( (*zerlegungen )== 0 )
+ tr1 [ i ] = tri ;
+ else tr1 [ i ] = kombtab [ tr1 [ i ] ][ tri ] ;
+ trlast [ i ] = tri ;
+ }
+ while ( i-- > for_end ) ; }
+(* zerlegungen )= (*zerlegungen )+ 1 ;
+ memcpy((void *)alletr[(*zerlegungen)],(void *)trlast,sizeof(trennvektor));
+(* ok1 )= true ;
+ }
+ else ;
+ else {
+
+ hashfunk ( w , anfang , laenge , v , ind , k ) ;
+ schnitt = laenge ;
+ nichtok = false ;
+ do {
+ do { if ( spv [ schnitt ] )
+ gef = false ;
+ else {
+
+ hashsuch ( v [ schnitt ] , ind [ schnitt ] , k [ schnitt ] , inform
+ .ausnahme , inform .untrennbar , inform .erste , inform .zweite ,
+ inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor
+ , inform .stammallein , gef ) ;
+ }
+ if ( gef )
+ spv [ schnitt ] = true ;
+ else schnitt = schnitt - 1 ;
+ } while ( ! ( gef || ( schnitt == anfang - 1 ) ) ) ;
+ if ( gef )
+ {
+ if ( ! inform .ausnahme )
+ {
+ if ( inform .endung && ( zustand == 2 ) )
+ {
+ okend = false ;
+ if ( ( w [ anfang ] == bstc ) || ( w [ anfang ] == bsth ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ tr [ anfang - 1 ] = neben ;
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okend = okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okend = okend || okhelp ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+(* ok1 )= (*ok1 )|| okend ;
+ }
+ else okend = false ;
+ if ( inform .vorsilbe )
+ {
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ dud [ schnitt ] = true ;
+ trennen ( 1 , schnitt + 1 , spv , okvor , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ dud [ schnitt ] = false ;
+(* ok1 )= (*ok1 )|| okvor ;
+ }
+ else okvor = false ;
+ if ( inform .stamm && ! okvor )
+ {
+ if ( ! inform .stammallein )
+ {
+ okstamm = false ;
+ stopptr = 0 ;
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ if ( inform .ausnahme )
+ {
+ if ( inform .erste != 7 )
+ {
+ tre = anfang + inform .erste + 1 ;
+ tr [ tre ] = neben ;
+ if ( inform .zweite != 7 )
+ {
+ tre = tre + inform .zweite + 2 ;
+ if ( inform .untrennbar )
+ {
+ stopptr = tre ;
+ dudstop [ stopptr ] = true ;
+ }
+ else tr [ tre ] = neben ;
+ }
+ else {
+
+ if ( inform .untrennbar )
+ {
+ tr [ tre ] = keine ;
+ stopptr = tre ;
+ dudstop [ tre ] = true ;
+ }
+ }
+ }
+ else {
+
+ stopptr = schnitt - 1 ;
+ dudstop [ stopptr ] = true ;
+ }
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr
+ , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge
+ ) ;
+ okstamm = okhelp ;
+ }
+ if ( ( schnitt >= 2 ) && ( schnitt < laenge ) )
+ if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt +
+ 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) )
+ {
+ trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge )
+ ;
+ okstamm = okstamm || okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ if ( inform .ausnahme )
+ {register integer for_end; i1 = anfang - 1 ; for_end = schnitt
+ ; if ( i1 <= for_end) do
+ {
+ tr [ i1 ] = keine ;
+ dud [ i1 ] = false ;
+ dudstop [ stopptr ] = false ;
+ }
+ while ( i1++ < for_end ) ; }
+ else {
+
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ }
+(* ok1 )= (*ok1 )|| okstamm ;
+ }
+ else if ( ( anfang == 1 ) && ( schnitt == laenge ) )
+ {
+ dud [ anfang - 1 ] = true ;
+ tr [ anfang - 1 ] = haupt ;
+ trennen ( 4 , schnitt + 1 , spv , okstamm , alletr , tr , dudtr
+ , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge )
+ ;
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+(* ok1 )= (*ok1 )|| okstamm ;
+ }
+ }
+ }
+ else {
+
+ okstamm = false ;
+ stopptr = 0 ;
+ if ( zustand == 1 )
+ tr [ anfang - 1 ] = neben ;
+ else {
+
+ dud [ anfang - 1 ] = true ;
+ if ( zustand == 5 )
+ tr [ anfang - 1 ] = haupt3 ;
+ else tr [ anfang - 1 ] = haupt ;
+ }
+ if ( inform .ausnahme )
+ {
+ if ( inform .erste != 7 )
+ {
+ tre = anfang + inform .erste + 1 ;
+ tr [ tre ] = neben ;
+ if ( inform .zweite != 7 )
+ {
+ tre = tre + inform .zweite + 2 ;
+ if ( inform .untrennbar )
+ {
+ stopptr = tre ;
+ dudstop [ stopptr ] = true ;
+ }
+ else tr [ tre ] = neben ;
+ }
+ else {
+
+ if ( inform .untrennbar )
+ {
+ tr [ tre ] = keine ;
+ stopptr = tre ;
+ dudstop [ tre ] = true ;
+ }
+ }
+ }
+ else {
+
+ stopptr = schnitt - 1 ;
+ dudstop [ stopptr ] = true ;
+ }
+ }
+ if ( schnitt < laenge )
+ if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] )
+ {
+ spv [ schnitt + 1 ] = true ;
+ trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okhelp ;
+ }
+ if ( ( schnitt >= 2 ) && ( schnitt < laenge ) )
+ if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ]
+ ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) )
+ {
+ trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ }
+ trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (*
+ zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ;
+ okstamm = okstamm || okhelp ;
+ if ( inform .ausnahme )
+ {register integer for_end; i1 = anfang - 1 ; for_end = schnitt
+ ; if ( i1 <= for_end) do
+ {
+ tr [ i1 ] = keine ;
+ dud [ i1 ] = false ;
+ dudstop [ stopptr ] = false ;
+ }
+ while ( i1++ < for_end ) ; }
+ else {
+
+ tr [ anfang - 1 ] = keine ;
+ dud [ anfang - 1 ] = false ;
+ }
+(* ok1 )= (*ok1 )|| okstamm ;
+ }
+ schnitt = schnitt - 1 ;
+ nichtok = schnitt == anfang - 1 ;
+ }
+ else nichtok = true ;
+ } while ( ! ( nichtok ) ) ;
+ }
+ memcpy((void *)spv, (void *)spvtmp, sizeof(sperrvektor)) ;
+}
+void zwchar ( c )
+halfword c ;
+{wchar_regmem
+ if ( c == 27 )
+ {
+ (void) Fputs( stdout , "\"a" ) ;
+ }
+ else if ( c == 28 )
+ {
+ (void) Fputs( stdout , "\"o" ) ;
+ }
+ else if ( c == 29 )
+ {
+ (void) Fputs( stdout , "\"u" ) ;
+ }
+ else if ( c == 30 )
+ {
+ (void) Fputs( stdout , "\"s" ) ;
+ }
+ else {
+
+ (void) putc( Xchr ( c + 96 ) , stdout );
+ }
+}
+void zwwort ( w , l )
+wort w ;
+integer l ;
+{wwort_regmem
+ integer i ;
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ wchar ( w [ i ] ) ;
+ }
+ while ( i++ < for_end ) ; }
+}
+void zwritewt ( w , l , tr )
+wort w ;
+integer l ;
+trennvektor tr ;
+{writewt_regmem
+ integer i ;
+ wchar ( w [ 1 ] ) ;
+ {register integer for_end; i = 2 ; for_end = l - 1 ; if ( i <= for_end) do
+ {
+ if ( ( tr [ i - 1 ] == nebenck ) )
+ {
+ (void) putc( 'k' , stdout );
+ (void) putc( '-' , stdout );
+ }
+ else if ( ( tr [ i ] == haupt3 ) )
+ {
+ (void) putc( Xchr ( w [ i ] + 96 ) , stdout );
+ (void) putc( '=' , stdout );
+ (void) putc( Xchr ( w [ i ] + 96 ) , stdout );
+ }
+ else if ( ( tr [ i ] == haupt ) )
+ {
+ wchar ( w [ i ] ) ;
+ (void) putc( '=' , stdout );
+ }
+ else if ( ( tr [ i ] == neben ) )
+ {
+ wchar ( w [ i ] ) ;
+ (void) putc( '-' , stdout );
+ }
+ else {
+
+ wchar ( w [ i ] ) ;
+ }
+ }
+ while ( i++ < for_end ) ; }
+ wchar ( w [ l ] ) ;
+}
+void wjob ( )
+{wjob_regmem
+ integer i ;
+ {register integer for_end; i = strstart [ jobname ] ; for_end = strstart [
+ jobname + 1 ] - 1 ; if ( i <= for_end) do
+ {
+ (void) putc( Xchr ( strpool [ i ] ) , stdout );
+ }
+ while ( i++ < for_end ) ; }
+}
+integer zvergl ( wrt1 , l1 , wrt2 , l2 )
+wort wrt1 ;
+integer l1 ;
+wort wrt2 ;
+integer l2 ;
+{/* 99 */ register integer Result; vergl_regmem
+ integer i ;
+ i = 1 ;
+ while ( ( i <= l1 ) && ( i <= l2 ) ) {
+
+ if ( wrt1 [ i ] < wrt2 [ i ] )
+ {
+ Result = -1 ;
+ goto lab99 ;
+ }
+ else if ( wrt1 [ i ] > wrt2 [ i ] )
+ {
+ Result = 1 ;
+ goto lab99 ;
+ }
+ i = i + 1 ;
+ }
+ if ( l1 < l2 )
+ {
+ Result = -1 ;
+ goto lab99 ;
+ }
+ else if ( l1 > l2 )
+ {
+ Result = 1 ;
+ goto lab99 ;
+ }
+ else {
+
+ Result = 0 ;
+ goto lab99 ;
+ }
+ lab99: ;
+ return(Result) ;
+}
+void zgleicheweg ( alletr , zerleg , laenge )
+trenn16 alletr ;
+integer * zerleg ;
+integer laenge ;
+{gleicheweg_regmem
+ integer i, j, k ;
+ boolean gleich ;
+ i = 1 ;
+ do {
+ j = i + 1 ;
+ do {
+ gleich = true ;
+ k = 1 ;
+ do {
+ if ( alletr [ i ] [ k ] == alletr [ j ] [ k ] )
+ {
+ k = k + 1 ;
+ }
+ else {
+
+ gleich = false ;
+ }
+ } while ( ! ( ( k > laenge ) || ( gleich == false ) ) ) ;
+ if ( gleich )
+ {
+ {register integer for_end; k = j ; for_end = (*zerleg )- 1 ; if ( k <=
+ for_end) do
+ {
+ memcpy((void *)alletr[k],(void *)alletr[k+1],sizeof(trennvektor));
+ }
+ while ( k++ < for_end ) ; }
+(* zerleg )= (*zerleg )- 1 ;
+ }
+ else {
+
+ j = j + 1 ;
+ }
+ } while ( ! ( j > (*zerleg )) ) ;
+ i = i + 1 ;
+ } while ( ! ( i > (*zerleg )- 1 ) ) ;
+}
+void zmdbeintragen ( w , l , tr , neu , used , mdb )
+wort w ;
+integer l ;
+trennvektor tr ;
+boolean neu ;
+boolean used ;
+mdbknoten * mdb ;
+{mdbeintragen_regmem
+ integer test ;
+ if ( (*mdb )== nil )
+ {
+(* mdb )= (mdbknoten) malloc ( sizeof ( mdbschnuller ) ) ;
+memcpy((void *)(* mdb )->w12 ,(void *) w ,sizeof(wort));
+(* mdb )->l1 = l ;
+memcpy((void *)(* mdb )->tr1 ,(void *) tr,sizeof(trennvektor)) ;
+(* mdb )->neu1 = neu ;
+(* mdb )->used1 = used ;
+(* mdb )->del1 = false ;
+(* mdb )->li = nil ;
+(* mdb )->re = nil ;
+ if ( isidebug == 1 )
+ {
+ (void) putc('\n', stdout );
+ }
+ }
+ else {
+
+ test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ;
+ if ( test == -1 )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) putc( '/' , stdout );
+ }
+ mdbeintragen ( w , l , tr , neu , used , (*mdb )->li ) ;
+ }
+ else if ( test == 1 )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) putc( '\\' , stdout );
+ }
+ mdbeintragen ( w , l , tr , neu , used , (*mdb )->re ) ;
+ }
+ else {
+
+ (void) Fputs( stdout , " =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!" ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+}
+void zmdmeintragen ( w , l , tr , neu , mdm )
+wort w ;
+integer l ;
+trennvektor tr ;
+boolean neu ;
+mdmknoten * mdm ;
+{mdmeintragen_regmem
+ mdmknoten rechts ;
+ if ( (*mdm )== nil )
+ {
+(* mdm )= (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ;
+ memcpy((void *)(* mdm )->w12 ,(void *) w,sizeof(wort)) ;
+(* mdm )->l1 = l ;
+ memcpy((void *)(* mdm )->tr1 ,(void *) tr,sizeof(trennvektor)) ;
+(* mdm )->neu1 = neu ;
+(* mdm )->li = nil ;
+(* mdm )->re = nil ;
+ }
+ else if ( (*mdm )->re == nil )
+ {
+(* mdm )->re = (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ;
+ memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort));
+(* mdm )->re ->l1 = l ;
+ memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr,sizeof(trennvektor)) ;
+(* mdm )->re ->neu1 = neu ;
+(* mdm )->re ->li = nil ;
+(* mdm )->re ->re = nil ;
+(* mdm )->li = (*mdm )->re ;
+ }
+ else {
+ rechts = (*mdm )->re ;
+(* mdm )->re = (mdmknoten) malloc ( sizeof (mdmschnuller ) ) ;
+ memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort));
+(* mdm )->re ->l1 = l ;
+ memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr ,sizeof(trennvektor));
+(* mdm )->re ->neu1 = neu ;
+(* mdm )->re ->li = nil ;
+(* mdm )->re ->re = nil ;
+ rechts ->li = (*mdm )->re ;
+ }
+}
+void zmdleintragen ( w , l , mdl )
+wort w ;
+integer l ;
+mdlknoten * mdl ;
+{mdleintragen_regmem
+ mdlknoten rechts ;
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdl_eintragen von " ) ;
+ wwort ( w , l ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( (*mdl )== nil )
+ {
+(* mdl )= (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ;
+ memcpy((void *)(* mdl )->w12 ,(void *) w,sizeof(wort)) ;
+(* mdl )->l1 = l ;
+(* mdl )->li = nil ;
+(* mdl )->re = nil ;
+ }
+ else if ( (*mdl )->re == nil )
+ {
+(* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ;
+ memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ;
+(* mdl )->re ->l1 = l ;
+(* mdl )->re ->li = nil ;
+(* mdl )->re ->re = nil ;
+(* mdl )->li = (*mdl )->re ;
+ }
+ else {
+
+ rechts = (*mdl )->re ;
+(* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ;
+ memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ;
+(* mdl )->re ->l1 = l ;
+(* mdl )->re ->li = nil ;
+(* mdl )->re ->re = nil ;
+ rechts ->li = (*mdl )->re ;
+ }
+}
+void zmdeeintragen ( w , l , mde )
+wort w ;
+integer l ;
+mdeknoten * mde ;
+{mdeeintragen_regmem
+ mdeknoten rechts ;
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mde_eintragen von " ) ;
+ wwort ( w , l ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( (*mde )== nil )
+ {
+(* mde )= (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ;
+ memcpy((void *)(* mde )->w12 ,(void *) w,sizeof(wort)) ;
+(* mde )->l1 = l ;
+(* mde )->li = nil ;
+(* mde )->re = nil ;
+ }
+ else if ( (*mde )->re == nil )
+ {
+(* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ;
+ memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ;
+(* mde )->re ->l1 = l ;
+(* mde )->re ->li = nil ;
+(* mde )->re ->re = nil ;
+(* mde )->li = (*mde )->re ;
+ }
+ else {
+
+ rechts = (*mde )->re ;
+(* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ;
+ memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ;
+(* mde )->re ->l1 = l ;
+(* mde )->re ->li = nil ;
+(* mde )->re ->re = nil ;
+ rechts ->li = (*mde )->re ;
+ }
+}
+boolean zmdsuchen ( w , l , mdb , tr )
+wort w ;
+integer l ;
+mdbknoten * mdb ;
+trennvektor tr ;
+{register boolean Result; mdsuchen_regmem
+ integer test ;
+ if ( (*mdb )== nil )
+ {
+ Result = false ;
+ }
+ else {
+
+ test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ;
+ if ( test == -1 )
+ {
+ Result = mdsuchen ( w , l , (*mdb )->li , tr ) ;
+ }
+ else if ( test == 1 )
+ {
+ Result = mdsuchen ( w , l , (*mdb )->re , tr ) ;
+ }
+ else {
+
+ tr = (*mdb )->tr1 ;
+(* mdb )->used1 = true ;
+ Result = true ;
+ }
+ }
+ return(Result) ;
+}
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c
new file mode 100644
index 0000000000..e4ff53e97c
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c
@@ -0,0 +1,2152 @@
+#define EXTERN extern
+#include "texd.h"
+
+boolean zinuse ( w , l , mdb )
+wort w ;
+integer l ;
+mdbknoten mdb ;
+{register boolean Result; inuse_regmem
+ integer test ;
+ if ( mdb == nil )
+ {
+ (void) Fputs( stdout , " =iSi=> in_use Fehler: " ) ;
+ wwort ( w , l ) ;
+ (void) Fputs( stdout , " nicht in mdb" ) ;
+ (void) putc('\n', stdout );
+ }
+ else {
+
+ test = vergl ( w , l , mdb ->w12 , mdb ->l1 ) ;
+ if ( test == -1 )
+ {
+ Result = inuse ( w , l , mdb ->li ) ;
+ }
+ else if ( test == 1 )
+ {
+ Result = inuse ( w , l , mdb ->re ) ;
+ }
+ else {
+
+ Result = mdb ->used1 ;
+ if ( isidebug == 1 )
+ {
+ if ( mdb ->used1 )
+ {
+ (void) Fputs( stdout , " =iSi=> " ) ;
+ wwort ( w , l ) ;
+ (void) Fputs( stdout , " in use" ) ;
+ (void) putc('\n', stdout );
+ }
+ else {
+
+ (void) Fputs( stdout , " =iSi=> " ) ;
+ wwort ( w , l ) ;
+ (void) Fputs( stdout , " not in use" ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+ }
+ }
+ return(Result) ;
+}
+void hsinit ( )
+{hsinit_regmem
+ integer i, j, l ;
+ trennvektor tr ;
+ wort w ;
+ char temp, auswahl, schnuller ;
+ boolean neu, memkorr ;
+ (void) putc('\n', stdout );
+ (void) putc('\n', stdout );
+ do {
+ (void) fprintf( stdout , "%s\n", "iSi debug Info ? [J/N]" ) ;
+ read ( stdin , auswahl ) ;
+ schnuller = auswahl ;
+ readln ( stdin ) ;
+ } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) || (
+ xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ;
+ (void) putc('\n', stdout );
+ if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) )
+ {
+ isidebug = 1 ;
+ }
+ else {
+
+ isidebug = 0 ;
+ }
+ {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <=
+ for_end) do
+ {
+ nameoffile [ i ] = ' ' ;
+ }
+ while ( i++ < for_end ) ; }
+ j = strstart [ jobname ] ;
+ i = 1 ;
+ while ( ( j < strstart [ jobname + 1 ] ) && ( i < FILENAMESIZE - 4 ) ) {
+
+ nameoffile [ i ] = xchr [ strpool [ j ] ] ;
+ j = j + 1 ;
+ i = i + 1 ;
+ }
+ nameoffile [ i ] = '.' ;
+ nameoffile [ i + 1 ] = 'm' ;
+ nameoffile [ i + 2 ] = 'e' ;
+ nameoffile [ i + 3 ] = 'm' ;
+ if ( ! aopenin ( hsmem , TEXINPUTPATH ) )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> cant a_open_in " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".mem" ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+ else {
+
+ do {
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , "Sollen Fehleintr\"age gel\"oscht werden? [J/N]" ) ;
+ (void) putc('\n', stdout );
+ read ( stdin , auswahl ) ;
+ schnuller = auswahl ;
+ readln ( stdin ) ;
+ } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) ||
+ ( xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ;
+ (void) putc('\n', stdout );
+ (void) putc('\n', stdout );
+ if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) )
+ {
+ memkorr = true ;
+ }
+ else {
+
+ memkorr = false ;
+ }
+ while ( ! eof ( hsmem ) ) {
+ fscanf ( hsmem , "%d", &l ) ;
+ readln ( hsmem ) ;
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ fscanf ( hsmem , "%hd", &w [ i ] ) ;
+ }
+ while ( i++ < for_end ) ; }
+ readln ( hsmem ) ;
+ {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do
+ {
+ fscanf ( hsmem , "%d", &tr [ i ] ) ;
+ }
+ while ( i++ < for_end ) ; }
+ readln ( hsmem ) ;
+ fscanf ( hsmem , "%c", &temp ) ;
+ readln ( hsmem ) ;
+ if ( temp == xchr [ 116 ] )
+ neu = true ;
+ else neu = false ;
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> reading from " ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".mem: " ) ;
+ wwort ( w , l ) ;
+ (void) Fputs( stdout , ", neu = " ) ;
+ (void) fprintf( stdout , "%ld", (long)temp ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( memkorr )
+ {
+ do {
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , "Soll " ) ;
+ writewt ( w , l , tr ) ;
+ (void) Fputs( stdout , " gel\"oscht werden? [J/N]" ) ;
+ (void) putc('\n', stdout );
+ read ( stdin , auswahl ) ;
+ schnuller = auswahl ;
+ readln ( stdin ) ;
+ } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 )
+ || ( xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ;
+ (void) putc('\n', stdout );
+ if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) )
+ {
+ ;
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( w , l , tr ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( w , l , tr , neu , false , mdb ) ;
+ mdmeintragen ( w , l , tr , neu , mdm ) ;
+ }
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( w , l , tr ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( w , l , tr , neu , false , mdb ) ;
+ mdmeintragen ( w , l , tr , neu , mdm ) ;
+ }
+ }
+ if ( isidebug == 1 )
+ {
+ (void) putc('\n', stdout );
+ }
+ aclose ( hsmem ) ;
+ }
+ do {
+ (void) putc('\n', stdout );
+ (void) fprintf( stdout , "%s\n", "Sollen mehrdeutige W\"orter angezeigt werden? [J/N]" )
+ ;
+ read ( stdin , auswahl ) ;
+ schnuller = auswahl ;
+ readln ( stdin ) ;
+ } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) || (
+ xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ;
+ (void) putc('\n', stdout );
+ if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) )
+ {
+ mehrdanz = true ;
+ }
+ else {
+
+ mehrdanz = false ;
+ }
+}
+void zabteilen ( w , tr1 , alletr , laenge , ok , zerlegungen )
+wort w ;
+trennvektor tr1 ;
+trenn16 alletr ;
+integer laenge ;
+boolean * ok ;
+integer * zerlegungen ;
+{/* 99 */ abteilen_regmem
+ integer i ;
+ integer iSij ;
+ dudt dud ;
+ varr v ;
+ intarr ind, k ;
+ trennvektor tr, dudtr ;
+ sperrvektor spv, dudstop ;
+ tr1 [ 0 ] = keine ;
+ {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do
+ {
+ tr [ i ] = keine ;
+ spv [ i ] = false ;
+ dudstop [ i ] = false ;
+ dud [ i ] = false ;
+ if ( i > 0 )
+ if ( ( w [ i ] == trennzeichen ) || ( w [ i ] == sonderzeichen ) )
+ {
+(* zerlegungen )= 0 ;
+(* ok )= false ;
+ goto lab99 ;
+ }
+ }
+ while ( i++ < for_end ) ; }
+(* zerlegungen )= 0 ;
+ trennen ( 3 , 1 , spv , (*ok ), alletr , tr , dudtr , (*zerlegungen ), dud , v ,
+ ind , k , dudstop , w , tr1 , laenge ) ;
+ {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do
+ if ( tr1 [ i ] == nebenck )
+ {
+ tr1 [ i ] = keine ;
+ tr1 [ i - 1 ] = nebenck ;
+ {register integer for_end; iSij = 1 ; for_end = (*zerlegungen ); if ( iSij
+ <= for_end) do
+ {
+ if ( ( alletr [ iSij ] [ i ] == nebenck ) )
+ {
+ alletr [ iSij ] [ i ] = keine ;
+ alletr [ iSij ] [ i - 1 ] = nebenck ;
+ }
+ }
+ while ( iSij++ < for_end ) ; }
+ }
+ while ( i++ < for_end ) ; }
+ lab99: ;
+}
+boolean zisdirtyumlaut ( p )
+halfword p ;
+{register boolean Result; isdirtyumlaut_regmem
+ boolean res ;
+ halfword q ;
+ res = false ;
+ if ( p != 0 )
+ if ( mem [ p ] .hh.b0 == 7 )
+ if ( mem [ p + 1 ] .hh .v.LH != 0 )
+ if ( mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH != 0 )
+ if ( mem [ mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH ] .hh .v.RH != 0 )
+ {
+ q = mem [ p + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ if ( ( mem [ q ] .hh.b0 == 11 ) && ( mem [ q + 1 ] .cint == specletterID )
+ && ( mem [ q ] .hh .v.RH >= himemmin ) && ( mem [ mem [ mem [ q ] .hh
+ .v.RH ] .hh .v.RH ] .hh.b0 == 11 ) )
+ res = true ;
+ }
+ Result = res ;
+ return(Result) ;
+}
+integer zgetcharof ( s )
+halfword s ;
+{register integer Result; getcharof_regmem
+ halfword q ;
+ q = mem [ s + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ Result = mem [ mem [ mem [ q ] .hh .v.RH ] .hh .v.RH + 1 ] .cint ;
+ return(Result) ;
+}
+integer zgetfontof ( s )
+halfword s ;
+{register integer Result; getfontof_regmem
+ halfword q ;
+ q = mem [ s + 1 ] .hh .v.LH ;
+ if ( mem [ q ] .hh.b0 == 12 )
+ q = mem [ q ] .hh .v.RH ;
+ Result = mem [ mem [ q ] .hh .v.RH ] .hh.b0 ;
+ return(Result) ;
+}
+void hyphenate ( )
+{/* 50 30 31 40 41 42 45 10 */ hyphenate_regmem
+ schar i, j, l, kk ;
+ halfword q, r, s, qq, qr, holdr ;
+ halfword bchar ;
+ short xchgchar[11] ;
+ schar addchar, xchgi, xchgk, xchghu ;
+ halfword spechyf ;
+ integer sij ;
+ halfword majortail, minortail ;
+ ASCIIcode c ;
+ schar cloc ;
+ integer rcount ;
+ halfword hyfnode ;
+ triepointer z ;
+ integer v ;
+ boolean funktioniert ;
+ integer zerleg ;
+ trenn16 alletr ;
+ char auswahl, schnuller ;
+ boolean memkorr ;
+ integer indexi ;
+ boolean uebersprungen ;
+ boolean lexja, lexok ;
+ hyphpointer h ;
+ strnumber k ;
+ poolpointer u ;
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ hyf [ j ] = 0 ;
+ while ( j++ < for_end ) ; }
+ h = hc [ 1 ] ;
+ incr ( hn ) ;
+ hc [ hn ] = curlang ;
+ {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do
+ h = ( h + h + hc [ j ] ) % 607 ;
+ while ( j++ < for_end ) ; }
+ while ( true ) {
+
+ k = hyphword [ h ] ;
+ if ( k == 0 )
+ goto lab45 ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn )
+ goto lab45 ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn )
+ {
+ j = 1 ;
+ u = strstart [ k ] ;
+ do {
+ if ( strpool [ u ] < hc [ j ] )
+ goto lab45 ;
+ if ( strpool [ u ] > hc [ j ] )
+ goto lab30 ;
+ incr ( j ) ;
+ incr ( u ) ;
+ } while ( ! ( j > hn ) ) ;
+ s = hyphlist [ h ] ;
+ while ( s != 0 ) {
+
+ hyf [ mem [ s ] .hh .v.LH ] = 1 ;
+ s = mem [ s ] .hh .v.RH ;
+ }
+ decr ( hn ) ;
+ goto lab40 ;
+ }
+ lab30: ;
+ if ( h > 0 )
+ decr ( h ) ;
+ else h = 607 ;
+ }
+ lab45: decr ( hn ) ;
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ hcsi [ j ] = ktab [ hc [ j ] ] ;
+ while ( j++ < for_end ) ; }
+ if ( odd ( eqtb [ 12719 ] .cint / 2 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 2 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hc [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hc [ j ] ) , logfile );
+ }
+ while ( j++ < for_end ) ; }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c\n", ':' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c\n", ':' ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc_si:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc_si:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , logfile );
+ }
+ while ( j++ < for_end ) ; }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c\n", ':' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c\n", ':' ) ;
+ }
+ }
+ if ( odd ( eqtb [ 12719 ] .cint / 4 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 4 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "< decimal character codes >" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "< decimal character codes >" ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%ld%c", (long)hc [ j ] , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%ld%c", (long)hc [ j ] , '-' ) ;
+ }
+ if ( ( ( j + 1 ) % 16 ) == 0 )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " " ) ;
+ }
+ }
+ }
+ while ( j++ < for_end ) ; }
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " hc_si:" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " hc_si:" ) ;
+ }
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ;
+ }
+ if ( ( ( j + 1 ) % 16 ) == 0 )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " " ) ;
+ }
+ }
+ }
+ while ( j++ < for_end ) ; }
+ println () ;
+ println () ;
+ }
+ if ( ! hsstart )
+ {
+ hsinit () ;
+ hsstart = true ;
+ }
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> abteilen von " ) ;
+ wwort ( hcsi , hn ) ;
+ }
+ abteilen ( hcsi , hyfsi , alletr , hn , funktioniert , zerleg ) ;
+ if ( ! funktioniert )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " =iSi=> unbekanntes Wort: " ) ;
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " =iSi=> suchen in mdb: " ) ;
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( mdsuchen ( hcsi , hn , mdb , hyfsi ) )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> gefunden in mdb: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ funktioniert = true ;
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> nicht gefunden in mdb: " ) ;
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ }
+ do {
+ (void) putc('\n', stdout );
+ (void) putc('\n', stdout );
+ (void) putc( '"' , stdout );
+ wwort ( hcsi , hn ) ;
+ (void) Fputs( stdout , "\" ist ein unbekanntes Wort!" ) ;
+ (void) putc('\n', stdout );
+ (void) fprintf( stdout , "%ld", (long)0 ) ;
+ (void) Fputs( stdout , ": neues Wort, merken in \"" ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".lex\"" ) ;
+ (void) putc('\n', stdout );
+ (void) fprintf( stdout , "%ld", (long)1 ) ;
+ (void) Fputs( stdout , ": neues Wort, Trennstellen angeben und merken in \"" ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".lex\"" ) ;
+ (void) putc('\n', stdout );
+ (void) fprintf( stdout , "%ld", (long)9 ) ;
+ (void) Fputs( stdout , ": Tippfehler! - merken im File \"" ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".edt\"" ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , "Bitte waehlen Sie eine Bedeutung (0,1,9) aus:" ) ;
+ (void) putc('\n', stdout );
+ read ( stdin , schnuller ) ;
+ auswahl = schnuller ;
+ readln ( stdin ) ;
+ } while ( ! ( ( ( xord [ auswahl ] >= 48 ) && ( xord [ auswahl ] <= 49 )
+ ) || ( auswahl == '9' ) ) ) ;
+ if ( ( auswahl == '0' ) )
+ {
+ {register integer for_end; indexi = 1 ; for_end = hn ; if ( indexi <=
+ for_end) do
+ {
+ hyfsi [ indexi ] = keine ;
+ }
+ while ( indexi++ < for_end ) ; }
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ;
+ funktioniert = true ;
+ }
+ else if ( ( auswahl == '9' ) )
+ {
+ mdeeintragen ( hcsi , hn , mde ) ;
+ }
+ else {
+
+ (void) Fputs( stdout , "Bitte den Trennvektor angeben" ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " (\"-\" Nebentrennstelle, \"=\" Haupttrennstelle, " ) ;
+ (void) Fputs( stdout , "\".\" Weiterruecken," ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " Trennstrich unter den Buchstaben angeben, hinter dem " ) ;
+ (void) Fputs( stdout , "getrennt werden soll):" ) ;
+ (void) putc('\n', stdout );
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ indexi = 1 ;
+ uebersprungen = false ;
+ read ( stdin , auswahl ) ;
+ while ( ( xord [ auswahl ] != 10 ) && ( indexi <= hn ) ) {
+
+ if ( ( hcsi [ indexi ] >= 27 ) && ( hcsi [ indexi ] <= 30 ) && !
+ uebersprungen )
+ {
+ uebersprungen = true ;
+ }
+ else {
+
+ if ( auswahl == '.' )
+ {
+ hyfsi [ indexi ] = keine ;
+ }
+ else if ( auswahl == '-' )
+ {
+ hyfsi [ indexi ] = neben ;
+ }
+ else if ( auswahl == '=' )
+ {
+ hyfsi [ indexi ] = haupt ;
+ }
+ else {
+
+ hyfsi [ indexi ] = keine ;
+ }
+ uebersprungen = false ;
+ indexi = indexi + 1 ;
+ }
+ read ( stdin , auswahl ) ;
+ }
+ while ( ( indexi ) <= hn ) {
+
+ hyfsi [ indexi ] = keine ;
+ indexi = indexi + 1 ;
+ }
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ;
+ funktioniert = true ;
+ }
+ }
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , ": " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+ if ( zerleg >= 2 )
+ {
+ gleicheweg ( alletr , zerleg , hn ) ;
+ if ( zerleg >= 2 )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mehrdeutiges Wort: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " =iSi=> suchen in mdb: " ) ;
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( mdsuchen ( hcsi , hn , mdb , hyfsi ) )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> gefunden in mdb: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> nicht gefunden in mdb: " ) ;
+ wwort ( hcsi , hn ) ;
+ (void) putc('\n', stdout );
+ }
+ if ( mehrdanz )
+ {
+ do {
+ (void) putc('\n', stdout );
+ (void) putc('\n', stdout );
+ (void) putc( '`' , stdout );
+ wwort ( hcsi , hn ) ;
+ (void) Fputs( stdout , "' ist ein mehrdeutiges Wort!" ) ;
+ (void) putc('\n', stdout );
+ (void) fprintf( stdout , "%ld", (long)0 ) ;
+ (void) Fputs( stdout , ": nur die sicheren Trennstellen waehlen (also `" ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) Fputs( stdout , "')" ) ;
+ (void) putc('\n', stdout );
+ {register integer for_end; indexi = 1 ; for_end = zerleg ; if (
+ indexi <= for_end) do
+ {
+ (void) fprintf( stdout , "%ld", (long)indexi ) ;
+ (void) Fputs( stdout , ": `" ) ;
+ writewt ( hcsi , hn , alletr [ indexi ] ) ;
+ (void) putc( '\'' , stdout );
+ (void) putc('\n', stdout );
+ }
+ while ( indexi++ < for_end ) ; }
+ (void) fprintf( stdout , "%ld", (long)9 ) ;
+ (void) Fputs( stdout , ": Tippfehler! - merken im File `" ) ;
+ wjob () ;
+ (void) Fputs( stdout , ".edt'" ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , "Bitte waehlen Sie eine Bedeutung z.B. `0'+`Enter' aus:" ) ;
+ (void) putc('\n', stdout );
+ (void) Fputs( stdout , " (zusaetzlich `E' z.B. `0E'+`Enter': " ) ;
+ (void) Fputs( stdout , "Wort auch fuer LEXIKON vormerken)" ) ;
+ (void) putc('\n', stdout );
+ read ( stdin , schnuller ) ;
+ auswahl = schnuller ;
+ lexja = false ;
+ lexok = true ;
+ if ( xord [ schnuller ] != 32 )
+ {
+ read ( stdin , schnuller ) ;
+ if ( xord [ schnuller ] != 10 )
+ {
+ if ( ( schnuller == 'e' ) || ( schnuller == 'E' ) )
+ {
+ lexja = true ;
+ }
+ else {
+
+ lexok = false ;
+ }
+ readln ( stdin ) ;
+ }
+ }
+ } while ( ! ( ( ( ( xord [ auswahl ] >= 48 ) && ( xord [ auswahl ]
+ <= 48 + zerleg ) ) || ( auswahl == '9' ) ) && lexok ) ) ;
+ if ( ( auswahl == '0' ) || ( ( auswahl == '0' ) && lexja ) )
+ {
+ if ( ( auswahl == '0' ) && ! lexja )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , false , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , false , mdm ) ;
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ;
+ }
+ }
+ else if ( ( auswahl == '9' ) )
+ {
+ mdeeintragen ( hcsi , hn , mde ) ;
+ }
+ else {
+ memcpy((void *)hyfsi , (void *) alletr [ xord [ auswahl ] - 48 ],
+ sizeof(trennvektor));
+ if ( ! lexja )
+ {
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , false , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , false , mdm ) ;
+ }
+ else {
+
+ if ( isidebug == 1 )
+ {
+ (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ;
+ writewt ( hcsi , hn , hyfsi ) ;
+ (void) putc('\n', stdout );
+ }
+ mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ;
+ mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ;
+ }
+ }
+ }
+ }
+ }
+ }
+ {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do
+ {
+ hyfdisc [ j ] = 0 ;
+ hyfpen [ j ] = 10000 ;
+ }
+ while ( j++ < for_end ) ; }
+ if ( funktioniert )
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ {
+ if ( hyfsi [ j ] == neben )
+ hyfpen [ j ] = eqtb [ 12718 ] .cint ;
+ else if ( hyfsi [ j ] == haupt )
+ hyfpen [ j ] = eqtb [ 12666 ] .cint ;
+ else if ( hyfsi [ j ] == nebenck )
+ {
+ hyfpen [ j + 1 ] = eqtb [ 12718 ] .cint ;
+ s = getnode ( 2 ) ;
+ mem [ s ] .hh.b0 = 7 ;
+ hyfdisc [ j + 1 ] = s ;
+ mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12718 ] .cint ) ;
+ s = mem [ s + 1 ] .hh .v.LH ;
+ mem [ s ] .hh.b1 = 0 ;
+ mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j + 2 ] ) ;
+ mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ;
+ s = hyfdisc [ j + 1 ] ;
+ mem [ s + 1 ] .hh .v.RH = 0 ;
+ mem [ s ] .hh .v.RH = 0 ;
+ }
+ else if ( hyfsi [ j ] == haupt3 )
+ {
+ hyfpen [ j - 1 ] = eqtb [ 12666 ] .cint ;
+ s = getnode ( 2 ) ;
+ mem [ s ] .hh.b0 = 7 ;
+ hyfdisc [ j - 1 ] = s ;
+ mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12666 ] .cint ) ;
+ s = mem [ s + 1 ] .hh .v.LH ;
+ mem [ s ] .hh.b1 = 1 ;
+ mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j ] ) ;
+ mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ;
+ s = hyfdisc [ j - 1 ] ;
+ mem [ s + 1 ] .hh .v.RH = 0 ;
+ mem [ s ] .hh .v.RH = 0 ;
+ }
+ }
+ while ( j++ < for_end ) ; }
+ if ( odd ( eqtb [ 12719 ] .cint / 8 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 8 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" )
+ ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) ;
+ }
+ }
+ if ( funktioniert )
+ {
+ {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do
+ if ( hyfpen [ j ] != 10000 )
+ {
+ if ( hyfdisc [ j ] != 0 )
+ {
+ if ( mem [ mem [ hyfdisc [ j ] + 1 ] .hh .v.LH ] .hh.b1 == 0 )
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ;
+ }
+ else {
+
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ;
+ }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hu [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hu [ j ] ) , logfile );
+ }
+ if ( hyfpen [ j ] == eqtb [ 12666 ] .cint )
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( '=' , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( '=' , logfile );
+ }
+ else {
+
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( '-' , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( '-' , logfile );
+ }
+ }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) putc( Xchr ( hu [ j ] ) , stdout );
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) putc( Xchr ( hu [ j ] ) , logfile );
+ }
+ }
+ while ( j++ < for_end ) ; }
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " no hyphens were found in this word!" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " no hyphens were found in this word!" ) ;
+ }
+ }
+ println () ;
+ }
+ goto lab31 ;
+ lab40: hyfpen [ 0 ] = 10000 ;
+ {register integer for_end; j = 1 ; for_end = hn ; if ( j <= for_end) do
+ if ( odd ( hyf [ j ] ) )
+ hyfpen [ j ] = eqtb [ 12666 ] .cint ;
+ else hyfpen [ j ] = 10000 ;
+ while ( j++ < for_end ) ; }
+ lab31: ;
+ {register integer for_end; j = lhyf ; for_end = hn - rhyf ; if ( j <=
+ for_end) do
+ if ( hyfpen [ j ] != 10000 )
+ goto lab41 ;
+ while ( j++ < for_end ) ; }
+ return ;
+ lab41: ;
+ q = mem [ hb ] .hh .v.RH ;
+ mem [ hb ] .hh .v.RH = 0 ;
+ r = mem [ ha ] .hh .v.RH ;
+ mem [ ha ] .hh .v.RH = 0 ;
+ bchar = 256 ;
+ holdr = newkern ( 1235 ) ;
+ mem [ holdr ] .hh .v.RH = r ;
+ if ( ! ( hb >= himemmin ) )
+ if ( mem [ hb ] .hh.b0 == 6 )
+ if ( odd ( mem [ hb ] .hh.b1 ) )
+ bchar = fontbchar [ hf ] ;
+ if ( ( ha >= himemmin ) )
+ if ( mem [ ha ] .hh.b0 != hf )
+ goto lab42 ;
+ else {
+
+ initlist = ha ;
+ initlig = false ;
+ hu [ 0 ] = mem [ ha ] .hh.b1 ;
+ }
+ else if ( isdirtyumlaut ( ha ) )
+ {
+ if ( getfontof ( ha ) != hf )
+ goto lab42 ;
+ else {
+
+ initlist = ha ;
+ initlig = false ;
+ hu [ 0 ] = getcharof ( ha ) ;
+ }
+ }
+ else if ( mem [ ha ] .hh.b0 == 6 )
+ if ( mem [ ha + 1 ] .hh.b0 != hf )
+ goto lab42 ;
+ else {
+
+ initlist = mem [ ha + 1 ] .hh .v.RH ;
+ initlig = true ;
+ initlft = ( mem [ ha ] .hh.b1 > 1 ) ;
+ hu [ 0 ] = mem [ ha + 1 ] .hh.b1 ;
+ if ( initlist == 0 )
+ if ( initlft )
+ {
+ hu [ 0 ] = 256 ;
+ initlig = false ;
+ }
+ freenode ( ha , 2 ) ;
+ }
+ else {
+
+ if ( ! ( r >= himemmin ) )
+ if ( mem [ r ] .hh.b0 == 6 )
+ if ( mem [ r ] .hh.b1 > 1 )
+ goto lab42 ;
+ j = 1 ;
+ s = ha ;
+ initlist = 0 ;
+ goto lab50 ;
+ }
+ s = curp ;
+ while ( mem [ s ] .hh .v.RH != ha ) s = mem [ s ] .hh .v.RH ;
+ j = 0 ;
+ goto lab50 ;
+ lab42: s = ha ;
+ j = 0 ;
+ hu [ 0 ] = 256 ;
+ initlig = false ;
+ initlist = 0 ;
+ lab50: qq = holdr ;
+ {register integer for_end; kk = j ; for_end = hn ; if ( kk <= for_end) do
+ if ( dirtyumlaut [ kk ] != 0 )
+ {
+ while ( mem [ qq ] .hh .v.RH != dirtyumlaut [ kk ] ) qq = mem [ qq ] .hh
+ .v.RH ;
+ qr = mem [ qq ] .hh .v.RH ;
+ {register integer for_end; i = 1 ; for_end = mem [ qr ] .hh.b1 ; if ( i
+ <= for_end) do
+ if ( qr != 0 )
+ qr = mem [ qr ] .hh .v.RH ;
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "...??..X --> ????? !" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "...??..X --> ????? !" ) ;
+ }
+ }
+ while ( i++ < for_end ) ; }
+ if ( qr != 0 )
+ {
+ mem [ qq ] .hh .v.RH = mem [ qr ] .hh .v.RH ;
+ mem [ qr ] .hh .v.RH = 0 ;
+ }
+ else mem [ qq ] .hh .v.RH = 0 ;
+ }
+ while ( kk++ < for_end ) ; }
+ if ( dirtyumlaut [ -1 ] != 0 )
+ {
+ qq = holdr ;
+ while ( ( mem [ qq ] .hh .v.RH != dirtyumlaut [ -1 ] ) && ( mem [ qq ] .hh
+ .v.RH != 0 ) ) qq = mem [ qq ] .hh .v.RH ;
+ if ( mem [ qq ] .hh .v.RH == dirtyumlaut [ -1 ] )
+ {
+ mem [ qq ] .hh .v.RH = mem [ dirtyumlaut [ -1 ] ] .hh .v.RH ;
+ mem [ dirtyumlaut [ -1 ] ] .hh .v.RH = 0 ;
+ }
+ else {
+
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) Fputs( stdout , " *** ERROR: node list is damaged! " ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) Fputs( logfile , " *** ERROR: node list is damaged! " ) ;
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ;
+ }
+ }
+ }
+ r = holdr ;
+ while ( mem [ r ] .hh .v.RH != 0 ) {
+
+ if ( ( memmin <= mem [ r ] .hh .v.RH ) && ( mem [ r ] .hh .v.RH <= memmax
+ ) )
+ r = mem [ r ] .hh .v.RH ;
+ else {
+
+ (void) putc('\n', logfile );
+ (void) putc('\n', stdout );
+ (void) fprintf( logfile , "%s\n", "???$ - ERROR in node list!" ) ;
+ (void) fprintf( stdout , "%s\n", "???$ - ERROR in node list!" ) ;
+ kk = depththreshold ;
+ l = breadthmax ;
+ depththreshold = 100 ;
+ breadthmax = 100 ;
+ shownodelist ( holdr ) ;
+ mem [ r ] .hh .v.RH = 0 ;
+ depththreshold = kk ;
+ breadthmax = l ;
+ }
+ }
+ flushnodelist ( holdr ) ;
+ if ( dirtyumlaut [ -1 ] != 0 )
+ {
+ mem [ s ] .hh .v.RH = dirtyumlaut [ -1 ] ;
+ s = mem [ s ] .hh .v.RH ;
+ }
+ do {
+ if ( dirtyumlaut [ j ] != 0 )
+ {
+ mem [ s ] .hh .v.RH = dirtyumlaut [ j ] ;
+ while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ j = j + 1 ;
+ hyphenpassed = 0 ;
+ if ( hyfpen [ j - 1 ] != 10000 )
+ {
+ l = j ;
+ hyphenpassed = j - 1 ;
+ if ( odd ( eqtb [ 12719 ] .cint / 16 ) )
+ {
+ if ( ! odd ( eqtb [ 12720 ] .cint / 16 ) )
+ {
+ println () ;
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ;
+ }
+ }
+ {
+ if ( ( fileoffset != 0 ) || ( termoffset != 0 ) )
+ println () ;
+ if ( selector != 18 )
+ (void) fprintf( stdout , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ;
+ if ( ( selector == 18 ) || ( selector == 19 ) )
+ (void) fprintf( logfile , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ;
+ }
+ }
+ }
+ }
+ else {
+
+ l = j ;
+ j = reconstitute ( j , hn , bchar , hyfchar ) + 1 ;
+ if ( hyphenpassed == 0 )
+ {
+ mem [ s ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ;
+ if ( hyfpen [ j - 1 ] != 10000 )
+ {
+ l = j ;
+ hyphenpassed = j - 1 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ }
+ }
+ }
+ if ( hyphenpassed > 0 )
+ do {
+ r = getnode ( 2 ) ;
+ mem [ r ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ mem [ r ] .hh.b0 = 7 ;
+ majortail = r ;
+ rcount = 0 ;
+ while ( mem [ majortail ] .hh .v.RH > 0 ) {
+
+ majortail = mem [ majortail ] .hh .v.RH ;
+ incr ( rcount ) ;
+ }
+ i = hyphenpassed ;
+ hyf [ i ] = 0 ;
+ if ( ( hyfpen [ i ] != 10000 ) && ( hyfpen [ i ] != eqtb [ 12666 ] .cint
+ ) )
+ minortail = newpenalty ( hyfpen [ i ] ) ;
+ else minortail = 0 ;
+ hyfpen [ i ] = 10000 ;
+ mem [ r + 1 ] .hh .v.LH = minortail ;
+ hyfnode = newcharacter ( hf , hyfchar ) ;
+ xchgk = i ;
+ if ( hyfdisc [ xchgk ] != 0 )
+ {
+ spechyf = mem [ hyfdisc [ xchgk ] + 1 ] .hh .v.LH ;
+ addchar = mem [ spechyf ] .hh.b1 ;
+ xchgi = 1 ;
+ do {
+ spechyf = mem [ spechyf ] .hh .v.RH ;
+ if ( spechyf != 0 )
+ {
+ xchgchar [ xchgi ] = mem [ spechyf ] .hh.b1 ;
+ incr ( xchgi ) ;
+ }
+ } while ( ! ( spechyf == 0 ) ) ;
+ if ( hyfnode != 0 )
+ {
+ xchgchar [ xchgi ] = hyfchar ;
+ {
+ mem [ hyfnode ] .hh .v.RH = avail ;
+ avail = hyfnode ;
+ ;
+#ifdef STAT
+ decr ( dynused ) ;
+#endif /* STAT */
+ }
+ }
+ else decr ( xchgi ) ;
+ xchghu = i - xchgi + addchar + 2 ;
+ {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk
+ <= for_end) do
+ {
+ xchgchar [ 0 ] = hu [ xchghu ] ;
+ hu [ xchghu ] = xchgchar [ xchgk ] ;
+ xchgchar [ xchgk ] = xchgchar [ 0 ] ;
+ incr ( xchghu ) ;
+ }
+ while ( xchgk++ < for_end ) ; }
+ xchgk = i ;
+ i = xchghu - 1 ;
+ xchghu = xchghu - xchgi ;
+ }
+ else if ( hyfnode != 0 )
+ {
+ incr ( i ) ;
+ c = hu [ i ] ;
+ hu [ i ] = hyfchar ;
+ {
+ mem [ hyfnode ] .hh .v.RH = avail ;
+ avail = hyfnode ;
+ ;
+#ifdef STAT
+ decr ( dynused ) ;
+#endif /* STAT */
+ }
+ }
+ while ( l <= i ) {
+
+ l = reconstitute ( l , i , fontbchar [ hf ] , 256 ) + 1 ;
+ if ( mem [ memtop - 4 ] .hh .v.RH > 0 )
+ {
+ if ( minortail == 0 )
+ mem [ r + 1 ] .hh .v.LH = mem [ memtop - 4 ] .hh .v.RH ;
+ else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ minortail = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [
+ minortail ] .hh .v.RH ;
+ }
+ }
+ if ( hyfdisc [ xchgk ] != 0 )
+ {
+ i = xchgk ;
+ l = i + 1 ;
+ {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk
+ <= for_end) do
+ {
+ hu [ xchghu ] = xchgchar [ xchgk ] ;
+ incr ( xchghu ) ;
+ }
+ while ( xchgk++ < for_end ) ; }
+ }
+ else if ( hyfnode != 0 )
+ {
+ hu [ i ] = c ;
+ l = i ;
+ decr ( i ) ;
+ }
+ minortail = 0 ;
+ mem [ r + 1 ] .hh .v.RH = 0 ;
+ cloc = 0 ;
+ if ( bcharlabel [ hf ] < fontmemsize )
+ {
+ decr ( l ) ;
+ c = hu [ l ] ;
+ cloc = l ;
+ hu [ l ] = 256 ;
+ }
+ while ( l < j ) {
+
+ do {
+ l = reconstitute ( l , hn , bchar , 256 ) + 1 ;
+ if ( cloc > 0 )
+ {
+ hu [ cloc ] = c ;
+ cloc = 0 ;
+ }
+ if ( mem [ memtop - 4 ] .hh .v.RH > 0 )
+ {
+ if ( minortail == 0 )
+ mem [ r + 1 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ minortail = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [
+ minortail ] .hh .v.RH ;
+ }
+ } while ( ! ( l >= j ) ) ;
+ while ( l > j ) {
+
+ j = reconstitute ( j , hn , bchar , 256 ) + 1 ;
+ mem [ majortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ while ( mem [ majortail ] .hh .v.RH > 0 ) {
+
+ majortail = mem [ majortail ] .hh .v.RH ;
+ incr ( rcount ) ;
+ }
+ }
+ }
+ if ( rcount > 127 )
+ {
+ mem [ s ] .hh .v.RH = mem [ r ] .hh .v.RH ;
+ mem [ r ] .hh .v.RH = 0 ;
+ flushnodelist ( r ) ;
+ }
+ else {
+
+ mem [ s ] .hh .v.RH = r ;
+ mem [ r ] .hh.b1 = rcount ;
+ }
+ s = majortail ;
+ hyphenpassed = j - 1 ;
+ mem [ memtop - 4 ] .hh .v.RH = 0 ;
+ } while ( ! ( ( hyfpen [ j - 1 ] == 10000 ) ) ) ;
+ } while ( ! ( j > hn ) ) ;
+ mem [ s ] .hh .v.RH = q ;
+ siq = s ;
+ {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do
+ if ( hyfdisc [ j ] != 0 )
+ {
+ flushnodelist ( hyfdisc [ j ] ) ;
+ }
+ while ( j++ < for_end ) ; }
+ flushlist ( initlist ) ;
+}
+void newhyphexceptions ( )
+{/* 21 10 40 45 */ newhyphexceptions_regmem
+ smallnumber n ;
+ smallnumber j ;
+ hyphpointer h ;
+ strnumber k ;
+ halfword p ;
+ halfword q ;
+ strnumber s, t ;
+ poolpointer u, v ;
+ scanleftbrace () ;
+ if ( eqtb [ 12713 ] .cint <= 0 )
+ curlang = 0 ;
+ else if ( eqtb [ 12713 ] .cint > 255 )
+ curlang = 0 ;
+ else curlang = eqtb [ 12713 ] .cint ;
+ n = 0 ;
+ p = 0 ;
+ while ( true ) {
+
+ getxtoken () ;
+ lab21: switch ( curcmd )
+ {case 11 :
+ case 12 :
+ case 68 :
+ if ( curchr == 45 )
+ {
+ if ( n < 63 )
+ {
+ q = getavail () ;
+ mem [ q ] .hh .v.RH = p ;
+ mem [ q ] .hh .v.LH = n ;
+ p = q ;
+ }
+ }
+ else {
+
+ if ( eqtb [ 11639 + curchr ] .hh .v.RH == 0 )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 941 ) ;
+ }
+ {
+ helpptr = 2 ;
+ helpline [ 1 ] = 942 ;
+ helpline [ 0 ] = 943 ;
+ }
+ error () ;
+ }
+ else if ( n < 63 )
+ {
+ incr ( n ) ;
+ hc [ n ] = eqtb [ 11639 + curchr ] .hh .v.RH ;
+ }
+ }
+ break ;
+ case 16 :
+ {
+ scancharnum () ;
+ curchr = curval ;
+ curcmd = 68 ;
+ goto lab21 ;
+ }
+ break ;
+ case 10 :
+ case 2 :
+ {
+ if ( n > 1 )
+ {
+ incr ( n ) ;
+ hc [ n ] = curlang ;
+ {
+ if ( poolptr + n > poolsize )
+ overflow ( 257 , poolsize - initpoolptr ) ;
+ }
+ h = 0 ;
+ {register integer for_end; j = 1 ; for_end = n ; if ( j <= for_end)
+ do
+ {
+ h = ( h + h + hc [ j ] ) % 607 ;
+ {
+ strpool [ poolptr ] = hc [ j ] ;
+ incr ( poolptr ) ;
+ }
+ }
+ while ( j++ < for_end ) ; }
+ s = makestring () ;
+ if ( hyphcount == 607 )
+ overflow ( 944 , 607 ) ;
+ incr ( hyphcount ) ;
+ while ( hyphword [ h ] != 0 ) {
+
+ k = hyphword [ h ] ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) < ( strstart [ s + 1
+ ] - strstart [ s ] ) )
+ goto lab40 ;
+ if ( ( strstart [ k + 1 ] - strstart [ k ] ) > ( strstart [ s + 1
+ ] - strstart [ s ] ) )
+ goto lab45 ;
+ u = strstart [ k ] ;
+ v = strstart [ s ] ;
+ do {
+ if ( strpool [ u ] < strpool [ v ] )
+ goto lab40 ;
+ if ( strpool [ u ] > strpool [ v ] )
+ goto lab45 ;
+ incr ( u ) ;
+ incr ( v ) ;
+ } while ( ! ( u == strstart [ k + 1 ] ) ) ;
+ lab40: q = hyphlist [ h ] ;
+ hyphlist [ h ] = p ;
+ p = q ;
+ t = hyphword [ h ] ;
+ hyphword [ h ] = s ;
+ s = t ;
+ lab45: ;
+ if ( h > 0 )
+ decr ( h ) ;
+ else h = 607 ;
+ }
+ hyphword [ h ] = s ;
+ hyphlist [ h ] = p ;
+ }
+ if ( curcmd == 2 )
+ return ;
+ n = 0 ;
+ p = 0 ;
+ }
+ break ;
+ default:
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 679 ) ;
+ }
+ printesc ( 937 ) ;
+ print ( 938 ) ;
+ {
+ helpptr = 2 ;
+ helpline [ 1 ] = 939 ;
+ helpline [ 0 ] = 940 ;
+ }
+ error () ;
+ }
+ break ;
+ }
+ }
+}
+halfword zprunepagetop ( p )
+halfword p ;
+{register halfword Result; prunepagetop_regmem
+ halfword prevp ;
+ halfword q ;
+ prevp = memtop - 3 ;
+ mem [ memtop - 3 ] .hh .v.RH = p ;
+ while ( p != 0 ) switch ( mem [ p ] .hh.b0 )
+ {case 0 :
+ case 1 :
+ case 2 :
+ {
+ q = newskipparam ( 10 ) ;
+ mem [ prevp ] .hh .v.RH = q ;
+ mem [ q ] .hh .v.RH = p ;
+ if ( mem [ tempptr + 1 ] .cint > mem [ p + 3 ] .cint )
+ mem [ tempptr + 1 ] .cint = mem [ tempptr + 1 ] .cint - mem [ p + 3 ]
+ .cint ;
+ else mem [ tempptr + 1 ] .cint = 0 ;
+ p = 0 ;
+ }
+ break ;
+ case 8 :
+ case 4 :
+ case 3 :
+ {
+ prevp = p ;
+ p = mem [ prevp ] .hh .v.RH ;
+ }
+ break ;
+ case 10 :
+ case 11 :
+ case 12 :
+ {
+ q = p ;
+ p = mem [ q ] .hh .v.RH ;
+ mem [ q ] .hh .v.RH = 0 ;
+ mem [ prevp ] .hh .v.RH = p ;
+ flushnodelist ( q ) ;
+ }
+ break ;
+ default:
+ confusion ( 954 ) ;
+ break ;
+ }
+ Result = mem [ memtop - 3 ] .hh .v.RH ;
+ return(Result) ;
+}
+halfword zvertbreak ( p , h , d )
+halfword p ;
+scaled h ;
+scaled d ;
+{/* 30 45 90 */ register halfword Result; vertbreak_regmem
+ halfword prevp ;
+ halfword q, r ;
+ integer pi ;
+ integer b ;
+ integer leastcost ;
+ halfword bestplace ;
+ scaled prevdp ;
+ smallnumber t ;
+ prevp = p ;
+ leastcost = 1073741823L ;
+ activewidth [ 1 ] = 0 ;
+ activewidth [ 2 ] = 0 ;
+ activewidth [ 3 ] = 0 ;
+ activewidth [ 4 ] = 0 ;
+ activewidth [ 5 ] = 0 ;
+ activewidth [ 6 ] = 0 ;
+ prevdp = 0 ;
+ while ( true ) {
+
+ if ( p == 0 )
+ pi = -10000 ;
+ else switch ( mem [ p ] .hh.b0 )
+ {case 0 :
+ case 1 :
+ case 2 :
+ {
+ activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ p + 3 ] .cint ;
+ prevdp = mem [ p + 2 ] .cint ;
+ goto lab45 ;
+ }
+ break ;
+ case 8 :
+ goto lab45 ;
+ break ;
+ case 10 :
+ if ( ( mem [ prevp ] .hh.b0 < 9 ) )
+ pi = 0 ;
+ else goto lab90 ;
+ break ;
+ case 11 :
+ {
+ if ( mem [ p ] .hh .v.RH == 0 )
+ t = 12 ;
+ else t = mem [ mem [ p ] .hh .v.RH ] .hh.b0 ;
+ if ( t == 10 )
+ pi = 0 ;
+ else goto lab90 ;
+ }
+ break ;
+ case 12 :
+ pi = mem [ p + 1 ] .cint ;
+ break ;
+ case 4 :
+ case 3 :
+ goto lab45 ;
+ break ;
+ default:
+ confusion ( 955 ) ;
+ break ;
+ }
+ if ( pi < 10000 )
+ {
+ if ( activewidth [ 1 ] < h )
+ if ( ( activewidth [ 3 ] != 0 ) || ( activewidth [ 4 ] != 0 ) || (
+ activewidth [ 5 ] != 0 ) )
+ b = 0 ;
+ else b = badness ( h - activewidth [ 1 ] , activewidth [ 2 ] ) ;
+ else if ( activewidth [ 1 ] - h > activewidth [ 6 ] )
+ b = 1073741823L ;
+ else b = badness ( activewidth [ 1 ] - h , activewidth [ 6 ] ) ;
+ if ( b < 1073741823L )
+ if ( pi <= -10000 )
+ b = pi ;
+ else if ( b < 10000 )
+ b = b + pi ;
+ else b = 100000L ;
+ if ( b <= leastcost )
+ {
+ bestplace = p ;
+ leastcost = b ;
+ bestheightplusdepth = activewidth [ 1 ] + prevdp ;
+ }
+ if ( ( b == 1073741823L ) || ( pi <= -10000 ) )
+ goto lab30 ;
+ }
+ if ( ( mem [ p ] .hh.b0 < 10 ) || ( mem [ p ] .hh.b0 > 11 ) )
+ goto lab45 ;
+ lab90: if ( mem [ p ] .hh.b0 == 11 )
+ q = p ;
+ else {
+
+ q = mem [ p + 1 ] .hh .v.LH ;
+ activewidth [ 2 + mem [ q ] .hh.b0 ] = activewidth [ 2 + mem [ q ]
+ .hh.b0 ] + mem [ q + 2 ] .cint ;
+ activewidth [ 6 ] = activewidth [ 6 ] + mem [ q + 3 ] .cint ;
+ if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 956 ) ;
+ }
+ {
+ helpptr = 4 ;
+ helpline [ 3 ] = 957 ;
+ helpline [ 2 ] = 958 ;
+ helpline [ 1 ] = 959 ;
+ helpline [ 0 ] = 918 ;
+ }
+ error () ;
+ r = newspec ( q ) ;
+ mem [ r ] .hh.b1 = 0 ;
+ deleteglueref ( q ) ;
+ mem [ p + 1 ] .hh .v.LH = r ;
+ q = r ;
+ }
+ }
+ activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ q + 1 ] .cint ;
+ prevdp = 0 ;
+ lab45: if ( prevdp > d )
+ {
+ activewidth [ 1 ] = activewidth [ 1 ] + prevdp - d ;
+ prevdp = d ;
+ }
+ prevp = p ;
+ p = mem [ prevp ] .hh .v.RH ;
+ }
+ lab30: Result = bestplace ;
+ return(Result) ;
+}
+halfword zvsplit ( n , h )
+eightbits n ;
+scaled h ;
+{/* 10 30 */ register halfword Result; vsplit_regmem
+ halfword v ;
+ halfword p ;
+ halfword q ;
+ v = eqtb [ 11078 + n ] .hh .v.RH ;
+ if ( curmark [ 3 ] != 0 )
+ {
+ deletetokenref ( curmark [ 3 ] ) ;
+ curmark [ 3 ] = 0 ;
+ deletetokenref ( curmark [ 4 ] ) ;
+ curmark [ 4 ] = 0 ;
+ }
+ if ( v == 0 )
+ {
+ Result = 0 ;
+ return(Result) ;
+ }
+ if ( mem [ v ] .hh.b0 != 1 )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 335 ) ;
+ }
+ printesc ( 960 ) ;
+ print ( 961 ) ;
+ printesc ( 962 ) ;
+ {
+ helpptr = 2 ;
+ helpline [ 1 ] = 963 ;
+ helpline [ 0 ] = 964 ;
+ }
+ error () ;
+ Result = 0 ;
+ return(Result) ;
+ }
+ q = vertbreak ( mem [ v + 5 ] .hh .v.RH , h , eqtb [ 13239 ] .cint ) ;
+ p = mem [ v + 5 ] .hh .v.RH ;
+ if ( p == q )
+ mem [ v + 5 ] .hh .v.RH = 0 ;
+ else while ( true ) {
+
+ if ( mem [ p ] .hh.b0 == 4 )
+ if ( curmark [ 3 ] == 0 )
+ {
+ curmark [ 3 ] = mem [ p + 1 ] .cint ;
+ curmark [ 4 ] = curmark [ 3 ] ;
+ mem [ curmark [ 3 ] ] .hh .v.LH = mem [ curmark [ 3 ] ] .hh .v.LH + 2 ;
+ }
+ else {
+
+ deletetokenref ( curmark [ 4 ] ) ;
+ curmark [ 4 ] = mem [ p + 1 ] .cint ;
+ incr ( mem [ curmark [ 4 ] ] .hh .v.LH ) ;
+ }
+ if ( mem [ p ] .hh .v.RH == q )
+ {
+ mem [ p ] .hh .v.RH = 0 ;
+ goto lab30 ;
+ }
+ p = mem [ p ] .hh .v.RH ;
+ }
+ lab30: ;
+ q = prunepagetop ( q ) ;
+ p = mem [ v + 5 ] .hh .v.RH ;
+ freenode ( v , 7 ) ;
+ if ( q == 0 )
+ eqtb [ 11078 + n ] .hh .v.RH = 0 ;
+ else eqtb [ 11078 + n ] .hh .v.RH = vpackage ( q , 0 , 1 , 1073741823L ) ;
+ Result = vpackage ( p , h , 0 , eqtb [ 13239 ] .cint ) ;
+ return(Result) ;
+}
+void printtotals ( )
+{printtotals_regmem
+ printscaled ( pagesofar [ 1 ] ) ;
+ if ( pagesofar [ 2 ] != 0 )
+ {
+ print ( 310 ) ;
+ printscaled ( pagesofar [ 2 ] ) ;
+ print ( 335 ) ;
+ }
+ if ( pagesofar [ 3 ] != 0 )
+ {
+ print ( 310 ) ;
+ printscaled ( pagesofar [ 3 ] ) ;
+ print ( 309 ) ;
+ }
+ if ( pagesofar [ 4 ] != 0 )
+ {
+ print ( 310 ) ;
+ printscaled ( pagesofar [ 4 ] ) ;
+ print ( 973 ) ;
+ }
+ if ( pagesofar [ 5 ] != 0 )
+ {
+ print ( 310 ) ;
+ printscaled ( pagesofar [ 5 ] ) ;
+ print ( 974 ) ;
+ }
+ if ( pagesofar [ 6 ] != 0 )
+ {
+ print ( 311 ) ;
+ printscaled ( pagesofar [ 6 ] ) ;
+ }
+}
+void zfreezepagespecs ( s )
+smallnumber s ;
+{freezepagespecs_regmem
+ pagecontents = s ;
+ pagesofar [ 0 ] = eqtb [ 13237 ] .cint ;
+ pagemaxdepth = eqtb [ 13238 ] .cint ;
+ pagesofar [ 7 ] = 0 ;
+ pagesofar [ 1 ] = 0 ;
+ pagesofar [ 2 ] = 0 ;
+ pagesofar [ 3 ] = 0 ;
+ pagesofar [ 4 ] = 0 ;
+ pagesofar [ 5 ] = 0 ;
+ pagesofar [ 6 ] = 0 ;
+ leastpagecost = 1073741823L ;
+ ;
+#ifdef STAT
+ if ( eqtb [ 12696 ] .cint > 0 )
+ {
+ begindiagnostic () ;
+ printnl ( 982 ) ;
+ printscaled ( pagesofar [ 0 ] ) ;
+ print ( 983 ) ;
+ printscaled ( pagemaxdepth ) ;
+ enddiagnostic ( false ) ;
+ }
+#endif /* STAT */
+}
+void zboxerror ( n )
+eightbits n ;
+{boxerror_regmem
+ error () ;
+ begindiagnostic () ;
+ printnl ( 832 ) ;
+ showbox ( eqtb [ 11078 + n ] .hh .v.RH ) ;
+ enddiagnostic ( true ) ;
+ flushnodelist ( eqtb [ 11078 + n ] .hh .v.RH ) ;
+ eqtb [ 11078 + n ] .hh .v.RH = 0 ;
+}
+void zensurevbox ( n )
+eightbits n ;
+{ensurevbox_regmem
+ halfword p ;
+ p = eqtb [ 11078 + n ] .hh .v.RH ;
+ if ( p != 0 )
+ if ( mem [ p ] .hh.b0 == 0 )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 984 ) ;
+ }
+ {
+ helpptr = 3 ;
+ helpline [ 2 ] = 985 ;
+ helpline [ 1 ] = 986 ;
+ helpline [ 0 ] = 987 ;
+ }
+ boxerror ( n ) ;
+ }
+}
+void zfireup ( c )
+halfword c ;
+{/* 10 */ fireup_regmem
+ halfword p, q, r, s ;
+ halfword prevp ;
+ unsigned char n ;
+ boolean wait ;
+ integer savevbadness ;
+ scaled savevfuzz ;
+ halfword savesplittopskip ;
+ if ( mem [ bestpagebreak ] .hh.b0 == 12 )
+ {
+ geqworddefine ( 12702 , mem [ bestpagebreak + 1 ] .cint ) ;
+ mem [ bestpagebreak + 1 ] .cint = 10000 ;
+ }
+ else geqworddefine ( 12702 , 10000 ) ;
+ if ( curmark [ 2 ] != 0 )
+ {
+ if ( curmark [ 0 ] != 0 )
+ deletetokenref ( curmark [ 0 ] ) ;
+ curmark [ 0 ] = curmark [ 2 ] ;
+ incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ;
+ deletetokenref ( curmark [ 1 ] ) ;
+ curmark [ 1 ] = 0 ;
+ }
+ if ( c == bestpagebreak )
+ bestpagebreak = 0 ;
+ if ( eqtb [ 11333 ] .hh .v.RH != 0 )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 335 ) ;
+ }
+ printesc ( 405 ) ;
+ print ( 998 ) ;
+ {
+ helpptr = 2 ;
+ helpline [ 1 ] = 999 ;
+ helpline [ 0 ] = 987 ;
+ }
+ boxerror ( 255 ) ;
+ }
+ insertpenalties = 0 ;
+ savesplittopskip = eqtb [ 10292 ] .hh .v.RH ;
+ if ( eqtb [ 12716 ] .cint <= 0 )
+ {
+ r = mem [ memtop ] .hh .v.RH ;
+ while ( r != memtop ) {
+
+ if ( mem [ r + 2 ] .hh .v.LH != 0 )
+ {
+ n = mem [ r ] .hh.b1 ;
+ ensurevbox ( n ) ;
+ if ( eqtb [ 11078 + n ] .hh .v.RH == 0 )
+ eqtb [ 11078 + n ] .hh .v.RH = newnullbox () ;
+ p = eqtb [ 11078 + n ] .hh .v.RH + 5 ;
+ while ( mem [ p ] .hh .v.RH != 0 ) p = mem [ p ] .hh .v.RH ;
+ mem [ r + 2 ] .hh .v.RH = p ;
+ }
+ r = mem [ r ] .hh .v.RH ;
+ }
+ }
+ q = memtop - 4 ;
+ mem [ q ] .hh .v.RH = 0 ;
+ prevp = memtop - 2 ;
+ p = mem [ prevp ] .hh .v.RH ;
+ while ( p != bestpagebreak ) {
+
+ if ( mem [ p ] .hh.b0 == 3 )
+ {
+ if ( eqtb [ 12716 ] .cint <= 0 )
+ {
+ r = mem [ memtop ] .hh .v.RH ;
+ while ( mem [ r ] .hh.b1 != mem [ p ] .hh.b1 ) r = mem [ r ] .hh .v.RH
+ ;
+ if ( mem [ r + 2 ] .hh .v.LH == 0 )
+ wait = true ;
+ else {
+
+ wait = false ;
+ s = mem [ r + 2 ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = mem [ p + 4 ] .hh .v.LH ;
+ if ( mem [ r + 2 ] .hh .v.LH == p )
+ {
+ if ( mem [ r ] .hh.b0 == 1 )
+ if ( ( mem [ r + 1 ] .hh .v.LH == p ) && ( mem [ r + 1 ] .hh .v.RH
+ != 0 ) )
+ {
+ while ( mem [ s ] .hh .v.RH != mem [ r + 1 ] .hh .v.RH ) s = mem
+ [ s ] .hh .v.RH ;
+ mem [ s ] .hh .v.RH = 0 ;
+ eqtb [ 10292 ] .hh .v.RH = mem [ p + 4 ] .hh .v.RH ;
+ mem [ p + 4 ] .hh .v.LH = prunepagetop ( mem [ r + 1 ] .hh .v.RH
+ ) ;
+ if ( mem [ p + 4 ] .hh .v.LH != 0 )
+ {
+ tempptr = vpackage ( mem [ p + 4 ] .hh .v.LH , 0 , 1 ,
+ 1073741823L ) ;
+ mem [ p + 3 ] .cint = mem [ tempptr + 3 ] .cint + mem [
+ tempptr + 2 ] .cint ;
+ freenode ( tempptr , 7 ) ;
+ wait = true ;
+ }
+ }
+ mem [ r + 2 ] .hh .v.LH = 0 ;
+ n = mem [ r ] .hh.b1 ;
+ tempptr = mem [ eqtb [ 11078 + n ] .hh .v.RH + 5 ] .hh .v.RH ;
+ freenode ( eqtb [ 11078 + n ] .hh .v.RH , 7 ) ;
+ eqtb [ 11078 + n ] .hh .v.RH = vpackage ( tempptr , 0 , 1 ,
+ 1073741823L ) ;
+ }
+ else {
+
+ while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ;
+ mem [ r + 2 ] .hh .v.RH = s ;
+ }
+ }
+ mem [ prevp ] .hh .v.RH = mem [ p ] .hh .v.RH ;
+ mem [ p ] .hh .v.RH = 0 ;
+ if ( wait )
+ {
+ mem [ q ] .hh .v.RH = p ;
+ q = p ;
+ incr ( insertpenalties ) ;
+ }
+ else {
+
+ deleteglueref ( mem [ p + 4 ] .hh .v.RH ) ;
+ freenode ( p , 5 ) ;
+ }
+ p = prevp ;
+ }
+ }
+ else if ( mem [ p ] .hh.b0 == 4 )
+ {
+ if ( curmark [ 1 ] == 0 )
+ {
+ curmark [ 1 ] = mem [ p + 1 ] .cint ;
+ incr ( mem [ curmark [ 1 ] ] .hh .v.LH ) ;
+ }
+ if ( curmark [ 2 ] != 0 )
+ deletetokenref ( curmark [ 2 ] ) ;
+ curmark [ 2 ] = mem [ p + 1 ] .cint ;
+ incr ( mem [ curmark [ 2 ] ] .hh .v.LH ) ;
+ }
+ prevp = p ;
+ p = mem [ prevp ] .hh .v.RH ;
+ }
+ eqtb [ 10292 ] .hh .v.RH = savesplittopskip ;
+ if ( p != 0 )
+ {
+ if ( mem [ memtop - 1 ] .hh .v.RH == 0 )
+ if ( nestptr == 0 )
+ curlist .tailfield = pagetail ;
+ else nest [ 0 ] .tailfield = pagetail ;
+ mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ;
+ mem [ memtop - 1 ] .hh .v.RH = p ;
+ mem [ prevp ] .hh .v.RH = 0 ;
+ }
+ savevbadness = eqtb [ 12690 ] .cint ;
+ eqtb [ 12690 ] .cint = 10000 ;
+ savevfuzz = eqtb [ 13242 ] .cint ;
+ eqtb [ 13242 ] .cint = 1073741823L ;
+ eqtb [ 11333 ] .hh .v.RH = vpackage ( mem [ memtop - 2 ] .hh .v.RH ,
+ bestsize , 0 , pagemaxdepth ) ;
+ eqtb [ 12690 ] .cint = savevbadness ;
+ eqtb [ 13242 ] .cint = savevfuzz ;
+ if ( lastglue != 262143L )
+ deleteglueref ( lastglue ) ;
+ pagecontents = 0 ;
+ pagetail = memtop - 2 ;
+ mem [ memtop - 2 ] .hh .v.RH = 0 ;
+ lastglue = 262143L ;
+ lastpenalty = 0 ;
+ lastkern = 0 ;
+ pagesofar [ 7 ] = 0 ;
+ pagemaxdepth = 0 ;
+ if ( q != memtop - 4 )
+ {
+ mem [ memtop - 2 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ;
+ pagetail = q ;
+ }
+ r = mem [ memtop ] .hh .v.RH ;
+ while ( r != memtop ) {
+
+ q = mem [ r ] .hh .v.RH ;
+ freenode ( r , 4 ) ;
+ r = q ;
+ }
+ mem [ memtop ] .hh .v.RH = memtop ;
+ if ( ( curmark [ 0 ] != 0 ) && ( curmark [ 1 ] == 0 ) )
+ {
+ curmark [ 1 ] = curmark [ 0 ] ;
+ incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ;
+ }
+ if ( eqtb [ 10813 ] .hh .v.RH != 0 )
+ if ( deadcycles >= eqtb [ 12703 ] .cint )
+ {
+ {
+ if ( interaction == 3 )
+ ;
+ printnl ( 262 ) ;
+ print ( 1000 ) ;
+ }
+ printint ( deadcycles ) ;
+ print ( 1001 ) ;
+ {
+ helpptr = 3 ;
+ helpline [ 2 ] = 1002 ;
+ helpline [ 1 ] = 1003 ;
+ helpline [ 0 ] = 1004 ;
+ }
+ error () ;
+ }
+ else {
+
+ outputactive = true ;
+ incr ( deadcycles ) ;
+ pushnest () ;
+ curlist .modefield = -1 ;
+ curlist .auxfield .cint = -65536000L ;
+ curlist .mlfield = - (integer) line ;
+ begintokenlist ( eqtb [ 10813 ] .hh .v.RH , 6 ) ;
+ newsavelevel ( 8 ) ;
+ normalparagraph () ;
+ scanleftbrace () ;
+ return ;
+ }
+ {
+ if ( mem [ memtop - 2 ] .hh .v.RH != 0 )
+ {
+ if ( mem [ memtop - 1 ] .hh .v.RH == 0 )
+ if ( nestptr == 0 )
+ curlist .tailfield = pagetail ;
+ else nest [ 0 ] .tailfield = pagetail ;
+ else mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ;
+ mem [ memtop - 1 ] .hh .v.RH = mem [ memtop - 2 ] .hh .v.RH ;
+ mem [ memtop - 2 ] .hh .v.RH = 0 ;
+ pagetail = memtop - 2 ;
+ }
+ shipout ( eqtb [ 11333 ] .hh .v.RH ) ;
+ eqtb [ 11333 ] .hh .v.RH = 0 ;
+ }
+}
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h
new file mode 100644
index 0000000000..9016192dcb
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h
@@ -0,0 +1,532 @@
+#undef TRIP
+#undef TRAP
+#define STAT
+#undef DEBUG
+#include "../common/texmf.h"
+#define memmax 262140L
+#define memmin 0
+#define bufsize 3000
+#define errorline 79
+#define halferrorline 50
+#define maxprintline 79
+#define stacksize 300
+#define maxinopen 15
+#define fontmax 255
+#define fontmemsize 72000L
+#define paramsize 60
+#define nestsize 40
+#define maxstrings 7500
+#define stringvacancies 74000L
+#define poolsize 100000L
+#define savesize 4000
+#define triesize 24000
+#define trieopsize 750
+#define negtrieopsize -750
+#define mintrieop 0
+#define maxtrieop 500
+#define dvibufsize 16384
+#define poolname "isitex.pool"
+#define memtop 262140L
+#define nil 0
+#define maxwl 64
+#define sonderzeichen 0
+#define bsta 1
+#define bstb 2
+#define bstc 3
+#define bstd 4
+#define bste 5
+#define bstf 6
+#define bstg 7
+#define bsth 8
+#define bsti 9
+#define bstj 10
+#define bstk 11
+#define bstl 12
+#define bstm 13
+#define bstn 14
+#define bsto 15
+#define bstp 16
+#define bstq 17
+#define bstr 18
+#define bsts 19
+#define bstt 20
+#define bstu 21
+#define bstv 22
+#define bstw 23
+#define bstx 24
+#define bsty 25
+#define bstz 26
+#define bstae 27
+#define bstoe 28
+#define bstue 29
+#define bstsz 30
+#define trennzeichen 31
+#define keine 1
+#define neben 2
+#define nebenck 3
+#define haupt 4
+#define haupt3 5
+#define tabsize 8191
+#define specletterID 4321
+#define voka 1
+#define voke 2
+#define voki 3
+#define voko 4
+#define voku 5
+#define vokae 6
+#define vokoe 7
+#define vokue 8
+#define vokie 9
+#define vokai 10
+#define vokei 11
+#define vokau 12
+#define vokaeu 13
+#define vokeu 14
+#define voky 15
+#define kons 16
+typedef unsigned char ASCIIcode ;
+typedef unsigned char eightbits ;
+typedef integer poolpointer ;
+typedef integer strnumber ;
+typedef unsigned char packedASCIIcode ;
+typedef integer scaled ;
+typedef integer nonnegativeinteger ;
+typedef schar smallnumber ;
+typedef unsigned char quarterword ;
+typedef integer halfword ;
+typedef schar twochoices ;
+typedef schar fourchoices ;
+#include "memory.h"
+#include <malloc.h>
+typedef schar glueord ;
+typedef struct {
+ short modefield ;
+ halfword headfield, tailfield ;
+ integer pgfield, mlfield ;
+ memoryword auxfield ;
+ quarterword lhmfield, rhmfield ;
+} liststaterecord ;
+typedef schar groupcode ;
+typedef struct {
+ quarterword statefield, indexfield ;
+ halfword startfield, locfield, limitfield, namefield ;
+} instaterecord ;
+typedef integer internalfontnumber ;
+typedef integer fontindex ;
+typedef integer dviindex ;
+typedef integer trieopcode ;
+typedef integer triepointer ;
+typedef eightbits string80 [81] ;
+typedef eightbits buchstabe ;
+typedef short aword [maxwl + 1] ;
+typedef aword wort ;
+typedef boolean sperrvektor [maxwl + 1] ;
+typedef boolean dudt [maxwl + 1] ;
+typedef integer trennvektor [maxwl + 1] ;
+typedef buchstabe ktabtype [256] ;
+typedef unsigned long verdschlue ;
+typedef verdschlue varr [maxwl + 1] ;
+typedef integer intarr [maxwl + 1] ;
+typedef struct {
+ boolean ausnahme ;
+ boolean untrennbar ;
+ integer erste ;
+ integer zweite ;
+ boolean endung, vorsilbe, stamm, ehervor, stammallein ;
+} infotype ;
+typedef eightbits infobyte ;
+typedef struct {
+ verdschlue tabv ;
+ infobyte tabb ;
+ boolean frei ;
+ boolean wiederfrei ;
+} tableentry ;
+typedef eightbits hashelement [4] ;
+typedef hashelement htabtype [tabsize + 1] ;
+typedef trennvektor trenn16 [17] ;
+typedef struct mdbk {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ boolean del1 ;
+ boolean used1 ;
+ struct mdbk * li, * re ;
+} mdbk ;
+typedef struct mdmk {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ struct mdmk * li, * re ;
+} mdmk ;
+typedef struct mdlk {
+ wort w12 ;
+ integer l1 ;
+ struct mdlk * li, * re ;
+} mdlk ;
+typedef struct mdek {
+ wort w12 ;
+ integer l1 ;
+ struct mdek * li, * re ;
+} mdek ;
+typedef mdbk * mdbknoten ;
+typedef mdmk * mdmknoten ;
+typedef mdlk * mdlknoten ;
+typedef mdek * mdeknoten ;
+typedef short hyphpointer ;
+EXTERN integer bad ;
+EXTERN ASCIIcode xord[256] ;
+EXTERN ASCIIcode xchr[256] ;
+EXTERN char nameoffile[FILENAMESIZE + 1] ;
+EXTERN integer namelength ;
+EXTERN ASCIIcode buffer[bufsize + 1] ;
+EXTERN integer first ;
+EXTERN integer last ;
+EXTERN integer maxbufstack ;
+EXTERN packedASCIIcode strpool[poolsize + 1] ;
+EXTERN poolpointer strstart[maxstrings + 1] ;
+EXTERN poolpointer poolptr ;
+EXTERN strnumber strptr ;
+EXTERN poolpointer initpoolptr ;
+EXTERN strnumber initstrptr ;
+#ifdef INITEX
+EXTERN alphafile poolfile ;
+#endif /* INITEX */
+EXTERN alphafile logfile ;
+EXTERN schar selector ;
+EXTERN schar dig[23] ;
+EXTERN integer tally ;
+EXTERN integer termoffset ;
+EXTERN integer fileoffset ;
+EXTERN ASCIIcode trickbuf[errorline + 1] ;
+EXTERN integer trickcount ;
+EXTERN integer firstcount ;
+EXTERN schar interaction ;
+EXTERN boolean deletionsallowed ;
+EXTERN schar history ;
+EXTERN schar errorcount ;
+EXTERN strnumber helpline[6] ;
+EXTERN schar helpptr ;
+EXTERN boolean useerrhelp ;
+EXTERN integer interrupt ;
+EXTERN boolean OKtointerrupt ;
+EXTERN boolean aritherror ;
+EXTERN scaled remainder ;
+EXTERN halfword tempptr ;
+EXTERN memoryword
+#define zmem (zzzaa - (int)(memmin))
+ zzzaa[memmax - memmin + 1] ;
+EXTERN halfword lomemmax ;
+EXTERN halfword himemmin ;
+EXTERN integer varused, dynused ;
+EXTERN halfword avail ;
+EXTERN halfword memend ;
+EXTERN halfword rover ;
+#ifdef DEBUG
+EXTERN boolean
+#define freearr (zzzab - (int)(memmin))
+ zzzab[memmax - memmin + 1] ;
+EXTERN boolean
+#define wasfree (zzzac - (int)(memmin))
+ zzzac[memmax - memmin + 1] ;
+EXTERN halfword wasmemend, waslomax, washimin ;
+EXTERN boolean panicking ;
+#endif /* DEBUG */
+EXTERN integer fontinshortdisplay ;
+EXTERN integer depththreshold ;
+EXTERN integer breadthmax ;
+EXTERN liststaterecord nest[nestsize + 1] ;
+EXTERN integer nestptr ;
+EXTERN integer maxneststack ;
+EXTERN liststaterecord curlist ;
+EXTERN short shownmode ;
+EXTERN schar oldsetting ;
+EXTERN memoryword zeqtb[13510] ;
+EXTERN quarterword
+#define xeqlevel (zzzad -12663)
+ zzzad[847] ;
+EXTERN twohalves
+#define hash (zzzae -514)
+ zzzae[9767] ;
+EXTERN halfword hashused ;
+EXTERN boolean nonewcontrolsequence ;
+EXTERN integer cscount ;
+EXTERN memoryword savestack[savesize + 1] ;
+EXTERN integer saveptr ;
+EXTERN integer maxsavestack ;
+EXTERN quarterword curlevel ;
+EXTERN groupcode curgroup ;
+EXTERN integer curboundary ;
+EXTERN integer magset ;
+EXTERN eightbits curcmd ;
+EXTERN halfword curchr ;
+EXTERN halfword curcs ;
+EXTERN halfword curtok ;
+EXTERN instaterecord inputstack[stacksize + 1] ;
+EXTERN integer inputptr ;
+EXTERN integer maxinstack ;
+EXTERN instaterecord curinput ;
+EXTERN integer inopen ;
+EXTERN integer openparens ;
+EXTERN alphafile inputfile[maxinopen + 1] ;
+EXTERN integer line ;
+EXTERN integer linestack[maxinopen + 1] ;
+EXTERN schar scannerstatus ;
+EXTERN halfword warningindex ;
+EXTERN halfword defref ;
+EXTERN halfword paramstack[paramsize + 1] ;
+EXTERN integer paramptr ;
+EXTERN integer maxparamstack ;
+EXTERN integer alignstate ;
+EXTERN integer baseptr ;
+EXTERN halfword parloc ;
+EXTERN halfword partoken ;
+EXTERN boolean forceeof ;
+EXTERN halfword curmark[5] ;
+EXTERN schar longstate ;
+EXTERN halfword pstack[9] ;
+EXTERN integer curval ;
+EXTERN schar curvallevel ;
+EXTERN smallnumber radix ;
+EXTERN glueord curorder ;
+EXTERN alphafile readfile[16] ;
+EXTERN schar readopen[17] ;
+EXTERN halfword condptr ;
+EXTERN schar iflimit ;
+EXTERN smallnumber curif ;
+EXTERN integer ifline ;
+EXTERN integer skipline ;
+EXTERN strnumber curname ;
+EXTERN strnumber curarea ;
+EXTERN strnumber curext ;
+EXTERN poolpointer areadelimiter ;
+EXTERN poolpointer extdelimiter ;
+EXTERN integer formatdefaultlength ;
+EXTERN ccharpointer TEXformatdefault ;
+EXTERN boolean nameinprogress ;
+EXTERN strnumber jobname ;
+EXTERN boolean logopened ;
+EXTERN bytefile dvifile ;
+EXTERN strnumber outputfilename ;
+EXTERN strnumber logname ;
+EXTERN bytefile tfmfile ;
+EXTERN memoryword fontinfo[fontmemsize + 1] ;
+EXTERN fontindex fmemptr ;
+EXTERN internalfontnumber fontptr ;
+EXTERN fourquarters fontcheck[fontmax + 1] ;
+EXTERN scaled fontsize[fontmax + 1] ;
+EXTERN scaled fontdsize[fontmax + 1] ;
+EXTERN halfword fontparams[fontmax + 1] ;
+EXTERN strnumber fontname[fontmax + 1] ;
+EXTERN strnumber fontarea[fontmax + 1] ;
+EXTERN eightbits fontbc[fontmax + 1] ;
+EXTERN eightbits fontec[fontmax + 1] ;
+EXTERN halfword fontglue[fontmax + 1] ;
+EXTERN boolean fontused[fontmax + 1] ;
+EXTERN integer hyphenchar[fontmax + 1] ;
+EXTERN integer skewchar[fontmax + 1] ;
+EXTERN fontindex bcharlabel[fontmax + 1] ;
+EXTERN short fontbchar[fontmax + 1] ;
+EXTERN short fontfalsebchar[fontmax + 1] ;
+EXTERN integer charbase[fontmax + 1] ;
+EXTERN integer widthbase[fontmax + 1] ;
+EXTERN integer heightbase[fontmax + 1] ;
+EXTERN integer depthbase[fontmax + 1] ;
+EXTERN integer italicbase[fontmax + 1] ;
+EXTERN integer ligkernbase[fontmax + 1] ;
+EXTERN integer kernbase[fontmax + 1] ;
+EXTERN integer extenbase[fontmax + 1] ;
+EXTERN integer parambase[fontmax + 1] ;
+EXTERN fourquarters nullcharacter ;
+EXTERN integer totalpages ;
+EXTERN scaled maxv ;
+EXTERN scaled maxh ;
+EXTERN integer maxpush ;
+EXTERN integer lastbop ;
+EXTERN integer deadcycles ;
+EXTERN boolean doingleaders ;
+EXTERN quarterword c, f ;
+EXTERN scaled ruleht, ruledp, rulewd ;
+EXTERN halfword g ;
+EXTERN integer lq, lr ;
+EXTERN eightbits dvibuf[dvibufsize + 1] ;
+EXTERN dviindex halfbuf ;
+EXTERN dviindex dvilimit ;
+EXTERN dviindex dviptr ;
+EXTERN integer dvioffset ;
+EXTERN integer dvigone ;
+EXTERN halfword downptr, rightptr ;
+EXTERN scaled dvih, dviv ;
+EXTERN scaled curh, curv ;
+EXTERN internalfontnumber dvif ;
+EXTERN integer curs ;
+EXTERN scaled totalstretch[4], totalshrink[4] ;
+EXTERN integer lastbadness ;
+EXTERN halfword adjusttail ;
+EXTERN integer packbeginline ;
+EXTERN twohalves emptyfield ;
+EXTERN fourquarters nulldelimiter ;
+EXTERN halfword curmlist ;
+EXTERN smallnumber curstyle ;
+EXTERN smallnumber cursize ;
+EXTERN scaled curmu ;
+EXTERN boolean mlistpenalties ;
+EXTERN internalfontnumber curf ;
+EXTERN quarterword curc ;
+EXTERN fourquarters curi ;
+EXTERN integer magicoffset ;
+EXTERN halfword curalign ;
+EXTERN halfword curspan ;
+EXTERN halfword curloop ;
+EXTERN halfword alignptr ;
+EXTERN halfword curhead, curtail ;
+EXTERN halfword justbox ;
+EXTERN halfword passive ;
+EXTERN halfword printednode ;
+EXTERN halfword passnumber ;
+EXTERN scaled activewidth[7] ;
+EXTERN scaled curactivewidth[7] ;
+EXTERN scaled background[7] ;
+EXTERN scaled breakwidth[7] ;
+EXTERN boolean noshrinkerroryet ;
+EXTERN halfword curp ;
+EXTERN boolean secondpass ;
+EXTERN boolean finalpass ;
+EXTERN integer threshold ;
+EXTERN integer minimaldemerits[4] ;
+EXTERN integer minimumdemerits ;
+EXTERN halfword bestplace[4] ;
+EXTERN halfword bestplline[4] ;
+EXTERN scaled discwidth ;
+EXTERN halfword easyline ;
+EXTERN halfword lastspecialline ;
+EXTERN scaled firstwidth ;
+EXTERN scaled secondwidth ;
+EXTERN scaled firstindent ;
+EXTERN scaled secondindent ;
+EXTERN halfword bestbet ;
+EXTERN integer fewestdemerits ;
+EXTERN halfword bestline ;
+EXTERN integer actuallooseness ;
+EXTERN integer linediff ;
+EXTERN aword hc ;
+EXTERN smallnumber hn ;
+EXTERN halfword ha, hb ;
+EXTERN integer hyfdebi, hyfdebj ;
+EXTERN boolean hyfdebb ;
+EXTERN halfword sip, siq, sir, sis ;
+EXTERN internalfontnumber hf ;
+EXTERN short hu[64] ;
+EXTERN integer hyfchar ;
+EXTERN ASCIIcode curlang ;
+EXTERN integer lhyf, rhyf ;
+EXTERN halfword
+#define dirtyumlaut (zzzaf +1)
+ zzzaf[66] ;
+EXTERN schar hyf[65] ;
+EXTERN halfword initlist ;
+EXTERN boolean initlig ;
+EXTERN boolean initlft ;
+EXTERN integer hyfpen[65] ;
+EXTERN trennvektor hyfsi ;
+EXTERN wort hcsi ;
+EXTERN halfword hyfdisc[65] ;
+EXTERN smallnumber hyphenpassed ;
+EXTERN halfword curl, curr ;
+EXTERN halfword curq ;
+EXTERN halfword ligstack ;
+EXTERN boolean ligaturepresent ;
+EXTERN boolean lfthit, rthit ;
+EXTERN halfword trietrl[triesize + 1] ;
+EXTERN halfword trietro[triesize + 1] ;
+EXTERN quarterword trietrc[triesize + 1] ;
+EXTERN smallnumber hyfdistance[trieopsize + 1] ;
+EXTERN smallnumber hyfnum[trieopsize + 1] ;
+EXTERN quarterword hyfnext[trieopsize + 1] ;
+EXTERN integer opstart[256] ;
+EXTERN ktabtype ktab ;
+EXTERN htabtype htab ;
+EXTERN integer anzahl ;
+EXTERN alphafile hashfile ;
+EXTERN alphafile hsmem, hslex, hsedt ;
+EXTERN integer kombtab[6][6] ;
+EXTERN boolean konsonant[31] ;
+EXTERN boolean hsstart ;
+EXTERN integer isidebug ;
+EXTERN char auswahl, schnuller ;
+EXTERN boolean mehrdanz ;
+EXTERN mdbknoten mdb ;
+EXTERN mdmknoten mdm ;
+EXTERN mdlknoten mdl ;
+EXTERN mdeknoten mde ;
+EXTERN mdbk mdbschnuller ;
+EXTERN mdmk mdmschnuller ;
+EXTERN mdlk mdlschnuller ;
+EXTERN mdek mdeschnuller ;
+EXTERN integer hsii, hsij ;
+EXTERN integer revtab[256] ;
+EXTERN strnumber hyphword[608] ;
+EXTERN halfword hyphlist[608] ;
+EXTERN hyphpointer hyphcount ;
+#ifdef INITEX
+EXTERN integer
+#define trieophash (zzzag - (int)(negtrieopsize))
+ zzzag[trieopsize - negtrieopsize + 1] ;
+EXTERN trieopcode trieused[256] ;
+EXTERN ASCIIcode trieoplang[trieopsize + 1] ;
+EXTERN trieopcode trieopval[trieopsize + 1] ;
+EXTERN integer trieopptr ;
+#endif /* INITEX */
+EXTERN trieopcode maxopused ;
+EXTERN boolean smallop ;
+#ifdef INITEX
+EXTERN packedASCIIcode triec[triesize + 1] ;
+EXTERN trieopcode trieo[triesize + 1] ;
+EXTERN triepointer triel[triesize + 1] ;
+EXTERN triepointer trier[triesize + 1] ;
+EXTERN triepointer trieptr ;
+EXTERN triepointer triehash[triesize + 1] ;
+#endif /* INITEX */
+#ifdef INITEX
+EXTERN boolean trietaken[triesize + 1] ;
+EXTERN triepointer triemin[256] ;
+EXTERN triepointer triemax ;
+EXTERN boolean trienotready ;
+#endif /* INITEX */
+EXTERN scaled bestheightplusdepth ;
+EXTERN halfword pagetail ;
+EXTERN schar pagecontents ;
+EXTERN scaled pagemaxdepth ;
+EXTERN halfword bestpagebreak ;
+EXTERN integer leastpagecost ;
+EXTERN scaled bestsize ;
+EXTERN scaled pagesofar[8] ;
+EXTERN halfword lastglue ;
+EXTERN integer lastpenalty ;
+EXTERN scaled lastkern ;
+EXTERN integer insertpenalties ;
+EXTERN boolean outputactive ;
+EXTERN internalfontnumber mainf ;
+EXTERN fourquarters maini ;
+EXTERN fourquarters mainj ;
+EXTERN fontindex maink ;
+EXTERN halfword mainp ;
+EXTERN integer mains ;
+EXTERN halfword bchar ;
+EXTERN halfword falsebchar ;
+EXTERN boolean cancelboundary ;
+EXTERN boolean insdisc ;
+EXTERN halfword curbox ;
+EXTERN halfword aftertoken ;
+EXTERN boolean longhelpseen ;
+EXTERN strnumber formatident ;
+EXTERN wordfile fmtfile ;
+EXTERN integer readyalready ;
+EXTERN alphafile writefile[16] ;
+EXTERN boolean writeopen[18] ;
+EXTERN halfword writeloc ;
+EXTERN poolpointer editnamestart ;
+EXTERN integer editnamelength, editline, tfmtemp ;
+
+#include "coerce.h"
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c
new file mode 100644
index 0000000000..26de3e10c6
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c
@@ -0,0 +1,334 @@
+/*
+ * This program converts (mostly) the pseudo-Pascal generated by Tangle to C.
+ * The output depends on many C macros and some postprocessing by other
+ * programs.
+ *
+ * Arguments:
+ * -f: force strict interpretation of semantics of for stmt
+ * (never used with TeX and friends)
+ * -t: special optimizations for tex.p->tex.c
+ * -m: special optimizations for mf.p->mf.c
+ * -c: supply the base part of the name of the coerce.h file
+ * -h: supply the name of the standard header file
+ * -a: generate ANSI-style function prototypes
+ * -d: generate some additional debugging output
+ *
+ * The majority of this program (which includes ptoc.yacc and ptoc.lex)
+ * was written by Tomas Rokicki, with modifications by Tim Morgan, et al.
+ */
+
+#include <stdio.h>
+#include "web2cy.h"
+#include "web2c.h"
+
+
+/* Changing this value will probably stimulate bugs in some
+ preprocessors---those which want to put the expansion of a macro
+ entirely on one line. */
+#define max_line_length (78)
+#define max_strings (50000)
+#define hash_prime (101)
+#define sym_table_size (8000)
+#define unused (271828)
+
+/* Says whether to give voluminous progress reports. */
+boolean debug=FALSE;
+int indent = 0;
+int line_pos = 0;
+int last_brace = 0;
+int block_level = 0;
+int last_tok;
+int tex = 0, strict_for = 0, mf = 0;
+
+char safe_string[80];
+char var_list[800];
+char field_list[800];
+char last_id[80];
+char z_id[80];
+char next_temp[] = "zzzaa";
+char coerce_name[100] = "coerce.h";
+
+long last_i_num;
+int ii, l_s;
+long lower_bound, upper_bound;
+extern FILE *fopen();
+FILE *std;
+FILE *coerce;
+int pf_count = 1;
+#ifdef ANSI
+boolean ansi = TRUE;
+#else
+boolean ansi = FALSE;
+#endif
+
+char *std_header = "null.h"; /* Default include filename */
+
+char strings[max_strings];
+int hash_list[hash_prime];
+short global = 1;
+#ifdef MS_DOS
+struct sym_entry huge sym_table[sym_table_size];
+#else
+struct sym_entry sym_table[sym_table_size];
+#endif
+int next_sym_free = -1, next_string_free = 0;
+int mark_sym_free, mark_string_free;
+
+extern int yyleng;
+#ifdef FLEX
+extern char *yytext;
+#else /* LEX */
+#ifdef HP
+extern unsigned char yytext[];
+#else /* not HP */
+extern char yytext[];
+#endif /* not HP */
+#endif /* LEX */
+
+void find_next_temp()
+{
+ next_temp[4]++;
+ if (next_temp[4] > 'z') {
+ next_temp[4] = 'a';
+ next_temp[3]++;
+ }
+}
+
+void normal()
+{
+ std = stdout;
+}
+
+void new_line()
+{
+ if (!std)
+ return;
+ if (line_pos > 0) {
+ (void) putc('\n', std);
+ line_pos = 0;
+ }
+}
+
+void indent_line()
+{
+ new_line();
+}
+
+
+/* Output the string S to `std'. */
+
+void
+my_output (s)
+ char *s;
+{
+ int len = strlen (s);
+ int less_indent = 0;
+
+ if (!std)
+ return;
+
+ if (line_pos + len > max_line_length)
+ indent_line ();
+
+ if (indent > 1 && (strcmp(s, "case") == 0 || strcmp(s, "default") == 0))
+ less_indent = 2;
+
+ while (line_pos < indent * 2 - less_indent)
+ {
+ fputs (" ", std);
+ line_pos += 2;
+ }
+
+ (void) fprintf (std, "%s ", s);
+ line_pos += len + 1;
+
+ last_brace = (s[0] == '}');
+}
+
+void semicolon()
+{
+ if (!last_brace) {
+ my_output(";");
+ indent_line();
+ last_brace = 1;
+ }
+}
+
+
+/* Since a syntax error can never be recovered from, we exit here with
+ bad status. */
+
+void yyerror(s) char *s;
+{
+ (void) fflush(stdout);
+ (void) fprintf(stderr, " %s\n", s);
+ (void) fprintf(stderr, "Last token = %d, ", last_tok);
+ (void) fprintf(stderr, "error buffer = `%s',\n\t", yytext);
+ (void) fprintf(stderr, "last id = `%s' (", last_id);
+ ii = search_table(last_id);
+ if (ii == -1)
+ (void) fprintf(stderr, "not in symbol table");
+ else
+ switch (sym_table[ii].typ) {
+ case undef_id_tok:
+ (void) fprintf(stderr, "undefined");
+ break;
+ case var_id_tok:
+ (void) fprintf(stderr, "variable");
+ break;
+ case const_id_tok:
+ (void) fprintf(stderr, "constant");
+ break;
+ case type_id_tok:
+ (void) fprintf(stderr, "type");
+ break;
+ case proc_id_tok:
+ (void) fprintf(stderr, "parameterless procedure");
+ break;
+ case proc_param_tok:
+ (void) fprintf(stderr, "procedure with parameters");
+ break;
+ case fun_id_tok:
+ (void) fprintf(stderr, "parameterless function");
+ break;
+ case fun_param_tok:
+ (void) fprintf(stderr, "function with parameters");
+ break;
+ default:
+ (void) fprintf(stderr, "unknown!");
+ break;
+ }
+ fprintf(stderr, ").\n");
+ exit(1);
+ if (debug) {
+ (void) fprintf(stderr, "Next sym free = %d\n", next_sym_free);
+ (void) fprintf(stderr, "Mark sym = %d\n", mark_sym_free);
+ (void) fprintf(stderr, "Next string free = %d\n", next_string_free);
+ (void) fprintf(stderr, "Mark string = %d\n", mark_string_free);
+ }
+}
+
+int hash(id) char *id;
+{
+ register int i = 0, j;
+ for (j = 0; id[j] != 0; j++)
+ i = (i + i + id[j]) % hash_prime;
+ return (i);
+}
+
+int search_table(id) char *id;
+{
+ int ptr;
+ ptr = hash_list[hash(id)];
+ while (ptr != -1) {
+ if (strcmp(id, sym_table[ptr].id) == 0)
+ return (ptr);
+ else
+ ptr = sym_table[ptr].next;
+ }
+ return (-1);
+}
+
+int add_to_table(id) char *id;
+{
+ int h, ptr;
+ h = hash(id);
+ ptr = hash_list[h];
+ hash_list[h] = (++next_sym_free);
+ sym_table[next_sym_free].next = ptr;
+ sym_table[next_sym_free].val = unused;
+ sym_table[next_sym_free].id = strings + next_string_free;
+ sym_table[next_sym_free].var_formal = FALSE;
+ sym_table[next_sym_free].var_not_needed = FALSE;
+ (void) strcpy(strings + next_string_free, id);
+ next_string_free += strlen(id) + 1;
+ return (next_sym_free);
+}
+
+void remove_locals()
+{
+ int h, ptr;
+ for (h = 0; h < hash_prime; h++) {
+ next_sym_free = mark_sym_free;
+ next_string_free = mark_string_free;
+ ptr = hash_list[h];
+ while (ptr > next_sym_free)
+ ptr = sym_table[ptr].next;
+ hash_list[h] = ptr;
+ }
+ global = 1;
+}
+
+void
+mark()
+{
+ mark_sym_free = next_sym_free;
+ mark_string_free = next_string_free;
+ global = 0;
+}
+
+
+void
+initialize()
+{
+ register int i;
+
+ for (i = 0; i < hash_prime; hash_list[i++] = -1)
+ ;
+
+ normal ();
+
+ coerce = fopen (coerce_name, "w");
+ if (coerce == NULL)
+ {
+ perror (coerce_name);
+ exit (1);
+ }
+}
+
+void
+main (argc, argv)
+ int argc;
+ char *argv[];
+{
+ int error, i;
+
+ for (i=1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) {
+ case 't':
+ tex = TRUE;
+ break;
+ case 'm':
+ mf = TRUE;
+ break;
+ case 'f':
+ strict_for = TRUE;
+ break;
+ case 'h':
+ std_header = &argv[i][2];
+ break;
+ case 'd':
+ debug = TRUE;
+ break;
+ case 'a':
+ ansi = TRUE;
+ break;
+ case 'c':
+ (void) sprintf(coerce_name, "%s.h", &argv[i][2]);
+ break;
+ default:
+ fprintf(stderr, "Unknown option %s, ignored\n", argv[i]);
+ break;
+ }
+ else {
+ fprintf(stderr, "Unknown option %s, ignored\n", argv[i]);
+ }
+
+ initialize ();
+ error = yyparse ();
+ new_line ();
+
+ if (debug)
+ (void) fprintf(stderr, "%d symbols.\n", next_sym_free);
+
+ exit(error);
+}
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h
new file mode 100644
index 0000000000..3ddb64b98d
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h
@@ -0,0 +1,93 @@
+/* web2c.h: general includes for web2c. */
+
+#include <stdio.h>
+#include "site.h"
+#include "common.h"
+
+#ifdef SYSV
+#define bcopy(s,d,n) memcpy((d),(s),(n))
+#define bcmp(s1,s2,n) memcmp((s1),(s2),(n))
+#define bzero(s,n) memset((s),0,(n))
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else
+#ifdef sparc
+#include <alloca.h>
+#else
+char *alloca ();
+#endif
+#endif
+
+#define ex_32 (2)
+#define ex_real (3)
+#define max(a,b) ((a>b)?a:b)
+
+extern int indent;
+extern int line_pos;
+extern int last_brace;
+extern int block_level;
+extern int ii;
+extern int last_tok;
+
+extern char safe_string[80];
+extern char var_list[800];
+extern char field_list[800];
+extern char last_id[80];
+extern char z_id[80];
+extern char next_temp[];
+
+extern long last_i_num;
+extern int ii, l_s;
+extern long lower_bound, upper_bound;
+extern FILE *fopen();
+extern FILE *std;
+extern int pf_count;
+
+#include "symtab.h"
+
+extern char strings[];
+extern int hash_list[];
+extern short global;
+#ifdef MS_DOS
+extern struct sym_entry huge sym_table[];
+#else
+extern struct sym_entry sym_table[];
+#endif
+extern int next_sym_free, next_string_free;
+extern int mark_sym_free, mark_string_free;
+
+#ifdef FLEX_SCANNER
+extern char *yytext;
+
+#else /* LEX */
+#ifdef HP
+extern unsigned char yytext[];
+#else
+extern char yytext[];
+#endif
+
+#endif /* LEX */
+
+#ifdef ANSI
+extern void exit(int);
+extern int yyparse(void);
+void find_next_temp(void);
+void normal(void);
+void new_line(void);
+void indent_line(void);
+void my_output(char *);
+void semicolon(void);
+void yyerror(char *);
+int hash(char *);
+int search_table(char *);
+int add_to_table(char *);
+void remove_locals(void);
+void mark(void);
+void initialize(void);
+void main(int,char * *);
+#else /* not ANSI */
+void find_next_temp(), normal(), new_line(), indent_line(), my_output();
+void semicolon(), yyerror(), remove_locals(), mark(), initialize();
+#endif /* not ANSI */
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc
new file mode 100644
index 0000000000..92668dd113
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc
@@ -0,0 +1,1347 @@
+/* web2c.yacc -- parse most of Pascal, and output C. */
+
+%token array_tok begin_tok case_tok const_tok do_tok downto_tok else_tok
+ end_tok file_tok for_tok function_tok goto_tok if_tok label_tok
+ of_tok procedure_tok program_tok record_tok repeat_tok then_tok
+ to_tok type_tok until_tok var_tok while_tok integer_tok real_tok
+ others_tok r_num_tok i_num_tok string_literal_tok single_char_tok
+ assign_tok two_dots_tok unknown_tok undef_id_tok var_id_tok
+ proc_id_tok proc_param_tok fun_id_tok fun_param_tok const_id_tok
+ type_id_tok hhb0_tok hhb1_tok field_id_tok define_tok field_tok
+ break_tok
+
+%nonassoc '=' not_eq_tok '<' '>' less_eq_tok great_eq_tok
+%left '+' '-' or_tok
+%right unary_plus_tok unary_minus_tok
+%left '*' '/' div_tok mod_tok and_tok
+%right not_tok
+
+%{
+#include "web2c.h"
+
+#define symbol(x) sym_table[x].id
+#define MAX_ARGS 50
+
+static char fn_return_type[50], for_stack[300], control_var[50],
+ relation[3];
+static char arg_type[MAX_ARGS][30];
+static int last_type = -1, ids_typed;
+char my_routine[100]; /* Name of routine being parsed, if any */
+static char array_bounds[80], array_offset[80];
+static int uses_mem, uses_eqtb, lower_sym, upper_sym;
+static FILE *orig_std;
+boolean doing_statements = FALSE;
+static boolean var_formals = FALSE;
+static int param_id_list[MAX_ARGS], ids_paramed=0;
+
+extern char conditional[], temp[], *std_header;
+extern int tex, mf, strict_for;
+extern boolean ansi;
+extern FILE *coerce;
+extern char coerce_name[];
+extern boolean debug;
+
+/* Forward refs */
+#ifdef ANSI
+static long labs(long x);
+static void compute_array_bounds(void);
+static void fixup_var_list(void);
+static void do_proc_args(void);
+static void gen_function_head(void);
+static boolean doreturn(char *label);
+extern int yylex(void);
+#else /* not ANSI */
+static long labs();
+static void compute_array_bounds(), fixup_var_list();
+static void do_proc_args(), gen_function_head();
+static boolean doreturn();
+#endif /* not ANSI */
+
+/* Type hacking for AIX. */
+#ifdef AIX
+#define UNSIGNED_SHORT_STRING "int"
+#else
+#define UNSIGNED_SHORT_STRING "unsigned short"
+#endif
+
+%}
+
+%start PROGRAM
+
+%%
+
+PROGRAM: DEFS
+ PROGRAM_HEAD
+ {block_level++;
+ printf("#include \"%s\"\n", std_header);}
+ LABEL_DEC_PART CONST_DEC_PART TYPE_DEC_PART
+ VAR_DEC_PART
+ {printf("\n#include \"%s\"\n", coerce_name); }
+ P_F_DEC_PART
+ BODY
+ {YYACCEPT;}
+ ;
+
+DEFS: /* empty */
+ | DEFS DEF
+ ;
+
+DEF: define_tok field_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = field_id_tok;
+ }
+ | define_tok function_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = fun_id_tok;
+ }
+ | define_tok const_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = const_id_tok;
+ }
+ | define_tok function_tok undef_id_tok '(' ')' ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = fun_param_tok;
+ }
+ | define_tok procedure_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = proc_id_tok;
+ }
+ | define_tok procedure_tok undef_id_tok '(' ')' ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = proc_param_tok;
+ }
+ | define_tok type_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = type_id_tok;
+ }
+ | define_tok type_tok undef_id_tok '='
+ SUBRANGE_TYPE ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = type_id_tok;
+ sym_table[ii].val = lower_bound;
+ sym_table[ii].val_sym = lower_sym;
+ sym_table[ii].upper = upper_bound;
+ sym_table[ii].upper_sym = upper_sym;
+ }
+ | define_tok var_tok undef_id_tok ';'
+ {
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = var_id_tok;
+ }
+ ;
+
+PROGRAM_HEAD: program_tok undef_id_tok ';'
+ ;
+
+BLOCK:
+ { if (block_level > 0) my_output("{");
+ indent++; block_level++;
+ }
+ LABEL_DEC_PART
+ CONST_DEC_PART TYPE_DEC_PART
+ {if (block_level == 2) {
+ if (strcmp(fn_return_type, "void")) {
+ my_output("register");
+ my_output(fn_return_type);
+ my_output("Result;");
+ }
+ if (tex) {
+ (void) sprintf(safe_string, "%s_regmem",
+ my_routine);
+ my_output(safe_string);
+ indent_line();
+ }
+ }
+ }
+ VAR_DEC_PART
+ {if (block_level == 1)
+ puts("\n#include \"coerce.h\"");
+ doing_statements = TRUE;
+ }
+ STAT_PART
+ {if (block_level == 2) {
+ if (strcmp(fn_return_type,"void")) {
+ my_output("return(Result)");
+ semicolon();
+ }
+ if (tex) {
+ if (uses_mem && uses_eqtb)
+ (void) fprintf(coerce,
+ "#define %s_regmem register memoryword *mem=zmem, *eqtb=zeqtb;\n",
+ my_routine);
+ else if (uses_mem)
+ (void) fprintf(coerce,
+ "#define %s_regmem register memoryword *mem=zmem;\n",
+ my_routine);
+ else if (uses_eqtb)
+ (void) fprintf(coerce,
+ "#define %s_regmem register memoryword *eqtb=zeqtb;\n",
+ my_routine);
+ else
+ (void) fprintf(coerce,
+ "#define %s_regmem\n",
+ my_routine);
+ }
+ my_routine[0] = '\0';
+ }
+ indent--; block_level--;
+ my_output("}"); new_line();
+ doing_statements = FALSE;
+ }
+ ;
+
+LABEL_DEC_PART: /* empty */
+ | label_tok
+ { my_output("/*"); }
+ LABEL_LIST ';'
+ { my_output("*/"); }
+ ;
+
+LABEL_LIST: LABEL
+ | LABEL_LIST ',' LABEL
+ ;
+
+LABEL: i_num_tok
+ { my_output(temp); }
+ ;
+
+CONST_DEC_PART: /* empty */
+ | const_tok CONST_DEC_LIST
+ { indent_line(); }
+ ;
+
+CONST_DEC_LIST: CONST_DEC
+ | CONST_DEC_LIST CONST_DEC
+ ;
+
+CONST_DEC:
+ { new_line(); my_output("#define"); }
+ undef_id_tok
+ { ii=add_to_table(last_id);
+ sym_table[ii].typ = const_id_tok;
+ my_output(last_id);
+ }
+ '=' CONSTANT ';'
+ { sym_table[ii].val=last_i_num;
+ new_line(); }
+ ;
+
+CONSTANT: i_num_tok
+ {
+ (void) sscanf(temp, "%ld", &last_i_num);
+ if (labs((long) last_i_num) > 32767)
+ (void) strcat(temp, "L");
+ my_output(temp);
+ $$ = ex_32;
+ }
+ | r_num_tok
+ { my_output(temp);
+ $$ = ex_real;
+ }
+ | STRING
+ { $$ = 0; }
+ | CONSTANT_ID
+ { $$ = ex_32; }
+ ;
+
+STRING: string_literal_tok
+ { int i, j; char s[132];
+ j = 1;
+ s[0] = '"';
+ for (i=1; yytext[i-1]!=0; i++) {
+ if (yytext[i] == '\\' || yytext[i] == '"')
+ s[j++]='\\';
+ else if (yytext[i] == '\'') i++;
+ s[j++] = yytext[i];
+ }
+ s[j-1] = '"';
+ s[j] = 0;
+ my_output(s);
+ }
+ | single_char_tok
+ { char s[5];
+ s[0]='\'';
+ if (yytext[1] == '\\' || yytext[1] == '\'') {
+ s[2] = yytext[1];
+ s[1] = '\\';
+ s[3] = '\'';
+ s[4] = '\0';
+ }
+ else {
+ s[1] = yytext[1];
+ s[2]='\'';
+ s[3]='\0';
+ }
+ my_output(s);
+ }
+ ;
+
+CONSTANT_ID: const_id_tok
+ { my_output(last_id); }
+ ;
+
+TYPE_DEC_PART: /* empty */
+ | type_tok TYPE_DEF_LIST
+ ;
+
+TYPE_DEF_LIST: TYPE_DEF
+ | TYPE_DEF_LIST TYPE_DEF
+ ;
+
+TYPE_DEF:
+ { my_output("typedef"); }
+ undef_id_tok
+ { ii = add_to_table(last_id);
+ sym_table[ii].typ = type_id_tok;
+ (void) strcpy(safe_string, last_id);
+ last_type = ii;
+ }
+ '='
+ {
+ array_bounds[0] = 0;
+ array_offset[0] = 0;
+ }
+ TYPE ';'
+ { if (*array_offset) {
+ fprintf(stderr, "Cannot typedef arrays with offsets\n");
+ exit(1);
+ }
+ my_output(safe_string);
+ my_output(array_bounds);
+ semicolon();
+ last_type = -1;
+ }
+ ;
+
+TYPE: SIMPLE_TYPE
+ | STRUCTURED_TYPE
+ ;
+
+SIMPLE_TYPE: SUBRANGE_TYPE
+ { if (last_type >= 0) {
+ sym_table[ii].val = lower_bound;
+ sym_table[ii].val_sym = lower_sym;
+ sym_table[ii].upper = upper_bound;
+ sym_table[ii].upper_sym = upper_sym;
+ ii= -1;
+ }
+/* The following code says: if the bounds are known at translation time
+ * on an integral type, then we select the smallest type of data which
+ * can represent it in ANSI C. We only use unsigned types when necessary.
+ */
+ if (lower_sym == -1 && upper_sym == -1) {
+ if (lower_bound>= -127 && upper_bound<=127)
+ my_output("schar");
+ else if (lower_bound >= 0
+ && upper_bound <= 255)
+ my_output("unsigned char");
+ else if (lower_bound >= -32767
+ && upper_bound <= 32767)
+ my_output("short");
+ else if (lower_bound >= 0
+ && upper_bound <= 65535)
+ my_output(UNSIGNED_SHORT_STRING);
+ else my_output("integer");
+ }
+ else my_output("integer");
+ }
+ | TYPE_ID
+ ;
+
+SUBRANGE_TYPE: SUB_CONSTANT two_dots_tok SUB_CONSTANT
+ ;
+
+POSSIBLE_PLUS: /* empty */
+ | unary_plus_tok
+ ;
+
+SUB_CONSTANT: POSSIBLE_PLUS i_num_tok
+ {lower_bound = upper_bound;
+ lower_sym = upper_sym;
+ (void) sscanf(temp, "%ld", &upper_bound);
+ upper_sym = -1; /* no sym table entry */
+ }
+ | const_id_tok
+ { lower_bound = upper_bound;
+ lower_sym = upper_sym;
+ upper_bound = sym_table[l_s].val;
+ upper_sym = l_s;
+ }
+ ;
+
+TYPE_ID: type_id_tok
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); }
+ ;
+
+STRUCTURED_TYPE: ARRAY_TYPE
+ {if (last_type >= 0)
+ sym_table[last_type].var_not_needed = TRUE;}
+ | RECORD_TYPE
+ | FILE_TYPE
+ {if (last_type >= 0)
+ sym_table[last_type].var_not_needed = TRUE;}
+ | POINTER_TYPE
+ {if (last_type >= 0)
+ sym_table[last_type].var_not_needed = FALSE;}
+ ;
+
+POINTER_TYPE: '^' type_id_tok
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); my_output("*"); }
+ | '^' undef_id_tok /* HH for Isitex */
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); my_output("*"); }
+ ;
+
+ARRAY_TYPE: array_tok '[' INDEX_TYPE ']' of_tok COMPONENT_TYPE
+ | array_tok '[' INDEX_TYPE ',' INDEX_TYPE ']' of_tok
+ COMPONENT_TYPE
+ ;
+
+INDEX_TYPE: SUBRANGE_TYPE
+ { compute_array_bounds(); }
+ | type_id_tok
+ { lower_bound = sym_table[l_s].val;
+ lower_sym = sym_table[l_s].val_sym;
+ upper_bound = sym_table[l_s].upper;
+ upper_sym = sym_table[l_s].upper_sym;
+ compute_array_bounds();
+ }
+ ;
+
+COMPONENT_TYPE: TYPE
+ ;
+
+
+RECORD_TYPE: record_tok
+ { my_output("struct"); my_output("{"); indent++;}
+ FIELD_LIST end_tok
+ { indent--; my_output("}"); semicolon(); }
+ ;
+
+FIELD_LIST: RECORD_SECTION
+ | FIELD_LIST ';' RECORD_SECTION
+ ;
+
+RECORD_SECTION:
+ { field_list[0] = 0; }
+ FIELD_ID_LIST ':'
+ {
+ /*array_bounds[0] = 0;
+ array_offset[0] = 0;*/
+ }
+ TYPE
+ { int i=0, j; char ltemp[80];
+ while(field_list[i++] == '!') {
+ j = 0;
+ while (field_list[i])
+ ltemp[j++] = field_list[i++];
+ i++;
+ if (field_list[i] == '!')
+ ltemp[j++] = ',';
+ ltemp[j] = 0;
+ my_output(ltemp);
+ }
+ semicolon();
+ }
+ | /* empty */
+ ;
+
+FIELD_ID_LIST: FIELD_ID
+ | FIELD_ID_LIST ',' FIELD_ID
+ ;
+
+FIELD_ID: undef_id_tok
+ { int i=0, j=0;
+ while (field_list[i] == '!')
+ while(field_list[i++]);
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = field_id_tok;
+ field_list[i++] = '!';
+ while (last_id[j])
+ field_list[i++] = last_id[j++];
+ field_list[i++] = 0;
+ field_list[i++] = 0;
+ }
+ | field_id_tok
+ { int i=0, j=0;
+ while (field_list[i] == '!')
+ while(field_list[i++]);
+ field_list[i++] = '!';
+ while (last_id[j])
+ field_list[i++] = last_id[j++];
+ field_list[i++] = 0;
+ field_list[i++] = 0;
+ }
+ ;
+
+FILE_TYPE: file_tok of_tok
+ { my_output("file_ptr /* of "); }
+ TYPE
+ { my_output("*/"); }
+ ;
+
+VAR_DEC_PART: /* empty */
+ | var_tok VAR_DEC_LIST
+ ;
+
+VAR_DEC_LIST: VAR_DEC
+ | VAR_DEC_LIST VAR_DEC
+ ;
+
+VAR_DEC:
+ { var_list[0] = 0;
+ array_bounds[0] = 0;
+ array_offset[0] = 0;
+ var_formals = FALSE;
+ ids_paramed = 0;
+ }
+ VAR_ID_DEC_LIST ':'
+ {
+ array_bounds[0] = 0;
+ array_offset[0] = 0;
+ }
+ TYPE ';'
+ { fixup_var_list(); }
+ ;
+
+VAR_ID_DEC_LIST: VAR_ID
+ | VAR_ID_DEC_LIST ',' VAR_ID
+ ;
+
+VAR_ID: undef_id_tok
+ { int i=0, j=0;
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = var_id_tok;
+ sym_table[ii].var_formal = var_formals;
+ param_id_list[ids_paramed++] = ii;
+ while (var_list[i] == '!')
+ while(var_list[i++]);
+ var_list[i++] = '!';
+ while (last_id[j])
+ var_list[i++] = last_id[j++];
+ var_list[i++] = 0;
+ var_list[i++] = 0;
+ }
+ | var_id_tok
+ { int i=0, j=0;
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = var_id_tok;
+ sym_table[ii].var_formal = var_formals;
+ param_id_list[ids_paramed++] = ii;
+ while (var_list[i] == '!')
+ while (var_list[i++]);
+ var_list[i++] = '!';
+ while (last_id[j])
+ var_list[i++] = last_id[j++];
+ var_list[i++] = 0;
+ var_list[i++] = 0;
+ }
+ | field_id_tok
+ { int i=0, j=0;
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = var_id_tok;
+ sym_table[ii].var_formal = var_formals;
+ param_id_list[ids_paramed++] = ii;
+ while (var_list[i] == '!')
+ while(var_list[i++]);
+ var_list[i++] = '!';
+ while (last_id[j])
+ var_list[i++] = last_id[j++];
+ var_list[i++] = 0;
+ var_list[i++] = 0;
+ }
+ ;
+
+BODY: /* empty */
+ | begin_tok
+ { my_output("void main_body() {");
+ indent++;
+ new_line();
+ }
+ STAT_LIST end_tok '.'
+ { indent--; my_output("}"); new_line(); }
+ ;
+
+P_F_DEC_PART: /* empty */
+ | P_F_DEC
+ | P_F_DEC_PART P_F_DEC
+ ;
+
+P_F_DEC: PROCEDURE_DEC ';'
+ { indent_line(); remove_locals(); }
+ | FUNCTION_DEC ';'
+ { indent_line(); remove_locals(); }
+ ;
+
+PROCEDURE_DEC: PROCEDURE_HEAD BLOCK
+ ;
+
+PROCEDURE_HEAD: procedure_tok undef_id_tok
+ { ii = add_to_table(last_id);
+ if (debug)
+ (void) fprintf(stderr, "%3d Procedure %s\n",
+ pf_count++, last_id);
+ sym_table[ii].typ = proc_id_tok;
+ (void) strcpy(my_routine, last_id);
+ uses_eqtb = uses_mem = FALSE;
+ my_output("void");
+ orig_std = std;
+ std = 0;
+ }
+ PARAM ';'
+ {(void) strcpy(fn_return_type, "void");
+ do_proc_args();
+ gen_function_head();}
+ | procedure_tok DECLARED_PROC
+ { ii = l_s;
+ if (debug)
+ (void) fprintf(stderr, "%3d Procedure %s\n",
+ pf_count++, last_id);
+ (void) strcpy(my_routine, last_id);
+ my_output("void");
+ }
+ PARAM ';'
+ {(void) strcpy(fn_return_type, "void");
+ do_proc_args();
+ gen_function_head();}
+ ;
+
+PARAM: /* empty */
+ { (void) strcpy(z_id, last_id);
+ mark();
+ ids_paramed = 0;
+ }
+ | '('
+ { if (ansi) (void) strcpy(z_id, last_id);
+ else (void) sprintf(z_id, "z%s", last_id);
+ ids_paramed = 0;
+ if (sym_table[ii].typ == proc_id_tok)
+ sym_table[ii].typ = proc_param_tok;
+ else if (sym_table[ii].typ == fun_id_tok)
+ sym_table[ii].typ = fun_param_tok;
+ mark();
+ }
+ FORM_PAR_SEC_L ')'
+ ;
+
+FORM_PAR_SEC_L: FORM_PAR_SEC
+ | FORM_PAR_SEC_L ';' FORM_PAR_SEC
+ ;
+
+FORM_PAR_SEC1: { ids_typed = ids_paramed;}
+ VAR_ID_DEC_LIST ':' type_id_tok
+ {int i, need_var;
+ i = search_table(last_id);
+ need_var = !sym_table[i].var_not_needed;
+ for (i=ids_typed; i<ids_paramed; i++) {
+ (void) strcpy(arg_type[i], last_id);
+ if (need_var && sym_table[param_id_list[i]].var_formal)
+ (void) strcat(arg_type[i], " *");
+ else sym_table[param_id_list[i]].var_formal = FALSE;
+ }
+ }
+ ;
+
+FORM_PAR_SEC: {var_formals = 0;} FORM_PAR_SEC1
+ | var_tok {var_formals = 1;} FORM_PAR_SEC1
+ ;
+
+DECLARED_PROC : proc_id_tok
+ | proc_param_tok
+ ;
+
+FUNCTION_DEC: FUNCTION_HEAD BLOCK
+ ;
+
+FUNCTION_HEAD: function_tok undef_id_tok
+ { orig_std = std;
+ std = 0;
+ ii = add_to_table(last_id);
+ if (debug)
+ (void) fprintf(stderr, "%3d Function %s\n",
+ pf_count++, last_id);
+ sym_table[ii].typ = fun_id_tok;
+ (void) strcpy(my_routine, last_id);
+ uses_eqtb = uses_mem = FALSE;
+ }
+ PARAM ':'
+ { normal();
+ array_bounds[0] = 0;
+ array_offset[0] = 0;
+ }
+ RESULT_TYPE
+ {(void) strcpy(fn_return_type, yytext);
+ do_proc_args();
+ gen_function_head();
+ }
+ ';'
+ |
+ function_tok DECLARED_FUN
+ { orig_std = std;
+ std = 0;
+ ii = l_s;
+ if (debug)
+ (void) fprintf(stderr, "%3d Function %s\n",
+ pf_count++, last_id);
+ (void) strcpy(my_routine, last_id);
+ uses_eqtb = uses_mem = FALSE;
+ }
+ PARAM ':'
+ { normal();
+ array_bounds[0] = 0;
+ array_offset[0] = 0;
+ }
+ RESULT_TYPE
+ {(void) strcpy(fn_return_type, yytext);
+ do_proc_args();
+ gen_function_head();
+ }
+ ';'
+ ;
+
+DECLARED_FUN : fun_id_tok
+ | fun_param_tok
+ ;
+
+RESULT_TYPE: TYPE
+ ;
+
+STAT_PART: begin_tok STAT_LIST end_tok
+ ;
+
+COMPOUND_STAT: begin_tok
+ {my_output("{"); indent++; new_line();}
+ STAT_LIST end_tok
+ { indent--; my_output("}"); new_line(); }
+ ;
+
+STAT_LIST: STATEMENT
+ | STAT_LIST ';' STATEMENT
+ ;
+
+STATEMENT: UNLAB_STAT
+ | S_LABEL ':'
+ UNLAB_STAT
+ ;
+
+S_LABEL: i_num_tok
+ {if (!doreturn(temp)) {
+ (void) sprintf(safe_string, "lab%s:",
+ temp);
+ my_output(safe_string);
+ }
+ }
+ ;
+
+UNLAB_STAT: SIMPLE_STAT
+ { semicolon(); }
+ | STRUCT_STAT
+ { semicolon(); }
+ ;
+
+SIMPLE_STAT: ASSIGN_STAT
+ | PROC_STAT
+ | GO_TO_STAT
+ | EMPTY_STAT
+ | break_tok
+ {my_output("break");}
+ ;
+
+ASSIGN_STAT: VARIABLE assign_tok
+ { my_output("="); }
+ EXPRESS
+ | FUNC_ID_AS assign_tok
+ { my_output("Result ="); }
+ EXPRESS
+ ;
+
+VARIABLE: var_id_tok
+ { if (strcmp(last_id, "mem") == 0)
+ uses_mem = 1;
+ else if (strcmp(last_id, "eqtb") == 0)
+ uses_eqtb = 1;
+ if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ $$ = ex_32;
+ }
+ VAR_DESIG_LIST
+ | var_id_tok '^' '.' /* HH for Isitex */
+ { if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ (void) putchar('-');
+ (void) putchar('>');
+ $$ = ex_32;
+ }
+ FIELD_VARIABLE
+ | var_id_tok '^'
+ { (void) putchar('(');
+ (void) putchar('*');
+ if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ (void) putchar(')');
+ $$ = ex_32;
+ }
+ | var_id_tok
+ { if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ $$ = ex_32; }
+ ;
+
+FIELD_VARIABLE: field_id_tok
+ { my_output(last_id); }
+ VAR_DESIG_LIST
+ | field_id_tok '^' '.'
+ { my_output(last_id);
+ (void) putchar('-');
+ (void) putchar('>');
+ }
+ FIELD_VARIABLE
+ | field_id_tok
+ { my_output(last_id); }
+ ;
+
+
+FUNC_ID_AS: fun_id_tok
+ { $$ = ex_32; }
+ | fun_param_tok
+ { $$ = ex_32; }
+ ;
+
+VAR_DESIG_LIST: VAR_DESIG
+ | VAR_DESIG_LIST VAR_DESIG
+ ;
+
+VAR_DESIG: '['
+ { my_output("["); }
+ EXPRESS VAR_DESIG1
+ { my_output("]"); }
+ | '.' field_id_tok
+ {if (tex || mf) {
+ if (strcmp(last_id, "int")==0)
+ my_output(".cint");
+ else if (strcmp(last_id, "lh")==0)
+ my_output(".v.LH");
+ else if (strcmp(last_id, "rh")==0)
+ my_output(".v.RH");
+ else {
+ (void)sprintf(safe_string, ".%s", last_id);
+ my_output(safe_string);
+ }
+ }
+ else {
+ (void) sprintf(safe_string, ".%s", last_id);
+ my_output(safe_string);
+ }
+ }
+ | '.' hhb0_tok
+ { my_output(".hh.b0");}
+ | '.' hhb1_tok
+ { my_output(".hh.b1");}
+ ;
+
+VAR_DESIG1: ']'
+ | ','
+ { my_output("][");}
+ EXPRESS ']'
+ ;
+
+EXPRESS: UNARY_OP EXPRESS %prec '*'
+ { $$ = $2; }
+ | EXPRESS '+' {my_output("+");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '-' {my_output("-");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '*' {my_output("*");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS div_tok {my_output("/");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '=' {my_output("==");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS not_eq_tok {my_output("!=");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS mod_tok {my_output("%");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '<' {my_output("<");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '>' {my_output(">");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS less_eq_tok {my_output("<=");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS great_eq_tok {my_output(">=");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS and_tok {my_output("&&");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS or_tok {my_output("||");} EXPRESS
+ {$$ = max($1, $4);}
+ | EXPRESS '/'
+ { my_output("/ ((double)"); }
+ EXPRESS
+ {$$ = max($1, $4); my_output(")"); }
+ | FACTOR
+ { $$ = $1; }
+ ;
+
+UNARY_OP: unary_plus_tok
+ | unary_minus_tok
+ { my_output("- (integer)"); }
+ | not_tok
+ { my_output("!"); }
+ ;
+
+FACTOR: '('
+ { my_output("("); }
+ EXPRESS ')'
+ { my_output(")"); $$ = $1; }
+ | VARIABLE
+ | CONSTANT
+ | fun_id_tok
+ { my_output(last_id); my_output("()"); }
+ | fun_param_tok
+ { my_output(last_id); }
+ PARAM_LIST
+ ;
+
+PARAM_LIST: '('
+ { my_output("("); }
+ ACTUAL_PARAM_L ')'
+ { my_output(")"); }
+ ;
+
+ACTUAL_PARAM_L: ACTUAL_PARAM
+ | ACTUAL_PARAM_L ','
+ { my_output(","); }
+ ACTUAL_PARAM
+ ;
+
+ACTUAL_PARAM:
+ EXPRESS WIDTH_FIELD
+ ;
+
+WIDTH_FIELD: ':' i_num_tok
+ | /* empty */
+ ;
+
+PROC_STAT: proc_id_tok
+ { my_output(last_id); my_output("()"); }
+ | undef_id_tok
+ { my_output(last_id);
+ ii = add_to_table(last_id);
+ sym_table[ii].typ = proc_id_tok;
+ my_output("()");
+ }
+ | proc_param_tok
+ { my_output(last_id); }
+ PARAM_LIST
+ ;
+
+GO_TO_STAT: goto_tok i_num_tok
+ {if (doreturn(temp)) {
+ if (strcmp(fn_return_type,"void"))
+ my_output("return(Result)");
+ else
+ my_output("return");
+ } else {
+ (void) sprintf(safe_string, "goto lab%s",
+ temp);
+ my_output(safe_string);
+ }
+ }
+ ;
+
+EMPTY_STAT: /* empty */
+ ;
+
+STRUCT_STAT: COMPOUND_STAT
+ | CONDIT_STAT
+ | REPETIT_STAT
+ ;
+
+CONDIT_STAT: IF_STATEMENT
+ | CASE_STATEMENT
+ ;
+
+IF_STATEMENT: BEGIN_IF_STAT
+ | BEGIN_IF_STAT ELSE_STAT
+ ;
+
+BEGIN_IF_STAT: if_tok
+ { my_output("if"); my_output("("); }
+ EXPRESS
+ { my_output(")"); new_line();}
+ then_tok STATEMENT
+ ;
+
+ELSE_STAT: else_tok
+ { my_output("else"); }
+ STATEMENT
+ ;
+
+CASE_STATEMENT: case_tok
+ { my_output("switch"); my_output("("); }
+ EXPRESS of_tok
+ { my_output(")"); indent_line();
+ my_output("{"); indent++;
+ }
+ CASE_EL_LIST END_CASE
+ { indent--; my_output("}"); new_line(); }
+ ;
+
+CASE_EL_LIST: CASE_ELEMENT
+ | CASE_EL_LIST ';' CASE_ELEMENT
+ ;
+
+CASE_ELEMENT: CASE_LAB_LIST ':' UNLAB_STAT
+ { my_output("break"); semicolon(); }
+ ;
+
+CASE_LAB_LIST: CASE_LAB
+ | CASE_LAB_LIST ',' CASE_LAB
+ ;
+
+CASE_LAB: i_num_tok
+ { my_output("case");
+ my_output(temp);
+ my_output(":"); indent_line();
+ }
+ | others_tok
+ { my_output("default:"); indent_line(); }
+ ;
+
+END_CASE: end_tok
+ | ';' end_tok
+ ;
+
+REPETIT_STAT: WHILE_STATEMENT
+ | REP_STATEMENT
+ | FOR_STATEMENT
+ ;
+
+WHILE_STATEMENT: while_tok
+ { my_output("while");
+ my_output("(");
+ }
+ EXPRESS
+ { my_output(")"); }
+ do_tok STATEMENT
+ ;
+
+REP_STATEMENT: repeat_tok
+ { my_output("do"); my_output("{"); indent++; }
+ STAT_LIST until_tok
+ { indent--; my_output("}");
+ my_output("while"); my_output("( ! (");
+ }
+ EXPRESS
+ { my_output(") )"); }
+ ;
+
+FOR_STATEMENT: for_tok
+ {
+ my_output("{");
+ my_output("register");
+ my_output("integer");
+ if (strict_for)
+ my_output("for_begin,");
+ my_output("for_end;");
+ }
+ CONTROL_VAR assign_tok
+ { if (strict_for)
+ my_output("for_begin");
+ else
+ my_output(control_var);
+ my_output("="); }
+ FOR_LIST do_tok
+ { my_output("; if (");
+ if (strict_for) my_output("for_begin");
+ else my_output(control_var);
+ my_output(relation);
+ my_output("for_end)");
+ if (strict_for) {
+ my_output("{");
+ my_output(control_var);
+ my_output("=");
+ my_output("for_begin");
+ semicolon();
+ }
+ my_output("do");
+ indent++;
+ new_line();}
+ STATEMENT
+ {
+ char *top = rindex(for_stack, '#');
+ indent--; new_line();
+ my_output("while");
+ my_output("(");
+ my_output(top+1);
+ my_output(")");
+ my_output(";");
+ my_output("}");
+ if (strict_for)
+ my_output("}");
+ *top=0;
+ new_line();
+ }
+ ;
+
+CONTROL_VAR: var_id_tok
+ {(void) strcpy(control_var, last_id); }
+ ;
+
+FOR_LIST: EXPRESS
+ { my_output(";"); }
+ to_tok
+ {
+ (void) strcpy(relation, "<=");
+ my_output("for_end");
+ my_output("="); }
+ EXPRESS
+ {
+ (void) sprintf(for_stack + strlen(for_stack),
+ "#%s++ < for_end", control_var);
+ }
+ | EXPRESS
+ { my_output(";"); }
+ downto_tok
+ {
+ (void) strcpy(relation, ">=");
+ my_output("for_end");
+ my_output("="); }
+ EXPRESS
+ {
+ (void) sprintf(for_stack + strlen(for_stack),
+ "#%s-- > for_end", control_var);
+ }
+ ;
+%%
+
+static void compute_array_bounds()
+{
+ long lb;
+ char tmp[200];
+
+ if (lower_sym == -1) { /* lower is a constant */
+ lb = lower_bound - 1;
+ if (lb==0) lb = -1; /* Treat lower_bound==1 as if lower_bound==0 */
+ if (upper_sym == -1) /* both constants */
+ (void) sprintf(tmp, "[%ld]", upper_bound - lb);
+ else { /* upper a symbol, lower constant */
+ if (lb < 0)
+ (void) sprintf(tmp, "[%s + %ld]",
+ symbol(upper_sym), (-lb));
+ else
+ (void) sprintf(tmp, "[%s - %ld]",
+ symbol(upper_sym), lb);
+ }
+ if (lower_bound < 0 || lower_bound > 1) {
+ if (*array_bounds) {
+ fprintf(stderr, "Cannot handle offset in second dimension\n");
+ exit(1);
+ }
+ if (lower_bound < 0) {
+ (void) sprintf(array_offset, "+%ld", -lower_bound);
+ } else {
+ (void) sprintf(array_offset, "-%ld", lower_bound);
+ }
+ }
+ (void) strcat(array_bounds, tmp);
+ }
+ else { /* lower is a symbol */
+ if (upper_sym != -1) /* both are symbols */
+ (void) sprintf(tmp, "[%s - %s + 1]", symbol(upper_sym),
+ symbol(lower_sym));
+ else { /* upper constant, lower symbol */
+ (void) sprintf(tmp, "[%ld - %s]", upper_bound + 1,
+ symbol(lower_sym));
+ }
+ if (*array_bounds) {
+ fprintf(stderr, "Cannot handle symbolic offset in second dimension\n");
+ exit(1);
+ }
+ (void) sprintf(array_offset, "- (int)(%s)", symbol(lower_sym));
+ (void) strcat(array_bounds, tmp);
+ }
+}
+
+static void fixup_var_list()
+{
+ int i, j;
+ char output_string[100], real_symbol[100];
+
+ for (i=0; var_list[i++] == '!'; ) {
+ for (j=0; real_symbol[j++] = var_list[i++];);
+ if (*array_offset) {
+ (void) fprintf(std, "\n#define %s (%s %s)\n ",
+ real_symbol, next_temp, array_offset);
+ (void) strcpy(real_symbol, next_temp);
+ find_next_temp();
+ }
+ (void) sprintf(output_string, "%s%s%c",
+ real_symbol, array_bounds, (var_list[i]=='!' ? ',' : ' '));
+ my_output(output_string);
+ }
+ semicolon();
+}
+
+
+/*
+ * If we're not processing TeX, we return 0 (false). Otherwise,
+ * return 1 if the label is "10" and we're not in one of four TeX
+ * routines where the line labeled "10" isn't the end of the routine.
+ * Otherwise, return 0.
+ */
+static boolean doreturn(label)
+char *label;
+{
+ if (!tex) return(FALSE);
+ if (strcmp(label, "10")) return(FALSE);
+ if (strcmp(my_routine, "macrocall") == 0) return(FALSE);
+ if (strcmp(my_routine, "hpack") == 0) return(FALSE);
+ if (strcmp(my_routine, "vpackage") == 0) return(FALSE);
+ if (strcmp(my_routine, "trybreak") == 0) return(FALSE);
+ return(TRUE);
+}
+
+
+/* Return the absolute value of a long */
+static long labs(x)
+long x;
+{
+ if (x < 0L) return(-x);
+ return(x);
+}
+
+static void do_proc_args()
+{
+ int i, var;
+
+ /*
+ * If we want ANSI code and one of the parameters is a var parameter,
+ * then use the #define to add the &. We do this by adding a 'z' at
+ * the front of the name. gen_function_head will do the real work.
+ */
+ if (ansi) {
+ var = 0;
+ for (i=0; i<ids_paramed; ++i)
+ var += sym_table[param_id_list[i]].var_formal;
+ if (var) {
+ for (i=strlen(z_id); i>=0; --i)
+ z_id[i+1] = z_id[i];
+ z_id[0] = 'z';
+ }
+ }
+
+ if (ansi) {
+ fprintf(coerce, "%s %s(", fn_return_type, z_id);
+ if (ids_paramed == 0) fprintf(coerce, "void");
+ for (i=0; i<ids_paramed; i++) {
+ if (i > 0) putc(',', coerce);
+ fprintf(coerce, "%s %s",
+ arg_type[i],
+ symbol(param_id_list[i]));
+ }
+ fprintf(coerce, ");\n");
+ } else
+ fprintf(coerce, "%s %s();\n", fn_return_type, z_id);
+}
+
+static void gen_function_head()
+{
+ int i;
+
+ if (strcmp(my_routine, z_id)) {
+ fprintf(coerce, "#define %s(", my_routine);
+ for (i=0; i<ids_paramed; i++) {
+ if (i > 0)
+ fprintf(coerce, ", %s", symbol(param_id_list[i]));
+ else
+ fprintf(coerce, "%s", symbol(param_id_list[i]));
+ }
+ fprintf(coerce, ") %s(", z_id);
+ for (i=0; i<ids_paramed; i++) {
+ if (i > 0)
+ fputs(", ", coerce);
+ if (!ansi) /* ansi doesn't need the cast */
+ fprintf(coerce, "(%s) ", arg_type[i]);
+ fprintf(coerce, "%s(%s)",
+ sym_table[param_id_list[i]].var_formal?"&":"",
+ symbol(param_id_list[i]));
+ }
+ fprintf(coerce, ")\n");
+ }
+ std = orig_std;
+ my_output(z_id);
+ my_output("(");
+ if (ansi) {
+ for (i=0; i<ids_paramed; i++) {
+ if (i > 0) my_output(",");
+ my_output(arg_type[i]);
+ my_output(symbol(param_id_list[i]));
+ }
+ my_output(")");
+ indent_line();
+ } else { /* Not ansi */
+ for (i=0; i<ids_paramed; i++) {
+ if (i > 0) my_output(",");
+ my_output(symbol(param_id_list[i]));
+ }
+ my_output(")");
+ indent_line();
+ for (i=0; i<ids_paramed; i++) {
+ my_output(arg_type[i]);
+ my_output(symbol(param_id_list[i]));
+ semicolon();
+ }
+ }
+}
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch
new file mode 100644
index 0000000000..048d9433cb
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch
@@ -0,0 +1,2827 @@
+=========================================================================
+
+SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991
+ (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl
+ (c) for TeX changes: Heini Hofstaedter, Harald Mueller
+
+ additional changes until 10. October 1991 HH
+=========================================================================
+
+This is the change file for inclusion of SISISI into TeX V.3.14.
+
+There are three main changes in this file (which are of course quite
+intermingled):
+
+ 1) the replacement of Liang's hyphenation by SISISI.
+
+ 2) the change of the interface of the actual hyphenation
+ to the post-hyphenation and the line-break algorithm.
+
+ This change is necessary because in original TeX, only the
+ information "hyphen - no hyphen" can be transmitted to the
+ line break algorithm because of two "bottlenecks":
+
+ 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i
+ is marked by the 1-bit information odd(hyf[i]).
+ 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked
+ by the existence of a discretionary node.
+
+ From SISISI, there must be more information flowing to the
+ line-break algorithm:
+
+ a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end,
+ a change is made such that a penalty node is allowed as
+ the first node in the prebreak list of a discretionary
+ node. This penalty node contains the penalty associated with
+ this specific hyphen. For "nebenhyphens", this value is set
+ by an additional primitive "\nebenhyphenpenalty".
+ Instead of the hyf-array, an array hyfpen is used that
+ contains the actual penalties; the old "if odd(hyf[i])" now
+ is converted ti "if hyfpen[i] <> inf_penalty".
+
+ b. A hyphen may be more complicated than a single -: ck-hyphens
+ and triple-consonant-hyphens may be present. To include these,
+ another array hyf_disc is introduced that contains ready-made
+ discretionary nodes for such hyphens.
+
+ At first, we simply wanted to include these discretionary
+ during the post-hyphenation into the new node list. But then
+ Heini felt that the impossiblity of ligatures with parts of such
+ a discretionary node was not acceptable; therefore he introdiced
+ the "x-mechanism" (characterized by many variables starting with
+ "x") and changed the reconstitute function so that more than the
+ single hyphen_char could be introduced into the reconstitution
+ process.
+
+ 3) "Dirty" changes for the hyphenation of words with umlauts.
+ These changes are necessary because the umlauts in TeX are not
+ (necessarily) real characters, but something else (see definition
+ of umlauts in plain.tex or german.tex).
+ Ordinarily, the hyphenation only accepts sequences of letters,
+ ligatures (which are expanded to their single characters), and
+ so-called "implicit kerns". An umlaut, however, is usually
+ represented as a letter character and another character consisting
+ of two dots ("dieresis character"), which are connected by
+ explicit kerns (not implicite ones!). Therefore, words containing
+ umlauts are not hyphenable words in TeX, which is not acceptable
+ for german texts.
+
+ Therefore, we devised a "bypass" for umlauts as follows: An umlaut
+ is now represented as a special discretionary node (so-called
+ "dirty umlaut") as follows:
+ \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}%
+ {}%
+ {<umlaut>}
+ where the 4321sp is a "marker" for the "dirty umlaut", the "m"
+ letter is used to derive the font of the umlaut, <code> is
+ the font number that should be associated with this umlaut (the
+ font numbers of the umlauts are given below); and <back> is used
+ to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>).
+
+ In other words, the prebreak list contains the information that
+ this is an umlaut (albeit a "dirty" one) and some more
+ information needed for the hyphenation, the postbreak list is
+ empty, and the main list contains the umlaut proper. By a
+ special if-statement in the line-break algorithm, a hyphenation
+ at a discretionary node of this format is suppressed, so that
+ always the umlaut of the main list is printed.
+ The font numbers for the lowercase umlauts (which are given
+ in the second \kern node) must be:
+ ae 228
+ oe 246
+ ue 252
+ The codes for the uppercase umlauts can be chosen arbitrarily.
+
+ In order to get the hyphenation for these "dirty umlauts"
+ running, one must include lccode assignments of the form
+ \lccode<code>=<lccode>
+ for each of the new letters (see example below).
+
+ A typical declaration of the "dirty umlauts" runs like this:
+
+%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%%
+\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}}
+\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}}
+\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}}
+\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}}
+\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}}
+\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}}
+\lccode196=228 % uppercase umlaut A
+\lccode214=246 % uppercase umlaut O
+\lccode220=252 % uppercase umlaut U
+\lccode228=228 % uppercase umlaut a
+\lccode246=246 % uppercase umlaut o
+\lccode252=252 % uppercase umlaut u
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the
+third kind can be eliminated. How long this will take ... well, wait and
+see.
+But when they arrive, it's not longer possible to choose the codes for
+uppercase umlauts arbitrarily. The codes for uppercase umlauts will
+then be those, shown in the example above.
+
+=========================================================================
+
+At first, we add a control sequence \SISISI.
+@x
+\def\PASCAL{Pascal}
+@y
+\def\SISISI{{\sl SISISI}}
+\def\PASCAL{Pascal}
+
+\let\maybe=\iffalse % print only changed modules
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@d banner=='This is TeX, Version 3.14' {printed when \TeX\ starts}
+@y
+@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)'
+@z
+
+-------------------------------------------------------------------------
+
+A number of procedures of SISISI are declared after the TeX program. As
+these procedures are used in the hyphenation, of course, they must be
+declared as `forward'.
+ In web2c gibt es keine forward's !!!!
+%@x
+%procedure initialize; {this procedure gets things started properly}
+%@y
+%@<forward declarations@>
+%procedure initialize; {this procedure gets things started properly}
+%@z
+
+-------------------------------------------------------------------------
+%@x
+%@d pool_name_length=8
+%@y
+%@d pool_name_length=11
+% {number of characters of ``pool_f_name''}
+%@z
+%see the following change of the pool file name "pool_f_name"
+-------------------------------------------------------------------------
+
+@x
+@!pool_name='TeXformats:TEX.POOL ';
+@y
+@!pool_name='TeXformats:SITEX3.POOL ';
+@z
+
+-------------------------------------------------------------------------
+
+@x
+else bad_pool('! I can''t read TEX.POOL.')
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read SITEX3.POOL.');
+@.I can't read TEX.POOL@>
+@z
+=========================================================================
+
+To have all messages, coming from SI_TEX, displayed on screen
+and written to the log-file simultanously, we make the following,
+additional definitions.
+ temp nicht mehr vorhanden, in log ve„ndert.
+@x
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+@y
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+
+@d si_put(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog(#);
+ end
+@d si_put_ln(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm_ln(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog_ln(#);
+ end
+@d si_put_cr == print_ln
+
+
+@d dbg_put(#) == {}
+@d dbg_put_ln(#) == {}
+@d dbg_put_cr == {}
+@z
+=========================================================================
+
+We add a new primitive \nebenhyphenpenalty for setting the penalty of a
+minor hyphen:
+
+@x
+@d int_pars=55 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@y
+@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen}
+@d si_debug_code=56 {value is treated as an set of active debugging sections}
+@d supress_debug_mark_code=57 {same as above; if a section number is set, then
+ the output of the section number and the debugging output banner
+ of this section is supressed}
+@d int_pars=58 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@z
+-------------------------------------------------------------------------
+@x
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@y
+@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code)
+@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin
+ if not odd(int_par(supress_debug_mark_code)div #) then
+ begin
+ si_put_cr;
+ si_put_ln(' <* debugging output section #',#:#,' *>');
+ end; {marking supression}
+ { dig_count entfernt !!! }
+@d gubed_si == end
+@f si_debug == begin
+@f gubed_si == end
+@f gubed == nil
+
+
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@z
+-------------------------------------------------------------------------
+@x
+othercases print("[unknown integer parameter!]")
+@y
+neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty");
+si_debug_code:print_esc("sidebug");
+supress_debug_mark_code:print_esc("supressdebugmark");
+othercases print("[unknown integer parameter!]")
+@z
+-------------------------------------------------------------------------
+@x
+@ @<Cases of |print_cmd_chr|...@>=
+@y
+primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/
+@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@>
+primitive("sidebug",assign_int,int_base+si_debug_code);
+primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code);
+@ @<Cases of |print_cmd_chr|...@>=
+@z
+
+=========================================================================
+
+As now hyphens may have different penalties, we must somehow associate
+a penalty with a discretionary node. We do this by allowing a penalty
+node as the first node in the prebreak list of a discretionary node.
+
+The following changes are in two case statements that check the nodes
+in the sublists of a discretionary node; we add an empty case for
+penalty nodes (two more case statements follow a little bit later).
+
+@x
+ othercases confusion("disc1")
+@y
+ penalty_node: ;
+ othercases confusion("disc1")
+@z
+-------------------------------------------------------------------------
+@x
+ othercases confusion("disc2")
+@y
+ penalty_node: ;
+ othercases confusion("disc2")
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The following change is in the line-break section, where try_break is
+given the penalty stored in the penalty node. This change is the reason
+for all other changes concerning penalties. Moreover, in this change
+a line break is suppressed if the discretionary node is actually
+a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break").
+
+@x
+begin s:=pre_break(cur_p); disc_width:=0;
+if s=null then try_break(ex_hyphen_penalty,hyphenated)
+else begin repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ try_break(hyphen_penalty,hyphenated);
+ act_width:=act_width-disc_width;
+ end;
+r:=replace_count(cur_p); s:=link(cur_p);
+while r>0 do
+ begin @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@y
+begin
+ s:=pre_break(cur_p); disc_width:=0;
+ if s=null then try_break(ex_hyphen_penalty,hyphenated)
+ else if (type(s)=penalty_node) and (link(s)=null) then begin
+ flush_node_list(s); s := null;
+ try_break(ex_hyphen_penalty,hyphenated); end
+ else if not is_dirty_umlaut(cur_p) then begin
+ if type(s)=penalty_node then s:=link(s);
+ repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ if type(pre_break(cur_p))=penalty_node then begin
+ try_break(penalty(pre_break(cur_p)),hyphenated) end
+ else begin try_break(hyphen_penalty,hyphenated); end;
+ act_width:=act_width-disc_width;
+ end;
+ r:=replace_count(cur_p); s:=link(cur_p);
+ while r>0 do begin
+ @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+ prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@z
+
+=========================================================================
+
+Two more case statements.
+
+@x
+ othercases confusion("disc3")
+@y
+ penalty_node: ;
+ othercases confusion("disc3")
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ othercases confusion("disc4")
+@y
+ penalty_node: ;
+ othercases confusion("disc4")
+@z
+
+=========================================================================
+
+There's a little problem, converting a device independent (``.dvi'')
+to a post script file (``.ps''). I think that this program part could
+cause this problem. so let's see...
+
+!a <-- = --> @x With this, i want to try to reproduce this error.
+ Because, after i had inserted this change, that error didn`t occur
+ again!
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin if type(q)=disc_node then
+ @<Change discretionary to compulsory and set
+ |disc_break:=true|@>
+ else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end
+else begin q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @y
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin
+ if type(q)=disc_node then begin
+ hyfdeb_b:=false;
+ if is_dirty_umlaut(q) then begin
+ si_debug(64) hyfdeb_b:=true; gubed_si;
+ si_put_cr;
+ si_put_ln(' ??? There's a line break at a dirty umlaut!?');
+ end;
+ if not hyfdeb_b then begin
+ @<Change discretionary to compulsory and set |disc_break:=true|@>
+ end;
+ end else
+ if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end else begin
+ q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @z
+
+
+=========================================================================
+
+If the break actually occurs, the penalty node is made a separate list
+with only one node, which is immediately flushed.
+
+@x
+begin s:=pre_break(q); link(q):=s;
+while link(s)<>null do s:=link(s);
+pre_break(q):=null; q:=s;
+end
+@y
+begin
+ s:=pre_break(q);
+ if type(s)=penalty_node then begin
+ s:=link(s);
+ link(pre_break(q)):= null;
+ flush_node_list(pre_break(q));
+ end;
+ link(q):=s;
+ while link(s)<>null do s:=link(s);
+ pre_break(q):=null; q:=s;
+end
+@z
+
+=========================================================================
+
+The type `array[0..65] of 0..256' is needed more often, so we make it
+an explicit type (see big SISISI change at end of change file). hc is
+now declared of this type.
+
+@x
+@!hc:array[0..65] of 0..256; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+@y
+@!hc:a_word; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+{ some variables for debugging output }
+@!hyfdeb_i,hyfdeb_j: integer;
+@!hyfdeb_b:boolean;
+@!si_p, si_q, si_r, si_s: pointer;
+@z
+
+-------------------------------------------------------------------------
+
+Our hyphenation routines need even more "more local variables".
+
+@x
+@ Hyphenation routines need a few more local variables.
+@y
+@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a
+ whatsit node occurs inbetween a word. This can happen due to
+ Partl's changes in ``german.sty'' }
+
+@ Hyphenation routines need a few more local variables.
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@!j:small_number; {an index into |hc| or |hu|}
+@y
+@!qq:pointer;
+@!j:small_number; {two indices into |hc| or |hu|}
+@!jj:integer;
+@z
+
+=========================================================================
+
+The dirty_umlaut array must be initialized for each word.
+And we enable watching the node list, representing the word
+to be hyphenated.
+
+@x
+if s<>null then
+ begin @<Skip to node |ha|, or |goto done1| if no hyphenation
+@y
+si_p:=cur_p; si_q:=null;
+for jj:=-1 to 64 do dirty_umlaut[jj] := null;
+if s<>null then begin
+ si_debug(1)
+{ hyfdeb_i:=depth_threshold; depth_threshold:=100;
+ hyfdeb_j:=breadth_max; breadth_max:=100;
+}
+ show_node_list(si_p);
+{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; }
+ gubed_si;
+ @<Skip to node |ha|, or |goto done1| if no hyphenation
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ hyphenate;
+ end;
+done1: end
+@y
+ hyphenate;
+ end;
+done1:
+si_debug(32)
+ hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max;
+ if si_q<>null then begin
+ depth_threshold:=100; {show all levels of a list}
+ breadth_max:=200; {show all nodes of one level of a list}
+ si_r:=link(si_q); link(si_q):=null;
+ end else begin
+ (* take the values, set by the user, for this variables! *)
+ breadth_max:=show_box_breadth; depth_threshold:=show_box_depth;
+ end;
+ show_node_list(si_p);
+ si_put_cr;
+ if si_q <> null then link( si_q ) := si_r;
+
+ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j;
+gubed_si;
+end
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Here, we add the SISISI-procedure abteilen for use in hyphenate and
+another label done1.
+
+@x
+procedure hyphenate;
+label common_ending,done,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@y
+
+@<Handling of dirty umlauts@>
+
+procedure hyphenate;
+label common_ending,done,done1,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+The prehyphenation loop must now also skip over the "dirty umlauts".
+
+@x
+loop@+ begin if is_char_node(s) then
+ begin c:=qo(character(s)); hf:=font(s);
+ end
+ else if type(s)=ligature_node then
+ if lig_ptr(s)=null then goto continue
+ else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then
+ begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end
+ else goto done1;
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@y
+loop@+ begin
+ if is_char_node(s) then begin
+ c:=qo(character(s)); hf:=font(s);
+ end else if type(s)=ligature_node then begin
+ if lig_ptr(s)=null then goto continue
+ else begin
+ q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ end else if is_dirty_umlaut(s) then begin
+ c:=get_char_of(s); hf:=get_font_of(s);
+ end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end else goto done1;
+
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The interface variables for the hyphenation are extended: hyfpen[i]
+holds the actual penalty of a hyphen at position i, hyf_disc[i]
+contains a "special discretionary" for triple-consonant-hyphens and
+ck-hyphens. hc_si is the word as given to the SISISI algorithm;
+hyf_si is returned from SISISI and contains markers for the hyphens.
+
+After this change, there are many changes where `odd(hyf[i])' is
+simply replaced by `hyfpen[i]<>inf_penalty'.
+
+Another procedure to be changed is `reconstitute': It now has to handle
+special dicretionary nodes. For a detailed feeling about the code changes
+in reconstitute, either (1) look through it bit by bit, or (2) ask Heini
+Hofstaedter.
+
+@x
+ end
+ else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@y
+ end else if is_dirty_umlaut(s) then begin
+ if get_font_of(s)<>hf then goto done3;
+ c:=get_char_of(s);
+ if lc_code(c)=0 then goto done3;
+ if hn=63 then goto done3;
+ hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c);
+ dirty_umlaut[hn]:=s;
+ for jj:=1 to replace_count(s) do s:=link(s);
+ end else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ dirty_umlaut[-1]:=s;
+ end else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+Also in the conversion loop (where the node list is shuffled into the
+hc array), we must skip a "dirty umlaut".
+
+@x
+loop@+ begin if not(is_char_node(s)) then
+ case type(s) of
+ ligature_node: do_nothing;
+@y
+loop@+ begin
+if not(is_char_node(s)) then
+ if is_dirty_umlaut(s) then begin
+ for jj:=1 to replace_count(s)-1 do s:=link(s);
+ end else
+ case type(s) of
+ ligature_node: do_nothing;
+@z
+
+=========================================================================
+
+Well, there are a lot of new variables that are necessary for the new
+hyphenation. Most of them are necessary for Heini's change in the
+reconstitute function, where now discretionary nodes for hyphens with
+more than one character (e.g. the german ck-hyphens or
+three-consonant-hyphens) can be inserted.
+
+@x
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+@y
+@!hyfpen:array [0..64] of integer; {penalties for possible discretionary
+ hyphens}
+@!hyf_si:trennvektor;
+@!hc_si:wort;
+@!hyf_disc:array [0..64] of pointer;
+
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+
+@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|}
+@!add_char, {additional characters when hyphenating e.g.\
+ Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here
+ |add_char| = 1}
+@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| }
+@!spec_hyf: pointer; {special hyphen; causes different spelling of the
+ word, when it is hyphenated at this point}
+@!si_j:integer;
+@z
+
+=========================================================================
+
+An odd->inf_penalty change.
+
+@x
+for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1;
+@y
+for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1;
+@z
+
+=========================================================================
+
+The new variable hold_r is initialized (the kern node is a dummy node,
+as far as I can see).
+
+@x
+if not is_char_node(hb) then
+ if type(hb)=ligature_node then if odd(subtype(hb)) then
+@y
+hold_r := new_kern(1235); link(hold_r):=r;
+if not is_char_node(hb) then
+ if type(hb)=ligature_node then if odd(subtype(hb)) then
+@z
+
+=========================================================================
+
+Initialize some variables if the list starts with a "dirty umlaut".
+
+@x
+else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@y
+else if is_dirty_umlaut(ha) then begin
+ if get_font_of(ha) <> hf then goto found2
+ else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha);
+ end
+end else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+unhinge all "dirty umlauts".
+
+@x
+common_ending: flush_node_list(r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@y
+common_ending:
+qq:=hold_r;
+for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin
+ while link(qq) <> dirty_umlaut[kk] do qq := link(qq);
+ qr := link(qq);
+ for i:=1 to replace_count(qr) do
+ if qr<>null then qr:=link(qr)
+ else begin {test:}
+ si_put_ln('...??..X --> ????? !');
+ end; {:test}
+ if qr<>null then begin
+ link(qq):=link(qr); link(qr):=null;
+ end else link(qq):=null;
+end;
+if dirty_umlaut[-1]<>null then begin
+ qq:=hold_r;
+ while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq);
+ if link(qq)=dirty_umlaut[-1] then begin
+ link(qq):=link(dirty_umlaut[-1]);
+ link(dirty_umlaut[-1]):=null;
+ end else begin
+ si_put(' *** ERROR: node list is damaged! ');
+ si_put_ln('(post hyphenation - unhinge a whatsit node)');
+ end;
+end;
+{}
+r:=hold_r;
+while link(r)<>null do begin
+ if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r)
+ else begin
+ wlog_cr; wterm_cr;
+ wlog_ln('???$ - ERROR in node list!');
+ wterm_ln('???$ - ERROR in node list!');
+ kk:=depth_threshold; l:=breadth_max;
+ depth_threshold:=100; breadth_max:=100;
+ show_node_list(hold_r);
+ link(r):=null;
+ depth_threshold:=kk; breadth_max:=l;
+ end;
+end;
+{}
+flush_node_list(hold_r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@z
+
+------------------------------------------------------------------------
+
+Another odd->inf_penalty change (this time only textual).
+
+@x
+If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]|
+is odd and such that the result of |reconstitute| would have been different
+if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed|
+to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero.
+@y
+If there exists an index |k| in the range $j\le k\le m$ such that
+|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute|
+would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute|
+sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets
+|hyphen_passed| to zero.
+@z
+
+-------------------------------------------------------------------------
+
+In the reconstitute function, we set the boundary value n immediately
+before the next "dirty umlaut" by a simple for-loop starting at the
+original n.
+
+@x
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+@y
+@!ii:small_number;
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+for ii:=n downto j do
+ if dirty_umlaut[ii] <> null then n:=ii-1;
+@z
+
+-------------------------------------------------------------------------
+
+Another odd->inf_penalty change.
+
+@x
+ if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char;
+@y
+ if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char;
+@z
+
+=========================================================================
+
+A first change in the reconstitute function.
+
+@x
+ else begin if hchar<non_char then if odd(hyf[j]) then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@y
+ else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@z
+
+
+-------------------------------------------------------------------------
+
+Now we are in the post-hyphenation's main loop; here must append a
+"dirty umlaut" to the growing node list. This is simply done by an
+if-statement that checks for the presence of a "dirty umlaut" and
+appends it.
+
+Moreover, we have another textual odd->inf_penalty change.
+
+@x
+repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+if hyphen_passed=0 then
+ begin link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if odd(hyf[j-1]) then
+ begin l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q
+
+@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is
+odd, when both branches of the previous discretionary end at position |j-1|.
+@y
+if dirty_umlaut[-1]<>null then begin
+ {hook in the previous saved whatsit node before the first
+ character of the hyphenated word}
+ link(s):=dirty_umlaut[-1];
+ s:=link(s);
+end;
+repeat
+ if dirty_umlaut[j]<>null then begin
+ link(s):=dirty_umlaut[j];
+ while link(s)>null do s:=link(s);
+ link(hold_head):=null;
+ j:=j+1; hyphen_passed:=0;
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1;
+ si_debug(16)
+ si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!');
+ gubed_si;
+ end;
+ end else begin
+ l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+ if hyphen_passed=0 then begin
+ link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+ end; {if dirty_umlaut[j]<>null then-else}
+ if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q;
+si_q:=s; {save the last node of the hyphenated word for debugging output}
+for j:=0 to 64 do if hyf_disc[j]<>null then begin
+ flush_node_list( hyf_disc[j]);
+end
+
+@ In this repeat loop we will insert another discretionary if
+|hyfpen[j-1]<>inf_penalty|, when both branches of the previous
+discretionary end at position |j-1|.
+@z
+
+=========================================================================
+
+Another odd->inf_penalty change.
+
+@x
+hyphen_passed:=j-1; link(hold_head):=null;
+until not odd(hyf[j-1])
+@y
+hyphen_passed:=j-1; link(hold_head):=null;
+until (hyfpen[j-1]=inf_penalty)
+@z
+
+=========================================================================
+
+Here comes the big reconstitution action (cheers to Heini!).
+
+@x
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char);
+if hyf_node<>null then
+ begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+ end;
+while l<=i do
+ begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@y
+As the value of |hyfpen[i]| is necessary for creating a penalty node,
+we must create this node before we ``kill'' the hyphenation information in
+|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the
+pointer to the penalty node or |null|, if no such node has been created.
+
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty)
+ then minor_tail:=new_penalty(hyfpen[i])
+ else minor_tail:=null;
+hyfpen[i]:=inf_penalty;
+pre_break(r):=minor_tail;
+
+hyf_node:=new_character(hf,hyf_char);
+{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|}
+xchg_k:=i;
+if hyf_disc[xchg_k]<>null then begin
+ spec_hyf:=pre_break(hyf_disc[xchg_k]);
+ add_char:=subtype(spec_hyf);
+ xchg_i:=1;
+ repeat
+ spec_hyf:=link(spec_hyf);
+ if spec_hyf<>null then begin
+ xchg_char[xchg_i]:=qo(character(spec_hyf));
+ incr(xchg_i);
+ end;{if}
+ until spec_hyf=null;
+ if hyf_node<>null then begin
+ xchg_char[xchg_i]:=hyf_char;
+ free_avail(hyf_node);
+ end else decr(xchg_i);
+ xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first
+ character is replaced by a character of the
+ |pre_break|-list of |spec_hyf|}
+ for xchg_k:=1 to xchg_i do begin
+ xchg_char[0]:=hu[xchg_hu];
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ xchg_char[xchg_k]:=xchg_char[0];
+ incr(xchg_hu);
+ end; {|for|}
+ xchg_k:=i;
+ i:=xchg_hu-1;
+ xchg_hu:=xchg_hu-xchg_i;
+end {|if hyf_disc[]<>null|}
+else if hyf_node<>null then begin
+ incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+end;
+while l<=i do begin
+ l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@z
+
+-------------------------------------------------------------------------
+
+... continued:
+
+@x
+if hyf_node<>null then
+ begin hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@y
+ if hyf_disc[xchg_k]<>null then begin
+{ Restore the original word in |hu| }
+ i:=xchg_k; l:=i+1;
+ for xchg_k:=1 to xchg_i do begin
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ incr(xchg_hu);
+ end;{for}
+ end else if hyf_node<>null then begin
+ hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Finally, we come to the SISISI hyphenation. At first, we define two
+variables:
+
+@x
+@ Assuming that these auxiliary tables have been set up properly, the
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+
+@ Assuming that these auxiliary tables have been set up properly, the
+@z
+
+-------------------------------------------------------------------------
+
+And off we go; at first only slowly, ...
+
+@x
+@<Find hyphen locations for the word in |hc|...@>=
+@y
+{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!}
+
+
+@<Find hyphen locations for the word in |hc|...@>=
+@z
+
+-------------------------------------------------------------------------
+
+... but now we kill all of Liang's code and replace it by some re- and
+back-en- and decoding, a call to abteilen, and the construction of the
+special discretionaries. Then we go right into the SISISI hyphenation.
+=========================================================================
+@x
+if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|}
+hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters}
+for j:=0 to hn-r_hyf+1 do
+ begin z:=trie_link(cur_lang+1)+hc[j]; l:=j;
+ while hc[l]=qo(trie_char(z)) do
+ begin if trie_op(z)<>min_quarterword then
+ @<Store \(m)maximum values in the |hyf| table@>;
+ incr(l); z:=trie_link(z)+hc[l];
+ end;
+ end;
+found: for j:=0 to l_hyf-1 do hyf[j]:=0;
+for j:=0 to r_hyf-1 do hyf[hn-j]:=0
+
+@ @<Store \(m)maximum values in the |hyf| table@>=
+begin v:=trie_op(z);
+repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v];
+if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v];
+v:=hyf_next[v];
+until v=min_quarterword;
+end
+
+@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is
+@y
+ for j:=0 to hn do
+ hc_si[j] := ktab[hc[j]];
+ si_debug(2)
+ si_put(' hc:');
+ for j:=0 to hn do si_put( xchr[hc[j]] );
+ si_put_ln(':');
+ si_put(' hc_si:');
+ for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] );
+ si_put_ln(':');
+ gubed_si;
+ si_debug(4)
+ si_put_ln('< decimal character codes >');
+ si_put(' hc:');
+ for j:=0 to hn do begin
+ si_put(hc[j]:3,'-');
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr;
+ si_put(' hc_si:');
+ for j:=0 to hn do begin
+ si_put( rev_tab[hc_si[j]]:3,'-' );
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr; si_put_cr;
+ gubed_si;
+
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+ if funktioniert then
+ for j:=0 to hn do begin
+ if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty
+ else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty
+ else if hyf_si[j]=nebenck then begin
+ hyfpen[j+1] := neben_hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j+1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s);
+ subtype(s):=0; { number of additional characters }
+ link(s):=new_character(hf,hu[j+2]); {'k' oder'K'}
+ link(link(s)):=null;
+ s:=hyf_disc[j+1];
+ post_break(s):=null; link(s):=null;
+ end
+ else if hyf_si[j]=haupt3 then begin
+ hyfpen[j-1]:=hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j-1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s);
+ subtype(s):=1;
+ link(s):=new_character(hf,hu[j]); { Dreifachkonsonant }
+ link(link(s)):=null;
+ {|post_break|- und |link|-Liste: }
+ s:=hyf_disc[j-1];
+ post_break(s):=null;
+ link(s):=null;
+ end
+ end; {|if funktioniert|}
+ si_debug(8)
+ if funktioniert then begin
+ for j:=0 to hn do
+ if hyfpen[j]<>inf_penalty then begin
+ if hyf_disc[j]<>null then begin
+ if subtype(pre_break(hyf_disc[j]))=0 then
+ si_put( xchr[hu[j+1]], '-' )
+ else {if subty...}
+ si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' );
+ { i hope so }
+ end else begin
+ si_put( xchr[hu[j]] );
+ if hyfpen[j]=hyphen_penalty then
+ si_put('=')
+ else si_put('-');
+ end;
+ end else begin
+ si_put( xchr[hu[j]] );
+ end;
+ end else begin
+ si_put_ln(' no hyphens were found in this word!');
+ end;
+ si_put_cr;
+ gubed_si;
+ goto done1;
+
+found:
+hyfpen[0]:=inf_penalty;
+for j:=1 to hn do
+ if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty
+ else hyfpen[j]:=inf_penalty;
+
+done1:
+
+@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe
+dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort
+nach Trennstellen zu untersuchen und die gefundenen Trennstellen in
+hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen
+einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im
+INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT
+F\"UR PRAKTISCHE INFORMATIK.
+
+Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem
+Start von TeX aufgerufen werden.
+
+@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen|
+n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang
+ausgef\"uhrt werden sollen.
+
+@<Set initial values of ...@>=
+ inittrennen;
+
+@ @<Constants in the outer block@>=
+ maxwl = 64; { Maximale Wortlaenge }
+ sonderzeichen= 0;
+ bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7;
+ bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14;
+ bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21;
+ bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27;
+ bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31;
+ keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5;
+
+ tabsize = 8191; { 2**13 - 1 }
+ spec_letter_ID = 4321;
+ { const definitionen }
+ vok_a = 1;
+ vok_e = 2;
+ vok_i = 3;
+ vok_o = 4;
+ vok_u = 5;
+ vok_ae = 6;
+ vok_oe = 7;
+ vok_ue = 8;
+ vok_ie = 9;
+ vok_ai = 10;
+ vok_ei = 11;
+ vok_au = 12;
+ vok_aeu= 13;
+ vok_eu = 14;
+ vok_y = 15;
+ kons = 16;
+
+@
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+ rev_tab: array[0..255]of integer;
+
+
+@ Prozedurdefinitionen
+
+function dig_count( v: integer): integer;
+ { calculates the number of decimal digits of ``v'' }
+ var x, e, c: integer;
+begin
+ x := v div 10; e:=1; c:=1;
+ while e<=x do begin
+ e := e * 10; incr(c);
+ end;
+ dig_count:=c;
+end;
+
+@<Handling of dirty umlauts@>=
+
+procedure hashfunk (var w:wort; anfang,ende:integer;
+ var v:varr; var ind,k:intarr );
+
+ { -PRAK!- in C long statt integer }
+ var vacc, indacc, kacc : integer;
+ i : integer;
+begin
+ vacc := 31415; indacc := 152; kacc := 271;
+dbg_put_ln(' * HFNC =');
+ for i := anfang to ende do begin
+dbg_put(' * HFNC ',i-anfang:3,' A');
+ vacc := (vacc * 31 + w [i]) mod 8388648;
+dbg_put('B');
+ v[i] := vacc;
+dbg_put('C');
+ indacc := (indacc * 33 + w[i]) mod (tabsize+1);
+dbg_put('D');
+ ind[i] := indacc;
+dbg_put('E');
+ kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2);
+dbg_put('F');
+ k[i] := 2*kacc + 1;
+dbg_put_ln('G');
+ end; {|for|}
+end; {|hashfunk|}
+
+procedure unpackinfo ( b:infobyte;
+ { var i:infotype }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean );
+begin
+ { with i do begin }
+ if odd(b) then begin { 87654321 }
+ iausnahme:= true;
+ b:= b div 2; { 08765432 }
+ if odd(b) then iuntrennbar:= true
+ else iuntrennbar:= false;
+ b:=b div 2; { 00876543 }
+ ierste := b mod 8; { 00876xxx }
+ izweite := b div 8; { 00000876 }
+ end else begin
+ iausnahme:= false; { 87654321 }
+ b:= b div 2; { 08765432 }
+ if odd(b) then iendung:= true
+ else iendung:= false;
+ b:= b div 2; { 00876543 }
+ if odd(b) then ivorsilbe:= true
+ else ivorsilbe:= false;
+ b:= b div 2; { 00087654 }
+ if odd(b) then istamm:= true
+ else istamm:= false;
+ b:= b div 2; { 00008765 }
+ if odd(b) then iehervor:= true
+ else iehervor:= false;
+ b:= b div 2; { 00000876 }
+ if odd(b) then istammallein:= true
+ else istammallein:= false;
+ end; {|if-then-else|}
+ { end; |with|}
+end; {|unpackinfo|}
+
+
+procedure unpackentry( h:hashelement;
+ { var e:tableentry }
+ var etabv:verdschlue;
+ var etabb:infobyte;
+ var efrei:boolean;
+ var ewiederfrei:boolean );
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' ==> UPCKNTY 1');
+ etabv:= h[0]+h[1]*256+h[2]*256*256;
+dbg_put(' 2');
+ if odd(h[3]) then begin { Ausnahme }
+dbg_put(' 3 A');
+ etabb:= h[3];
+dbg_put('1');
+ efrei:= false;
+ ewiederfrei:= false;
+ end
+ else begin
+dbg_put(' 3 B');
+ etabb:= h[3] mod 64;
+dbg_put('1');
+ { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher
+ nicht ver„ndert werden. }
+dbg_put('2');
+ { durch folgende 2 Abfragen ersetzt. -PRAK!- }
+ if odd(h[3] div 64) then efrei := true
+ else efrei := false;
+ if odd(h[3] div 128) then ewiederfrei := true
+ else ewiederfrei := false;
+ end;
+dbg_put_ln('- 4');
+ { end; |with|}
+end; {|unpackentry|}
+
+
+procedure hashsuch ( v:verdschlue;
+ ind,k : integer;
+ { var i:infotype; }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean;
+ var g:boolean );
+
+{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden }
+ var
+ gef,ngef:boolean;
+ j:integer;
+ entry : tableentry;
+
+begin
+ gef := false; ngef := false; j := ind;
+ repeat
+ unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+ if entry.frei then ngef := true
+ else if (v = entry.tabv) and not entry.wiederfrei then begin
+ unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite,
+ iendung,ivorsilbe,istamm,iehervor,istammallein);
+ gef := true;
+ end else
+ j := (j+k) mod (tabsize + 1)
+ until gef or ngef;
+ g := gef;
+end; {|hashsuch|}
+
+
+procedure hashload ( var status:integer );
+{ einlesen der Hash-Tabelle von file fn }
+ var i : integer;
+ e : tableentry;
+begin
+ { Orginal sitex3.cha -PRAK!-
+ for i:=1 to file_name_size do name_of_file:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ if a_open_in(hashfile) then begin
+ }
+
+ { geaendert !! -PRAK!- }
+ for i:=1 to file_name_size do name_of_file[i]:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ { -PRAK!- texinputpath fr C notwendig }
+ if a_open_in(hashfile, TEX_INPUT_PATH) then begin
+ for i := 0 to tabsize do begin
+ { -PRAK!- in C Probleme mit den typen beim einlesen }
+ read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of }
+ read (hashfile, htab[i][1]); { hashelement, und }
+ read (hashfile, htab[i][2]); { hashelement = packed array 0..3 }
+ read (hashfile, htab[i][3]);
+ unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei);
+ if not e.frei and not e.wiederfrei then anzahl := anzahl + 1;
+ end; {|for|}
+ status:= 0;
+ a_close(hashfile);
+ end else status:= 1;
+end; {|hashload|}
+
+
+procedure inittrennen;
+ var ch: 0..255;
+ bst: buchstabe;
+ i, status: integer;
+ is_iniTeX: boolean;
+begin
+ { Konversionstabelle |ktab| initialisieren }
+ { ======================================== }
+
+ for ch := 0 to 255 do begin
+
+ { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then }
+
+ case ch of
+ " ",",",";",":","-","/","?","!","(",")",".","""","'","^":
+
+ if ch="." then ktab[ch]:= "."
+ else ktab[ch] := trennzeichen
+ { else ktab[ch] := sonderzeichen geht nicht !!}
+ end; { case }
+
+if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen;
+
+ end; { for }
+ for bst := bst_a to bst_z do begin
+ ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst;
+ ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst
+ end;
+
+ { Umlaute und scharfes s - f\"ur ``production \TeX version'' }
+ ktab[255]:=bst_sz;
+ ktab[246]:=bst_oe;
+ ktab[252]:=bst_ue;
+ ktab[228]:=bst_ae;
+
+ { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' }
+ ktab["1"]:=bst_sz;
+ ktab["2"]:=bst_ue;
+ ktab["3"]:=bst_oe;
+ ktab["4"]:=bst_ae;
+ ktab[25]:=bst_sz; {?-wieso? HH}
+
+{testing:}
+for i:=0 to 255 do rev_tab[ktab[i]]:=i;
+rev_tab[ktab[255]]:=223;
+xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246);
+xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223);
+{:end of testing}
+
+ { Kombinationstabelle |kombtab| initialisieren }
+ { ============================================ }
+ { Diese Tabelle muss symetrisch sein,
+ kombtab[a,b] = kombtab[b,a] }
+ kombtab[ keine, keine] := keine;
+ kombtab[ keine, neben] := keine;
+ kombtab[ keine,nebenck] := keine;
+ kombtab[ keine, haupt] := keine;
+ kombtab[ keine, haupt3] := keine;
+
+ kombtab[ neben, keine] := keine;
+ kombtab[ neben, neben] := neben;
+ kombtab[ neben,nebenck] := keine;
+ kombtab[ neben, haupt] := neben;
+ kombtab[ neben, haupt3] := keine;
+
+ kombtab[nebenck, keine] := keine;
+ kombtab[nebenck, neben] := keine;
+ kombtab[nebenck,nebenck] := nebenck;
+ kombtab[nebenck, haupt] := keine;
+ kombtab[nebenck, haupt3] := keine;
+
+ kombtab[ haupt, keine] := keine;
+ kombtab[ haupt, neben] := neben;
+ kombtab[ haupt,nebenck] := keine;
+ kombtab[ haupt, haupt] := haupt;
+ kombtab[ haupt, haupt3] := keine;
+
+ kombtab[ haupt3, keine] := keine;
+ kombtab[ haupt3, neben] := keine;
+ kombtab[ haupt3,nebenck] := keine;
+ kombtab[ haupt3, haupt] := keine;
+ kombtab[ haupt3, haupt3] := haupt3;
+
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+
+{ ================== Hashtabelle |htab| initialisieren ======================
+
+Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf
+keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob
+dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig
+davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf
+(production-version) von \TeX ist.
+
+=============================================================================}
+ is_iniTeX:=false;
+ init is_iniTeX:=true; tini
+ if not is_iniTeX then begin
+ hashload(status);
+ if status <> 0 then begin
+ si_put_cr;
+ si_put_ln
+(' * * * * * * * * * *!');
+ si_put_ln('**** ERROR: Can not read hash-file!');
+ si_put_cr;
+ jump_out;
+ end;
+ end; {|not iniTeX|}
+end; {|inittrennen|}
+
+
+procedure packinfo ( i:infotype; var b : infobyte );
+{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ }
+{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / }
+
+begin
+ b:=0;
+dbg_put_cr;
+ { with i do begin }
+ if i.ausnahme then
+begin
+dbg_put(' ### PCKINF 1A utr:');
+if i.untrennbar then dbg_put('Y') else dbg_put('N');
+dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3);
+ b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite
+; dbg_put('B');
+end
+ else
+begin
+dbg_put(' ### PCKINF 2A');
+ b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor)
+ +32*ord(i.stammallein);
+dbg_put('B');
+end;
+ { end; with }
+dbg_put_ln('-3');
+end; {|packinfo|}
+
+procedure packentry( e:tableentry; var h:hashelement );
+{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ }
+
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' +++ PCKNTY A');
+ h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx}
+dbg_put('B');
+ e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh}
+dbg_put('C');
+ h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx}
+dbg_put('D');
+ h[2]:= e.tabv div 256; { 000000000000000087654321}
+
+dbg_put('E');
+ if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! }
+ else
+begin
+dbg_put('F1');
+ h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx }
+dbg_put('-2');
+end;
+dbg_put_ln('G');
+ { end; |with|}
+end; {|packentry|}
+
+
+
+procedure hashetr ( var w:wort; laenge:integer; i:infotype;
+ var g:boolean );
+
+ var v1: varr;
+ ind1, k1: intarr;
+ v: verdschlue;
+ ind, k, j, e: integer;
+ gef,ngef:boolean;
+ entry: tableentry;
+ helem: hashelement;
+
+begin
+dbg_put_ln(' ** HTR 1');
+ if anzahl >= tabsize then begin
+dbg_put_ln(' ** HTR 2a');
+ g := false;
+ end
+ else begin
+dbg_put_ln(' ** HTR 2b');
+ if (anzahl < 10) or (anzahl mod 100 = 0) then begin
+ si_put_cr; si_put(' -Anzahl:',anzahl,'. ');
+ end;
+dbg_put_ln(' ** HTR 3');
+ hashfunk(w,1,laenge,v1,ind1,k1);
+dbg_put_ln(' ** HTR 4');
+ v := v1[laenge];
+ ind := ind1[laenge];
+ k := k1[laenge];
+ gef := false; ngef := false;
+ repeat
+dbg_put_ln(' ** HTR 5 A');
+ unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+dbg_put_ln(' ** HTR B');
+ if entry.frei or entry.wiederfrei then begin
+ anzahl := anzahl + 1;
+ ngef := true;
+ entry.tabv := v;
+dbg_put_ln(' ** HTR C1');
+ packinfo (i,entry.tabb);
+dbg_put_ln(' ** HTR D1');
+ entry.frei := false;
+ entry.wiederfrei := false;
+dbg_put_ln(' ** HTR E1');
+ packentry(entry,helem);
+dbg_put_ln(' ** HTR F1');
+ htab[ind] := helem; { -PRAK!- in C memcpy() }
+ end else begin
+dbg_put_ln(' ** HTR C2');
+ gef := v = entry.tabv;
+ if not gef then ind := (ind+k) mod (tabsize + 1);
+dbg_put_ln(' ** HTR D2');
+ end;
+ until gef or ngef;
+dbg_put_ln(' ** HTR 6');
+ g := ngef;
+ end
+end; {|hashetr|}
+
+procedure hashempty;
+ var i:integer;
+ elem : tableentry;
+ he : hashelement;
+begin
+ { with elem do begin }
+ elem.tabv:=0;
+ elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen.
+ ( Und dies ist eine Beleidigung fuer jeden Affen ) HM }
+ elem.frei := true;
+ elem.wiederfrei := false;
+ { end; }
+ packentry (elem, he);
+ for i := 0 to tabsize do htab[i] := he; { -PRAK!- in C memcpy() }
+ anzahl := 0;
+end; {|hashempty|}
+
+procedure hashsave (var status:integer);
+{ abspeichern der Hash-Tabelle auf file }
+ var i: integer;
+begin
+ for i:=1 to file_name_size do name_of_file[i]:=' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length:=3;
+ if a_open_out(hashfile) then begin
+ for i := 0 to tabsize do begin
+ write (hashfile, htab[i][0]:4);
+ write (hashfile, htab[i][1]:4);
+ write (hashfile, htab[i][2]:4);
+ write (hashfile, htab[i][3]:4);
+ write_ln (hashfile);
+ end;
+ status:=0;
+ a_close(hashfile);
+ end else status:=1;
+end; {|hashsave|}
+
+
+function hashsize :integer;
+begin
+ hashsize:=anzahl;
+end;
+
+
+procedure zahl(line:string80;var i:integer; ende:integer; var j:integer);
+ var aus: boolean;
+begin
+ j:=0;
+ repeat
+ if i<=ende then
+ if ktab[line[i]]="." then i:=i+1
+ else aus:=true
+ else aus:=true
+ until aus;
+ repeat
+ if i<=ende then begin
+ { if line[i] in ["0".."9"] then begin }
+ case line[i] of
+ "0","1","2","3","4","5","6","7","8","9":
+ begin j:=10*j+line[i]-"0";i:=i+1
+ end;
+ { else aus:=true geht nicht !!! }
+ end;
+ if (line[i] <> "0") and
+ (line[i] <> "1") and
+ (line[i] <> "2") and
+ (line[i] <> "3") and
+ (line[i] <> "4") and
+ (line[i] <> "5") and
+ (line[i] <> "6") and
+ (line[i] <> "7") and
+ (line[i] <> "8") and
+ (line[i] <> "9") then aus :=true;
+ end else aus:=true
+ until aus;
+end; {|zahl|}
+
+
+procedure infobau(line: string80; anfang,ende: integer;
+ { var inform: infotype;}
+ var informausnahme :boolean;
+ var informuntrennbar :boolean;
+ var informerste :integer;
+ var informzweite :integer;
+ var informendung :boolean;
+ var informvorsilbe :boolean;
+ var informstamm :boolean;
+ var informehervor :boolean;
+ var informstammallein:boolean;
+ var g: boolean);
+
+ var i,j:integer;ok,fehler:boolean;
+ b:buchstabe;
+begin
+ g:=false;
+ { with inform do begin } { initialisierung }
+ informausnahme:=false;
+ informendung:=false;
+ informvorsilbe:=false;
+ informehervor:=false;
+ informstamm:=false;
+ informstammallein:=false;
+ i:=anfang; ok:=false; fehler:=false;
+ repeat
+ if i<=ende then
+ if line[i]="." then i:=i+1 else ok:=true
+ else fehler:=true
+ until ok or fehler;
+ if not fehler then begin
+ b:=ktab[line[i]];
+ if b = bst_a then begin
+ {ausnahme}
+ informausnahme:=true;
+ i:=i+1;
+ if ktab[line[i]] = bst_u then begin
+ i := i + 1; informuntrennbar := true;
+ end else informuntrennbar := false;
+ zahl(line,i,ende,j);
+ if j=0 then begin
+ informerste:=7; informzweite:=7;
+ { Record-komponente ``zweite'' wird }
+ { initialisiert, damit beim packen keine }
+ { undefinierten Ergebnisse entstehen (die u.U. zu }
+ { RUN-TIME-ERRORS f\"uhren k\"onnen!) }
+ end else begin
+ j:=j-2;
+ if (j>=0) and (j<=6) then informerste:=j
+ else fehler:=true;
+ zahl(line,i,ende,j);
+ if j=0 then informzweite:=7
+ else begin
+ j:=j-informerste-4;
+ if (j>=0) and (j<=6) then informzweite:=j
+ else fehler:=true;
+ end;
+ end;
+ if not fehler then g:=true;
+ end {|if b = bst_a |}
+ else begin
+ ok:=false;
+ repeat
+ case b of
+ {bst_v} 22: informvorsilbe:=true;
+ {bst_e} 5: informendung:=true;
+ {bst_s} 19: informstamm:=true;
+ {bst_b} 2: informehervor:=true;
+ {bst_t} 20: informstammallein:=true;
+ {trennzeichen} 31:;
+ othercases fehler:=true
+ endcases;
+ if i=ende then ok:=true
+ else begin
+ i:=i+1;
+ b:=ktab[line[i]]
+ end
+ until ok or fehler;
+ if not fehler then
+ g := (informvorsilbe or informendung or informstamm)
+ and (not informehervor or informvorsilbe and informendung)
+ and (not informstammallein or informstamm);
+ end; {|if b = bst_a then-else|}
+ end {|if not fehler|}
+ { end |with inform|}
+end; {|infobau|}
+
+
+procedure eintragen (line: string80; l: integer );
+ var i, laenge: integer;
+ inform: infotype;
+ w: wort;
+ g: boolean;
+begin
+ laenge := 1;
+ while line [laenge] <> "." do laenge := laenge + 1;
+ laenge := laenge -1;
+ if laenge >= 1 then begin
+ if laenge <= maxwl then begin
+ infobau(line,laenge+1,l,
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,g);
+
+ if not g then begin
+ si_put_cr; si_put(' Info falsch: ')
+ end else begin
+ for i:= 1 to laenge do w[i]:=ktab[line[i]];
+ hashetr(w,laenge,inform,g);
+ if not g then begin
+ si_put_cr; si_put(' Tabellenfehler: ');
+ end;
+ end;
+ if not g then begin
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge <= maxwl|}
+ else begin
+ si_put_cr; si_put_ln(' zu langes Wort: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge >= 1|}
+ else begin
+ si_put_cr; si_put_ln(' Falsche Zeile: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+end; {|eintragen|}
+
+{---------------------------------------------------------------------------}
+
+{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) }
+
+procedure naechsterbst(var i:integer;var tr:trennvektor;
+ var dudstop:sperrvektor;var b:buchstabe;
+ var w:wort);
+ begin
+ if (i>0) and (tr[i]=keine) and not dudstop[i]
+ then begin b:=w[i];i:=i-1 end
+ else b:=trennzeichen
+ end;
+{---------------------------------------------------------------------------}
+{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) }
+
+ procedure duden (tr:trennvektor;
+ var w:wort;
+ var tr1 :trennvektor;
+ var dudtr:trennvektor;
+ dud :dudt; { array [0..maxwl] of boolean; }
+ var dudstop:sperrvektor;
+ laenge : integer;
+ var ok :boolean;
+ var zerlegungen:integer );
+
+ { traegt in dudtr die Trennstellen nach Dudenregeln ein }
+
+ { frueher mtype laut = (.....) }
+
+ var i:integer;
+ j:integer;
+ zust:integer;
+ aus:boolean;
+ tre:integer;
+ letzte:integer;
+ l,lalt:integer;{ vormals laut }
+ b:buchstabe;
+
+
+ begin { duden }
+ i:=laenge;
+ for j := 0 to laenge do dudtr[j] := tr[j];
+ while (i>0) and not dud [i] do i:=i-1;
+ while i>0 do begin
+ zust:=1; aus:=false; letzte := 0;
+ l:=kons;
+ b:=w[i];
+ i:=i-1;
+ repeat
+ {naechsten Laut lesen}
+ { procedure nlaut; }
+ begin { nlaut }
+ tre:=i+1;
+ lalt:=l;
+ case b of
+ {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_e } 5:begin
+ l:=vok_e; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_i then begin
+ l:=vok_ie;
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin
+ {ungetbst = } i := i + 1;
+ l:=vok_e;
+ b := bst_i;
+ end;
+ end
+ end;
+ {bst_i} 9:begin
+ l:=vok_i; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_u} 21:begin
+ l:=vok_u; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_t} 20:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_h} 8:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_c then begin
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end
+ else if b = bst_p then naechsterbst(i,tr,dudstop,b,w)
+ else if b = bst_t then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m,
+ bst_n, bst_p,
+ bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz }
+
+ 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 :
+
+ begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_y} 25:begin
+ l:=vok_y;
+ naechsterbst(i,tr,dudstop,b,w);
+ end;
+ {trennzeichen,sonderzeichen}
+ 31,0 :aus:=true
+ end;
+ end; { nlaut }
+
+ if not aus then
+ {Naechster Zustand}
+ case zust of
+ 1:if l=kons then zust:=2
+ else zust:=4;
+ 2:if l<>kons then zust:=3;
+ 3:if l=kons then zust:=6
+ else if l<>lalt then begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end;
+ 4:if l=kons then zust:=6
+ else zust:=3;
+ 6:if l=kons then begin
+ zust:=2;
+ letzte:=tre;
+ if (w[tre]=bst_c) and (w[tre+1] = bst_k) then
+ dudtr[letzte]:=nebenck
+ else dudtr[letzte]:=neben
+ end
+ else begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end
+ end
+ until aus;
+ if zust=2 then dudtr[letzte]:=keine
+ else if zust=4 then
+ { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then }
+ if (lalt < vok_ie) or (lalt > vok_eu) then
+ dudtr[letzte]:=keine;
+ while (i>0) and not dud[i] do i:=i-1
+ end;
+ end { duden };
+{---------------------------------------------------------------------------}
+{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor;
+ var ok1 : boolean);
+}
+
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+
+ { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen,
+ rechts muss noch ein Stamm kommen.
+ 2 ... Es kann Endung, Vorsilbe oder Stamm kommen.
+ 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden,
+ rechts muss noch ein Stamm kommen.
+ 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden.
+ 5 ... Trennstelle mit entfallenem Konsonanten }
+
+ var
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+
+ { procedure p_endung(var endok:boolean); }
+
+ { procedure p_vorsilbe(var vorok:boolean); }
+
+ { procedure p_stamm(var stok:boolean); }
+
+ { procedure p_stammallein (var staok:boolean); }
+
+ begin { trennen }
+ spvtmp := spv;
+ ok1:=false;
+ if anfang = laenge + 1
+ then { Ende des Wortes erreicht}
+ if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten }
+ begin
+ dud[anfang-1]:=true;
+
+ {duden(tr);}
+ duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen);
+
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+ end
+ else { kein Stamm im Wortrest ok1 = false }
+ else { restlichen Teil zerschneiden }
+ begin
+ hashfunk (w,anfang,laenge,v,ind,k);
+ schnitt := laenge;
+ nichtok := false;
+ repeat
+ { links abschneiden }
+ repeat
+ if spv[schnitt] then { Schnittstelle gesperrt }
+ gef:=false
+ else
+ begin
+ hashsuch (v[schnitt],ind[schnitt],k[schnitt],
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,gef);
+ end;
+ if gef then
+ spv[schnitt]:=true
+ else
+ schnitt := schnitt - 1
+ until gef or (schnitt = anfang - 1);
+
+ if gef then { teilwortanfang ist bekanntes wort }
+ begin
+ if not inform.ausnahme then
+ begin
+ if inform.endung and (zustand=2) then
+ begin
+
+ { --- p_endung(ok_end); --- }
+ ok_end:=false;
+ if (w[anfang]=bst_c) or (w[anfang]=bst_h) then
+ begin
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=neben
+ end;
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv[schnitt+1]:=true;
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_help
+ end;
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_end or ok_help;
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_endung(ok_end) - ende --- }
+
+ ok1 := ok1 or ok_end
+ end
+ else
+ ok_end:=false;
+ if inform.vorsilbe
+ then begin
+
+ { --- p_vorsilbe(ok_vor); --- }
+ { Trennstelle(n) vor der Vorsilbe eintragen }
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt;
+ end;
+ { Trennstellen innerhalb der Vorsilbe eintragen }
+ dud[schnitt]:=true;
+ { Rest des Wortes zerschneiden }
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ dud[schnitt]:=false;
+ { --- p_vorsilbe(ok_vor) - ende --- }
+
+ ok1 := ok1 or ok_vor
+ end
+ else
+ ok_vor := false;
+ if inform.stamm and not ok_vor
+ then begin
+ if not inform.stammallein
+ then begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true
+ end
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end
+ else
+ if (anfang=1) and (schnitt=laenge)
+ then begin
+
+ { --- p_stammallein(ok_stamm); --- }
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=haupt;
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_stammallein(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+ end
+ end
+ else begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true;
+ end;
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+
+ {naechsten Schleifendurchlauf vorbereiten}
+ schnitt := schnitt - 1;
+ nichtok := schnitt = anfang - 1
+ end
+ else { kein bekanntes Wort am Beginn des Teilwortes }
+ nichtok := true;
+
+ until nichtok
+ end;
+ spv := spvtmp; { spv wiederherstellen, fr die C Version. -PRAK!- }
+ end { trennen };
+
+{----------------------------------------------------------------------------}
+
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+
+ label 99;
+
+ { kommt in den outer Block }
+ { mtype sperrvektor=array [0..maxwl] of boolean; }
+
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+
+ begin { abteilen }
+ tr1[0] := keine;
+ for i:=0 to laenge do begin
+ tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false;
+ if i > 0 then
+ if (w[i] = trennzeichen) or (w[i] = sonderzeichen)
+ then begin
+ zerlegungen := 0;
+ ok := false;
+ goto 99;
+ end;
+ end;
+ zerlegungen:=0;
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+99:
+ end;{ abteilen }
+{----------------------------------------------------------------------------}
+
+ {identification number for dirty umlauts; see description in
+ change file}
+
+ function is_dirty_umlaut(p:pointer):boolean;
+ var res:boolean;
+ q:pointer;
+ begin
+ res:=false;
+ if p<>null then
+ if type(p)=disc_node then
+ if pre_break(p)<>null then
+ if link(pre_break(p))<>null then
+ if link(link(pre_break(p)))<>null then begin
+ q:=pre_break(p);
+ if type(q)=penalty_node then q:=link(q);
+ if (type(q)=kern_node)and(width(q)=spec_letter_ID)and
+ is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true;
+ end;
+ is_dirty_umlaut:=res;
+ end; {|is_dirty_umlaut|}
+
+ function get_char_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_char_of:=width(link(link(q)));
+ end; {|get_char_of|}
+
+ function get_font_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_font_of:=font(link(q));
+ end; {|get_font_of|}
+
+{----------------------------------------------------------------------------}
+
+@ Ende ...
+@z
+
+=========================================================================
+
+@x
+@ Now let's go back to the easier problem, of building the linked
+trie. When \.{INITEX} has scanned the `\.{\\patterns}' control
+sequence, it calls on |new_patterns| to do the right thing.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+label done, done1;
+var k,@!l:small_number; {indices into |hc| and |hyf|}
+@!digit_sensed:boolean; {should the next digit be treated as a letter?}
+@!v:quarterword; {trie op code}
+@!p,@!q:trie_pointer; {nodes of trie traversed during insertion}
+@!first_child:boolean; {is |p=trie_l[q]|?}
+@!c:ASCII_code; {character being inserted}
+begin if trie_not_ready then
+ begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+ @<Enter all of the patterns into a linked trie, until coming to a right
+ brace@>;
+ end
+else begin print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@y
+@ We do not build a trie (wether a linked nor a packed). Instead, we
+create a hash table for the \SISISI-hyphenation algorithm. But we
+still use the data provided by the `\.{\\patterns}' primitive.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+ label done;
+ var k: small_number; {index into |zeile|}
+ @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle }
+ @!status:integer;
+ @!c:ASCII_code; {character being inserted}
+begin
+ if trie_not_ready then begin
+ set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+
+ hashempty; { create the empty hash table }
+ @<Enter all of the patterns into a hash table, until coming to a right
+ brace; then skip an optional space@>;
+ hashsave(status);
+ if status<>0 then begin
+ wterm_ln('Fehler bei hash save !!!!!'{?});
+ wlog_ln( 'Fehler bei hash save !!!!!'{?});
+ end;
+ end else begin
+ print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@z
+
+
+--------------------------------------------------------------------------
+
+
+@x
+@ Novices are not supposed to be using \.{\\patterns}, so the error
+messages are terse. (Note that all error messages appear in \TeX's string
+pool, even if they are used only by \.{INITEX}.)
+
+@<Enter all of the patterns into a linked trie...@>=
+k:=0; hyf[0]:=0; digit_sensed:=false;
+loop@+ begin get_x_token;
+ case cur_cmd of
+ letter,other_char:@<Append a new letter or a hyphen level@>;
+ spacer,right_brace: begin if k>0 then
+ @<Insert a new pattern into the linked trie@>;
+ if cur_cmd=right_brace then goto done;
+ k:=0; hyf[0]:=0; digit_sensed:=false;
+ end;
+ othercases begin print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end
+ endcases;
+ end;
+done:
+@y
+@ Here we build the hash table for the \SISISI-hyphenation.
+
+@<Enter all of the patterns into a hash table, until coming to a right...@>=
+for k:=0 to maxwl do zeile[k]:=" ";
+k:=0;
+loop@+ begin
+ get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'.
+ Der Beistrich wird eigens abgefragt, da er in TeX
+ umdefiniert werden kann. }
+ if (cur_cmd = right_brace)or(cur_chr = ",") then
+ begin
+ { Ein Eintrag der Worttabelle - letzter
+ (|cur_cmd|=|right_brace|) - gelesen }
+ if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden }
+ if cur_cmd = right_brace then goto done;
+ k := 0; { hyf[] ist \"uberfl\"ussig, da die
+ Trenninformation in zeile mitverpackt ist. }
+ end
+ else { Das Wort ist noch nicht fertig gelesen }
+ if (cur_cmd = letter) or (cur_cmd = other_char)
+ or (cur_cmd = spacer) or (cur_chr = ".")
+ then begin
+ @<Append a new letter or a hyphen level@>;
+ end else begin
+ print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end;
+end; {|loop|}
+done:
+@z
+
+-----------------------------------------------------------------------------
+
+
+@x
+@ @<Append a new letter or a hyphen level@>=
+if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then
+ begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter}
+ else begin cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then
+ begin print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error;
+ end;
+ end;
+ if k<63 then
+ begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false;
+ end;
+ end
+else if k<63 then
+ begin hyf[k]:=cur_chr-"0"; digit_sensed:=true;
+ end
+@y
+@ @<Append a new letter or a hyphen level@>=
+if (cur_chr<>" ")then begin
+ { Das Leerzeichen wird \"uberlesen! }
+ if (cur_chr <> ".") then begin
+ { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten }
+ if (cur_chr<"0")or(cur_chr>"9") then begin
+ cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then begin
+ print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error; cur_chr:=128;
+ end;
+ end;
+ end;
+ if k<63 then begin
+ incr(k); zeile[k]:=cur_chr;
+ end;
+end;
+@z
+
+----------------------------------------------------------------------------
+
+
+@x
+@ When the following code comes into play, the pattern $p_1\ldots p_k$
+appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots
+n_k$ appears in |hyf[0..k]|.
+
+@<Insert a new pattern into the linked trie@>=
+begin @<Compute the trie op code, |v|, and set |l:=0|@>;
+q:=0; hc[0]:=cur_lang;
+while l<=k do
+ begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true;
+ while (p>0)and(c>so(trie_c[p])) do
+ begin q:=p; p:=trie_r[q]; first_child:=false;
+ end;
+ if (p=0)or(c<so(trie_c[p])) then
+ @<Insert a new trie node between |q| and |p|, and
+ make |p| point to it@>;
+ q:=p; {now node |q| represents $p_1\ldots p_l$}
+ end;
+if trie_o[q]<>min_quarterword then
+ begin print_err("Duplicate pattern");
+@.Duplicate pattern@>
+ help1("(See Appendix H.)"); error;
+ end;
+trie_o[q]:=v;
+end
+@y
+@ Well, that was everything about the initialization of the \SISISI hash
+table (at this place).
+
+All following sections, describing the initialization of the trie are
+replaced by ``empty sections'' in order to have same section numbering
+in SI\TeX as in \TeX.
+@z
+
+----------------------------------------------------------------------------
+
+@x
+@ @<Insert a new trie node between |q| and |p|...@>=
+begin if trie_ptr=trie_size then overflow("pattern memory",trie_size);
+@:TeX capacity exceeded pattern memory}{\quad pattern memory@>
+incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0;
+if first_child then trie_l[q]:=p@+else trie_r[q]:=p;
+trie_c[p]:=si(c); trie_o[p]:=min_quarterword;
+end
+@y
+@ ``Empty section''.
+@z
+------------------------------------------------------------------------------
+@x
+@ @<Compute the trie op code, |v|...@>=
+if hc[1]=0 then hyf[0]:=0;
+if hc[k]=0 then hyf[k]:=0;
+l:=k; v:=min_quarterword;
+loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v);
+ if l>0 then decr(l)@+else goto done1;
+ end;
+done1:
+@y
+@ Further ``empty section''.
+@z
+
+@x
+@ Finally we put everything together: Here is how the trie gets to its
+final, efficient form.
+The following packing routine is rigged so that the root of the linked
+tree gets mapped into location 1 of |trie|, as required by the hyphenation
+algorithm. This happens because the first call of |first_fit| will
+``take'' location~1.
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+var @!p:trie_pointer; {pointer for initialization}
+@!j,@!k,@!t:integer; {all-purpose registers for initialization}
+@!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+@!h:two_halves; {template used to zero out |trie|'s holes}
+begin @<Get ready to compress the trie@>;
+if trie_root<>0 then
+ begin first_fit(trie_root); trie_pack(trie_root);
+ end;
+@y
+@ Because we do not use the trie, we fill it with dummy data.
+But the main reason, why we do not remove this procedure is, that
+it is called and the used variables are referenced somewhere in \TeX.
+
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+ var @!p:trie_pointer; {pointer for initialization}
+ @!j,@!k,@!t:integer; {all-purpose registers for initialization}
+ @!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+begin
+ trie_root:=0;
+@z
+
+=========================================================================
+
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/install b/obsolete/systems/sisisi/unix/iSiTeX3.141/install
new file mode 100644
index 0000000000..abf1e67cab
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/install
@@ -0,0 +1,266 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141"
+MAKEDIR=$TEXSRC
+TEXDIR=$MAKEDIR/tex
+WEBDIR=$MAKEDIR/web
+WEB2CDIR=$MAKEDIR/web2c
+LIBDIR=$MAKEDIR/lib
+SISISIDIR="/users/heinz/src/tex/sisisi/iSiTeX3.141"
+
+echo "*** iSiTeX 3.141 Installation program"
+echo "*** ================================="
+echo "***"
+echo "*** Do not forget to retrieve the files *.tex and *.sty"
+echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and"
+echo "*** copy them into your TEXINPUTS path."
+echo "***"
+echo "*** You also have to get tie from the COMMON directory"
+echo "*** and put it into a directory holding executables, so"
+echo "*** it can be used by the installation."
+echo "***"
+echo "*** Before the installation can continue, you have to"
+echo "*** follow the guidelines from the TeX3.141 distribution"
+echo "*** and set the pathnames in the several Makefile.in"
+echo "*** and site.h for your site's needs."
+echo "***"
+echo "*** Do not run configure, it is started by this script."
+echo "***"
+echo "*** If you want to stop the installation, press 'q' now."
+echo "*** Press <cr> to continue."
+
+read x
+if [ "$x" = "q" ]
+then
+ exit
+fi
+
+
+echo
+echo "Starting installation of iSiTeX3.141"
+echo
+
+cd $TEXDIR
+echo "Changing to $TEXDIR"
+if [ ! -f tex.web.orig ]
+then
+ echo "Saving tex.web in tex.web.orig"
+ mv tex.web tex.web.orig
+fi
+if [ ! -f tex.ch.orig ]
+then
+ echo "Saving tex.ch in tex.ch.orig"
+ mv tex.ch tex.ch.orig
+fi
+if [ ! -f Makefile.orig ]
+then
+ echo "Saving Makefile in Makefile.orig"
+ mv Makefile Makefile.orig
+fi
+echo "Modifying Makefile for tex9.c and tex10.c"
+sed -e 's/^objs=/objs=tex9.o tex10.o /'\
+ -e 's/^tex0.c/tex10.c tex0.c/'\
+ -e 's/tex9\.o: tex8\.c/tex9.o: tex9.c/'\
+ -e '/^tex9\.o:/a\
+tex10.o: tex10.c $(commonh)' < Makefile.orig > Makefile
+
+cd $SISISIDIR
+echo "Changing to $SISISIDIR"
+echo "Uncompressing isitex.web to $TEXDIR/tex.web"
+uncompress <isitex.web.Z >$TEXDIR/tex.web
+echo "Copying tex.ch to $TEXDIR/tex.ch"
+cp tex.ch $TEXDIR/tex.ch
+
+cd $WEBDIR
+echo "Changing to $WEBDIR"
+if [ ! -f tangle.ch.orig ]
+then
+ echo "Saving tangle.ch in tangle.ch.orig"
+ mv tangle.ch tangle.ch.orig
+fi
+echo "Modifying tangle.ch for bigger name space"
+sed -e '/@!stack_size=50/i\
+@!max_toks=50000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\
+ must be less than 65536}\
+@y\
+@!max_toks=60000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\
+ must be less than 65536}\
+@z\
+\
+@x\
+@!max_names=4000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@y\
+@!max_names=9000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@z\
+\
+@x' < tangle.ch.orig > tangle.ch
+sleep 5
+touch tangleboot.p
+sleep 5
+touch tangleboot.c tangleboot.h
+
+cd $WEB2CDIR
+echo "Changing to $WEB2CDIR"
+if [ ! -f web2c.yacc.orig ]
+then
+ echo "Saving web2c.yacc in web2c.yacc.orig"
+ mv web2c.yacc web2c.yacc.orig
+fi
+if [ ! -f web2c.c.orig ]
+then
+ echo "Saving web2c.c in web2c.c.orig"
+ mv web2c.c web2c.c.orig
+fi
+if [ ! -f web2c.h.orig ]
+then
+ echo "Saving web2c.h in web2c.h.orig"
+ mv web2c.h web2c.h.orig
+fi
+echo "Modifying web2c.[ch] for bigger tables"
+sed -e 's/var_list\[.00]/var_list\[500]/'\
+ -e 's/field_list\[.00]/field_list\[500]/' < web2c.c.orig > web2c.c
+sed -e 's/var_list\[.00]/var_list\[500]/'\
+ -e 's/field_list\[.00]/field_list\[500]/' < web2c.h.orig > web2c.h
+echo "Modifying web2c.yacc for handling of pointer variables"
+tie -m web2c.yacc web2c.yacc.orig $SISISIDIR/web2c.yacc.ch
+if [ $? -ne 0 ]
+then
+ echo "*** You have not installed tie, or an error during the"
+ echo "*** execution of tie has occured."
+ echo "***"
+ echo "*** Installation terminated."
+ exit 1
+fi
+
+cd $LIBDIR
+echo "Changing to $LIBDIR"
+if [ ! -f common.defines.orig ]
+then
+ echo "Saving common.defines in common.defines.orig"
+ mv common.defines common.defines.orig
+fi
+echo "Modifying common.defines for definition of malloc and sizeof"
+cp common.defines.orig common.defines
+echo '{Definitions for IsITeX: new(p) is translated to p := malloc(sizeof(^p)),
+so we have to define malloc and sizeof for web2c.}
+
+@define function malloc ();
+@define function sizeof ();' >> common.defines
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Running configure"
+./configure
+
+echo "*** Now that configure has finished, you might want"
+echo "*** to inspect or change the Makefiles, as suggested"
+echo "*** in TeX3.141's README file."
+echo "*** Press 's' to suspend the installation and start"
+echo "*** an interactive shell, <cr> to continue."
+
+read x
+if [ "$x" = "s" ]
+then
+ echo "Type 'exit' to quit the shell and continue with the installation."
+ ${SHELL:-/bin/sh}
+fi
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Now starting: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+echo "Now starting error correction"
+echo "Changing to $TEXDIR"
+echo "Correcting coerce.h"
+sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\
+ -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\
+ -e 's/(trennvektor)//g' -e 's/(hashelement)//g' -e 's/(trenn16)//g'\
+ -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new
+mv coerce.h.new coerce.h
+echo "Correcting texd.h"
+tie -m texd.h.new texd.h $SISISIDIR/texd.h.ch
+mv texd.h.new texd.h
+echo "Correcting tex6.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\
+ -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/) + 96 ]/] + 96 )/g'\
+ -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\
+ integer help;'\
+ -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\
+ fscanf ( hashfile, "%d", \&help );\
+ htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new
+mv tex6.c.new tex6.c
+echo "Correcting tex7.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\
+ -e 's/read.*(.*hsmem.*l.*)/fscanf ( hsmem , "%d", \&l )/'\
+ -e 's/read.*(.*hsmem.*w.*\[.*i.*)/fscanf ( hsmem , "%hd", \&w [ i ] )/'\
+ -e 's/read.*(.*hsmem.*tr.*\[.*i.*)/fscanf ( hsmem , "%d", \&tr [ i ] )/'\
+ -e 's/read.*(.*hsmem.*temp.*)/fscanf ( hsmem , "%c", \&temp )/'\
+ < tex7.c > tex7.c.new
+mv tex7.c.new tex7.c
+echo "Correcting tex10.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\
+ -e 's/fprintf(.*hsmem.*"%ld"/fprintf( hsmem , " %ld"/'\
+ -e 's/) + 96 ]/] + 96 )/' < tex10.c > tex10.c.new
+mv tex10.c.new tex10.c
+
+cd $MAKEDIR
+echo "Returning to $MAKEDIR"
+echo "Continuing: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+if [ ! -x virtex ]
+then
+ echo "*** There seems to be something wrong; virtex doesn't exist."
+ echo "*** Obviously, the installation has failed."
+ exit 1
+fi
+
+echo "Creating the formatfiles in $TEXDIR"
+echo
+echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not"
+echo "in one of the TEXINPUTS directories, you will now run into trouble."
+echo "(You will be prompted for their pathnames and have to type in"
+echo "the whole stuff.)"
+
+mv tex.pool isitex.pool
+TEXPOOL=. ./initex siplain.tex \\dump
+if [ -f siplain.fmt ]
+then
+ mv siplain.fmt isitex.fmt
+ echo "...isitex.fmt created"
+else
+ echo "isiplain.fmt not created for unknown reasons."
+fi
+TEXPOOL=. ./initex silplain.tex \\dump
+if [ -f silplain.fmt ]
+then
+ mv silplain.fmt isilatex.fmt
+ echo "...isilatex.fmt created"
+else
+ echo "isilplain.fmt not created for unknown reasons."
+fi
+
+echo "*** The installation is now complete."
+echo "*** You should find the following files in $TEXDIR:"
+echo "***"
+echo "*** isitex.fmt, isilatex.fmt, hf3,"
+echo "*** isitex.pool, virtex and initex."
+echo "***"
+echo "*** Now copy isitex.fmt and isilatex.fmt into a TEXFORMAT-Dir,"
+echo "*** virtex and initex into a directory holding executables"
+echo "*** (preferably as isivirtex and isiinitex), hf3 into"
+echo "*** a TEXINPUTDIR, and isitex.pool into the TEXPOOLDIR."
+echo "*** Also create links isilatex and isitex to isivirtex, and"
+echo "*** a link named isiplain.fmt to isitex.fmt, all in the"
+echo "*** appropriate directories. If you have SiTeX 3.141 already"
+echo "*** installed, you needn't install the new hf3 again, as they"
+echo "*** are identical."
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other b/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other
new file mode 100644
index 0000000000..f47f0cf9a1
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other
@@ -0,0 +1,263 @@
+#!/bin/sh
+
+TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141"
+MAKEDIR=$TEXSRC/web2c-5.851d
+TEXDIR=$MAKEDIR/tex
+WEBDIR=$MAKEDIR/web
+WEB2CDIR=$MAKEDIR/web2c
+LIBDIR=$MAKEDIR/lib
+SISISIDIR="/users/heinz/src/tex/sisisi/iSiTeX3.141"
+
+echo "*** iSiTeX 3.141 Installation program"
+echo "*** ================================="
+echo "***"
+echo "*** Do not forget to retrieve the files *.tex and *.sty"
+echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and"
+echo "*** copy them into your TEXINPUTS path."
+echo "***"
+echo "*** You also have to get tie from the COMMON directory"
+echo "*** and put it into a directory holding executables, so"
+echo "*** it can be used by the installation."
+echo "***"
+echo "*** Before the installation can continue, you have to"
+echo "*** follow the guidelines from the TeX3.141 distribution"
+echo "*** and set the pathnames in the several Makefile.in"
+echo "*** for your site's needs."
+echo "***"
+echo "*** Do not run configure, it is started by this script."
+echo "***"
+echo "*** If you want to stop the installation, press 'q' now."
+echo "*** Press <cr> to continue."
+
+read x
+if [ "$x" = "q" ]
+then
+ exit
+fi
+
+
+echo
+echo "Starting installation of iSiTeX3.141"
+echo
+
+cd $TEXDIR
+echo "Changing to $TEXDIR"
+if [ ! -f tex.web.orig ]
+then
+ echo "Saving tex.web in tex.web.orig"
+ mv tex.web tex.web.orig
+fi
+if [ ! -f tex.ch.orig ]
+then
+ echo "Saving tex.ch in tex.ch.orig"
+ mv tex.ch tex.ch.orig
+fi
+if [ ! -f Makefile.in.orig ]
+then
+ echo "Saving Makefile.in in Makefile.in.orig"
+ mv Makefile.in Makefile.in.orig
+fi
+echo "Modifying Makefile.in for tex9.c and tex10.c"
+sed -e 's/#.*tex9_o.*9.o/tex9_o = tex9.o tex10.o/'\
+ < Makefile.in.orig > Makefile.in
+
+cd $SISISIDIR
+echo "Changing to $SISISIDIR"
+echo "Uncompressing isitex.web to $TEXDIR/tex.web"
+uncompress <isitex.web.Z >$TEXDIR/tex.web
+echo "Copying tex.ch to $TEXDIR/tex.ch"
+cp tex.ch $TEXDIR/tex.ch
+
+cd $WEBDIR
+echo "Changing to $WEBDIR"
+if [ ! -f tangle.ch.orig ]
+then
+ echo "Saving tangle.ch in tangle.ch.orig"
+ mv tangle.ch tangle.ch.orig
+fi
+echo "Modifying tangle.ch for bigger name space"
+sed -e '/@!stack_size=50/i\
+@!max_toks=50000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\
+ must be less than 65536}\
+@y\
+@!max_toks=60000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\
+ must be less than 65536}\
+@z\
+\
+@x\
+@!max_names=4000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@y\
+@!max_names=9000; {number of identifiers, strings, module names;\
+ must be less than 10240}\
+@z\
+\
+@x' < tangle.ch.orig > tangle.ch
+sleep 5
+touch tangleboot.p
+sleep 5
+touch tangleboot.c tangleboot.h
+
+cd $WEB2CDIR
+echo "Changing to $WEB2CDIR"
+if [ ! -f web2c.yacc.orig ]
+then
+ echo "Saving web2c.yacc in web2c.yacc.orig"
+ mv web2c.yacc web2c.yacc.orig
+fi
+if [ ! -f web2c.c.orig ]
+then
+ echo "Saving web2c.c in web2c.c.orig"
+ mv web2c.c web2c.c.orig
+fi
+if [ ! -f web2c.h.orig ]
+then
+ echo "Saving web2c.h in web2c.h.orig"
+ mv web2c.h web2c.h.orig
+fi
+echo "Modifying web2c.[ch] for bigger tables"
+sed -e 's/var_list\[.00]/var_list\[500]/'\
+ -e 's/field_list\[.00]/field_list\[500]/' < web2c.c.orig > web2c.c
+sed -e 's/var_list\[.00]/var_list\[500]/'\
+ -e 's/field_list\[.00]/field_list\[500]/' < web2c.h.orig > web2c.h
+echo "Modifying web2c.yacc for handling of pointer variables"
+tie -m web2c.yacc web2c.yacc.orig $SISISIDIR/web2c.yacc.ch
+if [ $? -ne 0 ]
+then
+ echo "*** You have not installed tie, or an error during the"
+ echo "*** execution of tie has occured."
+ echo "***"
+ echo "*** Installation terminated."
+ exit 1
+fi
+
+cd $LIBDIR
+echo "Changing to $LIBDIR"
+if [ ! -f common.defines.orig ]
+then
+ echo "Saving common.defines in common.defines.orig"
+ mv common.defines common.defines.orig
+fi
+echo "Modifying common.defines for definition of malloc and sizeof"
+cp common.defines.orig common.defines
+echo '{Definitions for IsITeX: new(p) is translated to p := malloc(sizeof(^p)),
+so we have to define malloc and sizeof for web2c.}
+
+@define function malloc ();
+@define function sizeof ();' >> common.defines
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Running configure"
+./configure
+
+echo "*** Now that configure has finished, you might want"
+echo "*** to inspect or change the Makefiles, as suggested"
+echo "*** in TeX3.141's README file."
+echo "*** Press 's' to suspend the installation and start"
+echo "*** an interactive shell, <cr> to continue."
+
+read x
+if [ "$x" = "s" ]
+then
+ echo "Type 'exit' to quit the shell and continue with the installation."
+ ${SHELL:-/bin/sh}
+fi
+
+cd $MAKEDIR
+echo "Changing to $MAKEDIR"
+echo "Now starting: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+echo "Now starting error correction"
+echo "Changing to $TEXDIR"
+echo "Correcting coerce.h"
+sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\
+ -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\
+ -e 's/(trennvektor)//g' -e 's/(hashelement)//g' -e 's/(trenn16)//g'\
+ -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new
+mv coerce.h.new coerce.h
+echo "Correcting texd.h"
+tie -m texd.h.new texd.h $SISISIDIR/texd.h.ch
+mv texd.h.new texd.h
+echo "Correcting tex6.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\
+ -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\
+ -e 's/) + 96 ]/] + 96 )/g'\
+ -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\
+ integer help;'\
+ -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\
+ fscanf ( hashfile, "%d", \&help );\
+ htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new
+mv tex6.c.new tex6.c
+echo "Correcting tex7.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\
+ -e 's/read.*(.*hsmem.*l.*)/fscanf ( hsmem , "%d", \&l )/'\
+ -e 's/read.*(.*hsmem.*w.*\[.*i.*)/fscanf ( hsmem , "%hd", \&w [ i ] )/'\
+ -e 's/read.*(.*hsmem.*tr.*\[.*i.*)/fscanf ( hsmem , "%d", \&tr [ i ] )/'\
+ -e 's/read.*(.*hsmem.*temp.*)/fscanf ( hsmem , "%c", \&temp )/'\
+ < tex7.c > tex7.c.new
+mv tex7.c.new tex7.c
+echo "Correcting tex10.c"
+sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\
+ -e 's/fprintf(.*hsmem.*"%ld"/fprintf( hsmem , " %ld"/'\
+ -e 's/) + 96 ]/] + 96 )/' < tex10.c > tex10.c.new
+mv tex10.c.new tex10.c
+
+cd $MAKEDIR
+echo "Returning to $MAKEDIR"
+echo "Continuing: \`make TeX'"
+make TeX
+
+cd $TEXDIR
+if [ ! -x virtex ]
+then
+ echo "*** There seems to be something wrong; virtex doesn't exist."
+ echo "*** Obviously, the installation has failed."
+ exit 1
+fi
+
+echo "Creating the formatfiles in $TEXDIR"
+echo
+echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not"
+echo "in one of the TEXINPUTS directories, you will now run into trouble."
+echo "(You will be prompted for their pathnames and have to type in"
+echo "the whole stuff.)"
+
+mv tex.pool isitex.pool
+TEXPOOL=. ./initex siplain.tex \\dump
+if [ -f siplain.fmt ]
+then
+ mv siplain.fmt isitex.fmt
+ echo "...isitex.fmt created"
+else
+ echo "isiplain.fmt not created for unknown reasons."
+fi
+TEXPOOL=. ./initex silplain.tex \\dump
+if [ -f silplain.fmt ]
+then
+ mv silplain.fmt isilatex.fmt
+ echo "...isilatex.fmt created"
+else
+ echo "isilplain.fmt not created for unknown reasons."
+fi
+
+echo "*** The installation is now complete."
+echo "*** You should find the following files in $TEXDIR:"
+echo "***"
+echo "*** isitex.fmt, isilatex.fmt, hf3,"
+echo "*** isitex.pool, virtex and initex."
+echo "***"
+echo "*** Now copy isitex.fmt and isilatex.fmt into a TEXFORMAT-Dir,"
+echo "*** virtex and initex into a directory holding executables"
+echo "*** (preferably as isivirtex and isiinitex), hf3 into"
+echo "*** a TEXINPUTDIR, and isitex.pool into the TEXPOOLDIR."
+echo "*** Also create links isilatex and isitex to isivirtex, and"
+echo "*** a link named isiplain.fmt to isitex.fmt, all in the"
+echo "*** appropriate directories. If you have SiTeX 3.141 already"
+echo "*** installed, you needn't install the new hf3 again, as they"
+echo "*** are identical."
+
+exit 0
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz
new file mode 100644
index 0000000000..eb8fa3d2dd
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz
Binary files differ
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch
new file mode 100644
index 0000000000..ecd0285f36
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch
@@ -0,0 +1,1431 @@
+@x
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
+@y
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}'
+@z
+
+
+@x
+@!pool_name='TeXformats:SITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@!pool_name='TeXformats:ISITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@z
+
+
+@x
+else bad_pool('! I can''t read SITEX3.POOL.')
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read ISITEX3.POOL.')
+@.I can't read TEX.POOL@>
+@z
+
+
+@x
+@!funktioniert: boolean;
+@!zerleg: integer;
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+@!alletr: trenn16; {iSi 920114}
+@!auswahl, schnuller: char;
+@!memkorr: boolean; {iSi 920914 doku.mem korrigieren ja/nein}
+@!indexi: integer;
+@!uebersprungen: boolean; {iSi 920921}
+@!lex_ja, lex_ok: boolean; {iSi 920930 neue Eingabe `1E' statt `B'}
+@z
+
+
+
+@x
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+@y
+ if not hsstart then begin
+{ wterm(' =iSi=> running hsinit'); wterm_cr; }
+ hsinit;
+ hsstart := true;
+{ wterm(' =iSi=> finished hsinit'); wterm_cr }
+ end;
+
+ if isidebug=1 then begin
+ wterm(' =iSi=> abteilen von '); wwort(hc_si, hn);
+ end;
+
+ abteilen(hc_si,hyf_si, alletr {iSi 920114}, hn,funktioniert,zerleg);
+
+ if not funktioniert then begin
+ if isidebug=1 then begin
+ wterm_cr;
+ wterm(' =iSi=> unbekanntes Wort: '); wwort(hc_si, hn);
+ wterm_cr;
+ wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
+ end;
+ if md_suchen(hc_si, hn, mdb, hyf_si) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> gefunden in mdb: ');
+ writewt(hc_si, hn, hyf_si);
+ wterm_cr
+ end;
+ funktioniert := true
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> nicht gefunden in mdb: ');
+ wwort(hc_si, hn); wterm_cr;
+ end;
+ repeat
+ wterm_cr; wterm_cr;
+ wterm('"');
+ wwort(hc_si, hn);
+ wterm('" ist ein unbekanntes Wort!');
+ wterm_cr;
+ wterm(0:2);
+ wterm(': neues Wort, merken in "'); wjob; wterm('.lex"');
+ wterm_cr;
+ wterm(1:2);
+ wterm(': neues Wort, Trennstellen angeben und merken in "'); wjob;
+ wterm('.lex"');
+ wterm_cr;
+ wterm(9:2);
+ wterm(': Tippfehler! - merken im File "'); wjob; wterm('.edt"');
+ wterm_cr;
+ wterm('Bitte waehlen Sie eine Bedeutung (0,1,9) aus:');
+ wterm_cr;
+ read(term_in, schnuller);
+ auswahl := schnuller;
+ read_ln(term_in);
+ until ((xord[auswahl] >= 48) and (xord[auswahl] <= 49)) or
+ (auswahl = '9');
+ if (auswahl = '0') then begin
+ { Da abteilen bei not funktioniert hyf_si unver"andert l"asst, }
+ { muss hier jetzt hyf_si ``gel"oscht'' werden. }
+ for indexi := 1 to hn do begin
+ hyf_si[indexi] := keine
+ end;
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
+ funktioniert := true
+ end else if (auswahl = '9') then begin
+ mde_eintragen(hc_si, hn, mde)
+ end else begin
+ wterm('Bitte den Trennvektor angeben'); wterm_cr;
+ wterm(' ("-" Nebentrennstelle, "=" Haupttrennstelle, ');
+ wterm('"." Weiterruecken,'); wterm_cr;
+ wterm(' Trennstrich unter den Buchstaben angeben, hinter dem ');
+ wterm('getrennt werden soll):'); wterm_cr;
+ wwort(hc_si, hn); wterm_cr;
+ indexi := 1; uebersprungen := false;
+ read(term_in, auswahl);
+ while (xord[auswahl] <> 10) and (indexi <= hn) do begin
+ if (hc_si[indexi] >= 27) and
+ (hc_si[indexi] <= 30) and
+ not uebersprungen then begin
+ { Ist in hc_si[] ein Umlaut, so steht am Bildschirm "x. }
+ { Die Trennvektoreingabe unter dem " muss uebersprungen }
+ { werden. }
+ uebersprungen := true
+ end else begin
+ if auswahl = '.' then begin
+ hyf_si[indexi] := keine
+ end else if auswahl = '-' then begin
+ hyf_si[indexi] := neben
+ end else if auswahl = '=' then begin
+ hyf_si[indexi] := haupt
+ end else begin
+ hyf_si[indexi] := keine
+ end;
+ uebersprungen := false;
+ indexi := indexi+1
+ end;
+ read(term_in, auswahl)
+ end;
+ while (indexi) <= hn do begin {Rest von hyf_si mit . auff"ullen}
+ hyf_si[indexi] := keine;
+ indexi := indexi+1
+ end;
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm);
+ funktioniert := true
+ end
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(': '); writewt(hc_si, hn, hyf_si); wterm_cr
+ end
+ end;
+
+ if zerleg >= 2 then begin
+ gleiche_weg(alletr, zerleg, hn); { eliminiert gleiche Trennvektoren }
+ if zerleg >= 2 then begin { jetzt sind es echte Alternativen }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mehrdeutiges Wort: '); writewt(hc_si, hn, hyf_si);
+ wterm_cr;
+ wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr;
+ end;
+ if md_suchen(hc_si, hn, mdb, hyf_si) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> gefunden in mdb: '); writewt(hc_si, hn, hyf_si);
+ wterm_cr
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> nicht gefunden in mdb: ');
+ wwort(hc_si, hn); wterm_cr
+ end;
+ if mehrdanz then begin
+ repeat
+ wterm_cr; wterm_cr;
+ wterm('`');
+ wwort(hc_si, hn);
+ wterm(''' ist ein mehrdeutiges Wort!');
+ wterm_cr;
+ wterm(0:2); { wterm('/A'); }
+ wterm(': nur die sicheren Trennstellen waehlen (also `');
+ writewt(hc_si, hn, hyf_si);
+ wterm(''')');
+ wterm_cr;
+ for indexi := 1 to zerleg do begin
+ wterm(indexi:2); { wterm('/'); wterm(xchr[65+indexi]); }
+ wterm(': `');
+ writewt(hc_si, hn, alletr[indexi]);
+ wterm('''');
+ wterm_cr
+ end;
+ wterm(9:2);
+ wterm(': Tippfehler! - merken im File `'); wjob; wterm('.edt''');
+ wterm_cr;
+ wterm('Bitte waehlen Sie eine Bedeutung z.B. `0''+`Enter'' aus:');
+ wterm_cr;
+ wterm(' (zusaetzlich `E'' z.B. `0E''+`Enter'': ');
+ wterm('Wort auch fuer LEXIKON vormerken)');
+ wterm_cr;
+ read(term_in, schnuller);
+ auswahl := schnuller;
+ lex_ja := false; lex_ok := true;
+ if xord[schnuller] <> 32 then begin
+ read(term_in, schnuller);
+ if xord[schnuller] <> 10 then begin
+ if (schnuller = 'e') or (schnuller = 'E') then begin
+ lex_ja := true; { lex_ok := true }
+ end else begin
+ { lex_ja := false; } lex_ok := false
+ end;
+ read_ln(term_in);
+ end
+ end;
+ until (((xord[auswahl] >= 48) and (xord[auswahl] <= 48+zerleg)) or
+ (auswahl = '9')) and lex_ok;
+ if (auswahl = '0') or ((auswahl = '0') and lex_ja) then begin
+ if (auswahl = '0') and not lex_ja then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
+ end else begin { '0E' }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
+ end;
+ end else if (auswahl = '9') then begin
+ mde_eintragen(hc_si, hn, mde)
+ end else begin
+ for j := 0 to maxwl do
+ hyf_si[j] := alletr[xord[auswahl]-48][j];
+ if not lex_ja then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, false, mdm)
+ end else begin { lex_ja }
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: ');
+ writewt(hc_si, hn, hyf_si); wterm_cr
+ end;
+ mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb);
+ mdm_eintragen(hc_si, hn, hyf_si, true, mdm)
+ end {if not lex_ja ...}
+ end {if (auswahl = ...}
+ end {if mehrdanz}
+ end {if md_suchen ...}
+ end {if zerleg >= 2}
+ end; {if zerleg >= 2}
+
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+@z
+
+
+@x
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@y
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+ trenn16 = array [1..16] of trennvektor; {iSi 921005 trenn8 -> trenn16}
+
+ {iSi 920103 begin}
+ mdb_knoten = ^mdb_k;
+ mdm_knoten = ^mdm_k;
+ mdl_knoten = ^mdl_k;
+ mde_knoten = ^mde_k; {HHHHH}
+
+ mdb_k = record
+ w12: wort;
+ l1: integer;
+ tr1: trennvektor;
+ neu1: boolean;
+ del1: boolean; {gel"oscht ja/nein}
+ used1: boolean; {noch in Verwendung ja/nein}
+ li, re: mdb_knoten;
+ end;
+ {iSi 920103 end}
+
+ {iSi 920110 begin}
+
+ mdm_k = record
+ w12: wort;
+ l1: integer;
+ tr1: trennvektor;
+ neu1: boolean;
+ li, re: mdm_knoten;
+ end;
+ mdl_k = record
+ w12: wort;
+ l1: integer;
+ li, re: mdl_knoten;
+ end;
+ mde_k = record {HHHHH}
+ w12: wort;
+ l1: integer;
+ li, re: mde_knoten;
+ end;
+
+ {iSi 920110 end}
+
+@z
+
+
+
+@x
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+@y
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+
+ hsmem, hslex, hsedt: alpha_file; {iSi 920111}
+
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+
+ hsstart: boolean; {iSi 920114} {ist mdb schon initialisiert?}
+ isidebug: integer; {iSi 920917}
+ auswahl, schnuller: char; {iSi 920917}
+ mehrdanz: boolean; {iSi 920924} {mehrdeutige W"orter anzeigen?}
+ mdb: mdb_knoten; {iSi 920111}
+ mdm: mdm_knoten; {iSi 920111}
+ mdl: mdl_knoten; {iSi 920114}
+ mde: mde_knoten; {iSi 920114}
+ mdb_schnuller: mdb_k; {iSi HH; um web2c zu ueberlisten: sizeof(var) statt }
+ mdm_schnuller: mdm_k; {sizeof(typ) }
+ mdl_schnuller: mdl_k;
+ mde_schnuller: mde_k;
+
+ hsii, hsij: integer; {iSi 920114} {HS_Index_i, HS_Index_j}
+@z
+
+
+
+@x
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+@y
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+{ wterm_cr; wterm_cr;
+ wterm_ln('====================');
+ wterm_ln('This is iSiTeX, HS92');
+ wterm_ln('====================');
+ wterm_cr;
+
+ wterm_ln(' =iSi=> init mdb, mdm, mdl, mde'); }
+ mdb := nil;
+ mdm := nil;
+ mdl := nil;
+ mde := nil;
+
+ hsstart := false;
+ isidebug := 0;
+
+@z
+
+
+@x
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+@y
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var alletr: trenn16; {iSi HH}
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+@z
+
+@x
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+@y
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+ trlast: trennvektor; {iSi 920114}
+@z
+
+@x
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+@y
+ for i := laenge downto 1 do begin
+ if dudtr[i-1] = haupt3 then begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+
+ trlast[i] := tri; {iSi 920114}
+
+ end;
+ zerlegungen:=zerlegungen+1;
+
+ for i := 0 to maxwl do
+ alletr[zerlegungen][i] := trlast[i]; {iSi 920114}
+
+ ok1:= true
+@z
+
+
+@x
+
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(1, schnitt+1, spv, ok_vor, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(5, schnitt, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (4, schnitt+1, spv, ok_stamm, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+2, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(5, schnitt, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+@x
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen (2, schnitt+1, spv, ok_help, alletr,
+ tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+
+@x
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+@y
+
+procedure wchar(c: halfword);
+begin
+ if c = 27 then begin
+ wterm('"a')
+ end else if c = 28 then begin
+ wterm('"o')
+ end else if c = 29 then begin
+ wterm('"u')
+ end else if c = 30 then begin
+ wterm('"s')
+ end else begin
+ wterm(xchr[c+96])
+ end
+end;
+
+procedure wwort(w: wort;
+ l: integer);
+ var i: integer;
+begin
+ for i := 1 to l do begin
+ wchar(w[i])
+ end
+end;
+
+procedure writewt(w: wort;
+ l: integer;
+ tr: trennvektor);
+ var i: integer;
+begin
+ wchar(w[1]);
+ for i := 2 to l-1 do begin
+ if (tr[i-1] = nebenck) {and (w[i] = bst_c)} then begin
+ wterm('k');
+ wterm('-')
+ end else if (tr[i] = haupt3) then begin
+ wterm(xchr[w[i]+96]);
+ wterm('=');
+ wterm(xchr[w[i]+96]);
+ end else if (tr[i] = haupt) then begin
+ wchar(w[i]);
+ wterm('=')
+ end else if (tr[i] = neben) then begin
+ wchar(w[i]);
+ wterm('-')
+ end else begin
+ wchar(w[i])
+ end
+ end;
+ wchar(w[l])
+end;
+
+procedure wjob;
+ var i:integer;
+begin
+ for i := str_start[job_name] to str_start[job_name+1]-1 do begin
+ wterm(xchr[str_pool[i]])
+ end
+end;
+
+function vergl(wrt1: wort;
+ l1: integer;
+ wrt2: wort;
+ l2: integer): integer;
+ label 99;
+ var i: integer;
+begin
+ i := 1;
+ while (i <= l1) and (i <= l2) do begin
+ if wrt1[i] < wrt2[i] then begin
+ vergl := -1;
+ goto 99
+ end else if wrt1[i] > wrt2[i] then begin
+ vergl := 1;
+ goto 99
+ end;
+ i := i+1
+ end;
+ if l1 < l2 then begin
+ vergl := -1;
+ goto 99
+ end else if l1 > l2 then begin
+ vergl := 1;
+ goto 99
+ end else begin
+ vergl := 0;
+ goto 99
+ end;
+ 99:
+end;
+
+procedure gleiche_weg (var alletr: trenn16;
+ var zerleg: integer;
+ laenge: integer);
+
+{ eliminiert bei Mehrdeutigkeiten (zerleg >= 2 !!!) eventuell gleiche }
+{ trennvektoren und korrigiert alletr & zerleg }
+
+ var i, j, k, ii: integer;
+ gleich: boolean;
+
+begin
+ i := 1;
+ repeat
+ j := i+1; { zerleg >= 2 }
+ repeat
+ gleich := true;
+ k := 1; { laenge >= 1 }
+ repeat
+ if alletr[i][k] = alletr[j][k] then begin
+ k := k+1
+ end else begin
+ gleich := false
+ end
+ until (k > laenge) or (gleich = false);
+ if gleich then begin
+ for k := j to zerleg-1 do begin
+ for ii := 0 to maxwl do
+ alletr[k][ii] := alletr[k+1][ii]
+ end;
+ zerleg := zerleg-1
+ end else begin
+ j := j+1
+ end
+ until j > zerleg;
+ i := i+1
+ until i > zerleg-1
+end;
+
+procedure mdb_eintragen(w: wort;
+ l: integer;
+ tr: trennvektor;
+ neu: boolean;
+ used: boolean;
+ var mdb: mdb_knoten);
+
+ var ii, test: integer;
+begin
+{ wterm(' =iSi=> mdb_eintragen von '); writewt(w, l, tr); wterm_cr; }
+ if mdb = nil then begin
+ { new(mdb); }
+ mdb := malloc(sizeof(mdb_schnuller));
+ for ii := 0 to maxwl do
+ mdb^.w12[ii] := w[ii];
+ mdb^.l1 := l;
+ for ii := 0 to maxwl do
+ mdb^.tr1[ii] := tr[ii];
+ mdb^.neu1 := neu;
+ mdb^.used1 := used;
+ mdb^.del1 := false;
+ mdb^.li := nil;
+ mdb^.re := nil;
+ if isidebug=1 then begin
+ wterm_cr
+ end
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ if isidebug=1 then begin
+{ wterm(' =iSi=> kleiner als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
+ wterm('/')
+ end;
+ mdb_eintragen(w, l, tr, neu, used, mdb^.li)
+ end else if test = 1 then begin
+ if isidebug=1 then begin
+{ wterm(' =iSi=> gr"osser als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; }
+ wterm('\')
+ end;
+ mdb_eintragen(w, l, tr, neu, used, mdb^.re)
+ end else begin
+ wterm(' =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!');
+ wterm_cr
+ end
+ end
+end;
+
+{iSi 920102 end}
+{iSi 920110 begin}
+
+ procedure mdm_eintragen(w: wort;
+ l: integer;
+ tr: trennvektor;
+ neu: boolean;
+ var mdm: mdm_knoten);
+ var rechts: mdm_knoten;
+ ii: integer;
+ begin
+ if mdm = nil then begin
+ { new(mdm); }
+ mdm := malloc(sizeof(mdm_schnuller));
+ for ii := 0 to maxwl do
+ mdm^.w12[ii] := w[ii];
+ mdm^.l1 := l;
+ for ii := 0 to maxwl do
+ mdm^.tr1[ii] := tr[ii];
+ mdm^.neu1 := neu;
+ mdm^.li := nil;
+ mdm^.re := nil
+ end else if mdm^.re = nil then begin
+ { new(mdm^.re); }
+ mdm^.re := malloc(sizeof(mdm_schnuller));
+ for ii := 0 to maxwl do
+ mdm^.re^.w12[ii] := w[ii];
+ mdm^.re^.l1 := l;
+ for ii := 0 to maxwl do
+ mdm^.re^.tr1[ii] := tr[ii];
+ mdm^.re^.neu1 := neu;
+ mdm^.re^.li := nil;
+ mdm^.re^.re := nil;
+ mdm^.li := mdm^.re
+ end else begin
+ rechts := mdm^.re;
+ { new(mdm^.re); }
+ mdm^.re := malloc(sizeof(mdm_schnuller));
+ for ii := 0 to maxwl do
+ mdm^.re^.w12[ii] := w[ii];
+ mdm^.re^.l1 := l;
+ for ii := 0 to maxwl do
+ mdm^.re^.tr1[ii] := tr[ii];
+ mdm^.re^.neu1 := neu;
+ mdm^.re^.li := nil;
+ mdm^.re^.re := nil;
+ rechts^.li := mdm^.re
+ end
+ end;
+
+ procedure mdl_eintragen(w: wort;
+ l: integer;
+ var mdl: mdl_knoten);
+ var rechts: mdl_knoten;
+ ii: integer;
+ begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdl_eintragen von '); wwort(w, l); wterm_cr;
+ end;
+ if mdl = nil then begin
+ { new(mdl); }
+ mdl := malloc(sizeof(mdl_schnuller));
+ for ii := 0 to maxwl do
+ mdl^.w12[ii] := w[ii];
+ mdl^.l1 := l;
+ mdl^.li := nil;
+ mdl^.re := nil
+ end else if mdl^.re = nil then begin
+ { new(mdl^.re); }
+ mdl^.re := malloc(sizeof(mdl_schnuller));
+ for ii := 0 to maxwl do
+ mdl^.re^.w12[ii] := w[ii];
+ mdl^.re^.l1 := l;
+ mdl^.re^.li := nil;
+ mdl^.re^.re := nil;
+ mdl^.li := mdl^.re
+ end else begin
+ rechts := mdl^.re;
+ { new(mdl^.re); }
+ mdl^.re := malloc(sizeof(mdl_schnuller));
+ for ii := 0 to maxwl do
+ mdl^.re^.w12[ii] := w[ii];
+ mdl^.re^.l1 := l;
+ mdl^.re^.li := nil;
+ mdl^.re^.re := nil;
+ rechts^.li := mdl^.re
+ end
+ end;
+ procedure mde_eintragen(w: wort;
+ l: integer;
+ var mde: mde_knoten);
+ var rechts: mde_knoten;
+ ii: integer;
+ begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mde_eintragen von '); wwort(w, l); wterm_cr;
+ end;
+ if mde = nil then begin
+ { new(mde); }
+ mde := malloc(sizeof(mde_schnuller));
+ for ii := 0 to maxwl do
+ mde^.w12[ii] := w[ii];
+ mde^.l1 := l;
+ mde^.li := nil;
+ mde^.re := nil
+ end else if mde^.re = nil then begin
+ { new(mde^.re); }
+ mde^.re := malloc(sizeof(mde_schnuller));
+ for ii := 0 to maxwl do
+ mde^.re^.w12[ii] := w[ii];
+ mde^.re^.l1 := l;
+ mde^.re^.li := nil;
+ mde^.re^.re := nil;
+ mde^.li := mde^.re
+ end else begin
+ rechts := mde^.re;
+ { new(mde^.re); }
+ mde^.re := malloc(sizeof(mde_schnuller));
+ for ii := 0 to maxwl do
+ mde^.re^.w12[ii] := w[ii];
+ mde^.re^.l1 := l;
+ mde^.re^.li := nil;
+ mde^.re^.re := nil;
+ rechts^.li := mde^.re
+ end
+ end;
+
+{iSi 920110 end}
+{isi 920111 begin}
+
+function md_suchen (w: wort;
+ l: integer;
+ var mdb: mdb_knoten;
+ var tr: trennvektor): boolean;
+ var ii, test: integer;
+begin
+ if mdb = nil then begin
+ md_suchen := false
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ md_suchen := md_suchen(w, l, mdb^.li, tr)
+ end else if test = 1 then begin
+ md_suchen := md_suchen(w, l, mdb^.re, tr)
+ end else begin
+ for ii := 0 to maxwl do
+ tr[ii] := mdb^.tr1[ii];
+ mdb^.used1 := true;
+ md_suchen := true
+ end
+ end
+end;
+
+function in_use (w: wort;
+ l: integer;
+ mdb: mdb_knoten): boolean;
+ var test: integer;
+begin
+ if mdb = nil then begin
+ wterm(' =iSi=> in_use Fehler: '); wwort(w, l);
+ wterm(' nicht in mdb'); wterm_cr
+ end else begin
+ test := vergl(w, l, mdb^.w12, mdb^.l1);
+ if test = -1 then begin
+ in_use := in_use(w, l, mdb^.li)
+ end else if test = 1 then begin
+ in_use := in_use(w, l, mdb^.re)
+ end else begin
+ in_use := mdb^.used1;
+ if isidebug=1 then begin
+ if mdb^.used1 then begin
+ wterm(' =iSi=> '); wwort(w, l); wterm(' in use'); wterm_cr
+ end else begin
+ wterm(' =iSi=> '); wwort(w, l); wterm(' not in use'); wterm_cr
+ end
+ end
+ end
+ end
+end;
+
+procedure hsinit;
+ var i, j, l: integer;
+ tr: trennvektor;
+ w: wort;
+ temp, auswahl, schnuller: char;
+ neu, memkorr: boolean;
+begin
+
+ wterm_cr; wterm_cr;
+ repeat
+ wterm_ln('iSi debug Info ? [J/N]');
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl] = 74) or (xord[auswahl] = 106) then begin
+ isidebug := 1
+ end else begin
+ isidebug := 0
+ end;
+
+ for i := 1 to file_name_size do begin
+ name_of_file[i] := ' '
+ end;
+ j := str_start[job_name];
+ i := 1;
+ while (j < str_start[job_name+1]) and
+ (i < file_name_size - 4) do begin
+ name_of_file[i] := xchr[str_pool[j]];
+ j := j+1;
+ i := i+1
+ end;
+ name_of_file[i] := '.';
+ name_of_file[i+1] := 'm';
+ name_of_file[i+2] := 'e';
+ name_of_file[i+3] := 'm';
+
+ if not a_open_in(hsmem,TEX_INPUT_PATH) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> cant a_open_in '); wjob; wterm('.mem');
+ wterm_cr
+ end
+ end else begin
+
+ repeat
+ wterm_cr;
+ wterm('Sollen Fehleintr"age gel"oscht werden? [J/N]'); wterm_cr;
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr; wterm_cr;
+ if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
+ memkorr := true
+ end else begin
+ memkorr := false
+ end;
+
+ while not eof(hsmem) do begin
+ read(hsmem, l);
+ read_ln(hsmem);
+ for i := 1 to l do begin
+ read(hsmem, w[i]);
+ end;
+ read_ln(hsmem);
+ for i := 1 to l do begin
+ read(hsmem, tr[i]);
+ end;
+ read_ln(hsmem);
+ read(hsmem, temp);
+ read_ln(hsmem);
+ if temp = xchr[116] then neu := true else neu := false; {116 = t}
+ if isidebug=1 then begin
+ wterm(' =iSi=> reading from '); wjob; wterm('.mem: '); wwort(w, l);
+ wterm(', neu = '); wterm(temp); wterm_cr;
+ end;
+
+ if memkorr then begin
+ repeat
+ wterm_cr;
+ wterm('Soll ');
+ writewt(w, l, tr);
+ wterm(' gel"oscht werden? [J/N]'); wterm_cr;
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin
+ { nichts tun, Wort wird nicht eingetragen }
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
+ wterm_cr
+ end;
+ mdb_eintragen(w, l, tr, neu, false {used}, mdb);
+ mdm_eintragen(w, l, tr, neu, mdm);
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr);
+ wterm_cr
+ end;
+ mdb_eintragen(w, l, tr, neu, false {used}, mdb);
+ mdm_eintragen(w, l, tr, neu, mdm)
+ end
+ end;
+ if isidebug=1 then begin
+ wterm_cr;
+{ wterm(' =iSi=> closing '); wjob; wterm('.mem'); wterm_cr; }
+ end;
+ a_close(hsmem);
+ end;
+
+ repeat
+ wterm_cr;
+ wterm_ln('Sollen mehrdeutige W"orter angezeigt werden? [J/N]');
+ read(term_in, auswahl);
+ schnuller := auswahl;
+ read_ln(term_in);
+ until (xord[auswahl] = 74) or (xord[auswahl] = 78) or
+ (xord[auswahl] = 106) or (xord[auswahl] = 110);
+ wterm_cr;
+ if (xord[auswahl]=74) or (xord[auswahl]=106) then begin
+ mehrdanz := true
+ end else begin
+ mehrdanz := false
+ end
+
+end;
+
+{iSi 920111 end}
+
+procedure abteilen (var w:wort; var tr1:trennvektor;
+ var alletr: trenn16; {iSi 920114}
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer);
+@z
+
+
+
+@x
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+@y
+ var
+ i:integer;
+ iSi_j: integer; {iSi 920114}
+ dud:dudt; {array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ tr, dudtr:trennvektor;
+ spv,dudstop:sperrvektor;
+@z
+
+
+@x
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@y
+ trennen(3, 1, spv, ok, alletr,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+@z
+
+
+@x
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+@y
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+
+ for iSi_j := 1 to zerlegungen do begin {iSi 920114 begin}
+ if (alletr[iSi_j][i] = nebenck) then begin
+ alletr[iSi_j][i] := keine;
+ alletr[iSi_j][i-1] := nebenck
+ end
+ end {iSi 920114 end}
+
+ end;
+@z
+
+
+
+@x
+@ @<Finish the extensions@>=
+for k:=0 to 15 do if write_open[k] then a_close(write_file[k])
+@y
+@ @<Finish the extensions@>=
+for k:=0 to 15 do if write_open[k] then a_close(write_file[k]);
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'm';
+name_of_file[hsii+2] := 'e';
+name_of_file[hsii+3] := 'm';
+
+if not a_open_out(hsmem) then begin
+ wterm_ln(' =iSi=> cant a_open_out '); wjob; wterm('.mem ');
+ wterm_cr
+end else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.mem '); wterm_cr; }
+ while mdm <> nil do begin
+ if in_use(mdm^.w12, mdm^.l1, mdb) then begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.mem: ');
+ writewt(mdm^.w12, mdm^.l1, mdm^.tr1); wterm_cr;
+ end;
+ write_ln(hsmem, mdm^.l1);
+ for k := 1 to mdm^.l1 do begin
+ write(hsmem, mdm^.w12[k]);
+ end;
+ write_ln(hsmem);
+ for k := 1 to mdm^.l1 do begin
+ write(hsmem, mdm^.tr1[k]);
+ end;
+ write_ln(hsmem);
+ if mdm^.neu1 then begin
+ write(hsmem, xchr[116]);
+ write_ln(hsmem);
+ mdl_eintragen(mdm^.w12, mdm^.l1, mdl)
+ end else begin
+ write(hsmem, xchr[102]);
+ write_ln(hsmem)
+ end
+ end else begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> '); wwort(mdm^.w12, mdm^.l1);
+ wterm(' not in use');
+ wterm_cr
+ end
+ end;
+ mdm := mdm^.li
+ end;
+ a_close(hsmem);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.mem '); wterm_cr; }
+end;
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'l';
+name_of_file[hsii+2] := 'e';
+name_of_file[hsii+3] := 'x';
+
+if not a_open_out(hslex) then
+ wterm_ln(' =iSi=> cant open hslex')
+else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.lex '); wterm_cr; }
+ while mdl <> nil do begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.lex: ');
+ wwort(mdl^.w12, mdl^.l1);
+ wterm_cr
+ end;
+ write(hslex, xchr[mdl^.l1]);
+ for k := 1 to mdl^.l1 do begin
+ if mdl^.w12[k] <= 26 then begin
+ write(hslex, xchr[mdl^.w12[k]+96])
+ end else begin
+ if mdl^.w12[k] = 27 then begin
+ write(hslex, '"a')
+ end else if mdl^.w12[k] = 28 then begin
+ write(hslex, '"o')
+ end else if mdl^.w12[k] = 29 then begin
+ write(hslex, '"u')
+ end else if mdl^.w12[k] = 30 then begin
+ write(hslex, '"s')
+ end else begin
+ write(hslex, '-')
+ end
+ end
+ end;
+ write_ln(hslex);
+ mdl := mdl^.li
+ end;
+ a_close(hslex);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.lex '); wterm_cr; }
+end;
+
+for hsii := 1 to file_name_size do begin
+ name_of_file[hsii] := ' '
+end;
+hsij := str_start[job_name];
+hsii := 1;
+while hsij < str_start[job_name+1] do begin
+ name_of_file[hsii] := xchr[str_pool[hsij]];
+ hsij := hsij+1;
+ hsii := hsii+1
+end;
+name_of_file[hsii] := '.';
+name_of_file[hsii+1] := 'e';
+name_of_file[hsii+2] := 'd';
+name_of_file[hsii+3] := 't';
+
+if not a_open_out(hsedt) then
+ wterm_ln(' =iSi=> cant open hsedt')
+else begin
+{ wterm(' =iSi=> a_open_out '); wjob; wterm('.edt '); wterm_cr; }
+ while mde <> nil do begin
+ if isidebug=1 then begin
+ wterm(' =iSi=> writing to '); wjob; wterm('.edt: ');
+ wwort(mde^.w12, mde^.l1);
+ wterm_cr
+ end;
+ for k := 1 to mde^.l1 do begin
+ if mde^.w12[k] <= 26 then begin
+ write(hsedt, xchr[mde^.w12[k]+96])
+ end else begin
+ if mde^.w12[k] = 27 then begin
+ write(hsedt, '"a')
+ end else if mde^.w12[k] = 28 then begin
+ write(hsedt, '"o')
+ end else if mde^.w12[k] = 29 then begin
+ write(hsedt, '"u')
+ end else if mde^.w12[k] = 30 then begin
+ write(hsedt, '"s')
+ end else begin
+ write(hsedt, '--')
+ end
+ end
+ end;
+ write_ln(hsedt);
+ mde := mde^.li
+ end;
+ a_close(hsedt);
+{ wterm(' =iSi=> a_close '); wjob; wterm('.edt '); wterm_cr; }
+end;
+@z
+
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch
new file mode 100644
index 0000000000..3c9a647f72
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch
@@ -0,0 +1,2834 @@
+=========================================================================
+
+SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991
+ (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl
+ (c) for TeX changes: Heini Hofstaedter, Harald Mueller
+ (c) UNIX Version: F. Zwerina, H.-J. Szoldatics, Heinz Herbeck
+
+ additional changes until 10. October 1991 HH
+ additional changes for TeX3.141 July 1993 Heinz Herbeck
+=========================================================================
+
+This is the change file for inclusion of SISISI into TeX V.3.14.
+
+There are three main changes in this file (which are of course quite
+intermingled):
+
+ 1) the replacement of Liang's hyphenation by SISISI.
+
+ 2) the change of the interface of the actual hyphenation
+ to the post-hyphenation and the line-break algorithm.
+
+ This change is necessary because in original TeX, only the
+ information "hyphen - no hyphen" can be transmitted to the
+ line break algorithm because of two "bottlenecks":
+
+ 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i
+ is marked by the 1-bit information odd(hyf[i]).
+ 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked
+ by the existence of a discretionary node.
+
+ From SISISI, there must be more information flowing to the
+ line-break algorithm:
+
+ a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end,
+ a change is made such that a penalty node is allowed as
+ the first node in the prebreak list of a discretionary
+ node. This penalty node contains the penalty associated with
+ this specific hyphen. For "nebenhyphens", this value is set
+ by an additional primitive "\nebenhyphenpenalty".
+ Instead of the hyf-array, an array hyfpen is used that
+ contains the actual penalties; the old "if odd(hyf[i])" now
+ is converted ti "if hyfpen[i] <> inf_penalty".
+
+ b. A hyphen may be more complicated than a single -: ck-hyphens
+ and triple-consonant-hyphens may be present. To include these,
+ another array hyf_disc is introduced that contains ready-made
+ discretionary nodes for such hyphens.
+
+ At first, we simply wanted to include these discretionary
+ during the post-hyphenation into the new node list. But then
+ Heini felt that the impossiblity of ligatures with parts of such
+ a discretionary node was not acceptable; therefore he introdiced
+ the "x-mechanism" (characterized by many variables starting with
+ "x") and changed the reconstitute function so that more than the
+ single hyphen_char could be introduced into the reconstitution
+ process.
+
+ 3) "Dirty" changes for the hyphenation of words with umlauts.
+ These changes are necessary because the umlauts in TeX are not
+ (necessarily) real characters, but something else (see definition
+ of umlauts in plain.tex or german.tex).
+ Ordinarily, the hyphenation only accepts sequences of letters,
+ ligatures (which are expanded to their single characters), and
+ so-called "implicit kerns". An umlaut, however, is usually
+ represented as a letter character and another character consisting
+ of two dots ("dieresis character"), which are connected by
+ explicit kerns (not implicite ones!). Therefore, words containing
+ umlauts are not hyphenable words in TeX, which is not acceptable
+ for german texts.
+
+ Therefore, we devised a "bypass" for umlauts as follows: An umlaut
+ is now represented as a special discretionary node (so-called
+ "dirty umlaut") as follows:
+ \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}%
+ {}%
+ {<umlaut>}
+ where the 4321sp is a "marker" for the "dirty umlaut", the "m"
+ letter is used to derive the font of the umlaut, <code> is
+ the font number that should be associated with this umlaut (the
+ font numbers of the umlauts are given below); and <back> is used
+ to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>).
+
+ In other words, the prebreak list contains the information that
+ this is an umlaut (albeit a "dirty" one) and some more
+ information needed for the hyphenation, the postbreak list is
+ empty, and the main list contains the umlaut proper. By a
+ special if-statement in the line-break algorithm, a hyphenation
+ at a discretionary node of this format is suppressed, so that
+ always the umlaut of the main list is printed.
+ The font numbers for the lowercase umlauts (which are given
+ in the second \kern node) must be:
+ ae 228
+ oe 246
+ ue 252
+ The codes for the uppercase umlauts can be chosen arbitrarily.
+
+ In order to get the hyphenation for these "dirty umlauts"
+ running, one must include lccode assignments of the form
+ \lccode<code>=<lccode>
+ for each of the new letters (see example below).
+
+ A typical declaration of the "dirty umlauts" runs like this:
+
+%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%%
+\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}}
+\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}}
+\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}}
+\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}}
+\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}}
+\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}}
+\lccode196=228 % uppercase umlaut A
+\lccode214=246 % uppercase umlaut O
+\lccode220=252 % uppercase umlaut U
+\lccode228=228 % uppercase umlaut a
+\lccode246=246 % uppercase umlaut o
+\lccode252=252 % uppercase umlaut u
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the
+third kind can be eliminated. How long this will take ... well, wait and
+see.
+But when they arrive, it's not longer possible to choose the codes for
+uppercase umlauts arbitrarily. The codes for uppercase umlauts will
+then be those, shown in the example above.
+
+=========================================================================
+
+At first, we add a control sequence \SISISI.
+@x
+\def\PASCAL{Pascal}
+@y
+\def\SISISI{{\sl SISISI}}
+\def\PASCAL{Pascal}
+
+\let\maybe=\iffalse % print only changed modules
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts}
+@y
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)'
+@z
+
+-------------------------------------------------------------------------
+
+A number of procedures of SISISI are declared after the TeX program. As
+these procedures are used in the hyphenation, of course, they must be
+declared as `forward'.
+ In web2c gibt es keine forward's !!!!
+%@x
+%procedure initialize; {this procedure gets things started properly}
+%@y
+%@<forward declarations@>
+%procedure initialize; {this procedure gets things started properly}
+%@z
+
+-------------------------------------------------------------------------
+%@x
+%@d pool_name_length=8
+%@y
+%@d pool_name_length=11
+% {number of characters of ``pool_f_name''}
+%@z
+%see the following change of the pool file name "pool_f_name"
+-------------------------------------------------------------------------
+
+@x
+@!pool_name='TeXformats:TEX.POOL ';
+@y
+@!pool_name='TeXformats:SITEX3.POOL ';
+@z
+
+-------------------------------------------------------------------------
+
+@x
+else bad_pool('! I can''t read TEX.POOL.')
+@.I can't read TEX.POOL@>
+@y
+else bad_pool('! I can''t read SITEX3.POOL.')
+@.I can't read TEX.POOL@>
+@z
+=========================================================================
+
+To have all messages, coming from SI_TEX, displayed on screen
+and written to the log-file simultanously, we make the following,
+additional definitions.
+ temp nicht mehr vorhanden, in log ve„ndert.
+@x
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+@y
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+
+@d si_put(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog(#);
+ end
+@d si_put_ln(#) == @+ begin
+ if (file_offset<>0)or(term_offset<>0) then print_ln;
+ if selector<>log_only then wterm_ln(#);
+ if (selector=log_only)or(selector=term_and_log) then
+ wlog_ln(#);
+ end
+@d si_put_cr == print_ln
+
+
+@d dbg_put(#) == {}
+@d dbg_put_ln(#) == {}
+@d dbg_put_cr == {}
+@z
+=========================================================================
+
+We add a new primitive \nebenhyphenpenalty for setting the penalty of a
+minor hyphen:
+
+@x
+@d int_pars=55 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@y
+@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen}
+@d si_debug_code=56 {value is treated as an set of active debugging sections}
+@d supress_debug_mark_code=57 {same as above; if a section number is set, then
+ the output of the section number and the debugging output banner
+ of this section is supressed}
+@d int_pars=58 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@z
+-------------------------------------------------------------------------
+@x
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@y
+@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code)
+@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin
+ if not odd(int_par(supress_debug_mark_code)div #) then
+ begin
+ si_put_cr;
+ si_put_ln(' <* debugging output section #',#:#,' *>');
+ end; {marking supression}
+ { dig_count entfernt !!! }
+@d gubed_si == end
+@f si_debug == begin
+@f gubed_si == end
+@f gubed == nil
+
+
+@<Assign the values |depth_threshold:=show_box_depth|...@>=
+@z
+-------------------------------------------------------------------------
+@x
+othercases print("[unknown integer parameter!]")
+@y
+neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty");
+si_debug_code:print_esc("sidebug");
+supress_debug_mark_code:print_esc("supressdebugmark");
+othercases print("[unknown integer parameter!]")
+@z
+-------------------------------------------------------------------------
+@x
+@ @<Cases of |print_cmd_chr|...@>=
+@y
+primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/
+@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@>
+primitive("sidebug",assign_int,int_base+si_debug_code);
+primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code);
+@ @<Cases of |print_cmd_chr|...@>=
+@z
+
+=========================================================================
+
+As now hyphens may have different penalties, we must somehow associate
+a penalty with a discretionary node. We do this by allowing a penalty
+node as the first node in the prebreak list of a discretionary node.
+
+The following changes are in two case statements that check the nodes
+in the sublists of a discretionary node; we add an empty case for
+penalty nodes (two more case statements follow a little bit later).
+
+@x
+ othercases confusion("disc1")
+@y
+ penalty_node: ;
+ othercases confusion("disc1")
+@z
+-------------------------------------------------------------------------
+@x
+ othercases confusion("disc2")
+@y
+ penalty_node: ;
+ othercases confusion("disc2")
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The following change is in the line-break section, where try_break is
+given the penalty stored in the penalty node. This change is the reason
+for all other changes concerning penalties. Moreover, in this change
+a line break is suppressed if the discretionary node is actually
+a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break").
+
+@x
+begin s:=pre_break(cur_p); disc_width:=0;
+if s=null then try_break(ex_hyphen_penalty,hyphenated)
+else begin repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ try_break(hyphen_penalty,hyphenated);
+ act_width:=act_width-disc_width;
+ end;
+r:=replace_count(cur_p); s:=link(cur_p);
+while r>0 do
+ begin @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@y
+begin
+ s:=pre_break(cur_p); disc_width:=0;
+ if s=null then try_break(ex_hyphen_penalty,hyphenated)
+ else if (type(s)=penalty_node) and (link(s)=null) then begin
+ flush_node_list(s); s := null;
+ try_break(ex_hyphen_penalty,hyphenated); end
+ else if not is_dirty_umlaut(cur_p) then begin
+ if type(s)=penalty_node then s:=link(s);
+ repeat @<Add the width of node |s| to |disc_width|@>;
+ s:=link(s);
+ until s=null;
+ act_width:=act_width+disc_width;
+ if type(pre_break(cur_p))=penalty_node then begin
+ try_break(penalty(pre_break(cur_p)),hyphenated) end
+ else begin try_break(hyphen_penalty,hyphenated); end;
+ act_width:=act_width-disc_width;
+ end;
+ r:=replace_count(cur_p); s:=link(cur_p);
+ while r>0 do begin
+ @<Add the width of node |s| to |act_width|@>;
+ decr(r); s:=link(s);
+ end;
+ prev_p:=cur_p; cur_p:=s; goto done5;
+end
+
+@z
+
+=========================================================================
+
+Two more case statements.
+
+@x
+ othercases confusion("disc3")
+@y
+ penalty_node: ;
+ othercases confusion("disc3")
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ othercases confusion("disc4")
+@y
+ penalty_node: ;
+ othercases confusion("disc4")
+@z
+
+=========================================================================
+
+There's a little problem, converting a device independent (``.dvi'')
+to a post script file (``.ps''). I think that this program part could
+cause this problem. so let's see...
+
+!a <-- = --> @x With this, i want to try to reproduce this error.
+ Because, after i had inserted this change, that error didn`t occur
+ again!
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin if type(q)=disc_node then
+ @<Change discretionary to compulsory and set
+ |disc_break:=true|@>
+ else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end
+else begin q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @y
+@<Modify the end of the line...@>=
+q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false;
+if q<>null then {|q| cannot be a |char_node|}
+ if type(q)=glue_node then
+ begin delete_glue_ref(glue_ptr(q));
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+ goto done;
+ end
+ else begin
+ if type(q)=disc_node then begin
+ hyfdeb_b:=false;
+ if is_dirty_umlaut(q) then begin
+ si_debug(64) hyfdeb_b:=true; gubed_si;
+ si_put_cr;
+ si_put_ln(' ??? There's a line break at a dirty umlaut!?');
+ end;
+ if not hyfdeb_b then begin
+ @<Change discretionary to compulsory and set |disc_break:=true|@>
+ end;
+ end else
+ if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+ end else begin
+ q:=temp_head;
+ while link(q)<>null do q:=link(q);
+ end;
+@<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+done:
+!a <-- = --> @z
+
+
+=========================================================================
+
+If the break actually occurs, the penalty node is made a separate list
+with only one node, which is immediately flushed.
+
+@x
+begin s:=pre_break(q); link(q):=s;
+while link(s)<>null do s:=link(s);
+pre_break(q):=null; q:=s;
+end
+@y
+begin
+ s:=pre_break(q);
+ if type(s)=penalty_node then begin
+ s:=link(s);
+ link(pre_break(q)):= null;
+ flush_node_list(pre_break(q));
+ end;
+ link(q):=s;
+ while link(s)<>null do s:=link(s);
+ pre_break(q):=null; q:=s;
+end
+@z
+
+=========================================================================
+
+The type `array[0..65] of 0..256' is needed more often, so we make it
+an explicit type (see big SISISI change at end of change file). hc is
+now declared of this type.
+
+@x
+@!hc:array[0..65] of 0..256; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+@y
+@!hc:a_word; {word to be hyphenated}
+@!hn:small_number; {the number of positions occupied in |hc|}
+@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
+{ some variables for debugging output }
+@!hyfdeb_i,hyfdeb_j: integer;
+@!hyfdeb_b:boolean;
+@!si_p, si_q, si_r, si_s: pointer;
+@z
+
+-------------------------------------------------------------------------
+
+Our hyphenation routines need even more "more local variables".
+
+@x
+@ Hyphenation routines need a few more local variables.
+@y
+@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a
+ whatsit node occurs inbetween a word. This can happen due to
+ Partl's changes in ``german.sty'' }
+
+@ Hyphenation routines need a few more local variables.
+@z
+
+-------------------------------------------------------------------------
+
+@x
+@!j:small_number; {an index into |hc| or |hu|}
+@y
+@!qq:pointer;
+@!j:small_number; {two indices into |hc| or |hu|}
+@!jj:integer;
+@z
+
+=========================================================================
+
+The dirty_umlaut array must be initialized for each word.
+And we enable watching the node list, representing the word
+to be hyphenated.
+
+@x
+if s<>null then
+ begin @<Skip to node |ha|, or |goto done1| if no hyphenation
+@y
+si_p:=cur_p; si_q:=null;
+for jj:=-1 to 64 do dirty_umlaut[jj] := null;
+if s<>null then begin
+ si_debug(1)
+{ hyfdeb_i:=depth_threshold; depth_threshold:=100;
+ hyfdeb_j:=breadth_max; breadth_max:=100;
+}
+ show_node_list(si_p);
+{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; }
+ gubed_si;
+ @<Skip to node |ha|, or |goto done1| if no hyphenation
+@z
+
+-------------------------------------------------------------------------
+
+@x
+ hyphenate;
+ end;
+done1: end
+@y
+ hyphenate;
+ end;
+done1:
+si_debug(32)
+ hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max;
+ if si_q<>null then begin
+ depth_threshold:=100; {show all levels of a list}
+ breadth_max:=200; {show all nodes of one level of a list}
+ si_r:=link(si_q); link(si_q):=null;
+ end else begin
+ (* take the values, set by the user, for this variables! *)
+ breadth_max:=show_box_breadth; depth_threshold:=show_box_depth;
+ end;
+ show_node_list(si_p);
+ si_put_cr;
+ if si_q <> null then link( si_q ) := si_r;
+
+ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j;
+gubed_si;
+end
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Here, we add the SISISI-procedure abteilen for use in hyphenate and
+another label done1.
+
+@x
+procedure hyphenate;
+label common_ending,done,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@y
+
+@<Handling of dirty umlauts@>
+
+procedure hyphenate;
+label common_ending,done,done1,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+The prehyphenation loop must now also skip over the "dirty umlauts".
+
+@x
+loop@+ begin if is_char_node(s) then
+ begin c:=qo(character(s)); hf:=font(s);
+ end
+ else if type(s)=ligature_node then
+ if lig_ptr(s)=null then goto continue
+ else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then
+ begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end
+ else goto done1;
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@y
+loop@+ begin
+ if is_char_node(s) then begin
+ c:=qo(character(s)); hf:=font(s);
+ end else if type(s)=ligature_node then begin
+ if lig_ptr(s)=null then goto continue
+ else begin
+ q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q);
+ end
+ end else if is_dirty_umlaut(s) then begin
+ c:=get_char_of(s); hf:=get_font_of(s);
+ end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ goto continue;
+ end else goto done1;
+
+ if lc_code(c)<>0 then
+ if (lc_code(c)=c)or(uc_hyph>0) then goto done2
+@z
+
+=========================================================================
+
+MAIN CHANGE 2)
+
+The interface variables for the hyphenation are extended: hyfpen[i]
+holds the actual penalty of a hyphen at position i, hyf_disc[i]
+contains a "special discretionary" for triple-consonant-hyphens and
+ck-hyphens. hc_si is the word as given to the SISISI algorithm;
+hyf_si is returned from SISISI and contains markers for the hyphens.
+
+After this change, there are many changes where `odd(hyf[i])' is
+simply replaced by `hyfpen[i]<>inf_penalty'.
+
+Another procedure to be changed is `reconstitute': It now has to handle
+special dicretionary nodes. For a detailed feeling about the code changes
+in reconstitute, either (1) look through it bit by bit, or (2) ask Heini
+Hofstaedter.
+
+@x
+ end
+ else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@y
+ end else if is_dirty_umlaut(s) then begin
+ if get_font_of(s)<>hf then goto done3;
+ c:=get_char_of(s);
+ if lc_code(c)=0 then goto done3;
+ if hn=63 then goto done3;
+ hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c);
+ dirty_umlaut[hn]:=s;
+ for jj:=1 to replace_count(s) do s:=link(s);
+ end else if type(s)=whatsit_node then begin
+ @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>;
+ dirty_umlaut[-1]:=s;
+ end else if type(s)=ligature_node then
+ @<Move the characters of a ligature node to |hu| and |hc|;
+ but |goto done3| if they are not all letters@>
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+Also in the conversion loop (where the node list is shuffled into the
+hc array), we must skip a "dirty umlaut".
+
+@x
+loop@+ begin if not(is_char_node(s)) then
+ case type(s) of
+ ligature_node: do_nothing;
+@y
+loop@+ begin
+if not(is_char_node(s)) then
+ if is_dirty_umlaut(s) then begin
+ for jj:=1 to replace_count(s)-1 do s:=link(s);
+ end else
+ case type(s) of
+ ligature_node: do_nothing;
+@z
+
+=========================================================================
+
+Well, there are a lot of new variables that are necessary for the new
+hyphenation. Most of them are necessary for Heini's change in the
+reconstitute function, where now discretionary nodes for hyphens with
+more than one character (e.g. the german ck-hyphens or
+three-consonant-hyphens) can be inserted.
+
+@x
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+@y
+@!hyfpen:array [0..64] of integer; {penalties for possible discretionary
+ hyphens}
+@!hyf_si:trennvektor;
+@!hc_si:wort;
+@!hyf_disc:array [0..64] of pointer;
+
+@ @<Local variables for hyphenation@>=
+@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|}
+@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation}
+@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+
+@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|}
+@!add_char, {additional characters when hyphenating e.g.\
+ Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here
+ |add_char| = 1}
+@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| }
+@!spec_hyf: pointer; {special hyphen; causes different spelling of the
+ word, when it is hyphenated at this point}
+@!si_j:integer;
+@z
+
+=========================================================================
+
+An odd->inf_penalty change.
+
+@x
+for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1;
+@y
+for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1;
+@z
+
+=========================================================================
+
+The new variable hold_r is initialized (the kern node is a dummy node,
+as far as I can see).
+
+@x
+if is_char_node(ha) then
+ if font(ha)<>hf then goto found2
+@y
+hold_r := new_kern(1235); link(hold_r):=r;
+if is_char_node(ha) then
+ if font(ha)<>hf then goto found2
+@z
+
+=========================================================================
+
+Initialize some variables if the list starts with a "dirty umlaut".
+
+@x
+else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@y
+else if is_dirty_umlaut(ha) then begin
+ if get_font_of(ha) <> hf then goto found2
+ else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha);
+ end
+end else if type(ha)=ligature_node then
+ if font(lig_char(ha))<>hf then goto found2
+ else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
+@z
+
+=========================================================================
+
+MAIN CHANGE 3)
+
+unhinge all "dirty umlauts".
+
+@x
+common_ending: flush_node_list(r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@y
+common_ending:
+qq:=hold_r;
+for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin
+ while link(qq) <> dirty_umlaut[kk] do qq := link(qq);
+ qr := link(qq);
+ for i:=1 to replace_count(qr) do
+ if qr<>null then qr:=link(qr)
+ else begin {test:}
+ si_put_ln('...??..X --> ????? !');
+ end; {:test}
+ if qr<>null then begin
+ link(qq):=link(qr); link(qr):=null;
+ end else link(qq):=null;
+end;
+if dirty_umlaut[-1]<>null then begin
+ qq:=hold_r;
+ while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq);
+ if link(qq)=dirty_umlaut[-1] then begin
+ link(qq):=link(dirty_umlaut[-1]);
+ link(dirty_umlaut[-1]):=null;
+ end else begin
+ si_put(' *** ERROR: node list is damaged! ');
+ si_put_ln('(post hyphenation - unhinge a whatsit node)');
+ end;
+end;
+{}
+r:=hold_r;
+while link(r)<>null do begin
+ if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r)
+ else begin
+ wlog_cr; wterm_cr;
+ wlog_ln('???$ - ERROR in node list!');
+ wterm_ln('???$ - ERROR in node list!');
+ kk:=depth_threshold; l:=breadth_max;
+ depth_threshold:=100; breadth_max:=100;
+ show_node_list(hold_r);
+ link(r):=null;
+ depth_threshold:=kk; breadth_max:=l;
+ end;
+end;
+{}
+flush_node_list(hold_r);
+@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>;
+flush_list(init_list)
+@z
+
+------------------------------------------------------------------------
+
+Another odd->inf_penalty change (this time only textual).
+
+@x
+If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]|
+is odd and such that the result of |reconstitute| would have been different
+if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed|
+to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero.
+@y
+If there exists an index |k| in the range $j\le k\le m$ such that
+|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute|
+would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute|
+sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets
+|hyphen_passed| to zero.
+@z
+
+-------------------------------------------------------------------------
+
+In the reconstitute function, we set the boundary value n immediately
+before the next "dirty umlaut" by a simple for-loop starting at the
+original n.
+
+@x
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+@y
+@!ii:small_number;
+begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null;
+for ii:=n downto j do
+ if dirty_umlaut[ii] <> null then n:=ii-1;
+@z
+
+-------------------------------------------------------------------------
+
+Another odd->inf_penalty change.
+
+@x
+ if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char;
+@y
+ if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char;
+@z
+
+=========================================================================
+
+A first change in the reconstitute function.
+
+@x
+ else begin if hchar<non_char then if odd(hyf[j]) then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@y
+ else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then
+ begin hyphen_passed:=j; hchar:=non_char;
+ end;
+ if op_byte(q)<kern_flag then
+ @<Carry out a ligature replacement, updating the cursor structure
+@z
+
+
+-------------------------------------------------------------------------
+
+Now we are in the post-hyphenation's main loop; here must append a
+"dirty umlaut" to the growing node list. This is simply done by an
+if-statement that checks for the presence of a "dirty umlaut" and
+appends it.
+
+Moreover, we have another textual odd->inf_penalty change.
+
+@x
+repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+if hyphen_passed=0 then
+ begin link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if odd(hyf[j-1]) then
+ begin l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q
+
+@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is
+odd, when both branches of the previous discretionary end at position |j-1|.
+@y
+if dirty_umlaut[-1]<>null then begin
+ {hook in the previous saved whatsit node before the first
+ character of the hyphenated word}
+ link(s):=dirty_umlaut[-1];
+ s:=link(s);
+end;
+repeat
+ if dirty_umlaut[j]<>null then begin
+ link(s):=dirty_umlaut[j];
+ while link(s)>null do s:=link(s);
+ link(hold_head):=null;
+ j:=j+1; hyphen_passed:=0;
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1;
+ si_debug(16)
+ si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!');
+ gubed_si;
+ end;
+ end else begin
+ l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1;
+ if hyphen_passed=0 then begin
+ link(s):=link(hold_head);
+ while link(s)>null do s:=link(s);
+ if hyfpen[j-1]<>inf_penalty then begin
+ l:=j; hyphen_passed:=j-1; link(hold_head):=null;
+ end;
+ end;
+ end; {if dirty_umlaut[j]<>null then-else}
+ if hyphen_passed>0 then
+ @<Create and append a discretionary node as an alternative to the
+ unhyphenated word, and continue to develop both branches until they
+ become equivalent@>;
+until j>hn;
+link(s):=q;
+si_q:=s; {save the last node of the hyphenated word for debugging output}
+for j:=0 to 64 do if hyf_disc[j]<>null then begin
+ flush_node_list( hyf_disc[j]);
+end
+
+@ In this repeat loop we will insert another discretionary if
+|hyfpen[j-1]<>inf_penalty|, when both branches of the previous
+discretionary end at position |j-1|.
+@z
+
+=========================================================================
+
+Another odd->inf_penalty change.
+
+@x
+hyphen_passed:=j-1; link(hold_head):=null;
+until not odd(hyf[j-1])
+@y
+hyphen_passed:=j-1; link(hold_head):=null;
+until (hyfpen[j-1]=inf_penalty)
+@z
+
+=========================================================================
+
+Here comes the big reconstitution action (cheers to Heini!).
+
+@x
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char);
+if hyf_node<>null then
+ begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+ end;
+while l<=i do
+ begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@y
+As the value of |hyfpen[i]| is necessary for creating a penalty node,
+we must create this node before we ``kill'' the hyphenation information in
+|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the
+pointer to the penalty node or |null|, if no such node has been created.
+
+@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>=
+if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty)
+ then minor_tail:=new_penalty(hyfpen[i])
+ else minor_tail:=null;
+hyfpen[i]:=inf_penalty;
+pre_break(r):=minor_tail;
+
+hyf_node:=new_character(hf,hyf_char);
+{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|}
+xchg_k:=i;
+if hyf_disc[xchg_k]<>null then begin
+ spec_hyf:=pre_break(hyf_disc[xchg_k]);
+ add_char:=subtype(spec_hyf);
+ xchg_i:=1;
+ repeat
+ spec_hyf:=link(spec_hyf);
+ if spec_hyf<>null then begin
+ xchg_char[xchg_i]:=qo(character(spec_hyf));
+ incr(xchg_i);
+ end;{if}
+ until spec_hyf=null;
+ if hyf_node<>null then begin
+ xchg_char[xchg_i]:=hyf_char;
+ free_avail(hyf_node);
+ end else decr(xchg_i);
+ xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first
+ character is replaced by a character of the
+ |pre_break|-list of |spec_hyf|}
+ for xchg_k:=1 to xchg_i do begin
+ xchg_char[0]:=hu[xchg_hu];
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ xchg_char[xchg_k]:=xchg_char[0];
+ incr(xchg_hu);
+ end; {|for|}
+ xchg_k:=i;
+ i:=xchg_hu-1;
+ xchg_hu:=xchg_hu-xchg_i;
+end {|if hyf_disc[]<>null|}
+else if hyf_node<>null then begin
+ incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node);
+end;
+while l<=i do begin
+ l:=reconstitute(l,i,font_bchar[hf],non_char)+1;
+ if link(hold_head)>null then
+ begin if minor_tail=null then pre_break(r):=link(hold_head)
+@z
+
+-------------------------------------------------------------------------
+
+... continued:
+
+@x
+if hyf_node<>null then
+ begin hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@y
+ if hyf_disc[xchg_k]<>null then begin
+{ Restore the original word in |hu| }
+ i:=xchg_k; l:=i+1;
+ for xchg_k:=1 to xchg_i do begin
+ hu[xchg_hu]:=xchg_char[xchg_k];
+ incr(xchg_hu);
+ end;{for}
+ end else if hyf_node<>null then begin
+ hu[i]:=c; {restore the character in the hyphen position}
+ l:=i; decr(i);
+ end
+
+@z
+
+=========================================================================
+
+MAIN CHANGE 1)
+
+Finally, we come to the SISISI hyphenation. At first, we define two
+variables:
+
+@x
+@ Assuming that these auxiliary tables have been set up properly, the
+@y
+@!funktioniert: boolean;
+@!zerleg: integer;
+
+@ Assuming that these auxiliary tables have been set up properly, the
+@z
+
+-------------------------------------------------------------------------
+
+And off we go; at first only slowly, ...
+
+@x
+@<Find hyphen locations for the word in |hc|...@>=
+@y
+{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!}
+
+
+@<Find hyphen locations for the word in |hc|...@>=
+@z
+
+-------------------------------------------------------------------------
+
+... but now we kill all of Liang's code and replace it by some re- and
+back-en- and decoding, a call to abteilen, and the construction of the
+special discretionaries. Then we go right into the SISISI hyphenation.
+=========================================================================
+@x
+if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|}
+hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters}
+for j:=0 to hn-r_hyf+1 do
+ begin z:=trie_link(cur_lang+1)+hc[j]; l:=j;
+ while hc[l]=qo(trie_char(z)) do
+ begin if trie_op(z)<>min_quarterword then
+ @<Store \(m)maximum values in the |hyf| table@>;
+ incr(l); z:=trie_link(z)+hc[l];
+ end;
+ end;
+found: for j:=0 to l_hyf-1 do hyf[j]:=0;
+for j:=0 to r_hyf-1 do hyf[hn-j]:=0
+
+@ @<Store \(m)maximum values in the |hyf| table@>=
+begin v:=trie_op(z);
+repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v];
+if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v];
+v:=hyf_next[v];
+until v=min_quarterword;
+end
+
+@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is
+@y
+ for j:=0 to hn do
+ hc_si[j] := ktab[hc[j]];
+ si_debug(2)
+ si_put(' hc:');
+ for j:=0 to hn do si_put( xchr[hc[j]] );
+ si_put_ln(':');
+ si_put(' hc_si:');
+ for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] );
+ si_put_ln(':');
+ gubed_si;
+ si_debug(4)
+ si_put_ln('< decimal character codes >');
+ si_put(' hc:');
+ for j:=0 to hn do begin
+ si_put(hc[j]:3,'-');
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr;
+ si_put(' hc_si:');
+ for j:=0 to hn do begin
+ si_put( rev_tab[hc_si[j]]:3,'-' );
+ if ((j+1) mod 16)=0 then begin
+ si_put_cr; si_put(' ');
+ end;
+ end;
+ si_put_cr; si_put_cr;
+ gubed_si;
+
+ abteilen(hc_si,hyf_si,hn,funktioniert,zerleg);
+ for j:=0 to 64 do begin
+ hyf_disc[j]:=null; hyfpen[j]:=inf_penalty;
+ end;
+ if funktioniert then
+ for j:=0 to hn do begin
+ if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty
+ else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty
+ else if hyf_si[j]=nebenck then begin
+ hyfpen[j+1] := neben_hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j+1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s);
+ subtype(s):=0; { number of additional characters }
+ link(s):=new_character(hf,hu[j+2]); {'k' oder'K'}
+ link(link(s)):=null;
+ s:=hyf_disc[j+1];
+ post_break(s):=null; link(s):=null;
+ end
+ else if hyf_si[j]=haupt3 then begin
+ hyfpen[j-1]:=hyphen_penalty;
+ s:=get_node(small_node_size); {discretionary node erzeugen}
+ type(s):=disc_node;
+ hyf_disc[j-1]:=s;
+ {|pre_break|-Liste: }
+ pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s);
+ subtype(s):=1;
+ link(s):=new_character(hf,hu[j]); { Dreifachkonsonant }
+ link(link(s)):=null;
+ {|post_break|- und |link|-Liste: }
+ s:=hyf_disc[j-1];
+ post_break(s):=null;
+ link(s):=null;
+ end
+ end; {|if funktioniert|}
+ si_debug(8)
+ if funktioniert then begin
+ for j:=0 to hn do
+ if hyfpen[j]<>inf_penalty then begin
+ if hyf_disc[j]<>null then begin
+ if subtype(pre_break(hyf_disc[j]))=0 then
+ si_put( xchr[hu[j+1]], '-' )
+ else {if subty...}
+ si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' );
+ { i hope so }
+ end else begin
+ si_put( xchr[hu[j]] );
+ if hyfpen[j]=hyphen_penalty then
+ si_put('=')
+ else si_put('-');
+ end;
+ end else begin
+ si_put( xchr[hu[j]] );
+ end;
+ end else begin
+ si_put_ln(' no hyphens were found in this word!');
+ end;
+ si_put_cr;
+ gubed_si;
+ goto done1;
+
+found:
+hyfpen[0]:=inf_penalty;
+for j:=1 to hn do
+ if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty
+ else hyfpen[j]:=inf_penalty;
+
+done1:
+
+@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe
+dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort
+nach Trennstellen zu untersuchen und die gefundenen Trennstellen in
+hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen
+einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im
+INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT
+F\"UR PRAKTISCHE INFORMATIK.
+
+Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem
+Start von TeX aufgerufen werden.
+
+@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen|
+n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang
+ausgef\"uhrt werden sollen.
+
+@<Set initial values of ...@>=
+ inittrennen;
+
+@ @<Constants in the outer block@>=
+ maxwl = 64; { Maximale Wortlaenge }
+ sonderzeichen= 0;
+ bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7;
+ bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14;
+ bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21;
+ bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27;
+ bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31;
+ keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5;
+
+ tabsize = 8191; { 2**13 - 1 }
+ spec_letter_ID = 4321;
+ { const definitionen }
+ vok_a = 1;
+ vok_e = 2;
+ vok_i = 3;
+ vok_o = 4;
+ vok_u = 5;
+ vok_ae = 6;
+ vok_oe = 7;
+ vok_ue = 8;
+ vok_ie = 9;
+ vok_ai = 10;
+ vok_ei = 11;
+ vok_au = 12;
+ vok_aeu= 13;
+ vok_eu = 14;
+ vok_y = 15;
+ kons = 16;
+
+@
+@<Types in the outer block@>=
+ string80 = packed array [0..80] of eight_bits;
+ buchstabe = eight_bits;
+ a_word = array[0..maxwl] of 0..256;
+ wort = a_word;
+ sperrvektor=array [0..maxwl] of boolean;
+ dudt=array [0..maxwl] of boolean;{frueher kein type !!}
+ { trennung = (keine, neben, nebenck, haupt, haupt3); }
+ trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==>
+ zwischen Buchstabe i und i+1 wird getrennt }
+ ktabtype = packed array [0..255] of buchstabe;
+ verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C }
+ varr = array [0..maxwl] of verdschlue;
+ intarr = array [0..maxwl] of integer;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ infotype = record
+ { frueher ein variantenRecord }
+ ausnahme:boolean;
+ untrennbar:boolean;
+ { erste :0..7;
+ zweite:0..7; }
+ erste :integer;
+ zweite:integer;
+ endung,vorsilbe,stamm,ehervor,stammallein:boolean;
+ end;
+
+ infobyte = eight_bits;
+
+ { darf nicht als var Parameter uebergeben werden !!}
+ tableentry=record
+ tabv:verdschlue;
+ tabb:infobyte;
+ frei:boolean;
+ wiederfrei:boolean;
+ end;
+
+ hashelement = packed array [0..3] of eight_bits;
+ htabtype = packed array [0..tabsize] of hashelement;
+
+@
+@<Global variables@>=
+ ktab : ktabtype;
+ htab : htabtype;
+ anzahl : integer;
+ hashfile : alpha_file;
+ kombtab : array [1..5, 1..5] of integer;
+ konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]}
+ rev_tab: array[0..255]of integer;
+
+
+@ Prozedurdefinitionen
+
+function dig_count( v: integer): integer;
+ { calculates the number of decimal digits of ``v'' }
+ var x, e, c: integer;
+begin
+ x := v div 10; e:=1; c:=1;
+ while e<=x do begin
+ e := e * 10; incr(c);
+ end;
+ dig_count:=c;
+end;
+
+@<Handling of dirty umlauts@>=
+
+procedure hashfunk (var w:wort; anfang,ende:integer;
+ var v:varr; var ind,k:intarr );
+
+ { -PRAK!- in C long statt integer }
+ var vacc, indacc, kacc : integer;
+ i : integer;
+begin
+ vacc := 31415; indacc := 152; kacc := 271;
+dbg_put_ln(' * HFNC =');
+ for i := anfang to ende do begin
+dbg_put(' * HFNC ',i-anfang:3,' A');
+ vacc := (vacc * 31 + w [i]) mod 8388648;
+dbg_put('B');
+ v[i] := vacc;
+dbg_put('C');
+ indacc := (indacc * 33 + w[i]) mod (tabsize+1);
+dbg_put('D');
+ ind[i] := indacc;
+dbg_put('E');
+ kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2);
+dbg_put('F');
+ k[i] := 2*kacc + 1;
+dbg_put_ln('G');
+ end; {|for|}
+end; {|hashfunk|}
+
+procedure unpackinfo ( b:infobyte;
+ { var i:infotype }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean );
+begin
+ { with i do begin }
+ if odd(b) then begin { 87654321 }
+ iausnahme:= true;
+ b:= b div 2; { 08765432 }
+ if odd(b) then iuntrennbar:= true
+ else iuntrennbar:= false;
+ b:=b div 2; { 00876543 }
+ ierste := b mod 8; { 00876xxx }
+ izweite := b div 8; { 00000876 }
+ end else begin
+ iausnahme:= false; { 87654321 }
+ b:= b div 2; { 08765432 }
+ if odd(b) then iendung:= true
+ else iendung:= false;
+ b:= b div 2; { 00876543 }
+ if odd(b) then ivorsilbe:= true
+ else ivorsilbe:= false;
+ b:= b div 2; { 00087654 }
+ if odd(b) then istamm:= true
+ else istamm:= false;
+ b:= b div 2; { 00008765 }
+ if odd(b) then iehervor:= true
+ else iehervor:= false;
+ b:= b div 2; { 00000876 }
+ if odd(b) then istammallein:= true
+ else istammallein:= false;
+ end; {|if-then-else|}
+ { end; |with|}
+end; {|unpackinfo|}
+
+
+procedure unpackentry( h:hashelement;
+ { var e:tableentry }
+ var etabv:verdschlue;
+ var etabb:infobyte;
+ var efrei:boolean;
+ var ewiederfrei:boolean );
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' ==> UPCKNTY 1');
+ etabv:= h[0]+h[1]*256+h[2]*256*256;
+dbg_put(' 2');
+ if odd(h[3]) then begin { Ausnahme }
+dbg_put(' 3 A');
+ etabb:= h[3];
+dbg_put('1');
+ efrei:= false;
+ ewiederfrei:= false;
+ end
+ else begin
+dbg_put(' 3 B');
+ etabb:= h[3] mod 64;
+dbg_put('1');
+ { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher
+ nicht ver„ndert werden. }
+dbg_put('2');
+ { durch folgende 2 Abfragen ersetzt. -PRAK!- }
+ if odd(h[3] div 64) then efrei := true
+ else efrei := false;
+ if odd(h[3] div 128) then ewiederfrei := true
+ else ewiederfrei := false;
+ end;
+dbg_put_ln('- 4');
+ { end; |with|}
+end; {|unpackentry|}
+
+
+procedure hashsuch ( v:verdschlue;
+ ind,k : integer;
+ { var i:infotype; }
+ var iausnahme :boolean;
+ var iuntrennbar :boolean;
+ var ierste :integer;
+ var izweite :integer;
+ var iendung :boolean;
+ var ivorsilbe :boolean;
+ var istamm :boolean;
+ var iehervor :boolean;
+ var istammallein:boolean;
+ var g:boolean );
+
+{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden }
+ var
+ gef,ngef:boolean;
+ j:integer;
+ entry : tableentry;
+
+begin
+ gef := false; ngef := false; j := ind;
+ repeat
+ unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+ if entry.frei then ngef := true
+ else if (v = entry.tabv) and not entry.wiederfrei then begin
+ unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite,
+ iendung,ivorsilbe,istamm,iehervor,istammallein);
+ gef := true;
+ end else
+ j := (j+k) mod (tabsize + 1)
+ until gef or ngef;
+ g := gef;
+end; {|hashsuch|}
+
+
+procedure hashload ( var status:integer );
+{ einlesen der Hash-Tabelle von file fn }
+ var i : integer;
+ e : tableentry;
+begin
+ { Orginal sitex3.cha -PRAK!-
+ for i:=1 to file_name_size do name_of_file:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ if a_open_in(hashfile) then begin
+ }
+
+ { geaendert !! -PRAK!- }
+ for i:=1 to file_name_size do name_of_file[i]:= ' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length := 3;
+ anzahl := 0;
+ { -PRAK!- texinputpath fr C notwendig }
+ if a_open_in(hashfile, TEX_INPUT_PATH) then begin
+ for i := 0 to tabsize do begin
+ { -PRAK!- in C Probleme mit den typen beim einlesen }
+ read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of }
+ read (hashfile, htab[i][1]); { hashelement, und }
+ read (hashfile, htab[i][2]); { hashelement = packed array 0..3 }
+ read (hashfile, htab[i][3]);
+ unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei);
+ if not e.frei and not e.wiederfrei then anzahl := anzahl + 1;
+ end; {|for|}
+ status:= 0;
+ a_close(hashfile);
+ end else status:= 1;
+end; {|hashload|}
+
+
+procedure inittrennen;
+ var ch: 0..255;
+ bst: buchstabe;
+ i, status: integer;
+ is_iniTeX: boolean;
+begin
+ { Konversionstabelle |ktab| initialisieren }
+ { ======================================== }
+
+ for ch := 0 to 255 do begin
+
+ { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then }
+
+ case ch of
+ " ",",",";",":","-","/","?","!","(",")",".","""","'","^":
+
+ if ch="." then ktab[ch]:= "."
+ else ktab[ch] := trennzeichen
+ { else ktab[ch] := sonderzeichen geht nicht !!}
+ end; { case }
+
+if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen;
+
+ end; { for }
+ for bst := bst_a to bst_z do begin
+ ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst;
+ ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst
+ end;
+
+ { Umlaute und scharfes s - f\"ur ``production \TeX version'' }
+ ktab[255]:=bst_sz;
+ ktab[246]:=bst_oe;
+ ktab[252]:=bst_ue;
+ ktab[228]:=bst_ae;
+
+ { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' }
+ ktab["1"]:=bst_sz;
+ ktab["2"]:=bst_ue;
+ ktab["3"]:=bst_oe;
+ ktab["4"]:=bst_ae;
+ ktab[25]:=bst_sz; {?-wieso? HH}
+
+{testing:}
+for i:=0 to 255 do rev_tab[ktab[i]]:=i;
+rev_tab[ktab[255]]:=223;
+xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246);
+xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223);
+{:end of testing}
+
+ { Kombinationstabelle |kombtab| initialisieren }
+ { ============================================ }
+ { Diese Tabelle muss symetrisch sein,
+ kombtab[a,b] = kombtab[b,a] }
+ kombtab[ keine, keine] := keine;
+ kombtab[ keine, neben] := keine;
+ kombtab[ keine,nebenck] := keine;
+ kombtab[ keine, haupt] := keine;
+ kombtab[ keine, haupt3] := keine;
+
+ kombtab[ neben, keine] := keine;
+ kombtab[ neben, neben] := neben;
+ kombtab[ neben,nebenck] := keine;
+ kombtab[ neben, haupt] := neben;
+ kombtab[ neben, haupt3] := keine;
+
+ kombtab[nebenck, keine] := keine;
+ kombtab[nebenck, neben] := keine;
+ kombtab[nebenck,nebenck] := nebenck;
+ kombtab[nebenck, haupt] := keine;
+ kombtab[nebenck, haupt3] := keine;
+
+ kombtab[ haupt, keine] := keine;
+ kombtab[ haupt, neben] := neben;
+ kombtab[ haupt,nebenck] := keine;
+ kombtab[ haupt, haupt] := haupt;
+ kombtab[ haupt, haupt3] := keine;
+
+ kombtab[ haupt3, keine] := keine;
+ kombtab[ haupt3, neben] := keine;
+ kombtab[ haupt3,nebenck] := keine;
+ kombtab[ haupt3, haupt] := keine;
+ kombtab[ haupt3, haupt3] := haupt3;
+
+ { Konsonantentabelle initialisieren }
+ for bst:=bst_a to bst_sz do konsonant[bst] := true;
+ konsonant[bst_a] := false;
+ konsonant[bst_e] := false;
+ konsonant[bst_i] := false;
+ konsonant[bst_o] := false;
+ konsonant[bst_u] := false;
+ konsonant[bst_ae] := false;
+ konsonant[bst_oe] := false;
+ konsonant[bst_ue] := false;
+
+
+{ ================== Hashtabelle |htab| initialisieren ======================
+
+Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf
+keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob
+dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig
+davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf
+(production-version) von \TeX ist.
+
+=============================================================================}
+ is_iniTeX:=false;
+ init is_iniTeX:=true; tini
+ if not is_iniTeX then begin
+ hashload(status);
+ if status <> 0 then begin
+ si_put_cr;
+ si_put_ln
+(' * * * * * * * * * *!');
+ si_put_ln('**** ERROR: Can not read hash-file!');
+ si_put_cr;
+ jump_out;
+ end;
+ end; {|not iniTeX|}
+end; {|inittrennen|}
+
+
+procedure packinfo ( i:infotype; var b : infobyte );
+{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ }
+{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / }
+
+begin
+ b:=0;
+dbg_put_cr;
+ { with i do begin }
+ if i.ausnahme then
+begin
+dbg_put(' ### PCKINF 1A utr:');
+if i.untrennbar then dbg_put('Y') else dbg_put('N');
+dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3);
+ b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite
+; dbg_put('B');
+end
+ else
+begin
+dbg_put(' ### PCKINF 2A');
+ b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor)
+ +32*ord(i.stammallein);
+dbg_put('B');
+end;
+ { end; with }
+dbg_put_ln('-3');
+end; {|packinfo|}
+
+procedure packentry( e:tableentry; var h:hashelement );
+{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ }
+
+begin
+ { with e do begin }
+dbg_put_cr;
+dbg_put(' +++ PCKNTY A');
+ h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx}
+dbg_put('B');
+ e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh}
+dbg_put('C');
+ h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx}
+dbg_put('D');
+ h[2]:= e.tabv div 256; { 000000000000000087654321}
+
+dbg_put('E');
+ if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! }
+ else
+begin
+dbg_put('F1');
+ h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx }
+dbg_put('-2');
+end;
+dbg_put_ln('G');
+ { end; |with|}
+end; {|packentry|}
+
+
+
+procedure hashetr ( var w:wort; laenge:integer; i:infotype;
+ var g:boolean );
+
+ var v1: varr;
+ ind1, k1: intarr;
+ v: verdschlue;
+ ii,ind, k, j, e: integer;
+ gef,ngef:boolean;
+ entry: tableentry;
+ helem: hashelement;
+
+begin
+dbg_put_ln(' ** HTR 1');
+ if anzahl >= tabsize then begin
+dbg_put_ln(' ** HTR 2a');
+ g := false;
+ end
+ else begin
+dbg_put_ln(' ** HTR 2b');
+ if (anzahl < 10) or (anzahl mod 100 = 0) then begin
+ si_put_cr; si_put(' -Anzahl:',anzahl,'. ');
+ end;
+dbg_put_ln(' ** HTR 3');
+ hashfunk(w,1,laenge,v1,ind1,k1);
+dbg_put_ln(' ** HTR 4');
+ v := v1[laenge];
+ ind := ind1[laenge];
+ k := k1[laenge];
+ gef := false; ngef := false;
+ repeat
+dbg_put_ln(' ** HTR 5 A');
+ unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei);
+dbg_put_ln(' ** HTR B');
+ if entry.frei or entry.wiederfrei then begin
+ anzahl := anzahl + 1;
+ ngef := true;
+ entry.tabv := v;
+dbg_put_ln(' ** HTR C1');
+ packinfo (i,entry.tabb);
+dbg_put_ln(' ** HTR D1');
+ entry.frei := false;
+ entry.wiederfrei := false;
+dbg_put_ln(' ** HTR E1');
+ packentry(entry,helem);
+dbg_put_ln(' ** HTR F1');
+ for ii := 0 to 3 do
+ htab[ind][ii] := helem[ii];
+ end else begin
+dbg_put_ln(' ** HTR C2');
+ gef := v = entry.tabv;
+ if not gef then ind := (ind+k) mod (tabsize + 1);
+dbg_put_ln(' ** HTR D2');
+ end;
+ until gef or ngef;
+dbg_put_ln(' ** HTR 6');
+ g := ngef;
+ end
+end; {|hashetr|}
+
+procedure hashempty;
+ var i,j:integer;
+ elem : tableentry;
+ he : hashelement;
+begin
+ { with elem do begin }
+ elem.tabv:=0;
+ elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen.
+ ( Und dies ist eine Beleidigung fuer jeden Affen ) HM }
+ elem.frei := true;
+ elem.wiederfrei := false;
+ { end; }
+ packentry (elem, he);
+ for i := 0 to tabsize do
+ for j := 0 to 3 do
+ htab[i][j] := he[j];
+ anzahl := 0;
+end; {|hashempty|}
+
+procedure hashsave (var status:integer);
+{ abspeichern der Hash-Tabelle auf file }
+ var i: integer;
+begin
+ for i:=1 to file_name_size do name_of_file[i]:=' ';
+ name_of_file[1]:='h';
+ name_of_file[2]:='f';
+ name_of_file[3]:='3';
+ name_length:=3;
+ if a_open_out(hashfile) then begin
+ for i := 0 to tabsize do begin
+ write (hashfile, htab[i][0]:4);
+ write (hashfile, htab[i][1]:4);
+ write (hashfile, htab[i][2]:4);
+ write (hashfile, htab[i][3]:4);
+ write_ln (hashfile);
+ end;
+ status:=0;
+ a_close(hashfile);
+ end else status:=1;
+end; {|hashsave|}
+
+
+function hashsize :integer;
+begin
+ hashsize:=anzahl;
+end;
+
+
+procedure zahl(line:string80;var i:integer; ende:integer; var j:integer);
+ var aus: boolean;
+begin
+ j:=0;
+ repeat
+ if i<=ende then
+ if ktab[line[i]]="." then i:=i+1
+ else aus:=true
+ else aus:=true
+ until aus;
+ repeat
+ if i<=ende then begin
+ { if line[i] in ["0".."9"] then begin }
+ case line[i] of
+ "0","1","2","3","4","5","6","7","8","9":
+ begin j:=10*j+line[i]-"0";i:=i+1
+ end;
+ { else aus:=true geht nicht !!! }
+ end;
+ if (line[i] <> "0") and
+ (line[i] <> "1") and
+ (line[i] <> "2") and
+ (line[i] <> "3") and
+ (line[i] <> "4") and
+ (line[i] <> "5") and
+ (line[i] <> "6") and
+ (line[i] <> "7") and
+ (line[i] <> "8") and
+ (line[i] <> "9") then aus :=true;
+ end else aus:=true
+ until aus;
+end; {|zahl|}
+
+
+procedure infobau(line: string80; anfang,ende: integer;
+ { var inform: infotype;}
+ var informausnahme :boolean;
+ var informuntrennbar :boolean;
+ var informerste :integer;
+ var informzweite :integer;
+ var informendung :boolean;
+ var informvorsilbe :boolean;
+ var informstamm :boolean;
+ var informehervor :boolean;
+ var informstammallein:boolean;
+ var g: boolean);
+
+ var i,j:integer;ok,fehler:boolean;
+ b:buchstabe;
+begin
+ g:=false;
+ { with inform do begin } { initialisierung }
+ informausnahme:=false;
+ informendung:=false;
+ informvorsilbe:=false;
+ informehervor:=false;
+ informstamm:=false;
+ informstammallein:=false;
+ i:=anfang; ok:=false; fehler:=false;
+ repeat
+ if i<=ende then
+ if line[i]="." then i:=i+1 else ok:=true
+ else fehler:=true
+ until ok or fehler;
+ if not fehler then begin
+ b:=ktab[line[i]];
+ if b = bst_a then begin
+ {ausnahme}
+ informausnahme:=true;
+ i:=i+1;
+ if ktab[line[i]] = bst_u then begin
+ i := i + 1; informuntrennbar := true;
+ end else informuntrennbar := false;
+ zahl(line,i,ende,j);
+ if j=0 then begin
+ informerste:=7; informzweite:=7;
+ { Record-komponente ``zweite'' wird }
+ { initialisiert, damit beim packen keine }
+ { undefinierten Ergebnisse entstehen (die u.U. zu }
+ { RUN-TIME-ERRORS f\"uhren k\"onnen!) }
+ end else begin
+ j:=j-2;
+ if (j>=0) and (j<=6) then informerste:=j
+ else fehler:=true;
+ zahl(line,i,ende,j);
+ if j=0 then informzweite:=7
+ else begin
+ j:=j-informerste-4;
+ if (j>=0) and (j<=6) then informzweite:=j
+ else fehler:=true;
+ end;
+ end;
+ if not fehler then g:=true;
+ end {|if b = bst_a |}
+ else begin
+ ok:=false;
+ repeat
+ case b of
+ {bst_v} 22: informvorsilbe:=true;
+ {bst_e} 5: informendung:=true;
+ {bst_s} 19: informstamm:=true;
+ {bst_b} 2: informehervor:=true;
+ {bst_t} 20: informstammallein:=true;
+ {trennzeichen} 31:;
+ othercases fehler:=true
+ endcases;
+ if i=ende then ok:=true
+ else begin
+ i:=i+1;
+ b:=ktab[line[i]]
+ end
+ until ok or fehler;
+ if not fehler then
+ g := (informvorsilbe or informendung or informstamm)
+ and (not informehervor or informvorsilbe and informendung)
+ and (not informstammallein or informstamm);
+ end; {|if b = bst_a then-else|}
+ end {|if not fehler|}
+ { end |with inform|}
+end; {|infobau|}
+
+
+procedure eintragen (line: string80; l: integer );
+ var i, laenge: integer;
+ inform: infotype;
+ w: wort;
+ g: boolean;
+begin
+ laenge := 1;
+ while line [laenge] <> "." do laenge := laenge + 1;
+ laenge := laenge -1;
+ if laenge >= 1 then begin
+ if laenge <= maxwl then begin
+ infobau(line,laenge+1,l,
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,g);
+
+ if not g then begin
+ si_put_cr; si_put(' Info falsch: ')
+ end else begin
+ for i:= 1 to laenge do w[i]:=ktab[line[i]];
+ hashetr(w,laenge,inform,g);
+ if not g then begin
+ si_put_cr; si_put(' Tabellenfehler: ');
+ end;
+ end;
+ if not g then begin
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge <= maxwl|}
+ else begin
+ si_put_cr; si_put_ln(' zu langes Wort: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+ end {|if laenge >= 1|}
+ else begin
+ si_put_cr; si_put_ln(' Falsche Zeile: ');
+ for i:=1 to l do si_put( xchr[line[i]] );
+ si_put_cr;
+ end
+end; {|eintragen|}
+
+{---------------------------------------------------------------------------}
+
+{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) }
+
+procedure naechsterbst(var i:integer;var tr:trennvektor;
+ var dudstop:sperrvektor;var b:buchstabe;
+ var w:wort);
+ begin
+ if (i>0) and (tr[i]=keine) and not dudstop[i]
+ then begin b:=w[i];i:=i-1 end
+ else b:=trennzeichen
+ end;
+{---------------------------------------------------------------------------}
+{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) }
+
+ procedure duden (tr:trennvektor;
+ var w:wort;
+ var tr1 :trennvektor;
+ var dudtr:trennvektor;
+ dud :dudt; { array [0..maxwl] of boolean; }
+ var dudstop:sperrvektor;
+ laenge : integer;
+ var ok :boolean;
+ var zerlegungen:integer );
+
+ { traegt in dudtr die Trennstellen nach Dudenregeln ein }
+
+ { frueher mtype laut = (.....) }
+
+ var i:integer;
+ j:integer;
+ zust:integer;
+ aus:boolean;
+ tre:integer;
+ letzte:integer;
+ l,lalt:integer;{ vormals laut }
+ b:buchstabe;
+
+
+ begin { duden }
+ i:=laenge;
+ for j := 0 to laenge do dudtr[j] := tr[j];
+ while (i>0) and not dud [i] do i:=i-1;
+ while i>0 do begin
+ zust:=1; aus:=false; letzte := 0;
+ l:=kons;
+ b:=w[i];
+ i:=i-1;
+ repeat
+ {naechsten Laut lesen}
+ { procedure nlaut; }
+ begin { nlaut }
+ tre:=i+1;
+ lalt:=l;
+ case b of
+ {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_e } 5:begin
+ l:=vok_e; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_i then begin
+ l:=vok_ie;
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin
+ {ungetbst = } i := i + 1;
+ l:=vok_e;
+ b := bst_i;
+ end;
+ end
+ end;
+ {bst_i} 9:begin
+ l:=vok_i; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_u} 21:begin
+ l:=vok_u; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end
+ else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end
+ end;
+ {bst_t} 20:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_h} 8:begin
+ l:=kons; naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_c then begin
+ naechsterbst(i,tr,dudstop,b,w);
+ if b = bst_s then naechsterbst(i,tr,dudstop,b,w)
+ end
+ else if b = bst_p then naechsterbst(i,tr,dudstop,b,w)
+ else if b = bst_t then naechsterbst(i,tr,dudstop,b,w)
+ end;
+ {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m,
+ bst_n, bst_p,
+ bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz }
+
+ 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 :
+
+ begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end;
+ {bst_y} 25:begin
+ l:=vok_y;
+ naechsterbst(i,tr,dudstop,b,w);
+ end;
+ {trennzeichen,sonderzeichen}
+ 31,0 :aus:=true
+ end;
+ end; { nlaut }
+
+ if not aus then
+ {Naechster Zustand}
+ case zust of
+ 1:if l=kons then zust:=2
+ else zust:=4;
+ 2:if l<>kons then zust:=3;
+ 3:if l=kons then zust:=6
+ else if l<>lalt then begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end;
+ 4:if l=kons then zust:=6
+ else zust:=3;
+ 6:if l=kons then begin
+ zust:=2;
+ letzte:=tre;
+ if (w[tre]=bst_c) and (w[tre+1] = bst_k) then
+ dudtr[letzte]:=nebenck
+ else dudtr[letzte]:=neben
+ end
+ else begin
+ zust:=4;
+ letzte:=tre;
+ dudtr[letzte]:=neben
+ end
+ end
+ until aus;
+ if zust=2 then dudtr[letzte]:=keine
+ else if zust=4 then
+ { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then }
+ if (lalt < vok_ie) or (lalt > vok_eu) then
+ dudtr[letzte]:=keine;
+ while (i>0) and not dud[i] do i:=i-1
+ end;
+ end { duden };
+{---------------------------------------------------------------------------}
+{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor;
+ var ok1 : boolean);
+}
+
+ procedure trennen (
+ { trennen }
+ zustand : integer;
+ anfang : integer;
+ spv : sperrvektor;
+ var ok1 : boolean;
+ { abteilen }
+ var tr :trennvektor;
+ var dudtr:trennvektor;
+ var zerlegungen:integer ;
+ var dud:dudt; { array [0..maxwl] of boolean; }
+ var v:varr;
+ var ind,k:intarr;
+ var dudstop:sperrvektor;
+ { abteilen aufruf }
+ var w:wort;
+ var tr1:trennvektor;
+ laenge : integer );
+
+ { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen,
+ rechts muss noch ein Stamm kommen.
+ 2 ... Es kann Endung, Vorsilbe oder Stamm kommen.
+ 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden,
+ rechts muss noch ein Stamm kommen.
+ 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken
+ Teil muessen noch Trennstellen eingefuegt werden.
+ 5 ... Trennstelle mit entfallenem Konsonanten }
+
+ var
+ gef, nichtok:boolean;
+ schnitt:integer;
+ inform:infotype;
+ i:integer;
+ ok_stamm, ok_vor, ok_end, ok_help:boolean;
+ tri:integer;
+ { p_stamm }
+ i1,tre:integer;
+ ok : boolean;
+ stop_ptr :integer;
+ spvtmp :sperrvektor; { lokale Kopie des Sperrvektors,
+ fr die bersetzung nach C notwendig.
+ -PRAK!- }
+
+ { procedure p_endung(var endok:boolean); }
+
+ { procedure p_vorsilbe(var vorok:boolean); }
+
+ { procedure p_stamm(var stok:boolean); }
+
+ { procedure p_stammallein (var staok:boolean); }
+
+ begin { trennen }
+ for i := 0 to maxwl do
+ spvtmp[i] := spv[i];
+ ok1:=false;
+ if anfang = laenge + 1
+ then { Ende des Wortes erreicht}
+ if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten }
+ begin
+ dud[anfang-1]:=true;
+
+ {duden(tr);}
+ duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen);
+
+ for i := laenge downto 1 do
+ begin
+ if dudtr[i-1] = haupt3 then
+ begin
+ dudtr[i-1] := keine;
+ tri := haupt3;
+ end
+ else
+ tri := dudtr[i];
+
+ if zerlegungen = 0 then
+ tr1[i] := tri
+ else
+ tr1[i] := kombtab[tr1[i],tri];
+ end;
+ zerlegungen:=zerlegungen+1;
+ ok1:= true
+ end
+ else { kein Stamm im Wortrest ok1 = false }
+ else { restlichen Teil zerschneiden }
+ begin
+ hashfunk (w,anfang,laenge,v,ind,k);
+ schnitt := laenge;
+ nichtok := false;
+ repeat
+ { links abschneiden }
+ repeat
+ if spv[schnitt] then { Schnittstelle gesperrt }
+ gef:=false
+ else
+ begin
+ hashsuch (v[schnitt],ind[schnitt],k[schnitt],
+ inform.ausnahme,inform.untrennbar,
+ inform.erste,inform.zweite,inform.endung,
+ inform.vorsilbe,inform.stamm,inform.ehervor,
+ inform.stammallein,gef);
+ end;
+ if gef then
+ spv[schnitt]:=true
+ else
+ schnitt := schnitt - 1
+ until gef or (schnitt = anfang - 1);
+
+ if gef then { teilwortanfang ist bekanntes wort }
+ begin
+ if not inform.ausnahme then
+ begin
+ if inform.endung and (zustand=2) then
+ begin
+
+ { --- p_endung(ok_end); --- }
+ ok_end:=false;
+ if (w[anfang]=bst_c) or (w[anfang]=bst_h) then
+ begin
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=neben
+ end;
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv[schnitt+1]:=true;
+ trennen (2, schnitt+2, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_help
+ end;
+ trennen (2, schnitt+1, spv, ok_help,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_end := ok_end or ok_help;
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_endung(ok_end) - ende --- }
+
+ ok1 := ok1 or ok_end
+ end
+ else
+ ok_end:=false;
+ if inform.vorsilbe
+ then begin
+
+ { --- p_vorsilbe(ok_vor); --- }
+ { Trennstelle(n) vor der Vorsilbe eintragen }
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt;
+ end;
+ { Trennstellen innerhalb der Vorsilbe eintragen }
+ dud[schnitt]:=true;
+ { Rest des Wortes zerschneiden }
+ trennen(1, schnitt+1, spv, ok_vor,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ dud[schnitt]:=false;
+ { --- p_vorsilbe(ok_vor) - ende --- }
+
+ ok1 := ok1 or ok_vor
+ end
+ else
+ ok_vor := false;
+ if inform.stamm and not ok_vor
+ then begin
+ if not inform.stammallein
+ then begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true
+ end
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end
+ else
+ if (anfang=1) and (schnitt=laenge)
+ then begin
+
+ { --- p_stammallein(ok_stamm); --- }
+ dud[anfang-1]:=true;
+ tr[anfang-1]:=haupt;
+ trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ {eingetragene Trennstellen loeschen}
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ { --- p_stammallein(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+ end
+ end
+ else begin
+
+ { --- p_stamm(ok_stamm); --- }
+ ok_stamm := false;
+ stop_ptr := 0;
+
+ if zustand = 1 then
+ tr[anfang-1]:=neben
+ else begin
+ dud[anfang-1]:=true;
+ if zustand = 5 then
+ tr[anfang-1] := haupt3
+ else
+ tr[anfang-1]:=haupt
+ end;
+ {ev. Ausnahmetrennstellen eintragen}
+ if inform.ausnahme then begin
+ if inform.erste<>7 then begin
+ tre:=anfang+inform.erste+1;
+ tr[tre]:=neben;
+ if inform.zweite<>7 then begin
+ tre:=tre+inform.zweite+2;
+ if inform.untrennbar then begin
+ stop_ptr := tre;
+ dudstop[stop_ptr] := true;
+ end
+ else
+ tr[tre]:=neben
+ end
+ else begin
+ if inform.untrennbar then begin
+ tr[tre] := keine;
+ stop_ptr := tre;
+ dudstop[tre]:=true;
+ end
+ end
+ end
+ else begin {inform.erste = 7}
+ stop_ptr := schnitt-1;
+ dudstop[stop_ptr] := true;
+ end;
+ end;
+
+ { Fugen 's' bevorzugen }
+ if schnitt < laenge then
+ if (w[schnitt+1] = bst_s) and not spv[schnitt+1]
+ then begin
+ spv [schnitt+1] := true;
+ trennen (2, schnitt+2, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_help
+ end;
+
+ { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts }
+ if (schnitt >=2) and (schnitt < laenge) then
+ if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and
+ (w[schnitt] = w[schnitt-1]) then begin
+ trennen(5, schnitt, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+ end;
+
+ { restlichen Teil zerschneiden }
+ trennen (2, schnitt+1, spv, ok_help,tr,dudtr,
+ zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+ ok_stamm := ok_stamm or ok_help;
+
+ { eingetragene Trennstellen entfernen }
+ if inform.ausnahme then
+ for i1:=anfang-1 to schnitt do
+ begin
+ tr[i1]:=keine;
+ dud[i1]:=false;
+ dudstop[stop_ptr] := false;
+ end
+ else begin
+ tr[anfang-1]:=keine;
+ dud[anfang-1]:=false;
+ end;
+ { --- p_stamm(ok_stamm) - ende --- }
+
+ ok1 := ok1 or ok_stamm;
+ end;
+
+ {naechsten Schleifendurchlauf vorbereiten}
+ schnitt := schnitt - 1;
+ nichtok := schnitt = anfang - 1
+ end
+ else { kein bekanntes Wort am Beginn des Teilwortes }
+ nichtok := true;
+
+ until nichtok
+ end;
+ for i := 0 to maxwl do
+ spv[i] := spvtmp[i]; {spv wiederherstellen, C Version. -PRAK!- }
+ end { trennen };
+
+{----------------------------------------------------------------------------}
+
+procedure abteilen ( var w:wort; var tr1:trennvektor;
+ laenge : integer; var ok:boolean;
+ var zerlegungen:integer );
+
+ label 99;
+
+ { kommt in den outer Block }
+ { mtype sperrvektor=array [0..maxwl] of boolean; }
+
+ var
+ i:integer;
+ dud:dudt; { array [0..maxwl] of boolean; }
+ v:varr;
+ ind,k:intarr;
+ spv,dudstop:sperrvektor;
+ tr, dudtr:trennvektor;
+
+ begin { abteilen }
+ tr1[0] := keine;
+ for i:=0 to laenge do begin
+ tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false;
+ if i > 0 then
+ if (w[i] = trennzeichen) or (w[i] = sonderzeichen)
+ then begin
+ zerlegungen := 0;
+ ok := false;
+ goto 99;
+ end;
+ end;
+ zerlegungen:=0;
+ trennen(3, 1, spv, ok,
+ tr,dudtr,zerlegungen,dud,v,ind,k,
+ dudstop,w,tr1,laenge);
+
+ for i:=0 to laenge do
+ if tr1[i]=nebenck then begin
+ tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- }
+ tr1[i-1]:=nebenck; {sprechend getrennt wird }
+ end;
+99:
+ end;{ abteilen }
+{----------------------------------------------------------------------------}
+
+ {identification number for dirty umlauts; see description in
+ change file}
+
+ function is_dirty_umlaut(p:pointer):boolean;
+ var res:boolean;
+ q:pointer;
+ begin
+ res:=false;
+ if p<>null then
+ if type(p)=disc_node then
+ if pre_break(p)<>null then
+ if link(pre_break(p))<>null then
+ if link(link(pre_break(p)))<>null then begin
+ q:=pre_break(p);
+ if type(q)=penalty_node then q:=link(q);
+ if (type(q)=kern_node)and(width(q)=spec_letter_ID)and
+ is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true;
+ end;
+ is_dirty_umlaut:=res;
+ end; {|is_dirty_umlaut|}
+
+ function get_char_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_char_of:=width(link(link(q)));
+ end; {|get_char_of|}
+
+ function get_font_of(s:pointer):integer;
+ var q:pointer;
+ begin
+ q:=pre_break(s);
+ if type(q)=penalty_node then q:=link(q);
+ get_font_of:=font(link(q));
+ end; {|get_font_of|}
+
+{----------------------------------------------------------------------------}
+
+@ Ende ...
+@z
+
+=========================================================================
+
+@x
+@ Now let's go back to the easier problem, of building the linked
+trie. When \.{INITEX} has scanned the `\.{\\patterns}' control
+sequence, it calls on |new_patterns| to do the right thing.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+label done, done1;
+var k,@!l:small_number; {indices into |hc| and |hyf|}
+@!digit_sensed:boolean; {should the next digit be treated as a letter?}
+@!v:quarterword; {trie op code}
+@!p,@!q:trie_pointer; {nodes of trie traversed during insertion}
+@!first_child:boolean; {is |p=trie_l[q]|?}
+@!c:ASCII_code; {character being inserted}
+begin if trie_not_ready then
+ begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+ @<Enter all of the patterns into a linked trie, until coming to a right
+ brace@>;
+ end
+else begin print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@y
+@ We do not build a trie (wether a linked nor a packed). Instead, we
+create a hash table for the \SISISI-hyphenation algorithm. But we
+still use the data provided by the `\.{\\patterns}' primitive.
+
+@<Declare procedures for preprocessing hyph...@>=
+procedure new_patterns; {initializes the hyphenation pattern data}
+ label done;
+ var k: small_number; {index into |zeile|}
+ @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle }
+ @!status:integer;
+ @!c:ASCII_code; {character being inserted}
+begin
+ if trie_not_ready then begin
+ set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}}
+
+ hashempty; { create the empty hash table }
+ @<Enter all of the patterns into a hash table, until coming to a right
+ brace; then skip an optional space@>;
+ hashsave(status);
+ if status<>0 then begin
+ wterm_ln('Fehler bei hash save !!!!!'{?});
+ wlog_ln( 'Fehler bei hash save !!!!!'{?});
+ end;
+ end else begin
+ print_err("Too late for "); print_esc("patterns");
+ help1("All patterns must be given before typesetting begins.");
+ error; link(garbage):=scan_toks(false,false); flush_list(def_ref);
+ end;
+end;
+@z
+
+
+--------------------------------------------------------------------------
+
+
+@x
+@ Novices are not supposed to be using \.{\\patterns}, so the error
+messages are terse. (Note that all error messages appear in \TeX's string
+pool, even if they are used only by \.{INITEX}.)
+
+@<Enter all of the patterns into a linked trie...@>=
+k:=0; hyf[0]:=0; digit_sensed:=false;
+loop@+ begin get_x_token;
+ case cur_cmd of
+ letter,other_char:@<Append a new letter or a hyphen level@>;
+ spacer,right_brace: begin if k>0 then
+ @<Insert a new pattern into the linked trie@>;
+ if cur_cmd=right_brace then goto done;
+ k:=0; hyf[0]:=0; digit_sensed:=false;
+ end;
+ othercases begin print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end
+ endcases;
+ end;
+done:
+@y
+@ Here we build the hash table for the \SISISI-hyphenation.
+
+@<Enter all of the patterns into a hash table, until coming to a right...@>=
+for k:=0 to maxwl do zeile[k]:=" ";
+k:=0;
+loop@+ begin
+ get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'.
+ Der Beistrich wird eigens abgefragt, da er in TeX
+ umdefiniert werden kann. }
+ if (cur_cmd = right_brace)or(cur_chr = ",") then
+ begin
+ { Ein Eintrag der Worttabelle - letzter
+ (|cur_cmd|=|right_brace|) - gelesen }
+ if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden }
+ if cur_cmd = right_brace then goto done;
+ k := 0; { hyf[] ist \"uberfl\"ussig, da die
+ Trenninformation in zeile mitverpackt ist. }
+ end
+ else { Das Wort ist noch nicht fertig gelesen }
+ if (cur_cmd = letter) or (cur_cmd = other_char)
+ or (cur_cmd = spacer) or (cur_chr = ".")
+ then begin
+ @<Append a new letter or a hyphen level@>;
+ end else begin
+ print_err("Bad "); print_esc("patterns");
+@.Bad \\patterns@>
+ help1("(See Appendix H.)"); error;
+ end;
+end; {|loop|}
+done:
+@z
+
+-----------------------------------------------------------------------------
+
+
+@x
+@ @<Append a new letter or a hyphen level@>=
+if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then
+ begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter}
+ else begin cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then
+ begin print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error;
+ end;
+ end;
+ if k<63 then
+ begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false;
+ end;
+ end
+else if k<63 then
+ begin hyf[k]:=cur_chr-"0"; digit_sensed:=true;
+ end
+@y
+@ @<Append a new letter or a hyphen level@>=
+if (cur_chr<>" ")then begin
+ { Das Leerzeichen wird \"uberlesen! }
+ if (cur_chr <> ".") then begin
+ { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten }
+ if (cur_chr<"0")or(cur_chr>"9") then begin
+ cur_chr:=lc_code(cur_chr);
+ if cur_chr=0 then begin
+ print_err("Nonletter");
+@.Nonletter@>
+ help1("(See Appendix H.)"); error; cur_chr:=128;
+ end;
+ end;
+ end;
+ if k<63 then begin
+ incr(k); zeile[k]:=cur_chr;
+ end;
+end;
+@z
+
+----------------------------------------------------------------------------
+
+
+@x
+@ When the following code comes into play, the pattern $p_1\ldots p_k$
+appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots
+n_k$ appears in |hyf[0..k]|.
+
+@<Insert a new pattern into the linked trie@>=
+begin @<Compute the trie op code, |v|, and set |l:=0|@>;
+q:=0; hc[0]:=cur_lang;
+while l<=k do
+ begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true;
+ while (p>0)and(c>so(trie_c[p])) do
+ begin q:=p; p:=trie_r[q]; first_child:=false;
+ end;
+ if (p=0)or(c<so(trie_c[p])) then
+ @<Insert a new trie node between |q| and |p|, and
+ make |p| point to it@>;
+ q:=p; {now node |q| represents $p_1\ldots p_l$}
+ end;
+if trie_o[q]<>min_quarterword then
+ begin print_err("Duplicate pattern");
+@.Duplicate pattern@>
+ help1("(See Appendix H.)"); error;
+ end;
+trie_o[q]:=v;
+end
+@y
+@ Well, that was everything about the initialization of the \SISISI hash
+table (at this place).
+
+All following sections, describing the initialization of the trie are
+replaced by ``empty sections'' in order to have same section numbering
+in SI\TeX as in \TeX.
+@z
+
+----------------------------------------------------------------------------
+
+@x
+@ @<Insert a new trie node between |q| and |p|...@>=
+begin if trie_ptr=trie_size then overflow("pattern memory",trie_size);
+@:TeX capacity exceeded pattern memory}{\quad pattern memory@>
+incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0;
+if first_child then trie_l[q]:=p@+else trie_r[q]:=p;
+trie_c[p]:=si(c); trie_o[p]:=min_quarterword;
+end
+@y
+@ ``Empty section''.
+@z
+------------------------------------------------------------------------------
+@x
+@ @<Compute the trie op code, |v|...@>=
+if hc[1]=0 then hyf[0]:=0;
+if hc[k]=0 then hyf[k]:=0;
+l:=k; v:=min_quarterword;
+loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v);
+ if l>0 then decr(l)@+else goto done1;
+ end;
+done1:
+@y
+@ Further ``empty section''.
+@z
+
+@x
+@ Finally we put everything together: Here is how the trie gets to its
+final, efficient form.
+The following packing routine is rigged so that the root of the linked
+tree gets mapped into location 1 of |trie|, as required by the hyphenation
+algorithm. This happens because the first call of |first_fit| will
+``take'' location~1.
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+var @!p:trie_pointer; {pointer for initialization}
+@!j,@!k,@!t:integer; {all-purpose registers for initialization}
+@!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+@!h:two_halves; {template used to zero out |trie|'s holes}
+begin @<Get ready to compress the trie@>;
+if trie_root<>0 then
+ begin first_fit(trie_root); trie_pack(trie_root);
+ end;
+@y
+@ Because we do not use the trie, we fill it with dummy data.
+But the main reason, why we do not remove this procedure is, that
+it is called and the used variables are referenced somewhere in \TeX.
+
+
+@<Declare procedures for preprocessing hyphenation patterns@>=
+procedure init_trie;
+ var @!p:trie_pointer; {pointer for initialization}
+ @!j,@!k,@!t:integer; {all-purpose registers for initialization}
+ @!r,@!s:trie_pointer; {used to clean up the packed |trie|}
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+begin
+ trie_root:=0;
+@z
+
+=========================================================================
+
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch
new file mode 100644
index 0000000000..8508485c3a
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch
@@ -0,0 +1,1938 @@
+% Change file for TeX in C, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ../ChangeLog.W2C and ChangeLog)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting, 1986.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}'
+@y
+@d banner=='This is TeX, C Version 3.141 (+SISISI 1.0) {+iSi 92}'
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size is set from the system constant.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:ISITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == PATH_MAX
+
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=100000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=15000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=100000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=124000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=24000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns}
+@!neg_trie_op_size=-750; {for lower trie_op_hash array bound}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='isitex.pool'; {name comes from \.{site.h}.}
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constants, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above), since to needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name) +1 ] := ' ';
+name_length := strlen (pool_name);
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read ISITEX3.POOL.')
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read isitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! isitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! isitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! isitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin slow_print(format_ident); print_ln;
+ end;
+@y
+if format_ident>0 then slow_print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ slow_print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.104] `remainder' is a library routine on some systems, so change
+% its name to avoid conflicts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@y
+@d remainder == tex_remainder
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in
+% the basic version.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] We've put the memory structure into the include file
+% `texmf.h', since it's too hard to translate automatically. Also,
+% remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "texmfmem.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.519] In pack_file_name, leave room for the extra null we append at
+% the end of a filename in make_c_string.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.523] Change to pack_buffered_name as with pack_file_name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.532] `logname' is declared in <unistd.h> on some systems.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+@y
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+
+@d log_name == texmf_log_name
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.534] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try with |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ {Don't add |".tex"| if it's already there,
+ don't overflow |name_of_file|,
+ and don't add |".tex"| if |"foo"| and |"foo.tex"| are really the same
+ file, because of operating-system filename length limitations (e.g.,
+ |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ {Try without |".tex"|.}
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+@z
+
+% Knuth should fix this bug.
+@x
+if term_offset+length(name)>max_print_line-2 then print_ln
+@y
+if term_offset+length(name)>max_print_line-3 then print_ln
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Fix TFM file opening.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened:=false;
+pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+@x
+@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code}
+@y
+@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.?] Hack around the negative lower bound here.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+The hash table is called |trie_op_hash|, and the number of entries it contains
+is |trie_op_ptr|.
+
+@<Glob...@>=
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size+trie_op_size)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] A casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+@x
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name; {Try with |".tex"|.}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name; {Try without |".tex"|.}
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+@y
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other
new file mode 100644
index 0000000000..de3a033662
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other
@@ -0,0 +1,1965 @@
+% tex.ch for C compilation with web2c, derived from various other change files.
+% By Tim Morgan, UC Irvine ICS Department, and many others.
+%
+% Modification history:
+% (05/28/86) ETM Started with TeX 2.0
+% (06/03/87) ETM Brought up to TeX 2.2
+% (09/26/87) ETM Brought up to TeX 2.3
+% (10/01/87) ETM Brought up to TeX 2.5
+% (12/21/87) ETM Brought up to TeX 2.7
+% (01/14/88) ETM Brought up to TeX 2.9
+% (02/20/88) PAM Revised format and module numbers
+% (03/01/88) ETM Eliminated some unused variables and unnecesary tests
+% (05/09/88) ETM Added yet another casting bug fix
+% (06/21/88) ETM Brought up to TeX version 2.93
+% (12/11/88) ETM Brought up to TeX version 2.94
+% (01/12/89) PAM Brought up to TeX version 2.95
+% (02/14/89) ETM Brought up to TeX version 2.96
+% (03/10/89) ETM Brought up to TeX version 2.98
+% (07/06/89) ETM Brought up to TeX version 2.991
+% (11/30/89) KB To version 2.992 (8-bit).
+% (01/10/90) SR To version 2.993.
+% (03/27/90) KY To version 3.0.
+% (more recent changes in ChangeLog)
+%
+% The module numbers in this change file refer to the published text in
+% TeX: The Program, Volume B of Computers&Typesetting.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}'
+@y
+@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}' {more is printed later}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Actually the heading shown here is not quite normal: The |program| line
+does not mention any |output| file, because \ph\ would ask the \TeX\ user
+to specify a file name if |output| were specified here.
+@^system dependencies@>
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+
+@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:}
+@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'}
+@f type==true {but `|type|' will not be treated as a reserved word}
+
+@p @t\4@>@<Compiler directives@>@/
+program TEX; {all file names are defined dynamically}
+@z
+
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+ {key control points}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+% Here we change these WEB symbols, which are used much as #ifdef's
+% are in C, into something which will get translated into actual #ifdef's.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] Same, for `init..tini'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] Turn off all compiler directives.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] Compile-time constants: some enlarged, dvi_buf_size 16K for
+% BSD I/O, file_name_size is set from the system constant.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Constants...@>=
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:ISITEX3.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@d file_name_size == PATH_MAX
+
+@<Constants...@>=
+@!mem_max=262140; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=3000; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=100000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=15000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=100000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=124000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=30000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX. This much is
+ needed for English, German, and Portuguese.}
+@!trie_op_size=751; {space for ``opcodes'' in the hyphenation patterns;
+ should be relatively prime to 313, 361, and 1009, and prime.}
+@!neg_trie_op_size=-751; {for lower |trie_op_hash| array bound;
+ must be equal to |-trie_op_size|.}
+@!min_trie_op=0; {first possible trie op code for any language}
+@!max_trie_op=500; {largest possible trie op code for any language}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!pool_name='isitex.pool';
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|,
+ equal to |mem_max| in \.{INITEX}, else not greater than |mem_max|}
+@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] Sensitive compile-time constants. For C we change mem_base and
+% hi_mem_base to reflect our use of 0-origin vs pc's use of
+% negative-origin. Despite the fact that it is a ``sensitive''
+% constant, we're going to make mem_top a #define in the C code for
+% readability and ease of modification (it's up above) -- it needs
+% to be changed for the trip test.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=9500 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for `incr' and `decr'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] The text_char type is used as an array index into xord. The
+% default type `char' produces signed integers, which are bad array
+% indices in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d text_char == char {the data type of characters in text files}
+@y
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] Allow any character as input.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] Remove file types we don't need.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] Do file opening in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions are defined in C.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] Do file closing in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all the file closing routines as well.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Do `input_ln' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We define |input_ln| in C, for efficiency.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] `term_in' and `term_out' are standard input and output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] We don't need to open terminal files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting
+any command line arguments the user has provided. It's defined in C.
+
+@d t_open_out == {output already open for text output}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] Flushing output.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an |fflush| (via the macro |flush|). |clear_terminal| is redefined
+to do nothing, since the user should control the terminal.
+@^system dependencies@>
+
+@d update_terminal == flush (term_out)
+@d clear_terminal == do_nothing
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] Reading the command line.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin t_open_in;
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+ if loc<last then
+ begin init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out,'Please type the name of your input file.');
+ end;
+exit:end;
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+
+@p
+function init_terminal:boolean; {gets the terminal input started}
+label exit;
+begin
+ t_open_in;
+ if last > first then begin
+ loc := first;
+ while (loc < last) and (buffer[loc]=' ') do
+ incr(loc);
+ if loc < last then begin
+ init_terminal := true;
+ goto exit;
+ end;
+ end;
+ loop@+begin
+ wake_up_terminal; write(term_out, '**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then begin {this shouldn't happen}
+ write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do
+ incr(loc);
+
+ if loc<last then begin
+ init_terminal:=true;
+ return; {return unless the line was all blank}
+ end;
+ write_ln(term_out, 'Please type the name of your input file.');
+ end;
+exit:
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] Open the pool file using a path, and can't do string
+% assignments directly. (`strcpy' and `strlen' work here because
+% `pool_name' is a constant string, and thus ends in a null and doesn't
+% start with a space.)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy (name_of_file+1, pool_name); {copy the string}
+name_of_file[0] := ' ';
+name_of_file[strlen (pool_name) +1 ] := ' ';
+name_length := strlen (pool_name);
+if a_open_in (pool_file, TEX_POOL_PATH) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how
+% it's read.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read ISITEX3.POOL.')
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read isitex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! isitex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m); read(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! isitex.pool line doesn''t begin with two digits.');
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! isitex.pool check sum doesn''t have nine digits.');
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61] Eliminate the misleading message ``(no format preloaded)''.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+wterm(banner);
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin slow_print(format_ident); print_ln;
+ end;
+@y
+wterm (banner);
+wterm (version_string);
+if format_ident>0 then slow_print(format_ident);
+print_ln;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto, since C doesn't have them.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it `uexit' because there's a WEB symbol called
+% `exit' already. We use a C macro to change `uexit' back to `exit'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] Implement the switch-to-editor option.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+line ready to be edited. But such an extension requires some system
+wizardry, so the present implementation simply types out the name of the
+file that should be
+edited and the relevant line number.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@y
+line ready to be edited.
+We do this by calling the external procedure |call_edit| with a pointer to
+the filename, its length, and the line number.
+However, here we just set up the variables that will be used as arguments,
+since we don't want to do the switch-to-editor until after TeX has closed
+its files.
+@^system dependencies@>
+
+There is a secret `\.D' option available when the debugging routines haven't
+been commented~out.
+@^debugging@>
+@d edit_file==input_stack[base_ptr]
+@z
+@x
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ slow_print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+@y
+"E": if base_ptr>0 then
+ begin
+ edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=str_start[edit_file.name_field+1] -
+ str_start[edit_file.name_field];
+ edit_line:=line;
+ jump_out;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.104] `remainder' is a library routine on some systems, so change
+% its name to avoid conflicts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@y
+@d remainder == tex_remainder
+@<Glob...@>=
+@!arith_error:boolean; {has arithmetic overflow occurred recently?}
+@!remainder:scaled; {amount subtracted to get an exact division}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Define glue_ratio in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to change constants. Do not increase
+% max_quarterword without changing the memoryword structure in
+% `texmfmem.h'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==262143 {largest allowable value in a |halfword|}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+The inner loop of \TeX\ will run faster with respect to compilers
+that don't optimize expressions like `|x+0|' and `|x-0|', if these
+macros are simplified in the obvious way when |min_quarterword=0|.
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] We've put the memory structure into the include file
+% `texmf.h', since it's too hard to translate automatically. Also,
+% remove the `word_file' type.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
+@!halfword=min_halfword..max_halfword; {1/2 of a word}
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@!quarterword=min_quarterword..max_quarterword;
+@!halfword=min_halfword..max_halfword;
+@!two_choices = 1..2; {used when there are two variants in a record}
+@!four_choices = 1..4; {used when there are four variants in a record}
+@=#include "texmfmem.h";@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change `mem' to `zmem', so we can define mem to be a register
+% pointer to the memory array for speed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C.
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] Fix the word `free' so that it doesn't conflict with the
+% standard C library routine of the same name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+@y
+been included. (You may want to decrease the size of |mem| while you
+@^debugging@>
+are debugging.)
+
+@d free==free_arr
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174,176] Eliminate some unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+ print_char("*")
+@y
+ begin if (font(p)>font_max) then
+ print_char("*")
+@z
+
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+begin if p>mem_end then print_esc("CLOBBERED.")
+else begin if (font(p)>font_max) then print_char("*")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.186] Don't worry about strange floating point values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if glue_sign(p)=shrinking then print("- ");
+ if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
+ else if abs(g)>float_constant(20000) then
+@y
+ if glue_sign(p)=shrinking then print("- ");
+ { The Unix |pc| folks removed this restriction with a remark that
+ invalid bit patterns were vanishingly improbable, so we follow
+ their example without really understanding it.
+ |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')|
+ |else| }
+ if fabs(g)>float_constant(20000) then
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] Do `fix_date_and_time' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+@^system dependencies@>
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+@ The following procedure, which is called just before \TeX\ initializes its
+input and output, establishes the initial values of the date and time.
+It calls a macro-defined |date_and_time| routine. |date_and_time|
+in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+@^system dependencies@>
+
+@d fix_date_and_time==date_and_time(time,day,month,year)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.262] Remove more unsigned comparisons to zero.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@y
+else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.513] Area and extension rules for filenames.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\.>' or `\.:', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the first
+remaining `\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep track
+of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
+@!ext_delimiter:pool_pointer; {the relevant `\..', if any}
+@y
+@ The file names we shall deal with for illustrative purposes have the
+following structure: If the name contains `\./', the file area
+consists of all characters up to and including the final such character;
+otherwise the file area is null. If the remaining file name contains
+`\..', the file extension consists of all such characters from the last
+`\..' to the end, otherwise the file extension is null.
+@^system dependencies@>
+
+We can scan such file names easily by using two global variables that keep
+track of the occurrences of area and extension delimiters:
+
+@<Glob...@>=
+@!area_delimiter:pool_pointer; {the most recent `\./', if any}
+@!ext_delimiter:pool_pointer; {the most recent `\..', if any}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TeX area directories.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+In C, the default paths are specified in a separate
+file, \.{site.h}. The file opening procedures do path searching
+based either on those default paths, or on paths given by the user
+in environment variables.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c=">")or(c=":") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+else begin str_room(1); append_char(c); {contribute |c| to the current string}
+ if (c="/") then
+ begin area_delimiter:=cur_length; ext_delimiter:=0;
+ end
+ else if c="." then ext_delimiter:=cur_length;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.519] In pack_file_name, leave room for the extra null we append at
+% the end of a filename in make_c_string.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] The default format.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. Also, the
+length will be set in the main program.
+
+@d format_area_length=0 {length of its area part}
+@d format_ext_length=4 {length of its `\.{.fmt}' part}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] Where `plain.fmt' is.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!format_default_length: integer;
+@!TEX_format_default: c_char_pointer;
+
+@ We set the name of the default format file and the length of that name
+in C, instead of Pascal, since we want them to depend on the name of the
+program.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.523] Change to pack_buffered_name as with pack_file_name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if k<=file_name_size then name_length:=k@+else name_length:=file_name_size;
+@y
+if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] Format file opening: only try once, with path searching.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ pack_buffered_name(0,loc,j-1); {try first without the system file area}
+ if w_open_in(fmt_file) then goto found;
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+ pack_buffered_name(0,loc,j-1);
+ if w_open_in(fmt_file) then goto found;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% (still [29.524]) replace `PLAIN' in error messages with `default'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ wterm_ln('Sorry, I can''t find that format;',' will try the default.');
+@z
+@x
+ wterm_ln('I can''t find the PLAIN format file!');
+@.I can't find PLAIN...@>
+@y
+ wterm_ln('I can''t find the default format file!');
+@.I can't find default format...@>
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.532] `logname' is declared in <unistd.h> on some systems.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+@y
+ship out a box of stuff, we shall use the macro |ensure_dvi_open|.
+
+@d log_name == texmf_log_name
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.536] Adjust for C string conventions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+
+@x
+begin wlog(banner);
+slow_print(format_ident); print(" ");
+print_int(day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@y
+begin wlog (banner);
+wlog (version_string);
+slow_print(format_ident); print(" ");
+print_int(day); print_char(" ");
+months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Use a path when calling a_open_in to do a \input; also, try
+% to open the file with and without the `.tex' extension, regardless of
+% whether the file already has an extension. This allows filenames like
+% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_ext="" then cur_ext:=".tex";
+pack_cur_name;
+loop@+ begin begin_file_reading; {set up |cur_file| and new level of input}
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+pack_cur_name; {Try with |".tex"|.}
+loop@+begin
+ begin_file_reading; {set up |cur_file| and new level of input}
+ {Don't add |".tex"| if it's already there,
+ if it would overflow |name_of_file|,
+ or if |"foo"| and |"foo.tex"| are really the same
+ file, because of operating-system filename length limitations (e.g.,
+ |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+
+ {Try without |".tex"|.}
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name;
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+
+ {Couldn't find the file. Put |".tex"| back into the filename if we
+ removed it, and then invoke an external program. If it succeeds, try
+ opening the file once more.}
+ if cur_ext = "" then begin
+ cur_ext := ".tex";
+ pack_cur_name;
+ end;
+ if make_tex_tex then begin
+ if a_open_in (cur_file, TEX_INPUT_PATH) then goto done;
+ end;
+@z
+
+% Knuth should fix this -- sometimes lines go over the |max_print_line|.
+% I don't remember what caused this, so I'll comment this out until it
+% happens again.
+% @x
+% if term_offset+length(name)>max_print_line-2 then print_ln
+% @y
+% if term_offset+length(name)>max_print_line-3 then print_ln
+% @z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] Get rid of return of filename to string pool.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Don't use font_area's in TFM opening, and invoke an external
+% program if the first open fails.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+file_opened:=false;
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+if not b_open_in(tfm_file) then abort;
+file_opened:=true
+@y
+file_opened := false;
+pack_file_name (nom, aire, ".tfm");
+if not b_open_in(tfm_file) then begin
+ if make_tex_tfm then begin
+ if not b_open_in(tfm_file) then abort;
+ end else
+ abort;
+end;
+file_opened:=true
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] Reading the tfm file. As a special case, whenever we open a
+% tfm file, we read its first byte into `tfm_temp' right away. TeX
+% looks at `fbyte' before calling `fget', so it ends up seeing every
+% byte. This is Pascal-like I/O.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] We only want `eof' on the TFM file to be true if we
+% previously had EOF, not if we're at EOF now. This is like `feof', and
+% unlike our implementation of `eof' elsewhere.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if eof(tfm_file) then abort;
+@y
+if feof(tfm_file) then abort;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+In C, we use a macro to call |fwrite| or |write| directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+repeat if type(r)<>delta_node then
+ begin line_diff:=line_number(r)-best_line;
+@y
+repeat if type(r)<>delta_node then
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.920,921,923,924] Allow larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
+since most of the |n|'s are generally zero. Therefore the number sequences
+are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
+If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|.
+@y
+The theory that comparatively few different number sequences $n_0\ldots n_k$
+actually occur, since most of the |n|'s are generally zero, seems to fail
+at least for the large German hyphenation patterns.
+Therefore the number sequences cannot any longer be encoded in such a way
+that |trie_op|$(z_k)$ is only one byte long.
+We have introduced a new constant |max_trie_op| for the maximum allowable
+hyphenation operation code value; |max_trie_op| might be different for
+\TeX\ and \.{INITEX} and must not exceed |max_halfword|.
+An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword|
+or a quarterword otherwise.
+@^system dependencies@>
+If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched
+the letters in |hc[(l-k+1)..l@,]| of language |t|,
+we perform all of the required operations
+for this pattern by carrying out the following little program: Set
+|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|,
+|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|,
+and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
+@z
+@x
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@y
+@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode}
+@!trie_pointer=0..trie_size; {an index into |trie|}
+@z
+@x
+@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
+@d trie_char(#)==trie[#].b1 {character matched at this trie location}
+@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
+@y
+@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|,
+and |trie_op| will no longer fit into one memory word; thus using web2c
+we define |trie| as three array instead of an array of records.
+The variant will be implented by reusing the opcode field later on with
+another macro.
+@d trie_link(#)==trie_trl[#] {``downward'' link in a trie}
+@d trie_char(#)==trie_trc[#] {character matched at this trie location}
+@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
+@z
+@x
+@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
+@y
+@!trie_trl:array[trie_pointer] of halfword; {|trie_link|}
+@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|}
+@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|}
+@z
+@x
+@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code}
+@y
+@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] Larger tries, also in documentation parts.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|hyf_next[@t$v^\prime$@>]=min_quarterword|.
+@y
+|hyf_next[@t$v^\prime$@>]=min_trie_op|.
+@z
+@x
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
+@y
+$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] web2c can't parse negative lower bounds in arrays. Sorry.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943,944] Larger hyphenation tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!trie_used:array[ASCII_code] of quarterword;
+@y
+@!trie_used:array[ASCII_code] of trie_opcode;
+@z
+@x
+@!trie_op_val:array[1..trie_op_size] of quarterword;
+@y
+@!trie_op_val:array[1..trie_op_size] of trie_opcode;
+@z
+@x
+tini
+@y
+tini@;
+@!max_op_used:trie_opcode; {largest opcode used for any language}
+@!small_op:boolean; {flag used while dumping or undumping}
+@z
+@x
+|new_trie_op| could return |min_quarterword| (thereby simply ignoring
+@y
+|new_trie_op| could return |min_trie_op| (thereby simply ignoring
+@z
+@x
+function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
+label exit;
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@!u:quarterword; {trial op code}
+@y
+function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode;
+label exit;
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@!u:trie_opcode; {trial op code}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944] Another casting problem, and use |neg_trie_op_size|.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+ - trie_op_size;
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size - neg_trie_op_size)
+ + neg_trie_op_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.944,945,946] And larger tries again.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if u=max_quarterword then
+ overflow("pattern memory ops per language",
+ max_quarterword-min_quarterword);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+@y
+ if u=max_trie_op then
+ overflow("pattern memory ops per language",
+ max_trie_op-min_trie_op);
+ incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u;
+ if u>max_op_used then max_op_used:=u;
+@z
+@x
+op_start[0]:=-min_quarterword;
+@y
+op_start[0]:=-min_trie_op;
+@z
+@x
+for k:=0 to 255 do trie_used[k]:=min_quarterword;
+@y
+for k:=0 to 255 do trie_used[k]:=min_trie_op;
+@z
+@x
+trie_op_ptr:=0;
+@y
+max_op_used:=min_trie_op;
+trie_op_ptr:=0;
+@z
+@x
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
+@y
+@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] A casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.950,958,960,963] Larger tries.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
+@y
+@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
+@z
+@x
+@<Move the data into |trie|@>=
+h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
+ |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do trie[r]:=h;
+@y
+@d clear_trie == {clear |trie[r]|}
+ begin trie_link(r):=0;
+ trie_op(r):=min_trie_op;
+ trie_char(r):=min_quarterword; {|trie_char:=qi(0)|}
+ end
+@<Move the data into |trie|@>=
+if trie_root=0 then {no patterns were given}
+ begin for r:=0 to 256 do clear_trie;
+@z
+@x
+ repeat s:=trie_link(r); trie[r]:=h; r:=s;
+@y
+ repeat s:=trie_link(r); clear_trie; r:=s;
+@z
+@x
+ @!h:two_halves; {template used to zero out |trie|'s holes}
+@y
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] Same stuff as for \input, this time for \openin.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_ext="" then cur_ext:=".tex";
+ pack_cur_name;
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ pack_cur_name; {Try with |".tex"|.}
+ if (cur_ext <> ".tex") and (name_length + 5 < file_name_size)
+ and (not extension_irrelevant_p (name_of_file, 'tex'))
+ then begin
+ name_of_file[name_length + 1] := ".";
+ name_of_file[name_length + 2] := "t";
+ name_of_file[name_length + 3] := "e";
+ name_of_file[name_length + 4] := "x";
+ name_length := name_length + 4;
+ end;
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open
+ else begin
+ if cur_ext = ".tex" then cur_ext := "";
+ pack_cur_name; {Try without |".tex"|.}
+ if a_open_in (read_file[n], TEX_INPUT_PATH)
+ then read_open[n] := just_open;
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate now-unused variable `w' in `store_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Ditto, for `load_fmt_file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.??] Do reading and writing of `fmt_file' in C.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y
+@z
+
+@x
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y
+@z
+
+@x
+x:=fmt_file^.int;
+@y
+undump_int(x); {This reads the first word of the \.{.fmt} file}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [??] Make dumping/undumping more efficient.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+@z
+
+@x
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+
+@x
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y
+dump_things(eqtb[k], l-k);
+@z
+
+@x
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y
+undump_things(eqtb[k], x);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y
+@<Dump the array info for internal font number |k|@>;
+@z
+
+@x
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y
+@<Undump the array info for internal font number |k|@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff).
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end;
+end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Reading font info for C (nearly done with undump stuff).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(font_mem_size)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+end
+@z
+
+% The hyphenation patterns.
+%
+@x
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y
+dump_things(trie_trl[0], trie_max+1);
+dump_things(trie_tro[0], trie_max+1);
+dump_things(trie_trc[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[1], trie_op_ptr);
+dump_things(hyf_num[1], trie_op_ptr);
+dump_things(hyf_next[1], trie_op_ptr);
+@z
+
+@x
+for k:=0 to j do undump_hh(trie[k]);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y
+undump_things(trie_trl[0], j+1);
+undump_things(trie_tro[0], j+1);
+undump_things(trie_trc[0], j+1);
+undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1327] As with TFM files, `eof' here means `have we previously
+% encountered the end-of-file', not `are we at the end of the file'.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (x<>69069)or eof(fmt_file) then goto bad_fmt
+@y
+if (x<>69069)or feof(fmt_file) then goto bad_fmt
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+@y
+print(" (format="); print(job_name); print_char(" ");
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] `uexit' argument depends on `history'; add call to
+% set_paths; make the main program a procedure, so that uses of `eqtb'
+% will work.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p begin @!{|start_here|}
+@y
+@p procedure tex_body;
+begin @!{|start_here|}
+@z
+
+@x
+t_open_out; {open the terminal for output}
+@y
+t_open_out; {open the terminal for output}
+{get default file paths from the environment}
+set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT
+ + TFM_FILE_PATH_BIT);
+@z
+
+@x
+end_of_TEX: close_files_and_terminate;
+final_end: ready_already:=0;
+end.
+@y
+close_files_and_terminate;
+final_end: do_final_end;
+end {|tex_body|};
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] Print new line before termination; switch to editor if
+% necessary.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+@y
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+ call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input. Under Unix, it's
+% not possible to switch into the debugger while a program is running.
+% The best approximation is to do a core dump, then run the debugger on
+% it later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+@y
+ dump_core {Do something to cause a core dump}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376] Add editor-switch variables to globals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+This section should be replaced, if necessary, by any special
+modifications of the program
+that are necessary to make \TeX\ work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the published program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary memory_word, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+@z
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch
new file mode 100644
index 0000000000..266f7e219e
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch
@@ -0,0 +1,69 @@
+@x
+typedef integer verdschlue ;
+@y
+typedef unsigned long verdschlue ;
+@z
+
+@x
+typedef mdbk * mdbknoten ;
+typedef mdmk * mdmknoten ;
+typedef mdlk * mdlknoten ;
+typedef mdek * mdeknoten ;
+typedef struct {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ boolean del1 ;
+ boolean used1 ;
+ mdbknoten li, re ;
+} mdbk ;
+typedef struct {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ mdmknoten li, re ;
+} mdmk ;
+typedef struct {
+ wort w12 ;
+ integer l1 ;
+ mdlknoten li, re ;
+} mdlk ;
+typedef struct {
+ wort w12 ;
+ integer l1 ;
+ mdeknoten li, re ;
+} mdek ;
+@y
+typedef struct mdbk {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ boolean del1 ;
+ boolean used1 ;
+ struct mdbk * li, * re ;
+} mdbk ;
+typedef struct mdmk {
+ wort w12 ;
+ integer l1 ;
+ trennvektor tr1 ;
+ boolean neu1 ;
+ struct mdmk * li, * re ;
+} mdmk ;
+typedef struct mdlk {
+ wort w12 ;
+ integer l1 ;
+ struct mdlk * li, * re ;
+} mdlk ;
+typedef struct mdek {
+ wort w12 ;
+ integer l1 ;
+ struct mdek * li, * re ;
+} mdek ;
+typedef mdbk * mdbknoten ;
+typedef mdmk * mdmknoten ;
+typedef mdlk * mdlknoten ;
+typedef mdek * mdeknoten ;
+@z
diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch
new file mode 100644
index 0000000000..d4c7d238b4
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch
@@ -0,0 +1,133 @@
+@x
+ | POINTER_TYPE
+ { if (last_type >= 0)
+ sym_table[last_type].var_not_needed = true;
+ }
+@y
+ | POINTER_TYPE
+ { if (last_type >= 0)
+ sym_table[last_type].var_not_needed = false;
+ }
+@z
+
+@x
+POINTER_TYPE: '^' type_id_tok
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); my_output("*"); }
+ ;
+@y
+POINTER_TYPE: '^' type_id_tok
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); my_output("*"); }
+ | '^' undef_id_tok /* HH for Isitex */
+ {if (last_type >= 0) {
+ sym_table[last_type].var_not_needed =
+ sym_table[l_s].var_not_needed;
+ sym_table[last_type].upper = sym_table[l_s].upper;
+ sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
+ sym_table[last_type].val = sym_table[l_s].val;
+ sym_table[last_type].val_sym = sym_table[l_s].val_sym;
+ }
+ my_output(last_id); my_output("*"); }
+ ;
+@z
+
+@x
+VARIABLE: var_id_tok
+ { if (strcmp(last_id, "mem") == 0)
+ uses_mem = 1;
+ else if (strcmp(last_id, "eqtb") == 0)
+ uses_eqtb = 1;
+ if (sym_table[l_s].var_formal)
+ (void) putchar('*');
+ my_output(last_id);
+ $$ = ex_32;
+ }
+ VAR_DESIG_LIST
+ | var_id_tok
+ { if (sym_table[l_s].var_formal)
+ (void) putchar('*');
+ my_output(last_id); $$ = ex_32; }
+ ;
+@y
+VARIABLE: var_id_tok
+ { if (strcmp(last_id, "mem") == 0)
+ uses_mem = 1;
+ else if (strcmp(last_id, "eqtb") == 0)
+ uses_eqtb = 1;
+ if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ $$ = ex_32;
+ }
+ VAR_DESIG_LIST
+ | var_id_tok '^' '.' /* HH for Isitex */
+ { if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ (void) putchar('-');
+ (void) putchar('>');
+ $$ = ex_32;
+ }
+ FIELD_VARIABLE
+ | var_id_tok '^'
+ { (void) putchar('(');
+ (void) putchar('*');
+ if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ (void) putchar(')');
+ $$ = ex_32;
+ }
+ | var_id_tok
+ { if (sym_table[l_s].var_formal) {
+ (void) putchar('(');
+ (void) putchar('*');
+ my_output(last_id);
+ (void) putchar(')');
+ }
+ else
+ my_output(last_id);
+ $$ = ex_32; }
+ ;
+
+FIELD_VARIABLE: field_id_tok
+ { my_output(last_id); }
+ VAR_DESIG_LIST
+ | field_id_tok '^' '.'
+ { my_output(last_id);
+ (void) putchar('-');
+ (void) putchar('>');
+ }
+ FIELD_VARIABLE
+ | field_id_tok
+ { my_output(last_id); }
+ ;
+@z
diff --git a/obsolete/systems/sisisi/unix/liesmich.txt b/obsolete/systems/sisisi/unix/liesmich.txt
new file mode 100644
index 0000000000..f68d72180b
--- /dev/null
+++ b/obsolete/systems/sisisi/unix/liesmich.txt
@@ -0,0 +1,139 @@
+
+
+ Installationsanleitung fuer TeX mit SiSiSi-Silbentrennung unter UNIX
+ ====================================================================
+
+
+Die vorliegende Anleitung beschreibt das Installieren der beiden Varianten
+
+ SiTeX (einfache Silbentrennung)
+ und iSiTeX (interaktive Variante)
+
+der `sicheren sinnentsprechenden Silbentrennung' (SiSiSi) fuer TeX3.14 oder
+TeX3.141 unter UNIX. (Wenn Sie LaTeX statt TeX benutzen, dann koennen Sie die
+Installation genauso durchfuehren). Die notwendigen Files finden Sie
+ueber anonymes FTP auf eiunix.tuwien.ac.at im Verzeichnis /pub/sisisi, im
+Unterverzeichnis COMMON (soweit sie alle Varianten betreffen) bzw. in einem
+der speziellen Unterverzeichnisse.
+
+
+1) Besorgen Sie sich den Sourcecode von TeX und installieren Sie TeX.
+---------------------------------------------------------------------
+
+Sie brauchen den Sourcecode einer der beiden Varianten von TeX, da Sie mit
+SiTeX bzw. iSiTeX einen ganz neuen Algorithmus fuer die Silbentrennung
+installieren muessen.
+
+Zusaetzlich muessen Sie TeX ohne Silbentrennung schon nach den Anweisungen
+des README-Files von TeX installiert haben.
+
+
+2) Legen Sie ein SiSiSi-Verzeichnis an und kopieren Sie die SiSiSi-Files.
+-------------------------------------------------------------------------
+
+Legen Sie ein eigenes Verzeichnis fuer SiSiSi an. Kopieren Sie alle Files aus
+einem der oben erwaehnten vier speziellen Unterverzeichnisse dort hinein.
+
+Das COMMON Verzeichnis enthaelt spezielle Worttabellen fuer SiSiSi
+(def_umlaut.tex und sihyphen.tex). Ausserdem enthaelt es zwei weitere, von
+der Variante (3.14 bzw. 3.141) abhaengige Unterverzeichnisse, die spezielle
+Style- bzw. Format-Files enthalten (sigerman.sty, siplain.tex und
+silplain.tex), ausserdem die Changefiles, die verwendet wurden um diese Files
+aus den Originalfiles (german.sty, plain.tex und lplain.tex) zu erzeugen.
+Kopieren Sie die Files aus COMMON und aus dem entsprechenden Unterverzeichnis
+in Ihr TEXINPUTS-Verzeichnis, z.B. /usr/local/lib/tex/inputs, oder was immer
+Sie beim Installieren von TeX als TEXINPUTS Pfad konfiguriert haben.
+
+
+3) Erzeugen Sie SiTeX.
+----------------------
+
+In Ihrem neuen SiSiSi-Verzeichnis muessen Sie erst das File `install'
+editieren. Sie muessen die Variablen TEXSRC und SISISIDIR auf den (absoluten)
+Pfadnamen der Verzeichnisse setzen, in denen sich Ihre TeX-Sourcen bzw. die
+SiSiSi-Sourcen befinden (TEXSRC bezieht sich auf das oberste Verzeichnis der
+TeX-Sourcen, das, in dem sich das Top-Level Makefile befindet).
+
+Der Installation von [i]SiTeX3.141 liegt TeX3.141 in der auf
+quepasa.cs.tu-berlin.de vorhandenen Version zugrunde. Fuer die Version von
+Karl Berry auf ftp.cs.umb.edu gibt es spezielle Files, install.other und
+tex.ch.other, die Sie aber vor der Verwendung in install und tex.ch umbenennen
+muessen.
+
+Danach starten Sie in dem SiSiSi-Verzeichnis das Installationsskript mit
+`./install' oder `sh install'. Dieses Skript kopiert zunaechst alle
+notwendigen Files in die richtigen Verzeichnisse und startet dann ein `make',
+wobei nur TeX erzeugt wird, nicht etwa auch MetaFont oder die anderen
+Programme, die bei TeX dabei sind.
+
+Dabei werden die speziellen Programme virtex und initex mit Silbentrennung
+erzeugt, und ebenso sitex.fmt und silatex.fmt, bzw. isitex.fmt und
+isilatex.fmt bei der interaktiven Variante, in demselben Verzeichnis.
+
+Da SiTeX einen auf die deutsche Sprache zugeschnittenen Silbentrennalgorithmus
+verwendet, kann es nicht sinnvoll fuer fremdsprachige Texte verwendet werden.
+
+Sie sollten also jetzt nicht einfach so weitermachen, wie im README File von
+TeX beschrieben wird, da Sie sonst das bestehende TeX mit der
+Original-Silbentrennung ueberschreiben und damit keine englischsprachigen
+Dokumente mehr formatieren koennen.
+
+Kopieren Sie statt dessen ganz einfach per Hand (d.h. per cp-Befehl :-) das
+neu entstandene virtex und initex unter neuem Namen in ein Verzeichnis in
+Ihrem Suchpfad (z.B. nach /usr/local/bin), also etwa als sivirtex und siinitex
+(bzw. isivirtex und isiinitex).
+Ausserdem muessen Sie [i]sitex.fmt und [i]silatex.fmt (die Sie beide in TEXDIR
+finden) in Ihr TEXFORMATS Verzeichnis kopieren, und einen Link namens
+[i]siplain.fmt auf [i]sitex.fmt herstellen. Ebenso muessen Sie noch Links auf
+[i]sivirtex erzeugen (im selben Verzeichnis wie [i]sivirtex), naemlich
+[i]sitex und [i]silatex. Zu guter letzt kopieren Sie das File hf3 in eines der
+TEXINPUTS Verzeichnisse (z.B. /usr/local/lib/tex/inputs), und das File
+[i]sitex.pool in das TEXPOOL Verzeichnis. Diese Files finden Sie ebenfalls in
+TEXDIR.
+
+
+4) Die Benutzung.
+-----------------
+
+Sie sollten jetzt TeX mit und ohne SiSiSi verwenden koennen. Bei den
+SiSiSi-Varianten vergessen Sie nicht, sigerman.sty anstelle von german.sty zu
+verwenden, also \documentstyle[sigerman] anstelle von \documentstyle[german].
+Die SISISI-Varianten geben sich in der Meldung nach dem Start durch ein
+eingeschobenes `(+SISISI 1.0)' zu erkennen.
+
+Das einfache SiTeX koennen Sie genauso wie das urspruengliche TeX benutzen.
+Eine ausfuehrliche Beschreibung der zusaetzlichen Moeglichkeiten, die die
+interaktive Variante bietet, finden Sie in dem Institutsbericht, der als
+LaTeX-File im COMMON/INST_BER-Verzeichnis steht.
+
+
+5) Aendern der Worttabelle.
+---------------------------
+
+Das Aendern der Worttabelle erfolgt wie im Institutsbericht beschrieben. Danach
+muessen Sie das File `sihyphen.tex' auf Ihr UNIX-System in den TEXINPUTS-Pfad
+kopieren und mit den folgenden Befehlen die Hashtabelle und die Format-Files
+neu erzeugen:
+
+ siinitex siplain \\dump
+ siinitex silplain \\dump
+
+Dabei entstehen die Files hf3, siplain.fmt und silplain.fmt. hf3 kommt in ein
+TEXINPUTS-Verzeichnis, siplain.fmt und silplain.fmt kommen als sitex.fmt und
+silatex.fmt in das TEXFORMATS-Verzeichnis.
+
+Wenn Sie auch iSiTeX benutzen wollen, muessen Sie auch die iSiTeX Format-Files
+neu erzeugen:
+
+ isiinitex siplain \\dump
+ isiinitex silplain \\dump
+
+Das hf3 File ist identisch zu dem von SiTeX, siplain.fmt und silplain.fmt
+sollten Sie aber als isitex.fmt und isilatex.fmt in das TEXFORMATS-Verzeichnis
+stellen.
+
+-------------------------------------------------------------------------------
+
+
+Kommentare, Fehlermeldungen, Verbesserungsvorschlaege und Erfolgsmeldungen
+erbeten an heinz@eiunix.tuwien.ac.at