[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] UTF8-Unterstützung in vterm
Am Montag, 2. Juni 2008 23:08:24 schrieb Antoine Kaufmann:
> Index: src/modules/vterm/output.c
> ===================================================================
> --- src/modules/vterm/output.c (Revision 767)
> +++ src/modules/vterm/output.c (Arbeitskopie)
> @@ -151,9 +151,16 @@
> void vterm_process_output(vterminal_t* vterm, char* data, size_t length)
> {
> vterm_output_t* out = &(vterm->output);
> + char cpdata[length + vterm->utf8_buffer_offset];
> + int len;
>
> + if ((len = utf8_to_cp437(vterm, data, length, cpdata)) == 0) {
> + return;
> + }
> +
> // Ausgaben durch vt100-Emulation taetigen
> - vt100_process_output(vterm, data, length);
> + vt100_process_output(vterm, cpdata, len);
> + free(cpdata);
Also ich habe Variablen auf dem Stack noch nie mit free() behandelt...
>
> // Anzeige aktualisieren falls es sich um aenderungen auf dem aktiven
> // Terminal handelt.
> Index: src/modules/vterm/vterm.h
> ===================================================================
> --- src/modules/vterm/vterm.h (Revision 767)
> +++ src/modules/vterm/vterm.h (Arbeitskopie)
> @@ -151,6 +151,12 @@
>
> /// Anzahl der Zeichen im vt100-Puffer
> size_t vt100_buffer_offset;
> +
> + /// UTF-8 Puffer
> + char utf8_buffer[4];
Wenn du den hier ein Byte größer machst...
> +static bool convert_char(vterminal_t* vterm, char c, char* dest)
> +{
> + int len = vterm->utf8_buffer_offset + 1;
> + char buf[len];
> + wchar_t wc;
> +
> + // Zeichen aus dem Unicode-Puffer kopieren
> + memcpy(buf, vterm->utf8_buffer, vterm->utf8_buffer_offset);
> + buf[len - 1] = c;
...könntest du hier auf die Kopiererei verzichten.
> +
> + // Versuchen ein Zeichen zu konvertieren
> + if (mbtowc(&wc, buf, len) == -1) {
> + char* p = buf;
> +
> + // Wenn das nicht klappt, wird das ganze in den Buffer kopiert
> + if (len > 4) {
> + // Erstes Zeichen abschneiden bei mehr als 4
> + len--;
> + p++;
> + }
> +
> + memcpy(vterm->utf8_buffer, p, len);
> + vterm->utf8_buffer_offset = len;
> + return FALSE;
> + } else {
> + *dest = to_cp437(wc);
Hm, also irgendein unbekanntes Zeichen nehmen und dest ist an dieser Stelle zu
Ende? Ich würde da lieber ein if(!*dest) { *dest = '?' } oder so machen.
Sieht auch besser aus statt einfach einem Leerzeichen. ;-)