FreeBASIC  0.91.0
str_rtrimex.c
Go to the documentation of this file.
1 /* enhanced rtrim$ function */
2 
3 #include "fb.h"
4 
6 {
7  FBSTRING *dst;
8  ssize_t len;
9 
10  if( src == NULL )
11  {
12  fb_hStrDelTemp( pattern );
13  return &__fb_ctx.null_desc;
14  }
15 
16  FB_STRLOCK();
17 
18  if( src->data != NULL )
19  {
20  ssize_t len_pattern = ((pattern != NULL) && (pattern->data != NULL)? FB_STRSIZE( pattern ) : 0);
21  len = FB_STRSIZE( src );
22  if( len >= len_pattern )
23  {
24  if( len_pattern==1 )
25  {
26  char *src_ptr = fb_hStrSkipCharRev( src->data,
27  len,
28  FB_CHAR_TO_INT(pattern->data[0]) );
29  len = (ssize_t)(src_ptr - src->data) + 1;
30  }
31  else if( len_pattern != 0 )
32  {
33  char *src_ptr = src->data;
34  ssize_t test_index = len - len_pattern;
35  while (len >= len_pattern )
36  {
37  if( FB_MEMCMP( src_ptr + test_index,
38  pattern->data,
39  len_pattern )!=0 )
40  break;
41  test_index -= len_pattern;
42  }
43  len = test_index + len_pattern;
44  }
45  }
46  }
47  else
48  len = 0;
49 
50  if( len > 0 )
51  {
52  /* alloc temp string */
53  dst = fb_hStrAllocTemp_NoLock( NULL, len );
54  if( dst != NULL )
55  {
56  /* simple copy */
57  fb_hStrCopy( dst->data, src->data, len );
58  }
59  else
60  dst = &__fb_ctx.null_desc;
61  }
62  else
63  dst = &__fb_ctx.null_desc;
64 
65  /* del if temp */
66  fb_hStrDelTemp_NoLock( src );
67  fb_hStrDelTemp_NoLock( pattern );
68 
69  FB_STRUNLOCK();
70 
71  return dst;
72 }