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