Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

MyString.cpp

Go to the documentation of this file.
00001 /* *************************************************************************************
00002         Writer:         Sebastien Bloc
00003         Copyright:      2003-2004
00004         eMail:          sebastien.bloc@free.fr
00005         URL:            http://mignonsoft.free.fr
00006 
00007         This program is free software; you can redistribute it and/or
00008         modify it under the terms of the GNU General Public License
00009         as published by the Free Software Foundation; either version 2
00010         of the License, or (at your option) any later version.
00011 
00012         This program is distributed in the hope that it will be useful,
00013         but WITHOUT ANY WARRANTY; without even the implied warranty of
00014         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015         GNU General Public License for more details.
00016         http://www.gnu.org/copyleft/gpl.html
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) // string.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; // pour: s=t=u="coucou";
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) // string.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; // pour: s=t=u="coucou";
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         // Celle solution n'inserais pas les '\0'
00224         MyString temp = letter;
00225         *this += temp;
00226 
00227         // Cette solution insert le '\0' mais les strcpy ne repsect plus alors le '\0'
00228         // Resize (size+1,TRUE);
00229         // value[size]=letter;
00230         // size+= 1;
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         MyString temp;
00389         temp <<"out of bounds: index <> [-"<<size<<";"<<size<<"]";
00390         throw CMyException("MyString","operator[](int)",temp);
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; // _vscprintf doesn't count terminating '\0'
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; // _vscprintf doesn't count terminating '\0'
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 }

Generated on Fri Aug 20 19:19:48 2004 for 3d Controls by doxygen 1.3.6