1c1dac77fSApple OSS Distributions /* 2c1dac77fSApple OSS Distributions * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3c1dac77fSApple OSS Distributions * 4c1dac77fSApple OSS Distributions * @APPLE_LICENSE_HEADER_START@ 5c1dac77fSApple OSS Distributions * 6c1dac77fSApple OSS Distributions * The contents of this file constitute Original Code as defined in and 7c1dac77fSApple OSS Distributions * are subject to the Apple Public Source License Version 1.1 (the 8c1dac77fSApple OSS Distributions * "License"). You may not use this file except in compliance with the 9c1dac77fSApple OSS Distributions * License. Please obtain a copy of the License at 10c1dac77fSApple OSS Distributions * http://www.apple.com/publicsource and read it before using this file. 11c1dac77fSApple OSS Distributions * 12c1dac77fSApple OSS Distributions * This Original Code and all software distributed under the License are 13c1dac77fSApple OSS Distributions * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14c1dac77fSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15c1dac77fSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16c1dac77fSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17c1dac77fSApple OSS Distributions * License for the specific language governing rights and limitations 18c1dac77fSApple OSS Distributions * under the License. 19c1dac77fSApple OSS Distributions * 20c1dac77fSApple OSS Distributions * @APPLE_LICENSE_HEADER_END@ 21c1dac77fSApple OSS Distributions */ 22c1dac77fSApple OSS Distributions /* IOString.m created by rsulack on Wed 17-Sep-1997 */ 23c1dac77fSApple OSS Distributions /* IOString.cpp converted to C++ on Tue 1998-9-22 */ 24c1dac77fSApple OSS Distributions 25*fad439e7SApple OSS Distributions #include <string.h> 26c1dac77fSApple OSS Distributions 27c1dac77fSApple OSS Distributions #include <libkern/c++/OSString.h> 28c1dac77fSApple OSS Distributions #include <libkern/c++/OSSerialize.h> 29c1dac77fSApple OSS Distributions #include <libkern/c++/OSLib.h> 30c1dac77fSApple OSS Distributions #include <libkern/c++/OSData.h> 31*fad439e7SApple OSS Distributions #include <string.h> 32c1dac77fSApple OSS Distributions 33c1dac77fSApple OSS Distributions #define super OSObject 34c1dac77fSApple OSS Distributions 35c1dac77fSApple OSS Distributions OSDefineMetaClassAndStructors(OSString, OSObject) 36c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 0); 37c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 1); 38c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 2); 39c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 3); 40c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 4); 41c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 5); 42c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 6); 43c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 7); 44c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 8); 45c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 9); 46c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 10); 47c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 11); 48c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 12); 49c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 13); 50c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 14); 51c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(OSString, 15); 52c1dac77fSApple OSS Distributions 53c1dac77fSApple OSS Distributions #if OSALLOCDEBUG 54c1dac77fSApple OSS Distributions extern "C" { 55c1dac77fSApple OSS Distributions extern int debug_container_malloc_size; 56c1dac77fSApple OSS Distributions }; 57c1dac77fSApple OSS Distributions #define ACCUMSIZE(s) do { debug_container_malloc_size += (s); } while(0) 58c1dac77fSApple OSS Distributions #else 59c1dac77fSApple OSS Distributions #define ACCUMSIZE(s) 60c1dac77fSApple OSS Distributions #endif 61c1dac77fSApple OSS Distributions 62c1dac77fSApple OSS Distributions bool OSString::initWithString(const OSString *aString) 63c1dac77fSApple OSS Distributions { 64c1dac77fSApple OSS Distributions return initWithCString(aString->string); 65c1dac77fSApple OSS Distributions } 66c1dac77fSApple OSS Distributions 67c1dac77fSApple OSS Distributions bool OSString::initWithCString(const char *cString) 68c1dac77fSApple OSS Distributions { 69c1dac77fSApple OSS Distributions if (!cString || !super::init()) 70c1dac77fSApple OSS Distributions return false; 71c1dac77fSApple OSS Distributions 72c1dac77fSApple OSS Distributions length = strlen(cString) + 1; 73c1dac77fSApple OSS Distributions string = (char *) kalloc(length); 74c1dac77fSApple OSS Distributions if (!string) 75c1dac77fSApple OSS Distributions return false; 76c1dac77fSApple OSS Distributions 77c1dac77fSApple OSS Distributions bcopy(cString, string, length); 78c1dac77fSApple OSS Distributions 79c1dac77fSApple OSS Distributions ACCUMSIZE(length); 80c1dac77fSApple OSS Distributions 81c1dac77fSApple OSS Distributions return true; 82c1dac77fSApple OSS Distributions } 83c1dac77fSApple OSS Distributions 84c1dac77fSApple OSS Distributions bool OSString::initWithCStringNoCopy(const char *cString) 85c1dac77fSApple OSS Distributions { 86c1dac77fSApple OSS Distributions if (!cString || !super::init()) 87c1dac77fSApple OSS Distributions return false; 88c1dac77fSApple OSS Distributions 89c1dac77fSApple OSS Distributions length = strlen(cString) + 1; 90c1dac77fSApple OSS Distributions flags |= kOSStringNoCopy; 91c1dac77fSApple OSS Distributions string = (char *) cString; 92c1dac77fSApple OSS Distributions 93c1dac77fSApple OSS Distributions return true; 94c1dac77fSApple OSS Distributions } 95c1dac77fSApple OSS Distributions 96c1dac77fSApple OSS Distributions OSString *OSString::withString(const OSString *aString) 97c1dac77fSApple OSS Distributions { 98c1dac77fSApple OSS Distributions OSString *me = new OSString; 99c1dac77fSApple OSS Distributions 100c1dac77fSApple OSS Distributions if (me && !me->initWithString(aString)) { 101c1dac77fSApple OSS Distributions me->free(); 102c1dac77fSApple OSS Distributions return 0; 103c1dac77fSApple OSS Distributions } 104c1dac77fSApple OSS Distributions 105c1dac77fSApple OSS Distributions return me; 106c1dac77fSApple OSS Distributions } 107c1dac77fSApple OSS Distributions 108c1dac77fSApple OSS Distributions OSString *OSString::withCString(const char *cString) 109c1dac77fSApple OSS Distributions { 110c1dac77fSApple OSS Distributions OSString *me = new OSString; 111c1dac77fSApple OSS Distributions 112c1dac77fSApple OSS Distributions if (me && !me->initWithCString(cString)) { 113c1dac77fSApple OSS Distributions me->free(); 114c1dac77fSApple OSS Distributions return 0; 115c1dac77fSApple OSS Distributions } 116c1dac77fSApple OSS Distributions 117c1dac77fSApple OSS Distributions return me; 118c1dac77fSApple OSS Distributions } 119c1dac77fSApple OSS Distributions 120c1dac77fSApple OSS Distributions OSString *OSString::withCStringNoCopy(const char *cString) 121c1dac77fSApple OSS Distributions { 122c1dac77fSApple OSS Distributions OSString *me = new OSString; 123c1dac77fSApple OSS Distributions 124c1dac77fSApple OSS Distributions if (me && !me->initWithCStringNoCopy(cString)) { 125c1dac77fSApple OSS Distributions me->free(); 126c1dac77fSApple OSS Distributions return 0; 127c1dac77fSApple OSS Distributions } 128c1dac77fSApple OSS Distributions 129c1dac77fSApple OSS Distributions return me; 130c1dac77fSApple OSS Distributions } 131c1dac77fSApple OSS Distributions 132c1dac77fSApple OSS Distributions /* @@@ gvdl */ 133c1dac77fSApple OSS Distributions #if 0 134c1dac77fSApple OSS Distributions OSString *OSString::stringWithFormat(const char *format, ...) 135c1dac77fSApple OSS Distributions { 136c1dac77fSApple OSS Distributions #ifndef KERNEL // mach3xxx 137c1dac77fSApple OSS Distributions OSString *me; 138c1dac77fSApple OSS Distributions va_list argList; 139c1dac77fSApple OSS Distributions 140c1dac77fSApple OSS Distributions if (!format) 141c1dac77fSApple OSS Distributions return 0; 142c1dac77fSApple OSS Distributions 143c1dac77fSApple OSS Distributions va_start(argList, format); 144c1dac77fSApple OSS Distributions me = stringWithCapacity(256); 145c1dac77fSApple OSS Distributions me->length = vsnprintf(me->string, 256, format, argList); 146c1dac77fSApple OSS Distributions me->length++; // we include the null in the length 147c1dac77fSApple OSS Distributions if (me->Length > 256) 148c1dac77fSApple OSS Distributions me->Length = 256; 149c1dac77fSApple OSS Distributions va_end (argList); 150c1dac77fSApple OSS Distributions 151c1dac77fSApple OSS Distributions return me; 152c1dac77fSApple OSS Distributions #else 153c1dac77fSApple OSS Distributions return 0; 154c1dac77fSApple OSS Distributions #endif 155c1dac77fSApple OSS Distributions } 156c1dac77fSApple OSS Distributions #endif /* 0 */ 157c1dac77fSApple OSS Distributions 158c1dac77fSApple OSS Distributions void OSString::free() 159c1dac77fSApple OSS Distributions { 160c1dac77fSApple OSS Distributions if ( !(flags & kOSStringNoCopy) && string) { 161c1dac77fSApple OSS Distributions kfree((vm_offset_t)string, (vm_size_t)length); 162c1dac77fSApple OSS Distributions ACCUMSIZE(-length); 163c1dac77fSApple OSS Distributions } 164c1dac77fSApple OSS Distributions 165c1dac77fSApple OSS Distributions super::free(); 166c1dac77fSApple OSS Distributions } 167c1dac77fSApple OSS Distributions 168c1dac77fSApple OSS Distributions unsigned int OSString::getLength() const { return length - 1; } 169c1dac77fSApple OSS Distributions 170c1dac77fSApple OSS Distributions const char *OSString::getCStringNoCopy() const 171c1dac77fSApple OSS Distributions { 172c1dac77fSApple OSS Distributions return string; 173c1dac77fSApple OSS Distributions } 174c1dac77fSApple OSS Distributions 175c1dac77fSApple OSS Distributions bool OSString::setChar(char aChar, unsigned int index) 176c1dac77fSApple OSS Distributions { 177c1dac77fSApple OSS Distributions if ( !(flags & kOSStringNoCopy) && index < length - 1) { 178c1dac77fSApple OSS Distributions string[index] = aChar; 179c1dac77fSApple OSS Distributions 180c1dac77fSApple OSS Distributions return true; 181c1dac77fSApple OSS Distributions } 182c1dac77fSApple OSS Distributions else 183c1dac77fSApple OSS Distributions return false; 184c1dac77fSApple OSS Distributions } 185c1dac77fSApple OSS Distributions 186c1dac77fSApple OSS Distributions char OSString::getChar(unsigned int index) const 187c1dac77fSApple OSS Distributions { 188c1dac77fSApple OSS Distributions if (index < length) 189c1dac77fSApple OSS Distributions return string[index]; 190c1dac77fSApple OSS Distributions else 191c1dac77fSApple OSS Distributions return '\0'; 192c1dac77fSApple OSS Distributions } 193c1dac77fSApple OSS Distributions 194c1dac77fSApple OSS Distributions 195c1dac77fSApple OSS Distributions bool OSString::isEqualTo(const OSString *aString) const 196c1dac77fSApple OSS Distributions { 197c1dac77fSApple OSS Distributions if (length != aString->length) 198c1dac77fSApple OSS Distributions return false; 199c1dac77fSApple OSS Distributions else 200c1dac77fSApple OSS Distributions return isEqualTo((const char *) aString->string); 201c1dac77fSApple OSS Distributions } 202c1dac77fSApple OSS Distributions 203c1dac77fSApple OSS Distributions bool OSString::isEqualTo(const char *aCString) const 204c1dac77fSApple OSS Distributions { 205c1dac77fSApple OSS Distributions return strcmp(string, aCString) == 0; 206c1dac77fSApple OSS Distributions } 207c1dac77fSApple OSS Distributions 208c1dac77fSApple OSS Distributions bool OSString::isEqualTo(const OSMetaClassBase *obj) const 209c1dac77fSApple OSS Distributions { 210c1dac77fSApple OSS Distributions OSString * str; 211c1dac77fSApple OSS Distributions OSData * data; 212c1dac77fSApple OSS Distributions 213c1dac77fSApple OSS Distributions if ((str = OSDynamicCast(OSString, obj))) 214c1dac77fSApple OSS Distributions return isEqualTo(str); 215c1dac77fSApple OSS Distributions else if ((data = OSDynamicCast (OSData, obj))) 216c1dac77fSApple OSS Distributions return isEqualTo(data); 217c1dac77fSApple OSS Distributions else 218c1dac77fSApple OSS Distributions return false; 219c1dac77fSApple OSS Distributions } 220c1dac77fSApple OSS Distributions 221c1dac77fSApple OSS Distributions bool OSString::isEqualTo(const OSData *obj) const 222c1dac77fSApple OSS Distributions { 223c1dac77fSApple OSS Distributions if (NULL == obj) 224c1dac77fSApple OSS Distributions return false; 225c1dac77fSApple OSS Distributions 226c1dac77fSApple OSS Distributions unsigned int dataLen = obj->getLength ();; 227c1dac77fSApple OSS Distributions char * dataPtr = (char *) obj->getBytesNoCopy (); 228c1dac77fSApple OSS Distributions 229c1dac77fSApple OSS Distributions if (dataLen != length) { 230c1dac77fSApple OSS Distributions 231c1dac77fSApple OSS Distributions // check for the fact that OSData may be a buffer that 232c1dac77fSApple OSS Distributions // that includes a termination byte and will thus have 233c1dac77fSApple OSS Distributions // a length of the actual string length PLUS 1. In this 234c1dac77fSApple OSS Distributions // case we verify that the additional byte is a terminator 235c1dac77fSApple OSS Distributions // and if so count the two lengths as being the same. 236c1dac77fSApple OSS Distributions 237c1dac77fSApple OSS Distributions if ( (dataLen - length) == 1 ) { 238c1dac77fSApple OSS Distributions if (dataPtr[dataLen-1] != 0) 239c1dac77fSApple OSS Distributions return false; 240c1dac77fSApple OSS Distributions dataLen--; 241c1dac77fSApple OSS Distributions } 242c1dac77fSApple OSS Distributions else 243c1dac77fSApple OSS Distributions return false; 244c1dac77fSApple OSS Distributions } 245c1dac77fSApple OSS Distributions 246c1dac77fSApple OSS Distributions for ( unsigned int i=0; i < dataLen; i++ ) { 247c1dac77fSApple OSS Distributions if ( *dataPtr++ != string[i] ) 248c1dac77fSApple OSS Distributions return false; 249c1dac77fSApple OSS Distributions } 250c1dac77fSApple OSS Distributions 251c1dac77fSApple OSS Distributions return true; 252c1dac77fSApple OSS Distributions } 253c1dac77fSApple OSS Distributions 254c1dac77fSApple OSS Distributions bool OSString::serialize(OSSerialize *s) const 255c1dac77fSApple OSS Distributions { 256c1dac77fSApple OSS Distributions char *c = string; 257c1dac77fSApple OSS Distributions 258c1dac77fSApple OSS Distributions if (s->previouslySerialized(this)) return true; 259c1dac77fSApple OSS Distributions 260c1dac77fSApple OSS Distributions if (!s->addXMLStartTag(this, "string")) return false; 261c1dac77fSApple OSS Distributions while (*c) { 262c1dac77fSApple OSS Distributions if (*c == '<') { 263c1dac77fSApple OSS Distributions if (!s->addString("<")) return false; 264c1dac77fSApple OSS Distributions } else if (*c == '>') { 265c1dac77fSApple OSS Distributions if (!s->addString(">")) return false; 266c1dac77fSApple OSS Distributions } else if (*c == '&') { 267c1dac77fSApple OSS Distributions if (!s->addString("&")) return false; 268c1dac77fSApple OSS Distributions } else { 269c1dac77fSApple OSS Distributions if (!s->addChar(*c)) return false; 270c1dac77fSApple OSS Distributions } 271c1dac77fSApple OSS Distributions c++; 272c1dac77fSApple OSS Distributions } 273c1dac77fSApple OSS Distributions 274c1dac77fSApple OSS Distributions return s->addXMLEndTag("string"); 275c1dac77fSApple OSS Distributions } 276