Hallo zusammen!
Ich erstelle gerade ein Interface für eine C-Bibliothek (sqlite3).
1. In dieser Lib kommen Funktionen vor, die Konstante Zeiger zurückliefern. Beispiel: const void * foo (); const char* bar ();
Wie übersetze ich diese nach GPC? Ist es für const char* ratsam, den konstanten String zu kopieren (strdup oder so)?
2. Die Bibliothek enthält Stellen, wo UTF-8 bzw UTF-16 referenziert wird. Etwa so:
int bazz (const char* utf8_text); int bazz16 (const void* utf16_text);
In beiden Fällen handelt es sich um C-Strings, im zweiten Fall allerdings um sowas wie 2 Byte pro Zeichen. Was mache ich in GPC damit?
Eike
Eike Lange schrieb:
Ich erstelle gerade ein Interface für eine C-Bibliothek (sqlite3).
- In dieser Lib kommen Funktionen vor, die Konstante Zeiger
zurückliefern. Beispiel: const void * foo (); const char* bar ();
Wie übersetze ich diese nach GPC?
Am einfachsten (da geht nur das `const' verloren) `Pointer' für `void *' und entweder `CString' oder `^Char' oder `^Byte' oder `^array [0 .. irgendwas] of Char/Byte' für `char *'. (C ist halt mehrdeutig, da muss man sich überlegen, was gemeint ist.)
GPC erlaubt als Erweiterung auch `^const Byte', und für `const void *' müsste sogar `^const Void' gehen. Alles natürlich hochgradig nicht-standard, und von keinem anderen bekannten Compiler geteilt, also mit Vorsicht zu genießen ...
Ist es für const char* ratsam, den konstanten String zu kopieren (strdup oder so)?
Kommt drauf an, was damit gemacht wird, lässt sich so allgemein schwer sagen. In meinen Bibliotheken arbeite ich eigentlich Pascal-seitig fast nur mit Pascal-Strings. Daraus ergibt sich zwangsläufig, dass ich C-Strings kopiere, nämlich mit CString2String in Pascal-Strings.
- Die Bibliothek enthält Stellen, wo UTF-8 bzw UTF-16 referenziert
wird. Etwa so:
int bazz (const char* utf8_text); int bazz16 (const void* utf16_text);
In beiden Fällen handelt es sich um C-Strings, im zweiten Fall allerdings um sowas wie 2 Byte pro Zeichen. Was mache ich in GPC damit?
GPC hat zz. noch keine Unterstüzung für 16-Bit-Zeichen. Man kann natürlich einen 16-Bit-Integer (`Cardinal attribute (size = 16)') nehmen und dann die Zeichen als Zahlen behandeln und ggf. umwandeln ...
Frank