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

Re: [tyndur-devel] [PATCH 1/5] libc: wctype-Makros in Funktionen umgeschrieben



Am Sonntag, 17. Mai 2009 18:15 schrieb Antoine Kaufmann:
> * libc: wctype-Makros in Funktionen umgeschrieben, da configure das so
>         erwartet.
> + libc: Ein paar wctype-Makros ergaenzt
>
> Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
> ---
>  src/include/wctype.h             |  121 ++++++++++++++++++++++++---
>  src/modules/lib/stdlibc/wctype.c |  172
> ++++++++++++++++++++++++++++++++++++++ 2 files changed, 281 insertions(+),
> 12 deletions(-)
>  create mode 100644 src/modules/lib/stdlibc/wctype.c
>
> diff --git a/src/include/wctype.h b/src/include/wctype.h
> index 8f21b94..f273a71 100644
> --- a/src/include/wctype.h
> +++ b/src/include/wctype.h
> @@ -29,18 +29,115 @@
>  #ifndef _WCTYPE_H_
>  #define _WCTYPE_H_
>
> -#define iswupper(c) ((c) >= L'A' && (c) <= L'Z')
> -#define iswlower(c) ((c) >= L'a' && (c) <= L'z')
> -
> -static inline wint_t towlower(wint_t c)
> -{
> -    return iswupper(c) ? c + (L'a' - L'A') : c;
> -}
> -
> -static inline wint_t towupper(wint_t c)
> -{
> -    return iswlower(c) ? c - (L'a' - L'A') : c;
> -}
> +#include <wchar.h>
> +
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein grosses
> alphabetisches + * Zeichen handelt.
> + * @see iswlower
> + * @see iswalpha
> + * @see towupper
> + * @see towlower
> + * @see isupper
> + */
> +int iswupper(wint_t wc);
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein kleines
> alphabetisches + * Zeichen handelt.
> + * @see iswupper
> + * @see iswalpha
> + * @see towlower
> + * @see towupper
> + * @see islower
> + */
> +int iswlower(wint_t wc);
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein alphabetisches
> Zeichen + * handelt.
> + * @see iswalnum
> + * @see isalpha
> + */
> +int iswalpha(wint_t wc);
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um eine Ziffer handelt.
> + * @see iswalnum
> + * @see isdigit
> + */
> +int iswdigit(wint_t wc);
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein alphabetisches
> Zeichen + * oder eine Ziffer handelt.
> + * @see iswalpha
> + * @see iswdigit
> + * @see isalnum
> + */
> +int iswalnum(wint_t wc);
> +
> +/**
> + * Testen ob es sich bei einem Breiten Zeichen um ein Leerzeichen oder ein
> + * Zeilenende handelt.
> + * @see iswblank
> + * @see isblank
> + */
> +int iswspace(wint_t wc);
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein Leerzeichen
> + * handelt(einfaches Leerzeichen oder Tab).
> + * @see iswspace
> + * @see isblank
> + */
> +int iswblank(wint_t wc);
> +
> +/**
> + * TODO: Kann man das irgendwie sinnvoll erklaeren, was da alles
> + *       dazugehoert? ;-) Mit Unicode sind das naemlich nicht nur
> + *       Punktuationszeichen sondern auch andere Sonderzeichen.
> + * @see ispunct
> + */
> +int iswpunct(wint_t wc);
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein druckbares Zeichen
> + * handelt. Das sind alle Zeichen, die keine Kontrollzeichen(iswcntrl)
> sind. + * @see iswcntrl
> + * @see isprint
> + */
> +int iswprint(wint_t wc);
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein Kontrollzeichen(z.B
> \n, \t + * oder \b) handelt. Diese Zeichen wuerden bei einem
> iswprint-Aufruf 0 + * zurueckgeben.
> + * @see iswprint
> + * @see iscntrl
> + */
> +int iswcntrl(wint_t wc);
> +
> +
> +/**
> + * Breites Zeichen in einen Grossbuchstaben umwandeln, falls es sich um
> einen + * Kleinbuchstaben handelt. Sonst wird das Zeichen unveraendert
> zurueckgegeben. + * @see iswupper
> + * @see towlower
> + * @see tolower
> + */
> +wint_t towupper(wint_t wc);
> +
> +/**
> + * Breites Zeichen in einen Kleinbuchstaben umwandeln, falls es sich um
> einen + * Grossbuchstaben umwandeln. Sonst wird das Zeichen unveraendert +
> * zurueckgegeben.
> + * @see iswlower
> + * @see towupper
> + * @see tolower
> + */
> +wint_t towlower(wint_t wc);
>
>  #endif /* ndef WCTYPE_H */
>
> diff --git a/src/modules/lib/stdlibc/wctype.c
> b/src/modules/lib/stdlibc/wctype.c new file mode 100644
> index 0000000..d98e607
> --- /dev/null
> +++ b/src/modules/lib/stdlibc/wctype.c
> @@ -0,0 +1,172 @@
> +/*
> + * Copyright (c) 2009 The tyndur Project. All rights reserved.
> + *
> + * This code is derived from software contributed to the tyndur Project
> + * by Antoine Kaufmann.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> PARTICULAR + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
> HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <wctype.h>
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein grosses
> alphabetisches + * Zeichen handelt.
> + * @see iswlower
> + * @see iswalpha
> + * @see towupper
> + * @see towlower
> + * @see isupper
> + */
> +int iswupper(wint_t wc)
> +{
> +    return (wc >= L'A' && wc <= L'Z');
> +}

Strenggenommen ist das ja nicht richtig. In Unicode kommen noch eine ganze 
Menge anderer Zeichen, die große oder kleine Buchstaben sind. Genau das 
dürfte dann doch das wortweise Bewegen usw. kaputtmachen?

Aber wenn es in der Praxis reicht, können wir es erstmal so lassen.

> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein kleines
> alphabetisches + * Zeichen handelt.
> + * @see iswupper
> + * @see iswalpha
> + * @see towlower
> + * @see towupper
> + * @see islower
> + */
> +int iswlower(wint_t wc)
> +{
> +    return (wc >= L'a' && wc <= L'z');
> +}
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein alphabetisches
> Zeichen + * handelt.
> + * @see iswalnum
> + * @see isalpha
> + */
> +int iswalpha(wint_t wc)
> +{
> +    return ((wc >= L'a' && wc <= L'z') || (wc >= L'A' && wc <= L'Z'));
> +}
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um eine Ziffer handelt.
> + * @see iswalnum
> + * @see isdigit
> + */
> +int iswdigit(wint_t wc)
> +{
> +    return (wc >= L'0' && wc <= L'9');
> +}
> +
> +/**
> + * Testet ob es sich bei einem breiten Zeichen um ein alphabetisches
> Zeichen + * oder eine Ziffer handelt.
> + * @see iswalpha
> + * @see iswdigit
> + * @see isalnum
> + */
> +int iswalnum(wint_t wc)
> +{
> +    return (iswdigit(wc) || iswalpha(wc));
> +}
> +
> +/**
> + * Testen ob es sich bei einem Breiten Zeichen um ein Leerzeichen oder ein
> + * Zeilenende handelt.
> + * @see iswblank
> + * @see isblank
> + */
> +int iswspace(wint_t wc)
> +{
> +    return (wc == L' ' || wc == L'\n' || wc == L'\r' || wc == L'\t');
> +}
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein Leerzeichen
> + * handelt(einfaches Leerzeichen oder Tab).
> + * @see iswspace
> + * @see isblank
> + */
> +int iswblank(wint_t wc)
> +{
> +    return (wc == L' ' || wc == L'\t');
> +}
> +
> +/**
> + * TODO: Kann man das irgendwie sinnvoll erklaeren, was da alles
> + *       dazugehoert? ;-) Mit Unicode sind das naemlich nicht nur
> + *       Punktuationszeichen sondern auch andere Sonderzeichen.
> + * @see ispunct
> + */
> +int iswpunct(wint_t wc)
> +{
> +    return iswprint(wc) && !iswspace(wc) && !iswalnum(wc);
> +}
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein druckbares Zeichen
> + * handelt. Das sind alle Zeichen, die keine Kontrollzeichen(iswcntrl)
> sind. + * @see iswcntrl
> + * @see isprint
> + */
> +int iswprint(wint_t wc)
> +{
> +    return (wc >= (wint_t) 0x20);
> +}
> +
> +/**
> + * Testen ob es sich bei einem breiten Zeichen um ein Kontrollzeichen(z.B
> \n, \t + * oder \b) handelt. Diese Zeichen wuerden bei einem
> iswprint-Aufruf 0 + * zurueckgeben.
> + * @see iswprint
> + * @see iscntrl
> + */
> +int iswcntrl(wint_t wc)
> +{
> +    return (wc < (wint_t) 0x20);
> +}
> +
> +/**
> + * Breites Zeichen in einen Grossbuchstaben umwandeln, falls es sich um
> einen + * Kleinbuchstaben handelt. Sonst wird das Zeichen unveraendert
> zurueckgegeben. + * @see iswupper
> + * @see towlower
> + * @see tolower
> + */
> +wint_t towupper(wint_t wc)
> +{
> +    return iswupper(wc) ? wc + (L'a' - L'A') : wc;

Das ist doch genau falschrum, also ein towlower?

> +}
> +
> +/**
> + * Breites Zeichen in einen Kleinbuchstaben umwandeln, falls es sich um
> einen + * Grossbuchstaben umwandeln. Sonst wird das Zeichen unveraendert +
> * zurueckgegeben.
> + * @see iswlower
> + * @see towupper
> + * @see tolower
> + */
> +wint_t towlower(wint_t wc)
> +{
> +    return iswlower(wc) ? wc - (L'a' - L'A') : wc;
> +}

Und hier nochmal.