00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <cstdio>
00012 #include <cstdlib>
00013 #include <cstring>
00014
00015 #include "analysis/Midnight.h"
00016
00017 #define changeBlockSize realloc
00018 #define freeBlock free
00019 #define allocateBlock malloc
00020
00021 static void DeleteString(char*);
00022 static char* DuplicateString(const char*);
00023 static char* ConcatenateString(char*,const char*);
00024 static char* Create(int);
00025
00026 #define MINIMUM(a,b) ((a)<(b)?a:b)
00027
00029 Midnight::MString::MString(
00030 )
00031 :fString(NULL)
00034 {
00035 fString = DuplicateString("");
00036 }
00038 Midnight::MString::MString(
00039 const char* aString
00040 )
00043 {
00044 fString = DuplicateString(aString==NULL?"":aString);
00045 }
00047 Midnight::MString::MString(
00048 const MString& aFrom
00049 )
00052 {
00053 fString = DuplicateString(aFrom.fString);
00054 }
00056 Midnight::MString::~MString(
00057 )
00060 {
00061 DeleteString(fString);
00062 }
00064 const char* Midnight::MString::data(
00065 ) const
00068 {
00069 return fString;
00070 }
00072 int Midnight::MString::length(
00073 ) const
00076 {
00077 if(fString==NULL) return 0;
00078 return strlen(fString);
00079 }
00081 void Midnight::MString::resize(
00082 int aLength
00083 )
00085
00087
00088 if(fString==NULL) return;
00089 if(aLength<0) return;
00090 int l = strlen(fString);
00091 if(aLength<l) {
00092 fString[aLength] = '\0';
00093 } else {
00094 char* s = Create(aLength-l);
00095 if(s!=NULL) {
00096 fString = ConcatenateString(fString,s);
00097 freeBlock(s);
00098 }
00099 }
00100 }
00102 Midnight::MString& Midnight::MString::replace(
00103 int aStart
00104 ,int aLength
00105 ,const MString& aString
00106 )
00109 {
00110 if(fString==NULL) return *this;
00111 if(aString.fString==NULL) return *this;
00112 if( (aStart<0) || (aStart>=length()) ) return *this;
00113 int begin = aStart;
00114 int end = MINIMUM(aStart + aLength - 1,length()-1);
00115 int l = aString.length();
00116 int pos = 0;
00117 for(int count=begin;count<=end;count++,pos++) {
00118 if(pos<l)
00119 fString[count] = aString.fString[pos];
00120 else
00121 fString[count] = ' ';
00122 }
00123 return *this;
00124 }
00126 Midnight::MString& Midnight::MString::operator +=(
00127 const char* aString
00128 )
00131 {
00132 fString = ConcatenateString(fString,aString);
00133 return *this;
00134 }
00136 Midnight::MString& Midnight::MString::operator +=(
00137 const MString& aString
00138 )
00141 {
00142 *this += aString.fString;
00143 return *this;
00144 }
00146 Midnight::MString& Midnight::MString::operator =(
00147 const char* aString
00148 )
00151 {
00152 if((fString!=NULL) && (aString==fString) ) return *this;
00153 DeleteString(fString);
00154 fString = DuplicateString(aString==NULL?"":aString);
00155 return *this;
00156 }
00158 Midnight::MString& Midnight::MString::operator =(
00159 const MString& aFrom
00160 )
00163 {
00164 return (*this = aFrom.fString);
00165 }
00167 Midnight::MString& Midnight::MString::operator =(
00168 char aChar
00169 )
00172 {
00173 DeleteString(fString);
00174 fString = Create(1);
00175 fString[0] = aChar;
00176 return *this;
00177 }
00179 Midnight::MString::operator const char*(
00180 ) const
00183 {
00184 return fString;
00185 }
00187 char& Midnight::MString::operator[](
00188 int aIndex
00189 )
00191
00193
00194 if((aIndex<0)||(aIndex>=length())) {
00195 printf("MString::operator[] : bad index %d %d\n",aIndex,length());
00196
00197 aIndex = 0;
00198 }
00199 return fString[aIndex];
00200 }
00202 char Midnight::MString::operator[](
00203 int aIndex
00204 ) const
00207 {
00208 if((aIndex<0)||(aIndex>=length())) {
00209 printf("MString::operator[] : bad index %d %d\n",aIndex,length());
00210
00211 aIndex = 0;
00212 }
00213 return fString[aIndex];
00214 }
00216 char& Midnight::MString::operator()(
00217 int aIndex
00218 )
00220
00222
00223 return (*this)[aIndex];
00224 }
00226 char Midnight::MString::operator()(
00227 int aIndex
00228 ) const
00231 {
00232 return (*this)[aIndex];
00233 }
00235 Midnight::MString Midnight::MString::operator()(
00236 int aStart
00237 ,int aLength
00238 )
00241 {
00242 MString s;
00243 if(fString==NULL) return s;
00244 if( (aStart<0) || (aStart>=length()) ) return s;
00245 int begin = aStart;
00246 int end = MINIMUM(aStart + aLength - 1,length()-1);
00247 s.fString = Create(end - begin + 1);
00248 int pos = 0;
00249 for(int count=begin;count<=end;count++,pos++) {
00250 s.fString[pos] = fString[count];
00251 }
00252 return s;
00253 }
00255 int operator ==(
00256 const Midnight::MString& a1
00257 ,const Midnight::MString& a2
00258 )
00261 {
00262 if( a1.fString == a2.fString) return 1;
00263 if( (a1.fString==NULL) || (a2.fString==NULL) ) return 0;
00264 return (strcmp(a1.fString,a2.fString)==0 ? 1: 0);
00265 }
00267 int operator !=(
00268 const Midnight::MString& a1
00269 ,const Midnight::MString& a2
00270 )
00273 {
00274 return (a1==a2 ? 0 : 1);
00275 }
00277 int operator ==(
00278 const Midnight::MString& a1
00279 ,const char* a2
00280 )
00283 {
00284 if( a1.fString == a2) return 1;
00285 if( (a1.fString==NULL) || (a2==NULL) ) return 0;
00286 return (strcmp(a1.fString,a2)==0 ? 1: 0);
00287 }
00289 int operator !=(
00290 const Midnight::MString& a1
00291 ,const char* a2
00292 )
00295 {
00296 return (a1==a2 ? 0 : 1);
00297 }
00301 char* ConcatenateString (
00302 char* aString
00303 ,const char* aFrom
00304 )
00307 {
00308 if(aFrom==NULL) return aString;
00309 if(aString==NULL) {
00310 aString = DuplicateString(aFrom);
00311 } else if(*aString=='\0') {
00312 DeleteString(aString);
00313 aString = DuplicateString(aFrom);
00314 } else {
00315 int lto = strlen(aString);
00316 int lfrom = strlen(aFrom);
00317 int length = lto+lfrom;
00318 char* str =
00319 (char*)changeBlockSize(aString,(size_t)((length+1)*sizeof(char)));
00320 if(str==NULL) return aString;
00321 str[length] = '\0';
00322 aString = str;
00323 strncpy(aString+lto,aFrom,lfrom);
00324 aString[lto+lfrom] = '\0';
00325 }
00326 return aString;
00327 }
00329 static void DeleteString(
00330 char* This
00331 )
00334 {
00335 if(This==NULL) return;
00336 freeBlock(This);
00337 }
00339 static char* DuplicateString(
00340 const char* This
00341 )
00344 {
00345 if(This==NULL) return NULL;
00346 int length = strlen(This);
00347 char* string = (char*)allocateBlock((length+1)*sizeof(char));
00348 if(string==NULL) return NULL;
00349 string[length] = '\0';
00350 return strcpy(string,This);
00351 }
00353 static char* Create(
00354 int a_length
00355 )
00358 {
00359 if(a_length<=0) a_length = 0;
00360 char* string = (char*)allocateBlock((a_length+1)*sizeof(char));
00361 if(string==NULL) return NULL;
00362 string[a_length] = '\0';
00363 for(int count=0;count<a_length;count++) string[count] = ' ';
00364 return string;
00365 }
00366