home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / oclsrc15.zip / OCL / Source / OString.cpp < prev    next >
C/C++ Source or Header  |  1996-08-12  |  8KB  |  441 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. OString::~OString() 
  87. {
  88.  delete[] text;
  89.  text = NULL; 
  90. }
  91.  
  92.  
  93. PSZ OString::isOfType() const
  94.  return("OString"); 
  95. }
  96.  
  97.  
  98. PSZ OString::getText() const
  99. {
  100.  return  text; 
  101. }
  102.  
  103.  
  104. ULONG OString::length() const
  105. {
  106.  if (text)
  107.    return(strlen(text));
  108.  return(0);
  109. }
  110.  
  111.  
  112.  
  113. int OString::compare(const OString&  s1, const OString& s2) const
  114. {
  115.  return strcmp(s1, s2);
  116. }
  117.  
  118.  
  119.  
  120. OString& OString::leftCut(int Letter)
  121. {
  122.  PSZ tmp;
  123.  PSZ newText;
  124.  
  125.  if ((!text) || ((tmp = strchr(text, Letter)) == NULL))
  126.    return(*this);
  127.  
  128.  tmp++;
  129.  if (!tmp) {
  130.    delete text;
  131.    text = NULL;
  132.    return(*this); }
  133.  
  134.  newText = new CHAR[strlen(tmp)+1];
  135.  strcpy(newText, tmp);
  136.  delete text;
  137.  text = newText; 
  138.  return(*this);
  139. }
  140.  
  141.  
  142. OString& OString::rightCut(int Letter)
  143. {
  144.  PSZ newText;
  145.  
  146.  if ((!text) || (!strrchr(text, Letter)))
  147.    return(*this);
  148.  
  149.  strcpy(strrchr(text, Letter), "");
  150.  
  151.  newText = new CHAR[strlen(text)+1];
  152.  strcpy(newText, text);
  153.  delete text;
  154.  text = newText; 
  155.  return(*this);
  156. }
  157.  
  158.  
  159. OString& OString::stripLeading(int Letter)
  160. {
  161.  PSZ   tmp = NULL;
  162.  PSZ   newText = NULL;
  163.  ULONG len;
  164.  ULONG index = 0;
  165.  
  166.  if ((!text) || (Letter == '\0') || (!strchr(text, Letter)))
  167.     return(*this);
  168.  
  169.  len = strlen(text);
  170.  
  171.  while(index <= len)
  172.   {
  173.    tmp = &text[index];
  174.    if (!tmp) {
  175.      delete text;
  176.      text = NULL;
  177.      return(*this); } 
  178.    if (*tmp != Letter)
  179.      break;
  180.    index++;
  181.   }
  182.       
  183.  newText = new CHAR[strlen(tmp)+1];
  184.  strcpy(newText, tmp);
  185.  delete text;
  186.  text = newText; 
  187.  return(*this);
  188. }
  189.  
  190.  
  191.  
  192. OString& OString::stripTrailing(int Letter)
  193. {
  194.  PSZ   tmp;
  195.  PSZ   newText;
  196.  LONG  index;
  197.  
  198.  if ((!text) || (Letter == '\0') || (!strchr(text, Letter)))
  199.     return(*this);
  200.  
  201.  index = strlen(text) - 1;
  202.  
  203.  while(index >= 0)
  204.   {
  205.    tmp = &text[index];
  206.    if (!tmp) {
  207.      delete text;
  208.      text = NULL;
  209.      return(*this); } 
  210.    if (*tmp != Letter)
  211.      break;
  212.    else
  213.      *tmp = '\0';
  214.    index--;
  215.   }
  216.       
  217.  newText = new CHAR[strlen(text)+1];
  218.  strcpy(newText, text);
  219.  delete text;
  220.  text = newText; 
  221.  return(*this);
  222. }
  223.  
  224.  
  225. OString& OString::replace(PCSZ string, PCSZ anOther)
  226. {
  227.  PSZ    tmp,
  228.         tmpPtr, 
  229.         cursor;
  230.  
  231.  if ((!text) || (!string) || (!anOther) || (!strstr(text, string)))  
  232.    return(*this);
  233.  
  234.  cursor  = text;
  235.  tmpPtr  = new CHAR[strlen(text)+1];
  236.  tmp     = tmpPtr;
  237.  
  238.  strcpy(tmp, text);
  239.  
  240.  while(TRUE)
  241.   {
  242.    *strstr(strstr(text, tmp), string) = '\0';
  243.    cursor = &strstr(tmp, string)[strlen(string)];
  244.    *this + anOther + cursor;
  245.    tmp = cursor;
  246.    if (!strstr(tmp, string))
  247.      break;
  248.   }  
  249.  
  250.  delete tmpPtr;
  251.  return(*this);
  252. }
  253.  
  254.  
  255.  
  256. OString& OString::operator << (PCSZ string) 
  257. {    // set or replace the string
  258.  PSZ tmp = NULL;
  259.  
  260.  if (string) {
  261.    tmp = new CHAR[strlen(string)+1];
  262.    strcpy(tmp, string); }
  263.  if (text)
  264.    delete[] text;
  265.  
  266.  text = tmp;
  267.  return(*this);
  268. }
  269.  
  270.  
  271. OString& OString::operator << (const pOString string) 
  272. {
  273.  if (string)
  274.    return(*this << string->getText());
  275.  return(*this);
  276. }
  277.  
  278.  
  279. OString& OString::operator <<   (INT     i)
  280. {
  281.  return(*this << (LONG) i);
  282. }
  283.  
  284. OString& OString::operator <<   (UINT   ui)
  285. {
  286.  return(*this << (ULONG) ui);
  287. }
  288.  
  289. OString& OString::operator <<   (LONG    l)
  290. {
  291.  OString buffer(32);
  292.  
  293.  sprintf(buffer.getText(), "%ld", l);
  294.  return(*this << buffer.getText());
  295. }
  296.  
  297. OString& OString::operator <<   (ULONG  ul)
  298. {
  299.  OString buffer(32);
  300.  
  301.  sprintf(buffer.getText(), "%lu", ul);
  302.  return(*this << buffer.getText());
  303. }
  304.  
  305. OString& OString::operator <<   (double db)
  306. {
  307.  OString buffer(32);
  308.  
  309.  sprintf(buffer, "%.*g", DBL_DIG, db);
  310.  return(*this << buffer.getText());
  311. }
  312.  
  313. OString& OString::operator +    (INT     i)
  314. {
  315.  return(*this + (LONG) i);
  316. }
  317.  
  318. OString& OString::operator +    (UINT   ui)
  319. {
  320.  return(*this + (ULONG) ui);
  321. }
  322.  
  323. OString& OString::operator +    (LONG    l)
  324. {
  325.  OString buffer(32);
  326.  
  327.  sprintf(buffer.getText(), "%ld", l);
  328.  return(*this + buffer.getText());
  329. }
  330.  
  331. OString& OString::operator +    (ULONG  ul)
  332. {
  333.  OString buffer(32);
  334.  
  335.  sprintf(buffer.getText(), "%lu", ul);
  336.  return(*this + buffer.getText());
  337. }
  338.  
  339. OString& OString::operator +    (double db)
  340. {
  341.  OString buffer(32);
  342.  
  343.  sprintf(buffer, "%.*g", DBL_DIG, db);
  344.  return(*this + buffer.getText());
  345. }
  346.  
  347. OString& OString::operator + (PCSZ string) 
  348. {     // add String to the end of text
  349.  if ((text) && (string)) {
  350.    PSZ tmp = new CHAR[strlen(text)+strlen(string)+1];
  351.  
  352.    strcpy(tmp, text);
  353.    strcat(tmp, string);
  354.    *this << tmp;
  355.    delete[] tmp; }
  356.  return(*this);
  357. }
  358.  
  359.  
  360. OString& OString::operator + (const pOString string)
  361. {
  362.  if (string)
  363.    return(*this + string->getText());
  364.  return(*this);
  365.  
  366.  
  367. OString& OString::operator = (PCSZ string)
  368. {
  369.  *this << string;
  370.  return(*this);
  371. }
  372.  
  373.  
  374.  
  375. BOOL OString::operator == (PCSZ anOther)const 
  376. {
  377.  return (strcmp(text, anOther) == 0); 
  378. }
  379.  
  380.  
  381. BOOL OString::operator != (PCSZ anOther)const 
  382. {
  383.  return !(*this == anOther); 
  384. }
  385.  
  386.  
  387. BOOL OString::operator < (PCSZ anOther)const 
  388. {
  389.  return (strcmp(text, anOther) < 0); 
  390. }
  391.  
  392.  
  393. BOOL OString::operator > (PCSZ anOther)const 
  394. {
  395.  return (strcmp(text, anOther) > 0); 
  396. }
  397.  
  398.  
  399. BOOL OString::operator <= (PCSZ anOther)const 
  400. {
  401.  return !(*this > anOther); 
  402. }
  403.  
  404.  
  405. BOOL OString::operator >= (PCSZ anOther)const 
  406. {
  407.  return !(*this < anOther); 
  408. }
  409.  
  410.  
  411.  
  412. istream& operator >> (istream& in, OString& s)
  413. {
  414.  PSZ Buf = new CHAR[CCHMAXPATH];
  415.  
  416.  in >> Buf;
  417.  s << Buf;
  418.  delete[] Buf;
  419.  return(in);
  420. }
  421.  
  422.  
  423. istream& operator >> (istream& in, pOString s)
  424. {
  425.  return((s != NULL) ? (in >> *s) : in);
  426. }
  427.  
  428.  
  429. ostream& operator <<   (ostream& out, pOString s)
  430. {
  431.  if (s)
  432.    out << s->getText();
  433.  return(out);
  434. }
  435.  
  436.  
  437. // end of source
  438.