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

Lines changed: 145 additions & 4 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy