1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 2000 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #include <string.h>
28 #include <stdio.h>
29 
30 #include "Str.h"
31 
Str()32 Str::Str()
33 	: str_(strcpy(new char[strlen("")+1], "")),
34     nextTok_(str_)
35 {}
36 
Str(const char * str)37 Str::Str(const char *str)
38 	: str_(strcpy(new char[strlen(str)+1], str)),
39     nextTok_(str_)
40 {}
41 
Str(const char * str,int len)42 Str::Str(const char *str, int len)
43 	: str_(new char[len+1]),
44     nextTok_(str_)
45 {
46 	strlcpy(str_, str, len+1);
47 }
48 
Str(const Str & rhs)49 Str::Str(const Str& rhs)
50 	: str_(strcpy(new char[strlen(rhs.str_)+1], rhs.str_)),
51     nextTok_(str_)
52 {}
53 
~Str()54 Str::~Str()
55 {
56 	delete[] str_;
57 }
58 
59 void
operator =(const Str & rhs)60 Str::operator = (const Str& rhs)
61 {
62 	delete[] str_;
63 	str_ = strcpy(new char[strlen(rhs.str_)+1], rhs.str_);
64 	// pointer arithmetic very BAD I know...
65 	nextTok_ = str_ + (rhs.nextTok_ - rhs.str_);
66 }
67 
68 void
operator =(const char * str)69 Str::operator = (const char *str)
70 {
71 	delete[] str_;
72 	str_ = strcpy(new char[strlen(str)+1], str);
73 	nextTok_ = str_;
74 }
75 
76 int
operator ==(const Str & rhs) const77 Str::operator == (const Str& rhs) const
78 {
79 	return (strcmp(str_, rhs.str_) == 0);
80 }
81 
82 int
operator !=(const Str & rhs) const83 Str::operator != (const Str& rhs) const
84 {
85 	return (strcmp(str_, rhs.str_) != 0);
86 }
87 
88 char&
operator [](int index) const89 Str::operator[](int index) const
90 {
91 	return (str_[index]);
92 }
93 
94 Str&
operator <<(Str rhs)95 Str::operator<<(Str rhs)
96 {
97 	char *tmp = new char[strlen(str_)+strlen(rhs.peak())+1];
98 	strcpy(tmp, str_);
99 	delete[] str_;
100 	str_ = tmp;
101 	strcat(str_, rhs.peak());
102 	return (*this);
103 }
104 
105 Str&
operator <<(long long i)106 Str::operator<<(long long i)
107 {
108 	char msg[256];
109 	sprintf(msg, "%lld", i);
110 	return (*this << msg);
111 }
112 
113 Str&
operator <<(long i)114 Str::operator<<(long i)
115 {
116 	char msg[256];
117 	sprintf(msg, "%ld", i);
118 	return (*this << msg);
119 }
120 
121 Str&
operator <<(int i)122 Str::operator<<(int i)
123 {
124 	char msg[256];
125 	sprintf(msg, "%d", i);
126 	return (*this << msg);
127 }
128 
129 Str&
operator <<(char c)130 Str::operator<<(char c)
131 {
132 	char msg[256];
133 	sprintf(msg, "%c", c);
134 	return (*this << msg);
135 }
136 
137 // normal "C" strcmp
138 int
compare(const Str & rhs) const139 Str::compare(const Str& rhs) const
140 {
141 	return (strcmp(str_, rhs.str_));
142 }
143 
144 int
length(void) const145 Str::length(void) const
146 {
147 	return (strlen(str_));
148 }
149 
150 char
tokenize(Str & token,const Str & separators,Str & remainder)151 Str::tokenize(Str& token, const Str& separators, Str& remainder)
152 {
153 	int i = 0;
154 	int j = 0;
155 	for (i = 0; nextTok_[i] != '\0'; i++) {
156 		for (j = 0; j < separators.length(); j++) {
157 			if (nextTok_[i] == separators[j]) {
158 				Str rc(nextTok_, i);
159 				token = rc;
160 				nextTok_ = &(nextTok_[i+1]);
161 				// Str remain(nextTok_);
162 				remainder = nextTok_;
163 				return (separators[j]);
164 			}
165 		}
166 	}
167 
168 	token = "";
169 	remainder = nextTok_;
170 	// remainder = *this;
171 	// did not find it!
172 	return ('\0');
173 }
174 
175 void
resetToken(void)176 Str::resetToken(void)
177 {
178 	nextTok_ = str_;
179 }
180 
181 const char *
peak(void) const182 Str::peak(void) const
183 {
184 	return (str_);
185 }
186 
187 void
replaceAll(char c,char newc)188 Str::replaceAll(char c, char newc)
189 {
190 	for (int i = 0; i < strlen(str_); i++) {
191 		if (str_[i] == c) {
192 			str_[i] = newc;
193 		}
194 	}
195 }
196 // oh look an extra line!!!
197