Permalink
Cannot retrieve contributors at this time
82 lines (66 sloc)
2.17 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| /* | |
| FUNCTION | |
| <<tolower>>, <<tolower_l>>---translate characters to lowercase | |
| INDEX | |
| tolower | |
| INDEX | |
| tolower_l | |
| INDEX | |
| _tolower | |
| SYNOPSIS | |
| #include <ctype.h> | |
| int tolower(int <[c]>); | |
| int _tolower(int <[c]>); | |
| #include <ctype.h> | |
| int tolower_l(int <[c]>, locale_t <[locale]>); | |
| DESCRIPTION | |
| <<tolower>> is a macro which converts uppercase characters to lowercase, | |
| leaving all other characters unchanged. It is only defined when | |
| <[c]> is an integer in the range <<EOF>> to <<255>>. | |
| <<tolower_l>> is like <<tolower>> but performs the function based on the | |
| locale specified by the locale object locale. If <[locale]> is | |
| LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. | |
| You can use a compiled subroutine instead of the macro definition by | |
| undefining this macro using `<<#undef tolower>>' or `<<#undef tolower_l>>'. | |
| <<_tolower>> performs the same conversion as <<tolower>>, but should | |
| only be used when <[c]> is known to be an uppercase character (<<A>>--<<Z>>). | |
| RETURNS | |
| <<tolower>>, <<tolower_l>> return the lowercase equivalent of <[c]> when | |
| <[c]> is an uppercase character, and <[c]> otherwise. | |
| <<_tolower>> returns the lowercase equivalent of <[c]> when it is a | |
| character between <<A>> and <<Z>>. If <[c]> is not one of these | |
| characters, the behaviour of <<_tolower>> is undefined. | |
| PORTABILITY | |
| <<tolower>> is ANSI C. <<_tolower>> is not recommended for portable programs. | |
| <<tolower_l>> is POSIX-1.2008. | |
| No supporting OS subroutines are required. | |
| */ | |
| #include <_ansi.h> | |
| #include <ctype.h> | |
| #if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) | |
| #include <limits.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <wctype.h> | |
| #include <wchar.h> | |
| #endif | |
| #undef tolower | |
| int | |
| tolower (int c) | |
| { | |
| #if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) | |
| if ((unsigned char) c <= 0x7f) | |
| return isupper (c) ? c - 'A' + 'a' : c; | |
| else if (c != EOF && MB_CUR_MAX == 1 && isupper (c)) | |
| { | |
| char s[MB_LEN_MAX] = { c, '\0' }; | |
| wchar_t wc; | |
| if (mbtowc (&wc, s, 1) >= 0 | |
| && wctomb (s, (wchar_t) towlower ((wint_t) wc)) == 1) | |
| c = (unsigned char) s[0]; | |
| } | |
| return c; | |
| #else | |
| return isupper(c) ? (c) - 'A' + 'a' : c; | |
| #endif | |
| } |