diff options
Diffstat (limited to 'src/Lower.c')
-rw-r--r-- | src/Lower.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/Lower.c b/src/Lower.c new file mode 100644 index 0000000..fc588ef --- /dev/null +++ b/src/Lower.c @@ -0,0 +1,121 @@ +/* $Xorg: Lower.c,v 1.4 2001/02/09 02:03:53 xorgcvs Exp $ */ + +/* + +Copyright 1988, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + +#define XK_LATIN1 +#include <X11/keysymdef.h> +#include <X11/Xmu/CharSet.h> + +/* + * ISO Latin-1 case conversion routine + */ + +#if NeedFunctionPrototypes +void XmuCopyISOLatin1Lowered(char *dst, _Xconst char *src) +#else +void XmuCopyISOLatin1Lowered(dst, src) + char *dst, *src; +#endif +{ + register unsigned char *dest, *source; + + for (dest = (unsigned char *)dst, source = (unsigned char *)src; + *source; + source++, dest++) + { + if ((*source >= XK_A) && (*source <= XK_Z)) + *dest = *source + (XK_a - XK_A); + else if ((*source >= XK_Agrave) && (*source <= XK_Odiaeresis)) + *dest = *source + (XK_agrave - XK_Agrave); + else if ((*source >= XK_Ooblique) && (*source <= XK_Thorn)) + *dest = *source + (XK_oslash - XK_Ooblique); + else + *dest = *source; + } + *dest = '\0'; +} + +#if NeedFunctionPrototypes +void XmuCopyISOLatin1Uppered(char *dst, _Xconst char *src) +#else +void XmuCopyISOLatin1Uppered(dst, src) + char *dst, *src; +#endif +{ + register unsigned char *dest, *source; + + for (dest = (unsigned char *)dst, source = (unsigned char *)src; + *source; + source++, dest++) + { + if ((*source >= XK_a) && (*source <= XK_z)) + *dest = *source - (XK_a - XK_A); + else if ((*source >= XK_agrave) && (*source <= XK_odiaeresis)) + *dest = *source - (XK_agrave - XK_Agrave); + else if ((*source >= XK_slash) && (*source <= XK_thorn)) + *dest = *source - (XK_oslash - XK_Ooblique); + else + *dest = *source; + } + *dest = '\0'; +} + +#if NeedFunctionPrototypes +int XmuCompareISOLatin1 (_Xconst char *first, _Xconst char *second) +#else +int XmuCompareISOLatin1 (first, second) + char *first, *second; +#endif +{ + register unsigned char *ap, *bp; + + for (ap = (unsigned char *) first, bp = (unsigned char *) second; + *ap && *bp; ap++, bp++) { + register unsigned char a, b; + + if ((a = *ap) != (b = *bp)) { + /* try lowercasing and try again */ + + if ((a >= XK_A) && (a <= XK_Z)) + a += (XK_a - XK_A); + else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis)) + a += (XK_agrave - XK_Agrave); + else if ((a >= XK_Ooblique) && (a <= XK_Thorn)) + a += (XK_oslash - XK_Ooblique); + + if ((b >= XK_A) && (b <= XK_Z)) + b += (XK_a - XK_A); + else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis)) + b += (XK_agrave - XK_Agrave); + else if ((b >= XK_Ooblique) && (b <= XK_Thorn)) + b += (XK_oslash - XK_Ooblique); + + if (a != b) return (((int) a) - ((int) b)); + } + } + return (((int) *ap) - ((int) *bp)); +} |