home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / dev / flexcat-1.2.lha / FlexCat / doc / FlexCat_deutsch.doc < prev    next >
Encoding:
Text File  |  1994-04-17  |  39.7 KB  |  912 lines

  1. FlexCat V1.2 Dokumentation
  2. **************************
  3.  
  4.    Diese Datei beschreibt den Umgang mit FlexCat V1.2, einem Programm zur
  5. Erzeugung von Catalogs und dem sie verwendenden Quelltext.  FlexCat
  6. arbeitet wie CatComp oder KitCat, kann aber praktisch beliebigen
  7. Quelltext erzeugen. Dies funktioniert durch sogenannte
  8. Source-description-Dateien, die gewissermaßen eine Vorlage für den
  9. zu erzeugenden Quelltext darstellen. Sie können mit einem Editor bearbeitet
  10. und verändert werden und dadurch hoffentlich an beliebige
  11. Programmiersprachen und Bedürfnisse angepaßt werden.
  12.  
  13. Copyright und andere rechtliche Dinge
  14. *************************************
  15.  
  16.      Copyright (C) 1993    Jochen Wiedmann
  17.                  Am Eisteich 9
  18.                72555 Metzingen (Deutschland)
  19.                  Tel. 07123 / 14881
  20.                  Internet: wiedmann@mailserv.zdv.uni-tuebingen.de
  21.  
  22.    Diese Dokumentation sowie das gesamte Programmpaket dürfen im Rahmen der
  23. "GNU General Public License" kopiert, verändert und weitergegeben werden
  24. solange diese Copyright-Notiz und diese Erlaubnis unverändert auf allen
  25. Kopien enthalten ist und die "GNU General Public License" der Free Software
  26. Foundation (in der Datei COPYING) mitkopiert und weitergegeben wird.
  27.  
  28.    Es wird keine Garantie gegeben, daß die Programme, die in dieser
  29. Dokumentation beschrieben werden, 100%ig zuverlässig sind. Sie benutzen
  30. diese Programme auf eigene Gefahr. Der Autor kann auf keinen Fall für
  31. irgendwelche Schäden verantwortlich gemacht werden, die durch die
  32. Anwendung dieser Programme entstehen.
  33.  
  34. Übersicht
  35. *********
  36.  
  37.    Seit der Workbench 2.1 bietet der Amiga ein sehr schönes System an, mit
  38. dem Programme in verschiedenen, praktisch beliebigen Sprachen benutzt
  39. werden können: Die locale.library. (Man nennt diesen Vorgang
  40. Lokalisierung, daher der Name.)
  41.  
  42.    Die Idee ist eigentlich recht simpel: Man wählt eine Sprache, meist die
  43. englische aus und schreibt sein Programm ganz normal, abgesehen davon, daß
  44. Strings nicht mehr direkt eingegeben werden, sondern über einen
  45. Funktionsaufruf im Programm verwendet werden. Durch einen weiteren
  46. Funktionsaufruf zu Beginn des Programms erhält der Benutzer nun die
  47. Möglichkeit, anstelle der vorgegebenen Strings andere zu wählen, die in
  48. einer externen Datei, einem sogenannten Katalog enthalten sind.
  49.  
  50.    Diese Katalogdateien sind vom Programm unabhängig. Möchte man das
  51. Programm in einer weiteren Sprache betreiben, so ist lediglich eine neue
  52. Katalogdatei zu erzeugen, das eigentliche Programm muß nicht geändert
  53. werden.
  54.  
  55.    Auf den Programmierer kommen dadurch aber zusätzliche Aufgaben hinzu: Es
  56. müssen die Kataloge erzeugt werden, die Strings nach wie vor eingegeben
  57. werden und es muß zusätzlicher Code erzeugt werden, der die Behandlung der
  58. Kataloge übernimmt. Dies soll durch FlexCat so weit wie möglich
  59. vereinfacht und automatisiert werden, ohne dabei auf Flexibilität (vor
  60. allem in Bezug auf den erzeugten Quelltext) zu verzichten. Betrachten wir
  61. als Beispiel ein Programm HelloLocalWorld.c. Das Programm wird letzten
  62. Endes so aussehen:
  63.          #include <stdio.h>
  64.          #include <stdlib.h>
  65.          #include <HelloLocalWorld_Cat.h>    /* Muß eingebunden werden! */
  66.          #include <clib/exec_protos.h>
  67.      
  68.          struct Library *LocaleBase;
  69.      
  70.          void main(int argc, char *argv[])
  71.          { /*  Die Library muß hier eröffnet werden, auch wenn der Compiler  */
  72.            /*  das automatisch kann. Kein Aussteigen, falls die    */
  73.            /*  Library nicht eröffnet werden kann: Dann werden einfach die    */
  74.            /*  eingebauten Strings verwendet.                */
  75.            LocaleBase = OpenLibrary("locale.library", 38);
  76.      
  77.            OpenHelloLocalWorldCatalog(NULL, NULL);
  78.      
  79.            printf("%s\n", GetHelloLocalWorldString(msgHello));
  80.      
  81.            CloseHelloLocalWorldCatalog();
  82.            if (LocaleBase)
  83.            CloseLibrary(LocaleBase);
  84.          }
  85.  
  86. Beachten Sie, daß dies dem originalen HelloWorld.c fast völlig
  87. entspricht, abgesehen davon, daß der String "Hello, world!" durch einen
  88. Funktionsaufruf ersetzt wird und etwas zusätzlichem
  89. Initialisierungsaufwand.
  90.  
  91.    Das obige Programm verwendet eine Konstante msgHello. Ein Aufruf der
  92. Funktion GetHelloLocalWorldString() ersetzt diese Konstante durch den
  93. entsprechenden String. Man beginnt stets damit, diese Konstanten und
  94. Strings in einer sogenannten Katalogbeschreibung abzulegen. Siehe Catalog
  95. description. Unsere Katalogbeschreibung würde in einer Datei
  96. HelloLocalWorld.cd stehen und so aussehen:
  97.          ;    Kommentare sind natürlich erlaubt! Jede mit einem Semikolon
  98.          ;    beginnende Zeile ist eine Kommentarzeile.
  99.          ;
  100.          ;    Die Sprache der eingebauten Strings:
  101.          #language english
  102.          ;
  103.          ;    Die für den Aufruf von Locale/OpenCatalog() verwendete
  104.          ;    Versionsnummer. Dies ist anders als bei Exec/OpenLibrary():
  105.          ;    0 bedeutet beliebige Version, andere Nummern müssen exakt
  106.          ;    stimmen!
  107.          #version 0
  108.          ;
  109.          ;    Dies definiert einen String und die ID unter der er verwendet
  110.          ;    wird. Die Zahl 4 gibt an, daß der String wenigstens 4 Zeichen
  111.          ;    enthalten sollte.
  112.          msgHello (/4/)
  113.          Hello, world!
  114.  
  115.    Mit FlexCat erzeugt man ais der Katalogbeschreibung zwei andere Dateien:
  116. Das Includefile HelloLocalWorld_Cat.h definiert die Konstanten, die Datei
  117. HelloLocalWorld_Cat.c enthält ein Array mit den Strings sowie die
  118. Funktionen OpenHelloLocalWorldCatalog()GetHelloLocalWorldCatalog() und
  119. CloseHelloLocalWorldCatalog().  Wie diese genau aussehen, ist unerheblich.
  120. Insbesondere benötigt man keinerlei Kenntnisse der Locale.library!
  121.  
  122.    Allerdings könnten Sie neugierig sein, wie diese Dateien aussehen oder
  123. sogar ein anderes Aussehen wünschen. Hier liegt der Unterschied zwischen
  124. FlexCat und anderen Kataloggeneratoren: Bei FlexCat ist kein bestimmtes
  125. Format vorgeschrieben. Mit Hilfe der sogenenannten Quelltextbeschreibungen
  126. können Sie praktisch beliebige Formate vorgeben. Damit könnten z.B. auch
  127. unter AmigaDOS 2.0 Kataloge verwendet werden. Siehe Source description.
  128. Solche Katalogbeschreibungen sind bei FlexCat bereits mitgeliefert werden.
  129. Damit kann man die Quelltexte folgendermaßen erzeugen:
  130.          FlexCat HelloLocalWorld.cd HelloLocalWorld_Cat.c=C_c_V21
  131.          FlexCat HelloLocalWorld.cd HelloLocalWorld_Cat.h=C_h.sd
  132.  
  133.    Wenn das Programm fertig ist, dann wird FlexCat erneut verwendet, um
  134. sogenannte Katalogübersetzungen zu erzeugen, eine für jede weitere
  135. Sprache außer der eingebauten. Siehe Catalog translation. Erzeugen wir
  136. also eine deutsche Katalogübersetzung:
  137.          FlexCat HelloLocalWorld.cd NEWCTFILE Deutsch.ct
  138.  
  139. Die fertige Datei sieht dann so aus:
  140.          ## version
  141.          ## language
  142.          ## codeset 0
  143.          ;    Kommentare sind natürlich erlaubt! Jede mit einem Semikolon
  144.          ;    beginnende Zeile ist eine Kommentarzeile.
  145.          ;
  146.          ;    Die Sprache der eingebauten Strings:
  147.          ;
  148.          ;    Die für den Aufruf von Locale/OpenCatalog() verwendete
  149.          ;    Versionsnummer. Dies ist anders als bei Exec/OpenLibrary():
  150.          ;    0 bedeutet beliebige Version, andere Nummern müssen exakt
  151.          ;    stimmen!
  152.          ;
  153.          ;    Dies definiert einen String und die ID unter der er verwendet
  154.          ;    wird. Die Zahl 4 gibt an, daß der String wenigstens 4 Zeichen
  155.          ;    enthalten sollte.
  156.          msgHello
  157.      
  158.          ;Hello, world!
  159.  
  160. Dies sieht der Katalogbeschreibung sehr ähnlich. FlexCat übernimmt dabei
  161. die Kommentare, auch dort wo es nutzlos ist: Z.B. ist der Kommentar zur
  162. Länge der Strings hier bedeutungslos, da diese bereits in der
  163. Katalogbeschreibung angegeben werden muß. Man muß nun lediglich die
  164. Lücken füllen, d.h. die Sprache (language, hier Deutsch), die Version
  165. (einen typischen Versionsstring, $VER: Deutsch.catalog (11.03.94) wäre
  166. z.B. gut möglich) und den codeset (hier 0, siehe Locale/OpenCatalog() für
  167. Details) sowie natürlich die übersetzten Strings selber. FlexCat
  168. erleichtert dies, indem die originalen Strings jeweils als Kommentare
  169. eingefügt werden.
  170.  
  171.    Schließlich werden daraus die eigentlichen Kataloge erzeugt:
  172.          FlexCat HelloLocalWorld.cd Deutsch.ct CATALOG Deutsch.catalog
  173.  
  174. Beachten Sie, daß man dazu weder das Programm noch die Quelltexte
  175. benötigt.  Dies kann also ohne weiteres später geschehen, etwa um
  176. nachträglich weitere Sprachen zu unterstützen. Es ist üblich und durchaus
  177. erwünscht, eine Datei NewCatalog.ct mitzuliefern, die das Erstellen
  178. eigener Kataloge erlaubt.
  179.  
  180.    Aber was geschieht, wenn das Programm später geändert oder erweitert
  181. wird?  Dann muß nur die Katalogbeschreibung geändert werden. Mit Hilfe von
  182. FlexCat können die Katalogübersetzungen auf den neuesten Stand gebracht
  183. werden:
  184.          FlexCat HelloLocalWorld.cd Deutsch.ct NEWCTFILE Deutsch.ct
  185.  
  186. Es müssen dann lediglich noch evtl. neue Strings eingegeben werden.
  187.  
  188. Installation des Programms
  189. **************************
  190.  
  191.    FlexCat ist in Ansi-C geschrieben und sollte daher auf jedem Amiga und
  192. nach evtl. Neucompilierung sogar auf jedem anderen Rechner laufen.  Das
  193. gilt ebenso für die erzeugten Programme, denn FlexCat ist mit sich selbst
  194. erzeugt worden. Die mitgelieferten Quelltextbeschreibungen sollten
  195. Programme erzeugen, die auf jedem Amiga und sogar auf beliebigen Rechnern
  196. lauffähig sind. (Allerdings sollte man dann beim Aufruf der
  197. FlexCat-Funktionen sicherstellen, daß die Variable LocaleBase den Wert
  198. NULL hat. Lokalisierung ist aber meist nur auf dem Amiga und ab der
  199. Workbench 2.1 möglich, da erst dann die locale.library zur Verfügung
  200. steht.
  201.  
  202.    Es ist aber prinzipiell durchaus möglich, auch unter einer früheren
  203. Workbench oder gar auf anderen Rechnern Lokalisierung anzubieten: Ein
  204. Beispiel dafür liefert Quelltextbeschreibungsdateien C_c_V20.sd, in der
  205. die locale.library durch die iffparse.library ersetzt wird, falls
  206. letztere vorhanden ist, erstere dagegen nicht. Damit ist Lokalisierung
  207. schon ab der Workbench 2.0 möglich.  Siehe C.
  208.  
  209.    Zur Installation ist nichts weiter zu tun, als das eigentliche Programm
  210. an eine sinnvolle Stelle Ihres Suchpfades zu kopieren und einen geeigneten
  211. Platz für die Quelltextbeschreibungen auszuwählen. Falls Sie mit einer
  212. anderen als der englischen Sprache arbeiten wollen, müssen Sie außerdem
  213. den entsprechenden Katalog an eine geeignete Stelle kopieren. Im Falle der
  214. deutschen Sprache wäre dies Catalogs/Deutsch/FlexCat.catalog.  Der
  215. einfachste Platz ist das Verzeichnis Locale:Catalogs/Deutsch, möglich
  216. ist aber auch, einfach das ganze Verzeichnis Catalogs in das Directory
  217. des Programms zu kopieren. Siehe Benutzung.
  218.  
  219. Aufruf des Programms
  220. ********************
  221.  
  222.    FlexCat arbeitet nur vom CLI aus. Die Aufrufsyntax ist
  223.  
  224.          FlexCat CDFILE/A,CTFILE,CATALOG/K,NEWCTFILE/K,SOURCES/M
  225.  
  226.    Dies ist die Bedeutung der Argumente:
  227. CDFILE
  228.      ist der (obligatorische) Name einer zu lesenden Katalogbeschreibung.
  229.      Aus diesem Argument wird auch der Basisname bei der
  230.      Quelltextbeschreibung gewonnen. Achten Sie deshalb auf
  231.      Groß-/Kleinschreibung!  Siehe Source description.
  232.  
  233. CTFILE
  234.      ist der Name einer Katalogübersetzung, die etwa für die Erzeugung
  235.      eines Katalogs zu lesen ist. Außerdem kann man eine vorhandene
  236.      Katalogübersetzung mit Hilfe des Argumentes NEWCTFILE auf den
  237.      neuesten Stand zu bringen: Wird beides angegeben, so wird zunächst
  238.      die Katalogbeschreibung und dann die -übersetzung gelesen und
  239.      anschließend eine neue Katalogübersetzung erzeugt, die dieselben
  240.      Strings wie die alte und evtl. neue Strings (als Leerzeile) enthält.
  241.  
  242. CATALOG
  243.      ist der Name eines zu erzeugenden Kataloges. Dieses Argument ist nur
  244.      gemeinsam mit CTFILE erlaubt.
  245.  
  246. NEWCTFILE
  247.      ist der Name einer neu zu erzeugenden Katalogübersetzung. Wie schon
  248.      gesagt, werden die Strings aus einer evtl. durch CTFILE angegebenen
  249.      bestehenden Datei übernommen. Fehlt das Argument CTFILE, so wird eine
  250.      Datei erzeugt, die nur Leerzeilen als Strings enthält.
  251.  
  252. SOURCES
  253.      sind die Namen zu erzeugender Quelltextdateien sowie der dazu zu
  254.      lesenden Quelltextbeschreibungen. Diese Argumente müssen die Form
  255.      source=template haben, wobei source der Name der zu erzeugenden
  256.      Quelltextdatei und template der Name der Quelltextbeschreibungsdatei
  257.      ist.
  258.  
  259.    Für Beispiele siehe Uebersicht.
  260.  
  261. Aufbau einer Katalogbeschreibung
  262. ********************************
  263.  
  264.    Eine Katalogbeschreibungsdatei enthält vier Arten von Zeilen.
  265.  
  266. Kommentarzeilen
  267.      Jede mit einem Semikolon beginnende Zeile ist eine Kommentarzeile, wird
  268.      also von FlexCat ignoriert. (Eine Ausnahme sind die unten beschriebenen
  269.      Stringzeilen, die sehr wohl mit einem Semikolon beginnen dürfen.)
  270.  
  271. Kommandozeilen
  272.      Mit einem '#' beginnende Zeilen enthalten ein Kommando. Mögliche
  273.      Kommandos sind (Groß-/Kleinschreibung wird ignoriert):
  274.     #language <str>
  275.           gibt die Vorgabesprache des Programms an, d.h. die Sprache der
  276.           Strings in der Katalogbeschreibungsdatei. Vorgabe ist #language
  277.           english.
  278.  
  279.     #version <num>
  280.           gibt die Versionsnummer der zu eröffnenden Kataloge an. Im
  281.           Unterschied zu Exec/OpenLibrary muß die Nummer genau stimmen,
  282.           höhere Nummern werden nicht akzeptiert. Eine Ausnahme ist es,
  283.           hier die 0 als Versionsnummer anzugeben, durch die jeder Katalog
  284.           akzeptiert wird. Vorgabe ist #version 0. Zu diesen Befehlen
  285.           siehe auch Locale/OpenCatalog.
  286.  
  287.     #lengthbytes <num>
  288.           Weist das Programm an, vor jeden String die angegebene Zahl von
  289.           Bytes zu schreiben, die die Länge des Strings (ohne die
  290.           lengthbytes) enthalten und ohne abschließendes NUL-Byte angeben.
  291.           (Ein NUL-Byte wird in Katalogen aber trotzdem angehängt, im
  292.           erzeugten Quelltext ist dies von der Quelltextbeschreibungsdatei
  293.           abhängig.) <num> muß zwischen 0 und sizeof(long)=4 liegen.
  294.           Vorgabe ist #lengthbytes 0.
  295.  
  296.     #basename <str>
  297.           Setzt den Basisnamen für die Quelltextbeschreibung. Der aus den
  298.           Argumenten beim Aufruf des Programmnamens gewonnene Basisname
  299.           (siehe Programmstart) wird überschrieben. Siehe Source
  300.           description.
  301.  
  302. Beschreibungszeilen
  303.      deklarieren einen String. Sie haben die Form IDSTR
  304.      (id/minlen/maxlen), wobei IDSTR ein Bezeichner ist (d.h. ein aus
  305.      den Zeichen a-z,A-Z,0-9 und dem Underscore bestehender String),
  306.      id eine eindeutige Nummer (die von jetzt an als ID bezeichnet
  307.      wird) angibt, minlen die minimale und maxlen die maximale Länge
  308.      des Strings. Die drei letztgenannten dürfen auch fehlen, das Programm
  309.      wählt dann selbst einen Wert für id und erlaubt Strings beliebiger
  310.      Länge. Die auf eine Beschreibungszeile folgende ist eine
  311.  
  312. Stringzeile,
  313.      d.h. sie enthält den eigentlichen String und nichts anderes. Dieser
  314.      darf eine Reihe von Steuerzeichen enthalten, die alle durch einen
  315.      Backslash eingeleitet werden:
  316.     \b
  317.           Backspace (Ascii 8)
  318.  
  319.     \c
  320.           Control Sequence Introducer (Ascii 155)
  321.  
  322.     \e
  323.           Escape (Ascii 27)
  324.  
  325.     \f
  326.           Form Feed (Ascii 12)
  327.  
  328.     \g
  329.           Display beep (Ascii 7)
  330.  
  331.     \n
  332.           Line Feed, newline (Ascii 10)
  333.  
  334.     \r
  335.           Carriage Return (Ascii 13)
  336.  
  337.     \t
  338.           Tab (Ascii 9)
  339.  
  340.     \v
  341.           Vertical tab (Ascii 11)
  342.  
  343.     \)
  344.           Das Klammer-Zu-Zeichen. (Dies ist evtl. innerhalb einer
  345.           %(..)-Sequenz nötig, siehe Source description.)
  346.  
  347.     \\
  348.           Der Backslash selbst.
  349.  
  350.     \xHH
  351.           Das durch HH gegebene Ascii-Zeichen, wobei HH Hexziffern sind.
  352.  
  353.     \OOO
  354.           Das durch OOO gegebene Ascii-Zeichen, wobei OOO Hexziffern
  355.           sind.  Schließlich signalisiert ein einzelner Backslash am
  356. Zeilenende, daß die Zeile (und damit der String) auf der nächsten Zeile
  357. fortgesetzt wird.  Es ist dadurch möglich, beliebig lange Strings zu
  358. definieren. (FlexCat ist lediglich durch das verfügbare RAM
  359. eingeschränkt.)
  360.  
  361.    Ein String wird also stets durch eine Beschreibungszeile und eine
  362. unmittelbar darauffolgende Stringzeile angegeben. Ein Beispiel wäre
  363.          msgHello (/4/)
  364.          Hello, this is english!\n
  365.    In diesem Beispiel fehlt die ID, wird also vom Programm festgesetzt.
  366. (Dies ist sicher der einfachste und beste Weg.) Die 4 gibt hier an, daß
  367. der in der nächsten Zeile stehende String wenigstens 4 Zeichen enthalten
  368. soll, eine maximale Länge fehlt.
  369.  
  370.    Als ausführlicheres Beispiel zum Aufbau einer Katalogbeschreibungsdatei
  371. kann die Datei FlexCat.cd dienen.
  372.  
  373. Aufbau einer Katalogübersetzung
  374. *******************************
  375.  
  376.    Katalogübersetzungen entsprechen in ihrem Aufbau ganz und gar den
  377. Katalogbeschreibungen. Nur sind auf den Kommandozeilen andere Kommandos
  378. erlaubt und die Beschreibungszeilen enthalten keine Angaben über ID sowie
  379. minimale oder maximale Länge, da diese aus der Katalogbeschreibung
  380. entnommen werden. Selbstverständlich sollte jeder String aus der
  381. Katalogbeschreibung auch in der Katalogübersetzung vorkommen und es dürfen
  382. keine Strings (d.h. Stringbezeichner) auftauchen, die nicht auch in der
  383. Katalogbeschreibung definiert sind. Dies zu sichern geht am einfachsten,
  384. indem man mit FlexCat aus den evtl. geänderten Katalogbeschreibungen und
  385. den evtl. alten Katalogübersetzungen neue erzeugt. Siehe Uebersicht.
  386.  
  387.    Die in Katalogübersetzungsdateien erlaubten Kommandos sind:
  388. ##version <str>
  389.      Gibt die Version des Kataloges in Form eines AmigaDOS-Versionsstrings
  390.      an.  Beispiel:
  391.               ##version $VER: Deutsch.ct 8.1 (27.09.93)
  392.      Die Versionsnummer dieses Kataloges ist 8. Um ihn zu eröffnen,
  393.      müssten also in der Katalogbeschreibung die Versionsnummern 0 oder 8
  394.      angegeben werden.
  395.  
  396. ##language <str>
  397.      Gibt die Sprache des Kataloges an. Natürlich sollte dies eine andere
  398.      als die Sprache der Katalogbeschreibung sein. Die Katalogsprache und
  399.      die Katalogversion müssen angegeben werden.
  400.  
  401. ##codeset <num>
  402.      Ein derzeit noch unbenutztes Argument für die Eröffnung eines
  403.      Kataloges.  Sollte immer 0 sein. (Dies ist auch der Vorgabewert.)
  404.  
  405.    Das obige Beispiel sieht hier so aus:
  406.          msgHello
  407.          Hallo, dies ist deutsch!\n
  408.  
  409. Als weiteres Beispiel einer Katalogübersetzungsdatei kann Deutsch.ct
  410. dienen.
  411.  
  412. Aufbau einer Quelltextbeschreibung
  413. **********************************
  414.  
  415.    Der wichtigste Teil von FlexCat ist die Quelltexterzeugung. Bis hierher
  416. bietet FlexCat nichts, was nicht auch CatComp, KitCat und Konsorten bieten
  417. würden. Der erzeugte Quelltext soll nun die Verwendung der erzeugten
  418. Kataloge möglichst einfach machen. Andererseits soll dies aber unter
  419. beliebigen Programmiersprachen und für beliebige Anforderungen gelten. Um
  420. diese scheinbaren Widersprüche aufzulösen, kennt FlexCat die
  421. Quelltextbeschreibungen. Das sind Dateien, die gewissermaßen die Vorlage
  422. für den zu erzeugenden Quelltext bilden. Wie die Katalogbeschreibungen und
  423. -übersetzungen sind sie mit einem Editor erzeug- und bearbeitbar: Das ist
  424. es, was FlexCat so flexibel macht.
  425.  
  426.    FlexCat durchsucht die Quelltextbeschreibung nach gewissen Symbolen, die
  427. durch die in der Katalogbeschreibung gegebenen Werte ersetzt werden.
  428. Mögliche Symbole sind zum einen die mit einem Backslash eingeleiteten
  429. Steuerzeichen, die auch in den Strings der Katalogbeschreibung und der
  430. Katalogübersetzung erlaubt sind, zum anderen aber Steuerzeichen, die mit
  431. einem %-Zeichen beginnen: Für C-Programmierer ein wohlvertrautes Konzept.
  432. Mögliche Steuerzeichen sind:
  433.  
  434. %b
  435.      ist der Basisname der Quelltextbeschreibungsdatei. (Für
  436.      FlexCat.cd als CDFILE wäre also FlexCat der Basisname. Wie
  437.      schon erwähnt, kommt es deshalb beim Argument CDFILE sehr wohl auf
  438.      Groß-/Kleinschreibung an; siehe Programmstart)
  439.  
  440. %v
  441.      ist die Versionsnummer aus der Katalogbeschreibung, nicht zu
  442.      verwechseln mit dem Versionsstring aus der Katalogübersetzung.
  443.  
  444. %l
  445.      ist die Sprache der Katalogbeschreibung. Bitte beachten Sie, daß hier
  446.      ein String eingesetzt wird, dessen Aussehen mit dem Kommando
  447.      ##stringtype beeinflußt wird.
  448.  
  449. %n
  450.      ist die Anzahl der Strings in der Katalogbeschreibung.
  451.  
  452. %%
  453.      ist das Prozentzeichen selbst.
  454.  
  455.    Das wesentlichste sind aber die folgenden Steuerzeichen. Sie
  456. repräsentieren auf unterschiedliche Art und Weise die Strings der
  457. Katalogbeschreibung.  Zeilen die eines dieser Zeichen enthalten, werden von
  458. FlexCat für jeden Katalogstring wiederholt, da im Normalfall kaum alle
  459. Strings in eine Zeile passen würden.
  460.  
  461. %i
  462.      ist der Bezeichner aus der Katalogbeschreibung.
  463.  
  464. %d
  465.      ist die ID des Strings
  466.  
  467. %s
  468.      ist der String selbst; dieser wird in einer von der Programmiersprache
  469.      abhängigen Art und Weise dargestellt. Dies kann mit den Kommandos
  470.      ##stringtype und ##shortstrings beeinflußt werden.
  471.  
  472. %(...)
  473.      gibt an, daß der zwischen den Klammern stehende Text bei allen Strings
  474.      außer dem letzten auftauchen soll. Dies ist z.B. bei Arrays nützlich,
  475.      wenn unterschiedliche Arrayeinträge durch ein Komma getrennt werden
  476.      sollen, nach dem letzten aber kein Komma mehr kommen soll: Dann würde
  477.      man nach dem Stringeintrag eben %(,) schreiben. Beachten Sie, daß
  478.      der Text zwischen den Klammern nicht weiter auf %-Symbole untersucht
  479.      wird. Backslash-Sequenzen sind allerdings weiter erlaubt.
  480.  
  481.    Die Steuerzeichen %l und %s erzeugen Strings. Die Darstellung von
  482. Strings hängt natürlich von der Programmiersprache ab, für die Quelltext
  483. erzeugt werden soll. Deshalb können in die Quelltextbeschreibung ähnlich
  484. wie in der Katalogübersetzung Kommandos eingebaut werden. Diese müssen am
  485. Zeilenanfang stehen und jeweils eine eigene Zeile einnehmen. Die möglichen
  486. Kommandos sind:
  487. ##shortstrings
  488.      gibt an, daß lange Strings über mehrere Zeilen verteilt werden
  489.      dürfen.  Dies ist nicht in allen Programmiersprachen ohne weiteres
  490.      möglich und vor allem besonders stark von der verwendeten
  491.      Programmiersprache abhängig.  Deshalb werden vorgabemäßig notfalls
  492.      eben sehr lange Zeilen erzeugt.
  493.  
  494. ##stringtype <art>
  495.      gibt die Syntax der Strings an. Mögliche Arten sind:
  496.     None
  497.           Es werden keinerlei zusätzliche Zeichen erzeugt und lediglich die
  498.           Zeichen des Strings ausgegeben. Es ist keine Ausgabe von
  499.           Binärzeichen (das sind die mit dem Backslash erzeugten Zeichen)
  500.           möglich.
  501.  
  502.     C
  503.           erzeugt Strings gemäß den Regeln der Programmiersprache C, d.h.
  504.           die Strings werden links und rechts mit je einem
  505.           Anführungszeichen abgegrenzt. Falls Strings über mehrere Zeilen
  506.           verteilt werden, so werden die Zeilen bis auf die letzte mit
  507.           einem Backslash beendet. (Der Backslash ist innerhalb von Makros
  508.           nötig.) Steuerzeichen werden mit \OOO ausgegeben.  Siehe C.
  509.  
  510.     Oberon
  511.           wie der Stringtyp bei C, allerdings wird kein Backslash bei
  512.           Zeilentrennung erzeugt. Siehe Oberon.
  513.  
  514.     Assembler
  515.           Strings werden mit dc.b erzeugt und links und rechts mit einem
  516.           einfachen Anführungsstrich abgegrenzt. Binärzeichen werden mit
  517.           $XX erzeugt.  Siehe Assembler.
  518.  
  519.     E
  520.           Strings werden mit je einem ' umgeben. Mehrzeilihe Strings werden
  521.           durch ein '+' konkateniert. Binärzeichen win in C.
  522.  
  523.    Als Beispiel betrachten wir einen Auszug aus der
  524. Quelltextbeschreibungsdatei C_h.sd, die eine Include-Datei für die
  525. Programmiersprache C erzeugt:
  526.      ##stringtype C
  527.      ##shortstrings
  528.      
  529.      #ifndef %b_CAT_H    /*    Sicherstellen, daß Include-Datei    */
  530.      #define %b_CAT_H    /*    nur einmal verwendet wird.        */
  531.      
  532.      
  533.      #ifndef EXEC_TYPES_H        /*  Nötige andere Include-  */
  534.      #include <exec/types.h>     /*  Dateien einbinden.        */
  535.      #endif
  536.      #ifndef LIBRARIES_LOCALE_H
  537.      #include <libraries/locale.h>
  538.      #endif
  539.      
  540.      
  541.      /*  Prototypen    */
  542.      extern void Open%bCatalog(struct Locale *, STRPTR);
  543.      extern void Close%bCatalog(void);
  544.      extern STRPTR Get%bString(LONG);
  545.      
  546.      /*  Definitionen der Bezeichner und ihrer ID's              */
  547.      #define %i %d    /*  Diese Zeile wird für jeden Katalog-     */
  548.              /*  wiederholt.                 */
  549.      
  550.      #endif
  551.  
  552. Benutzung in eigenen Programmen
  553. *******************************
  554.  
  555.    Wie der Quelltext benutzt wird, hängt natürlich vom erzeugten
  556. Quelltext und damit von den jeweiligen Quelltextbeschreibungen ab.  Siehe
  557. Source description. Es kann hier deshalb nur auf die mit FlexCat
  558. mitgelieferten Quelltextbeschreibungsdateien eingegangen werden.
  559.  
  560.    Alle diese Dateien sind so aufgebaut, daß das fertige Programm auf jeden
  561. Fall auch ohne die locale.library arbeitet. Allerdings muß es eine
  562. globale Variable LocaleBase (d.h. _LocaleBase für
  563. Assembler-Programmierer) geben und diese muß mit NULL oder durch einen
  564. Aufruf von Exec.OpenLibrary initialisiert sein. Im ersten Fall werden
  565. natürlich nur die eingebauten Strings aus der Katalogbeschreibung
  566. verwendet. Eine Ausnahme stellt die Quelltextbeschreibung C_c_V20.sd dar,
  567. die auch unter der Workbench 2.0 Lokalisierung ermöglicht, indem sie evtl.
  568. die locale.library durch die iffparse.library ersetzt.  (Diese Version
  569. benötigt dann auch eine Variable IFFParseBase für die das gleiche wie
  570. für LocaleBase gilt.) Siehe C. Als Programmierer benötigen Sie
  571. keinerlie Kenntnisse dieser Libraries, außer Sie wollen eigene
  572. Quelltextbeschreibungen erzeugen.
  573.  
  574.    Es gibt lediglich 3 Funktionen, die aufzurufen recht simpel ist:
  575.  
  576.  - : OpenCatalog (locale, language)
  577.      Diese Funktion versucht, einen Katalog zu eröffnen. Das Argument
  578.      locale ist ein Zeiger auf eine Locale-Struktur, language ein
  579.      Zeiger auf einen String, der den Namen der gewünschten Sprache
  580.      enthält.  Beide Argumente werden an die Locale-Funktion OpenCatalog
  581.      übergeben und sollten normalerweise immer NULL (bzw. NIL) sein, da
  582.      andernfalls die Voreinstellungen des Benutzers überschrieben werden.
  583.      Näheres ist in den AutoDocs nachzulesen.
  584.  
  585.      Hat der Benutzer als Vorgabesprachen etwa Deutsch und Français
  586.      eingestellt und der Basisname des Programms ist XXX, so wird
  587.      nacheinander nach folgenden Dateien gesucht:
  588.               PROGDIR:Catalogs/Deutsch/XXX.catalog
  589.               LOCALE:Catalogs/Deutsch/XXX.catalog
  590.               PROGDIR:Catalogs/Français/XXX.catalog
  591.               LOCALE:Catalogs/Français/XXX.catalog
  592.      Dabei ist PROGDIR: das aktuelle Directory des Programms. Die
  593.      Reihenfolge von PROGDIR: und LOCALE: kann evtl. vertauscht werden,
  594.      falls dadurch ein Requester wie Insert volume YYY unterdrückt
  595.      werden kann.
  596.  
  597.      OpenCatalog ist vom Typ void (für Modula2-Programmierer: Eine
  598.      Prozedur), liefert also kein Ergebnis.
  599.  
  600.  - : GetString (ID)
  601.      Diese Funktion liefert einen Zeiger auf den Katalogstring mit der
  602.      angegebenen Nummer. Die ID wird in der Katalogbeschreibung definiert.
  603.      Es versteht sich von selbst, daß die Strings Eigentum der
  604.      locale.library sind und deshalb nicht verändert werden dürfen.
  605.  
  606.      Ein Beispiel ist vielleicht nützlich. Im Beispiel aus der
  607.      Katalogbeschreibung wird der String msgHello definiert. Die
  608.      Quelltextbeschreibungen deklarieren nun eine Konstante msgHello, der
  609.      die ID repräsentiert.  Damit könnte der String in C so ausgegeben
  610.      werden:
  611.               printf("%s\n", GetString(msgHello));
  612.  
  613.  - : CloseCatalog (void)
  614.      Mit dieser Funktion wird der Katalog (das heißt das belegte RAM) vor
  615.      dem Programmende wieder freigegeben. Die Funktion kann gefahrlos zu
  616.      jeder Zeit aufgerufen werden, sogar wenn OpenCatalog gar nicht
  617.      aufgerufen wurde.
  618.  
  619. FlexCat-Quelltext in C-Programmen
  620. =================================
  621.  
  622.    Der C-Quelltext besteht aus zwei Teilen: Einer .c-Datei, die einfach
  623. übersetzt und mit dem Linker eingebunden wird und nicht weiter zu
  624. interessieren braucht und einer .h-Datei, die vom benutzenden Programm
  625. mit #include eingebunden wird. In ihr werden die ID's der Strings als
  626. Makro definiert.
  627.  
  628.    Dabei gibt es zwei unterschiedliche Versionen: C_c_V21.sd ist eine
  629. recht simple Version, die einfach die entsprechenden Funktionen der
  630. locale.library benutzt. Dementsprechend ist mit ihr Lokalisierung ab
  631. Workbench 2.1 möglich. Dagegen ersetzt C_c_V20.sd unter 2.0 evtl. die
  632. locale.library durch die iffparse.library. Das setzt allerdings voraus,
  633. daß das Programm eine Option Language besitzt, die die Wahl einer Sprache
  634. ermöglicht und deren Wert dann an OpenCatalog übergeben wird.  Unter
  635. 2.1 oder höher sollte diese Option nicht benutzt werden.
  636.  
  637.    Es wäre prinzipiell durchaus denkbar, auch eine dritte Version zu
  638. schreiben, die Lokalisierung sogar unter 1.3 ermöglicht, aber das habe ich
  639. nicht getan, da ich 1.3 nicht mehr unterstützen möchte.
  640.  
  641.    Um die FlexCat-Funktionen OpenCatalog und CloseCatalog von den
  642. gleichnamigen Locale-Funktionen zu unterscheiden und um theoretisch auch
  643. das gleichzeitige Eröffnen mehrerer Kataloge zu ermöglichen, tragen die
  644. FlexCat-Funktionen etwas geänderte Namen, nämlich OpenXXXCatalog,
  645. CloseXXXCatalog und GetXXXString. Dabei ist XXX der Basisname aus
  646. der Quelltextbeschreibung. Das Konzept ist von der GadToolsBox übernommen
  647. und meines Erachtens bewährt. Siehe Source description.
  648.  
  649.    Die Prototypen der Funktionen sind:
  650.          void OpenXXXCatalog(struct Locale *loc, char *language);
  651.          STRPTR GetXXXString(ULONG);
  652.          void CloseXXXCatalog(void);
  653.  
  654.    Für ein Beispiel eines C-Programms mit FlexCat-Funktionen siehe
  655. Uebersicht.
  656.  
  657. FlexCat-Quelltext in Oberon-Programmen
  658. ======================================
  659.  
  660.    Es gibt zwei unterschiedliche Quelltextbeschreibungen:
  661. Oberon_V38.sd erzeugt Quelltext, der Locale.mod von Hartmut Goebel
  662. verwendet.  Der mit Oberon_V39.mod erzeugte Quelltext benötigt dagegen
  663. das beim AmigaOberon mitgelieferte Locale.mod.
  664.  
  665.    Die Prototypen der Funktionen sind:
  666.          XXX.OpenCatalog(loc: Locale.LocalePtr; language : ARRAY OF CHAR);
  667.          XXX.GetString(num: LONGINT): Exec.StrPtr;
  668.          XXX.CloseCatalog();
  669.  
  670. Dabei ist XXX jeweils der Basisname aus der Quelltextbeschreibung.  Siehe
  671. Source description.
  672.  
  673.    Zum Schluß noch ein Beispiel eines Programms, das den von FlexCat
  674. erzeugten Quelltext verwendet:
  675.          MODULE HelloLocalWorld;
  676.      
  677.          IMPORT  x:=HelloLocalWorld_Cat; Dos;
  678.      
  679.          BEGIN
  680.            x.OpenCatalog(NIL, "");
  681.      
  682.            Dos.PrintF("%s\n", x.GetString(x.msgHello));
  683.      
  684.            (* Katalog wird beim Programmende automatisch *)
  685.            (* geschlossen.                               *)
  686.          END Irgendwas;
  687.  
  688. FlexCat-Quelltext in Assembler-Programmen
  689. =========================================
  690.  
  691.    Der Assembler-Quelltext erzeugt Code für den Aztec-Assembler. Dieser
  692. dürfte sich aber kaum wesentlich von anderen verbreiteten Assemblern
  693. unterscheiden und es sollte ohne große Probleme möglich sein, daraus eine
  694. eigene Quelltextbeschreibung zu machen. Der Quelltext besteht aus zwei
  695. Teilen: Einer .asm-Datei, die einfach übersetzt und mit dem Linker
  696. eingebunden wird und nicht weiter zu interessieren braucht und einer
  697. .i-Datei, die vom benutzenden Programm mit include eingebunden
  698. wird. In ihr werden die ID's der Strings definiert.
  699.  
  700.    Um theoretisch auch das gleichzeitige Eröffnen mehrerer Kataloge zu
  701. ermöglichen, tragen die FlexCat-Funktionen etwas geänderte Namen, nämlich
  702. OpenXXXCatalogCloseXXXCatalog und GetXXXString. Dabei ist XXX der
  703. Basisname aus der Quelltextbeschreibung. Das Konzept ist von der
  704. GadToolsBox übernommen und meines Erachtens bewährt.  Siehe Source
  705. description.
  706.  
  707.    Die Funktionen liefern wie üblich das Ergebnis in d0 und sichern die
  708. Register d2-d7 und a2-a7. OpenCatalog erwartet seine Argumente in a0
  709. (Zeiger auf Locale-Struktur) und in a1 (Zeiger auf String mit zu
  710. verwendender Sprache). Wie schon erwähnt, sollten diese Argumente im
  711. Normalfall immer NULL sein. GetString erwartet in d0 eine ID.
  712.  
  713.    Zum Schluß noch ein Beispiel eines Programms, das FlexCat verwendet.
  714.      *   HelloLocalWorld.asm
  715.      
  716.          include "HelloLocalWorld_Cat.i"
  717.              /*  Enthält xref OpenHelloLocalWorldCatalog usw.    */
  718.      
  719.          xref    _LVOOpenLibrary
  720.          xref    _LVOCloseLibrary
  721.          xref    _AbsExecBase
  722.      
  723.          dseg
  724.      LocNam: dc.b    "locale.library",0
  725.          dc.l    _LocaleBase,4        ; Dieser Name ist obligatorisch
  726.      
  727.          cseg
  728.      
  729.      main:    move.l    #38,d0            ; Locale eröffnen
  730.          lea    LocName,a1
  731.          move.l    _AbsExecBase.a6
  732.          jsr    _LVOOpenLibrary(a6)
  733.      *  KEIN Abbruch, falls OpenLibrary() nicht erfolgreich! (Natürlich nur,
  734.      *   wenn Locale-Funktionen nicht anderweitig benutzt werden.
  735.      
  736.          sub.l    a0,a0
  737.          sub.l    a1,a1
  738.          jsr    OpenHelloLocalWorldCatalog  ; Katalog eröffnen
  739.      
  740.          move.l    #msgHello,d0        ; Zeiger auf String holen
  741.          jsr    GetHelloLocalWorldString
  742.          jsr    PrintD0         ; und ausgeben
  743.      
  744.          jsr    CloseHelloLocalWorldCatalog ; Katalog schließen
  745.          move.l    _LocaleBase,a1        ; Locale evtl. schließen
  746.          move.l    a1,d0
  747.          beq    Ende
  748.          jsr    CloseLibrary
  749.      Ende:
  750.          rts
  751.          end
  752.  
  753. FlexCat-Quelltext in E-Programmen
  754. =================================
  755.  
  756.    E unterscheidet sich in einem Punkt wesentlich von anderen
  757. Programmiersprachen: Man kann Quelltexte nicht ueber mehrere Dateien
  758. verteilen und den erzeugten Code später linken. Die beste Lösung dieses
  759. Problems ist die Verwendung von EPP von Barry Wills. (Quellen: Aminet,
  760. Directory dev/e oder die Fish-Disks) Dies macht es möglich, die von
  761. FlexCat mit der Quelltextbeschreibung E21b.sd erzeugten Quelltexte mit
  762. einer einzigen Zeile einzubinden:
  763.          PMODULE 'xxx_cat'
  764.  
  765. wobei xxx der Basisname des Programms ist. Ohne EPP muß man die
  766. FlexCat-Quelltexte von Hand in den eigenen Quelltext einfügen. Dies muß
  767. nach der letzten Definition und vor der ersten Prozedur geschehen.
  768. Andernfalls wäre es nötig, mehr als eine Datei mit FlexCat zu erzeugen
  769. und einzufügen.
  770.  
  771.    Der erzeugte Quelltext enthält Funktionen get_xxx_string,
  772. open_xxx_catalog und close_xxx_catalog.  (Diese leicht
  773. modifizierten Namen erlauben die Verwendung mehrerer Kataloge in einem
  774. einzigen Programm.) Bitte beachten Sie, daß es (anders als in C zum
  775. Beispiel) nicht möglich ist, get_xxx_string vor open_xxx_string aufzurufen!
  776.  
  777.    Eine Datei HelloLocalWorld.e könnte unter Verwendung von EPP so
  778. aussehen:
  779.          /*    HelloLocalWorld.e   */
  780.      
  781.          PMODULE hellolocalworld_cat
  782.      
  783.          PROC main()
  784.      
  785.          /*    Locale.library eröffnen;            */
  786.          /*    Kein Abbruch, falls nicht vorhanden!    */
  787.          localebase := OpenLibrary('locale.library', 0)
  788.      
  789.          /*    Katalog eröffnen                */
  790.          open_hellolocalworld_catalog(NIL, NIL)
  791.      
  792.          WriteF('\s\n', get_hellolocalworld_string(MSG_HELLO_WORLD))
  793.      
  794.          close_hellolocalworld_catalog()
  795.          ENDPROC
  796.  
  797. Weiterentwicklung des Programms
  798. *******************************
  799.  
  800.    Ich beabsichtige eigentlich nicht, das Programm wesentlich
  801. weiterzuentwickeln, denke auch nicht, daß das nötig sein wird, bin aber
  802. natürlich trotzdem für jegliche Anregung, Vorschläge oder notfalls auch
  803. Kritik offen. Was ich auf jeden Fall gerne machen werde, sind andere
  804. Stringtypen, falls sich diese für andere Programmiersprachen als notwendig
  805. erweisen sollten.
  806.  
  807.    Ferner wäre ich auf jeden Fall dankbar für weitere
  808. Quelltextbeschreibungen und würde diese gerne in einer späteren Version
  809. öffnetlich zugänglich machen - egal, welche Programmiersprache oder mit
  810. welchen Erweiterungen.  Voraussetzung ist natürlich, daß der von diesen
  811. Quelltextbeschreibungen erzeugte Code in einem laufenden Programm
  812. erfolgreich erprobt wurde.
  813.  
  814.    Ebenso dankbar wäre ich natürlich auch für neue Kataloge. Es genügt
  815. der Eintrag der entsprechenden Strings in der Datei NewCatalogs.ct.  Wie
  816. das geht, sollte nach der Lektüre dieser Dokumentation hoffentlich klar
  817. sein.
  818.  
  819. Danksagungen
  820. ************
  821.  
  822.    Danken möchte ich:
  823.  
  824. Albert Weinert
  825.      für KitCat, den Vorgänger von FlexCat, der mir gute Dienste
  826.      geleistet hat, aber irgendwann eben nicht flexibel genug war.
  827.  
  828. Reinhard Spisser und Sebastiano Vigna
  829.      für die Amiga-Version von texinfo, mit der diese Dokumentation
  830.      geschrieben ist.
  831.  
  832. Der Free Software Foundation
  833.      für die Urversion von texinfo und für viele andere hervorragende
  834.      Programme.
  835.  
  836. Matt Dillon
  837.      für DICE und besonders für DME.
  838.  
  839. Alessandro Galassi
  840.      für den italienischen Katalog.
  841.  
  842. Lionel Vintenat
  843.      für die E-Quelltextbeschreibung und ihre Dokumentation, den
  844.      französichen Katalog und Fehlermeldungen.
  845.  
  846. Den Leuten von #AmigaGer
  847.      für die Beantwortung vieler dummer Fragen und für viele Augenblicke
  848.      erfreulich ungezügelten Schwachsinns :-), z.B.  stefanb (Stefan
  849.      Becker), PowerStat (Kai Hoffmann), \ ill (Markus Illenseer), Quarvon
  850.      (Jürgen Lang), ZZA (Bernhard Möllemann), Tron (Mathias Scheler),
  851.      mungo (Ignatios Souvlatzis), \ jow (Jürgen Weinelt) und Stargazer
  852.      (Petra Zeidler).
  853.  
  854. Commodore
  855.      für den Amiga und für die Kickstart 2.0 :-) Macht weiter mit der
  856.      Kiste, dann bin ich vielleicht auch die nächsten 8 Jahre
  857.      Amiga-Benutzer!
  858.  
  859. Index
  860. *****
  861.  
  862.  
  863.  
  864.  Übersicht                             Uebersicht
  865.  .cd                                    Catalog description
  866.  .ct                                    Catalog translation
  867.  .sd                                    Source description
  868.  Adresse                                Copyright
  869.  Ascii-Code                             Catalog description
  870.  Assembler                              Assembler
  871.  Autor                                  Copyright
  872.  AztecAs_asm.sd                         Assembler
  873.  AztecAs_i.sd                           Assembler
  874.  Beiträge                              Zukunft
  875.  Benutzung                              Benutzung
  876.  C                                      C
  877.  Catalog description                    Catalog description
  878.  Catalog translation                    Catalog translation
  879.  Compiler                               Uebersicht
  880.  Copyright                              Copyright
  881.  C_c_V20.sd                             C
  882.  C_c_V21.sd                             C
  883.  C_h.sd                                 C
  884.  Danksagungen                           Danksagungen
  885.  Deutsch.ct                             Catalog translation
  886.  Distribution                           Copyright
  887.  E                                      E
  888.  E21b.sd                                E
  889.  E21b_defs.sd                           E
  890.  E21b_procs.sd                          E
  891.  EPP                                    E
  892.  FlexCat.cd                             Catalog description
  893.  Genehmigungen                          Copyright
  894.  Installation                           Installation
  895.  Internet                               Copyright
  896.  Katalogübersetzung                    Catalog translation
  897.  Katalogbeschreibung                    Catalog description
  898.  Mail                                   Copyright
  899.  Oberon                                 Oberon
  900.  Oberon_V38.sd                          Oberon
  901.  Oberon_V39.sd                          Oberon
  902.  Programmiersprache                     Uebersicht
  903.  Quelltextbeschreibung                  Source description
  904.  Rechtliche Dinge                       Copyright
  905.  Source description                     Source description
  906.  Steuerzeichen                          Catalog description
  907.  Systemanforderungen                    Installation
  908.  Verbote                                Copyright
  909.  Weiterentwicklung                      Zukunft
  910.  Zukunft                                Zukunft
  911.  
  912.