00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <stdio.h>
00020 #include <string.h>
00021 #include <windows.h>
00022 #include <stdlib.h>
00023 #include <math.h>
00024
00025 #include "myString.h"
00026 #include "myException.h"
00027
00028
00029
00030 long MyString::GetSize()
00031 {
00032 return size;
00033 }
00034
00035 char *MyString::GetValue()
00036 {
00037 return value;
00038 }
00039
00040 MyString::MyString()
00041 {
00042 value = NULL;
00043 Zero();
00044 }
00045
00046 MyString::MyString(char letter)
00047 {
00048 value = NULL;
00049 *this=letter;
00050 }
00051
00052 MyString::MyString(int integer)
00053 {
00054 value = NULL;
00055 *this=integer;
00056 }
00057
00058 MyString::MyString(long linteger)
00059 {
00060 value = NULL;
00061 *this=linteger;
00062 }
00063
00064 MyString::MyString(float floating)
00065 {
00066 value = NULL;
00067 *this=floating;
00068 }
00069
00070 MyString::MyString(double lfloating)
00071 {
00072 value = NULL;
00073 *this=lfloating;
00074 }
00075
00076 MyString::MyString(char *string)
00077 {
00078 value = NULL;
00079 *this=string;
00080 }
00081
00082 MyString::MyString(MyString &string)
00083 {
00084 value = NULL;
00085 *this=string;
00086 }
00087
00088
00089
00090 void MyString::Delete()
00091 {
00092 if (value)
00093 {
00094 try
00095 {
00096 delete []value;
00097 }
00098 catch(int num)
00099 {
00100 }
00101 }
00102 size = 0;
00103 allocSize = 0;
00104 value = NULL;
00105 }
00106
00107
00108
00109 MyString & MyString::operator=(char letter)
00110 {
00111 Delete();
00112 size = 1;
00113 allocSize = 2;
00114 value = new char[allocSize];
00115 if (!value) throw MyExceptionMemory("MyString","operator=",allocSize);
00116 value[0]= letter;
00117 value[1]= '\0';
00118 return *this;
00119 }
00120
00121 MyString & MyString::operator=(int integer)
00122 {
00123 char temp[40];
00124 sprintf (temp,"%d",integer);
00125 *this = temp;
00126 return *this;
00127 }
00128
00129 MyString & MyString::operator=(long linteger)
00130 {
00131 char temp[80];
00132 sprintf (temp,"%d",linteger);
00133 *this = temp;
00134 return *this;
00135 }
00136
00137 MyString & MyString::operator=(float floating)
00138 {
00139 char temp[40];
00140 sprintf(temp,"%g",floating);
00141 *this = temp;
00142 return *this;
00143 }
00144
00145 MyString & MyString::operator=(double lfloating)
00146 {
00147 char temp[40];
00148 sprintf(temp,"%g",lfloating);
00149 *this = temp;
00150 return *this;
00151 }
00152
00153 MyString & MyString::operator=(char *string)
00154 {
00155 Delete();
00156 if (!string) return *this;
00157 size= (long)strlen(string);
00158 allocSize = size +1;
00159 value = new char[allocSize];
00160 if (!value) throw MyExceptionMemory("MyString","operator=(char *)",allocSize);
00161 strcpy(value,string);
00162 return *this;
00163 }
00164
00165 MyString & MyString::operator=(MyString &string)
00166 {
00167 Delete();
00168 size = string.size;
00169 allocSize = size +1;
00170 value = new char[allocSize];
00171 if (!value) throw MyExceptionMemory("MyString","operator=(MyString &)",allocSize);
00172 strcpy (value,string.value);
00173 return *this;
00174 }
00175
00176
00177
00178 BOOL MyString::operator==(char letter)
00179 {
00180 MyString temp = letter;
00181 return !strcmp (value,temp.value);
00182 }
00183
00184 BOOL MyString::operator==(int integer)
00185 {
00186 MyString temp = integer;
00187 return !strcmp (value,temp.value);
00188 }
00189
00190 BOOL MyString::operator==(long linteger)
00191 {
00192 MyString temp = linteger;
00193 return !strcmp (value,temp.value);
00194 }
00195
00196 BOOL MyString::operator==(float floating)
00197 {
00198 MyString temp = floating;
00199 return !strcmp (value,temp.value);
00200 }
00201
00202 BOOL MyString::operator==(double lfloating)
00203 {
00204 MyString temp = lfloating;
00205 return !strcmp (value,temp.value);
00206 }
00207
00208 BOOL MyString::operator==(char *string)
00209 {
00210 if (!string) return FALSE;
00211 return !strcmp (value,string);
00212 }
00213
00214 BOOL MyString::operator==(MyString &string)
00215 {
00216 return !strcmp (value,string.value);
00217 }
00218
00219
00220
00221 void MyString::operator+=(char letter)
00222 {
00223
00224 MyString temp = letter;
00225 *this += temp;
00226
00227
00228
00229
00230
00231 }
00232
00233 void MyString::operator+=(int integer)
00234 {
00235 MyString temp = integer;
00236 *this += temp;
00237 }
00238
00239 void MyString::operator+=(long linteger)
00240 {
00241 MyString temp = linteger;
00242 *this += temp;
00243 }
00244
00245 void MyString::operator+=(float floating)
00246 {
00247 MyString temp = floating;
00248 *this += temp;
00249 }
00250
00251 void MyString::operator+=(double lfloating)
00252 {
00253 MyString temp = lfloating;
00254 *this += temp;
00255 }
00256
00257 void MyString::operator+=(char *string)
00258 {
00259 if (!string) { *this; return; }
00260
00261 long addSize = (long)strlen(string);
00262 Resize (size+addSize,TRUE);
00263 strcat (value,string);
00264 size+= addSize;
00265 }
00266
00267
00268
00269 MyString operator+(MyString &string1,char *string2)
00270 {
00271 MyString temp = string1;
00272 if (!string2) return temp;
00273 temp += string2;
00274 return temp;
00275 }
00276
00277
00278
00279 MyString operator+(char *string1,MyString &string2)
00280 {
00281 MyString temp;
00282 if (!string1)
00283 {
00284 temp = string2;
00285 return temp;
00286 }
00287 temp = string1;
00288 temp += string2;
00289 return temp;
00290 }
00291
00292
00293
00294 MyString operator+(MyString &string,char letter)
00295 {
00296 MyString temp = string;
00297 temp += letter;
00298 return temp;
00299 }
00300
00301 MyString operator+(char letter,MyString &string)
00302 {
00303 MyString temp = letter;
00304 temp += string;
00305 return temp;
00306 }
00307
00308 MyString operator+(MyString &string,int integer)
00309 {
00310 MyString temp = string;
00311 temp += integer;
00312 return temp;
00313 }
00314
00315 MyString operator+(int integer,MyString &string)
00316 {
00317 MyString temp = integer;
00318 temp += string;
00319 return temp;
00320 }
00321
00322 MyString operator+(MyString &string,long linteger)
00323 {
00324 MyString temp = string;
00325 temp += linteger;
00326 return temp;
00327 }
00328
00329 MyString operator+(long linteger,MyString &string)
00330 {
00331 MyString temp = linteger;
00332 temp += string;
00333 return temp;
00334 }
00335
00336 MyString operator+(MyString &string,float floating)
00337 {
00338 MyString temp = string;
00339 temp += floating;
00340 return temp;
00341 }
00342
00343 MyString operator+(float floating,MyString &string)
00344 {
00345 MyString temp = floating;
00346 temp += string;
00347 return temp;
00348 }
00349
00350 MyString operator+(MyString &string,double lfloating)
00351 {
00352 MyString temp = string;
00353 temp += lfloating;
00354 return temp;
00355 }
00356
00357 MyString operator+(double lfloating,MyString &string)
00358 {
00359 MyString temp = lfloating;
00360 temp += string;
00361 return temp;
00362 }
00363
00364 MyString operator+(MyString &string1,MyString &string2)
00365 {
00366 MyString temp = string1;
00367 temp += string2;
00368 return temp;
00369 }
00370
00381 char &MyString::operator [] (int index)
00382 {
00383 static char error='\0';
00384 index = GetPositionFromLeft(index);
00385 if (index!=-1) return value[index];
00386 else return error;
00387
00388
00389
00390
00391
00392 }
00393
00394
00395
00396 MyString & operator << (MyString& string , char letter)
00397 {
00398 string += letter;
00399 return string;
00400 }
00401
00402 MyString & operator << (MyString& string , int integer)
00403 {
00404 string += integer;
00405 return string;
00406 }
00407
00408 MyString & operator << (MyString& string , long linteger)
00409 {
00410 string += linteger;
00411 return string;
00412 }
00413
00414 MyString & operator << (MyString& string , float floating)
00415 {
00416 string += floating;
00417 return string;
00418 }
00419
00420 MyString & operator << (MyString& string , double lfloating)
00421 {
00422 string += lfloating;
00423 return string;
00424 }
00425
00426 MyString & operator << (MyString& string1 , char *string2)
00427 {
00428 string1 += string2;
00429 return string1;
00430 }
00431
00432 MyString & operator << (MyString& string1 , MyString &string2)
00433 {
00434 string1 += string2;
00435 return string1;
00436 }
00437
00438
00439
00440 BOOL MyString::Resize()
00441 {
00442 return Resize((int)strlen(value),TRUE);
00443 }
00444
00445
00446
00447 BOOL MyString::Resize(int newSize,BOOL recopy)
00448 {
00449 if (newSize<0) newSize=0;
00450 char *newValue = new char[newSize+1];
00451 if (!newValue) throw MyExceptionMemory("MyString","Resize",newSize+1);
00452 if (recopy && value)
00453 {
00454 int curSize = min(newSize,allocSize-1);
00455 strncpy(newValue,value,newSize);
00456 newValue[curSize]='\0';
00457 Delete();
00458 size = curSize;
00459 allocSize = newSize+1;
00460 }
00461 else
00462 {
00463 Delete();
00464 size = 0;
00465 allocSize = newSize+1;
00466 newValue[0]='\0';
00467 }
00468 value = newValue;
00469 return TRUE;
00470 }
00471
00483 BOOL MyString::SubStringBeforToken(int numSubString,MyString &result,char *lstToken)
00484 {
00485 int indexCur=0;
00486 int posIndex = size;
00487 int sizeLstToken = (int)strlen(lstToken);
00488 int signe = numSubString<0 ? -1 : 1;
00489 for (int i=numSubString<0;i<size;i++)
00490 {
00491 for (int j=0;j<sizeLstToken;j++)
00492 {
00493 if (*this[i*size]==lstToken[j])
00494 {
00495 indexCur += signe;
00496 if (indexCur==numSubString)
00497 {
00498 posIndex = i-signe;
00499 CopyTo(result,i+signe,labs(posIndex-i));
00500 return TRUE;
00501 }
00502 }
00503 }
00504 }
00505 return FALSE;
00506 }
00507
00508
00509
00510 char * MyString::GetValue(int index)
00511 {
00512 if (index>=0 && index<size) return value+index;
00513 if (index<0 && index>=-size) return value+size+index;
00514
00515 MyString temp;
00516 temp <<"out of bounds: index <> [-"<<size<<";"<<size<<"]";
00517 throw MyException("MyString","GetValue[](int)",temp);
00518
00519 }
00520
00526 BOOL MyString::CopyTo(MyString &result,int index,int sizeToCopy)
00527 {
00528 int signe = index<0 ? -1 : 1;
00529 int indexReal = index+sizeToCopy*signe;
00530 if (sizeToCopy==-1) sizeToCopy = size-index;
00531 char oldLetter = operator[](indexReal);
00532 operator[](indexReal)='\0';
00533 result.Resize(sizeToCopy);
00534 result=GetValue(index);
00535 operator[](indexReal) = oldLetter;
00536 return TRUE;
00537 }
00538
00539
00540
00541 void MyString::SplitPath(MyString *drive,MyString *dir,MyString *file,MyString *ext,MyString *driveDir,MyString *fileExt)
00542 {
00543 char _drive[_MAX_DRIVE];
00544 char _dir[_MAX_DIR];
00545 char _file[_MAX_FNAME];
00546 char _ext[_MAX_EXT];
00547
00548 _splitpath(value,(drive||driveDir)?_drive:NULL,(dir||driveDir)?_dir:NULL,(file||fileExt)?_file:NULL,(ext||fileExt)?_ext:NULL);
00549
00550 if (drive) *drive=_drive;
00551 if (dir) *dir=_dir;
00552 if (file) *file=_file;
00553 if (ext) *ext=_ext;
00554 if (fileExt) { *fileExt<<clear<<_file<<_ext; }
00555 if (driveDir) { *driveDir<<clear<<_drive<<_dir; }
00556 }
00557
00558
00559
00560 long MyString::ToInteger()
00561 {
00562 long res;
00563 sscanf(value,"%d",&res);
00564 return res;
00565 }
00566
00567 float MyString::ToFloat()
00568 {
00569 float res;
00570 sscanf(value,"%f",&res);
00571 return res;
00572 }
00573
00574 double MyString::ToDouble()
00575 {
00576 double res;
00577 sscanf(value,"%lf",&res);
00578 return res;
00579 }
00580
00581
00582
00583 BOOL MyString::FormatToNoCtrl()
00584 {
00585 BOOL isChanged = FALSE;
00586 MyString temp;
00587 for (int i=0;i<size;i++)
00588 {
00589 if (value[i]>=32) temp+=value[i];
00590 else isChanged = TRUE;
00591 }
00592 *this=temp;
00593 return isChanged;
00594 }
00595
00596
00597
00598 BOOL MyString::FormatToLower()
00599 {
00600 BOOL isChanged = FALSE;
00601 for (int i=0;i<size;i++)
00602 if (!islower(value[i]))
00603 {
00604 value[i] = tolower(value[i]);
00605 isChanged = TRUE;
00606 }
00607 return isChanged;
00608 }
00609
00610
00611
00612 BOOL MyString::FormatToUpper()
00613 {
00614 BOOL isChanged = FALSE;
00615 for (int i=0;i<size;i++)
00616 if (!isupper(value[i]))
00617 {
00618 value[i] = toupper(value[i]);
00619 isChanged = TRUE;
00620 }
00621 return isChanged;
00622 }
00623
00624
00625
00626 BOOL MyString::IsVisibleText()
00627 {
00628 for (int i=0;i<size;i++)
00629 {
00630 if (value[i]>32 && value[i]!=255) return TRUE;
00631 }
00632 return FALSE;
00633 }
00634
00635
00636
00637 void MyString::AddRepetitiveFormat(char *matrise,int nbCopy)
00638 {
00639 for (int i=0;i<nbCopy;i++)
00640 {
00641 operator+=(matrise);
00642 }
00643 }
00644
00659 int MyString::GetPositionFromLeft(int pos)
00660 {
00661 pos = pos>=0? pos: size+pos;
00662 return pos<size? pos : -1;
00663 }
00664
00665 int MyString::GetPositionFromRight(int pos)
00666 {
00667 if (pos>=0) return -size+pos;
00668 else return pos;
00669 }
00670
00681 BOOL MyString::Delete(int pos,BOOL after,char letterToFind)
00682 {
00683 int posLeft = GetPositionFromLeft(pos);
00684 int posLeft2 = FindLetter(posLeft,after,letterToFind);
00685 if (posLeft2==-1) return FALSE;
00686 return Delete(pos,after,abs(posLeft-posLeft2)+1);
00687 }
00688
00689 BOOL MyString::Delete(int pos,BOOL after,int nbLetter)
00690 {
00691 int posLeft = GetPositionFromLeft(pos);
00692 if (!after) posLeft-=nbLetter-1;
00693 strncpy(value+posLeft,value+posLeft+nbLetter,size-posLeft-nbLetter);
00694 return Resize(size-nbLetter,TRUE);
00695 }
00696
00708 BOOL MyString::Add(int pos,BOOL after,char letter)
00709 {
00710 MyString temp;
00711 int posLeft = GetPositionFromLeft(pos);
00712 CopyTo(temp,0,posLeft+!after);
00713 temp<<letter;
00714 temp<<value+posLeft+!after+1;
00715 operator=(temp);
00716 return TRUE;
00717 }
00718
00719 BOOL MyString::Add(int pos,BOOL after,int integer)
00720 {
00721 return TRUE;
00722 }
00723 BOOL MyString::Add(int pos,BOOL after,long linteger)
00724 {
00725 return TRUE;
00726 }
00727 BOOL MyString::Add(int pos,BOOL after,float floating)
00728 {
00729 return TRUE;
00730 }
00731 BOOL MyString::Add(int pos,BOOL after,double lfloating)
00732 {
00733 return TRUE;
00734 }
00735 BOOL MyString::Add(int pos,BOOL after,char *string)
00736 {
00737 return TRUE;
00738 }
00739 BOOL MyString::Add(int pos,BOOL after,MyString &string)
00740 {
00741 return TRUE;
00742 }
00743
00752 int MyString::FindLetter(int pos,BOOL after,char letter)
00753 {
00754 int posLeft = GetPositionFromLeft(pos);
00755
00756 if (after)
00757 {
00758 for (int i=posLeft;i<size;i++)
00759 if (value[i]==letter) return i;
00760 }
00761 else
00762 {
00763 for (int i=posLeft;i>=0;i--)
00764 if (value[i]==letter) return i;
00765 }
00766 return -1;
00767 }
00768
00776 int MyString::FindLetter(char letter)
00777 {
00778 return FindLetter(0,TRUE,letter);
00779 }
00780
00784 BOOL MyString::AddFormat(char *format,...)
00785 {
00786 va_list args;
00787 int len;
00788 char *buffer;
00789 va_start(args,format);
00790 len = _vscprintf( format, args )+ 1;
00791 buffer = (char *)malloc(len * sizeof(char));
00792 if (!buffer) return FALSE;
00793 vsprintf(buffer,format,args);
00794 operator+=(buffer);
00795 free(buffer);
00796 return TRUE;
00797 }
00798
00802 MyString MyString::Mids(int beginPos,int sizeToCopy)
00803 {
00804 MyString result;
00805 if (beginPos+sizeToCopy>size) return result;
00806 char oldlLetter = value[beginPos+sizeToCopy];
00807 value[beginPos+sizeToCopy]='\0';
00808 result=value+beginPos;
00809 value[beginPos+sizeToCopy]=oldlLetter;
00810 return result;
00811 }
00812
00813 BOOL MyString::Format(char *format,...)
00814 {
00815 va_list args;
00816 int len;
00817 char *buffer;
00818 va_start(args,format);
00819 len = _vscprintf( format, args )+ 1;
00820 buffer = (char *)malloc(len * sizeof(char));
00821 if (!buffer) return FALSE;
00822 vsprintf(buffer,format,args);
00823 operator=(buffer);
00824 free(buffer);
00825 return TRUE;
00826 }
00827
00832 BOOL MyString::IsBeginWith(char *model)
00833 {
00834 return !strncmp(value,model,strlen(model));
00835 }
00836
00843 char * MyString::TestSubString(char *text,BOOL caseSensitive)
00844 {
00845 if (!caseSensitive)
00846 {
00847 MyString lowerThis(*this),lowerText(text);
00848 lowerThis.FormatToLower();
00849 lowerText.FormatToLower();
00850 return strstr(lowerText,lowerThis);
00851 }
00852 return strstr(text,value);
00853 }
00857 void MyString::EnterHexaNumber(int value)
00858 {
00859 int reste;
00860 char letter;
00861 Zero();
00862 while (value)
00863 {
00864 reste = value%16;
00865 value/=16;
00866 letter=reste>9?'A'+reste-10:'0'+reste;
00867 operator+=(letter);
00868 }
00869 Reverse();
00870 }
00874 void MyString::EnterBinNumber(int value)
00875 {
00876 int reste;
00877 Zero();
00878 while (value)
00879 {
00880 reste = value%2;
00881 value/=2;
00882 operator+=((char)(reste+'0'));
00883 }
00884 Reverse();
00885 }
00889 void MyString::Reverse()
00890 {
00891 if (size<2) return;
00892 char letter;
00893 char *begin,*end;
00894 begin=value;
00895 end=value+size-2;
00896
00897 for (int i=0;i<(size/2);i++)
00898 {
00899 letter = *begin;
00900 *begin=*end;
00901 *end=letter;
00902 begin++;
00903 end--;
00904 }
00905 }
00906
00907
00915 MyString & operator << (MyString& in ,FncManipulateur fnc)
00916 {
00917 fnc(in);
00918 return in;
00919 }
00920
00921 void clear (MyString &in)
00922 {
00923 in.Zero();
00924 }
00925
00926 void ret (MyString &in)
00927 {
00928 in<<"\n";
00929 }