FreeBASIC  0.91.0
dstr.bas
Go to the documentation of this file.
1 '' dynamic zstring helpers
2 ''
3 ''
4 
5 
6 #include once "fb.bi"
7 #include once "fbint.bi"
8 #include once "dstr.bi"
9 
10 declare sub hRealloc _
11  ( _
12  byval s as DSTRING ptr, _
13  byval chars as integer, _
14  byval charsize as integer, _
15  byval dopreserve as integer _
16  )
17 
18 
19 '':::::
20 #macro ALLOC_SETUP(dst, chars, _type)
21  if( chars = 0 ) then
22  if( dst.data <> NULL ) then
23  deallocate( dst.data )
24  dst.data = NULL
25  dst.len = 0
26  dst.size = 0
27  end if
28  exit sub
29  end if
30 
31  if( dst.len <> chars ) then
32  hRealloc( cast( DSTRING ptr, @dst ), _
33  chars, _
34  len( _type ), _
35  FALSE )
36  end if
37 #endmacro
38 
39 '':::::
40 #macro REALLOC_SETUP(dst, chars, _type)
41  if( chars = 0 ) then
42  exit sub
43  end if
44 
45  hRealloc( cast( DSTRING ptr, @dst ), _
46  dst.len + chars, _
47  len( _type ), _
48  TRUE )
49 #endmacro
50 
51 '':::::
52 #define CALC_LEN( p ) iif( p <> NULL, len( *src ), 0 )
53 
54 ''::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
55 '' dynamic zstrings
56 ''::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
57 
58 '':::::
59 sub DZstrZero _
60  ( _
61  byref dst as DZSTRING _
62  )
63 
64  dst.data = NULL
65  dst.len = 0
66  dst.size = 0
67 
68 end sub
69 
70 '':::::
71 sub DZstrAllocate _
72  ( _
73  byref dst as DZSTRING, _
74  byval chars as integer _
75  )
76 
77  ALLOC_SETUP( dst, chars, zstring )
78 
79 end sub
80 
81 '':::::
82 sub DZstrReset _
83  ( _
84  byref dst as DZSTRING _
85  )
86 
87  if( dst.data <> NULL ) then
88  *dst.data = 0
89  end if
90 
91  dst.len = 0
92 
93 end sub
94 
95 '':::::
96 sub DZstrAssign _
97  ( _
98  byref dst as DZSTRING, _
99  byval src as zstring ptr _
100  )
101 
102  dim as integer src_len = CALC_LEN( src )
103 
104  ALLOC_SETUP( dst, src_len, zstring )
105 
106  if( dst.data <> NULL ) then
107  *dst.data = *src
108  end if
109 
110 end sub
111 
112 '':::::
113 sub DZstrAssignW _
114  ( _
115  byref dst as DZSTRING, _
116  byval src as wstring ptr _
117  )
118 
119  dim as integer src_len = CALC_LEN( src )
120 
121  ALLOC_SETUP( dst, src_len, zstring )
122 
123  if( dst.data <> NULL ) then
124  *dst.data = *src
125  end if
126 
127 end sub
128 
129 '':::::
130 sub DZstrAssignC _
131  ( _
132  byref dst as DZSTRING, _
133  byval src as uinteger _
134  )
135 
136  dim as integer src_len = len( zstring )
137 
138  ALLOC_SETUP( dst, src_len, zstring )
139 
140  if( dst.data <> NULL ) then
141  dst.data[0] = src
142  dst.data[1] = 0
143  end if
144 
145 end sub
146 
147 '':::::
148 sub DZstrConcatAssign _
149  ( _
150  byref dst as DZSTRING, _
151  byval src as zstring ptr _
152  )
153 
154  dim as integer src_len = CALC_LEN( src )
155  dim as integer dst_len = dst.len
156 
157  REALLOC_SETUP( dst, src_len, zstring )
158 
159  if( dst.data <> NULL ) then
160  *(dst.data + dst_len) = *src
161  end if
162 
163 end sub
164 
165 '':::::
166 sub DZstrConcatAssignW _
167  ( _
168  byref dst as DZSTRING, _
169  byval src as wstring ptr _
170  )
171 
172  dim as integer src_len = CALC_LEN( src )
173  dim as integer dst_len = dst.len
174 
175  REALLOC_SETUP( dst, src_len, zstring )
176 
177  if( dst.data <> NULL ) then
178  *(dst.data + dst_len) = *src
179  end if
180 
181 end sub
182 
183 '':::::
184 sub DZstrConcatAssignC _
185  ( _
186  byref dst as DZSTRING, _
187  byval src as uinteger _
188  )
189 
190  dim as integer src_len = len( zstring )
191  dim as integer dst_len = dst.len
192 
193  REALLOC_SETUP( dst, src_len, zstring )
194 
195  if( dst.data <> NULL ) then
196  *(dst.data + dst_len+0) = src
197  *(dst.data + dst_len+1) = 0
198  end if
199 
200 end sub
201 
202 ''::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
203 '' dynamic wstrings
204 ''::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
205 
206 '':::::
207 sub DWstrZero _
208  ( _
209  byref dst as DWSTRING _
210  )
211 
212  dst.data = NULL
213  dst.len = 0
214  dst.size = 0
215 
216 end sub
217 
218 '':::::
219 sub DWstrAllocate _
220  ( _
221  byref dst as DWSTRING, _
222  byval chars as integer _
223  )
224 
225  ALLOC_SETUP( dst, chars, wstring )
226 
227 end sub
228 
229 '':::::
230 sub DWstrReset _
231  ( _
232  byref dst as DWSTRING _
233  )
234 
235  if( dst.data <> NULL ) then
236  *dst.data = 0
237  end if
238 
239  dst.len = 0
240 
241 end sub
242 
243 '':::::
244 sub DWstrAssign _
245  ( _
246  byref dst as DWSTRING, _
247  byval src as wstring ptr _
248  )
249 
250  dim as integer src_len = CALC_LEN( src )
251 
252  ALLOC_SETUP( dst, src_len, wstring )
253 
254  if( dst.data <> NULL ) then
255  *dst.data = *src
256  end if
257 
258 end sub
259 
260 '':::::
261 sub DWstrAssignA _
262  ( _
263  byref dst as DWSTRING, _
264  byval src as zstring ptr _
265  )
266 
267  dim as integer src_len = CALC_LEN( src )
268 
269  ALLOC_SETUP( dst, src_len, wstring )
270 
271  if( dst.data <> NULL ) then
272  *dst.data = *src
273  end if
274 
275 end sub
276 
277 '':::::
278 sub DWstrAssignC _
279  ( _
280  byref dst as DWSTRING, _
281  byval src as uinteger _
282  )
283 
284  dim as integer src_len = len( wstring )
285 
286  ALLOC_SETUP( dst, src_len, wstring )
287 
288  if( dst.data <> NULL ) then
289  dst.data[0] = src
290  dst.data[1] = 0
291  end if
292 
293 end sub
294 
295 '':::::
296 sub DWstrConcatAssign _
297  ( _
298  byref dst as DWSTRING, _
299  byval src as wstring ptr _
300  )
301 
302  dim as integer src_len = CALC_LEN( src )
303  dim as integer dst_len = dst.len
304 
305  REALLOC_SETUP( dst, src_len, wstring )
306 
307  if( dst.data <> NULL ) then
308  *(dst.data + dst_len) = *src
309  end if
310 
311 end sub
312 
313 '':::::
314 sub DWstrConcatAssignA _
315  ( _
316  byref dst as DWSTRING, _
317  byval src as zstring ptr _
318  )
319 
320  dim as integer src_len = CALC_LEN( src )
321  dim as integer dst_len = dst.len
322 
323  REALLOC_SETUP( dst, src_len, wstring )
324 
325  if( dst.data <> NULL ) then
326  *(dst.data + dst_len) = *src
327  end if
328 
329 end sub
330 
331 '':::::
332 sub DWstrConcatAssignC _
333  ( _
334  byref dst as DWSTRING, _
335  byval src as uinteger _
336  )
337 
338  dim as integer src_len = len( wstring )
339  dim as integer dst_len = dst.len
340 
341  REALLOC_SETUP( dst, src_len, wstring )
342 
343  if( dst.data <> NULL ) then
344  *(dst.data + dst_len+0) = src
345  *(dst.data + dst_len+1) = 0
346  end if
347 
348 end sub
349 
350 '':::::
351 sub hRealloc _
352  ( _
353  byval s as DSTRING ptr, _
354  byval chars as integer, _
355  byval charsize as integer, _
356  byval dopreserve as integer _
357  ) static
358 
359  dim as integer newsize
360  dim as any ptr p
361 
362  '' alloc every 16-chars
363  newsize = (chars + 15) and not 15
364 
365  if( (s->data = NULL) or _
366  (chars > s->size) or _
367  (newsize < (s->size - (s->size shr 3))) ) then
368 
369  if( dopreserve = FALSE ) then
370  if( s->data <> NULL ) then
371  deallocate( s->data )
372  end if
373 
374  s->data = allocate( (newsize + 1) * charsize )
375  '' failed? try the original request
376  if( s->data = NULL ) then
377  s->data = xallocate( (chars + 1) * charsize )
378  newsize = chars
379  end if
380 
381  '' preserve..
382  else
383  p = s->data
384  s->data = reallocate( p, (newsize + 1) * charsize )
385  '' failed? try the original request
386  if( s->data = NULL ) then
387  s->data = xreallocate( p, (chars + 1) * charsize )
388  newsize = chars
389  end if
390  end if
391 
392  s->size = newsize
393  end if
394 
395  s->len = chars
396 
397 end sub
398 
399