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 209ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan#include <string> // for std::string 219ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan 22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Errors.h> 23ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <utils/Unicode.h> 249a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#include <utils/TypeHelpers.h> 25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 26ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <string.h> // for strcmp 27647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown#include <stdarg.h> 2844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 2944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// --------------------------------------------------------------------------- 3044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android { 32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 33ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Rootclass String16; 34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass TextOutput; 35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 3644dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa//! This is a string holding UTF-8 characters. Does not allow the value more 3744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// than 0x10FFFF, which is not valid unicode codepoint. 38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass String8 39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic: 414485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian /* use String8(StaticLinkage) if you're statically linking against 424485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * libutils and declaring an empty static String8, e.g.: 434485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * 444485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAStaticEmptyString(String8::kEmptyString); 454485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAnotherStaticEmptyString(sAStaticEmptyString); 464485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian */ 474485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian enum StaticLinkage { kEmptyString }; 484485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian 49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(); 504485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian explicit String8(StaticLinkage); 51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(const String8& o); 52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o); 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o, size_t numChars); 5495fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const String16& o); 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o); 57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o, size_t numChars); 5844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o); 5944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o, size_t numChars); 60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ~String8(); 611d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 621d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static inline const String8 empty(); 631d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 641d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 format(const char* fmt, ...) __attribute__((format (printf, 1, 2))); 651d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 formatV(const char* fmt, va_list args); 661d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 672aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland inline const char* c_str() const; 68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline const char* string() const; 692aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland 702aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland// TODO(b/35363681): remove 712aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Morelandprivate: 729ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan static inline std::string std_string(const String8& str); 732aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Morelandpublic: 742aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland 75cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t size() const; 76cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t bytes() const; 7748da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown inline bool isEmpty() const; 7895fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 79d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro size_t length() const; 8095fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 8148da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown void clear(); 8248da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 83cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setTo(const String8& other); 84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other); 85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other, size_t numChars); 86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char16_t* other, size_t numChars); 8744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa status_t setTo(const char32_t* other, 8844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t length); 8944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const String8& other); 91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other); 92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other, size_t numChars); 93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 9438fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown status_t appendFormat(const char* fmt, ...) 9538fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown __attribute__((format (printf, 2, 3))); 96647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown status_t appendFormatV(const char* fmt, va_list args); 9735a154e57f2f59722de580395ccd5172e44842cbJeff Brown 9844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // Note that this function takes O(N) time to calculate the value. 9944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // No cache value is stored. 10044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t getUtf32Length() const; 10144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa int32_t getUtf32At(size_t index, 10244dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t *next_index) const; 103ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root void getUtf32(char32_t* dst) const; 10444dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 105cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const String8& other); 106cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const char* other); 10795fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const String8& other); 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const String8& other) const; 11095fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const char* other); 112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const char* other) const; 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline int compare(const String8& other) const; 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const String8& other) const; 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const String8& other) const; 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const String8& other) const; 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const String8& other) const; 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const String8& other) const; 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const String8& other) const; 12295fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const char* other) const; 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const char* other) const; 125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const char* other) const; 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const char* other) const; 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const char* other) const; 128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const char* other) const; 12995fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline operator const char*() const; 13195fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* lockBuffer(size_t size); 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void unlockBuffer(); 134cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t unlockBuffer(size_t size); 13595fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // return the index of the first byte of other in this at or after 137cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // start, or -1 if not found 138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t find(const char* other, size_t start = 0) const; 139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 1405ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // return true if this string contains the specified substring 1415ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown inline bool contains(const char* other) const; 1425ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 1435ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // removes all occurrence of the specified substring 1445ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // returns true if any were found and removed 1455ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown bool removeAll(const char* other); 1465ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(); 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(size_t start, size_t numChars); 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(); 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(size_t start, size_t numChars); 15144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 1525ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * These methods operate on the string as if it were a path name. 155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Set the filename field to a specific value. 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Normalizes the filename, removing a trailing '/' if present. 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name); 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name, size_t numChars); 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Get just the filename component. 167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "bar.c" 169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathLeaf(void) const; 171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Remove the last (file name) component, leaving just the directory 174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * name. 175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo" 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX 178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "" 179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathDir(void) const; 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Retrieve the front (root dir) component. Optionally also return the 184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * remaining components. 185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "tmp" (remain = "foo/bar.c") 187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "tmp" (remain = "") 188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "bar.c" (remain = "") 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 walkPath(String8* outRemains = NULL) const; 191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 19329d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * Return the filename extension. This is the last '.' and any number 19429d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * of characters that follow it. The '.' is included in case we 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * decide to expand our definition of what constitutes an extension. 196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> ".c" 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo.bar/baz" --> "" 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo.jpeg" --> ".jpeg" 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo." --> "" 202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathExtension(void) const; 204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Return the path without the extension. Rules for what constitutes 207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * an extension are described in the comment for getPathExtension(). 208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo/bar" 210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getBasePath(void) const; 212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 213cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Add a component to the pathname. We guarantee that there is 215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * exactly one path separator between the old path and the new. 216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If there is no existing name, we just copy the new name in. 217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If leaf is a fully qualified path (i.e. starts with '/', it 219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * replaces whatever was there before. 220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const char* leaf); 222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const String8& leaf) { return appendPath(leaf.string()); } 223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Like appendPath(), but does not affect this string. Returns a new one instead. 226cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const char* leaf) const 228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project { String8 p(*this); p.appendPath(leaf); return p; } 229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const String8& leaf) const { return appendPathCopy(leaf.string()); } 230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 232cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Converts all separators in this string to /, the default path separator. 233cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 234cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If the default OS separator is backslash, this converts all 235cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * backslashes to slashes, in-place. Otherwise it does nothing. 236cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Returns self. 237cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& convertToResPath(); 239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate: 241cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t real_append(const char* other, size_t numChars); 242cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* find_extension(void) const; 243cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 244cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char* mString; 245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2479a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// String8 can be trivially moved using memcpy() because moving does not 2489a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// require any change to the underlying SharedBuffer contents or reference count. 2499a0a76df1e961ef4621e81814d8bf891a09bef66Jeff BrownANDROID_TRIVIAL_MOVE_TRAIT(String8) 2509a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 251cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 252cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// No user servicable parts below. 253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int compare_type(const String8& lhs, const String8& rhs) 255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return lhs.compare(rhs); 257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 258cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 259cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int strictly_order_type(const String8& lhs, const String8& rhs) 260cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 261cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return compare_type(lhs, rhs) < 0; 262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2641d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Browninline const String8 String8::empty() { 2651d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown return String8(); 2661d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown} 2671d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 2682aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Morelandinline const char* String8::c_str() const 2692aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland{ 2702aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland return mString; 2712aac33512825f958fdbd0c0a2fd2651a6d779d24Steven Moreland} 272cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline const char* String8::string() const 273cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 274cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 275cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 276cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2779ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Taninline std::string String8::std_string(const String8& str) 2789ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan{ 2799ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan return std::string(str.string()); 2809ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan} 2819ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan 282cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::size() const 283cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 284cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return length(); 285cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 286cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 28748da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Browninline bool String8::isEmpty() const 28848da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown{ 28948da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown return length() == 0; 29048da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown} 29148da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 292cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::bytes() const 293cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 294d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro return length(); 295cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 296cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2975ee915afe17b7190f992addc48cb53ed6371a68dJeff Browninline bool String8::contains(const char* other) const 2985ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown{ 2995ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown return find(other) >= 0; 3005ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown} 3015ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 302cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator=(const String8& other) 303cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 304cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 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 setTo(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 String8& other) 315cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 316cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 317cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 318cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 319cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 320cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const String8& other) const 321cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 32223b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 323cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 324cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 325cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 326cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 327cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator+=(const char* other) 328cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 329cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 330cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 331cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 332cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 333cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const char* other) const 334cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 33523b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 336cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 337cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 338cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 339cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 340cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int String8::compare(const String8& other) const 341cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 342cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString); 343cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 344cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 345cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const String8& other) const 346cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 347cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) < 0; 348cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 349cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 350cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const String8& other) const 351cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 352cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) <= 0; 353cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 354cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 355cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const String8& other) const 356cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 3579d589aa0d63e1eb088b10f065ee7fb0765d2e285Brad Fitzpatrick return strcmp(mString, other.mString) == 0; 358cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 359cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 360cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const String8& other) const 361cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 362cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) != 0; 363cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 364cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 365cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const String8& other) const 366cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 367cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) >= 0; 368cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 369cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 370cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const String8& other) const 371cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 372cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) > 0; 373cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 374cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 375cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const char* other) const 376cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 377cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) < 0; 378cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 379cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 380cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const char* other) const 381cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 382cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) <= 0; 383cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 384cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 385cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const char* other) const 386cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 387cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) == 0; 388cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 389cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 390cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const char* other) const 391cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 392cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) != 0; 393cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 394cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 395cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const char* other) const 396cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 397cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) >= 0; 398cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 399cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 400cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const char* other) const 401cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 402cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) > 0; 403cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 404cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 405cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8::operator const char*() const 406cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 407cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 408cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 409cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 41044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa} // namespace android 411cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 412cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 413cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 414cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_STRING8_H 415