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
34Str::Str()
35	: str_(strcpy(new char[strlen("")+1], "")),
36    nextTok_(str_)
37{}
38
39Str::Str(const char *str)
40	: str_(strcpy(new char[strlen(str)+1], str)),
41    nextTok_(str_)
42{}
43
44Str::Str(const char *str, int len)
45	: str_(new char[len+1]),
46    nextTok_(str_)
47{
48	strlcpy(str_, str, len+1);
49}
50
51Str::Str(const Str& rhs)
52	: str_(strcpy(new char[strlen(rhs.str_)+1], rhs.str_)),
53    nextTok_(str_)
54{}
55
56Str::~Str()
57{
58	delete[] str_;
59}
60
61void
62Str::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
70void
71Str::operator = (const char *str)
72{
73	delete[] str_;
74	str_ = strcpy(new char[strlen(str)+1], str);
75	nextTok_ = str_;
76}
77
78int
79Str::operator == (const Str& rhs) const
80{
81	return (strcmp(str_, rhs.str_) == 0);
82}
83
84int
85Str::operator != (const Str& rhs) const
86{
87	return (strcmp(str_, rhs.str_) != 0);
88}
89
90char&
91Str::operator[](int index) const
92{
93	return (str_[index]);
94}
95
96Str&
97Str::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
107Str&
108Str::operator<<(long long i)
109{
110	char msg[256];
111	sprintf(msg, "%lld", i);
112	return (*this << msg);
113}
114
115Str&
116Str::operator<<(long i)
117{
118	char msg[256];
119	sprintf(msg, "%ld", i);
120	return (*this << msg);
121}
122
123Str&
124Str::operator<<(int i)
125{
126	char msg[256];
127	sprintf(msg, "%d", i);
128	return (*this << msg);
129}
130
131Str&
132Str::operator<<(char c)
133{
134	char msg[256];
135	sprintf(msg, "%c", c);
136	return (*this << msg);
137}
138
139// normal "C" strcmp
140int
141Str::compare(const Str& rhs) const
142{
143	return (strcmp(str_, rhs.str_));
144}
145
146int
147Str::length(void) const
148{
149	return (strlen(str_));
150}
151
152char
153Str::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
177void
178Str::resetToken(void)
179{
180	nextTok_ = str_;
181}
182
183const char *
184Str::peak(void) const
185{
186	return (str_);
187}
188
189void
190Str::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