diff options
Diffstat (limited to 'private/crt32/string/wcslwr.c')
-rw-r--r-- | private/crt32/string/wcslwr.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/private/crt32/string/wcslwr.c b/private/crt32/string/wcslwr.c new file mode 100644 index 000000000..b8cf567cc --- /dev/null +++ b/private/crt32/string/wcslwr.c @@ -0,0 +1,100 @@ +/*** +*wcslwr.c - routine to map upper-case characters in a wchar_t string +* to lower-case +* +* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved. +* +*Purpose: +* Converts all the upper case characters in a wchar_t string +* to lower case, in place. +* +*Revision History: +* 09-09-91 ETC Created from strlwr.c. +* 04-06-92 KRS Make work without _INTL also. +* 08-19-92 KRS Activate NLS support. +* 08-22-92 SRW Allow INTL definition to be conditional for building ntcrt.lib +* 09-02-92 SRW Get _INTL definition via ..\crt32.def +* 06-02-93 SRW ignore _INTL if _NTSUBSET_ defined. +* +*******************************************************************************/ + +#include <cruntime.h> +#include <string.h> +#include <malloc.h> +#include <locale.h> +#include <ctype.h> +#include <setlocal.h> +#include <os2dll.h> + +/*** +*wchar_t *_wcslwr(string) - map upper-case characters in a string to lower-case +* +*Purpose: +* wcslwr converts upper-case characters in a null-terminated wchar_t +* string to their lower-case equivalents. The result may be longer or +* shorter than the original string. Assumes enough space in string +* to hold the result. +* +*Entry: +* wchar_t *wsrc - wchar_t string to change to lower case +* +*Exit: +* input string address +* +*Exceptions: +* on an error, the original string is unaltered +* +*******************************************************************************/ + +wchar_t * _CALLTYPE1 _wcslwr ( + wchar_t * wsrc + ) +{ +#if defined(_INTL) && !defined(_NTSUBSET_) + wchar_t *p; /* traverses string for C locale conversion */ + wchar_t *wdst = NULL; /* wide version of string in alternate case */ + int srclen; /* general purpose length of source string */ + int dstlen; /* len of wdst string, wide chars, no null */ + + _mlock (_LC_CTYPE_LOCK); + + if (_lc_handle[LC_CTYPE] == _CLOCALEHANDLE) { + _munlock (_LC_CTYPE_LOCK); + for (p=wsrc; *p; p++) + if (iswupper(*p)) + *p = *p - L'A' + L'a'; + return (wsrc); + } /* C locale */ + + /* Inquire size of wdst string */ + srclen = wcslen(wsrc) + 1; + if ((dstlen=LCMapStringW(_lc_handle[LC_CTYPE], LCMAP_LOWERCASE, wsrc, + srclen, wdst, 0)) == 0) + goto error_cleanup; + + /* Allocate space for wdst */ + if ((wdst = (wchar_t *) malloc(dstlen*sizeof(wchar_t))) == NULL) + goto error_cleanup; + + /* Map wrc string to wide-character wdst string in alternate case */ + if (LCMapStringW(_lc_handle[LC_CTYPE], LCMAP_LOWERCASE, wsrc, + srclen, wdst, dstlen) == 0) + goto error_cleanup; + + /* Copy wdst string to user string */ + wcscpy (wsrc, wdst); + +error_cleanup: + _munlock (_LC_CTYPE_LOCK); + free (wdst); +#else + wchar_t * p; + + for (p=wsrc; *p; ++p) + { + if (L'A' <= *p && *p <= L'Z') + *p += (wchar_t)L'a' - (wchar_t)L'A'; + } +#endif /* _INTL */ + return (wsrc); +} |