azagaros

CString Class

Apr 6th, 2011
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.45 KB | None | 0 0
  1. #include<cstring>
  2. #include<iostream>
  3. #include<ostream>
  4. #include<istream>
  5. #include<cstdlib>
  6. #include<cctype>
  7.  
  8. class CString
  9. {
  10.     private:
  11. //        static bool m_bWide;
  12.         char *m_pString; // the maintained string.
  13. //        wchar_t *m_pWideString;
  14. //        int m_nLength;
  15.  
  16.     protected:
  17.     public:
  18.         CString();
  19.         CString(const CString &cString);      // Copy Constructor
  20.         CString(const char *pString);         // Char ptr..
  21. //        CString(wchar_t *pWideString);  //wide string stuff...
  22.         char* c_str() {return m_pString;}
  23.         void Format(char *pFormatString, ...); // the c printf
  24. //        Format(wchar_t *pFormatString, ...); // the wide version..
  25. //        void Format(CString &cString, ...);   // the CString version...
  26.  
  27. //        bool IsWide() {return m_bWide;}
  28.         bool Empty();                      // tel me this is empty..
  29.         int Find(char cChar, int nStart = 0); // forward find starting at nStart  non wide...
  30.         int RevFind(char cChar, int nStart = 0); //Reverse find starting at nStart none wide
  31. //        int Find(wchar_t *pString, int nStart = 0);
  32. //        int RevFind(wchar_t *pString, int nStart = 0);
  33.         void MakeLower(); // make lower case
  34.         void MakeUpper(); // make Upper Case
  35.         char* Substring(int nStart, int nEnd = 0);
  36.         int Length() {return strlen(m_pString);}
  37.         void ClearStr();
  38.  
  39.         CString& operator=(CString &cString);
  40.         CString& operator=(const char *pString);
  41.         CString& operator=(char nChar);
  42.  
  43.         CString& operator+(CString &cString);
  44.         CString& operator+(const char *pString);
  45.         CString& operator+(char cChar);
  46.         friend CString operator+(char *s, CString &obj);
  47.  
  48.         CString& operator+=(CString &str);
  49.         CString& operator+=(const char *pString);
  50.         CString& operator+=(char cChar);
  51.         friend CString operator+=(char *s, CString &obj);
  52.  
  53.         int operator==(CString &obj) {return !strcmp(m_pString, obj.m_pString);}
  54.         int operator!=(CString &obj) {return strcmp(m_pString, obj.m_pString);}
  55.         int operator< (CString &obj) {return strcmp(m_pString, obj.m_pString) < 0;}
  56.         int operator> (CString &obj) {return strcmp(m_pString, obj.m_pString) > 0;}
  57.         int operator<=(CString &obj) {return strcmp(m_pString, obj.m_pString) <= 0;}
  58.         int operator>=(CString &obj) {return strcmp(m_pString, obj.m_pString) >= 0;}
  59.  
  60.         /* relational operators between CStrings object and a quoted character string.
  61.         Note that the operators could just as easily return bool, rather than int */
  62.  
  63.         int operator==(char *s) {return !strcmp(m_pString, s);}
  64.         int operator!=(char *s) {return strcmp(m_pString, s);}
  65.         int operator< (char *s) {return strcmp(m_pString, s) < 0;}
  66.         int operator> (char *s) {return strcmp(m_pString, s) > 0;}
  67.         int operator<=(char *s) {return strcmp(m_pString, s) <= 0;}
  68.         int operator>=(char *s) {return strcmp(m_pString, s) >= 0;}
  69.  
  70.         friend std::ostream& operator<<(std::ostream &stream, CString &obj);
  71. //        friend istream &operator>>(istream &stream, CString &obj);
  72.  
  73.         char operator[](unsigned int nIndex)
  74.         {
  75.             if(nIndex <= strlen(m_pString))
  76.                 return m_pString[nIndex];
  77.             else
  78.                 return '\0';
  79.         }
  80.         virtual ~CString();
  81. };
  82.  
  83. /***************************************************************************************/
  84.  
  85. CString::CString()
  86. {
  87.     // default construtor
  88.     //    m_bWide = false;
  89.     m_pString = new char[1];
  90.     m_pString[0] = 0;
  91. //    m_pWideString = NULL;
  92. }
  93.  
  94. CString::~CString()
  95. {
  96.     if(m_pString)
  97.         delete [] m_pString;
  98. //    if(m_pWideString)
  99. //        delete [] m_pWideString;
  100. }
  101.  
  102. CString::CString(const CString &cString)
  103. {
  104.     // copy constructor
  105.     int newlen =strlen (cString.m_pString) +1;
  106.     std::cout << "CString Copy Constructor:" << cString.m_pString << std::cout;
  107.     m_pString = new char[newlen];
  108.     strcpy (m_pString, cString.m_pString);
  109. }
  110.  
  111. CString::CString(const char *pString)
  112. {
  113.     m_pString = new char[strlen(pString)+1];
  114.     strcpy (m_pString, pString);
  115. }
  116.  
  117. CString& CString::operator=(CString &cString)
  118. {
  119.     std::cout << "operator= &cString = " << cString << std::endl;
  120.     if(this==&cString) return *this;
  121.     std::cout << "2 operator= &cString = " << cString << std::endl;
  122.     delete [] m_pString;
  123.     int nLen = strlen(cString.m_pString)+1;
  124. //    int nLen = cString.Length();
  125.     m_pString = new char[nLen];
  126. //    std::cout << "3 operator= &cString.m_pString = " << cString.m_pString << "(" << nLen << ")"<< std::endl;
  127.     strcpy(m_pString, cString.c_str());
  128. //    std::cout << "4 operator= this.m_pString" << m_pString << std::endl;
  129.     return *this;
  130. }
  131.  
  132. CString& CString::operator=(const char *pString)
  133. {
  134.     delete [] m_pString;
  135.     m_pString = new char[strlen(pString) +1];
  136.     strcpy (m_pString, pString);
  137.     return *this;
  138.  
  139. }
  140.  
  141. CString& CString::operator=(char nChar)
  142. {
  143.     delete [] m_pString;
  144.     m_pString = new char[2];
  145.     m_pString[0] = nChar;
  146.     m_pString[1] = 0;
  147.     return *this;
  148.  
  149. }
  150. CString& CString::operator+(CString &cString)
  151. {
  152.     char* pTmp = new char[strlen(m_pString)+1];
  153.     strcpy(pTmp, m_pString);
  154.     int nLen = strlen(m_pString) + strlen(cString.c_str()) +1;
  155.     delete [] m_pString;
  156.     m_pString = new char[nLen];
  157.     strcpy(m_pString, pTmp);
  158.     strcat(m_pString, cString.c_str());
  159.     return *this;
  160.  
  161. }
  162.  
  163. CString& CString::operator+(char cChar)
  164. {
  165.     char* pTmp = new char[strlen(m_pString)+1];
  166.     strcpy(pTmp, m_pString);
  167.     int nLen = strlen(m_pString) + sizeof(cChar) +1;
  168.     delete [] m_pString;
  169.     m_pString = new char[nLen];
  170.     strcpy(m_pString, pTmp);
  171.     nLen = strlen(m_pString);
  172.     m_pString[nLen] = cChar;
  173.     m_pString[nLen+1] = 0;
  174.     return *this;
  175. }
  176.  
  177. CString& CString::operator+(const char *pString)
  178. {
  179.     char* pTmp = new char[strlen(m_pString)+1];
  180.     strcpy(pTmp, m_pString);
  181.     int nLen = strlen(m_pString) + strlen(pString)+1;
  182.     delete [] m_pString;
  183.     m_pString = new char[nLen];
  184.     strcpy(m_pString, pTmp);
  185.     strcat(m_pString, pString);
  186.     return *this;
  187. }
  188.  
  189. // the friend function.
  190. CString operator+(char *pString, CString &cStr)
  191. {
  192.     // CString =
  193.     int nLen = strlen(pString)+strlen(cStr.c_str()) +1;
  194.     CString strTmp;
  195.     delete [] strTmp.m_pString;
  196.     strTmp.m_pString = new char[nLen];
  197.     strcpy(strTmp.m_pString, pString);
  198.     strcpy(strTmp.m_pString, cStr.c_str());
  199.     return strTmp;
  200.     // friend function...
  201. }
  202.  
  203. bool CString::Empty()
  204. {
  205.     bool bEmpty = false; // tel me this is empty..
  206.     if(!m_pString) bEmpty = true;
  207.     else if(m_pString[0] == '\0') bEmpty = true;
  208.     return bEmpty;
  209. }
  210.  
  211. int CString::Find(char cChar, int nStart)
  212. {
  213.     // forward find
  214.     char *pString = &m_pString[nStart];
  215.     int nPos = nStart;
  216.  
  217.     while(pString)
  218.     {
  219.         if(*pString == cChar)
  220.             return nPos;
  221.         ++nPos;
  222.         ++pString;
  223.     }
  224.     return -1;
  225.     // forward find starting at nStart  non wide...
  226. }
  227.  
  228. int CString::RevFind(char cChar, int nStart )
  229. {
  230.     //Reverse find starting at nStart none wide
  231.     int nPos = nStart;
  232.     if(nPos== 0)
  233.     {
  234.         nPos = strlen(m_pString);
  235.     }
  236.     char *pString = &m_pString[nPos-1];
  237.  
  238.     while((nPos>-1)&&(pString))
  239.     {
  240.         if(*pString == cChar)
  241.             return nPos;
  242.         --nPos;
  243.         --pString;
  244.     }
  245.     return -1;
  246. }
  247. /*
  248. void CString::Format(CString &strInFormat, ...)
  249. {
  250.     va_list marker;
  251.  
  252.     CString strOutput;
  253.     char chr;
  254.     CString strFormat;
  255.     int nIndex;
  256.     CString strSection.
  257.  
  258.     va_start(marker, strFormat);
  259.  
  260.  
  261.     while(chr = strFormat[nIndex])
  262.     {
  263.         if(chr == '%')
  264.         {
  265.             // format code
  266.             bfound = false;
  267. //          pChar++; // increment past the '%'
  268.             while((!bfound)&&(pChar))
  269.             {
  270.                 chr = *pChar++;
  271.                 *pCode = chr;
  272.                 pCode++;
  273.                 switch(chr)
  274.                 {
  275.                     case 'd':
  276.                     case 'x':
  277.                     case 'o':
  278.                     case 'u':
  279.                         *pCode++ = 0;
  280.                         nValue = va_arg(marker, unsigned long);
  281.                         sprintf(pString, ptCode, nValue);
  282.                         bfound = true;
  283.                         break;
  284.                     case 'c':
  285.                         *pCode++ = 0;
  286.                         cChar = va_arg(marker, char);
  287.                         sprintf(pString, ptCode, cChar);
  288.                         bfound = true;
  289.                         break;
  290.                     case 'e':
  291.                     case 'f':
  292.                     case 'g':
  293.                         *pCode++ = 0;
  294.                         fValue = va_arg(marker, double);
  295.                         sprintf(pString, ptCode, fValue);
  296.                         bfound = true;
  297.                         break;
  298.                     case 's':
  299.                         *pCode++ = 0;
  300.                         pTmpString = va_arg(marker,  char*);
  301.                         strcpy(pString, pTmpString);
  302.                         bfound = true;
  303.                         break;
  304.                     case '%':
  305.                         *pCode++ = *pChar++;
  306.                         *pCode = 0;
  307.                         pString[0] = '%';
  308.                         pString[1] = 0;
  309.                         bfound = true;
  310.                         break;
  311.                     default:
  312. //                        *pCode= chr;
  313. //                        pCode++;
  314.                         break;
  315.                 }
  316.             }
  317. //            std::cout << "pString =" << pString << std::endl;
  318. //          std::cout << "pCode =" << ptCode << std::endl;
  319.             if(bfound)
  320.             {
  321.                 // add it to the buffer...
  322.                 strOutput+=pString;
  323.             }
  324.  
  325.         }
  326.         else
  327.         {
  328.             // add char to output buffer
  329.             strOutput+=chr;
  330.             //chr = *pChar++;
  331.         }
  332.     } // while
  333.  
  334.     va_end(marker);
  335.     int nLen = strOutput.Length();
  336.     delete [] m_pString;
  337.     m_pString = new char[nLen+1];
  338.     strcpy(m_pString, strOutput.m_pString);
  339.  
  340. }
  341. */
  342. void CString::Format(char *pFormatString, ...)
  343. {
  344.     // this Sets up a format of the string...MFC CString.Format is it
  345.     // Should except any known to my doc of Printf/Sprintf
  346.     va_list marker;
  347.  
  348.     CString strOutput;
  349.  
  350.     char *pChar = pFormatString;
  351.  
  352.     va_start(marker, pFormatString);
  353.  
  354.     char *pString = new char[256]; // this will be the buffer we dump into sprintfs into
  355.     char *pCode = new char[25]; // the format code for the sprintf...
  356.     char *ptCode = pCode;
  357.     double fValue;  // holder for floating points...
  358.     unsigned long nValue; // holder for integers....
  359.     char *pTmpString; // holder for string pointers...
  360.     bool bfound;
  361. //    char cChar;
  362.     char chr;
  363.  
  364.     while(chr = *pChar++)
  365.     {
  366.         if(chr == '%')
  367.         {
  368.             // format code */
  369.             pCode = ptCode;
  370.             *pCode = chr; // put the "%" on the code..
  371.             pCode++;
  372.             bfound = false;
  373. //          pChar++; // increment past the '%'
  374.             while((!bfound)&&(pChar))
  375.             {
  376.                 chr = *pChar++;
  377.                 *pCode = chr;
  378.                 pCode++;
  379.                 switch(chr)
  380.                 {
  381.                     case 'd':
  382.                     case 'x':
  383.                     case 'o':
  384.                     case 'u':
  385.                     case 'c':
  386.                         *pCode++ = 0;
  387.                         nValue = va_arg(marker, unsigned long long);
  388.                         sprintf(pString, ptCode, nValue);
  389.                         bfound = true;
  390.                         break;
  391. //                    case 'c':
  392. /*                        *pCode++ = 0;
  393.                         cChar = va_arg(marker, char);
  394.                         sprintf(pString, ptCode, cChar);
  395.                         bfound = true;
  396.                         break;
  397. */
  398.                     case 'e':
  399.                     case 'f':
  400.                     case 'g':
  401.                         *pCode++ = 0;
  402.                         fValue = va_arg(marker, double);
  403.                         sprintf(pString, ptCode, fValue);
  404.                         bfound = true;
  405.                         break;
  406.                     case 's':
  407.                         *pCode++ = 0;
  408.                         pTmpString = va_arg(marker,  char*);
  409.                         strcpy(pString, pTmpString);
  410.                         bfound = true;
  411.                         break;
  412.                     case '%':
  413.                         *pCode++ = *pChar++;
  414.                         *pCode = 0;
  415.                         pString[0] = '%';
  416.                         pString[1] = 0;
  417.                         bfound = true;
  418.                         break;
  419.                     default:
  420. //                        *pCode= chr;
  421. //                        pCode++;
  422.                         break;
  423.                 }
  424.             }
  425. //            std::cout << "pString =" << pString << std::endl;
  426. //          std::cout << "pCode =" << ptCode << std::endl;
  427.             if(bfound)
  428.             {
  429.                 // add it to the buffer...
  430.                 strOutput+=pString;
  431.             }
  432.  
  433.         }
  434.         else
  435.         {
  436.             // add char to output buffer
  437.             strOutput+=chr;
  438.             //chr = *pChar++;
  439.         }
  440.     } // while
  441.  
  442.     va_end(marker);
  443.     int nLen = strOutput.Length();
  444.     delete [] m_pString;
  445.     m_pString = new char[nLen+1];
  446.     strcpy(m_pString, strOutput.m_pString);
  447. }
  448.  
  449. char* CString::Substring(int nStart, int nEnd)
  450. {
  451.     // substring of the current string.
  452.     if(!nEnd)
  453.     {
  454.         nEnd= strlen(m_pString);
  455.     }
  456.     nStart--; // subtract 1 for zero base....
  457.     char *pStart = &m_pString[nStart];
  458.     char *pEnd = &m_pString[nEnd];
  459.     int nLen = nEnd - nStart;
  460.     char *tmpString;
  461.     tmpString = new char[nLen+1];
  462.     char *pDest = tmpString;
  463.     while(pStart != pEnd)
  464.     {
  465.         *pDest = *pStart;
  466.         ++pDest;
  467.         ++pStart;
  468.     }
  469.  
  470.     tmpString[nLen] = '\0';
  471. //    std::cout << "tmp:=" << tmpString << std::endl;;
  472.     return tmpString;
  473. }
  474.  
  475. std::ostream &operator<<(std::ostream &stream, CString &obj)
  476. {
  477.    stream << obj.c_str();
  478.    return stream;
  479. }
  480.  
  481. CString& CString::operator+=(CString &str)
  482. {
  483.     // Cstring += CString
  484.     char* pTmp = new char[strlen(m_pString)+1];
  485.     strcpy(pTmp, m_pString);
  486.     int nLen = strlen(m_pString) + strlen(str.c_str()) +1;
  487.     delete [] m_pString;
  488.     m_pString = new char[nLen];
  489.     strcpy(m_pString, pTmp);
  490.     strcat(m_pString, str.c_str());
  491.     return *this;
  492. }
  493.  
  494. CString& CString::operator+=(const char *pString)
  495. {
  496.     //CString += char *
  497.     char* pTmp = new char[strlen(m_pString)+1];
  498.     strcpy(pTmp, m_pString);
  499.     int nLen = strlen(m_pString) + strlen(pString)+1;
  500.     delete [] m_pString;
  501.     m_pString = new char[nLen];
  502.     strcpy(m_pString, pTmp);
  503.     strcat(m_pString, pString);
  504.     return *this;
  505. }
  506.  
  507. CString& CString::operator+=(char cChar)
  508. {
  509.     // CString += char
  510.     char* pTmp = new char[strlen(m_pString)+1];
  511.     strcpy(pTmp, m_pString);
  512.     int nLen = strlen(m_pString) + sizeof(cChar) +1;
  513.     delete [] m_pString;
  514.     m_pString = new char[nLen];
  515.     strcpy(m_pString, pTmp);
  516.     nLen = strlen(m_pString);
  517.     m_pString[nLen] = cChar;
  518.     m_pString[nLen+1] = 0;
  519.     return *this;
  520. }
  521.  
  522. void CString::ClearStr()
  523. {
  524.     delete [] m_pString;
  525.     m_pString = new char[1];
  526.     m_pString[0] = 0;
  527. }
  528.  
  529. void CString::MakeLower() // make lower case
  530. {
  531.     char* pChar = m_pString;
  532.     while(*pChar)
  533.     {
  534.         if(isalpha(*pChar))
  535.         {
  536.             *pChar = tolower(*pChar);
  537.         }
  538.         pChar++;
  539.     }
  540. }
  541.  
  542. void CString::MakeUpper()
  543. {
  544.     char *pChar = m_pString;
  545.     while(*pChar)
  546.     {
  547.         if(isalpha(*pChar))
  548.         {
  549.             *pChar = toupper(*pChar);
  550.         }
  551.         pChar++;
  552.     }
  553. }
Advertisement
Add Comment
Please, Sign In to add comment