11/*
22 *Edmund Mergl <E.Mergl@bawue.de>
33 *
4- *$Header: /cvsroot/pgsql/src/backend/utils/adt/oracle_compat.c,v 1.32 2001/09/14 17:46:40 momjian Exp $
4+ *$Header: /cvsroot/pgsql/src/backend/utils/adt/oracle_compat.c,v 1.33 2001/09/22 03:26:30 ishii Exp $
55 *
66 */
77
1111
1212#include "utils/builtins.h"
1313
14+ #ifdef MULTIBYTE
15+ #include "mb/pg_wchar.h"
16+ #endif
1417
1518/********************************************************************
1619 *
@@ -304,14 +307,82 @@ btrim(PG_FUNCTION_ARGS)
304307* end2 ;
305308int m ;
306309
310+ #ifdef MULTIBYTE
311+ char * * mp ;
312+ int mplen ;
313+ char * p ;
314+ int mblen ;
315+ int len ;
316+ #endif
317+
307318if ((m = VARSIZE (string )- VARHDRSZ ) <=0 ||
308319(VARSIZE (set )- VARHDRSZ ) <=0 )
309320PG_RETURN_TEXT_P (string );
310321
311322ptr = VARDATA (string );
323+
324+ #ifdef MULTIBYTE
325+ len = m ;
326+ mp = (char * * )palloc (len * sizeof (char * ));
327+ p = ptr ;
328+ mplen = 0 ;
329+
330+ /* build the mb pointer array */
331+ while (len > 0 )
332+ {
333+ mp [mplen ++ ]= p ;
334+ mblen = pg_mblen (p );
335+ p += mblen ;
336+ len -= mblen ;
337+ }
338+ mplen -- ;
339+ #else
312340end = VARDATA (string )+ VARSIZE (string )- VARHDRSZ - 1 ;
341+ #endif
313342end2 = VARDATA (set )+ VARSIZE (set )- VARHDRSZ - 1 ;
314343
344+ #ifdef MULTIBYTE
345+ while (m > 0 )
346+ {
347+ int str_len = pg_mblen (ptr );
348+ ptr2 = VARDATA (set );
349+ while (ptr2 <=end2 )
350+ {
351+ int set_len = pg_mblen (ptr2 );
352+
353+ if (str_len == set_len &&
354+ memcmp (ptr ,ptr2 ,str_len )== 0 )
355+ break ;
356+ ptr2 += set_len ;
357+ }
358+ if (ptr2 > end2 )
359+ break ;
360+ ptr += str_len ;
361+ m -= str_len ;
362+ }
363+
364+ while (m > 0 )
365+ {
366+ int str_len ;
367+ end = mp [mplen -- ];
368+ str_len = pg_mblen (end );
369+ ptr2 = VARDATA (set );
370+ while (ptr2 <=end2 )
371+ {
372+ int set_len = pg_mblen (ptr2 );
373+
374+ if (str_len == set_len &&
375+ memcmp (end ,ptr2 ,str_len )== 0 )
376+ break ;
377+ ptr2 += set_len ;
378+ }
379+ if (ptr2 > end2 )
380+ break ;
381+ m -= str_len ;
382+ }
383+ pfree (mp );
384+
385+ #else
315386while (m > 0 )
316387{
317388ptr2 = VARDATA (set );
@@ -341,7 +412,7 @@ btrim(PG_FUNCTION_ARGS)
341412end -- ;
342413m -- ;
343414}
344-
415+ #endif
345416ret = (text * )palloc (VARHDRSZ + m );
346417VARATT_SIZEP (ret )= VARHDRSZ + m ;
347418memcpy (VARDATA (ret ),ptr ,m );
@@ -455,6 +526,26 @@ ltrim(PG_FUNCTION_ARGS)
455526ptr = VARDATA (string );
456527end2 = VARDATA (set )+ VARSIZE (set )- VARHDRSZ - 1 ;
457528
529+ #ifdef MULTIBYTE
530+ while (m > 0 )
531+ {
532+ int str_len = pg_mblen (ptr );
533+ ptr2 = VARDATA (set );
534+ while (ptr2 <=end2 )
535+ {
536+ int set_len = pg_mblen (ptr2 );
537+
538+ if (str_len == set_len &&
539+ memcmp (ptr ,ptr2 ,str_len )== 0 )
540+ break ;
541+ ptr2 += set_len ;
542+ }
543+ if (ptr2 > end2 )
544+ break ;
545+ ptr += str_len ;
546+ m -= str_len ;
547+ }
548+ #else
458549while (m > 0 )
459550{
460551ptr2 = VARDATA (set );
@@ -469,7 +560,7 @@ ltrim(PG_FUNCTION_ARGS)
469560ptr ++ ;
470561m -- ;
471562}
472-
563+ #endif
473564ret = (text * )palloc (VARHDRSZ + m );
474565VARATT_SIZEP (ret )= VARHDRSZ + m ;
475566memcpy (VARDATA (ret ),ptr ,m );
@@ -499,20 +590,70 @@ rtrim(PG_FUNCTION_ARGS)
499590text * string = PG_GETARG_TEXT_P (0 );
500591text * set = PG_GETARG_TEXT_P (1 );
501592text * ret ;
593+
502594char * ptr ,
503595* end ,
504596* ptr2 ,
505597* end2 ;
506598int m ;
507599
600+ #ifdef MULTIBYTE
601+ char * * mp ;
602+ int mplen ;
603+ char * p ;
604+ int mblen ;
605+ int len ;
606+ #endif
607+
508608if ((m = VARSIZE (string )- VARHDRSZ ) <=0 ||
509609(VARSIZE (set )- VARHDRSZ ) <=0 )
510610PG_RETURN_TEXT_P (string );
511611
512612ptr = VARDATA (string );
613+
614+ #ifdef MULTIBYTE
615+ len = m ;
616+ mp = (char * * )palloc (len * sizeof (char * ));
617+ p = ptr ;
618+ mplen = 0 ;
619+
620+ /* build the mb pointer array */
621+ while (len > 0 )
622+ {
623+ mp [mplen ++ ]= p ;
624+ mblen = pg_mblen (p );
625+ p += mblen ;
626+ len -= mblen ;
627+ }
628+ mplen -- ;
629+ #else
513630end = VARDATA (string )+ VARSIZE (string )- VARHDRSZ - 1 ;
631+ #endif
514632end2 = VARDATA (set )+ VARSIZE (set )- VARHDRSZ - 1 ;
515633
634+ #ifdef MULTIBYTE
635+ while (m > 0 )
636+ {
637+ int str_len ;
638+ end = mp [mplen -- ];
639+ str_len = pg_mblen (end );
640+ ptr2 = VARDATA (set );
641+ while (ptr2 <=end2 )
642+ {
643+ int set_len = pg_mblen (ptr2 );
644+
645+ if (str_len == set_len &&
646+ memcmp (end ,ptr2 ,str_len )== 0 )
647+ break ;
648+ ptr2 += set_len ;
649+ }
650+ if (ptr2 > end2 )
651+ break ;
652+ m -= str_len ;
653+ }
654+ pfree (mp );
655+
656+ #else
516657while (m > 0 )
517658{
518659ptr2 = VARDATA (set );
@@ -527,7 +668,7 @@ rtrim(PG_FUNCTION_ARGS)
527668end -- ;
528669m -- ;
529670}
530-
671+ #endif
531672ret = (text * )palloc (VARHDRSZ + m );
532673VARATT_SIZEP (ret )= VARHDRSZ + m ;
533674memcpy (VARDATA (ret ),ptr ,m );