• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 // -*- c++ -*-
19 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
20 
21 //               O S C L _ S T R I N G   C L A S S
22 
23 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
24 
25 // - - Inclusion - - - - - - - - - - - - - - - - - - - - - - - - - - - -
26 
27 #include "oscl_string_containers.h"
28 #include "oscl_stdstring.h"
29 #include "oscl_error.h"
30 
31 // **************************************************************
32 //                   CHeapRep Implementation
33 // **************************************************************
34 
set_rep(CHeapRep * & aRep,Oscl_DefAlloc & aAlloc,const char * cp,uint32 len)35 OSCL_EXPORT_REF void CHeapRep::set_rep(CHeapRep*& aRep, Oscl_DefAlloc& aAlloc, const char* cp, uint32 len)
36 //set heap rep to new string.
37 {
38     CHeapRep*newrep = New(aAlloc);
39     if (newrep
40             && newrep->set(len, cp, aAlloc))
41     {
42         CHeapRep::assign(aRep, newrep, aAlloc);
43     }
44     else
45     {
46         //could not allocate newrep or could not allocate buffer.
47         if (newrep)
48             aAlloc.deallocate(newrep);
49         OsclError::Leave(OsclErrNoMemory);//no memory
50     }
51 }
52 
53 // **************************************************************
set_rep(CHeapRep * & aRep,Oscl_DefAlloc & aAlloc,const oscl_wchar * cp,uint32 len)54 OSCL_EXPORT_REF void CHeapRep::set_rep(CHeapRep*& aRep, Oscl_DefAlloc& aAlloc, const oscl_wchar* cp, uint32 len)
55 //set heap rep to new string.
56 {
57     CHeapRep*newrep = New(aAlloc);
58     if (newrep
59             && newrep->set(len, cp, aAlloc))
60     {
61         CHeapRep::assign(aRep, newrep, aAlloc);
62     }
63     else
64     {
65         //could not allocate newrep or could not allocate buffer.
66         if (newrep)
67             aAlloc.deallocate(newrep);
68         OsclError::Leave(OsclErrNoMemory);//no memory
69     }
70 }
71 
72 // **************************************************************
append_rep(CHeapRep * & aRep,Oscl_DefAlloc & aAlloc,const char * cp,uint32 len)73 OSCL_EXPORT_REF void CHeapRep::append_rep(CHeapRep*& aRep, Oscl_DefAlloc& aAlloc, const char* cp, uint32 len)
74 //set heap rep to current string plus new string.
75 {
76     CHeapRep*newrep = New(aAlloc);
77     if (newrep
78             && newrep->append((aRep) ? aRep->size : 0, (char*)((aRep) ? aRep->buffer : NULL), len, cp, aAlloc))
79     {
80         CHeapRep::assign(aRep, newrep, aAlloc);
81     }
82     else
83     {
84         //could not allocate newrep or could not allocate buffer.
85         if (newrep)
86             aAlloc.deallocate(newrep);
87         OsclError::Leave(OsclErrNoMemory);//no memory
88     }
89 }
90 
91 // **************************************************************
append_rep(CHeapRep * & aRep,Oscl_DefAlloc & aAlloc,const oscl_wchar * cp,uint32 len)92 OSCL_EXPORT_REF void CHeapRep::append_rep(CHeapRep*& aRep, Oscl_DefAlloc& aAlloc, const oscl_wchar* cp, uint32 len)
93 //set heap rep to current string plus new string.
94 {
95     CHeapRep*newrep = New(aAlloc);
96     if (newrep
97             && newrep->append((aRep) ? aRep->size : 0, (oscl_wchar*)((aRep) ? aRep->buffer : NULL), len, cp, aAlloc))
98     {
99         CHeapRep::assign(aRep, newrep, aAlloc);
100     }
101     else
102     {
103         //could not allocate newrep or could not allocate buffer.
104         if (newrep)
105             aAlloc.deallocate(newrep);
106         OsclError::Leave(OsclErrNoMemory);//no memory
107     }
108 }
109 
110 // **************************************************************
assign(CHeapRep * & dest,CHeapRep * src,Oscl_DefAlloc & alloc)111 OSCL_EXPORT_REF void CHeapRep::assign(CHeapRep*& dest, CHeapRep* src, Oscl_DefAlloc &alloc)
112 {
113     if (src)
114         src->add_ref();
115     if (dest)
116         dest->remove_ref(alloc);
117     dest = src;
118 }
119 
120 // **************************************************************
New(Oscl_DefAlloc & alloc)121 CHeapRep* CHeapRep::New(Oscl_DefAlloc &alloc)
122 {
123     OsclAny *ptr = alloc.ALLOCATE(sizeof(CHeapRep));
124     if (ptr)
125     {
126         CHeapRep*newrep = new(ptr) CHeapRep;
127         return newrep;
128     }
129     return NULL;
130 }
131 
132 // **************************************************************
set(uint32 nsz,const char * cp,Oscl_DefAlloc & alloc)133 OSCL_EXPORT_REF bool CHeapRep::set(uint32 nsz, const char*cp, Oscl_DefAlloc &alloc)
134 {
135     // allocate enough space including terminator
136     OsclAny* ptr = alloc.ALLOCATE(sizeof(char) * (nsz + 1));
137     if (!ptr)
138     {
139         refcount = 0;
140         size = 0;
141         maxsize = 0;
142         buffer = NULL;
143         return false;//can't allocate buffer.
144     }
145     refcount = 0;
146     size = nsz;
147     maxsize = nsz;
148     buffer = ptr;
149     if (cp)
150         oscl_strncpy((char*)buffer, cp, size);
151     ((char*)buffer)[size] = '\0';
152     return true;
153 }
set(uint32 nsz,const oscl_wchar * cp,Oscl_DefAlloc & alloc)154 OSCL_EXPORT_REF bool CHeapRep::set(uint32 nsz, const oscl_wchar*cp, Oscl_DefAlloc &alloc)
155 {
156     // allocate enough space including terminator
157     OsclAny* ptr = alloc.ALLOCATE(sizeof(oscl_wchar) * (nsz + 1));
158     if (!ptr)
159     {
160         refcount = 0;
161         size = 0;
162         maxsize = 0;
163         buffer = NULL;
164         return false;//can't allocate buffer.
165     }
166     refcount = 0;
167     size = nsz;
168     maxsize = nsz;
169     buffer = ptr;
170     if (cp)
171         oscl_strncpy((oscl_wchar*)buffer, cp, size);
172     ((oscl_wchar*)buffer)[size] = '\0';
173     return true;
174 }
175 
176 // **************************************************************
append(uint32 s1,const char * cp1,uint32 s2,const char * cp2,Oscl_DefAlloc & alloc)177 OSCL_EXPORT_REF bool CHeapRep::append(uint32 s1, const char*cp1,
178                                       uint32 s2, const char*cp2,
179                                       Oscl_DefAlloc &alloc)
180 {
181     maxsize = s1 + s2;
182     size = maxsize;
183     // allocate enough space including terminator
184     OsclAny* ptr = alloc.ALLOCATE(sizeof(char) * (maxsize + 1));
185     if (!ptr)
186     {
187         refcount = 0;
188         size = 0;
189         maxsize = 0;
190         buffer = NULL;
191         return false;//can't allocate buffer.
192     }
193     refcount = 0;
194     buffer = ptr;
195     if (cp1)
196         oscl_strncpy((char*)buffer, cp1, s1);
197     ((char*)buffer)[s1] = '\0';
198     if (cp2)
199         oscl_strncat((char*)buffer, cp2, s2);
200     ((char*)buffer)[size] = '\0';
201     return true;
202 }
203 
append(uint32 s1,const oscl_wchar * cp1,uint32 s2,const oscl_wchar * cp2,Oscl_DefAlloc & alloc)204 OSCL_EXPORT_REF bool CHeapRep::append(uint32 s1, const oscl_wchar*cp1,
205                                       uint32 s2, const oscl_wchar*cp2,
206                                       Oscl_DefAlloc &alloc)
207 {
208     maxsize = s1 + s2;
209     size = maxsize;
210     // allocate enough space including terminator
211     OsclAny* ptr = alloc.ALLOCATE(sizeof(oscl_wchar) * (maxsize + 1));
212     if (!ptr)
213     {
214         refcount = 0;
215         size = 0;
216         maxsize = 0;
217         buffer = NULL;
218         return false;//can't allocate buffer.
219     }
220     refcount = 0;
221     buffer = ptr;
222     if (cp1)
223         oscl_strncpy((oscl_wchar*)buffer, cp1, s1);
224     ((oscl_wchar*)buffer)[s1] = '\0';
225     if (cp2)
226         oscl_strncat((oscl_wchar*)buffer, cp2, s2);
227     ((oscl_wchar*)buffer)[size] = '\0';
228     return true;
229 }
230 
231 // **************************************************************
add_ref()232 OSCL_EXPORT_REF void CHeapRep::add_ref()
233 {
234     refcount++;
235 }
236 
237 // **************************************************************
remove_ref(Oscl_DefAlloc & alloc)238 OSCL_EXPORT_REF void CHeapRep::remove_ref(Oscl_DefAlloc &alloc)
239 {
240     --refcount;
241     if (refcount == 0)
242     {
243         alloc.deallocate(buffer);
244         alloc.deallocate(this);
245     }
246 }
247 
248 // **************************************************************
249 //                   OSCL_HeapStringA Implementation
250 //                   OSCL_wHeapStringA Implementation
251 // **************************************************************
252 
set_rep(const chartype * cp,uint32 len)253 void OSCL_HeapStringA::set_rep(const chartype* cp, uint32 len)
254 //set heap rep to new string.
255 {
256     CHeapRep::set_rep(iRep, *iAlloc, cp, len);
257 }
258 
set_rep(const chartype * cp,uint32 len)259 void OSCL_wHeapStringA::set_rep(const chartype* cp, uint32 len)
260 //set heap rep to new string.
261 {
262     CHeapRep::set_rep(iRep, *iAlloc, cp, len);
263 }
264 
265 // **************************************************************
append_rep(const chartype * cp,uint32 len)266 void OSCL_HeapStringA::append_rep(const chartype* cp, uint32 len)
267 //set heap rep to current string plus new string.
268 {
269     CHeapRep::append_rep(iRep, *iAlloc, cp, len);
270 }
271 
append_rep(const chartype * cp,uint32 len)272 void OSCL_wHeapStringA::append_rep(const chartype* cp, uint32 len)
273 //set heap rep to current string plus new string.
274 {
275     CHeapRep::append_rep(iRep, *iAlloc, cp, len);
276 }
277 
278 // **************************************************************
set_rep(const chartype * cp)279 void OSCL_HeapStringA::set_rep(const chartype* cp)
280 {
281     uint32 len = (cp) ? oscl_strlen(cp) : 0;
282     set_rep(cp, len);
283 }
284 
set_rep(const chartype * cp)285 void OSCL_wHeapStringA::set_rep(const chartype* cp)
286 {
287     uint32 len = (cp) ? oscl_strlen(cp) : 0;
288     set_rep(cp, len);
289 }
290 
291 
292 // **************************************************************
append_rep(const chartype * cp)293 void OSCL_HeapStringA::append_rep(const chartype* cp)
294 {
295     uint32 len = (cp) ? oscl_strlen(cp) : 0;
296     append_rep(cp, len);
297 }
298 
append_rep(const chartype * cp)299 void OSCL_wHeapStringA::append_rep(const chartype* cp)
300 {
301     uint32 len = (cp) ? oscl_strlen(cp) : 0;
302     append_rep(cp, len);
303 }
304 
305 
306 // **************************************************************
set_rep(const OSCL_String & src)307 void OSCL_HeapStringA::set_rep(const OSCL_String& src)
308 {
309     set_rep(src.get_cstr(), src.get_size());
310 }
311 
set_rep(const OSCL_wString & src)312 void OSCL_wHeapStringA::set_rep(const OSCL_wString& src)
313 {
314     set_rep(src.get_cstr(), src.get_size());
315 }
316 
317 
318 // **************************************************************
append_rep(const OSCL_String & src)319 void OSCL_HeapStringA::append_rep(const OSCL_String& src)
320 {
321     append_rep(src.get_cstr(), src.get_size());
322 }
323 
append_rep(const OSCL_wString & src)324 void OSCL_wHeapStringA::append_rep(const OSCL_wString& src)
325 {
326     append_rep(src.get_cstr(), src.get_size());
327 }
328 
329 
330 // **************************************************************
get_size() const331 OSCL_EXPORT_REF uint32 OSCL_HeapStringA::get_size() const
332 {
333     if (iRep)
334         return iRep->size;
335     return 0;
336 }
337 
get_size() const338 OSCL_EXPORT_REF uint32 OSCL_wHeapStringA::get_size() const
339 {
340     if (iRep)
341         return iRep->size;
342     return 0;
343 }
344 
345 // **************************************************************
set_len(uint32 len)346 void OSCL_HeapStringA::set_len(uint32 len)
347 {
348     iRep->size = len;
349 }
350 
set_len(uint32 len)351 void OSCL_wHeapStringA::set_len(uint32 len)
352 {
353     iRep->size = len;
354 }
355 
356 
357 // **************************************************************
get_maxsize() const358 OSCL_EXPORT_REF uint32 OSCL_HeapStringA::get_maxsize() const
359 {
360     if (iRep)
361         return iRep->maxsize;
362     return 0;
363 }
364 
get_maxsize() const365 OSCL_EXPORT_REF uint32 OSCL_wHeapStringA::get_maxsize() const
366 {
367     if (iRep)
368         return iRep->maxsize;
369     return 0;
370 }
371 
372 
373 // **************************************************************
get_cstr() const374 OSCL_EXPORT_REF const OSCL_HeapStringA::chartype* OSCL_HeapStringA::get_cstr() const
375 {
376     if (iRep)
377         return (chartype*)iRep->buffer;
378     return NULL;
379 }
380 
get_cstr() const381 OSCL_EXPORT_REF const OSCL_wHeapStringA::chartype* OSCL_wHeapStringA::get_cstr() const
382 {
383     if (iRep)
384         return (chartype*)iRep->buffer;
385     return NULL;
386 }
387 
388 
389 // **************************************************************
get_str() const390 OSCL_EXPORT_REF OSCL_HeapStringA::chartype* OSCL_HeapStringA::get_str() const
391 {
392     if (iRep)
393         return (chartype*)iRep->buffer;
394     return NULL;
395 }
396 
get_str() const397 OSCL_EXPORT_REF OSCL_wHeapStringA::chartype* OSCL_wHeapStringA::get_str() const
398 {
399     if (iRep)
400         return (chartype*)iRep->buffer;
401     return NULL;
402 }
403 
404 
405 // **************************************************************
create(Oscl_DefAlloc * alloc,OsclRefCounter * ref)406 void OSCL_HeapStringA::create(Oscl_DefAlloc *alloc, OsclRefCounter *ref)
407 {
408     iRep = NULL;
409     if (alloc)
410     {//use an allocator owned by the caller that may also have a ref counter.
411         iAllocRef = ref;
412         if (iAllocRef)
413             iAllocRef->addRef();
414         iAlloc = alloc;
415     }
416     else
417     {//use a basic allocator that resides in this object.
418         iAlloc = &iDefAlloc;
419         iAllocRef = NULL;
420     }
421 }
422 
create(Oscl_DefAlloc * alloc,OsclRefCounter * ref)423 void OSCL_wHeapStringA::create(Oscl_DefAlloc *alloc, OsclRefCounter *ref)
424 {
425     iRep = NULL;
426     if (alloc)
427     {//use an allocator owned by the caller that may also have a ref counter.
428         iAllocRef = ref;
429         if (iAllocRef)
430             iAllocRef->addRef();
431         iAlloc = alloc;
432     }
433     else
434     {//use a basic allocator that resides in this object.
435         iAlloc = &iDefAlloc;
436         iAllocRef = NULL;
437     }
438 }
439 
440 
441 // **************************************************************
OSCL_HeapStringA()442 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA()
443 {
444     create(NULL, NULL);
445     set_rep(NULL);
446 }
OSCL_HeapStringA(Oscl_DefAlloc * alloc,OsclRefCounter * ref)447 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(Oscl_DefAlloc *alloc, OsclRefCounter *ref)
448 {
449     create(alloc, ref);
450     set_rep(NULL);
451 }
452 
OSCL_wHeapStringA()453 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA()
454 {
455     create(NULL, NULL);
456     set_rep(NULL);
457 }
OSCL_wHeapStringA(Oscl_DefAlloc * alloc,OsclRefCounter * ref)458 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(Oscl_DefAlloc *alloc, OsclRefCounter *ref)
459 {
460     create(alloc, ref);
461     set_rep(NULL);
462 }
463 
464 // **************************************************************
OSCL_HeapStringA(const chartype * cp,Oscl_DefAlloc * alloc,OsclRefCounter * ref)465 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(const chartype* cp, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
466 {
467     create(alloc, ref);
468     set_rep(cp);
469 }
470 
OSCL_wHeapStringA(const chartype * cp,Oscl_DefAlloc * alloc,OsclRefCounter * ref)471 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(const chartype* cp, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
472 {
473     create(alloc, ref);
474     set_rep(cp);
475 }
476 
477 // **************************************************************
set(const chartype * cp,uint32 length)478 OSCL_EXPORT_REF void OSCL_HeapStringA::set(const chartype* cp, uint32 length)
479 {
480     set_rep(cp, length);
481     //just in case input string is shorter than 'length'
482     iRep->size = oscl_strlen(get_cstr());
483 }
484 
set(const chartype * cp,uint32 length)485 OSCL_EXPORT_REF void OSCL_wHeapStringA::set(const chartype* cp, uint32 length)
486 {
487     set_rep(cp, length);
488     //just in case input string is shorter than 'length'
489     iRep->size = oscl_strlen(get_cstr());
490 }
491 
492 
493 // **************************************************************
OSCL_HeapStringA(const chartype * cp,uint32 length,Oscl_DefAlloc * alloc,OsclRefCounter * ref)494 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(const chartype* cp, uint32 length, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
495 {
496     create(alloc, ref);
497     set(cp, length);
498 }
499 
OSCL_wHeapStringA(const chartype * cp,uint32 length,Oscl_DefAlloc * alloc,OsclRefCounter * ref)500 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(const chartype* cp, uint32 length, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
501 {
502     create(alloc, ref);
503     set(cp, length);
504 }
505 
506 // **************************************************************
OSCL_HeapStringA(const OSCL_HeapStringA & src)507 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(const OSCL_HeapStringA& src) : OSCL_String(src)
508 {
509     create(NULL, NULL);
510     *this = src;//uses heapstring=heapstring overload.
511 }
OSCL_HeapStringA(const OSCL_HeapStringA & src,Oscl_DefAlloc * alloc,OsclRefCounter * ref)512 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(const OSCL_HeapStringA& src, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
513 {
514     create(alloc, ref);
515     *this = src;//uses heapstring=heapstring overload.
516 }
517 
OSCL_wHeapStringA(const OSCL_wHeapStringA & src)518 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(const OSCL_wHeapStringA& src) : OSCL_wString(src)
519 {
520     create(NULL, NULL);
521     *this = src;//uses heapstring=heapstring overload.
522 }
OSCL_wHeapStringA(const OSCL_wHeapStringA & src,Oscl_DefAlloc * alloc,OsclRefCounter * ref)523 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(const OSCL_wHeapStringA& src , Oscl_DefAlloc *alloc, OsclRefCounter *ref)
524 {
525     create(alloc, ref);
526     *this = src;//uses heapstring=heapstring overload.
527 }
528 
529 // **************************************************************
OSCL_HeapStringA(const OSCL_String & src,Oscl_DefAlloc * alloc,OsclRefCounter * ref)530 OSCL_EXPORT_REF OSCL_HeapStringA::OSCL_HeapStringA(const OSCL_String& src, Oscl_DefAlloc *alloc, OsclRefCounter *ref)
531 {
532     create(alloc, ref);
533     set_rep(src);
534 }
535 
OSCL_wHeapStringA(const OSCL_wString & src,Oscl_DefAlloc * alloc,OsclRefCounter * ref)536 OSCL_EXPORT_REF OSCL_wHeapStringA::OSCL_wHeapStringA(const OSCL_wString& src , Oscl_DefAlloc *alloc, OsclRefCounter *ref)
537 {
538     create(alloc, ref);
539     set_rep(src);
540 }
541 
542 // **************************************************************
~OSCL_HeapStringA()543 OSCL_EXPORT_REF OSCL_HeapStringA::~OSCL_HeapStringA()
544 {
545     //remove ref to string rep
546     if (iRep)
547         iRep->remove_ref(*iAlloc);
548     //remove ref to allocator.
549     if (iAllocRef)
550         iAllocRef->removeRef();
551 }
552 
~OSCL_wHeapStringA()553 OSCL_EXPORT_REF OSCL_wHeapStringA::~OSCL_wHeapStringA()
554 {
555     //remove ref to string rep
556     if (iRep)
557         iRep->remove_ref(*iAlloc);
558     //remove ref to allocator.
559     if (iAllocRef)
560         iAllocRef->removeRef();
561 }
562 
563 // **************************************************************
operator =(const OSCL_HeapStringA & src)564 OSCL_EXPORT_REF OSCL_HeapStringA& OSCL_HeapStringA::operator=(const OSCL_HeapStringA & src)
565 {
566     //the allocators must match in order to re-use
567     //the heap string representation.
568     //Allocators match if they're the same object,
569     //or they're both the default allocators.
570     if (src.iRep
571             && ((src.iAlloc == (Oscl_DefAlloc*)&src.iDefAlloc
572                  && iAlloc == &iDefAlloc)
573                 || src.iAlloc == iAlloc))
574     {
575         CHeapRep::assign(iRep, src.iRep, *iAlloc);
576     }
577     else
578     {//otherwise, create a new representation
579         set_rep(src);
580     }
581     return (*this);
582 }
583 
operator =(const OSCL_wHeapStringA & src)584 OSCL_EXPORT_REF OSCL_wHeapStringA& OSCL_wHeapStringA::operator=(const OSCL_wHeapStringA & src)
585 {
586     //the allocators must match in order to re-use
587     //the heap string representation.
588     //Allocators match if they're the same object,
589     //or they're both the default allocators.
590     if (src.iRep
591             && ((src.iAlloc == (Oscl_DefAlloc*)&src.iDefAlloc
592                  && iAlloc == &iDefAlloc)
593                 || src.iAlloc == iAlloc))
594     {
595         CHeapRep::assign(iRep, src.iRep, *iAlloc);
596     }
597     else
598     {//otherwise, create a new representation
599         set_rep(src);
600     }
601     return (*this);
602 }
603 
604 // **************************************************************
operator =(const chartype * cp)605 OSCL_EXPORT_REF OSCL_HeapStringA& OSCL_HeapStringA::operator=(const chartype * cp)
606 {
607     set_rep(cp);
608     return (*this);
609 }
610 
operator =(const chartype * cp)611 OSCL_EXPORT_REF OSCL_wHeapStringA& OSCL_wHeapStringA::operator=(const chartype * cp)
612 {
613     set_rep(cp);
614     return (*this);
615 }
616 
617 // **************************************************************
618 //                 CStackRep Implementation
619 // **************************************************************
620 
set(const char * cp,uint32 len)621 OSCL_EXPORT_REF void CStackRep::set(const char* cp, uint32 len)
622 {
623     if (len > maxsize)
624         size = maxsize;//truncate
625     else
626         size = len;
627     if (cp)
628         oscl_strncpy((char*)buffer, cp, size);
629     ((char*)buffer)[size] = '\0';
630 }
set(const oscl_wchar * cp,uint32 len)631 OSCL_EXPORT_REF void CStackRep::set(const oscl_wchar* cp, uint32 len)
632 {
633     if (len > maxsize)
634         size = maxsize;//truncate
635     else
636         size = len;
637     if (cp)
638         oscl_strncpy((oscl_wchar*)buffer, cp, size);
639     ((oscl_wchar*)buffer)[size] = '\0';
640 }
641 
642 // **************************************************************
append(const char * cp,uint32 alen)643 OSCL_EXPORT_REF void CStackRep::append(const char* cp, uint32 alen)
644 {
645     uint32 len = alen;
646     if (size + len > maxsize)
647         len = maxsize - size;//truncate
648     if (len > 0)
649     {
650         size = size + len;
651         oscl_strncat((char*)buffer, cp, len);
652         ((char*)buffer)[size] = '\0';
653     }
654 }
append(const oscl_wchar * cp,uint32 alen)655 OSCL_EXPORT_REF void CStackRep::append(const oscl_wchar* cp, uint32 alen)
656 {
657     uint32 len = alen;
658     if (size + len > maxsize)
659         len = maxsize - size;//truncate
660     if (len > 0)
661     {
662         size = size + len;
663         oscl_strncat((oscl_wchar*)buffer, cp, len);
664         ((oscl_wchar*)buffer)[size] = '\0';
665     }
666 }
667 
668 // **************************************************************
669 //                CFastRep Implementation
670 // **************************************************************
671 
set_r(const char * cp,uint32 len)672 OSCL_EXPORT_REF void CFastRep::set_r(const char* cp, uint32 len)
673 {
674     size = len;
675     maxsize = len;
676     buffer = (OsclAny*)cp;
677     writable = false;
678 }
set_r(const oscl_wchar * cp,uint32 len)679 OSCL_EXPORT_REF void CFastRep::set_r(const oscl_wchar* cp, uint32 len)
680 {
681     size = len;
682     maxsize = len;
683     buffer = (OsclAny*)cp;
684     writable = false;
685 }
686 
687 // **************************************************************
set_w(char * cp,uint32 len,uint32 maxlen)688 OSCL_EXPORT_REF void CFastRep::set_w(char* cp, uint32 len, uint32 maxlen)
689 {
690     size = len;
691     maxsize = maxlen;
692     buffer = (OsclAny*)cp;
693     writable = true;
694 }
set_w(oscl_wchar * cp,uint32 len,uint32 maxlen)695 OSCL_EXPORT_REF void CFastRep::set_w(oscl_wchar* cp, uint32 len, uint32 maxlen)
696 {
697     size = len;
698     maxsize = maxlen;
699     buffer = (OsclAny*)cp;
700     writable = true;
701 }
702 
703 // **************************************************************
append(const char * cp,uint32 len)704 OSCL_EXPORT_REF void CFastRep::append(const char* cp, uint32 len)
705 {
706     uint32 ncopy = len;
707     if (size + len > maxsize)
708         ncopy = maxsize - size;//truncate
709     if (ncopy > 0)
710     {
711         oscl_strncat((char*)buffer, cp, ncopy);
712         size += ncopy;
713         if (!writable)
714             maxsize = size;
715     }
716 }
append(const oscl_wchar * cp,uint32 len)717 OSCL_EXPORT_REF void CFastRep::append(const oscl_wchar* cp, uint32 len)
718 {
719     uint32 ncopy = len;
720     if (size + len > maxsize)
721         ncopy = maxsize - size;//truncate
722     if (ncopy > 0)
723     {
724         oscl_strncat((oscl_wchar*)buffer, cp, ncopy);
725         size += ncopy;
726         if (!writable)
727             maxsize = size;
728     }
729 }
730 
731 // **************************************************************
732 //                   OSCL_FastString Implementation
733 //                   OSCL_wFastString Implementation
734 // **************************************************************
set_rep(const chartype * cp)735 void OSCL_FastString::set_rep(const chartype* cp)
736 {
737     uint32 len = (cp) ? oscl_strlen(cp) : 0;
738     rep.set_r(cp, len);
739 }
740 
set_rep(const chartype * cp)741 void OSCL_wFastString::set_rep(const chartype* cp)
742 {
743     uint32 len = (cp) ? oscl_strlen(cp) : 0;
744     rep.set_r(cp, len);
745 }
746 
747 // **************************************************************
append_rep(const chartype * cp)748 void OSCL_FastString::append_rep(const chartype* cp)
749 {
750     uint32 len = (cp) ? oscl_strlen(cp) : 0;
751     rep.append(cp, len);
752 }
753 
append_rep(const chartype * cp)754 void OSCL_wFastString::append_rep(const chartype* cp)
755 {
756     uint32 len = (cp) ? oscl_strlen(cp) : 0;
757     rep.append(cp, len);
758 }
759 
760 
761 // **************************************************************
set_rep(const OSCL_String & src)762 void OSCL_FastString::set_rep(const OSCL_String& src)
763 {
764     //inherit the writable-ness of the source string.
765     if (src.get_str())
766         rep.set_w(src.get_str(), src.get_size(), src.get_maxsize());
767     else
768         rep.set_r(src.get_cstr(), src.get_size());
769 }
770 
set_rep(const OSCL_wString & src)771 void OSCL_wFastString::set_rep(const OSCL_wString& src)
772 {
773     //inherit the writable-ness of the source string.
774     if (src.get_str())
775         rep.set_w(src.get_str(), src.get_size(), src.get_maxsize());
776     else
777         rep.set_r(src.get_cstr(), src.get_size());
778 }
779 
780 // **************************************************************
append_rep(const OSCL_String & src)781 void OSCL_FastString::append_rep(const OSCL_String& src)
782 {
783     rep.append(src.get_cstr(), src.get_size());
784 }
785 
append_rep(const OSCL_wString & src)786 void OSCL_wFastString::append_rep(const OSCL_wString& src)
787 {
788     rep.append(src.get_cstr(), src.get_size());
789 }
790 
791 // **************************************************************
set_len(uint32 len)792 void OSCL_FastString::set_len(uint32 len)
793 {
794     rep.size = len;
795 }
set_len(uint32 len)796 void OSCL_wFastString::set_len(uint32 len)
797 {
798     rep.size = len;
799 }
800 
801 // **************************************************************
OSCL_FastString()802 OSCL_EXPORT_REF OSCL_FastString::OSCL_FastString()
803 {
804     set_rep(NULL);
805 }
806 
OSCL_wFastString()807 OSCL_EXPORT_REF OSCL_wFastString::OSCL_wFastString()
808 {
809     set_rep(NULL);
810 }
811 
812 // **************************************************************
OSCL_FastString(const chartype * cp)813 OSCL_EXPORT_REF OSCL_FastString::OSCL_FastString(const chartype* cp)
814 {
815     set_rep(cp);
816 }
817 
OSCL_wFastString(const chartype * cp)818 OSCL_EXPORT_REF OSCL_wFastString::OSCL_wFastString(const chartype* cp)
819 {
820     set_rep(cp);
821 }
822 
823 // **************************************************************
set(chartype * cp,uint32 maxlen)824 OSCL_EXPORT_REF void OSCL_FastString::set(chartype* cp, uint32 maxlen)
825 {
826     //set string to new writable buffer.
827     //make sure buffer is null-terminated
828     for (uint32 i = 0; i <= maxlen; i++)
829     {
830         if (cp[i] == '\0')
831         {
832             rep.set_w(cp, i, maxlen);
833             return;
834         }
835     }
836     OsclError::Leave(OsclErrGeneral);//not null-terminated
837 }
838 
set(chartype * cp,uint32 maxlen)839 OSCL_EXPORT_REF void OSCL_wFastString::set(chartype* cp, uint32 maxlen)
840 {
841     //set string to new writable buffer.
842     //make sure buffer is null-terminated
843     for (uint32 i = 0; i <= maxlen; i++)
844     {
845         if (cp[i] == '\0')
846         {
847             rep.set_w(cp, i, maxlen);
848             return;
849         }
850     }
851     OsclError::Leave(OsclErrGeneral);//not null-terminated
852 }
853 
854 // **************************************************************
OSCL_FastString(chartype * cp,uint32 maxlen)855 OSCL_EXPORT_REF OSCL_FastString::OSCL_FastString(chartype* cp, uint32 maxlen)
856 {
857     set(cp, maxlen);
858 }
859 
OSCL_wFastString(chartype * cp,uint32 maxlen)860 OSCL_EXPORT_REF OSCL_wFastString::OSCL_wFastString(chartype* cp, uint32 maxlen)
861 {
862     set(cp, maxlen);
863 }
864 
865 // **************************************************************
OSCL_FastString(const OSCL_FastString & src)866 OSCL_EXPORT_REF OSCL_FastString::OSCL_FastString(const OSCL_FastString& src) : OSCL_String(src)
867 {
868     set_rep(src);
869 }
870 
OSCL_wFastString(const OSCL_wFastString & src)871 OSCL_EXPORT_REF OSCL_wFastString::OSCL_wFastString(const OSCL_wFastString& src) : OSCL_wString(src)
872 {
873     set_rep(src);
874 }
875 
876 // **************************************************************
~OSCL_FastString()877 OSCL_EXPORT_REF OSCL_FastString::~OSCL_FastString()
878 {
879 }
880 
~OSCL_wFastString()881 OSCL_EXPORT_REF OSCL_wFastString::~OSCL_wFastString()
882 {
883 }
884 
885 // **************************************************************
set_length()886 OSCL_EXPORT_REF void OSCL_FastString::set_length()
887 {
888     rep.size = oscl_strlen(get_cstr());
889     //for read-only string, the maxsize tracks the size.
890     if (!rep.writable)
891         rep.maxsize = rep.size;
892 }
893 
set_length()894 OSCL_EXPORT_REF void OSCL_wFastString::set_length()
895 {
896     rep.size = oscl_strlen(get_cstr());
897     //for read-only string, the maxsize tracks the size.
898     if (!rep.writable)
899         rep.maxsize = rep.size;
900 }
901 
902 // **************************************************************
operator =(const OSCL_FastString & src)903 OSCL_EXPORT_REF OSCL_FastString& OSCL_FastString::operator=(const OSCL_FastString & src)
904 {
905     set_rep(src);
906     return (*this);
907 }
908 
operator =(const OSCL_wFastString & src)909 OSCL_EXPORT_REF OSCL_wFastString& OSCL_wFastString::operator=(const OSCL_wFastString & src)
910 {
911     set_rep(src);
912     return (*this);
913 }
914 
915 
916 // **************************************************************
operator =(const chartype * cp)917 OSCL_EXPORT_REF OSCL_FastString& OSCL_FastString::operator=(const chartype * cp)
918 {
919     set_rep(cp);
920     return (*this);
921 }
922 
operator =(const chartype * cp)923 OSCL_EXPORT_REF OSCL_wFastString& OSCL_wFastString::operator=(const chartype * cp)
924 {
925     set_rep(cp);
926     return (*this);
927 }
928 
929 
930 // **************************************************************
get_size() const931 OSCL_EXPORT_REF uint32 OSCL_FastString::get_size() const
932 {
933     return rep.size;
934 }
935 
get_size() const936 OSCL_EXPORT_REF uint32 OSCL_wFastString::get_size() const
937 {
938     return rep.size;
939 }
940 
941 // **************************************************************
get_maxsize() const942 OSCL_EXPORT_REF uint32 OSCL_FastString::get_maxsize() const
943 {
944     return rep.maxsize;
945 }
946 
get_maxsize() const947 OSCL_EXPORT_REF uint32 OSCL_wFastString::get_maxsize() const
948 {
949     return rep.maxsize;
950 }
951 
952 // **************************************************************
get_cstr() const953 OSCL_EXPORT_REF const OSCL_FastString::chartype* OSCL_FastString::get_cstr() const
954 {
955     return (chartype*)rep.buffer;
956 }
957 
get_cstr() const958 OSCL_EXPORT_REF const OSCL_wFastString::chartype* OSCL_wFastString::get_cstr() const
959 {
960     return (chartype*)rep.buffer;
961 }
962 
963 // **************************************************************
get_str() const964 OSCL_EXPORT_REF OSCL_FastString::chartype* OSCL_FastString::get_str() const
965 {
966     if (rep.writable)
967         return (chartype*)rep.buffer;
968     return NULL;
969 }
970 
get_str() const971 OSCL_EXPORT_REF OSCL_wFastString::chartype* OSCL_wFastString::get_str() const
972 {
973     if (rep.writable)
974         return (chartype*)rep.buffer;
975     return NULL;
976 }
977 
978 
979 
980 
981 
982