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