/* Editor Settings: expandtabs and use 4 spaces for indentation * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: * * -*- mode: c, c-basic-offset: 4 -*- */ /* * Copyright Likewise Software * All rights reserved. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the license, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy * of the GNU Lesser General Public License along with this program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ #ifndef WCSTR16_H #include #include #ifdef __GNUC__ #define TEXT(str) str #endif /* The WC16STR macro can be used to create wchar16_t string literals on Linux * and Windows. The macro takes a string literal as input. Only one instance * can occur per line. * * At the top of the .c file, after wchar16.h has been included, but before any * wchar16_t string literals are used, WC16STR_INSERT must occur on a line by * itself. * * Here is an example usage: #include WC16STR_INSERT int main() { fw16printf(stdout, WC16STR("%ws\n"), WC16STR("sample string")); return 0; } */ #ifdef _WIN32 #define WC16STR(x) L##x #else #define _WC16STR3(x) gwsz ## x #define _WC16STR2(x) _WC16STR3(x) #define WC16STR(x) _WC16STR2(__LINE__) #endif #define WC16STR_INSERT #ifdef _WIN32 #define snprintf(dest, count, ...) _snprintf(dest, count, __VA_ARGS__) #endif LIBUNISTR_API unsigned long long _wc16stoull( const wchar16_t *input, const wchar16_t **end, int base ); #ifdef WCHAR16_IS_WCHAR #define wc16stoull(input, end, base) _wcstoui64(input, (wchar_t**)end, base) #else #define wc16stoull(input, end, base) _wc16stoull(input, end, base) #endif #ifdef WCHAR16_IS_WCHAR #define _w16toi(str) _wtoi(str) #else #define _w16toi(str) (int)wc16stoull((str), NULL, 10) #endif LIBUNISTR_API size_t _wc16slen(const wchar16_t *str); #ifdef __GNUC__ #define wc16slen(str) _wc16slen(str) #elif _WIN32 #define wc16slen(str) wcslen(str) #endif LIBUNISTR_API size_t _wc16snlen(const wchar16_t *str, size_t n); #ifdef WCHAR16_IS_WCHAR #define wc16snlen(str, n) wcsnlen(str, n) #else #define wc16snlen(str, n) _wc16snlen(str, n) #endif LIBUNISTR_API wchar16_t *_wc16scpy(wchar16_t *dst, const wchar16_t *src); #ifdef __GNUC__ #define wc16scpy(dst, src) _wc16scpy(dst, src); #elif _WIN32 #define wc16scpy(dst, src) wcscpy(dst, src); #endif LIBUNISTR_API wchar16_t* _wc16sdup(const wchar16_t *str); #ifdef __GNUC__ #define wc16sdup(str) _wc16sdup(str) #elif _WIN32 #define wc16sdup(str) _wcsdup(str) #endif LIBUNISTR_API wchar16_t* _wc16sndup(const wchar16_t *str, size_t max_characters); #define wc16sdupn(str, max_characters) _wc16sndup(str, max_characters) #define wc16sndup(str, max_characters) _wc16sndup(str, max_characters) LIBUNISTR_API wchar16_t* _wc16sncpy(wchar16_t *dest, const wchar16_t *src, size_t n); #ifdef WCHAR16_IS_WCHAR #define wc16sncpy(dest, src, n) wcsncpy(dest, src, n) #else #define wc16sncpy(dest, src, n) _wc16sncpy(dest, src, n) #endif LIBUNISTR_API wchar16_t* _w16memcpy(wchar16_t *dest, const wchar16_t *src, size_t n); #ifdef WCHAR16_IS_WCHAR #define w16memcpy(dest, src, n) wmemcpy(dest, src, n) #else #define w16memcpy(dest, src, n) _w16memcpy(dest, src, n) #endif LIBUNISTR_API wchar16_t* _w16memset(wchar16_t *dest, wchar16_t fill, size_t n); #ifdef WCHAR16_IS_WCHAR #define w16memset(dest, fill, n) wmemset(dest, fill, n) #else #define w16memset(dest, fill, n) _w16memset(dest, fill, n) #endif /* Copy upto n 16bit characters from one string to another * * n is the maximum number of characters to store in dest (including null). */ LIBUNISTR_API wchar16_t* _wc16pncpy(wchar16_t *dest, const wchar16_t *src, size_t n); #define wc16pncpy(dest, src, n) _wc16pncpy(dest, src, n) LIBUNISTR_API int wc16scasecmp(const wchar16_t *s1, const wchar16_t *s2); LIBUNISTR_API int wc16scmp(const wchar16_t *s1, const wchar16_t *s2); LIBUNISTR_API int wc16sncmp(const wchar16_t *s1, const wchar16_t *s2, size_t n); #ifndef HAVE_MBSTRLEN #ifdef _WIN32 #define mbstrlen(x) _mbstrlen(x) #else #define mbstrlen(x) mbstowcs(NULL, (x), 0) #endif #endif /* Returns the number of bytes in src that form the next cchFind multi-byte * characters. * * If fewer than cchFind characters are in src, then the size of the rest of * the string in bytes is returned. * * Basically this converts from a count of multi-byte characters into a count * of bytes. */ LIBUNISTR_API size_t __mbsnbcnt(const char *src, size_t cchFind); #ifndef HAVE_MBSNBCNT #ifdef _WIN32 #define mbsnbcnt(src, cchFind) _mbsnbcnt(src, cchFind) #else #define mbsnbcnt(src, cchFind) __mbsnbcnt(src, cchFind) #endif #endif /*Optimistically try to wc16sncpy() * * Returns the length of dest needed for a successful copy including * the NUL character. If the copy was complete, the value will be * <= wc16slen(src) + 1 */ LIBUNISTR_API size_t wc16oncpy(wchar16_t *dest, const wchar16_t *src, size_t n); /*Convert a wchar_t string to a wchar16_t string and return the result. * * If the result needs to be freed, *free_required will be set to 1. */ LIBUNISTR_API wchar16_t * awcstowc16s(const wchar_t *input, int *free_required); /*Convert a wchar_t string to a wchar16_t string and return the number of characters converted. * * cchn is the maximum number of characters to store in dest (including null). */ LIBUNISTR_API size_t wcstowc16s(wchar16_t *dest, const wchar_t *src, size_t cchn); /*Convert a wchar16_t string to a wchar_t string and return the result. * * If the result needs to be freed, *free_required will be set to 1. */ LIBUNISTR_API wchar_t * awc16stowcs(const wchar16_t *input, int *free_required); /*Convert a wchar16_t string to a wchar_t string and return the number of characters converted. * * cchn is the maximum number of characters to store in dest (including null). */ LIBUNISTR_API size_t wc16stowcs(wchar_t *dest, const wchar16_t *src, size_t cchn); /* Convert a wchar16_t string to a wchar16_t string in little-endian byte order */ LIBUNISTR_API size_t wc16stowc16les(wchar16_t *dest, const wchar16_t *src, size_t cchcopy); /* Convert a wchar16_t string in little-endian byte order to a wchar16_t string */ LIBUNISTR_API size_t wc16lestowc16s(wchar16_t *dest, const wchar16_t *src, size_t cchcopy); /*Convert a multibyte character string to a wchar16_t string and return the result. */ LIBUNISTR_API wchar16_t * ambstowc16s(const char *input); /*Convert a multibyte character string to a wchar16_t string and return the number of characters converted. * * cchn is the maximum number of characters to store in dest (including null). */ LIBUNISTR_API size_t mbstowc16s(wchar16_t *dest, const char *src, size_t cchn); /*Convert a multibyte character string to a little endian wchar16_t string and return the number of characters converted. * * cchn is the maximum number of characters to store in dest (including null). */ LIBUNISTR_API size_t mbstowc16les(wchar16_t *dest, const char *src, size_t cchn); /*Convert a wchar16_t string to a multibyte character string and return the result. */ LIBUNISTR_API char * awc16stombs(const wchar16_t *input); /*Convert a wchar16_t string to a multicharacter string and return the number of characters converted. * * cbn is the maximum number of bytes to store in dest (including null). */ LIBUNISTR_API size_t wc16stombs(char *dest, const wchar16_t *src, size_t cbn); /* Convert a wchar16_t string to upper case */ LIBUNISTR_API void wc16supper(wchar16_t *s); /* Convert a wchar16_t string to lower case */ LIBUNISTR_API void wc16slower(wchar16_t *s); /* Convert a single-byte string to upper case */ LIBUNISTR_API void strlower(char *s); /* Convert a single-byte string to lower case */ LIBUNISTR_API void strupper(char *s); LIBUNISTR_API void printwc16s(const wchar16_t* pwszPrint); #ifdef _WIN32 #define strcasecmp(a, b) stricmp(a, b) #endif #endif /* WCSTR16_H */ /* local variables: mode: c c-basic-offset: 4 indent-tabs-mode: nil tab-width: 4 end: */