Support zone.tab in bionic, and remove the file format version.

Bug: 7012465
Change-Id: I6335c91ebadc609fae85bad94db972be7574b6e4
diff --git a/libc/tools/zoneinfo/ZoneCompactor.java b/libc/tools/zoneinfo/ZoneCompactor.java
index 6ce24cf..8a1a628 100644
--- a/libc/tools/zoneinfo/ZoneCompactor.java
+++ b/libc/tools/zoneinfo/ZoneCompactor.java
@@ -107,7 +107,7 @@
     return ret;
   }
 
-  public ZoneCompactor(String setupFile, String dataDirectory, String outputDirectory, String version) throws Exception {
+  public ZoneCompactor(String setupFile, String dataDirectory, String zoneTabFile, String outputDirectory, String version) throws Exception {
     // Read the setup file, and concatenate all the data.
     ByteArrayOutputStream allData = new ByteArrayOutputStream();
     BufferedReader reader = new BufferedReader(new FileReader(setupFile));
@@ -138,6 +138,7 @@
         }
       }
     }
+    reader.close();
 
     // Fill in fields for links.
     Iterator<String> it = links.keySet().iterator();
@@ -156,18 +157,14 @@
 
     // Write the header.
 
-    // byte[12] tzdata_version          -- 'tzdata2012f\0'
-    // int file_format_version          -- probably won't need this, but just in case
-    // int index_offset                 -- likewise
+    // byte[12] tzdata_version -- 'tzdata2012f\0'
+    // int index_offset -- so we can slip in extra header fields in a backwards-compatible way
     // int data_offset
     // int zonetab_offset
 
     // tzdata_version
     f.write(toAscii(new byte[12], version));
 
-    // file_format_version
-    f.writeInt(1);
-
     // Write dummy values for the three offsets, and remember where we need to seek back to later
     // when we have the real values.
     int index_offset_offset = (int) f.getFilePointer();
@@ -201,8 +198,17 @@
     // Write the data.
     f.write(allData.toByteArray());
 
-    // TODO: append the zonetab.
-    int zonetab_offset = 0;
+    // Copy the zone.tab.
+    reader = new BufferedReader(new FileReader(zoneTabFile));
+    while ((s = reader.readLine()) != null) {
+      if (!s.startsWith("#")) {
+        f.writeBytes(s);
+        f.write('\n');
+      }
+    }
+    reader.close();
+
+    int zonetab_offset = (int) f.getFilePointer();
 
     // Go back and fix up the offsets in the header.
     f.seek(index_offset_offset);
@@ -226,10 +232,10 @@
   }
 
   public static void main(String[] args) throws Exception {
-    if (args.length != 4) {
-      System.err.println("usage: java ZoneCompactor <setup file> <data directory> <output directory> <tzdata version>");
+    if (args.length != 5) {
+      System.err.println("usage: java ZoneCompactor <setup file> <data directory> <zone.tab file> <output directory> <tzdata version>");
       System.exit(0);
     }
-    new ZoneCompactor(args[0], args[1], args[2], args[3]);
+    new ZoneCompactor(args[0], args[1], args[2], args[3], args[4]);
   }
 }
diff --git a/libc/tools/zoneinfo/generate b/libc/tools/zoneinfo/generate
index e9ff59b..27d023f 100755
--- a/libc/tools/zoneinfo/generate
+++ b/libc/tools/zoneinfo/generate
@@ -89,7 +89,8 @@
                          '%s/libcore/util/ZoneInfo.java' % libcore_src_dir,
                          '%s/libcore/io/BufferIterator.java' % libcore_src_dir])
   subprocess.check_call(['java', 'ZoneCompactor',
-                         'setup', 'data', bionic_libc_zoneinfo_dir, new_version])
+                         'setup', 'data', 'extracted/zone.tab',
+                         bionic_libc_zoneinfo_dir, new_version])
 
 
 # Run with no arguments from any directory, with no special setup required.
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 31068f1..0ab9e0f 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -2247,13 +2247,11 @@
   }
 
   // byte[12] tzdata_version  -- "tzdata2012f\0"
-  // int file_format_version  -- 1
   // int index_offset
   // int data_offset
   // int zonetab_offset
   struct bionic_tzdata_header {
     char tzdata_version[12];
-    int32_t file_format_version;
     int32_t index_offset;
     int32_t data_offset;
     int32_t zonetab_offset;
@@ -2269,14 +2267,9 @@
     close(fd);
     return -1;
   }
-  if (ntohl(header.file_format_version) != 1) {
-    fprintf(stderr, "%s: bad file format version: %d\n", __FUNCTION__, header.file_format_version);
-    close(fd);
-    return -1;
-  }
 
 #if 0
-  fprintf(stderr, "version: %s (%d)\n", header.tzdata_version, ntohl(header.file_format_version));
+  fprintf(stderr, "version: %s\n", header.tzdata_version);
   fprintf(stderr, "index_offset = %d\n", ntohl(header.index_offset));
   fprintf(stderr, "data_offset = %d\n", ntohl(header.data_offset));
   fprintf(stderr, "zonetab_offset = %d\n", ntohl(header.zonetab_offset));
diff --git a/libc/zoneinfo/tzdata b/libc/zoneinfo/tzdata
index f5fefe2..a1c77d6 100644
--- a/libc/zoneinfo/tzdata
+++ b/libc/zoneinfo/tzdata
Binary files differ