aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/singlejar/zip_headers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/singlejar/zip_headers.h')
-rw-r--r--src/tools/singlejar/zip_headers.h38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/tools/singlejar/zip_headers.h b/src/tools/singlejar/zip_headers.h
index 0b3202973a..6d10cc26e5 100644
--- a/src/tools/singlejar/zip_headers.h
+++ b/src/tools/singlejar/zip_headers.h
@@ -29,8 +29,8 @@
#include <endian.h>
#elif defined(__FreeBSD__)
#include <sys/endian.h>
-#elif defined(__APPLE__)
-// Hopefully OSX will keep running solely on little endian CPUs, so:
+#elif defined(__APPLE__) || defined(COMPILER_MSVC)
+// Hopefully OSX and Windows will keep running solely on little endian CPUs, so:
#define le16toh(x) (x)
#define le32toh(x) (x)
#define le64toh(x) (x)
@@ -44,6 +44,13 @@
#include <string>
#include <type_traits>
+#ifdef COMPILER_MSVC
+#pragma pack(push, 1)
+#define attr_packed
+#else
+#define attr_packed __attribute__((packed))
+#endif
+
class ziph {
public:
static const uint8_t *byte_ptr(const void *ptr) {
@@ -116,7 +123,8 @@ class ExtraField {
protected:
uint16_t tag_;
uint16_t payload_size_;
-} __attribute__((packed));
+} attr_packed;
+
static_assert(4 == sizeof(ExtraField),
"ExtraField class fields layout is incorrect.");
@@ -149,7 +157,7 @@ class Zip64ExtraField : public ExtraField {
int attr_count() const { return payload_size() / sizeof(attr_[0]); }
void attr_count(int n) { payload_size(n * sizeof(attr_[0])); }
- // Space needed for this field to accomodate n_attr attributes
+ // Space needed for this field to accommodate n_attr attributes
static uint16_t space_needed(int n_attrs) {
return n_attrs > 0 ? sizeof(Zip64ExtraField) + n_attrs * sizeof(uint64_t)
: 0;
@@ -157,7 +165,7 @@ class Zip64ExtraField : public ExtraField {
private:
uint64_t attr_[];
-} __attribute__((packed));
+} attr_packed;
static_assert(4 == sizeof(Zip64ExtraField),
"Zip64ExtraField class fields layout is incorrect.");
@@ -194,7 +202,7 @@ class UnixTimeExtraField : public ExtraField {
private:
uint8_t flags_;
uint32_t timestamp_[];
-} __attribute__((packed));
+} attr_packed;
static_assert(5 == sizeof(UnixTimeExtraField),
"UnixTimeExtraField layout is incorrect");
@@ -318,7 +326,7 @@ class LH {
uint16_t extra_fields_length_;
char file_name_[0];
// Followed by extra_fields.
-} __attribute__((packed));
+} attr_packed;
static_assert(30 == sizeof(LH), "The fields layout for class LH is incorrect");
/* Data descriptor Record:
@@ -359,7 +367,7 @@ class DDR {
private:
uint32_t optional_signature_;
-} __attribute__((packed));
+} attr_packed;
/* Central Directory Header. */
class CDH {
@@ -519,7 +527,7 @@ class CDH {
uint32_t local_header_offset32_;
char file_name_[0];
// Followed by extra fields and then comment.
-} __attribute__((packed));
+} attr_packed;
static_assert(46 == sizeof(CDH), "Class CDH fields layout is incorrect.");
/* Zip64 End of Central Directory Locator. */
@@ -542,7 +550,7 @@ class ECD64Locator {
uint32_t ecd64_disk_nr_;
uint64_t ecd64_offset_;
uint32_t total_disks_;
-} __attribute__((packed));
+} attr_packed;
static_assert(20 == sizeof(ECD64Locator),
"ECD64Locator class fields layout is incorrect.");
@@ -595,7 +603,7 @@ class ECD {
uint32_t cen_offset32_;
uint16_t comment_length_;
uint8_t comment_[0];
-} __attribute__((packed));
+} attr_packed;
static_assert(22 == sizeof(ECD), "ECD class fields layout is incorrect.");
/* Zip64 end of central directory. */
@@ -642,7 +650,13 @@ class ECD64 {
uint64_t total_entries_;
uint64_t cen_size_;
uint64_t cen_offset_;
-} __attribute__((packed));
+} attr_packed;
static_assert(56 == sizeof(ECD64), "ECD64 class fields layout is incorrect.");
+#ifdef COMPILER_MSVC
+#pragma pack(pop)
+#endif
+
+#undef attr_packed
+
#endif // BAZEL_SRC_TOOLS_SINGLEJAR_ZIP_HEADERS_H_