[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] libc: wctype_t, iswctype, btowc
From: Alexander Hartmut Kluth <hartmut@xxxxxxxxxx>
wctype_t und Konsorten implementiert
+ Typ wctype_t hinzugefuegt
+ Funktion iswctype hinzugefuegt
+ Funktion btowc als Stub hinzugefuegt
Signed-off-by: Alexander Hartmut Kluth <hartmut@xxxxxxxxxx>
---
src/include/wctype.h | 7 +++
src/modules/include/wchar.h | 7 +++
src/modules/lib/stdlibc/wctype.c | 77 ++++++++++++++++++++++++++++++++++++++
3 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/src/include/wctype.h b/src/include/wctype.h
index f273a71..30e47c6 100644
--- a/src/include/wctype.h
+++ b/src/include/wctype.h
@@ -120,6 +120,12 @@ int iswprint(wint_t wc);
int iswcntrl(wint_t wc);
+int iswgraph(wint_t c);
+
+
+int iswxdigit(wint_t c);
+
+
/**
* Breites Zeichen in einen Grossbuchstaben umwandeln, falls es sich um einen
* Kleinbuchstaben handelt. Sonst wird das Zeichen unveraendert zurueckgegeben.
@@ -139,5 +145,6 @@ wint_t towupper(wint_t wc);
*/
wint_t towlower(wint_t wc);
+
#endif /* ndef WCTYPE_H */
diff --git a/src/modules/include/wchar.h b/src/modules/include/wchar.h
index 3870f9d..d39c632 100644
--- a/src/modules/include/wchar.h
+++ b/src/modules/include/wchar.h
@@ -40,6 +40,13 @@
*/
typedef wchar_t wint_t;
+
+/**
+ * wctype_t ist ein Funktionspointer
+ */
+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..b3c689c 100644
--- a/src/modules/lib/stdlibc/wctype.c
+++ b/src/modules/lib/stdlibc/wctype.c
@@ -27,6 +27,81 @@
*/
#include <wctype.h>
+#include <string.h>
+
+
+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);
+}
+
+
+/// TODO
+wint_t btowc(wint_t c)
+{
+ return 0;
+}
+
+
+int iswgraph(wint_t c)
+{
+ return 0;
+}
+
+
+int iswxdigit(wint_t c)
+{
+ return 0;
+}
+
/**
* Testet ob es sich bei einem breiten Zeichen um ein grosses alphabetisches
@@ -170,3 +245,5 @@ wint_t towlower(wint_t wc)
return iswupper(wc) ? wc + (L'a' - L'A') : wc;
}
+
+
--
1.6.0.4