Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3e90401

Browse files
committed
*** empty log message ***
1 parent 91778e8 commit 3e90401

File tree

1 file changed

+145
-4
lines changed

1 file changed

+145
-4
lines changed

src/backend/utils/adt/oracle_compat.c

+145-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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

@@ -11,6 +11,9 @@
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;
305308
int m;
306309

310+
#ifdef MULTIBYTE
311+
char **mp;
312+
int mplen;
313+
char *p;
314+
int mblen;
315+
int len;
316+
#endif
317+
307318
if ((m = VARSIZE(string) - VARHDRSZ) <= 0 ||
308319
(VARSIZE(set) - VARHDRSZ) <= 0)
309320
PG_RETURN_TEXT_P(string);
310321

311322
ptr = 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
312340
end = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
341+
#endif
313342
end2 = 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
315386
while (m > 0)
316387
{
317388
ptr2 = VARDATA(set);
@@ -341,7 +412,7 @@ btrim(PG_FUNCTION_ARGS)
341412
end--;
342413
m--;
343414
}
344-
415+
#endif
345416
ret = (text *) palloc(VARHDRSZ + m);
346417
VARATT_SIZEP(ret) = VARHDRSZ + m;
347418
memcpy(VARDATA(ret), ptr, m);
@@ -455,6 +526,26 @@ ltrim(PG_FUNCTION_ARGS)
455526
ptr = VARDATA(string);
456527
end2 = 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
458549
while (m > 0)
459550
{
460551
ptr2 = VARDATA(set);
@@ -469,7 +560,7 @@ ltrim(PG_FUNCTION_ARGS)
469560
ptr++;
470561
m--;
471562
}
472-
563+
#endif
473564
ret = (text *) palloc(VARHDRSZ + m);
474565
VARATT_SIZEP(ret) = VARHDRSZ + m;
475566
memcpy(VARDATA(ret), ptr, m);
@@ -499,20 +590,70 @@ rtrim(PG_FUNCTION_ARGS)
499590
text *string = PG_GETARG_TEXT_P(0);
500591
text *set = PG_GETARG_TEXT_P(1);
501592
text *ret;
593+
502594
char *ptr,
503595
*end,
504596
*ptr2,
505597
*end2;
506598
int m;
507599

600+
#ifdef MULTIBYTE
601+
char **mp;
602+
int mplen;
603+
char *p;
604+
int mblen;
605+
int len;
606+
#endif
607+
508608
if ((m = VARSIZE(string) - VARHDRSZ) <= 0 ||
509609
(VARSIZE(set) - VARHDRSZ) <= 0)
510610
PG_RETURN_TEXT_P(string);
511611

512612
ptr = 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
513630
end = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
631+
#endif
514632
end2 = 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
516657
while (m > 0)
517658
{
518659
ptr2 = VARDATA(set);
@@ -527,7 +668,7 @@ rtrim(PG_FUNCTION_ARGS)
527668
end--;
528669
m--;
529670
}
530-
671+
#endif
531672
ret = (text *) palloc(VARHDRSZ + m);
532673
VARATT_SIZEP(ret) = VARHDRSZ + m;
533674
memcpy(VARDATA(ret), ptr, m);

0 commit comments

Comments
 (0)