home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / pascal / rehack / contain / strings.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-21  |  6.2 KB  |  301 lines

  1. // ╔════════════════════════════════════════════════╗
  2. // ║ Strings.Cpp                                    ║
  3. // ╟────────────────────────────────────────────────╢
  4. // ║ String unit for C++                            ║
  5. // ╟────────────────────────────────────────────────╢
  6. // ║ Written 11/06/90 by Gus Smedstad               ║
  7. // ║   based on examples for Borland                ║
  8. // ╟────────────────────────────────────────────────╢
  9. // ║ Revised 11/18/90 by Gus Smedstad               ║
  10. // ║   Added str, str_long, system_date/time        ║
  11. // ╟────────────────────────────────────────────────╢
  12. // ║ Copyright 1990 NoGate Consulting               ║
  13. // ╚════════════════════════════════════════════════╝
  14.  
  15. #include <dos.h>
  16. #include <assert.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19.  
  20. #include "strings.h"
  21.  
  22. string::string()
  23.  {
  24.   length = 0;
  25.   char_ptr = new char;
  26.   assert(FP_SEG(char_ptr) > 100);
  27.   assert(FP_SEG(char_ptr) < 0xA000);
  28.   *char_ptr = 0;
  29.  };
  30.  
  31. string::string(char text)
  32.  {
  33.   length = 1;
  34.   char_ptr = new char[2];
  35.   assert(FP_SEG(char_ptr) > 100);
  36.   assert(FP_SEG(char_ptr) < 0xA000);
  37.   char_ptr[0] = text;
  38.   char_ptr[1] = 0;
  39.  };
  40.  
  41. string::string (char *text)
  42.  {
  43.    length = strlen(text);  // get length of text
  44.    char_ptr = new char[length + 1];
  45.    assert(FP_SEG(char_ptr) > 100);
  46.    assert(FP_SEG(char_ptr) < 0xA000);
  47.    strcpy(char_ptr, text);
  48. };
  49.  
  50. string::string (int size)
  51. {
  52.    length = size;
  53.    char_ptr = new char[length+1];
  54.    assert(FP_SEG(char_ptr) > 100);
  55.    assert(FP_SEG(char_ptr) < 0xA000);
  56.    *char_ptr = '\0';
  57. };
  58.  
  59. string::~string()
  60.  {
  61.   assert(FP_SEG(char_ptr) > 100);
  62.   assert(FP_SEG(char_ptr) < 0xA000);
  63.   delete char_ptr;
  64.  }
  65.  
  66. string::string (string& source)
  67. {
  68.    length = source.length;       // length of other string
  69.    char_ptr = new char [length + 1];   // allocate the memory
  70.    assert(FP_SEG(char_ptr) > 100);
  71.    assert(FP_SEG(char_ptr) < 0xA000);
  72.    strcpy (char_ptr, source.char_ptr); // copy the text
  73. };
  74.  
  75. string string::operator+ (string& arg)
  76. {
  77.   string temp( length + arg.length );
  78.   strcpy(temp.char_ptr, char_ptr);
  79.   strcat(temp.char_ptr, arg.char_ptr);
  80.   return temp;
  81. }
  82.  
  83. string string::operator+ (char *text)
  84. {
  85.   return (*this + str(text));
  86. }
  87.  
  88.  
  89. string string::operator+ (char text)
  90.  {
  91.   return (*this + str(text));
  92.  }
  93.  
  94. string& string::operator= (string& arg)
  95.  {
  96.   if (length < arg.length) {
  97.     assert(FP_SEG(char_ptr) > 10);
  98.     assert(FP_SEG(char_ptr) < 0xA000);
  99.     delete char_ptr;
  100.     length = arg.length;
  101.     char_ptr = new char[length + 1];
  102.     assert(FP_SEG(char_ptr) > 100);
  103.     assert(FP_SEG(char_ptr) < 0xA000);
  104.    }
  105.   strcpy(char_ptr, arg.char_ptr);
  106.   return *this;
  107.  }
  108.  
  109. string& string::operator= (char *text)
  110.  {
  111.   return (*this = str(text));
  112.  }
  113.  
  114. string& string::operator= (char text)
  115.  {
  116.   return (*this = str(text));
  117.  }
  118.  
  119. string& string::operator+= (string& arg)
  120.  {
  121.   if (strlen(char_ptr) + arg.length > length) {
  122.     string temp(*this);
  123.     return (*this = temp + arg);
  124.    } else {
  125.     strcat(char_ptr, arg.char_ptr);
  126.     return (*this);
  127.    }
  128.  }
  129.  
  130. string& string::operator+= (char *text)
  131.  {
  132.   return (*this += str(text));
  133.  }
  134.  
  135. string& string::operator+= (char text)
  136.  {
  137.   return (*this += str(text));
  138.  }
  139.  
  140. string string::copy(int start, int chars)
  141.  {
  142.   if (chars < 0)
  143.     chars = 0;
  144.   string result(chars);
  145.   if (start > strlen(char_ptr))
  146.     *result.char_ptr = 0;
  147.    else {
  148.     memcpy(result.char_ptr, char_ptr + start, chars);
  149.     result.char_ptr[chars] = 0;
  150.    }
  151.   return result;
  152.  }
  153.  
  154. void string::insert(int x, char *arg)
  155.  {
  156.   *this = copy(0, x) + arg + copy(x, length - x);
  157.  }
  158.  
  159. void string::insert(int x, char arg)
  160.  {
  161.   *this = copy(0, x) + arg + copy(x, length - x);
  162.  }
  163.  
  164. void string::remove(int start, int chars)
  165.  {
  166.   *this = copy(0, start) + copy(start + chars, length - start - chars);
  167.  }
  168.  
  169. //int string::operator== (const string& arg) const
  170. // {
  171. //  return strcmp(char_ptr, arg.char_ptr) == 0;
  172. // };
  173.  
  174. //int string::operator== (const char *arg) const
  175. // {
  176. //  string temp = arg;
  177. //  return *this == temp;
  178. // }
  179.  
  180. string chop(char *text, int length)
  181.  {
  182.   string temp(length + 1);
  183.   memcpy(temp.value(), text, length);
  184.   temp.value()[length] = 0;
  185.   return temp;
  186.  }
  187.  
  188. string str(char arg)
  189.  {
  190.   string temp(arg);
  191.   return temp;
  192.  }
  193.  
  194. string str(char *arg)
  195.  {
  196.   string temp(arg);
  197.   return temp;
  198.  }
  199.  
  200. string str_long(long arg, int width, int leading_zeroes)
  201.  {
  202.   string temp;
  203.   char   buffer[30];
  204.  
  205.   if (width) {
  206.     if (width > sizeof(buffer) - 1)
  207.       width = sizeof(buffer) - 1;
  208.     if (leading_zeroes)
  209.       sprintf(buffer, "%0*li", width, arg);
  210.      else
  211.       sprintf(buffer, "%*li",width, arg);
  212.    } else {
  213.     sprintf(buffer, "%li", arg);
  214.    }
  215.   return temp = buffer;
  216.  }
  217.  
  218. string system_date()
  219.  {
  220.   date sys_date;
  221.  
  222.   getdate(&sys_date);
  223.   return str_long(sys_date.da_mon,2)+'-'+
  224.          str_long(sys_date.da_day,2,1)+'-'+
  225.          str_long(sys_date.da_year % 100,2,1);
  226.  }
  227.  
  228. string system_time()
  229.  {
  230.   struct time sys_time;
  231.   gettime(&sys_time);
  232.   return str_long(sys_time.ti_hour,2)+':'+
  233.          str_long(sys_time.ti_min,2,1);
  234.  }
  235.  
  236. void delete_trailing_spaces(char *line)
  237.  {
  238.   int  i;
  239.  
  240.   i = strlen(line) - 1;
  241.   while (i >= 0 && line[i] == ' ') i--;
  242.   line[i+1] = 0;
  243.  }
  244.  
  245. void delete_chars(char *line, int n)
  246.  {
  247.   char *pt;
  248.   int  i;
  249.  
  250.   if ((i = strlen(line)) < n)
  251.     n = i;
  252.   pt = line + n;
  253.   while ((*line++ = *pt++) > 0) ;
  254.  }
  255.  
  256. void delete_leading_spaces(char *line) 
  257.  {
  258.   char *pt;
  259.  
  260.   pt = line;
  261.   while (*pt == ' ') pt++;
  262.   while ((*line++ = *pt++) > 0) ;
  263.  }
  264.  
  265. string rep_str(int width, char c)
  266.  {
  267.   string temp(width);
  268.   memset(temp.value(), c, width);
  269.   temp.value()[width] = 0;
  270.   return temp;
  271.  }
  272.  
  273. string ljust(char *arg, int width, char c)
  274.  {
  275.   int change;
  276.   string temp;
  277.  
  278.   if ((change = width - strlen(arg)) <= 0) {
  279.     temp = arg;
  280.     temp.value()[width] = 0;
  281.    } else {
  282.     temp = str(arg) + rep_str(change, c);
  283.    }
  284.   return temp;
  285.  }
  286.  
  287. string rjust(char *arg, int width, char c)
  288.  {
  289.   int change;
  290.   string temp;
  291.  
  292.   if ((change = width - strlen(arg)) <= 0) {
  293.     temp = arg;
  294.     temp.value()[width] = 0;
  295.    } else {
  296.     temp = rep_str(change, c) + arg;
  297.    }
  298.   return temp;
  299.  }
  300.  
  301.