FreeBASIC  0.91.0
str_concatassign.c
Go to the documentation of this file.
1 /* string concat and assigning (s = s + expr) function */
2 
3 #include "fb.h"
4 
6  (
7  void *dst,
8  ssize_t dst_size,
9  void *src,
10  ssize_t src_size,
11  int fillrem
12  )
13 {
14  FBSTRING *dstr;
15  const char *src_ptr;
16  ssize_t src_len, dst_len;
17 
18  if( dst == NULL )
19  {
20  /* delete temp? */
21  if( src_size == -1 )
22  fb_hStrDelTemp( (FBSTRING *)src );
23 
24  return dst;
25  }
26 
27  /* src */
28  FB_STRSETUP_FIX( src, src_size, src_ptr, src_len );
29 
30  /* not NULL? */
31  if( src_len > 0 )
32  {
33  /* is dst var-len? */
34  if( dst_size == -1 )
35  {
36  dstr = (FBSTRING *)dst;
37  dst_len = FB_STRSIZE( dst );
38 
39  fb_hStrRealloc( dstr, dst_len+src_len, FB_TRUE );
40 
41  fb_hStrCopy( &dstr->data[dst_len], src_ptr, src_len );
42  }
43  else
44  {
45  dst_len = strlen( (char *)dst );
46 
47  /* don't check byte ptr's */
48  if( dst_size > 0 )
49  {
50  --dst_size; /* less the null-term */
51 
52  if( src_len > dst_size - dst_len )
53  src_len = dst_size - dst_len;
54  }
55 
56  fb_hStrCopy( &(((char *)dst)[dst_len]), src_ptr, src_len );
57 
58  /* don't check byte ptr's */
59  if( (fillrem != 0) && (dst_size > 0) )
60  {
61  /* fill reminder with null's */
62  dst_size -= (dst_len + src_len);
63  if( dst_size > 0 )
64  memset( &(((char *)dst)[dst_len+src_len]), 0, dst_size );
65  }
66  }
67  }
68 
69 
70  /* delete temp? */
71  if( src_size == -1 )
72  fb_hStrDelTemp( (FBSTRING *)src );
73 
74  return dst;
75 }