source: CMT/v1r16p20040901/src/cmt_string.cxx@ 1

Last change on this file since 1 was 1, checked in by arnault, 21 years ago

Import all tags

File size: 14.1 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// See the complete license in cmt_license.txt "http://www.cecill.info".
5//-----------------------------------------------------------
6
7#include <stdio.h>
8#include <stdlib.h>
9#include "cmt_std.h"
10#include "cmt_string.h"
11
12cmt_string::cmt_string ()
13{
14 _data = 0;
15 _allocated = 0;
16 _size = 0;
17}
18
19cmt_string::cmt_string (int n)
20{
21 _data = 0;
22 _allocated = 0;
23 _size = 0;
24 allocate (n + 1);
25}
26
27cmt_string::cmt_string (char c)
28{
29 _data = 0;
30 _allocated = 0;
31 _size = 0;
32
33 allocate (2);
34
35 _data[0] = c;
36 _data[1] = 0;
37 _size = 1;
38}
39
40cmt_string::cmt_string (const char* text)
41{
42 _data = 0;
43 _allocated = 0;
44 _size = 0;
45
46 if (text != 0)
47 {
48 _size = strlen (text);
49 allocate (_size + 1);
50 strcpy (_data, text);
51 }
52}
53
54cmt_string::cmt_string (const cmt_string& other)
55{
56 const char* text = other._data;
57
58 _data = 0;
59 _allocated = 0;
60 _size = 0;
61
62 if (text != 0)
63 {
64 _size = strlen (text);
65 allocate (_size + 1);
66 strcpy (_data, text);
67 }
68}
69
70cmt_string::~cmt_string ()
71{
72 if (_data != 0)
73 {
74#ifdef CMT_USE_NEW_DELETE
75 delete[] _data;
76#else
77 free (_data);
78#endif
79 }
80 _data = 0;
81 _allocated = 0;
82 _size = 0;
83}
84
85 //
86 // Operators
87 //
88cmt_string& cmt_string::operator = (char c)
89{
90 allocate (2);
91
92 _data[0] = c;
93 _data[1] = 0;
94
95 _size = 1;
96
97 return (*this);
98}
99
100cmt_string& cmt_string::operator = (const char* text)
101{
102 if (text == _data) return (*this);
103
104 if (text != 0)
105 {
106 _size = strlen (text);
107 allocate (_size + 1);
108 strcpy (_data, text);
109 }
110 else
111 {
112 _size = 0;
113
114 if (_data != 0)
115 {
116 _data[0] = 0;
117 }
118 }
119
120 return (*this);
121}
122
123cmt_string& cmt_string::operator = (const cmt_string& other)
124{
125 const char* text = other._data;
126 cmt_string& me = *this;
127 me = text;
128 return (me);
129}
130
131cmt_string::operator const char* () const
132{
133 if (_data == 0) return ("");
134 else return (_data);
135}
136
137const char* cmt_string::c_str () const
138{
139 if (_data == 0) return ("");
140 else return (_data);
141}
142
143/*
144char* cmt_string::c_str ()
145{
146 return (_data);
147}
148*/
149
150void cmt_string::operator += (char c)
151{
152 extend (2);
153
154 char temp[2] = { c, 0 };
155
156 strcat (&_data[_size], temp);
157 _size++;
158}
159
160void cmt_string::operator += (const char* text)
161{
162 if (text == 0) return;
163
164 int s = strlen (text);
165 extend (s + 1);
166
167 strcat (&_data[_size], text);
168 _size += s;
169}
170
171void cmt_string::operator += (const cmt_string& other)
172{
173 const char* text = other._data;
174 cmt_string& me = *this;
175
176 me += text;
177}
178
179cmt_string cmt_string::operator + (char c) const
180{
181 cmt_string result (_data);
182 result += c;
183
184 return (result);
185}
186
187cmt_string cmt_string::operator + (const char* text) const
188{
189 cmt_string result (_data);
190 result += text;
191
192 return (result);
193}
194
195cmt_string cmt_string::operator + (const cmt_string& other) const
196{
197 cmt_string result (_data);
198 result += other;
199
200 return (result);
201}
202
203char cmt_string::operator [] (int index) const
204{
205 if ((_data == 0) ||
206 (index < 0) ||
207 (index >= _size))
208 {
209 return (0);
210 }
211 else
212 {
213 return (_data[index]);
214 }
215}
216
217char& cmt_string::operator [] (int index)
218{
219 if ((_data == 0) ||
220 (index < 0) ||
221 (index >= _size))
222 {
223 static char temp;
224 return (temp);
225 }
226 else
227 {
228 return (_data[index]);
229 }
230}
231
232int cmt_string::size () const
233{
234 if (_data == 0) return (0);
235 return (_size);
236}
237
238int cmt_string::size ()
239{
240 if (_data == 0) return (0);
241 return (_size);
242}
243
244void cmt_string::resize (int n)
245{
246 allocate (n + 1);
247}
248
249int cmt_string::find (char c) const
250{
251 if (_data == 0) return (npos);
252
253 char* p = strchr (_data, c);
254 if (p == 0) return (npos);
255 return (p - _data);
256}
257
258int cmt_string::find (const char* text) const
259{
260 if (_data == 0) return (npos);
261 if (text == 0) return (npos);
262
263 char* p = strstr (_data, text);
264 if (p == 0) return (npos);
265 return (p - _data);
266}
267
268int cmt_string::find (const cmt_string& other) const
269{
270 const char* text = other._data;
271 return (find (text));
272}
273
274int cmt_string::find (int pos, char c) const
275{
276 if (_data == 0) return (npos);
277 if (pos < 0) return (npos);
278 if (pos >= _size) return (npos);
279
280 char* p = strchr (&_data[pos], c);
281 if (p == 0) return (npos);
282 return (p - _data);
283}
284
285int cmt_string::find (int pos, const char* text) const
286{
287 if (_data == 0) return (npos);
288 if (text == 0) return (npos);
289 if (pos < 0) return (npos);
290 if (pos >= _size) return (npos);
291
292 char* p = strstr (&_data[pos], text);
293 if (p == 0) return (npos);
294 return (p - _data);
295}
296
297int cmt_string::find (int pos, const cmt_string& other) const
298{
299 const char* text = other._data;
300 return (find (pos, text));
301}
302
303int cmt_string::find_last_of (char c) const
304{
305 if (_data == 0) return (npos);
306
307 char* p = strrchr (_data, c);
308 if (p == 0) return (npos);
309 return (p - _data);
310}
311
312int cmt_string::find_last_of (const char* text) const
313{
314 if (_data == 0) return (npos);
315 if (text == 0) return (npos);
316
317 char* ptr = _data;
318 char* last = 0;
319 char* p;
320 while ((p = strstr (ptr, text)) != 0)
321 {
322 last = p;
323 ptr = p + 1;
324 }
325 if (last == 0) return (npos);
326 return (last - _data);
327}
328
329int cmt_string::find_last_of (const cmt_string& other) const
330{
331 const char* text = other._data;
332 return (find_last_of (text));
333}
334
335void cmt_string::erase (int pos)
336{
337 if ((_data == 0) ||
338 (pos < 0) ||
339 (pos >= _size))
340 {
341 return;
342 }
343 else
344 {
345 _data[pos] = 0;
346 _size = pos;
347 }
348}
349
350void cmt_string::erase (int pos, int length)
351{
352 if ((_data == 0) ||
353 (pos < 0) ||
354 (pos >= _size))
355 {
356 return;
357 }
358 else
359 {
360 if ((pos + length) >= _size)
361 {
362 _data[pos] = 0;
363 _size = pos;
364 }
365 else if (length > 0)
366 {
367 char* d = &_data[pos];
368 char* s = &_data[pos + length];
369 for (;;)
370 {
371 *d = *s;
372 if (*s == 0) break;
373 d++;
374 s++;
375 }
376 _size -= length;
377 }
378 }
379}
380
381
382void cmt_string::replace (const char* pattern, const char* replacement)
383{
384 if (_data == 0) return;
385 if (_size == 0) return;
386 if (pattern == 0) return;
387
388 if (replacement == 0) replacement = "";
389
390 if (pattern[0] == 0) return;
391
392 int pattern_length = strlen (pattern);
393
394 int replacement_length = strlen (replacement);
395 int delta = replacement_length - pattern_length;
396
397 int pos;
398
399 if ((pos = find (pattern)) != npos)
400 {
401 if (delta > 0)
402 {
403 // string will be enlarged
404 extend (delta);
405
406 char* src = &_data[_size];
407 char* dest = src + delta;
408 while (src > &_data[pos])
409 {
410 *dest = *src;
411 src--;
412 dest--;
413 }
414 }
415 else if (delta < 0)
416 {
417 // string will be shortened
418
419 char* src = &_data[pos + pattern_length];
420 char* dest = src + delta;
421 while (*src != 0)
422 {
423 *dest = *src;
424 src++;
425 dest++;
426 }
427 *dest = *src;
428 }
429
430 strncpy (&_data[pos], replacement, replacement_length);
431
432 _size += delta;
433 }
434}
435
436void cmt_string::replace (const cmt_string& pattern,
437 const cmt_string& replacement)
438{
439 const char* p_text = pattern._data;
440 const char* r_text = replacement._data;
441 cmt_string& me = *this;
442
443 me.replace (p_text, r_text);
444}
445
446void cmt_string::replace_all (const char* pattern, const char* replacement)
447{
448 if (_data == 0) return;
449 if (_size == 0) return;
450 if (pattern == 0) return;
451
452 if (replacement == 0) replacement = "";
453
454 if (pattern[0] == 0) return;
455
456 int pattern_length = strlen (pattern);
457
458 int replacement_length = strlen (replacement);
459 int delta = replacement_length - pattern_length;
460
461 int pos = 0;
462
463 while ((pos = find (pos, pattern)) != npos)
464 {
465 if (delta > 0)
466 {
467 // string will be enlarged
468 extend (delta);
469
470 char* src = &_data[_size];
471 char* dest = src + delta;
472 while (src > &_data[pos])
473 {
474 *dest = *src;
475 src--;
476 dest--;
477 }
478 }
479 else if (delta < 0)
480 {
481 // string will be shortened
482
483 char* src = &_data[pos + pattern_length];
484 char* dest = src + delta;
485 while (*src != 0)
486 {
487 *dest = *src;
488 src++;
489 dest++;
490 }
491 *dest = *src;
492 }
493
494 strncpy (&_data[pos], replacement, replacement_length);
495 pos += replacement_length;
496 _size += delta;
497 }
498}
499
500void cmt_string::replace_all (const cmt_string& pattern,
501 const cmt_string& replacement)
502{
503 const char* p_text = pattern._data;
504 const char* r_text = replacement._data;
505 cmt_string& me = *this;
506
507 me.replace_all (p_text, r_text);
508}
509
510void cmt_string::trim ()
511{
512 if (size () == 0) return;
513
514 int i = 0;
515
516 i = strspn (_data, " \t");
517 if (i > 0) erase (0, i);
518
519 for (i = _size - 1; i >= 0; i--)
520 {
521 char c = _data[i];
522 if ((c == ' ') || (c == '\t')) continue;
523 erase (i + 1);
524 break;
525 }
526}
527
528cmt_string cmt_string::substr (int pos) const
529{
530 if ((_data == 0) ||
531 (pos < 0) ||
532 (pos >= _size))
533 {
534 return ((cmt_string) "");
535 }
536 else
537 {
538 return ((cmt_string) &_data[pos]);
539 }
540}
541
542cmt_string cmt_string::substr (int pos, int length) const
543{
544 if ((_data == 0) ||
545 (pos < 0) ||
546 (pos >= _size))
547 {
548 return ((cmt_string) "");
549 }
550 else
551 {
552 cmt_string result (&_data[pos]);
553 result.erase (length);
554 return (result);
555 }
556}
557
558void cmt_string::substr (int pos, cmt_string& dest) const
559{
560 if ((_data == 0) ||
561 (pos < 0) ||
562 (pos >= _size))
563 {
564 dest = "";
565 }
566 else
567 {
568 dest = (const char*) &_data[pos];
569 }
570}
571
572void cmt_string::substr (int pos, int length, cmt_string& dest) const
573{
574 if ((_data == 0) ||
575 (pos < 0) ||
576 (pos >= _size))
577 {
578 dest = "";
579 }
580 else
581 {
582 dest = (const char*) &_data[pos];
583 dest.erase (length);
584 }
585}
586
587bool cmt_string::operator < (const char* text) const
588{
589 if (text == 0) return (false);
590 if (_data == 0) return (false);
591
592 if (strcmp (_data, text) < 0) return (true);
593 return (false);
594}
595
596bool cmt_string::operator < (const cmt_string& other) const
597{
598 const char* text = other._data;
599 const cmt_string& me = *this;
600
601 return (me < text);
602}
603
604bool cmt_string::operator == (const char* text) const
605{
606 if (text == 0)
607 {
608 if (_data == 0) return (true);
609 if (_size == 0) return (true);
610 return (false);
611 }
612 if (_data == 0)
613 {
614 if (text == 0) return (true);
615 if (text[0] == 0) return (true);
616 return (false);
617 }
618
619 if (strcmp (_data, text) == 0) return (true);
620 return (false);
621}
622
623bool cmt_string::operator == (const cmt_string& other) const
624{
625 const char* text = other._data;
626 const cmt_string& me = *this;
627
628 return (me == text);
629}
630
631bool cmt_string::operator != (const char* text) const
632{
633 const cmt_string& me = *this;
634
635 if (!(me == text)) return (true);
636 return (false);
637}
638
639bool cmt_string::operator != (const cmt_string& other) const
640{
641 const char* text = other._data;
642 const cmt_string& me = *this;
643
644 return (me != text);
645}
646
647bool cmt_string::operator > (const char* text) const
648{
649 if (text == 0) return (false);
650 if (_data == 0) return (false);
651
652 if (strcmp (_data, text) > 0) return (true);
653 return (false);
654}
655
656bool cmt_string::operator > (const cmt_string& other) const
657{
658 const char* text = other._data;
659 const cmt_string& me = *this;
660
661 return (me > text);
662}
663
664void cmt_string::extend (int n)
665{
666 if (_data != 0) n += _size;
667 allocate (n);
668}
669
670void cmt_string::allocate (int n)
671{
672 if ((n + 1) > _allocated)
673 {
674 static const int quantum = 128;
675 int frames = ((n + 1)/quantum) + 1;
676 _allocated = frames * quantum;
677
678#ifdef CMT_USE_NEW_DELETE
679 char* new_data = new char [_allocated + 1];
680#else
681 char* new_data = (char*) malloc (_allocated + 1);
682#endif
683
684
685 if (_data != 0)
686 {
687 strcpy (new_data, _data);
688
689#ifdef CMT_USE_NEW_DELETE
690 delete[] _data;
691#else
692 free (_data);
693#endif
694
695 _data = new_data;
696 }
697 else
698 {
699 new_data[0] = 0;
700 }
701
702 _data = new_data;
703 }
704}
705
706ostream& operator << (ostream& o, const cmt_string& s)
707{
708 o << (const char*) s;
709 return (o);
710}
711
712cmt_string operator + (const char* text, const cmt_string& s)
713{
714 cmt_string result = text;
715 result += s;
716 return (result);
717}
718
719cmt_string operator + (char c, const cmt_string& s)
720{
721 cmt_string result = c;
722 result += s;
723 return (result);
724}
725
726bool cmt_string::read (const cmt_string& file_name)
727{
728 FILE* f = fopen (file_name.c_str (), "rb");
729 if (f != NULL)
730 {
731 fseek (f, 0L, SEEK_END);
732 int size = ftell (f);
733 fseek (f, 0L, SEEK_SET);
734
735 allocate (size + 1);
736
737 fread (&_data[0], size, 1, f);
738
739 _data[size] = 0;
740 _size = size;
741
742 fclose (f);
743
744 return (true);
745 }
746 else
747 {
748 cmt_string& me = *this;
749 me = "";
750
751 return (false);
752 }
753}
754
755bool cmt_string::write (const cmt_string& file_name) const
756{
757 FILE* f = fopen (file_name.c_str (), "wb");
758 if (f != NULL)
759 {
760 write (f);
761 fclose (f);
762 return (true);
763 }
764 else
765 {
766 return (false);
767 }
768}
769
770void cmt_string::write (FILE* f) const
771{
772 fwrite (&_data[0], size (), 1, f);
773}
774
775void cmt_string::write (ostream& output)
776{
777 output.write (&_data[0], size ());
778}
779
Note: See TracBrowser for help on using the repository browser.