Revert "Revert "Revert "Drop all path-related methods from android::String8"""
This reverts commit 4b6a7c3940
.
Reason for revert: b/299695302, b/299694769
Change-Id: I89c6719d23446f2f9ce24e5b75d321538b580431
This commit is contained in:
parent
4b6a7c3940
commit
141255f30c
5 changed files with 375 additions and 8 deletions
|
@ -430,6 +430,31 @@ void String8::toLower()
|
|||
// ---------------------------------------------------------------------------
|
||||
// Path functions
|
||||
|
||||
static void setPathName(String8& s, const char* name) {
|
||||
size_t len = strlen(name);
|
||||
char* buf = s.lockBuffer(len);
|
||||
|
||||
memcpy(buf, name, len);
|
||||
|
||||
// remove trailing path separator, if present
|
||||
if (len > 0 && buf[len - 1] == OS_PATH_SEPARATOR) len--;
|
||||
buf[len] = '\0';
|
||||
|
||||
s.unlockBuffer(len);
|
||||
}
|
||||
|
||||
String8 String8::getPathLeaf(void) const
|
||||
{
|
||||
const char* cp;
|
||||
const char*const buf = mString;
|
||||
|
||||
cp = strrchr(buf, OS_PATH_SEPARATOR);
|
||||
if (cp == nullptr)
|
||||
return String8(*this);
|
||||
else
|
||||
return String8(cp+1);
|
||||
}
|
||||
|
||||
String8 String8::getPathDir(void) const
|
||||
{
|
||||
const char* cp;
|
||||
|
@ -442,14 +467,40 @@ String8 String8::getPathDir(void) const
|
|||
return String8(str, cp - str);
|
||||
}
|
||||
|
||||
String8 String8::walkPath(String8* outRemains) const
|
||||
{
|
||||
const char* cp;
|
||||
const char*const str = mString;
|
||||
const char* buf = str;
|
||||
|
||||
cp = strchr(buf, OS_PATH_SEPARATOR);
|
||||
if (cp == buf) {
|
||||
// don't include a leading '/'.
|
||||
buf = buf+1;
|
||||
cp = strchr(buf, OS_PATH_SEPARATOR);
|
||||
}
|
||||
|
||||
if (cp == nullptr) {
|
||||
String8 res = buf != str ? String8(buf) : *this;
|
||||
if (outRemains) *outRemains = String8("");
|
||||
return res;
|
||||
}
|
||||
|
||||
String8 res(buf, cp-buf);
|
||||
if (outRemains) *outRemains = String8(cp+1);
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for finding the start of an extension in a pathname.
|
||||
*
|
||||
* Returns a pointer inside mString, or NULL if no extension was found.
|
||||
*/
|
||||
static const char* find_extension(const char* str) {
|
||||
char* String8::find_extension(void) const
|
||||
{
|
||||
const char* lastSlash;
|
||||
const char* lastDot;
|
||||
const char* const str = mString;
|
||||
|
||||
// only look at the filename
|
||||
lastSlash = strrchr(str, OS_PATH_SEPARATOR);
|
||||
|
@ -464,16 +515,67 @@ static const char* find_extension(const char* str) {
|
|||
return nullptr;
|
||||
|
||||
// looks good, ship it
|
||||
return lastDot;
|
||||
return const_cast<char*>(lastDot);
|
||||
}
|
||||
|
||||
String8 String8::getPathExtension(void) const
|
||||
{
|
||||
auto ext = find_extension(mString);
|
||||
char* ext;
|
||||
|
||||
ext = find_extension();
|
||||
if (ext != nullptr)
|
||||
return String8(ext);
|
||||
else
|
||||
return String8("");
|
||||
}
|
||||
|
||||
String8 String8::getBasePath(void) const
|
||||
{
|
||||
char* ext;
|
||||
const char* const str = mString;
|
||||
|
||||
ext = find_extension();
|
||||
if (ext == nullptr)
|
||||
return String8(*this);
|
||||
else
|
||||
return String8(str, ext - str);
|
||||
}
|
||||
|
||||
String8& String8::appendPath(const char* name)
|
||||
{
|
||||
// TODO: The test below will fail for Win32 paths. Fix later or ignore.
|
||||
if (name[0] != OS_PATH_SEPARATOR) {
|
||||
if (*name == '\0') {
|
||||
// nothing to do
|
||||
return *this;
|
||||
}
|
||||
|
||||
size_t len = length();
|
||||
if (len == 0) {
|
||||
// no existing filename, just use the new one
|
||||
setPathName(*this, name);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// make room for oldPath + '/' + newPath
|
||||
int newlen = strlen(name);
|
||||
|
||||
char* buf = lockBuffer(len+1+newlen);
|
||||
|
||||
// insert a '/' if needed
|
||||
if (buf[len-1] != OS_PATH_SEPARATOR)
|
||||
buf[len++] = OS_PATH_SEPARATOR;
|
||||
|
||||
memcpy(buf+len, name, newlen+1);
|
||||
len += newlen;
|
||||
|
||||
unlockBuffer(len);
|
||||
|
||||
return *this;
|
||||
} else {
|
||||
setPathName(*this, name);
|
||||
return *this;
|
||||
}
|
||||
}
|
||||
|
||||
}; // namespace android
|
||||
|
|
|
@ -68,6 +68,30 @@ std::vector<std::function<void(FuzzedDataProvider*, android::String8*, android::
|
|||
int start_index = dataProvider->ConsumeIntegralInRange<int>(0, str1->size());
|
||||
str1->find(str2->c_str(), start_index);
|
||||
},
|
||||
|
||||
// Path handling
|
||||
[](FuzzedDataProvider*, android::String8* str1, android::String8*) -> void {
|
||||
str1->getBasePath();
|
||||
},
|
||||
[](FuzzedDataProvider*, android::String8* str1, android::String8*) -> void {
|
||||
str1->getPathExtension();
|
||||
},
|
||||
[](FuzzedDataProvider*, android::String8* str1, android::String8*) -> void {
|
||||
str1->getPathLeaf();
|
||||
},
|
||||
[](FuzzedDataProvider*, android::String8* str1, android::String8*) -> void {
|
||||
str1->getPathDir();
|
||||
},
|
||||
[](FuzzedDataProvider*, android::String8* str1, android::String8*) -> void {
|
||||
std::shared_ptr<android::String8> path_out_str =
|
||||
std::make_shared<android::String8>();
|
||||
str1->walkPath(path_out_str.get());
|
||||
path_out_str->clear();
|
||||
},
|
||||
[](FuzzedDataProvider* dataProvider, android::String8* str1,
|
||||
android::String8*) -> void {
|
||||
str1->appendPath(dataProvider->ConsumeBytesWithTerminator<char>(5).data());
|
||||
},
|
||||
};
|
||||
|
||||
void fuzzFormat(FuzzedDataProvider* dataProvider, android::String8* str1, bool shouldAppend) {
|
||||
|
|
|
@ -703,6 +703,9 @@
|
|||
{
|
||||
"name" : "_ZN7android7RefBaseD2Ev"
|
||||
},
|
||||
{
|
||||
"name" : "_ZN7android7String810appendPathEPKc"
|
||||
},
|
||||
{
|
||||
"name" : "_ZN7android7String810lockBufferEm"
|
||||
},
|
||||
|
@ -1141,6 +1144,15 @@
|
|||
{
|
||||
"name" : "_ZNK7android7String810getPathDirEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String811getBasePathEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String811getPathLeafEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String814find_extensionEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String816getPathExtensionEv"
|
||||
},
|
||||
|
@ -1150,6 +1162,9 @@
|
|||
{
|
||||
"name" : "_ZNK7android7String86lengthEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String88walkPathEPS0_"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android8String1610startsWithEPKDs"
|
||||
},
|
||||
|
@ -6793,6 +6808,22 @@
|
|||
"return_type" : "_ZTIv",
|
||||
"source_file" : "system/core/libutils/include/utils/RefBase.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::appendPath",
|
||||
"linker_set_key" : "_ZN7android7String810appendPathEPKc",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPN7android7String8E"
|
||||
},
|
||||
{
|
||||
"referenced_type" : "_ZTIPKc"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIRN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::lockBuffer",
|
||||
"linker_set_key" : "_ZN7android7String810lockBufferEm",
|
||||
|
@ -9073,7 +9104,6 @@
|
|||
"source_file" : "system/core/libutils/include/utils/RefBase.h"
|
||||
},
|
||||
{
|
||||
"access" : "private",
|
||||
"function_name" : "android::String8::getPathDir",
|
||||
"linker_set_key" : "_ZNK7android7String810getPathDirEv",
|
||||
"parameters" :
|
||||
|
@ -9086,8 +9116,47 @@
|
|||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getBasePath",
|
||||
"linker_set_key" : "_ZNK7android7String811getBasePathEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getPathLeaf",
|
||||
"linker_set_key" : "_ZNK7android7String811getPathLeafEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"access" : "private",
|
||||
"function_name" : "android::String8::find_extension",
|
||||
"linker_set_key" : "_ZNK7android7String814find_extensionEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIPc",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getPathExtension",
|
||||
"linker_set_key" : "_ZNK7android7String816getPathExtensionEv",
|
||||
"parameters" :
|
||||
|
@ -9133,6 +9202,23 @@
|
|||
"return_type" : "_ZTIm",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::walkPath",
|
||||
"linker_set_key" : "_ZNK7android7String88walkPathEPS0_",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
},
|
||||
{
|
||||
"default_arg" : true,
|
||||
"referenced_type" : "_ZTIPN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String16::startsWith",
|
||||
"linker_set_key" : "_ZNK7android8String1610startsWithEPKDs",
|
||||
|
|
|
@ -703,6 +703,9 @@
|
|||
{
|
||||
"name" : "_ZN7android7RefBaseD2Ev"
|
||||
},
|
||||
{
|
||||
"name" : "_ZN7android7String810appendPathEPKc"
|
||||
},
|
||||
{
|
||||
"name" : "_ZN7android7String810lockBufferEj"
|
||||
},
|
||||
|
@ -1141,6 +1144,15 @@
|
|||
{
|
||||
"name" : "_ZNK7android7String810getPathDirEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String811getBasePathEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String811getPathLeafEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String814find_extensionEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String816getPathExtensionEv"
|
||||
},
|
||||
|
@ -1150,6 +1162,9 @@
|
|||
{
|
||||
"name" : "_ZNK7android7String86lengthEv"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android7String88walkPathEPS0_"
|
||||
},
|
||||
{
|
||||
"name" : "_ZNK7android8String1610startsWithEPKDs"
|
||||
},
|
||||
|
@ -6789,6 +6804,22 @@
|
|||
"return_type" : "_ZTIv",
|
||||
"source_file" : "system/core/libutils/include/utils/RefBase.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::appendPath",
|
||||
"linker_set_key" : "_ZN7android7String810appendPathEPKc",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPN7android7String8E"
|
||||
},
|
||||
{
|
||||
"referenced_type" : "_ZTIPKc"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIRN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::lockBuffer",
|
||||
"linker_set_key" : "_ZN7android7String810lockBufferEj",
|
||||
|
@ -9069,7 +9100,6 @@
|
|||
"source_file" : "system/core/libutils/include/utils/RefBase.h"
|
||||
},
|
||||
{
|
||||
"access" : "private",
|
||||
"function_name" : "android::String8::getPathDir",
|
||||
"linker_set_key" : "_ZNK7android7String810getPathDirEv",
|
||||
"parameters" :
|
||||
|
@ -9082,8 +9112,47 @@
|
|||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getBasePath",
|
||||
"linker_set_key" : "_ZNK7android7String811getBasePathEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getPathLeaf",
|
||||
"linker_set_key" : "_ZNK7android7String811getPathLeafEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"access" : "private",
|
||||
"function_name" : "android::String8::find_extension",
|
||||
"linker_set_key" : "_ZNK7android7String814find_extensionEv",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIPc",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::getPathExtension",
|
||||
"linker_set_key" : "_ZNK7android7String816getPathExtensionEv",
|
||||
"parameters" :
|
||||
|
@ -9129,6 +9198,23 @@
|
|||
"return_type" : "_ZTIj",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String8::walkPath",
|
||||
"linker_set_key" : "_ZNK7android7String88walkPathEPS0_",
|
||||
"parameters" :
|
||||
[
|
||||
{
|
||||
"is_this_ptr" : true,
|
||||
"referenced_type" : "_ZTIPKN7android7String8E"
|
||||
},
|
||||
{
|
||||
"default_arg" : true,
|
||||
"referenced_type" : "_ZTIPN7android7String8E"
|
||||
}
|
||||
],
|
||||
"return_type" : "_ZTIN7android7String8E",
|
||||
"source_file" : "system/core/libutils/include/utils/String8.h"
|
||||
},
|
||||
{
|
||||
"function_name" : "android::String16::startsWith",
|
||||
"linker_set_key" : "_ZNK7android8String1610startsWithEPKDs",
|
||||
|
|
|
@ -130,11 +130,80 @@ public:
|
|||
|
||||
void toLower();
|
||||
|
||||
private:
|
||||
String8 getPathDir(void) const;
|
||||
String8 getPathExtension(void) const;
|
||||
|
||||
/*
|
||||
* These methods operate on the string as if it were a path name.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Get just the filename component.
|
||||
*
|
||||
* "/tmp/foo/bar.c" --> "bar.c"
|
||||
*/
|
||||
String8 getPathLeaf(void) const;
|
||||
|
||||
/*
|
||||
* Remove the last (file name) component, leaving just the directory
|
||||
* name.
|
||||
*
|
||||
* "/tmp/foo/bar.c" --> "/tmp/foo"
|
||||
* "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX
|
||||
* "bar.c" --> ""
|
||||
*/
|
||||
String8 getPathDir(void) const;
|
||||
|
||||
/*
|
||||
* Retrieve the front (root dir) component. Optionally also return the
|
||||
* remaining components.
|
||||
*
|
||||
* "/tmp/foo/bar.c" --> "tmp" (remain = "foo/bar.c")
|
||||
* "/tmp" --> "tmp" (remain = "")
|
||||
* "bar.c" --> "bar.c" (remain = "")
|
||||
*/
|
||||
String8 walkPath(String8* outRemains = nullptr) const;
|
||||
|
||||
/*
|
||||
* Return the filename extension. This is the last '.' and any number
|
||||
* of characters that follow it. The '.' is included in case we
|
||||
* decide to expand our definition of what constitutes an extension.
|
||||
*
|
||||
* "/tmp/foo/bar.c" --> ".c"
|
||||
* "/tmp" --> ""
|
||||
* "/tmp/foo.bar/baz" --> ""
|
||||
* "foo.jpeg" --> ".jpeg"
|
||||
* "foo." --> ""
|
||||
*/
|
||||
String8 getPathExtension(void) const;
|
||||
|
||||
/*
|
||||
* Return the path without the extension. Rules for what constitutes
|
||||
* an extension are described in the comment for getPathExtension().
|
||||
*
|
||||
* "/tmp/foo/bar.c" --> "/tmp/foo/bar"
|
||||
*/
|
||||
String8 getBasePath(void) const;
|
||||
|
||||
/*
|
||||
* Add a component to the pathname. We guarantee that there is
|
||||
* exactly one path separator between the old path and the new.
|
||||
* If there is no existing name, we just copy the new name in.
|
||||
*
|
||||
* If leaf is a fully qualified path (i.e. starts with '/', it
|
||||
* replaces whatever was there before.
|
||||
*/
|
||||
String8& appendPath(const char* leaf);
|
||||
String8& appendPath(const String8& leaf) { return appendPath(leaf.c_str()); }
|
||||
|
||||
/*
|
||||
* Like appendPath(), but does not affect this string. Returns a new one instead.
|
||||
*/
|
||||
String8 appendPathCopy(const char* leaf) const
|
||||
{ String8 p(*this); p.appendPath(leaf); return p; }
|
||||
String8 appendPathCopy(const String8& leaf) const { return appendPathCopy(leaf.c_str()); }
|
||||
|
||||
private:
|
||||
status_t real_append(const char* other, size_t numChars);
|
||||
char* find_extension(void) const;
|
||||
|
||||
const char* mString;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue