String8.h revision 4485d0d966d062d1b45b635e2447a2d2f96c3f38
1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License. 6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at 7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and 14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License. 15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef ANDROID_STRING8_H 18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define ANDROID_STRING8_H 19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Errors.h> 21ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <utils/SharedBuffer.h> 22ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <utils/Unicode.h> 239a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#include <utils/TypeHelpers.h> 24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 25ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <string.h> // for strcmp 26647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown#include <stdarg.h> 2744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 2844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// --------------------------------------------------------------------------- 2944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android { 31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 32ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Rootclass String16; 33cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass TextOutput; 34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 3544dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa//! This is a string holding UTF-8 characters. Does not allow the value more 3644dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// than 0x10FFFF, which is not valid unicode codepoint. 37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass String8 38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic: 404485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian /* use String8(StaticLinkage) if you're statically linking against 414485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * libutils and declaring an empty static String8, e.g.: 424485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * 434485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAStaticEmptyString(String8::kEmptyString); 444485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAnotherStaticEmptyString(sAStaticEmptyString); 454485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian */ 464485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian enum StaticLinkage { kEmptyString }; 474485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian 48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(); 494485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian explicit String8(StaticLinkage); 50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(const String8& o); 51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o); 52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o, size_t numChars); 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const String16& o); 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o); 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o, size_t numChars); 5744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o); 5844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o, size_t numChars); 59cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ~String8(); 601d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 611d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static inline const String8 empty(); 621d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 631d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 format(const char* fmt, ...) __attribute__((format (printf, 1, 2))); 641d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 formatV(const char* fmt, va_list args); 651d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 66cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline const char* string() const; 67cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t size() const; 68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t length() const; 69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t bytes() const; 7048da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown inline bool isEmpty() const; 71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 72cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline const SharedBuffer* sharedBuffer() const; 73cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 7448da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown void clear(); 7548da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 76cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setTo(const String8& other); 77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other); 78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other, size_t numChars); 79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char16_t* other, size_t numChars); 8044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa status_t setTo(const char32_t* other, 8144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t length); 8244dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 83cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const String8& other); 84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other); 85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other, size_t numChars); 86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 8738fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown status_t appendFormat(const char* fmt, ...) 8838fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown __attribute__((format (printf, 2, 3))); 89647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown status_t appendFormatV(const char* fmt, va_list args); 9035a154e57f2f59722de580395ccd5172e44842cbJeff Brown 9144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // Note that this function takes O(N) time to calculate the value. 9244dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // No cache value is stored. 9344dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t getUtf32Length() const; 9444dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa int32_t getUtf32At(size_t index, 9544dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t *next_index) const; 96ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root void getUtf32(char32_t* dst) const; 9744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 98cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const String8& other); 99cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const char* other); 100cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 101cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const String8& other); 102cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const String8& other) const; 103cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 104cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const char* other); 105cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const char* other) const; 106cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline int compare(const String8& other) const; 108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const String8& other) const; 110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const String8& other) const; 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const String8& other) const; 112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const String8& other) const; 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const String8& other) const; 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const String8& other) const; 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const char* other) const; 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const char* other) const; 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const char* other) const; 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const char* other) const; 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const char* other) const; 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const char* other) const; 122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline operator const char*() const; 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* lockBuffer(size_t size); 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void unlockBuffer(); 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t unlockBuffer(size_t size); 128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // return the index of the first byte of other in this at or after 130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // start, or -1 if not found 131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t find(const char* other, size_t start = 0) const; 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(); 134cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(size_t start, size_t numChars); 135cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(); 136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(size_t start, size_t numChars); 13744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * These methods operate on the string as if it were a path name. 140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Set the filename field to a specific value. 144cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 145cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Normalizes the filename, removing a trailing '/' if present. 146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name); 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name, size_t numChars); 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Get just the filename component. 152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "bar.c" 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathLeaf(void) const; 156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Remove the last (file name) component, leaving just the directory 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * name. 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo" 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "" 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathDir(void) const; 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Retrieve the front (root dir) component. Optionally also return the 169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * remaining components. 170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "tmp" (remain = "foo/bar.c") 172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "tmp" (remain = "") 173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "bar.c" (remain = "") 174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 walkPath(String8* outRemains = NULL) const; 176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 17829d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * Return the filename extension. This is the last '.' and any number 17929d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * of characters that follow it. The '.' is included in case we 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * decide to expand our definition of what constitutes an extension. 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> ".c" 183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" 184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo.bar/baz" --> "" 185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo.jpeg" --> ".jpeg" 186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo." --> "" 187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathExtension(void) const; 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Return the path without the extension. Rules for what constitutes 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * an extension are described in the comment for getPathExtension(). 193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo/bar" 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getBasePath(void) const; 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Add a component to the pathname. We guarantee that there is 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * exactly one path separator between the old path and the new. 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If there is no existing name, we just copy the new name in. 202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If leaf is a fully qualified path (i.e. starts with '/', it 204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * replaces whatever was there before. 205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const char* leaf); 207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const String8& leaf) { return appendPath(leaf.string()); } 208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Like appendPath(), but does not affect this string. Returns a new one instead. 211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const char* leaf) const 213cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project { String8 p(*this); p.appendPath(leaf); return p; } 214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const String8& leaf) const { return appendPathCopy(leaf.string()); } 215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Converts all separators in this string to /, the default path separator. 218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If the default OS separator is backslash, this converts all 220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * backslashes to slashes, in-place. Otherwise it does nothing. 221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Returns self. 222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& convertToResPath(); 224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate: 226cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t real_append(const char* other, size_t numChars); 227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* find_extension(void) const; 228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char* mString; 230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2329a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// String8 can be trivially moved using memcpy() because moving does not 2339a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// require any change to the underlying SharedBuffer contents or reference count. 2349a0a76df1e961ef4621e81814d8bf891a09bef66Jeff BrownANDROID_TRIVIAL_MOVE_TRAIT(String8) 2359a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 236cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 237cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// No user servicable parts below. 238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int compare_type(const String8& lhs, const String8& rhs) 240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 241cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return lhs.compare(rhs); 242cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 243cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 244cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int strictly_order_type(const String8& lhs, const String8& rhs) 245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return compare_type(lhs, rhs) < 0; 247cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 248cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2491d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Browninline const String8 String8::empty() { 2501d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown return String8(); 2511d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown} 2521d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline const char* String8::string() const 254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 258cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::length() const 259cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 260cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return SharedBuffer::sizeFromData(mString)-1; 261cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::size() const 264cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 265cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return length(); 266cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 267cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 26848da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Browninline bool String8::isEmpty() const 26948da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown{ 27048da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown return length() == 0; 27148da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown} 27248da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 273cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::bytes() const 274cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 275cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return SharedBuffer::sizeFromData(mString)-1; 276cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 277cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 278cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline const SharedBuffer* String8::sharedBuffer() const 279cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 280cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return SharedBuffer::bufferFromData(mString); 281cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 282cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 283cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator=(const String8& other) 284cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 285cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 286cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 287cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 288cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 289cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator=(const char* other) 290cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 291cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 292cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 293cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 294cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 295cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator+=(const String8& other) 296cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 297cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 298cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 299cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 300cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 301cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const String8& other) const 302cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 30323b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 304cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 306cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 307cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 308cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator+=(const char* other) 309cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 310cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 311cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 312cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 313cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 314cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const char* other) const 315cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 31623b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 317cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 318cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 319cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 320cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 321cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int String8::compare(const String8& other) const 322cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 323cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString); 324cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 325cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 326cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const String8& other) const 327cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 328cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) < 0; 329cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 330cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 331cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const String8& other) const 332cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 333cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) <= 0; 334cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 335cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 336cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const String8& other) const 337cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 3389d589aa0d63e1eb088b10f065ee7fb0765d2e285Brad Fitzpatrick return strcmp(mString, other.mString) == 0; 339cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 340cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 341cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const String8& other) const 342cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 343cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) != 0; 344cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 345cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 346cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const String8& other) const 347cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 348cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) >= 0; 349cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 350cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 351cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const String8& other) const 352cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 353cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) > 0; 354cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 355cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 356cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const char* other) const 357cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 358cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) < 0; 359cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 360cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 361cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const char* other) const 362cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 363cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) <= 0; 364cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 365cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 366cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const char* other) const 367cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 368cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) == 0; 369cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 370cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 371cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const char* other) const 372cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 373cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) != 0; 374cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 375cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 376cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const char* other) const 377cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 378cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) >= 0; 379cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 380cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 381cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const char* other) const 382cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 383cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) > 0; 384cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 385cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 386cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8::operator const char*() const 387cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 388cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 389cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 390cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 39144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa} // namespace android 392cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 393cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 394cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 395cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_STRING8_H 396