[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 2/5] libc: mbtowc und mblen gefixt fuer wc = L'\0'



Am Sonntag, 17. Mai 2009 18:15 schrieb Antoine Kaufmann:
> ! libc: mbtowc und mblen gefixt, damit ein L'\0' korrekt gehandhabt wird
>
> Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
> ---
>  src/lib/string/multibyte.c |   17 ++++++++++++-----
>  1 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/src/lib/string/multibyte.c b/src/lib/string/multibyte.c
> index ade0e6f..d34dcc0 100644
> --- a/src/lib/string/multibyte.c
> +++ b/src/lib/string/multibyte.c
> @@ -57,7 +57,8 @@
>
>
>  /**
> - * Anzahl der Bytes die das erste Zeichen belegt
> + * Anzahl der Bytes die das erste Zeichen belegt. Handelt es sich um ein
> L'\0', + * ist die Laenge 0.
>   *
>   * @param s     Pointer auf den Anfang den Anfang des Zeichens
>   * @param slen  Maximale Laenge die das Zeichen haben kann (Stringlaenge)
> @@ -78,7 +79,12 @@ int mblen(const char* s, size_t slen)
>      } else if ((s[0] & MSK_2) == VAL_2) {
>          len = 2;
>      } else if ((s[0] & MSK_1) == VAL_1) {
> -        len = 1;
> +        // Bei einem L'\0' soll 0 zurueckgegeben werden
> +        if (!s[0]) {
> +            len = 0;
> +        } else {
> +            len = 1;
> +        }
>      } else {
>          return -1;
>      }
> @@ -102,7 +108,8 @@ int mblen(const char* s, size_t slen)
>  /**
>   * Erstes Zeichen im String in einen wchar umwandeln. Wird NULL als wc
>   * uebergeben, gibt die Funktion lediglich die Laenge des Zeichens zurueck
> - * (mblen). Ist s NULL gibt die Funktion 0 zurueck.
> + * (mblen). Handelt es sich beim ersten Zeichen um ein L'\0', soll 0 als
> Laenge + * zurueckgegeben werden. Ist s NULL gibt die Funktion 0 zurueck. *
>   * @param wc    Pointer auf den wchar in dem das Ergebnis abgelegt werden
> soll * @param s     Pointer auf den Anfang des Zeichens
> @@ -126,8 +133,8 @@ int mbtowc(wchar_t* wc, const char* s, size_t slen)
>          return len;
>      }
>
> -    if (len == -1) {
> -        return -1;
> +    if ((len == -1) || !len) {
> +        return len;
>      }

Muss (bzw. darf) wc für L'\0' nicht gesetzt werden? Die Spezifikation kommt 
mir da nicht besonders klar vor. Ich hätte gedacht, die bisherige 
Implementierung tut hier das richtige.