Alvaro Herrera wrote:
> Bruce Momjian wrote:
> 
> > I moved str_initcap() over into oracle_compat.c and then had initcap()
> > convert to/from TEXT to call it.  The code is a little weird because
> > str_initcap() needs to convert to text to use texttowcs(), so in
> > multibyte encodings initcap converts the string to text, then to char,
> > then to text to call texttowcs().  I didn't see a cleaner way to do
> > this.
> 
> Why not use wchar2char?  It seems there's room for extra cleanup here.
> 
> Also, the prototype of str_initcap in builtins.h looks out of place.

I talked to Alvaro on IM, and there is certainly much more cleanup to do
in this area. I will work from the bottom up.  First, is moving the
USE_WIDE_UPPER_LOWER define to c.h, and removing TS_USE_WIDE and using
USE_WIDE_UPPER_LOWER instead.  Patch attached and applied.

-- 
  Bruce Momjian  <[EMAIL PROTECTED]>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/tsearch/regis.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tsearch/regis.c,v
retrieving revision 1.4
diff -c -c -r1.4 regis.c
*** src/backend/tsearch/regis.c	21 Jan 2008 02:46:10 -0000	1.4
--- src/backend/tsearch/regis.c	17 Jun 2008 16:06:54 -0000
***************
*** 178,184 ****
  	r->node = NULL;
  }
  
! #ifdef TS_USE_WIDE
  static bool
  mb_strchr(char *str, char *c)
  {
--- 178,184 ----
  	r->node = NULL;
  }
  
! #ifdef USE_WIDE_UPPER_LOWER
  static bool
  mb_strchr(char *str, char *c)
  {
Index: src/backend/tsearch/ts_locale.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tsearch/ts_locale.c,v
retrieving revision 1.7
diff -c -c -r1.7 ts_locale.c
*** src/backend/tsearch/ts_locale.c	1 Jan 2008 19:45:52 -0000	1.7
--- src/backend/tsearch/ts_locale.c	17 Jun 2008 16:06:54 -0000
***************
*** 17,23 ****
  #include "tsearch/ts_public.h"
  
  
! #ifdef TS_USE_WIDE
  
  /*
   * wchar2char --- convert wide characters to multibyte format
--- 17,23 ----
  #include "tsearch/ts_public.h"
  
  
! #ifdef USE_WIDE_UPPER_LOWER
  
  /*
   * wchar2char --- convert wide characters to multibyte format
***************
*** 190,196 ****
  
  	return iswprint((wint_t) character[0]);
  }
! #endif   /* TS_USE_WIDE */
  
  
  /*
--- 190,196 ----
  
  	return iswprint((wint_t) character[0]);
  }
! #endif   /* USE_WIDE_UPPER_LOWER */
  
  
  /*
***************
*** 260,266 ****
  	if (len == 0)
  		return pstrdup("");
  
! #ifdef TS_USE_WIDE
  
  	/*
  	 * Use wide char code only when max encoding length > 1 and ctype != C.
--- 260,266 ----
  	if (len == 0)
  		return pstrdup("");
  
! #ifdef USE_WIDE_UPPER_LOWER
  
  	/*
  	 * Use wide char code only when max encoding length > 1 and ctype != C.
***************
*** 307,313 ****
  		Assert(wlen < len);
  	}
  	else
! #endif   /* TS_USE_WIDE */
  	{
  		const char *ptr = str;
  		char	   *outptr;
--- 307,313 ----
  		Assert(wlen < len);
  	}
  	else
! #endif   /* USE_WIDE_UPPER_LOWER */
  	{
  		const char *ptr = str;
  		char	   *outptr;
Index: src/backend/tsearch/wparser_def.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tsearch/wparser_def.c,v
retrieving revision 1.14
diff -c -c -r1.14 wparser_def.c
*** src/backend/tsearch/wparser_def.c	1 Jan 2008 19:45:52 -0000	1.14
--- src/backend/tsearch/wparser_def.c	17 Jun 2008 16:06:54 -0000
***************
*** 238,244 ****
  	/* string and position information */
  	char	   *str;			/* multibyte string */
  	int			lenstr;			/* length of mbstring */
! #ifdef TS_USE_WIDE
  	wchar_t    *wstr;			/* wide character string */
  	int			lenwstr;		/* length of wsting */
  #endif
--- 238,244 ----
  	/* string and position information */
  	char	   *str;			/* multibyte string */
  	int			lenstr;			/* length of mbstring */
! #ifdef USE_WIDE_UPPER_LOWER
  	wchar_t    *wstr;			/* wide character string */
  	int			lenwstr;		/* length of wsting */
  #endif
***************
*** 291,297 ****
  	prs->str = str;
  	prs->lenstr = len;
  
! #ifdef TS_USE_WIDE
  
  	/*
  	 * Use wide char code only when max encoding length > 1.
--- 291,297 ----
  	prs->str = str;
  	prs->lenstr = len;
  
! #ifdef USE_WIDE_UPPER_LOWER
  
  	/*
  	 * Use wide char code only when max encoding length > 1.
***************
*** 328,334 ****
  		prs->state = ptr;
  	}
  
! #ifdef TS_USE_WIDE
  	if (prs->wstr)
  		pfree(prs->wstr);
  #endif
--- 328,334 ----
  		prs->state = ptr;
  	}
  
! #ifdef USE_WIDE_UPPER_LOWER
  	if (prs->wstr)
  		pfree(prs->wstr);
  #endif
***************
*** 344,350 ****
   * often are used for Asian languages
   */
  
! #ifdef TS_USE_WIDE
  
  #define p_iswhat(type)														\
  static int																	\
--- 344,350 ----
   * often are used for Asian languages
   */
  
! #ifdef USE_WIDE_UPPER_LOWER
  
  #define p_iswhat(type)														\
  static int																	\
***************
*** 439,445 ****
  	Assert(prs->state);
  	return ((prs->state->charlen == 1 && *(prs->str + prs->state->posbyte) == c)) ? 1 : 0;
  }
! #else							/* TS_USE_WIDE */
  
  #define p_iswhat(type)														\
  static int																	\
--- 439,445 ----
  	Assert(prs->state);
  	return ((prs->state->charlen == 1 && *(prs->str + prs->state->posbyte) == c)) ? 1 : 0;
  }
! #else							/* USE_WIDE_UPPER_LOWER */
  
  #define p_iswhat(type)														\
  static int																	\
***************
*** 463,469 ****
  
  p_iswhat(alnum)
  p_iswhat(alpha)
! #endif   /* TS_USE_WIDE */
  
  p_iswhat(digit)
  p_iswhat(lower)
--- 463,469 ----
  
  p_iswhat(alnum)
  p_iswhat(alpha)
! #endif   /* USE_WIDE_UPPER_LOWER */
  
  p_iswhat(digit)
  p_iswhat(lower)
Index: src/backend/utils/adt/formatting.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v
retrieving revision 1.141
diff -c -c -r1.141 formatting.c
*** src/backend/utils/adt/formatting.c	20 May 2008 01:41:02 -0000	1.141
--- src/backend/utils/adt/formatting.c	17 Jun 2008 16:06:54 -0000
***************
*** 948,955 ****
  static NUMCacheEntry *NUM_cache_getnew(char *str);
  static void NUM_cache_remove(NUMCacheEntry *ent);
  
! #if defined(HAVE_WCSTOMBS) && defined(HAVE_TOWLOWER)
! #define USE_WIDE_UPPER_LOWER
  /* externs are in oracle_compat.c */
  extern char *wstring_upper(char *str);
  extern char *wstring_lower(char *str);
--- 948,954 ----
  static NUMCacheEntry *NUM_cache_getnew(char *str);
  static void NUM_cache_remove(NUMCacheEntry *ent);
  
! #ifdef USE_WIDE_UPPER_LOWER
  /* externs are in oracle_compat.c */
  extern char *wstring_upper(char *str);
  extern char *wstring_lower(char *str);
Index: src/backend/utils/adt/oracle_compat.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/oracle_compat.c,v
retrieving revision 1.79
diff -c -c -r1.79 oracle_compat.c
*** src/backend/utils/adt/oracle_compat.c	19 May 2008 18:08:16 -0000	1.79
--- src/backend/utils/adt/oracle_compat.c	17 Jun 2008 16:06:54 -0000
***************
*** 40,51 ****
   * functions, which of course will not work as desired in multibyte character
   * sets.  Note that in either case we are effectively assuming that the
   * database character encoding matches the encoding implied by LC_CTYPE.
-  *
-  * We assume if we have these two functions, we have their friends too, and
-  * can use the wide-character method.
   */
! #if defined(HAVE_WCSTOMBS) && defined(HAVE_TOWLOWER)
! #define USE_WIDE_UPPER_LOWER
  char	   *wstring_lower(char *str);
  char	   *wstring_upper(char *str);
  wchar_t	   *texttowcs(const text *txt);
--- 40,47 ----
   * functions, which of course will not work as desired in multibyte character
   * sets.  Note that in either case we are effectively assuming that the
   * database character encoding matches the encoding implied by LC_CTYPE.
   */
! #ifdef USE_WIDE_UPPER_LOWER
  char	   *wstring_lower(char *str);
  char	   *wstring_upper(char *str);
  wchar_t	   *texttowcs(const text *txt);
Index: src/include/c.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/c.h,v
retrieving revision 1.226
diff -c -c -r1.226 c.h
*** src/include/c.h	21 Apr 2008 00:26:46 -0000	1.226
--- src/include/c.h	17 Jun 2008 16:06:55 -0000
***************
*** 813,818 ****
--- 813,826 ----
  #define HAVE_STRTOULL 1
  #endif
  
+ /*
+  * We assume if we have these two functions, we have their friends too, and
+  * can use the wide-character functions.
+  */
+ #if defined(HAVE_WCSTOMBS) && defined(HAVE_TOWLOWER)
+ #define USE_WIDE_UPPER_LOWER
+ #endif
+    
  /* EXEC_BACKEND defines */
  #ifdef EXEC_BACKEND
  #define NON_EXEC_STATIC
Index: src/include/tsearch/ts_locale.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/tsearch/ts_locale.h,v
retrieving revision 1.5
diff -c -c -r1.5 ts_locale.h
*** src/include/tsearch/ts_locale.h	1 Jan 2008 19:45:59 -0000	1.5
--- src/include/tsearch/ts_locale.h	17 Jun 2008 16:06:55 -0000
***************
*** 29,41 ****
  #include <wctype.h>
  #endif
  
- #if defined(HAVE_WCSTOMBS) && defined(HAVE_TOWLOWER)
- #define TS_USE_WIDE
- #endif
- 
  #define TOUCHAR(x)	(*((const unsigned char *) (x)))
  
! #ifdef TS_USE_WIDE
  
  extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen);
  extern size_t char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen);
--- 29,37 ----
  #include <wctype.h>
  #endif
  
  #define TOUCHAR(x)	(*((const unsigned char *) (x)))
  
! #ifdef USE_WIDE_UPPER_LOWER
  
  extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen);
  extern size_t char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen);
***************
*** 49,55 ****
  #define t_iseq(x,c)		(TOUCHAR(x) == (unsigned char) (c))
  
  #define COPYCHAR(d,s)	memcpy(d, s, pg_mblen(s))
! #else							/* not TS_USE_WIDE */
  
  #define t_isdigit(x)	isdigit(TOUCHAR(x))
  #define t_isspace(x)	isspace(TOUCHAR(x))
--- 45,51 ----
  #define t_iseq(x,c)		(TOUCHAR(x) == (unsigned char) (c))
  
  #define COPYCHAR(d,s)	memcpy(d, s, pg_mblen(s))
! #else							/* not USE_WIDE_UPPER_LOWER */
  
  #define t_isdigit(x)	isdigit(TOUCHAR(x))
  #define t_isspace(x)	isspace(TOUCHAR(x))
***************
*** 58,64 ****
  #define t_iseq(x,c)		(TOUCHAR(x) == (unsigned char) (c))
  
  #define COPYCHAR(d,s)	(*((unsigned char *) (d)) = TOUCHAR(s))
! #endif   /* TS_USE_WIDE */
  
  extern char *lowerstr(const char *str);
  extern char *lowerstr_with_len(const char *str, int len);
--- 54,60 ----
  #define t_iseq(x,c)		(TOUCHAR(x) == (unsigned char) (c))
  
  #define COPYCHAR(d,s)	(*((unsigned char *) (d)) = TOUCHAR(s))
! #endif   /* USE_WIDE_UPPER_LOWER */
  
  extern char *lowerstr(const char *str);
  extern char *lowerstr_with_len(const char *str, int len);
-- 
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

Reply via email to