use the new flexcat's source description file
[AROS.git] / tools / flexcat / doc / FlexCat_german.texinfo
blobad9d83489506a52e8267d44f5095615e324c2f03
1 \input amigatexinfo
2 \input texinfo
3 @c %**start of header
4 @setfilename FlexCat_deutsch.guide
5 @settitle FlexCat @value{VERSION}    Dokumentation
6 @setchapternewpage off
8 @c
9 @c  FlexCat:                The flexible catalog generator          V1.7
10 @c  Copyright (C)   1993    Jochen Wiedmann
12 @c  This program is free software; you can redistribute it and/or modify
13 @c  it under the terms of the GNU General Public License as published by
14 @c  the Free Software Foundation; either version 2 of the License, or
15 @c  (at your option) any later version.
17 @c  This program is distributed in the hope that it will be useful,
18 @c  but WITHOUT ANY WARRANTY; without even the implied warranty of
19 @c  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 @c  GNU General Public License for more details.
22 @c  You should have received a copy of the GNU General Public License
23 @c  along with this program; if not, write to the Free Software
24 @c  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 @c  This file contains the german documentation.
29 @c  Computer:   Amiga 1200                  Compiler:   DICE V2.07.54 (3.0)
31 @c  Autor:      Jochen Wiedmann
32 @c              Am Eisteich 9
33 @c        72555 Metzingen
34 @c              Tel. 07123 / 14881
35 @c              Internet: wiedmann@uni-tuebingen.de
38 @set VERSION 1.7
39 @set xrefstring siehe
40 @set Xrefstring Siehe
41 @set Chapterstring Abschnitt
42 @set Sectionstring Abschnitt
43 @set sectionstring Abschnitt
44 @set pagestring Seite
45 @set Contentsstring Inhaltsverzeichnis
46 @iftex
47 @afourpaper
48 @parskip=0.75em
49 @end iftex
50 @c %**end of header
53 @titlepage
55 @title{FlexCat}
56 @subtitle{Der flexible Kataloggenerator}
57 @subtitle{}
58 @subtitle{Version @value{VERSION}}
59 @author Jochen Wiedmann
60 @vskip 0pt plus 1filll
61 @tex
62 @halign{@hfil#&#@hfil@cr
63 Copyright @copyright 1993 & Jochen Wiedmann@cr
64            & Am Eisteich 9@cr
65           72555 & Metzingen (Deutschland)@cr
66            & Tel. 07123 / 14881@cr
67            & Internet: wiedmann@@uni-tuebingen.de@cr
69 @end tex
71 Diese Dokumentation sowie das gesamte Programmpaket dürfen im Rahmen der
72 ``GNU General Public License''
73 kopiert, verändert und weitergegeben werden solange diese
74 Copyright-Notiz und diese Erlaubnis unverändert auf allen Kopien enthalten
75 ist und die
76 ``GNU General Public License'' der Free Software Foundation (in der Datei
77 @code{COPYING}) mitkopiert und weitergegeben wird.
79 @ignore
80 Permission is granted to process this file by TeX and print the results,
81 provided the printed document carries a copying permission notice identical to
82 this one except for the removal of this paragraph (this paragraph not being
83 relevant to the printed manual).
84 @end ignore
86 Es wird @strong{keine} Garantie gegeben, daß die Programme, die in dieser
87 Dokumentation beschrieben werden, 100%ig zuverlässig sind. Sie benutzen
88 diese Programme auf eigene Gefahr. Der Autor kann auf @strong{keinen} Fall
89 für irgendwelche Schäden verantwortlich gemacht werden, die durch die
90 Anwendung dieser Programme entstehen.
91 @end titlepage
92 @iftex
93 @headings double
94 @end iftex
96 @ifinfo
97 @node Top
98 @top FlexCat V@value{VERSION} Dokumentation
99 Diese Datei beschreibt den Umgang mit FlexCat V@value{VERSION}, einem
100 Programm zur Erzeugung von Catalogs und dem sie verwendenden Quelltext.
101 FlexCat arbeitet wie @code{CatComp} oder @code{KitCat}, kann aber praktisch
102 beliebigen Quelltext erzeugen. Dies funktioniert durch sogenannte
103 @code{Source-description-Dateien}, die gewissermaßen eine Vorlage für den
104 zu erzeugenden Quelltext darstellen. Sie können mit einem Editor bearbeitet
105 und verändert werden und dadurch hoffentlich an beliebige Programmiersprachen
106 und Bedürfnisse angepaßt werden.
108 @menu
109 Allgemeines:
111 * Copyright::           Copyrights, (Nicht)-Garantie
112 * Übersicht:Uebersicht. Was ist FlexCat?
113 * Installation::        Wie kriege ich das Ding zum Laufen?
115 Arbeit mit dem Programm:
117 * Programmstart::       Aufruf des Programms
118 * Catalog description:: Katalogbeschreibungsdateien (@key{.cd}-Dateien)
119 * Catalog translation:: Katalogübersetzungsdateien (@key{.ct}-Dateien)
120 * Source description::  Quelltextbeschreibungsdateien (@key{.sd}-Dateien)
121 * Benutzung::           Einbau des erzeugten Quelltextes in eigene Programme
123 Überflüssiges:
125 * Zukunft::             Weiterentwicklung des Programms
126 * Danksagungen::        Was ich schon lange mal sagen wollte@dots{}
127 * Index::               Wo das steht, was garantiert nicht gesucht wird
128 @end menu
129 @end ifinfo
135 @ifinfo
136 @node Copyright
137 @chapter Copyright und andere rechtliche Dinge
138 @cindex Copyright
139 @cindex Distribution
140 @cindex Rechtliche Dinge
141 @cindex Genehmigungen
142 @cindex Verbote
143 @cindex Autor
144 @cindex Adresse
145 @cindex Internet
146 @cindex Mail
147 @example
148 Copyright @copyright{} 1993     Jochen Wiedmann
149                         Am Eisteich 9
150                   72555 Metzingen (Deutschland)
151                         Tel. 07123 / 14881
152                         Internet: wiedmann@@uni-tuebingen.de
153 @end example
155 Diese Dokumentation sowie das gesamte Programmpaket dürfen im Rahmen der
156 ``GNU General Public License''
157 kopiert, verändert und weitergegeben werden solange diese
158 Copyright-Notiz und diese Erlaubnis unverändert auf allen Kopien enthalten
159 ist und die
160 ``GNU General Public License'' der Free Software Foundation (in der Datei
161 @code{COPYING}) mitkopiert und weitergegeben wird.
163 @ignore
164 Permission is granted to process this file by TeX and print the results,
165 provided the printed document carries a copying permission notice identical to
166 this one except for the removal of this paragraph (this paragraph not being
167 relevant to the printed manual).
168 @end ignore
170 Es wird keine Garantie gegeben, daß die Programme, die in dieser Dokumentation
171 beschrieben werden, 100%ig zuverlässig sind. Sie benutzen diese Programme auf
172 eigene Gefahr. Der Autor kann auf @strong{keinen} Fall für irgendwelche
173 Schäden verantwortlich gemacht werden, die durch die Anwendung dieser
174 Programme entstehen.
175 @end ifinfo
179 @node Uebersicht
180 @chapter Übersicht
181 @cindex Übersicht
182 @cindex Compiler
183 @cindex Programmiersprache
184 Seit der Workbench 2.1 bietet der Amiga ein sehr schönes System an, mit
185 dem Programme in verschiedenen, praktisch beliebigen Sprachen benutzt
186 werden können: Die @code{locale.library}. (Man nennt diesen Vorgang
187 @code{Lokalisierung}, daher der Name.)
189 Die Idee ist eigentlich recht simpel: Man wählt eine Sprache, meist die
190 englische aus und schreibt sein Programm ganz normal, abgesehen davon,
191 daß Strings nicht mehr direkt eingegeben werden, sondern über einen
192 Funktionsaufruf im Programm verwendet werden. Durch einen weiteren
193 Funktionsaufruf zu Beginn des Programms erhält der Benutzer nun die
194 Möglichkeit, anstelle der vorgegebenen Strings andere zu wählen, die in
195 einer externen Datei, einem sogenannten @code{Katalog} enthalten sind.
197 Diese Katalogdateien sind vom Programm unabhängig. Möchte man das Programm
198 in einer weiteren Sprache betreiben, so ist lediglich eine neue Katalogdatei
199 zu erzeugen, das eigentliche Programm muß nicht geändert werden.
201 Auf den Programmierer kommen dadurch aber zusätzliche Aufgaben hinzu: Es
202 müssen die Kataloge erzeugt werden, die Strings nach wie vor eingegeben
203 werden und es muß zusätzlicher Code erzeugt werden, der die Behandlung der
204 Kataloge übernimmt. Dies soll durch FlexCat so weit wie möglich vereinfacht
205 und automatisiert werden, ohne dabei auf Flexibilität (vor allem in Bezug
206 auf den erzeugten Quelltext) zu verzichten. Betrachten wir als Beispiel
207 ein Programm @file{HelloLocalWorld.c}. Das Programm wird letzten Endes so
208 aussehen:
209 @example
210     #include <stdio.h>
211     #include <stdlib.h>
212     #include <HelloLocalWorld_Cat.h>  /* @strong{Muß} eingebunden werden! */
214     void main(int argc, char *argv[])
215     @{
216       printf("%s\n", msgHello);
217     @}
218 @end example
219 @noindent
220 Beachten Sie, daß dies dem originalen @file{HelloWorld.c} fast völlig
221 entspricht, abgesehen davon, daß der String "Hello, world!" durch eine
222 Konstante msgHello ersetzt wird.
224 Man beginnt stets damit, diese Konstanten und die zugeordneten Strings
225 in einer sogenannten @code{Katalogbeschreibung} abzulegen. @xref{Catalog
226 description}. Unsere Katalogbeschreibung würde
227 in einer Datei @file{HelloLocalWorld.cd} stehen und so aussehen:
228 @example
229     ;   Kommentare sind natürlich erlaubt! Jede mit einem Semikolon
230     ;   beginnende Zeile ist eine Kommentarzeile.
231     ;
232     ;   Die Sprache der eingebauten Strings:
233     #language english
234     ;
235     ;   Die für den Aufruf von Locale/OpenCatalog() verwendete
236     ;   Versionsnummer. Dies ist anders als bei Exec/OpenLibrary():
237     ;   0 bedeutet beliebige Version, andere Nummern müssen exakt
238     ;   stimmen!
239     #version 0
240     ;
241     ;   Dies definiert einen String und die ID unter der er verwendet
242     ;   wird. Die Zahl 4 gibt an, daß der String wenigstens 4 Zeichen
243     ;   enthalten sollte.
244     msgHello (/4/)
245     Hello, world!
246 @end example
248 Mit FlexCat erzeugt man aus der Katalogbeschreibung zwei andere Dateien:
249 Das Includefile @file{HelloLocalWorld_Cat.h} definiert die Konstanten,
250 die Datei @file{HelloLocalWorld_Cat.c} enthält ein Array mit den Strings
251 sowie versteckte Initialisierungsroutinen. Wie diese genau aussehen, ist
252 unerheblich, insbesondere benötigt man keinerlei Kenntnisse der
253 @code{locale.library}!
255 Allerdings könnten Sie neugierig sein, wie diese Dateien aussehen oder
256 sogar ein anderes Aussehen wünschen. Hier liegt der Unterschied zwischen
257 FlexCat und anderen Kataloggeneratoren: Bei FlexCat ist kein bestimmtes
258 Format vorgeschrieben. Mit Hilfe der sogenannten Quelltextbeschreibungen
259 können Sie praktisch beliebige Formate vorgeben. Damit könnten z.B. auch
260 unter AmigaDOS 2.0 Kataloge verwendet werden. @xref{Source description}.
261 Solche Katalogbeschreibungen sind bei FlexCat bereits mitgeliefert
262 werden. Damit kann man die Quelltexte folgendermaßen erzeugen:
263 @example
264     @samp{FlexCat HelloLocalWorld.cd HelloLocalWorld_Cat.c=C_c.sd}
265     @samp{FlexCat HelloLocalWorld.cd HelloLocalWorld_Cat.h=C_h.sd}
266 @end example
268 Wenn das Programm fertig ist, dann wird FlexCat erneut verwendet, um
269 sogenannte @code{Katalogübersetzungen} zu erzeugen, eine für jede
270 weitere Sprache außer der eingebauten. @xref{Catalog translation}. Erzeugen
271 wir also eine deutsche Katalogübersetzung:
272 @example
273     @samp{FlexCat HelloLocalWorld.cd NEWCTFILE Deutsch.ct}
274 @end example
275 @noindent
276 Die fertige Datei sieht dann so aus:
277 @example
278     ## version
279     ## language
280     ## codeset 0
281     ;   Kommentare sind natürlich erlaubt! Jede mit einem Semikolon
282     ;   beginnende Zeile ist eine Kommentarzeile.
283     ;
284     ;   Die Sprache der eingebauten Strings:
285     ;
286     ;   Die für den Aufruf von Locale/OpenCatalog() verwendete
287     ;   Versionsnummer. Dies ist anders als bei Exec/OpenLibrary():
288     ;   0 bedeutet beliebige Version, andere Nummern müssen exakt
289     ;   stimmen!
290     ;
291     ;   Dies definiert einen String und die ID unter der er verwendet
292     ;   wird. Die Zahl 4 gibt an, daß der String wenigstens 4 Zeichen
293     ;   enthalten sollte.
294     msgHello
296     ;Hello, world!
297 @end example
298 @noindent
299 Dies sieht der Katalogbeschreibung sehr ähnlich. FlexCat übernimmt dabei
300 die Kommentare, auch dort wo es nutzlos ist: Z.B. ist der Kommentar zur
301 Länge der Strings hier bedeutungslos, da diese bereits in der
302 Katalogbeschreibung angegeben werden muß. Man muß nun lediglich die
303 Lücken füllen, d.h. die Sprache (language, hier Deutsch), die Version
304 (einen typischen Versionsstring, @samp{$VER: Deutsch.catalog (11.03.94)}
305 wäre z.B. gut möglich) und den codeset (hier 0, siehe Locale/OpenCatalog()
306 für Details) sowie natürlich die übersetzten Strings selber. FlexCat
307 erleichtert dies, indem die originalen Strings jeweils als Kommentare
308 eingefügt werden.
310 Schließlich werden daraus die eigentlichen Kataloge erzeugt:
311 @example
312     @samp{FlexCat HelloLocalWorld.cd Deutsch.ct CATALOG Deutsch.catalog}
313 @end example
314 @noindent
315 Beachten Sie, daß man dazu weder das Programm noch die Quelltexte benötigt.
316 Dies kann also ohne weiteres später geschehen, etwa um nachträglich weitere
317 Sprachen zu unterstützen. Es ist üblich und durchaus erwünscht, eine
318 Datei @file{NewCatalog.ct} mitzuliefern, die das Erstellen eigener Kataloge
319 erlaubt.
321 Aber was geschieht, wenn das Programm später geändert oder erweitert wird?
322 Dann muß nur die Katalogbeschreibung geändert werden. Mit Hilfe von
323 FlexCat können die Katalogübersetzungen auf den neuesten Stand gebracht
324 werden:
325 @example
326     @samp{FlexCat HelloLocalWorld.cd Deutsch.ct NEWCTFILE Deutsch.ct}
327 @end example
328 @noindent
329 Es müssen dann lediglich noch evtl. neue Strings eingegeben werden.
333 @node Installation
334 @chapter Installation des Programms
335 @cindex Installation
336 @cindex Systemanforderungen
337 FlexCat sollte auf jedem Amiga mit OS 2.0 laufen.
338 Die erzeugten Programme sind auf @strong{jedem} Amiga lauffähig (zumindest
339 was die Verwendung der @code{locale.library} betrifft). Prinzipiell
340 sind sie sogar auf anderen Rechnern lauffähig.
341 Lokalisierung ist aber natürlich nur auf dem Amiga und ab der
342 Workbench 2.1 möglich, da erst dann die @code{locale.library}
343 zur Verfügung steht. @xref{Benutzung}.
345 Es ist aber prinzipiell durchaus möglich, auch unter einer früheren
346 Workbench oder gar auf anderen Rechnern Lokalisierung anzubieten: Ein
347 Beispiel dafür liefert die Quelltextbeschreibungsdatei @file{C_c_V20.sd},
348 in der die @code{locale.library} durch die
349 @code{iffparse.library} ersetzt wird, falls letztere vorhanden ist, erstere
350 dagegen nicht. Damit ist Lokalisierung schon ab der Workbench 2.0 möglich.
351 @xref{C}.
353 Zur Installation ist nichts weiter zu tun, als das eigentliche Programm
354 an eine sinnvolle Stelle Ihres Suchpfades zu kopieren und einen geeigneten
355 Platz für die Quelltextbeschreibungen auszuwählen. Möglicherweise
356 wollen Sie die Umgebungsvariable @var{FLEXCAT_SDDIR} setzen.
357 @xref{Programmstart}.
359 Falls Sie mit einer anderen als der englischen Sprache arbeiten wollen,
360 müssen Sie außerdem den entsprechenden Katalog an eine geeignete Stelle
361 kopieren. Im Falle der deutschen Sprache wäre dies
362 @file{Catalogs/Deutsch/FlexCat.catalog}. Der einfachste Platz ist das
363 Verzeichnis @file{Locale:Catalogs/Deutsch}, möglich ist aber auch,
364 einfach das ganze Verzeichnis @file{Catalogs} in das Directory des
365 Programms zu kopieren. @xref{Benutzung}.
369 @node Programmstart
370 @chapter Aufruf des Programms
371 FlexCat arbeitet nur vom CLI aus. Die Aufrufsyntax ist
373 @example
374     FlexCat CDFILE/A,CTFILE,CATALOG/K,NEWCTFILE/K,SOURCES/M,WARNCTGAPS/S
375 @end example
377 Dies ist die Bedeutung der Argumente:
378 @table @strong
379 @item CDFILE
380 ist der (obligatorische) Name einer zu lesenden Katalogbeschreibung.
381 Aus diesem Argument wird auch der Basisname bei der Quelltextbeschreibung
382 gewonnen. Achten Sie deshalb auf Groß-/Kleinschreibung!
383 @xref{Source description}.
384 @item CTFILE
385 ist der Name einer Katalogübersetzung, die etwa für die Erzeugung eines
386 Katalogs zu lesen ist. Außerdem kann man eine vorhandene
387 Katalogübersetzung mit Hilfe des Argumentes NEWCTFILE
388 auf den neuesten Stand zu bringen: Wird beides angegeben, so wird zunächst
389 die Katalogbeschreibung und dann die -übersetzung gelesen und
390 anschließend eine neue Katalogübersetzung erzeugt, die dieselben
391 Strings wie die alte und evtl. neue Strings (als Leerzeile) enthält.
392 @item CATALOG
393 ist der Name eines zu erzeugenden Kataloges. Dieses Argument ist nur
394 gemeinsam mit CTFILE erlaubt.
395 @item NEWCTFILE
396 ist der Name einer neu zu erzeugenden Katalogübersetzung. Wie schon
397 gesagt, werden die Strings aus einer evtl. durch CTFILE angegebenen
398 bestehenden Datei übernommen. Fehlt das Argument CTFILE, so wird eine
399 Datei erzeugt, die nur Leerzeilen als Strings enthält.
400 @item SOURCES
401 sind die Namen zu erzeugender Quelltextdateien sowie der dazu zu lesenden
402 Quelltextbeschreibungen. Diese Argumente müssen die Form
403 @samp{source=template} haben, wobei @file{source} der Name der zu
404 erzeugenden Quelltextdatei und @file{template} der Name der
405 Quelltextbeschreibungsdatei ist.
407 Wird die angegebene Quelltextbeschreibung nicht gefunden, so sucht
408 FlexCat nach einer Datei gleichen Namens in @file{PROGDIR:lib}, d.h.
409 im Unterverzeichnis @file{lib} des Directories, in dem sich das
410 Programm selbst befindet. (@file{PROGDIR:lib} kann durch die
411 Environment-Variable @var{FLEXCAT_SDDIR} überschrieben werden.)
412 Beispiel: Mit
413 @example
414     @samp{FlexCat FlexCat.cd FlexCat_Cat.c=Templates/C_c_V20.sd}
415 @end example
416 @noindent
417 würde zunächst nach einer Datei @file{Templates/C_c_V20.sd} im aktuellen
418 Directory gesucht. Würde diese nicht gefunden, und es gäbe keine
419 Variable @var{FLEXCAT_SDDIR}, so würde nach einer Datei
420 @file{lib/Templates/C_c_V20.sd} im Directory des Programms FlexCat
421 gesucht. Gäbe es dagegen eine Variable @var{FLEXCAT_SDDIR} und diese
422 hätte etwa den Wert @samp{Work:FlexCat}, so würde nach der
423 Datei @file{Work:FlexCat/Templates/C_c_V20.sd} gesucht.
424 @item WARNCTGAPS
425 Gewöhnlich überprüft FlexCat nicht, ob eine Quelltextübersetzung
426 vollständig ist, d.h. ob alle Strings aus der Quelltextbeschreibung
427 auch in der -übersetzung vorkommen. Diese Option erzwingt die
428 Überprüfung.
429 @end table
431 Für weitere Beispiele siehe @ref{Uebersicht, Übersicht, Übersicht}.
435 @node Catalog description
436 @chapter Aufbau einer Katalogbeschreibung
437 @cindex Katalogbeschreibung
438 @cindex Catalog description
439 @cindex .cd
440 Eine Katalogbeschreibungsdatei enthält vier Arten von Zeilen.
442 @table @strong
443 @item Kommentarzeilen
444 Jede mit einem Semikolon beginnende Zeile ist eine Kommentarzeile, wird
445 also von FlexCat ignoriert. (Eine Ausnahme sind die unten beschriebenen
446 Stringzeilen, die sehr wohl mit einem Semikolon beginnen dürfen.)
448 @item Kommandozeilen
449 Mit einem '#' beginnende Zeilen enthalten ein Kommando. Mögliche Kommandos
450 sind (Groß-/Kleinschreibung wird ignoriert):
451 @table @code
452 @item #language <str>
453 gibt die Vorgabesprache des Programms an, d.h. die Sprache der Strings in
454 der Katalogbeschreibungsdatei. Vorgabe ist @samp{#language english}.
455 @item #version <num>
456 gibt die Versionsnummer der zu eröffnenden Kataloge an. Im Unterschied zu
457 @code{Exec/OpenLibrary} muß die Nummer genau stimmen, höhere Nummern werden
458 nicht akzeptiert. Eine Ausnahme ist es, hier die 0 als Versionsnummer
459 anzugeben, durch die jeder Katalog akzeptiert wird. Vorgabe ist
460 @samp{#version 0}. Zu diesen Befehlen siehe auch @code{Locale/OpenCatalog}.
461 @item #lengthbytes <num>
462 Weist das Programm an, vor jeden String die angegebene Zahl von Bytes zu
463 schreiben, die die Länge des Strings (ohne die lengthbytes) enthalten und
464 ohne abschließendes NUL-Byte angeben. (Ein NUL-Byte wird in Katalogen aber
465 trotzdem angehängt, im erzeugten Quelltext ist dies von der
466 Quelltextbeschreibungsdatei abhängig.) @samp{<num>} muß zwischen 0 und
467 sizeof(long)=4 liegen. Vorgabe ist @samp{#lengthbytes 0}.
468 @item #basename <str>
469 Setzt den Basisnamen für die Quelltextbeschreibung. Der aus den Argumenten
470 beim Aufruf des Programmnamens gewonnene Basisname (@pxref{Programmstart})
471 wird überschrieben. @xref{Source description}.
472 @end table
474 @item Beschreibungszeilen
475 deklarieren einen String. Sie haben die Form @samp{IDSTR (id/minlen/maxlen)},
476 wobei @samp{IDSTR} ein Bezeichner ist (d.h. ein aus den Zeichen a-z,A-Z,0-9
477 und dem Underscore bestehender String), @samp{id} eine eindeutige Nummer
478 (die von jetzt an als ID bezeichnet wird) angibt, @samp{minlen} die minimale
479 und @samp{maxlen} die maximale Länge
480 des Strings. Die drei letztgenannten dürfen auch fehlen, das Programm
481 wählt dann selbst einen Wert für @samp{id} und erlaubt Strings beliebiger
482 Länge. Die auf eine Beschreibungszeile folgende ist eine
484 @item Stringzeile,
485 @cindex Steuerzeichen
486 @cindex Ascii-Code
487 d.h. sie enthält den eigentlichen String und nichts anderes. Dieser darf
488 eine Reihe von Steuerzeichen enthalten, die alle durch einen Backslash
489 eingeleitet werden:
490 @table @samp
491 @item \b
492 Backspace (Ascii 8)
493 @item \c
494 Control Sequence Introducer (Ascii 155)
495 @item \e
496 Escape (Ascii 27)
497 @item \f
498 Form Feed (Ascii 12)
499 @item \g
500 Display beep (Ascii 7)
501 @item \n
502 Line Feed, newline (Ascii 10)
503 @item \r
504 Carriage Return (Ascii 13)
505 @item \t
506 Tab (Ascii 9)
507 @item \v
508 Vertical tab (Ascii 11)
509 @item \)
510 Das Klammer-Zu-Zeichen. (Dies ist evtl. innerhalb einer @samp{%(..)}-Sequenz
511 nötig, siehe @ref{Source description}.)
512 @item \\
513 Der Backslash selbst.
514 @item \xHH
515 Das durch @samp{HH} gegebene Ascii-Zeichen, wobei @samp{HH} Hexziffern sind.
516 @item \OOO
517 Das durch @samp{OOO} gegebene Ascii-Zeichen, wobei @samp{OOO} Hexziffern sind.
518 @end table
519 @end table
520 Schließlich signalisiert ein einzelner Backslash am Zeilenende, daß die
521 Zeile (und damit der String) auf der nächsten Zeile fortgesetzt wird.
522 Es ist dadurch möglich, beliebig lange Strings zu definieren. (FlexCat ist
523 lediglich durch das verfügbare RAM eingeschränkt.)
525 Ein String wird also stets durch eine Beschreibungszeile und eine
526 unmittelbar darauffolgende Stringzeile angegeben. Ein Beispiel wäre
527 @example
528     msgHello (/4/)
529     Hello, this is english!\n
530 @end example
531 In diesem Beispiel fehlt die ID, wird also vom Programm festgesetzt. (Dies
532 ist sicher der einfachste und beste Weg.) Die 4 gibt hier an, daß der in
533 der nächsten Zeile stehende String wenigstens 4 Zeichen enthalten soll,
534 eine maximale Länge fehlt.
536 @cindex FlexCat.cd
537 Als ausführlicheres Beispiel zum Aufbau einer Katalogbeschreibungsdatei kann
538 die Datei @file{FlexCat.cd} dienen.
542 @node Catalog translation
543 @chapter Aufbau einer Katalogübersetzung
544 @cindex Katalogübersetzung
545 @cindex Catalog translation
546 @cindex .ct
547 Katalogübersetzungen entsprechen in ihrem Aufbau ganz und gar den
548 Katalogbeschreibungen. Nur sind auf den Kommandozeilen andere
549 Kommandos erlaubt und die Beschreibungszeilen enthalten keine Angaben über
550 ID sowie minimale oder maximale Länge, da diese aus der Katalogbeschreibung
551 entnommen werden. Selbstverständlich sollte jeder String aus der
552 Katalogbeschreibung auch in der Katalogübersetzung vorkommen und es dürfen
553 keine Strings (d.h. Stringbezeichner) auftauchen, die nicht auch in der
554 Katalogbeschreibung definiert sind. Dies zu sichern geht am einfachsten,
555 indem man mit FlexCat aus den evtl. geänderten Katalogbeschreibungen und den
556 evtl. alten Katalogübersetzungen neue erzeugt. @xref{Uebersicht,
557 Übersicht, Übersicht}.
559 Die in Katalogübersetzungsdateien erlaubten Kommandos sind:
560 @table @code
561 @item ##version <str>
562 Gibt die Version des Kataloges in Form eines AmigaDOS-Versionsstrings an.
563 Beispiel:
564 @example
565     @samp{##version $VER: Deutsch.ct 8.1 (27.09.93)}
566 @end example
567 Die Versionsnummer dieses Kataloges ist 8. Um ihn zu eröffnen, müssten also
568 in der Katalogbeschreibung die Versionsnummern 0 oder 8 angegeben werden.
570 @item ##rcsid $Date: 2007-01-01 03:48:17 +0100 (Mo, 01. Jan 2007) $ $Revision: 73 $ $Id: FlexCat_german.texinfo 73 2007-01-01 02:48:17Z tactica $
571 Das Kommando @code{##version} ist etwas ungeeignet im Zusammenhang
572 mit rcs, dem Revision-Control-System. Aus diesem Grund kann man
573 statt @code{##version} auch dieses Kommando verwenden. Dabei ist
574 @samp{<date>} das Datum in der Form @samp{yy/mm/dd}. <time> die
575 Zeit (wird ignoriert), @samp{<rev>} die Versionsnummer und
576 @samp{<name>} der im Versionsstring zu verwendende Name.
578 @item ##name <name>
579 Dieses Kommando egibt es nur aus Kompatibilitaetsgruenden mit
580 @code{CatComp}. Es überschreibt den gleichnamigen Parameter
581 von @code{##rcsid}.
583 @item ##language <str>
584 Gibt die Sprache des Kataloges an. Natürlich sollte dies eine andere als die
585 Sprache der Katalogbeschreibung sein. Die Katalogsprache und die
586 Katalogversion @strong{müssen} angegeben werden.
588 @item ##codeset <num>
589 Ein derzeit noch unbenutztes Argument für die Eröffnung eines Kataloges.
590 Sollte immer 0 sein. (Dies ist auch der Vorgabewert.)
592 @item ##chunk <ID> <string>
593 Dient dazu, Kommentare in den fertigen Katalog aufzunehmen. Z.B. würde
594 @example
595     ## chunk AUTH German catalog translation by Jochen Wiedmann
596 @end example
597 @noindent
598 einen Chunk namens AUTH (für Author) aufnehmen, der aus dem String
599 @samp{German catalog translation by Jochen Wiedmann} bestünde.
600 @end table
602 @cindex Deutsch.ct
603 Das obige Beispiel sieht hier so aus:
604 @example
605     msgHello
606     Hallo, dies ist deutsch!\n
607 @end example
608 @noindent
609 Als weiteres Beispiel einer Katalogübersetzungsdatei kann
610 @file{Deutsch.ct} dienen.
614 @node Source description
615 @chapter Aufbau einer Quelltextbeschreibung
616 @cindex Source description
617 @cindex Quelltextbeschreibung
618 @cindex .sd
619 Der wichtigste Teil von FlexCat ist die Quelltexterzeugung. Bis hierher
620 bietet FlexCat nichts, was nicht auch CatComp, KitCat und Konsorten bieten
621 würden. Der erzeugte Quelltext soll nun die Verwendung der erzeugten
622 Kataloge möglichst einfach machen. Andererseits soll dies aber unter
623 beliebigen Programmiersprachen und für beliebige Anforderungen gelten. Um
624 diese scheinbaren Widersprüche aufzulösen, kennt FlexCat die
625 Quelltextbeschreibungen. Das sind Dateien, die gewissermaßen die
626 Vorlage für den zu erzeugenden Quelltext bilden. Wie die
627 Katalogbeschreibungen und -übersetzungen sind sie mit einem
628 Editor erzeug- und bearbeitbar: Das ist es, was FlexCat so flexibel macht.
630 FlexCat durchsucht die Quelltextbeschreibung nach gewissen Symbolen, die
631 durch die in der Katalogbeschreibung gegebenen Werte ersetzt werden.
632 Mögliche Symbole sind zum einen die mit einem Backslash eingeleiteten
633 Steuerzeichen, die auch in den Strings der Katalogbeschreibung und der
634 Katalogübersetzung erlaubt sind, zum anderen aber Steuerzeichen, die mit
635 einem @key{%}-Zeichen beginnen: Für C-Programmierer ein wohlvertrautes
636 Konzept. Mögliche Steuerzeichen sind:
638 @table @samp
639 @item %b
640 ist der Basisname der Quelltextbeschreibungsdatei. (Für @file{FlexCat.cd}
641 als CDFILE wäre also @code{FlexCat} der Basisname. Wie schon erwähnt, kommt
642 es deshalb beim Argument CDFILE sehr wohl auf Groß-/Kleinschreibung an;
643 @pxref{Programmstart})
644 @item %v
645 ist die Versionsnummer aus der Katalogbeschreibung, nicht zu verwechseln
646 mit dem Versionsstring aus der Katalogübersetzung.
647 @item %l
648 ist die Sprache der Katalogbeschreibung. Bitte beachten Sie, daß hier
649 ein String eingesetzt wird, dessen Aussehen mit dem Kommando
650 @code{##stringtype} beeinflußt wird.
651 @item %n
652 ist die Anzahl der Strings in der Katalogbeschreibung.
653 @item %%
654 ist das Prozentzeichen selbst.
655 @end table
657 Das wesentlichste sind aber die folgenden Steuerzeichen. Sie repräsentieren
658 auf unterschiedliche Art und Weise die Strings der Katalogbeschreibung.
659 Zeilen die eines dieser Zeichen enthalten, werden von FlexCat für jeden
660 Katalogstring wiederholt, da im Normalfall kaum alle Strings in eine
661 Zeile passen würden.
663 @table @samp
664 @item %i
665 ist der Bezeichner aus der Katalogbeschreibung.
666 @item %nd
667 @itemx %nx
668 @itemx %nc
669 ist die ID des Strings im Dezimal- bzw. Hexadezimal bzw. Oktalformat.
670 Dabei steht @samp{n} für eine ganze Zahl, die angibt, wieviele Zeichen
671 die erzeugte Zahl einnehmen soll. (Es wird links mit Nullen aufgefüllt.)
672 Es ist möglich, die Zahl @samp{n} wegzulassen: In diesem Fall wird nichts
673 aufgefüllt und die erzeugte Zahl ist gerade so lang wie nötig.
674 @item %e
675 gibt an, um den wievielten String (Mit 0 beginnend) es sich handelt.
676 @item %s
677 ist der String selbst; dieser wird in einer von der Programmiersprache
678 abhängigen Art und Weise dargestellt. Dies kann mit den Kommandos
679 @code{##stringtype} und @code{##shortstrings} beeinflußt werden.
680 @item %(...)
681 gibt an, daß der zwischen den Klammern stehende Text bei allen Strings
682 außer dem letzten auftauchen soll. Dies ist z.B. bei Arrays nützlich,
683 wenn unterschiedliche Arrayeinträge durch ein Komma getrennt werden
684 sollen, nach dem letzten aber kein Komma mehr kommen soll: Dann würde
685 man nach dem Stringeintrag eben @samp{%(,)} schreiben. Beachten Sie, daß
686 der Text zwischen den Klammern nicht weiter auf @samp{%}-Symbole untersucht
687 wird. Backslash-Sequenzen sind allerdings weiter erlaubt.
688 @end table
690 Die Steuerzeichen @samp{%l} und @samp{%s} erzeugen Strings. Die Darstellung
691 von Strings hängt natürlich von der Programmiersprache ab, für die Quelltext
692 erzeugt werden soll. Deshalb können in die Quelltextbeschreibung ähnlich
693 wie in der Katalogübersetzung Kommandos eingebaut werden. Diese müssen am
694 Zeilenanfang stehen und jeweils eine eigene Zeile einnehmen. Die möglichen
695 Kommandos sind:
696 @table @code
697 @item ##shortstrings
698 gibt an, daß lange Strings über mehrere Zeilen verteilt werden dürfen.
699 Dies ist nicht in allen Programmiersprachen ohne weiteres möglich und
700 vor allem besonders stark von der verwendeten Programmiersprache abhängig.
701 Deshalb werden vorgabemäßig notfalls eben sehr lange Zeilen erzeugt.
702 @item ##stringtype <art>
703 gibt die Syntax der Strings an. Mögliche Arten sind:
704 @table @strong
705 @item None
706 Es werden keinerlei zusätzliche Zeichen erzeugt und lediglich die
707 Zeichen des Strings ausgegeben. Es ist keine Ausgabe von Binärzeichen (das
708 sind die mit dem Backslash erzeugten Zeichen) möglich.
709 @item C
710 erzeugt Strings gemäß den Regeln der Programmiersprache C, d.h. die Strings
711 werden links und rechts mit je einem Anführungszeichen abgegrenzt. Falls
712 Strings über mehrere Zeilen verteilt werden, so werden die Zeilen bis auf
713 die letzte mit einem Backslash beendet. (Der Backslash ist innerhalb
714 von Makros nötig.) Steuerzeichen werden mit @samp{\OOO} ausgegeben.
715 @xref{C}.
716 @item Oberon
717 wie der Stringtyp bei C, allerdings wird kein Backslash bei Zeilentrennung
718 erzeugt. @xref{Oberon}. Dieser Stringtyp wird auch für Modula-2
719 empfohlen.
720 @item Assembler
721 Strings werden mit @samp{dc.b} erzeugt und links und rechts mit einem
722 einfachen Anführungsstrich abgegrenzt. Binärzeichen werden mit $XX erzeugt.
723 @xref{Assembler}.
724 @item E
725 Strings werden mit je einem ' umgeben. Mehrzeilihe Strings werden durch
726 ein '+' konkateniert. Binärzeichen win in C.
727 @end table
728 @end table
730 Als Beispiel betrachten wir einen Auszug aus der Quelltextbeschreibungsdatei
731 @file{C_h.sd}, die eine Include-Datei für die Programmiersprache C
732 erzeugt:
733 @example
734 ##stringtype C
735 ##shortstrings
737 #ifndef %b_CAT_H    /*  Sicherstellen, daß Include-Datei    */
738 #define %b_CAT_H    /*  nur einmal verwendet wird.          */
741 #ifndef EXEC_TYPES_H            /*  Nötige andere Include-  */
742 #include <exec/types.h>         /*  Dateien einbinden.      */
743 #endif
744 #ifndef LIBRARIES_LOCALE_H
745 #include <libraries/locale.h>
746 #endif
749 /*  Prototypen  */
750 extern void Open%bCatalog(struct Locale *, STRPTR);
751 extern void Close%bCatalog(void);
752 extern STRPTR Get%bString(LONG);
754 /*  Definitionen der Bezeichner und ihrer ID's              */
755 #define %i %d   /*  Diese Zeile wird für jeden Katalog-     */
756                 /*  wiederholt.                             */
758 #endif
759 @end example
761 Zum Suchpfad von Quelltextbeschreibungen siehe auch @ref{Programmstart}.
766 @node Benutzung
767 @chapter Benutzung in eigenen Programmen
768 @cindex Benutzung
769 Wie der Quelltext benutzt wird, hängt natürlich vom erzeugten Quelltext und
770 damit von den jeweiligen Quelltextbeschreibungen ab.
771 @xref{Source description}. Es kann hier deshalb nur auf die mit FlexCat
772 mitgelieferten Quelltextbeschreibungsdateien eingegangen werden.
774 Alle diese Dateien sind so aufgebaut, daß das fertige Programm auf jeden
775 Fall auch ohne die @code{locale.library} arbeitet. Üblicherweise muß
776 die @code{locale.library} eröffnet werden, aber das machen moderne
777 Compiler meist automatisch, ebenso den Aufruf der Initialisierungsroutinen.
778 Natürlich werden ohne @code{locale.library} nur die eingebauten Strings
779 aus der Katalogbeschreibung verwendet. (Die C-Quelltextbeschreibung erlaubt
780 allerdings auch eine Lokalisierung unter Workbench 2.0: Dabei wird die
781 @code{iffparse.library} benutzt, um die Kataloge quasi von Hand zu lesen.
782 @xref{C}.) Als Programmierer
783 benötigen Sie keinerlie Kenntnisse dieser Libraries, außer Sie wollen
784 eigene Quelltextbeschreibungen erzeugen.
786 Es gibt lediglich 3 Funktionen, die aufzurufen recht simpel ist:
787 @deffn {} OpenCatalog (locale, language)
788 Diese Funktion versucht, einen Katalog zu eröffnen. Das Argument
789 @code{locale} ist ein Zeiger auf eine Locale-Struktur, @code{language} ein
790 Zeiger auf einen String, der den Namen der gewünschten Sprache enthält.
791 Beide Argumente werden an die Locale-Funktion OpenCatalog übergeben und
792 sollten normalerweise immer NULL (bzw. NIL) sein, da andernfalls die
793 Voreinstellungen des Benutzers überschrieben werden. Näheres ist in den
794 AutoDocs nachzulesen.
796 Unter nicht-objektorientierten Sprachen heißt diese Funktion
797 @samp{OpenXXXCatalog}, wobei @samp{XXX} der Basisname des Programms ist.
799 Hat der Benutzer als Vorgabesprachen etwa @samp{Deutsch} und @samp{Français}
800 eingestellt und der Basisname des Programms ist @samp{XXX}, so wird
801 nacheinander nach folgenden Dateien gesucht:
802 @example
803     @file{PROGDIR:Catalogs/Deutsch/XXX.catalog}
804     @file{LOCALE:Catalogs/Deutsch/XXX.catalog}
805     @file{PROGDIR:Catalogs/Français/XXX.catalog}
806     @file{LOCALE:Catalogs/Français/XXX.catalog}
807 @end example
808 Dabei ist @file{PROGDIR:} das aktuelle Directory des Programms. Die
809 Reihenfolge von @file{PROGDIR:} und @file{LOCALE:} kann evtl. vertauscht
810 werden, falls dadurch ein Requester wie @samp{Insert volume YYY} unterdrückt
811 werden kann.
813 OpenCatalog ist vom Typ void (für Modula2-Programmierer: Eine Prozedur),
814 liefert also kein Ergebnis.
815 @end deffn
817 @deffn {} GetString (ID)
818 Diese Funktion liefert einen Zeiger auf den Katalogstring mit der
819 angegebenen Nummer. Die ID wird in der Katalogbeschreibung definiert.
820 Es versteht sich von selbst, daß die Strings Eigentum der
821 @code{locale.library} sind und deshalb nicht verändert werden dürfen.
823 Ein Beispiel ist vielleicht nützlich. Im Beispiel aus der Katalogbeschreibung
824 wird der String @code{msgHello} definiert. Die Quelltextbeschreibungen
825 deklarieren nun eine Konstante @samp{msgHello}, der die ID repräsentiert.
826 Damit könnte der String in C so ausgegeben werden:
827 @example
828     printf("%s\n", GetString(msgHello));
829 @end example
830 @end deffn
832 @deffn {} CloseCatalog (void)
833 Mit dieser Funktion wird der Katalog (das heißt das belegte RAM) vor dem
834 Programmende wieder freigegeben. Die Funktion kann gefahrlos zu jeder
835 Zeit aufgerufen werden, sogar wenn OpenCatalog gar nicht aufgerufen wurde.
836 @end deffn
838 @menu
839 * C::         FlexCat-Quelltext in C-Programmen
840 * C++::       FlexCat-Quelltext in C++-Programmen
841 * Oberon::    FlexCat-Quelltext in Oberon-Programmen
842 * Modula-2::  FlexCat-Quelltext in Modula-2-Programmen
843 * Assembler:: FlexCat-Quelltext in Assembler-Programmen
844 * E::         FlexCat-Quelltext in E-Programmen
845 @end menu
849 @node C
850 @section FlexCat-Quelltext in C-Programmen
851 @cindex C
852 @cindex C_c.sd
853 @cindex C_h.sd
854 Der C-Quelltext besteht aus zwei Teilen: Einer @file{.c}-Datei, die einfach
855 übersetzt und mit dem Linker eingebunden wird und nicht weiter zu
856 interessieren braucht und einer @file{.h}-Datei, die vom benutzenden Programm
857 mit @samp{#include} eingebunden wird. In ihr werden die ID's der Strings
858 als Makro definiert.
860 Die mir bekannten C-Compiler (SAS/C, Dice und gcc) erlauben das automatische
861 Eröffnen der Libraries und Kataloge, weshalb die Funktionen @code{OpenCatalog}
862 und @code{Closecatalog} hier entfallen. (Benutzer anderer Compiler müssen
863 diese Funktionen aber sehr wohl aufrufen.) Ferner ist die
864 C-Quelltextbeschreibung so angelegt, daß die @code{GetString}-Funktion bereits
865 für alle Strings bei der Initialisierung aufgerufen wird: Man kann deshalb
866 einfach @samp{msgHello} statt @samp{GetString(msgHello)} schreiben.
868 Definiert man beim Compilieren die Konstante @code{LOCALIZE_V20} (das heißt,
869 man compiliert bei gcc und Dice mit @samp{-DLOCALIZE_V20} bzw. bei SAS/C
870 mit @samp{DEF LOCALIZE_V20}) so wird
871 Quelltext erzeugt, der auch unter Workbench 2.0 Kataloge lesen kann.
872 Allerdings muß dann die @code{iffparse.library} eröffnet werden, ferner
873 ist unmittelbar nach dem Start von @code{main} aus eine Funktion
874 @code{InitXXXCatalog} aufzurufen, die als Argument den Namen der zu
875 verwendenden Sprache bekommt. (@samp{XXX} ist der Basisname des Programms.)
876 Diese Sprache muß dem Programm natürlich über eine Option wie
877 @samp{LANGUAGE Deutsch} mitgeteilt werden. Mit der @code{locale.library}
878 wird diese Möglichkeit natürlich ignoriert.
879 (Prinzipiell wäre das auch unter OS 1.3 möglich, aber ich halte eine
880 Unterstützung dieser veralteten Version des OS für nicht mehr nötig.)
882 Um diese Funktionalität zu gewähren, sind gewisse Einschränkungen nötig:
883 So ist es z.B. nicht möglich, eine @code{Locale}-Struktur bei der
884 Initialisierung anzugeben. Für 95% aller Anwendungen
885 dürfte dies aber völlig ausreichend sein, für andere Anwendungen muß man
886 eine modifizierte Quelltextbeschreibung verwenden.
888 Ein Beispiel eines so geschriebenen C-Programms findet man in
889 @ref{Uebersicht, Übersicht, Übersicht}.
895 @node C++
896 @section FlexCat-Quelltext in C++-Programmen
897 @cindex C++
898 @cindex C++_cc.sd
899 @cindex C++_h.sd
900 @cindex C++_CatalogF.cc
901 @cindex C++_CatalogF.h
902 Unter C++ ist alles dank einer geeigneten Klasse extrem einfach:
903 Durch Konstruktoren und Destruktoren wird das meiste automatisch
904 erledigt. Diese Klasse ist in den Dateien @file{C++_CatalogF.cc}
905 und @file{C++_CatalogF.h} implementiert, die in @file{CatalogF.cc} und
906 @file{CatalogF.h} umbenannt und übersetzt werden sollten. Ferner
907 sollten mit Hilfe der Quelltextbeschreibungen @file{C++_cc.sd} und
908 @file{C++_h.sd} zwei weitere Dateien erzeugt werden: Erstere enthält
909 die Strings, letztere wird mit @code{#include} im eigentlichen Programm
910 eingebunden und enthält die nötigen Deklarationen.
912 Abschließend ein Beispiel eines C++-Programms:
913 @example
914     #include <iostream.h>
915     extern "C"
916     @{
917     #include <clib/exec_protos.h>
918     @}
919     #include "CatalogF.h"
920     #include "HelloLocalWorld_Cat.h"
922     struct LocaleBase *LocaleBase = 0;
924     int main()
925     @{ //  Die Library muß hier eröffnet werden, auch wenn der Compiler
926       //  das automatisch kann. @strong{Kein} Aussteigen, falls die
927       //  Library nicht eröffnet werden kann: Dann werden einfach die
928       //  eingebauten Strings verwendet.
929       LocaleBase = (struct LocaleBase *) OpenLibrary("locale.library", 38);
931       const CatalogF cat(0, 0, HelloLocalWorld_ARGS);
933       cout >> cat.GetString(msgHelloLocalWorld);
935       if (LocaleBase)
936           CloseLibrary(LocaleBase);
937     @}
938 @end example
939 Für den gcc ist eine Modifikation der @file{libauto.a} verfügbar, die sogar
940 die Eröffnung der Locale.library überflüssig macht.
944 @node Oberon
945 @section FlexCat-Quelltext in Oberon-Programmen
946 @cindex Oberon
947 @cindex Oberon_V38.sd
948 @cindex Oberon_V39.sd
949 @cindex AmigaOberon.sd
950 @cindex Oberon-A.sd
951 Es gibt unterschiedliche Quelltextbeschreibungen:
952 @file{AmigaOberon.sd} ist für die aktuelle Version des AmigaOberon-Compilers,
953 @file{Oberon_V39.sd} für ältere Versionen dieses Compilers gedacht.
954 @file{Oberon_V38.sd} verwendet das von @file{Locale.mod} von
955 Hartmut Goebel. @file{Oberon-A.sd} ist natürlich für den gleichnamigen
956 Compiler.
958 Die Prototypen der Funktionen sind:
959 @example
960     XXX.OpenCatalog(loc: Locale.LocalePtr; language : ARRAY OF CHAR);
961     XXX.GetString(num: LONGINT): Exec.StrPtr;
962     XXX.CloseCatalog();
963 @end example
964 @noindent
965 Dabei ist @samp{XXX} jeweils der Basisname aus der Quelltextbeschreibung.
966 @xref{Source description}.
968 Zum Schluß noch ein Beispiel eines Programms, das den von FlexCat erzeugten
969 Quelltext verwendet:
970 @example
971     MODULE HelloLocalWorld;
973     IMPORT  x:=HelloLocalWorld_Cat; Dos;
975     BEGIN
976       x.OpenCatalog(NIL, "");
978       Dos.PrintF("%s\n", x.GetString(x.msgHello));
980       (* Katalog wird beim Programmende automatisch *)
981       (* geschlossen.                               *)
982     END Irgendwas;
983 @end example
987 @node Modula-2
988 @section Flexcat-Quelltext in Modula-2-Programmen
989 @cindex Modula-2
990 @cindex Modula2Def.sd
991 @cindex Modula2Mod.sd
992 Wie Oberon unterstützt Modula-2 ein Modulkonzept, die Funktionsnamen sind
993 also dieselben. Da Modula je ein Definitions- und Implementationsmodul
994 benötigt, müssen diese durch die Quelltextbeschreibungen
995 @file{Modula2Def.sd} bzw. @file{Modula2Mod.sd} erzeugt werden, die an den
996 M2Amiga-Compiler angepasst sind. Außerdem wird die Definitionsdatei
997 @file{OptLocaleL.def} benötigt, die mit dem Update auf M2Amiga v4.3
998 ausgeliefert wird.
1000 Die Prototypen der Funktionen sind:
1001 @example
1002     PROCEDURE OpenCatalog(loc : ld.LocalePtr;
1003                           language : ARRAY OF CHAR);
1004     PROCEDURE CloseCatalog();
1005     PROCEDURE GetString(num : LONGINT) : ld.StrPtr;
1006 @end example
1008 Zum Schlu"s noch ein Beispiel eines Programms, das den von FlexCat
1009 erzeugten Quelltext verwendet:
1010 @example
1011     MODULE HelloLocalWorld;
1013     IMPORT hl: HelloLocalWorldLocale,
1014            io: InOut;
1016     BEGIN
1017       hl.OpenCatalog(NIL, "");
1019       io.WriteString(hl.GetString(hl.msgHello)); io.WriteLn;
1021       hl.CloseCatalog;
1022     END HelloLocalWorld.
1023 @end example
1028 @node Assembler
1029 @section FlexCat-Quelltext in Assembler-Programmen
1030 @cindex Assembler
1031 @cindex AztecAs_asm.sd
1032 @cindex AztecAs_i.sd
1033 @cindex SASasm_a.sd
1034 @cindex SASasm_i.sd
1035 Es gibt Quelltextbeschreibungen für die Assembler von Aztec-C bzw. SAS/C.
1036 Beide sind im wesentlichen identisch, vor allem der SAS-Assembler dürfte
1037 sich kaum von verbreiteten Assemblern unterscheiden. Es sollte also kein
1038 großes Problem sein, daraus eine eigene Quelltextbeschreibung zu machen.
1039 Der Quelltext besteht aus zwei Teilen: Einer @file{.asm}- bzw.
1040 @file{.a}-Datei, die einfach übersetzt und mit dem Linker eingebunden
1041 wird und nicht weiter zu interessieren braucht und einer @file{.i}-Datei,
1042 die vom benutzenden Programm mit @samp{include} eingebunden wird. In ihr
1043 werden die ID's der Strings definiert.
1045 Um theoretisch auch das gleichzeitige Eröffnen mehrerer Kataloge zu
1046 ermöglichen, tragen die FlexCat-Funktionen etwas geänderte Namen, nämlich
1047 @samp{OpenXXXCatalog}, @samp{CloseXXXCatalog} und @samp{GetXXXString}. Dabei
1048 ist @samp{XXX} der Basisname aus der Quelltextbeschreibung. Das Konzept ist
1049 von der @code{GadToolsBox} übernommen und meines Erachtens bewährt.
1050 @xref{Source description}.
1052 Die Funktionen liefern wie üblich das Ergebnis in d0 und sichern die
1053 Register d2-d7 und a2-a7. OpenCatalog erwartet seine Argumente in a0
1054 (Zeiger auf Locale-Struktur) und in a1 (Zeiger auf String mit zu
1055 verwendender Sprache). Wie schon erwähnt, sollten diese Argumente im
1056 Normalfall immer NULL sein. GetString erwartet in a0 einen Zeiger. Auf was
1057 er zeigt braucht ebenfalls nicht zu interessieren.
1059 Zum Schluß noch ein Beispiel eines Programms, das FlexCat verwendet.
1060 @example
1061 *   HelloLocalWorld.asm
1063         include "HelloLocalWorld_Cat.i"
1064                 /*  Enthält xref OpenHelloLocalWorldCatalog usw.    */
1066         xref    _LVOOpenLibrary
1067         xref    _LVOCloseLibrary
1068         xref    _AbsExecBase
1070         dseg
1071 LocNam: dc.b    "locale.library",0
1072         dc.l    _LocaleBase,4       ; Dieser Name ist obligatorisch
1074         cseg
1076 main:   move.l  #38,d0              ; Locale eröffnen
1077         lea     LocName,a1
1078         move.l  _AbsExecBase.a6
1079         jsr     _LVOOpenLibrary(a6)
1080 *  KEIN Abbruch, falls OpenLibrary() nicht erfolgreich! (Natürlich nur,
1081 *   wenn Locale-Funktionen nicht anderweitig benutzt werden.
1083         sub.l   a0,a0
1084         sub.l   a1,a1
1085         jsr     OpenHelloLocalWorldCatalog  ; Katalog eröffnen
1087         lea.l   msgHello,a0         ; Zeiger auf String holen
1088         jsr     GetHelloLocalWorldString
1089         jsr     PrintD0             ; und ausgeben
1091         jsr     CloseHelloLocalWorldCatalog ; Katalog schließen
1092         move.l  _LocaleBase,a1      ; Locale evtl. schließen
1093         move.l  a1,d0
1094         beq     Ende
1095         jsr     CloseLibrary
1096 Ende:
1097         rts
1098         end
1099 @end example
1104 @node E
1105 @section FlexCat-Quelltext in E-Programmen
1106 @cindex E
1107 @cindex E21b.sd
1108 @cindex E30b.sd
1109 Seit der Version 3.0 erlaubt E das Aufteilen von Programmen in separate
1110 Module. Im Folgenden wird nur die Quelltextbeschreibung @file{E30b.sd}
1111 beschrieben, die ab E3.0b funktionieren sollte. (Version 3.0a enthält
1112 signifikante Fehler, für frühere Versionen gibt es @file{E21b.sd}, das
1113 allerdings die Einbindung des von FlexCat erzeugten Quelltextes in den
1114 eigentlichen Quelltext von Hand erfordert.)
1116 @file{E30b.sd} erzeugt ein Modul @file{Locale}, das eine Variable
1117 namens @code{cat} vom Typ @samp{catalog_XXX} bereit stellt. (Wobei
1118 @samp{XXX} der Basisname aus der Quelltextbeschreibung ist,
1119 @pxref{Source description}) Eine Datei @file{HelloLocalWorld.e}
1120 könnte so aussehen:
1121 @example
1122     MODULE '*Locale'
1123         -> Einbindung des Moduls
1125     DEF cat : PTR TO catalog_HelloLocalWorld
1126         -> Diese Variable enthält die ganzen Katalogstrings und stellt
1127         -> einige Methoden bereit. Sie muß in jedem Modul deklariert
1128         -> werden, das den Katalog verwendet, allerdings nur im
1129         -> Hauptmodul initialisiert werden.
1131     PROC main()
1133         localebase := OpenLibrary('locale.library', 0)
1134             -> Locale.library eröffnen; @strong{Kein} Abbruch, falls
1135             -> nicht vorhanden! (In diesem Fall werden die eingebauten
1136             -> Strings verwendet.
1138         NEW cat.create()
1139         cat.open()
1140             -> Diese Initialisierung wird (wie schon erwähnt) nur im
1141             -> Hauptmodul durchgeführt.
1143         WriteF('\s\n', cat.msg_Hello_world.getstr())
1144             -> cat.msg_Hello_world ist einer der in cat enthaltenen
1145             -> Strings. Dieser stellt eine Methode getstr() bereit,
1146             -> die den Katalog liest und einen Zeiger auf den zu
1147             -> verwendenden String liefert.
1149         cat.close()
1150         IF localebase THEN CloseLibrary(localebase)
1151     ENDPROC
1152 @end example
1158 @node Zukunft
1159 @unnumbered Weiterentwicklung des Programms
1160 @cindex Zukunft
1161 @cindex Weiterentwicklung
1162 @cindex Beiträge
1163 Ich beabsichtige eigentlich nicht, das Programm wesentlich
1164 weiterzuentwickeln, denke auch nicht, daß das nötig sein wird, bin aber
1165 natürlich trotzdem für jegliche Anregung, Vorschläge oder notfalls auch
1166 Kritik offen. Was ich auf jeden Fall gerne machen werde, sind andere
1167 Stringtypen, falls sich diese für andere Programmiersprachen als notwendig
1168 erweisen sollten.
1170 Ferner wäre ich auf jeden Fall dankbar für weitere Quelltextbeschreibungen
1171 und würde diese gerne in einer späteren Version öffnetlich zugänglich
1172 machen - egal, welche Programmiersprache oder mit welchen Erweiterungen.
1173 Voraussetzung ist natürlich, daß der von diesen Quelltextbeschreibungen
1174 erzeugte Code in einem laufenden Programm erfolgreich erprobt wurde.
1176 Ebenso dankbar wäre ich natürlich auch für neue Kataloge. Es genügt der
1177 Eintrag der entsprechenden Strings in der Datei @file{NewCatalogs.ct}.
1178 Wie das geht, sollte nach der Lektüre dieser Dokumentation hoffentlich klar
1179 sein.
1183 @node Danksagungen
1184 @unnumbered Danksagungen
1185 @cindex Danksagungen
1186 Danken möchte ich:
1188 @table @strong
1189 @item Albert Weinert
1190 für KitCat, den Vorgänger von FlexCat, der mir gute Dienste geleistet hat,
1191 aber irgendwann eben nicht flexibel genug war sowie für die
1192 Oberon-Quelltextbeschreibungen.
1194 @item Reinhard Spisser und Sebastiano Vigna
1195 für die Amiga-Version von texinfo, mit der diese Dokumentation geschrieben
1196 ist.
1198 @item Der Free Software Foundation
1199 für die Urversion von texinfo und für viele andere hervorragende Programme.
1201 @item Matt Dillon
1202 für DICE und besonders für DME.
1204 @item Alessandro Galassi
1205 für den italienischen Katalog.
1207 @item Lionel Vintenat
1208 für die E-Quelltextbeschreibung und ihre Dokumentation, den französichen
1209 Katalog und Fehlermeldungen.
1211 @item Antonio Joaquín Gomez Gonzalez (u0868551@@oboe.etsiig.uniovi.es)
1212 für die C++-Quelltextbeschreibung, den spanischen Katalog, die Übersetzung
1213 der Dokumentation in Spanisch sowie für den guten Tip über die schnellere
1214 GetString-Routine.
1216 @item Olaf Peters (op@@hb2.maus.de)
1217 für die Modula-2-Quelltextbeschreibung.
1219 @item Russ Steffen (steffen@@uwstout.edu)
1220 für die Anregung der FLEXCAT_SDDIR-Variablen.
1222 @item Lauri Aalto (kilroy@@tolsun.oulu.fi)
1223 für die finnischen Quelltextübersetzungen.
1225 @item Marcin Orlowski (carlos@@felix.univ.szczecin.pl)
1226 für die polnischen Quelltextübersetzungen
1228 @item Udo Schuermann (walrus@@wam.umd.edu)
1229 für die Vorschläge der WARNCTGAPS-Option und das ##chunk-Kommando.
1231 @item Christian Hoj (cbh@@vision.auc.dk)
1232 für die dänische Quelltextbeschreibung
1234 @item Hartmut Goebel (hartmut@@oberon.nbg.sub.org)
1235 für den Hinweis auf die Enforcerhits und den Vorschlag mit
1236 ##rcsid und ##name
1238 @item Den Leuten von #AmigaGer
1239 für die Beantwortung vieler dummer
1240 Fragen und für viele Augenblicke erfreulich
1241 ungezügelten Schwachsinns :-), z.B.
1242 stefanb (Stefan Becker), PowerStat (Kai Hoffmann), \
1243 ill (Markus Illenseer), Quarvon (Jürgen Lang), ZZA (Bernhard Möllemann),
1244 Tron (Mathias Scheler), mungo (Ignatios Souvlatzis), \
1245 jow (Jürgen Weinelt) und Stargazer (Petra Zeidler).
1247 @item Commodore
1248 für den Amiga und für die Kickstart 2.0 :-) Macht weiter mit der Kiste, dann
1249 bin ich vielleicht auch die nächsten 8 Jahre Amiga-Benutzer!
1250 @end table
1254 @headings off
1255 @node Index
1256 @unnumbered Index
1257 @printindex cp
1259 @contents
1261 @bye