summaryrefslogtreecommitdiff
path: root/contrib/tsearch2/ts_locale.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tsearch2/ts_locale.c')
-rw-r--r--contrib/tsearch2/ts_locale.c191
1 files changed, 0 insertions, 191 deletions
diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c
deleted file mode 100644
index cb022d7e2a4..00000000000
--- a/contrib/tsearch2/ts_locale.c
+++ /dev/null
@@ -1,191 +0,0 @@
-#include "ts_locale.h"
-
-#include "utils/builtins.h"
-#include "utils/pg_locale.h"
-#include "mb/pg_wchar.h"
-
-
-#ifdef TS_USE_WIDE
-
-#ifdef WIN32
-
-size_t
-wchar2char(char *to, const wchar_t *from, size_t len)
-{
- if (len == 0)
- return 0;
-
- if (GetDatabaseEncoding() == PG_UTF8)
- {
- int r;
-
- r = WideCharToMultiByte(CP_UTF8, 0, from, -1, to, len,
- NULL, NULL);
-
- if (r == 0)
- ereport(ERROR,
- (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
- errmsg("UTF-16 to UTF-8 translation failed: %lu",
- GetLastError())));
- Assert(r <= len);
-
- return r;
- }
-
- return wcstombs(to, from, len);
-}
-#endif /* WIN32 */
-
-size_t
-char2wchar(wchar_t *to, const char *from, size_t len)
-{
- if (len == 0)
- return 0;
-
-#ifdef WIN32
- if (GetDatabaseEncoding() == PG_UTF8)
- {
- int r;
-
- r = MultiByteToWideChar(CP_UTF8, 0, from, len, to, len);
-
- if (!r)
- {
- pg_verifymbstr(from, strlen(from), false);
- ereport(ERROR,
- (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
- errmsg("invalid multibyte character for locale"),
- errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
- }
-
- Assert(r <= len);
-
- return r;
- }
- else
-#endif /* WIN32 */
- if ( lc_ctype_is_c() )
- {
- /*
- * pg_mb2wchar_with_len always adds trailing '\0', so
- * 'to' should be allocated with sufficient space
- */
- return pg_mb2wchar_with_len(from, (pg_wchar *)to, len);
- }
-
- return mbstowcs(to, from, len);
-}
-
-int
-_t_isalpha(const char *ptr)
-{
- wchar_t character[2];
-
- if (lc_ctype_is_c())
- return isalpha(TOUCHAR(ptr));
-
- char2wchar(character, ptr, 1);
-
- return iswalpha((wint_t) *character);
-}
-
-int
-_t_isprint(const char *ptr)
-{
- wchar_t character[2];
-
- if (lc_ctype_is_c())
- return isprint(TOUCHAR(ptr));
-
- char2wchar(character, ptr, 1);
-
- return iswprint((wint_t) *character);
-}
-#endif /* TS_USE_WIDE */
-
-char *
-lowerstr(char *str)
-{
- char *ptr = str;
- char *out;
- int len = strlen(str);
-
- if ( len == 0 )
- return pstrdup("");
-
-#ifdef TS_USE_WIDE
-
- /*
- * Use wide char code only when max encoding length > 1 and ctype != C.
- * Some operating systems fail with multi-byte encodings and a C locale.
- * Also, for a C locale there is no need to process as multibyte. From
- * backend/utils/adt/oracle_compat.c Teodor
- */
- if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c())
- {
- wchar_t *wstr,
- *wptr;
- int wlen;
-
- /*
- *alloc number of wchar_t for worst case, len contains
- * number of bytes <= number of characters and
- * alloc 1 wchar_t for 0, because wchar2char(wcstombs in really)
- * wants zero-terminated string
- */
- wptr = wstr = (wchar_t *) palloc(sizeof(wchar_t) * (len+1));
-
- /*
- * str SHOULD be cstring, so wlen contains number
- * of converted character
- */
- wlen = char2wchar(wstr, str, len);
- if ( wlen < 0 )
- ereport(ERROR,
- (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
- errmsg("translation failed from server encoding to wchar_t")));
-
- Assert(wlen<=len);
- wstr[wlen] = 0;
-
- while (*wptr)
- {
- *wptr = towlower((wint_t) *wptr);
- wptr++;
- }
-
- /*
- * Alloc result string for worst case + '\0'
- */
- len = sizeof(char)*pg_database_encoding_max_length()*(wlen+1);
- out = (char*)palloc(len);
-
- /*
- * wlen now is number of bytes which is always >= number of characters
- */
- wlen = wchar2char(out, wstr, len);
- pfree(wstr);
-
- if ( wlen < 0 )
- ereport(ERROR,
- (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
- errmsg("translation failed from wchar_t to server encoding %d", errno)));
- Assert(wlen<=len);
- out[wlen]='\0';
- }
- else
-#endif
- {
- char *outptr;
-
- outptr = out = (char*)palloc( sizeof(char) * (len+1) );
- while (*ptr)
- {
- *outptr++ = tolower(*(unsigned char *) ptr);
- ptr++;
- }
- *outptr = '\0';
- }
-
- return out;
-}