[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