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

[tyndur-devel] [PATCH] libc: wctype und Konsorten



From: Alexander Hartmut Kluth <derhartmut@xxxxxxxx>

+ libc: iswgraph, iswxdigit, btowc und wctype_t-"Klasse" implementiert

Signed-off-by: Alexander Hartmut Kluth <derhartmut@xxxxxxxx>
---
 src/include/wctype.h             |    9 ++++
 src/modules/include/wchar.h      |    5 ++
 src/modules/lib/stdlibc/wctype.c |   85 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/src/include/wctype.h b/src/include/wctype.h
index f273a71..442784b 100644
--- a/src/include/wctype.h
+++ b/src/include/wctype.h
@@ -119,6 +119,15 @@ int iswprint(wint_t wc);
  */
 int iswcntrl(wint_t wc);
 
+/**
+ * Testen, ob das Zeichen ein druckbares Zeichen auÃ?er ein Leerzeichen ist
+ **/
+int iswgraph(wint_t wc);
+
+/**
+ * Testen, ob das Zeichen eine druckbare hexadazimale Ziffer ist
+ **/
+int iswxdigit(wint_t wc);
 
 /**
  * Breites Zeichen in einen Grossbuchstaben umwandeln, falls es sich um einen
diff --git a/src/modules/include/wchar.h b/src/modules/include/wchar.h
index 3870f9d..f036f86 100644
--- a/src/modules/include/wchar.h
+++ b/src/modules/include/wchar.h
@@ -41,6 +41,11 @@
 typedef wchar_t wint_t;
 
 /**
+ * Funktionspointer als Schnittstelle zu den wctype-Klassen
+ **/
+typedef int (*wctype_t)(wint_t);
+
+/**
  * Repraesentiert den internen Shift-Status einer Funktion, brauchen wir mit
  * UTF-8 nicht.
  */
diff --git a/src/modules/lib/stdlibc/wctype.c b/src/modules/lib/stdlibc/wctype.c
index b3c174c..0114a06 100644
--- a/src/modules/lib/stdlibc/wctype.c
+++ b/src/modules/lib/stdlibc/wctype.c
@@ -27,6 +27,73 @@
  */
 
 #include <wctype.h>
+#include <string.h>
+
+static struct { const char* name; wctype_t func; } types[] = {
+    { "alnum", iswalnum },
+    { "alpha", iswalpha },
+    { "blank", iswblank },
+    { "cntrl", iswcntrl },
+    { "digit", iswdigit },
+    { "graph", iswgraph },
+    { "lower", iswlower },
+    { "print", iswprint },
+    { "punct", iswpunct },
+    { "space", iswspace },
+    { "upper", iswupper },
+    { "xdigit", iswxdigit }
+};
+
+
+/**
+ * Erstellt ein wctype-Objekt
+ *
+ * @param type Typ des zu erstellenden Objekts
+ *
+ * @return Das Objekt, ansonsten (wctype_t)0
+ **/
+wctype_t wctype(const char* name)
+{
+    int i;
+
+    for (i = 0; i < sizeof(types) / sizeof(types[0]); i++)
+    {
+        if (!strcmp(name, types[i].name)) {
+            return types[i].func;
+        }
+    }
+
+    return (wctype_t)0;
+}
+
+
+/**
+ * Prüft, ob der als Parameter übergebene Typ auch vom Typ wctype_t ist
+ *
+ * @param wc Ã?bergebener Typ
+ * @param type Typklasse
+ *
+ * @return 0, wenn die Klasse nicht vorhanden ist, ansonsten den
+ * Funktionspointer
+ **/
+int iswctype(wint_t wc, wctype_t type)
+{
+    return type(wc);
+}
+
+
+/**
+ * Konvertiert ein Ein-Byte-Character in ein Wide-Character
+ *
+ * @param wc Der Character
+ *
+ * @return Das konvertierte Zeichen, ansonsten WEOF
+ **/
+wint_t btowc(wint_t wc)
+{
+    return wc > 127 ? EOF : wc;
+}
+
 
 /**
  * Testet ob es sich bei einem breiten Zeichen um ein grosses alphabetisches
@@ -146,6 +213,24 @@ int iswcntrl(wint_t wc)
 }
 
 /**
+ * Testen, ob das Zeichen ein druckbares Zeichen ist, ausgenommen davon ist
+ * ein Leerzeichen.
+ **/
+int iswgraph(wint_t wc)
+{
+    return (wc != L' ');
+}
+
+/**
+ * Testen, ob das Zeichen eine druckbare Hexadezimale Ziffer ist
+ **/
+int iswxdigit(wint_t wc)
+{
+    return ((wc >= L'A' && wc <= L'F') || (wc >= L'a' && wc <= L'f') || (wc >=
+    L'0' && wc <= '9'));
+}
+
+/**
  * Breites Zeichen in einen Grossbuchstaben umwandeln, falls es sich um einen
  * Kleinbuchstaben handelt. Sonst wird das Zeichen unveraendert zurueckgegeben.
  * @see iswupper
-- 
1.6.3.3