1 //========================================================================
5 // Simple variable-length string type.
7 // Copyright 1996 Derek B. Noonburg
9 //========================================================================
12 #pragma implementation
21 static inline int size(int len) {
24 delta = len < 256 ? 7 : 255;
25 return ((len + 1) + delta) & ~delta;
28 inline void GString::resize(int length1) {
32 s = new char[size(length1)];
33 } else if (size(length1) != size(length)) {
34 s1 = new char[size(length1)];
35 memcpy(s1, s, length + 1);
47 GString::GString(char *s1) {
55 GString::GString(char *s1, int length1) {
57 resize(length = length1);
58 memcpy(s, s1, length * sizeof(char));
62 GString::GString(GString *str) {
64 resize(length = str->getLength());
65 memcpy(s, str->getCString(), length + 1);
68 GString::GString(GString *str1, GString *str2) {
69 int n1 = str1->getLength();
70 int n2 = str2->getLength();
73 resize(length = n1 + n2);
74 memcpy(s, str1->getCString(), n1);
75 memcpy(s + n1, str2->getCString(), n2 + 1);
82 GString *GString::clear() {
88 GString *GString::append(char c) {
95 GString *GString::append(GString *str) {
96 int n = str->getLength();
99 memcpy(s + length, str->getCString(), n + 1);
104 GString *GString::append(char *str) {
108 memcpy(s + length, str, n + 1);
113 GString *GString::append(char *str, int length1) {
114 resize(length + length1);
115 memcpy(s + length, str, length1);
121 GString *GString::insert(int i, char c) {
125 for (j = length + 1; j > i; --j)
132 GString *GString::insert(int i, GString *str) {
133 int n = str->getLength();
137 for (j = length; j >= i; --j)
139 memcpy(s+i, str->getCString(), n);
144 GString *GString::insert(int i, char *str) {
149 for (j = length; j >= i; --j)
156 GString *GString::insert(int i, char *str, int length1) {
159 resize(length + length1);
160 for (j = length; j >= i; --j)
162 memcpy(s+i, str, length1);
167 GString *GString::del(int i, int n) {
171 for (j = i; j <= length - n; ++j)
178 GString *GString::upperCase() {
181 for (i = 0; i < length; ++i) {
183 s[i] = toupper(s[i]);
188 GString *GString::lowerCase() {
191 for (i = 0; i < length; ++i) {
193 s[i] = tolower(s[i]);