[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. ;-)