00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Basics.H"
00027 #include "Text.H"
00028
00029 #include "TextCommon.C"
00030
00031 bool Text::GCImpl() throw () { return true; }
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 static const char *StrConcat(const char *str1, const char *str2,
00042 bool str1mutable, bool str2mutable) throw ()
00043
00044
00045
00046
00047
00048 {
00049
00050 int len1 = strlen(str1), len2 = strlen(str2);
00051 char *res;
00052 if (len1 == 0) {
00053 return (str2mutable ? StrCopy(str2, len2) : str2);
00054 } else if (len2 == 0) {
00055 return (str1mutable ? StrCopy(str1, len1) : str1);
00056 } else {
00057 char *res = NEW_PTRFREE_ARRAY(char, len1 + len2 + 1);
00058 memcpy(res, str1, len1);
00059 memcpy(res + len1, str2, len2 + 1);
00060 return res;
00061 }
00062 }
00063
00064
00065 Text::Text(const Text& t) throw ()
00066 {
00067 this->s = t.s;
00068 }
00069
00070
00071 char *CharTexts[256] = { (char *)NULL, };
00072
00073 Text::Text(const char c) throw ()
00074 {
00075
00076
00077 assert(0 <= c && (c * sizeof(CharTexts[0])) < sizeof(CharTexts));
00078
00079 if (CharTexts[c] == NULL) {
00080 char *temp = NEW_PTRFREE_ARRAY(char, 2);
00081 temp[0] = c; temp[1] = '\0';
00082 CharTexts[c] = temp;
00083 }
00084 this->s = CharTexts[c];
00085 }
00086
00087
00088 Text::~Text() throw () { }
00089
00090
00091 Text& Text::operator = (const char* str) throw ()
00092 {
00093 this->s = StrCopy(str);
00094 return *this;
00095 }
00096
00097 Text& Text::operator = (const Text& t) throw ()
00098 {
00099 this->s = t.s;
00100 return *this;
00101 }
00102
00103
00104 bool operator == (const Text& t1, const Text& t2) throw ()
00105 {
00106 bool res;
00107 if (t1.s == t2.s) return true;
00108 if (res = (strcmp(t1.s, t2.s) == 0)) {
00109
00110
00111 ((Text&) t2).s = t1.s;
00112 }
00113 return res;
00114 }
00115
00116 bool operator != (const Text& t1, const Text& t2) throw ()
00117 {
00118 bool res;
00119 if (t1.s == t2.s) return false;
00120 if (!(res = (strcmp(t1.s, t2.s) != 0))) {
00121
00122
00123 ((Text&) t2).s = t1.s;
00124 }
00125 return res;
00126 }
00127
00128
00129 Text operator + (const Text& t1, const Text& t2) throw ()
00130 {
00131 return Text(StrConcat(t1.s, t2.s, false, false), (void*)1);
00132 }
00133
00134 Text operator + (const char* str, const Text& t) throw ()
00135 {
00136 return Text(StrConcat(str, t.s, true, false), (void*)1);
00137 }
00138
00139 Text operator + (const Text& t, const char* str) throw ()
00140 {
00141 return Text(StrConcat(t.s, str, false, true), (void*)1);
00142 }
00143
00144
00145 Text& Text::operator += (const char* str) throw ()
00146 {
00147 this->s = StrConcat(this->s, str, false, true);
00148 return *this;
00149 }
00150
00151 Text& Text::operator += (const Text& t) throw ()
00152 {
00153 this->s = StrConcat(this->s, t.s, false, false);
00154 return *this;
00155 }