exstr(1) exstr(1)
NAME
exstr - Zeichenketten in Quellprogrammen suchen und ersetzen (extract
strings)
SYNTAX
exstr [-e] datei ... Format 1
exstr -r [-d] datei ... Format 2
BESCHREIBUNG
Mit exstr können Sie aus C-Quellprogramm-Dateien Zeichenketten heraus-
ziehen (Format 1) und diese durch Aufrufe einer Funktion ersetzen
(Format 2), die zur Laufzeit des Programms passende Zeichenketten
sucht und dazubindet [siehe gettxt(3C)]. Als Zeichenketten gelten alle
Folgen von einem oder mehreren druckbaren Zeichen, die in Anführungs-
zeichen "..." eingeschlossen sind, also nicht nur Argumente von
printf.
Format 1: Zeichenketten aus C-Quellprogramm-Dateien herausziehen
exstr [-e] datei ...
Keine Option angegeben:
exstr sucht alle Zeichenketten in datei und schreibt sie auf die
Standardausgabe, wobei jeder Zeichenkette der Name von datei und
ein Doppelpunkt vorangestellt wird.
-e exstr gibt zusätzlich zu den gefundenen Zeichenketten Informationen
über ihre Position in datei aus. Die Ausgabe erfolgt in einer
Liste, deren Zeilen aus folgenden Feldern bestehen:
datei:zeile:spalte:meldungsdatei:meldungsnummer:zeichenkette
datei
Name der C-Quellprogramm-Datei
zeile
Zeilennummer der Zeile in datei, in der zeichenkette steht
spalte
Spaltennummer, in der zeichenkette beginnt
meldungsdatei
leeres Feld
meldungsnummer
leeres Feld
zeichenkette
gefundene Zeichenkette
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
exstr(1) exstr(1)
Um die Felder meldungsdatei und meldungsnummer zu füllen, leiten
Sie die Ausgabe in eine Datei um, die sie dann editieren können. In
der Datei tragen Sie in die beiden Felder eine Meldungsdatei und
eine Meldungsnummer ein:
meldungsdatei
Name der Meldungsdatei, die die Zeichenketten enthält, die
später an die Stelle der ursprünglich in der C-Quellprogramm-
Datei enthaltenen Zeichenketten geschrieben werden sollen.
meldungsdatei muß mit dem Kommando mkmsgs an geeigneter Stelle
im Dateibaum angelegt werden [siehe mkmsg(1)].
meldungsnummer
Nummer, die zeichenkette in meldungsdatei hat.
Um Zeichenketten in der Quellprogramm-Datei zu ersetzen, verwenden
Sie das zweite Format von exstr.
datei
Name der C-Quellprogramm-Datei, die exstr nach Zeichenketten durch-
suchen soll. Sie können mehrere Dateien angeben.
Format 2: Zeichenketten in C-Quellprogramm-Dateien ersetzen
exstr -r [-d] datei ...
-r exstr ersetzt jede Zeichenkette in datei durch den Funktionsaufruf
der Funktion gettxt(3C), die zur Laufzeit des Programms eine ent-
sprechende Zeichenkette sucht und dazubindet.
-d Nur zusammen mit Option -r! Wenn der Funktionsaufruf gettxt(3C) zur
Laufzeit des Programms scheitert, wird die ursprüngliche Zeichen-
kette ausgegeben. Diese Option standardmäßig immer gesetzt. Sie ist
aus Kompatibilitätsgründen zu anderen Systemen vorhanden.
datei
Name der C-Quellprogramm-Datei, die exstr nach Zeichenketten durch-
suchen soll. Sie können mehrere Dateien angeben.
Anwendung
exstr ist nützlich für Anwenderprogramme, die in einer internationalen
Umgebung ablauffähig sind und Meldungstexte in verschiedenen Landes-
sprachen ausgeben können sollen. exstr ersetzt Zeichenketten in C-
Quellprogramm-Dateien durch Funktionsaufrufe, die auf Zeichenketten in
einer Datenbasis zeigen. Auf welche Datenbasis zugegriffen wird, hängt
vom zur Laufzeit des Programms aktuellen Wert der Umgebungsvariablen
LCMESSAGES ab [siehe environ(5)].
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
exstr(1) exstr(1)
Arbeitsschritte mit exstr
- Als erstes holen Sie mit exstr -e datei.c > ausdatei die Zeichen-
ketten aus einer C-Quellprogramm-Datei datei.c heraus und schreiben
sie mit ihrer Positionsangabe in eine Datei ausdatei.
- Dann überprüfen Sie die Liste der Zeichenketten in ausdatei und
bestimmen, welche Zeichenketten in eine andere Landessprache über-
setzt und durch die Meldungstext-Suchfunktion gettxt(3C) ersetzt
werden können.
- Die Zeilen mit Zeichenketten, die nicht übersetzt werden können,
löschen Sie in ausdatei. In den Zeilen mit Zeichenketten, die
übersetzt werden können, füllen Sie das Feld meldungsdatei mit dem
Namen der Meldungsdatei und das Feld meldungsnummer mit der Nummer,
die die entsprechende Zeichenkette in meldungsdatei hat. Die Mel-
dungsdateien, die Sie angeben, müssen mit mkmsgs angelegt worden
sein und sich im Verzeichnis /usr/lib/locale/Locale/LCMESSAGES
befinden. Der einfache Name des Verzeichnisses
/usr/lib/locale/Locale, also Locale, entspricht der Landessprache,
in der die Zeichenketten in den darunter liegenden Meldungsdateien
geschrieben sind [siehe setlocale(3C)]. Die Meldungsnummern müssen
den jeweiligen Nummern entsprechen, die die Zeichenketten in der
angegebenen Meldungsdatei haben.
- Die von Ihnen veränderte Datei ausdatei übergeben Sie an den Kom-
mandoaufruf exstr -r als Eingabe, um von der ursprünglichen C-
Quellprogramm-Datei datei.c eine neue Fassung neudatei.c zu
erstellen, in der Zeichenketten durch Aufrufe der Meldungstext-
Suchfunktion gettxt(3C) ersetzt sind. Der Aufruf sieht wie folgt
aus:
exstr -r datei.c < ausdatei > neudatei.c
An die Funktion gettxt(3C) werden zwei Argumente übergeben. Das
erste Argument wird aus den beiden Feldern meldungsdatei und
meldungsnummer in ausdatei gebildet, das zweite Argument besteht
aus der Zeichenkette, die im Fehlerfall ausgegeben werden soll,
also falls der Aufruf von gettxt(3C) zur Laufzeit des Programms
scheitert. Das zweite Argument ist die ursprüngliche Zeichenkette
(siehe oben).
Einschränkungen
exstr kann nicht alle Arten von Zeichenketten in C-Quellprogramm-
Dateien ersetzen, z.B:
- Zeichenketten, die Variablen der Speicherklasse static zugewiessen
sind, dürfen durch exstr nicht ersetzt werden.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
exstr(1) exstr(1)
- Zeichenketten, die aus Escape-Folgen bestehen, können nicht in eine
andere Landessprache übersetzt und sollen folglich nicht durch
exstr ersetzt werden. Um zu verhindern, daß ungültiger Code produ-
ziert wird, müssen Sie also die von exstr -e erzeugte Ausgabe über-
prüfen und Zeilen löschen oder ändern, die durch Aufrufe von
gettxt(3C) nicht unmittelbar ersetzbare Zeichenketten enthalten.
FEHLERMELDUNGEN
Die wichtigsten Fehlermeldungen sind:
ERROR: cannot replace string '%s' in line (%d) of file (%s)
Fehler: die Zeichenkette '%s' in Zeile (%d) der Datei (%s) kann nicht
ersetzt werden.
ERROR: stdin: invalid message number '%s'
Fehler: Standardeingabe: ungültige Meldungsnummer '%s'
ERROR: stdin: invalid message file name '%s'
Fehler: Standardeingabe: ungültiger Name der Meldungsdatei '%s'
ERROR: stdin: badly formed replacement string
Fehler: Ersetzungs-Zeichenkette hat ein ungültiges Format
INTERNATIONALE UMGEBUNG
Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
texte. Wenn LCMESSAGES nicht oder als leere Zeichenkette definiert
ist, wird der Wert von LANG als Standardwert herangezogen. Ist auch
LANG nicht oder als leere Zeichenkette definiert, verhält sich das
System so, als wäre es nicht internationalisiert.
Die Umgebungsvariable LCALL bestimmt die gesamte internationale Umge-
bung. LCALL hat Vorrang vor allen anderen Umgebungsvariablen im
Bereich der Internationalisierung.
BEISPIELE
Das folgende Beispiel zeigt, wie Sie exstr anwenden können.
Wir nehmen an, die C-Quellprogramm-Datei datei.c enthalte zwei Zei-
chenketten.
main()
{
printf("Erste Zeichenkette\n");
printf("Zweite Zeichenkette\n");
}
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
exstr(1) exstr(1)
Der Aufruf von exstr ohne Option zieht aus der Datei datei.c die in
"..." eingeschlossenen Zeichenketten heraus und schreibt sie auf die
Standardausgabe.
$ exstr datei.c
datei.c:Erste Zeichenkette\n
datei.c:Zweite Zeichenkette\n
Die Zeichenketten selbst und zusätzliche Informationen über ihre Posi-
tion in der Datei erhalten Sie mit der Option -e. Um die herausgezoge-
nen Zeichenketten zu überprüfen und gegebenenfalls zu löschen oder zu
ändern, lenken Sie die Standardausgabe in eine Datei ausdatei um.
$ exstr -e datei.c > ausdatei
$ cat ausdatei
datei.c:3:8:::Erste Zeichenkette\n
datei.c:4:8:::Zweite Zeichenkette\n
Jede Ausgabezeile besteht aus sechs durch Doppelpunkt voneinander
getrennten Feldern. Im 1. Feld steht der Name der C-Quellprogramm-
Datei, im 2. Feld die Zeilennummer der Zeichenkette (hier 3 und 4), im
3. Feld die Spaltennummer des 1. Zeichens der Zeichenkette (hier 8),
im 6. Feld die Zeichenkette selbst ohne Anführungsstriche. Im 4. Feld
tragen Sie mit Hilfe eines Editors die Meldungsdatei ein, aus der
gettxt(3C) später die neue Zeichenkette holen soll und im 5. Feld die
Nummer, die die Zeichenkette in der Meldungsdatei hat. Angenommen, UX
ist der Name der Meldungsdatei und die entsprechenden Zeichenketten
hätten die Meldungsnummern 1 und 2, dann müßte ausdatei wie folgt
aussehen, nachdem Sie sie bearbeitet haben:
datei.c:3:8:UX:1:Erste Zeichenkette\n
datei.c:4:8:UX:2:Zweite Zeichenkette\n
Nun können Sie exstr -r aufrufen, um in der C-Quellprogramm-Datei alle
Zeichenketten durch den Funktionsaufruf gettxt(3C) zu ersetzen. Sie
übergeben dabei die von Ihnen geänderte Datei ausdatei als Eingabe an
exstr und lenken die Ausgabe in die Datei neudatei.c um, die dann
folgenden neuen Quellcode enthält:
$ exstr -r datei.c < ausdatei > neudatei.c
$ cat neudatei.c
extern char *gettxt();
main()
{
printf(gettxt("UX:1","Erste Zeichenkette\n"));
printf(gettxt("UX:2","Zweite Zeichenkette\n"));
}
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
exstr(1) exstr(1)
DATEIEN
/usr/lib/locale/Locale/LCMESSAGES
Verzeichnis mit den Meldungsdateien, wobei der einfache Name des
Verzeichnisses /usr/lib/locale/Locale, also Locale, der Landes-
sprache entspricht, in der die Zeichenketten in den darunter
befindlichen Dateien geschrieben sind.
SIEHE AUCH
gettxt(1), mkmsgs(1), printf(1), srchtxt(1), gettxt(3C),
setlocale(3C), printf(3S), environ(5).
Leitfaden für Programmierer, Internationalisierung - Lokalisierung.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98