diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
commit | 99aa8c60282c7b8072eb35eb9ac815702f5bf586 (patch) | |
tree | bda96bf8c3a4c2875a083d7b16720533c8ffeaf4 /ACE/ace/OS_NS_wchar.cpp | |
parent | c4078c377d74290ebe4e66da0b4975da91732376 (diff) | |
download | ATCD-99aa8c60282c7b8072eb35eb9ac815702f5bf586.tar.gz |
undoing accidental deletion
Diffstat (limited to 'ACE/ace/OS_NS_wchar.cpp')
-rw-r--r-- | ACE/ace/OS_NS_wchar.cpp | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/ACE/ace/OS_NS_wchar.cpp b/ACE/ace/OS_NS_wchar.cpp new file mode 100644 index 00000000000..194e4a9a1da --- /dev/null +++ b/ACE/ace/OS_NS_wchar.cpp @@ -0,0 +1,377 @@ +// $Id$ + +#include "ace/OS_NS_wchar.h" + +ACE_RCSID(ace, OS_NS_wchar, "$Id$") + +#if !defined (ACE_HAS_INLINED_OSCALLS) +# include "ace/OS_NS_wchar.inl" +#endif /* ACE_HAS_INLINED_OSCALLS */ + +#if defined (ACE_HAS_WCHAR) +# include "ace/OS_NS_ctype.h" +# include "ace/OS_NS_string.h" +#endif /* ACE_HAS_WCHAR */ + +// The following wcs*_emulation methods were created based on BSD code: +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * James W. Williams of NASA Goddard Space Flight Center. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. + */ + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSCAT) +wchar_t * +ACE_OS::wcscat_emulation (wchar_t *destination, + const wchar_t *source) +{ + wchar_t *save = destination; + + for (; *destination; ++destination); + while ((*destination++ = *source++)); + return save; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSCAT */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSCHR) +wchar_t * +ACE_OS::wcschr_emulation (const wchar_t *string, wchar_t c) +{ + for (;*string ; ++string) + if (*string == c) + return const_cast<wchar_t *> (string); + + return 0; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSCHR */ + +#if !defined (ACE_HAS_WCHAR) || defined (ACE_LACKS_WCSCMP) +int +ACE_OS::wcscmp_emulation (const ACE_WCHAR_T *string1, + const ACE_WCHAR_T *string2) +{ + while (*string1 == *string2++) + if (*string1++ == 0) + return (0); + return (*string1 - *--string2); +} +#endif /* !ACE_HAS_WCHAR || ACE_LACKS_WCSCMP */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSCPY) +wchar_t * +ACE_OS::wcscpy_emulation (wchar_t *destination, + const wchar_t *source) +{ + wchar_t *save = destination; + + for (; (*destination = *source); ++source, ++destination); + return save; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSCPY */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSCSPN) +size_t +ACE_OS::wcscspn_emulation (const wchar_t *s, const wchar_t *reject) +{ + const wchar_t *scan = 0; + const wchar_t *rej_scan = 0; + int count = 0; + + for (scan = s; *scan; scan++) + { + + for (rej_scan = reject; *rej_scan; rej_scan++) + if (*scan == *rej_scan) + return count; + + count++; + } + + return count; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSCSPN */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSICMP) +int +ACE_OS::wcsicmp_emulation (const wchar_t *s, const wchar_t *t) +{ + const wchar_t *scan1 = s; + const wchar_t *scan2 = t; + + while (*scan1 != 0 + && ACE_OS::ace_towlower (*scan1) + == ACE_OS::ace_towlower (*scan2)) + { + ++scan1; + ++scan2; + } + + // The following case analysis is necessary so that characters which + // look negative collate low against normal characters but high + // against the end-of-string NUL. + + if (*scan1 == '\0' && *scan2 == '\0') + return 0; + else if (*scan1 == '\0') + return -1; + else if (*scan2 == '\0') + return 1; + else + return ACE_OS::ace_tolower (*scan1) - ACE_OS::ace_towlower (*scan2); +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSICMP */ + +#if !defined (ACE_HAS_WCHAR) || defined (ACE_LACKS_WCSLEN) +size_t +ACE_OS::wcslen_emulation (const ACE_WCHAR_T *string) +{ + const ACE_WCHAR_T *s; + + for (s = string; *s; ++s) + continue; + + return s - string; +} +#endif /* !ACE_HAS_WCHAR || ACE_LACKS_WCSLEN */ + +#if !defined (ACE_HAS_WCHAR) || defined (ACE_LACKS_WCSNCAT) +ACE_WCHAR_T * +ACE_OS::wcsncat_emulation (ACE_WCHAR_T *destination, + const ACE_WCHAR_T *source, + size_t count) +{ + if (count != 0) + { + ACE_WCHAR_T *d = destination; + const ACE_WCHAR_T *s = source; + + while (*d != 0) + d++; + + do + { + if ((*d = *s++) == 0) + break; + + d++; + } while (--count != 0); + + *d = 0; + } + + return destination; +} +#endif /* !ACE_HAS_WCHAR || ACE_LACKS_WCSCAT */ + +#if !defined (ACE_HAS_WCHAR) || defined (ACE_LACKS_WCSNCMP) +int +ACE_OS::wcsncmp_emulation (const ACE_WCHAR_T *s1, + const ACE_WCHAR_T *s2, + size_t len) +{ + if (len == 0) + return 0; + + do + { + if (*s1 != *s2++) + return (*s1 - *--s2); + if (*s1++ == 0) + break; + } while (--len != 0); + + return 0; +} +#endif /* !ACE_HAS_WCHAR || ACE_LACKS_WCSNCMP */ + +#if !defined (ACE_HAS_WCHAR) || defined (ACE_LACKS_WCSNCPY) +ACE_WCHAR_T * +ACE_OS::wcsncpy_emulation (ACE_WCHAR_T *destination, + const ACE_WCHAR_T *source, + size_t len) +{ + if (len != 0) + { + ACE_WCHAR_T *d = destination; + const ACE_WCHAR_T *s = source; + + do + { + if ((*d++ = *s++) == 0) + { + // NUL pad the remaining n-1 bytes + while (--len != 0) + *d++ = 0; + break; + } + } while (--len != 0); + } + + return destination; +} +#endif /* !ACE_HAS_WCHAR || ACE_LACKS_WCSNCPY */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSNICMP) +int +ACE_OS::wcsnicmp_emulation (const wchar_t *s, + const wchar_t *t, + size_t len) +{ + const wchar_t *scan1 = s; + const wchar_t *scan2 = t; + size_t count = 0; + + while (count++ < len + && *scan1 != 0 + && ACE_OS::ace_towlower (*scan1) + == ACE_OS::ace_towlower (*scan2)) + { + ++scan1; + ++scan2; + } + + if (count > len) + return 0; + + // The following case analysis is necessary so that characters which + // look negative collate low against normal characters but high + // against the end-of-string NUL. + + if (*scan1 == '\0' && *scan2 == '\0') + return 0; + else if (*scan1 == '\0') + return -1; + else if (*scan2 == '\0') + return 1; + else + return ACE_OS::ace_towlower (*scan1) - ACE_OS::ace_towlower (*scan2); +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSNICMP */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSPBRK) +wchar_t * +ACE_OS::wcspbrk_emulation (const wchar_t *string, + const wchar_t *charset) +{ + const wchar_t *scanp; + int c, sc; + + while ((c = *string++) != 0) + { + for (scanp = charset; (sc = *scanp++) != 0;) + if (sc == c) + return const_cast<wchar_t *> (string - 1); + } + + return 0; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSPBRK */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSRCHR) +const wchar_t * +ACE_OS::wcsrchr_emulation (const wchar_t *s, wint_t c) +{ + const wchar_t *p = s + ACE_OS::strlen (s); + + while (*p != static_cast<wchar_t> (c)) + if (p == s) + return 0; + else + p--; + + return p; +} + +wchar_t * +ACE_OS::wcsrchr_emulation (wchar_t *s, wint_t c) +{ + wchar_t *p = s + ACE_OS::strlen (s); + + while (*p != static_cast<wchar_t> (c)) + if (p == s) + return 0; + else + p--; + + return p; +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSRCHR */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSSPN) +size_t +ACE_OS::wcsspn_emulation (const wchar_t *string, + const wchar_t *charset) +{ + const wchar_t *p = string; + const wchar_t *spanp; + wchar_t c, sc; + + // Skip any characters in charset, excluding the terminating \0. +cont: + c = *p++; + for (spanp = charset; (sc = *spanp++) != 0;) + if (sc == c) + goto cont; + return (p - 1 - string); +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSSPN */ + +#if defined (ACE_HAS_WCHAR) && defined (ACE_LACKS_WCSSTR) +wchar_t * +ACE_OS::wcsstr_emulation (const wchar_t *string, + const wchar_t *charset) +{ + wchar_t c, sc; + size_t len; + + if ((c = *charset++) != 0) + { + len = ACE_OS::strlen (charset); + do + { + do + { + if ((sc = *string++) == 0) + return 0; + } while (sc != c); + } while (ACE_OS::strncmp (string, charset, len) != 0); + string--; + } + + return const_cast<wchar_t *> (string); +} +#endif /* ACE_HAS_WCHAR && ACE_LACKS_WCSSTR */ + +ACE_END_VERSIONED_NAMESPACE_DECL |