1
1
/*
2
2
* Edmund Mergl <E.Mergl@bawue.de>
3
3
*
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 $
5
5
*
6
6
*/
7
7
11
11
12
12
#include "utils/builtins.h"
13
13
14
+ #ifdef MULTIBYTE
15
+ #include "mb/pg_wchar.h"
16
+ #endif
14
17
15
18
/********************************************************************
16
19
*
@@ -304,14 +307,82 @@ btrim(PG_FUNCTION_ARGS)
304
307
* end2 ;
305
308
int m ;
306
309
310
+ #ifdef MULTIBYTE
311
+ char * * mp ;
312
+ int mplen ;
313
+ char * p ;
314
+ int mblen ;
315
+ int len ;
316
+ #endif
317
+
307
318
if ((m = VARSIZE (string ) - VARHDRSZ ) <= 0 ||
308
319
(VARSIZE (set ) - VARHDRSZ ) <= 0 )
309
320
PG_RETURN_TEXT_P (string );
310
321
311
322
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
312
340
end = VARDATA (string ) + VARSIZE (string ) - VARHDRSZ - 1 ;
341
+ #endif
313
342
end2 = VARDATA (set ) + VARSIZE (set ) - VARHDRSZ - 1 ;
314
343
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
315
386
while (m > 0 )
316
387
{
317
388
ptr2 = VARDATA (set );
@@ -341,7 +412,7 @@ btrim(PG_FUNCTION_ARGS)
341
412
end -- ;
342
413
m -- ;
343
414
}
344
-
415
+ #endif
345
416
ret = (text * ) palloc (VARHDRSZ + m );
346
417
VARATT_SIZEP (ret ) = VARHDRSZ + m ;
347
418
memcpy (VARDATA (ret ), ptr , m );
@@ -455,6 +526,26 @@ ltrim(PG_FUNCTION_ARGS)
455
526
ptr = VARDATA (string );
456
527
end2 = VARDATA (set ) + VARSIZE (set ) - VARHDRSZ - 1 ;
457
528
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
458
549
while (m > 0 )
459
550
{
460
551
ptr2 = VARDATA (set );
@@ -469,7 +560,7 @@ ltrim(PG_FUNCTION_ARGS)
469
560
ptr ++ ;
470
561
m -- ;
471
562
}
472
-
563
+ #endif
473
564
ret = (text * ) palloc (VARHDRSZ + m );
474
565
VARATT_SIZEP (ret ) = VARHDRSZ + m ;
475
566
memcpy (VARDATA (ret ), ptr , m );
@@ -499,20 +590,70 @@ rtrim(PG_FUNCTION_ARGS)
499
590
text * string = PG_GETARG_TEXT_P (0 );
500
591
text * set = PG_GETARG_TEXT_P (1 );
501
592
text * ret ;
593
+
502
594
char * ptr ,
503
595
* end ,
504
596
* ptr2 ,
505
597
* end2 ;
506
598
int m ;
507
599
600
+ #ifdef MULTIBYTE
601
+ char * * mp ;
602
+ int mplen ;
603
+ char * p ;
604
+ int mblen ;
605
+ int len ;
606
+ #endif
607
+
508
608
if ((m = VARSIZE (string ) - VARHDRSZ ) <= 0 ||
509
609
(VARSIZE (set ) - VARHDRSZ ) <= 0 )
510
610
PG_RETURN_TEXT_P (string );
511
611
512
612
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
513
630
end = VARDATA (string ) + VARSIZE (string ) - VARHDRSZ - 1 ;
631
+ #endif
514
632
end2 = VARDATA (set ) + VARSIZE (set ) - VARHDRSZ - 1 ;
515
633
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
516
657
while (m > 0 )
517
658
{
518
659
ptr2 = VARDATA (set );
@@ -527,7 +668,7 @@ rtrim(PG_FUNCTION_ARGS)
527
668
end -- ;
528
669
m -- ;
529
670
}
530
-
671
+ #endif
531
672
ret = (text * ) palloc (VARHDRSZ + m );
532
673
VARATT_SIZEP (ret ) = VARHDRSZ + m ;
533
674
memcpy (VARDATA (ret ), ptr , m );
0 commit comments