From e06a808037b032745b77281b81f2017614278aa8 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 22 May 2019 18:56:41 -0700 Subject: [PATCH] Add a std::string overload to Next. All but one existing caller actually wants a std::string. Bug: http://b/129068177 Test: treehugger Change-Id: I428c4453edaae74451db56e9542e4e462f08d43a --- libziparchive/include/ziparchive/zip_archive.h | 4 ++++ libziparchive/unzip.cpp | 5 ++--- libziparchive/zip_archive.cc | 9 +++++++++ libziparchive/zip_archive_benchmark.cpp | 2 +- libziparchive/zip_archive_test.cc | 8 ++++---- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/libziparchive/include/ziparchive/zip_archive.h b/libziparchive/include/ziparchive/zip_archive.h index 46c982d8d..a56a4a292 100644 --- a/libziparchive/include/ziparchive/zip_archive.h +++ b/libziparchive/include/ziparchive/zip_archive.h @@ -25,6 +25,7 @@ #include #include +#include #include #include "android-base/off64_t.h" @@ -35,6 +36,7 @@ enum { kCompressDeflated = 8, // standard deflate }; +// TODO: remove this when everyone's moved over to std::string. struct ZipString { const uint8_t* name; uint16_t name_length; @@ -187,6 +189,8 @@ int32_t StartIteration(ZipArchiveHandle archive, void** cookie_ptr, * Returns 0 on success, -1 if there are no more elements in this * archive and lower negative values on failure. */ +int32_t Next(void* cookie, ZipEntry* data, std::string* name); +// TODO: remove this when everyone's moved over to std::string. int32_t Next(void* cookie, ZipEntry* data, ZipString* name); /* diff --git a/libziparchive/unzip.cpp b/libziparchive/unzip.cpp index 3a3a694b9..426325e93 100644 --- a/libziparchive/unzip.cpp +++ b/libziparchive/unzip.cpp @@ -255,9 +255,8 @@ static void ProcessAll(ZipArchiveHandle zah) { } ZipEntry entry; - ZipString string; - while ((err = Next(cookie, &entry, &string)) >= 0) { - std::string name(string.name, string.name + string.name_length); + std::string name; + while ((err = Next(cookie, &entry, &name)) >= 0) { if (ShouldInclude(name)) ProcessOne(zah, entry, name); } diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc index 269e4ca48..f4b6c74f8 100644 --- a/libziparchive/zip_archive.cc +++ b/libziparchive/zip_archive.cc @@ -747,6 +747,15 @@ int32_t FindEntry(const ZipArchiveHandle archive, const std::string_view entryNa return FindEntry(archive, static_cast(ent), data); } +int32_t Next(void* cookie, ZipEntry* data, std::string* name) { + ZipString zs; + int32_t result = Next(cookie, data, &zs); + if (result == 0) { + *name = std::string(reinterpret_cast(zs.name), zs.name_length); + } + return result; +} + int32_t Next(void* cookie, ZipEntry* data, ZipString* name) { IterationHandle* handle = reinterpret_cast(cookie); if (handle == NULL) { diff --git a/libziparchive/zip_archive_benchmark.cpp b/libziparchive/zip_archive_benchmark.cpp index 434f2e1ef..23ed40811 100644 --- a/libziparchive/zip_archive_benchmark.cpp +++ b/libziparchive/zip_archive_benchmark.cpp @@ -71,7 +71,7 @@ static void Iterate_all_files(benchmark::State& state) { ZipArchiveHandle handle; void* iteration_cookie; ZipEntry data; - ZipString name; + std::string name; while (state.KeepRunning()) { OpenArchive(temp_file->path, &handle); diff --git a/libziparchive/zip_archive_test.cc b/libziparchive/zip_archive_test.cc index 993c975ec..b6ca9ecf5 100644 --- a/libziparchive/zip_archive_test.cc +++ b/libziparchive/zip_archive_test.cc @@ -118,10 +118,10 @@ static void AssertIterationOrder(const std::string_view prefix, const std::strin ZipEntry data; std::vector names; - ZipString name; + std::string name; for (size_t i = 0; i < expected_names_sorted.size(); ++i) { ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); - names.push_back(std::string(reinterpret_cast(name.name), name.name_length)); + names.push_back(name); } // End of iteration. @@ -167,7 +167,7 @@ TEST(ziparchive, IterationWithBadPrefixAndSuffix) { ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, "x", "y")); ZipEntry data; - ZipString name; + std::string name; // End of iteration. ASSERT_EQ(-1, Next(iteration_cookie, &data, &name)); @@ -224,7 +224,7 @@ TEST(ziparchive, TestInvalidDeclaredLength) { void* iteration_cookie; ASSERT_EQ(0, StartIteration(handle, &iteration_cookie)); - ZipString name; + std::string name; ZipEntry data; ASSERT_EQ(Next(iteration_cookie, &data, &name), 0);