home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 308_01 / string.cpp < prev    next >
C/C++ Source or Header  |  1990-09-20  |  5KB  |  248 lines

  1.  
  2. /************************************************************************
  3.     Title:        C++ Dynamic String Class;
  4.     Filename:    String.cpp;
  5.     Date:        9/2/90;
  6.     Version:    1.0;
  7.     Requires:    string.hpp;
  8.     
  9.     Author:        Michael Kelly
  10.                     254 Gold Street
  11.                     Boston, MA 02127
  12.             Copyright 1990;
  13.  
  14.     COPYRIGHT:    This code may not be commercially distributed
  15.             without prior arrangement with the author.  It
  16.             may be used by programmers, without royalty, for
  17.             their personal programs and for "one of a kind"
  18.             or "custom" applications, provided that said
  19.             programmers assume all liability concerning
  20.             same.
  21. ************************************************************************/
  22.  
  23.  
  24. #include "string.hpp"
  25.  
  26. /*
  27.  *  "scratch" String used by some of the String::operator methods.
  28.  *
  29.  *       ( benign neglect recommended )
  30.  */
  31. static String tempstr(2);
  32.  
  33.  
  34. //          ----------  String constructors  ----------
  35.  
  36. String::String(int str_siz)
  37. {
  38.     if(! str_siz)
  39.     str_siz = 2;
  40.     str = new char[str_siz];
  41.     str[0] = '\0';
  42.     siz = str_siz;
  43.     len = 0;
  44. }
  45.  
  46. String::String(String &string)
  47. {
  48.     siz = string.siz;
  49.     len = string.len;
  50.     str = new char[siz];
  51.     strncpy(str, string.str, len);
  52.     str[len] = '\0';
  53. }
  54.  
  55. String::String(char *cstr)
  56. {
  57.     len = strlen(cstr);
  58.     siz = len + 1;
  59.     str = new char[siz];
  60.     strcpy(str, cstr);
  61. }
  62.  
  63.  
  64. //        ----------  String destructor  ----------
  65.  
  66. String:: ~String(void)
  67. {
  68.     if(str)
  69.     delete str;
  70.     str = NULL;
  71.     siz = len = 0;
  72. }
  73.  
  74.  
  75. //        ----------  friend String operators  ----------
  76.  
  77.  
  78. String& operator + (char *cstr, String &string)
  79. {
  80.     tempstr = cstr;
  81.     tempstr += string;
  82.     return tempstr;
  83. }
  84.  
  85. int operator <  (char *cstr, String &string)
  86. {
  87.     return(strcmp(cstr, string.str) < 0);
  88. }
  89.  
  90. int operator <= (char *cstr, String &string)
  91. {
  92.     return(strcmp(cstr, string.str) < 1);
  93. }
  94.  
  95. int operator >  (char *cstr, String &string)
  96. {
  97.     return(strcmp(cstr, string.str) > 0);
  98. }
  99.  
  100. int operator >= (char *cstr, String &string)
  101. {
  102.     return(strcmp(cstr, string.str) > -1);
  103. }
  104.  
  105. int operator == (char *cstr, String &string)
  106. {
  107.     return !(strcmp(cstr, string.str));
  108. }
  109.  
  110. int operator != (char *cstr, String &string)
  111. {
  112.     return(strcmp(cstr, string.str) != 0);
  113. }
  114.  
  115.  
  116. //        ----------  String operators  ----------
  117.  
  118.  
  119. String& String::operator = (String &string)
  120. {
  121.     char *temp;
  122.  
  123.     if(siz > string.len)  {
  124.     len = string.len;
  125.     strcpy(str, string.str);
  126.     }
  127.     else if(temp = new char[string.len + 1])  {
  128.     if(str)
  129.         delete str;
  130.     str = temp;
  131.     strcpy(str, string.str);
  132.     len = string.len;
  133.     siz = len + 1;
  134.     }
  135.     else
  136.     strncpy(str, string.str, len);
  137.  
  138.     if(&tempstr == &string)  {
  139.     if(tempstr.str)
  140.         delete tempstr.str;
  141.     tempstr.str = new char[2];
  142.     tempstr.str[0] = '\0';
  143.     tempstr.siz = 2;
  144.     tempstr.len = 0;
  145.     }
  146.     return *this;
  147. }
  148.  
  149. String& String::operator = (char *cstr)
  150. {
  151.     char *temp;
  152.     int cstr_len = strlen(cstr);
  153.  
  154.     if(siz > cstr_len)  {
  155.     len = cstr_len;
  156.     strcpy(str, cstr);
  157.     }
  158.     else if(temp = new char[cstr_len + 1])  {
  159.     if(str)
  160.         delete str;
  161.     str = temp;
  162.     strcpy(str, cstr);
  163.     len = cstr_len;
  164.     siz = len + 1;
  165.     }
  166.     else
  167.     strncpy(str, cstr, len);
  168.  
  169.  
  170.     return *this;
  171. }
  172.  
  173.  
  174. String& String::operator + (String &string)
  175. {
  176.     String temp(len + string.len + 1);
  177.  
  178.     temp.len = temp.siz - 1;
  179.     strcpy(temp.str, str);
  180.     strcat(temp.str, string.str);
  181.     tempstr = temp;
  182.     return tempstr;
  183. }
  184.  
  185. String& String::operator + (char *cstr)
  186. {
  187.     String tmp(strlen(cstr) + 1);
  188.  
  189.     tmp = cstr;
  190.     return (*this) + tmp;
  191. }
  192.  
  193.  
  194. String& String::operator += (String &string)
  195. {
  196.     char *temp;
  197.  
  198.     if(siz > (len + string.len))  {
  199.     strcat(str, string.str);
  200.     len += string.len;
  201.     }
  202.     else if(temp = new char[len + string.len + 1])  {
  203.     strcpy(temp, str);
  204.     strcat(temp, string.str);
  205.     siz = len + string.len + 1;
  206.     len = siz - 1;
  207.     if(str)
  208.         delete str;
  209.     str = temp;
  210.     }
  211.     else if(siz > (len + 1))  {
  212.     strncat(str, string.str, siz - (len + 1));
  213.     len = siz - 1;
  214.     str[len] = '\0';
  215.     }
  216.  
  217.     return *this;
  218. }
  219.  
  220. String& String::operator += (char *cstr)
  221. {
  222.     String tmp(strlen(cstr) + 1);
  223.  
  224.     tmp = cstr;
  225.     return (*this) += tmp;
  226. }
  227.  
  228.  
  229. //        ----------  String member functions  ----------
  230.  
  231. int String::shrink(int new_size)
  232. {
  233.     if(siz <= new_size)
  234.     return 0;
  235.  
  236.     if(new_size < 1)
  237.     new_size = 1;
  238.     if(str)
  239.     delete str;
  240.     str = new char[new_size];
  241.     if(! str)
  242.     return len = siz = 0;
  243.     len = 0;
  244.     str[0] = '\0';
  245.     siz = new_size;
  246.     return 1;
  247. }
  248.