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

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



! 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;
     }
 
     // Erstes Zeichen wird separat behandelt
-- 
1.6.0.6