* (currently mule internal code (mic) is used)
* Tatsuo Ishii
*
- * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.75 2008/11/11 03:01:20 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.76 2009/01/04 18:37:35 tgl Exp $
*/
#include "postgres.h"
return (*pg_wchar_table[encoding].mb2wchar_with_len) ((const unsigned char *) from, to, len);
}
-/* returns the byte length of a multibyte word */
+/* returns the byte length of a multibyte character */
int
pg_mblen(const char *mbstr)
{
return ((*pg_wchar_table[DatabaseEncoding->encoding].mblen) ((const unsigned char *) mbstr));
}
-/* returns the display length of a multibyte word */
+/* returns the display length of a multibyte character */
int
pg_dsplen(const char *mbstr)
{
/*
* returns the byte length of a multibyte string
- * (not necessarily NULL terminated)
+ * (not necessarily NULL terminated)
* that is no longer than limit.
- * this function does not break multibyte word boundary.
+ * this function does not break multibyte character boundary.
*/
int
pg_mbcliplen(const char *mbstr, int len, int limit)
{
+ return pg_encoding_mbcliplen(DatabaseEncoding->encoding, mbstr,
+ len, limit);
+}
+
+/*
+ * pg_mbcliplen with specified encoding
+ */
+int
+pg_encoding_mbcliplen(int encoding, const char *mbstr,
+ int len, int limit)
+{
+ mblen_converter mblen_fn;
int clen = 0;
int l;
/* optimization for single byte encoding */
- if (pg_database_encoding_max_length() == 1)
+ if (pg_encoding_max_length(encoding) == 1)
return cliplen(mbstr, len, limit);
+ mblen_fn = pg_wchar_table[encoding].mblen;
+
while (len > 0 && *mbstr)
{
- l = pg_mblen(mbstr);
+ l = (*mblen_fn) ((const unsigned char *) mbstr);
if ((clen + l) > limit)
break;
clen += l;
/*
* Similar to pg_mbcliplen except the limit parameter specifies the
- * character length, not the byte length. */
+ * character length, not the byte length.
+ */
int
pg_mbcharcliplen(const char *mbstr, int len, int limit)
{
return clen;
}
+/* mbcliplen for any single-byte encoding */
+static int
+cliplen(const char *str, int len, int limit)
+{
+ int l = 0;
+
+ len = Min(len, limit);
+ while (l < len && str[l])
+ l++;
+ return l;
+}
+
void
SetDatabaseEncoding(int encoding)
{
Assert(ClientEncoding);
return DirectFunctionCall1(namein, CStringGetDatum(ClientEncoding->name));
}
-
-static int
-cliplen(const char *str, int len, int limit)
-{
- int l = 0;
- const char *s;
-
- for (s = str; *s; s++, l++)
- {
- if (l >= len || l >= limit)
- return l;
- }
- return (s - str);
-}
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.81 2009/01/01 17:23:59 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.82 2009/01/04 18:37:36 tgl Exp $
*
* NOTES
* This is used both by the backend and by libpq, but should not be
extern int pg_mbstrlen(const char *mbstr);
extern int pg_mbstrlen_with_len(const char *mbstr, int len);
extern int pg_mbcliplen(const char *mbstr, int len, int limit);
+extern int pg_encoding_mbcliplen(int encoding, const char *mbstr,
+ int len, int limit);
extern int pg_mbcharcliplen(const char *mbstr, int len, int imit);
extern int pg_encoding_max_length(int encoding);
extern int pg_database_encoding_max_length(void);