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