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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <string.h>
30 #include <stdio.h>
31 
32 #include "Str.h"
33 
34 Str::Str()
35 	: str_(strcpy(new char[strlen("")+1], "")),
36     nextTok_(str_)
37 {}
38 
39 Str::Str(const char *str)
40 	: str_(strcpy(new char[strlen(str)+1], str)),
41     nextTok_(str_)
42 {}
43 
44 Str::Str(const char *str, int len)
45 	: str_(new char[len+1]),
46     nextTok_(str_)
47 {
48 	strlcpy(str_, str, len+1);
49 }
50 
51 Str::Str(const Str& rhs)
52 	: str_(strcpy(new char[strlen(rhs.str_)+1], rhs.str_)),
53     nextTok_(str_)
54 {}
55 
56 Str::~Str()
57 {
58 	delete[] str_;
59 }
60 
61 void
62 Str::operator = (const Str& rhs)
63 {
64 	delete[] str_;
65 	str_ = strcpy(new char[strlen(rhs.str_)+1], rhs.str_);
66 	// pointer arithmetic very BAD I know...
67 	nextTok_ = str_ + (rhs.nextTok_ - rhs.str_);
68 }
69 
70 void
71 Str::operator = (const char *str)
72 {
73 	delete[] str_;
74 	str_ = strcpy(new char[strlen(str)+1], str);
75 	nextTok_ = str_;
76 }
77 
78 int
79 Str::operator == (const Str& rhs) const
80 {
81 	return (strcmp(str_, rhs.str_) == 0);
82 }
83 
84 int
85 Str::operator != (const Str& rhs) const
86 {
87 	return (strcmp(str_, rhs.str_) != 0);
88 }
89 
90 char&
91 Str::operator[](int index) const
92 {
93 	return (str_[index]);
94 }
95 
96 Str&
97 Str::operator<<(Str rhs)
98 {
99 	char *tmp = new char[strlen(str_)+strlen(rhs.peak())+1];
100 	strcpy(tmp, str_);
101 	delete[] str_;
102 	str_ = tmp;
103 	strcat(str_, rhs.peak());
104 	return (*this);
105 }
106 
107 Str&
108 Str::operator<<(long long i)
109 {
110 	char msg[256];
111 	sprintf(msg, "%lld", i);
112 	return (*this << msg);
113 }
114 
115 Str&
116 Str::operator<<(long i)
117 {
118 	char msg[256];
119 	sprintf(msg, "%ld", i);
120 	return (*this << msg);
121 }
122 
123 Str&
124 Str::operator<<(int i)
125 {
126 	char msg[256];
127 	sprintf(msg, "%d", i);
128 	return (*this << msg);
129 }
130 
131 Str&
132 Str::operator<<(char c)
133 {
134 	char msg[256];
135 	sprintf(msg, "%c", c);
136 	return (*this << msg);
137 }
138 
139 // normal "C" strcmp
140 int
141 Str::compare(const Str& rhs) const
142 {
143 	return (strcmp(str_, rhs.str_));
144 }
145 
146 int
147 Str::length(void) const
148 {
149 	return (strlen(str_));
150 }
151 
152 char
153 Str::tokenize(Str& token, const Str& separators, Str& remainder)
154 {
155 	int i = 0;
156 	int j = 0;
157 	for (i = 0; nextTok_[i] != '\0'; i++) {
158 		for (j = 0; j < separators.length(); j++) {
159 			if (nextTok_[i] == separators[j]) {
160 				Str rc(nextTok_, i);
161 				token = rc;
162 				nextTok_ = &(nextTok_[i+1]);
163 				// Str remain(nextTok_);
164 				remainder = nextTok_;
165 				return (separators[j]);
166 			}
167 		}
168 	}
169 
170 	token = "";
171 	remainder = nextTok_;
172 	// remainder = *this;
173 	// did not find it!
174 	return (NULL);
175 }
176 
177 void
178 Str::resetToken(void)
179 {
180 	nextTok_ = str_;
181 }
182 
183 const char *
184 Str::peak(void) const
185 {
186 	return (str_);
187 }
188 
189 void
190 Str::replaceAll(char c, char newc)
191 {
192 	for (int i = 0; i < strlen(str_); i++) {
193 		if (str_[i] == c) {
194 			str_[i] = newc;
195 		}
196 	}
197 }
198 // oh look an extra line!!!
199