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
Str()34 Str::Str()
35 : str_(strcpy(new char[strlen("")+1], "")),
36 nextTok_(str_)
37 {}
38
Str(const char * str)39 Str::Str(const char *str)
40 : str_(strcpy(new char[strlen(str)+1], str)),
41 nextTok_(str_)
42 {}
43
Str(const char * str,int len)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
Str(const Str & rhs)51 Str::Str(const Str& rhs)
52 : str_(strcpy(new char[strlen(rhs.str_)+1], rhs.str_)),
53 nextTok_(str_)
54 {}
55
~Str()56 Str::~Str()
57 {
58 delete[] str_;
59 }
60
61 void
operator =(const Str & rhs)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
operator =(const char * str)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
operator ==(const Str & rhs) const79 Str::operator == (const Str& rhs) const
80 {
81 return (strcmp(str_, rhs.str_) == 0);
82 }
83
84 int
operator !=(const Str & rhs) const85 Str::operator != (const Str& rhs) const
86 {
87 return (strcmp(str_, rhs.str_) != 0);
88 }
89
90 char&
operator [](int index) const91 Str::operator[](int index) const
92 {
93 return (str_[index]);
94 }
95
96 Str&
operator <<(Str rhs)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&
operator <<(long long i)108 Str::operator<<(long long i)
109 {
110 char msg[256];
111 sprintf(msg, "%lld", i);
112 return (*this << msg);
113 }
114
115 Str&
operator <<(long i)116 Str::operator<<(long i)
117 {
118 char msg[256];
119 sprintf(msg, "%ld", i);
120 return (*this << msg);
121 }
122
123 Str&
operator <<(int i)124 Str::operator<<(int i)
125 {
126 char msg[256];
127 sprintf(msg, "%d", i);
128 return (*this << msg);
129 }
130
131 Str&
operator <<(char c)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
compare(const Str & rhs) const141 Str::compare(const Str& rhs) const
142 {
143 return (strcmp(str_, rhs.str_));
144 }
145
146 int
length(void) const147 Str::length(void) const
148 {
149 return (strlen(str_));
150 }
151
152 char
tokenize(Str & token,const Str & separators,Str & remainder)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
resetToken(void)178 Str::resetToken(void)
179 {
180 nextTok_ = str_;
181 }
182
183 const char *
peak(void) const184 Str::peak(void) const
185 {
186 return (str_);
187 }
188
189 void
replaceAll(char c,char newc)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