home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ocl150a.zip / OCL / Source / OString.cpp < prev    next >
C/C++ Source or Header  |  1997-04-05  |  8KB  |  471 lines

  1. // OCL - OS/2 Class Library
  2. // (c) Cubus 1995
  3. // All Rights Reserved
  4. // OString.cpp
  5.  
  6.  
  7. // class member functions
  8.  
  9.  
  10. /*
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Neither the name Cubus nor the name Team OCL may be used to
  17.  *    endorse or promote products derived from this software
  18.  *    without specific prior written permission.
  19.  * 3. See OCL.INF for a detailed copyright notice.
  20.  *
  21.  *              THIS SOFTWARE IS PROVIDED ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. // $Header: W:/Projects/OCL/Source/rcs/OString.cpp 1.50 1996/08/11 23:49:31 B.STEIN Release $
  35.  
  36. #define __OCL_SOURCE__
  37.  
  38. #define OINCL_OSTRING
  39. #define OINCL_BASE
  40.  
  41. #include <ocl.hpp>
  42.  
  43.  
  44. OString::OString()
  45.  text = NULL; 
  46. }
  47.  
  48.  
  49. OString::OString(PCSZ iText)
  50. {
  51.  if (iText) {
  52.    text = new CHAR[strlen(iText)+1];
  53.    strcpy(text, iText); }
  54.  else
  55.    text = NULL;
  56. }
  57.  
  58.  
  59. OString::OString(const OString& String)
  60. {
  61.  if ((String.getText())) {
  62.    text = new CHAR[strlen(String)+1];
  63.    strcpy(text, String); }
  64.  else
  65.    text = NULL; 
  66. }
  67.  
  68. OString::OString(const pOString String)
  69. {
  70.  if ((String) && (String->getText())) {
  71.    text = new CHAR[strlen(String->getText())+1];
  72.    strcpy(text, String->getText()); }
  73.  else
  74.    text = NULL; 
  75. }
  76.  
  77.  
  78.  
  79. OString::OString(int iLength)
  80. {
  81.  text = new char[iLength+1]; 
  82.  text[0] = '\0';
  83. }
  84.  
  85.  
  86. struct STRRES
  87. {
  88.  BYTE len;
  89.  PSZ  str;
  90. };
  91.  
  92. #pragma pack()
  93.  
  94.  
  95. OString::OString(ULONG res, HMODULE mod)
  96. {
  97.  PVOID  resPtr  = NULL;
  98.  STRRES *str    = NULL;
  99.  
  100.  if (DosGetResource(mod, RT_STRING, res / 16 + 1, &resPtr))
  101.    *this << "ERROR";
  102.  else
  103.    {
  104.     str = (STRRES*) resPtr + sizeof(USHORT);
  105.  
  106.     for(ULONG i = 0; i < 15; i++)
  107.       {
  108.        str +=  atoi((PCSZ)&str->len);
  109.       }
  110.  
  111.     DosFreeResource(resPtr);
  112.    }    
  113. }
  114.  
  115.  
  116. OString::~OString() 
  117. {
  118.  delete[] text;
  119.  text = NULL; 
  120. }
  121.  
  122.  
  123. PSZ OString::isOfType() const
  124.  return("OString"); 
  125. }
  126.  
  127.  
  128. PSZ OString::getText() const
  129. {
  130.  return  text; 
  131. }
  132.  
  133.  
  134. ULONG OString::length() const
  135. {
  136.  if (text)
  137.    return(strlen(text));
  138.  return(0);
  139. }
  140.  
  141.  
  142.  
  143. int OString::compare(const OString&  s1, const OString& s2) const
  144. {
  145.  return strcmp(s1, s2);
  146. }
  147.  
  148.  
  149.  
  150. OString& OString::leftCut(int Letter)
  151. {
  152.  PSZ tmp;
  153.  PSZ newText;
  154.  
  155.  if ((!text) || ((tmp = strchr(text, Letter)) == NULL))
  156.    return(*this);
  157.  
  158.  tmp++;
  159.  if (!tmp) {
  160.    delete text;
  161.    text = NULL;
  162.    return(*this); }
  163.  
  164.  newText = new CHAR[strlen(tmp)+1];
  165.  strcpy(newText, tmp);
  166.  delete text;
  167.  text = newText; 
  168.  return(*this);
  169. }
  170.  
  171.  
  172. OString& OString::rightCut(int Letter)
  173. {
  174.  PSZ newText;
  175.  
  176.  if ((!text) || (!strrchr(text, Letter)))
  177.    return(*this);
  178.  
  179.  strcpy(strrchr(text, Letter), "");
  180.  
  181.  newText = new CHAR[strlen(text)+1];
  182.  strcpy(newText, text);
  183.  delete text;
  184.  text = newText; 
  185.  return(*this);
  186. }
  187.  
  188.  
  189. OString& OString::stripLeading(int Letter)
  190. {
  191.  PSZ   tmp = NULL;
  192.  PSZ   newText = NULL;
  193.  ULONG len;
  194.  ULONG index = 0;
  195.  
  196.  if ((!text) || (Letter == '\0') || (!strchr(text, Letter)))
  197.     return(*this);
  198.  
  199.  len = strlen(text);
  200.  
  201.  while(index <= len)
  202.   {
  203.    tmp = &text[index];
  204.    if (!tmp) {
  205.      delete text;
  206.      text = NULL;
  207.      return(*this); } 
  208.    if (*tmp != Letter)
  209.      break;
  210.    index++;
  211.   }
  212.       
  213.  newText = new CHAR[strlen(tmp)+1];
  214.  strcpy(newText, tmp);
  215.  delete text;
  216.  text = newText; 
  217.  return(*this);
  218. }
  219.  
  220.  
  221.  
  222. OString& OString::stripTrailing(int Letter)
  223. {
  224.  PSZ   tmp;
  225.  PSZ   newText;
  226.  LONG  index;
  227.  
  228.  if ((!text) || (Letter == '\0') || (!strchr(text, Letter)))
  229.     return(*this);
  230.  
  231.  index = strlen(text) - 1;
  232.  
  233.  while(index >= 0)
  234.   {
  235.    tmp = &text[index];
  236.    if (!tmp) {
  237.      delete text;
  238.      text = NULL;
  239.      return(*this); } 
  240.    if (*tmp != Letter)
  241.      break;
  242.    else
  243.      *tmp = '\0';
  244.    index--;
  245.   }
  246.       
  247.  newText = new CHAR[strlen(text)+1];
  248.  strcpy(newText, text);
  249.  delete text;
  250.  text = newText; 
  251.  return(*this);
  252. }
  253.  
  254.  
  255. OString& OString::replace(PCSZ string, PCSZ anOther)
  256. {
  257.  PSZ    tmp,
  258.         tmpPtr, 
  259.         cursor;
  260.  
  261.  if ((!text) || (!string) || (!anOther) || (!strstr(text, string)))  
  262.    return(*this);
  263.  
  264.  cursor  = text;
  265.  tmpPtr  = new CHAR[strlen(text)+1];
  266.  tmp     = tmpPtr;
  267.  
  268.  strcpy(tmp, text);
  269.  
  270.  while(TRUE)
  271.   {
  272.    *strstr(strstr(text, tmp), string) = '\0';
  273.    cursor = &strstr(tmp, string)[strlen(string)];
  274.    *this + anOther + cursor;
  275.    tmp = cursor;
  276.    if (!strstr(tmp, string))
  277.      break;
  278.   }  
  279.  
  280.  delete tmpPtr;
  281.  return(*this);
  282. }
  283.  
  284.  
  285.  
  286. OString& OString::operator << (PCSZ string) 
  287. {    // set or replace the string
  288.  PSZ tmp = NULL;
  289.  
  290.  if (string) {
  291.    tmp = new CHAR[strlen(string)+1];
  292.    strcpy(tmp, string); }
  293.  if (text)
  294.    delete[] text;
  295.  
  296.  text = tmp;
  297.  return(*this);
  298. }
  299.  
  300.  
  301. OString& OString::operator << (const pOString string) 
  302. {
  303.  if (string)
  304.    return(*this << string->getText());
  305.  return(*this);
  306. }
  307.  
  308.  
  309. OString& OString::operator <<   (INT     i)
  310. {
  311.  return(*this << (LONG) i);
  312. }
  313.  
  314. OString& OString::operator <<   (UINT   ui)
  315. {
  316.  return(*this << (ULONG) ui);
  317. }
  318.  
  319. OString& OString::operator <<   (LONG    l)
  320. {
  321.  OString buffer(32);
  322.  
  323.  sprintf(buffer.getText(), "%ld", l);
  324.  return(*this << buffer.getText());
  325. }
  326.  
  327. OString& OString::operator <<   (ULONG  ul)
  328. {
  329.  OString buffer(32);
  330.  
  331.  sprintf(buffer.getText(), "%lu", ul);
  332.  return(*this << buffer.getText());
  333. }
  334.  
  335. OString& OString::operator <<   (double db)
  336. {
  337.  OString buffer(32);
  338.  
  339.  sprintf(buffer, "%.*g", DBL_DIG, db);
  340.  return(*this << buffer.getText());
  341. }
  342.  
  343. OString& OString::operator +    (INT     i)
  344. {
  345.  return(*this + (LONG) i);
  346. }
  347.  
  348. OString& OString::operator +    (UINT   ui)
  349. {
  350.  return(*this + (ULONG) ui);
  351. }
  352.  
  353. OString& OString::operator +    (LONG    l)
  354. {
  355.  OString buffer(32);
  356.  
  357.  sprintf(buffer.getText(), "%ld", l);
  358.  return(*this + buffer.getText());
  359. }
  360.  
  361. OString& OString::operator +    (ULONG  ul)
  362. {
  363.  OString buffer(32);
  364.  
  365.  sprintf(buffer.getText(), "%lu", ul);
  366.  return(*this + buffer.getText());
  367. }
  368.  
  369. OString& OString::operator +    (double db)
  370. {
  371.  OString buffer(32);
  372.  
  373.  sprintf(buffer, "%.*g", DBL_DIG, db);
  374.  return(*this + buffer.getText());
  375. }
  376.  
  377. OString& OString::operator + (PCSZ string) 
  378. {     // add String to the end of text
  379.  if ((text) && (string)) {
  380.    PSZ tmp = new CHAR[strlen(text)+strlen(string)+1];
  381.  
  382.    strcpy(tmp, text);
  383.    strcat(tmp, string);
  384.    *this << tmp;
  385.    delete[] tmp; }
  386.  return(*this);
  387. }
  388.  
  389.  
  390. OString& OString::operator + (const pOString string)
  391. {
  392.  if (string)
  393.    return(*this + string->getText());
  394.  return(*this);
  395.  
  396.  
  397. OString& OString::operator = (PCSZ string)
  398. {
  399.  *this << string;
  400.  return(*this);
  401. }
  402.  
  403.  
  404.  
  405. BOOL OString::operator == (PCSZ anOther)const 
  406. {
  407.  return (strcmp(text, anOther) == 0); 
  408. }
  409.  
  410.  
  411. BOOL OString::operator != (PCSZ anOther)const 
  412. {
  413.  return !(*this == anOther); 
  414. }
  415.  
  416.  
  417. BOOL OString::operator < (PCSZ anOther)const 
  418. {
  419.  return (strcmp(text, anOther) < 0); 
  420. }
  421.  
  422.  
  423. BOOL OString::operator > (PCSZ anOther)const 
  424. {
  425.  return (strcmp(text, anOther) > 0); 
  426. }
  427.  
  428.  
  429. BOOL OString::operator <= (PCSZ anOther)const 
  430. {
  431.  return !(*this > anOther); 
  432. }
  433.  
  434.  
  435. BOOL OString::operator >= (PCSZ anOther)const 
  436. {
  437.  return !(*this < anOther); 
  438. }
  439.  
  440.  
  441.  
  442. istream& operator >> (istream& in, OString& s)
  443. {
  444.  PSZ Buf = new CHAR[CCHMAXPATH];
  445.  
  446.  in >> Buf;
  447.  s << Buf;
  448.  delete[] Buf;
  449.  return(in);
  450. }
  451.  
  452.  
  453. istream& operator >> (istream& in, pOString s)
  454. {
  455.  return((s != NULL) ? (in >> *s) : in);
  456. }
  457.  
  458.  
  459. ostream& operator <<   (ostream& out, pOString s)
  460. {
  461.  if (s)
  462.    out << s->getText();
  463.  return(out);
  464. }
  465.  
  466.  
  467. // end of source
  468.