[Pkg-ocaml-maint-commits] [camlzip] 01/09: New upstream version 1.06

Ralf Treinen treinen at moszumanska.debian.org
Sat Sep 10 18:34:27 UTC 2016


This is an automated email from the git hooks/post-receive script.

treinen pushed a commit to branch master
in repository camlzip.

commit ff813e389c39bd4b3f86ce222add09277a0a81d0
Author: Ralf Treinen <treinen at free.fr>
Date:   Thu Sep 8 20:40:58 2016 +0200

    New upstream version 1.06
---
 Changes          |  7 +++++
 META             |  2 +-
 Makefile         | 12 ++++----
 README           |  4 +--
 gzip.ml          | 62 +++++++++++++++++++++++------------------
 gzip.mli         | 12 +++++---
 test/minigzip.ml |  8 +++---
 test/minizip.ml  |  2 +-
 zip.ml           | 84 +++++++++++++++++++++++++++++---------------------------
 zip.mli          |  6 ++--
 zlib.ml          | 23 +++++++++-------
 zlib.mli         | 18 ++++++------
 zlibstubs.c      |  5 ++--
 13 files changed, 137 insertions(+), 108 deletions(-)

diff --git a/Changes b/Changes
index 0ff2ad4..3e24fff 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,10 @@
+Release 1.06:
+- Switch to "safe string" mode.  Some API functions that use to take strings
+  now take byte sequences instead.  OCaml 4.02 or up is required.
+- Update for OCaml 4.03.
+- Avoid Zlib error when calling Gzip.output with length = 0.
+- Improve support for ZIP files / ZIP file members greater than 2 Gbytes.
+
 Release 1.05:
 - Added support for findlib (Contributed by E. Friendly)
 
diff --git a/META b/META
index 9ea2d10..cc4c1b3 100644
--- a/META
+++ b/META
@@ -1,4 +1,4 @@
-version="1.05"
+version="1.06"
 requires="unix"
 archive(byte)="zip.cma"
 archive(native)="zip.cmxa"
diff --git a/Makefile b/Makefile
index a9f7178..1e1503f 100644
--- a/Makefile
+++ b/Makefile
@@ -4,10 +4,12 @@
 ZLIB_LIB=-lz
 
 # The directory containing the Zlib library (libz.a or libz.so)
-ZLIB_LIBDIR=/usr/local/lib
+ZLIB_LIBDIR=/usr/lib
+# ZLIB_LIBDIR=/usr/local/lib
 
 # The directory containing the Zlib header file (zlib.h)
-ZLIB_INCLUDE=/usr/local/include
+ZLIB_INCLUDE=/usr/include
+# ZLIB_INCLUDE=/usr/local/include
 
 # Where to install the library.  By default: sub-directory 'zip' of
 # OCaml's standard library directory.
@@ -15,8 +17,8 @@ INSTALLDIR=`$(OCAMLC) -where`/zip
 
 ### End of configuration section
 
-OCAMLC=ocamlc -g
-OCAMLOPT=ocamlopt
+OCAMLC=ocamlc -g -safe-string
+OCAMLOPT=ocamlopt -safe-string
 OCAMLDEP=ocamldep
 OCAMLMKLIB=ocamlmklib
 
@@ -52,7 +54,7 @@ libcamlzip.a: $(C_OBJS)
 
 clean:
 	rm -f *.cm*
-	rm -f *.o *.a
+	rm -f *.o *.a *.so
 
 install:
 	mkdir -p $(INSTALLDIR)
diff --git a/README b/README
index 68dc7da..847be91 100644
--- a/README
+++ b/README
@@ -8,7 +8,7 @@ for reading from and writing to compressed files in these formats.
 
 REQUIREMENTS:
 
-- Objective Caml 3.06 or up.
+- Objective Caml 4.02 or up.
 
 - The Zlib C library, version 1.1.3 or up.  If it is not installed on
   your system (look for libz.a or libz.so), get it from
@@ -47,7 +47,7 @@ The directory test/ contains examples of using this library.
 
 LICENSING:
 
-This library is copyright 2001, 2002, 2006, 2007, 2008
+This library is copyright 2001, 2002, 2006, 2007, 2008, 2016
 Institut National de Recherche en Informatique et en Automatique (INRIA),
 and distributed under the terms of the GNU Lesser General Public
 License (LGPL) version 2.1 or above, with a special exception
diff --git a/gzip.ml b/gzip.ml
index b823b8c..b90d46b 100644
--- a/gzip.ml
+++ b/gzip.ml
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: gzip.ml 32 2016-06-10 09:30:19Z xleroy $ *)
 
 (* Module [Gzip]: reading and writing to/from [gzip] compressed files *)
 
@@ -21,7 +21,7 @@ let buffer_size = 1024
 
 type in_channel =
   { in_chan: Pervasives.in_channel;
-    in_buffer: string;
+    in_buffer: bytes;
     mutable in_pos: int;
     mutable in_avail: int;
     mutable in_eof: bool;
@@ -65,7 +65,7 @@ let open_in_chan ic =
     raise(Error("premature end of file, not a gzip file"))
   end;
   { in_chan = ic;
-    in_buffer = String.create buffer_size;
+    in_buffer = Bytes.create buffer_size;
     in_pos = 0;
     in_avail = 0;
     in_eof = false;
@@ -79,12 +79,12 @@ let open_in filename =
 let read_byte iz =
   if iz.in_avail = 0 then begin
     let n = Pervasives.input iz.in_chan iz.in_buffer 0
-                             (String.length iz.in_buffer) in
+                             (Bytes.length iz.in_buffer) in
     if n = 0 then raise End_of_file;
     iz.in_pos <- 0;
     iz.in_avail <- n
   end;
-  let c = iz.in_buffer.[iz.in_pos] in
+  let c = Bytes.get iz.in_buffer iz.in_pos in
   iz.in_pos <- iz.in_pos + 1;
   iz.in_avail <- iz.in_avail - 1;
   Char.code c
@@ -100,12 +100,12 @@ let read_int32 iz =
                    (Int32.shift_left (Int32.of_int b4) 24)))
 
 let rec input iz buf pos len =
-  if pos < 0 || len < 0 || pos + len > String.length buf then
+  if pos < 0 || len < 0 || pos + len > Bytes.length buf then
     invalid_arg "Gzip.input";
   if iz.in_eof then 0 else begin
     if iz.in_avail = 0 then begin
       let n = Pervasives.input iz.in_chan iz.in_buffer 0
-                               (String.length iz.in_buffer) in
+                               (Bytes.length iz.in_buffer) in
       if n = 0 then raise(Error("truncated file"));
       iz.in_pos <- 0;
       iz.in_avail <- n
@@ -146,10 +146,12 @@ let rec really_input iz buf pos len =
     really_input iz buf (pos + n) (len - n)
   end
 
-let char_buffer = String.create 1
+let char_buffer = Bytes.create 1
 
 let input_char iz =
-  if input iz char_buffer 0 1 = 0 then raise End_of_file else char_buffer.[0]
+  if input iz char_buffer 0 1 = 0
+  then raise End_of_file
+  else Bytes.get char_buffer 0
 
 let input_byte iz =
   Char.code (input_char iz)
@@ -164,7 +166,7 @@ let close_in iz =
 
 type out_channel =
   { out_chan: Pervasives.out_channel;
-    out_buffer: string;
+    out_buffer: bytes;
     mutable out_pos: int;
     mutable out_avail: int;
     out_stream: Zlib.stream;
@@ -182,7 +184,7 @@ let open_out_chan ?(level = 6) oc =
   output_byte oc 0;                     (* xflags *)
   output_byte oc 0xFF;                  (* OS (unknown) *)
   { out_chan = oc;
-    out_buffer = String.create buffer_size;
+    out_buffer = Bytes.create buffer_size;
     out_pos = 0;
     out_avail = buffer_size;
     out_stream = Zlib.deflate_init level false;
@@ -193,29 +195,35 @@ let open_out ?(level = 6) filename =
   open_out_chan ~level (Pervasives.open_out_bin filename)
 
 let rec output oz buf pos len =
-  if pos < 0 || len < 0 || pos + len > String.length buf then
+  if pos < 0 || len < 0 || pos + len > Bytes.length buf then
     invalid_arg "Gzip.output";
   (* If output buffer is full, flush it *)
   if oz.out_avail = 0 then begin
     Pervasives.output oz.out_chan oz.out_buffer 0 oz.out_pos;
     oz.out_pos <- 0;
-    oz.out_avail <- String.length oz.out_buffer
+    oz.out_avail <- Bytes.length oz.out_buffer
   end;
-  let (_, used_in, used_out) =
-    try
-      Zlib.deflate oz.out_stream buf pos len
-                                 oz.out_buffer oz.out_pos oz.out_avail
-                                 Zlib.Z_NO_FLUSH
-    with Zlib.Error(_, _) ->
-      raise (Error("error during compression")) in
-  oz.out_pos <- oz.out_pos + used_out;
-  oz.out_avail <- oz.out_avail - used_out;
-  oz.out_size <- Int32.add oz.out_size (Int32.of_int used_in);
-  oz.out_crc <- Zlib.update_crc oz.out_crc buf pos used_in;
-  if used_in < len then output oz buf (pos + used_in) (len - used_in)
+  (* Patch request #1428: Zlib disallows zero-length writes *)
+  if len > 0 then begin
+    let (_, used_in, used_out) =
+      try
+        Zlib.deflate oz.out_stream buf pos len
+                                   oz.out_buffer oz.out_pos oz.out_avail
+                                   Zlib.Z_NO_FLUSH
+      with Zlib.Error(_, _) ->
+        raise (Error("error during compression")) in
+    oz.out_pos <- oz.out_pos + used_out;
+    oz.out_avail <- oz.out_avail - used_out;
+    oz.out_size <- Int32.add oz.out_size (Int32.of_int used_in);
+    oz.out_crc <- Zlib.update_crc oz.out_crc buf pos used_in;
+    if used_in < len then output oz buf (pos + used_in) (len - used_in)
+  end
+
+let output_substring oz buf pos len =
+  output oz (Bytes.unsafe_of_string buf) pos len
 
 let output_char oz c =
-  char_buffer.[0] <- c;
+  Bytes.set char_buffer 0 c;
   output oz char_buffer 0 1
 
 let output_byte oz b =
@@ -234,7 +242,7 @@ let flush oz =
     if oz.out_avail = 0 then begin
       Pervasives.output oz.out_chan oz.out_buffer 0 oz.out_pos;
       oz.out_pos <- 0;
-      oz.out_avail <- String.length oz.out_buffer
+      oz.out_avail <- Bytes.length oz.out_buffer
     end;
     let (finished, _, used_out) =
       Zlib.deflate oz.out_stream oz.out_buffer 0 0
diff --git a/gzip.mli b/gzip.mli
index 0f3633f..316b479 100644
--- a/gzip.mli
+++ b/gzip.mli
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: gzip.mli 32 2016-06-10 09:30:19Z xleroy $ *)
 
 (** Reading and writing to/from [gzip] compressed files
 
@@ -36,7 +36,7 @@ val input_byte: in_channel -> int
        (** Same as [Gzip.input_char], but return the 8-bit integer
            representing the character.
            Raise [End_of_file] if no more compressed data is available. *)
-val input: in_channel -> string -> int -> int -> int
+val input: in_channel -> bytes -> int -> int -> int
        (** [input ic buf pos len] uncompresses up to [len] characters
            from the given channel [ic],
            storing them in string [buf], starting at character number [pos].
@@ -52,7 +52,7 @@ val input: in_channel -> string -> int -> int -> int
            exactly [len] characters.)
            Exception [Invalid_argument "Gzip.input"] is raised if
            [pos] and [len] do not designate a valid substring of [buf]. *)
-val really_input: in_channel -> string -> int -> int -> unit
+val really_input: in_channel -> bytes -> int -> int -> unit
        (** [really_input ic buf pos len] uncompresses [len] characters
            from the given channel, storing them in
            string [buf], starting at character number [pos].
@@ -96,12 +96,16 @@ val output_char: out_channel -> char -> unit
 val output_byte: out_channel -> int -> unit
        (** Same as [Gzip.output_char], but the output character is given
            by its code.  The given integer is taken modulo 256. *)
-val output: out_channel -> string -> int -> int -> unit
+val output: out_channel -> bytes -> int -> int -> unit
        (** [output oc buf pos len] compresses and writes [len] characters
            from string [buf], starting at offset [pos], and writes the
            compressed data to the channel [oc].
            Raise [Invalid_argument "Gzip.output"] if
            [pos] and [len] do not designate a valid substring of [buf]. *)
+val output_substring: out_channel -> string -> int -> int -> unit
+       (** Same as [output], but takes a string as argument instead of
+           a byte sequence.
+          @since 1.06 *)
 val close_out: out_channel -> unit
        (** Close the given output channel.  If the channel was created with
            [Gzip.open_out_chan], the underlying regular file channel
diff --git a/test/minigzip.ml b/test/minigzip.ml
index f3d2f4c..79e1837 100644
--- a/test/minigzip.ml
+++ b/test/minigzip.ml
@@ -11,23 +11,23 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: minigzip.ml 32 2016-06-10 09:30:19Z xleroy $ *)
 
-let buffer = String.create 4096
+let buffer = Bytes.create 4096
 
 let _ =
   if Array.length Sys.argv >= 2 && Sys.argv.(1) = "-d" then begin
     (* decompress *)
     let ic = Gzip.open_in_chan stdin in
     let rec decompress () =
-      let n = Gzip.input ic buffer 0 (String.length buffer) in
+      let n = Gzip.input ic buffer 0 (Bytes.length buffer) in
       if n = 0 then () else begin output stdout buffer 0 n; decompress() end
     in decompress(); Gzip.dispose ic
   end else begin
     (* compress *)
     let oc = Gzip.open_out_chan stdout in
     let rec compress () =
-      let n = input stdin buffer 0 (String.length buffer) in
+      let n = input stdin buffer 0 (Bytes.length buffer) in
       if n = 0 then () else begin Gzip.output oc buffer 0 n; compress() end
     in compress(); Gzip.flush oc
   end
diff --git a/test/minizip.ml b/test/minizip.ml
index dcfbab4..90742d5 100644
--- a/test/minizip.ml
+++ b/test/minizip.ml
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: minizip.ml 14 2006-04-04 08:29:07Z xleroy $ *)
 
 open Printf
 
diff --git a/zip.ml b/zip.ml
index f49b91a..e36b1bb 100644
--- a/zip.ml
+++ b/zip.ml
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: zip.ml 35 2016-06-10 12:48:10Z xleroy $ *)
 
 (* Module [Zip]: reading and writing ZIP archives *)
 
@@ -28,8 +28,8 @@ let read4_int ic =
   if hw > max_int lsr 16 then raise (Error("", "", "32-bit data too large"));
   lw lor (hw lsl 16)
 let readstring ic n =
-  let s = String.create n in
-  really_input ic s 0 n; s
+  let s = Bytes.create n in
+  really_input ic s 0 n; Bytes.unsafe_to_string s
 
 let write1 = output_byte
 let write2 oc n =
@@ -41,7 +41,7 @@ let write4_int oc n =
   write2 oc n;
   write2 oc (n lsr 16)
 let writestring oc s =
-  output oc s 0 (String.length s)
+  output_string oc s
 
 type compression_method = Stored | Deflated
 
@@ -73,16 +73,14 @@ type out_file =
     mutable of_entries: entry list;
     of_comment: string }
 
-exception Error of string * string * string
-
-(* Return the position of the last occurrence of s1 in s2, or -1 if not
-   found. *)
+(* Return the position of the last occurrence of [pattern] in [buf],
+   or -1 if not found. *)
 
-let strrstr pattern buf ofs len =
+let strrstr (pattern: string) (buf: bytes) ofs len =
   let rec search i j =
     if i < ofs then -1
     else if j >= String.length pattern then i
-    else if pattern.[j] = buf.[i + j] then search i (j+1)
+    else if String.get pattern j = Bytes.get buf (i + j) then search i (j+1)
     else search (i-1) 0
   in search (ofs + len - String.length pattern) 0
 
@@ -117,30 +115,31 @@ let dostime_of_unixtime t =
 (* Read end of central directory record *)
 
 let read_ecd filename ic =
-  let buf = String.create 256 in
-  let filelen = in_channel_length ic in
+  let buf = Bytes.create 256 in
+  let filelen = LargeFile.in_channel_length ic in
   let rec find_ecd pos len =
     (* On input, bytes 0 ... len - 1 of buf reflect what is at pos in ic *)
-    if pos <= 0 || filelen - pos >= 0x10000 then
+    if pos <= 0L || Int64.sub filelen pos >= 0x10000L then
       raise (Error(filename, "",
                    "end of central directory not found, not a ZIP file"));
-    let toread = min pos 128 in
+    let toread = if pos >= 128L then 128 else Int64.to_int pos in
     (* Make room for "toread" extra bytes, and read them *)
-    String.blit buf 0 buf toread (256 - toread);
-    let newpos = pos - toread in
-    seek_in ic newpos;
+    Bytes.blit buf 0 buf toread (256 - toread);
+    let newpos = Int64.(sub pos (of_int toread)) in
+    LargeFile.seek_in ic newpos;
     really_input ic buf 0 toread;
     let newlen = min (toread + len) 256 in
     (* Search for magic number *)
     let ofs = strrstr "PK\005\006" buf 0 newlen in
     if ofs < 0 || newlen < 22 || 
        (let comment_len = 
-          Char.code buf.[ofs + 20] lor (Char.code buf.[ofs + 21] lsl 8) in
-        newpos + ofs + 22 + comment_len <> filelen) then
+              (Char.code (Bytes.get buf (ofs + 20)))
+          lor ((Char.code (Bytes.get buf (ofs + 21))) lsl 8) in
+        Int64.(add newpos (of_int (ofs + 22 + comment_len))) <> filelen) then
       find_ecd newpos newlen
     else
-      newpos + ofs in
-  seek_in ic (find_ecd filelen 0);
+      Int64.(add newpos (of_int ofs)) in
+  LargeFile.seek_in ic (find_ecd filelen 0);
   let magic = read4 ic in
   let disk_no = read2 ic in
   let cd_disk_no = read2 ic in
@@ -157,10 +156,13 @@ let read_ecd filename ic =
 
 (* Read central directory *)
 
+let int64_of_uint32 n =
+  Int64.(logand (of_int32 n) 0xFFFF_FFFFL)
+
 let read_cd filename ic cd_entries cd_offset cd_bound =
-  let cd_bound = Int64.of_int32 cd_bound in
+  let cd_bound = int64_of_uint32 cd_bound in
   try
-    LargeFile.seek_in ic (Int64.of_int32 cd_offset);
+    LargeFile.seek_in ic (int64_of_uint32 cd_offset);
     let e = ref [] in
     let entrycnt = ref 0 in
     while (LargeFile.pos_in ic < cd_bound) do
@@ -181,7 +183,7 @@ let read_cd filename ic cd_entries cd_offset cd_bound =
       let _disk_number = read2 ic in
       let _internal_attr = read2 ic in
       let _external_attr = read4 ic in
-      let header_offset = Int64.of_int32(read4 ic) in
+      let header_offset = int64_of_uint32 (read4 ic) in
       let name = readstring ic name_len in
       let extra = readstring ic extra_len in
       let comment = readstring ic comment_len in
@@ -269,14 +271,14 @@ let goto_entry ifile e =
 let read_entry ifile e =
   try
     goto_entry ifile e;
-    let res = String.create e.uncompressed_size in
+    let res = Bytes.create e.uncompressed_size in
     match e.methd with
       Stored ->
         if e.compressed_size <> e.uncompressed_size then
           raise (Error(ifile.if_filename, e.filename,
                        "wrong size for stored entry"));
         really_input ifile.if_channel res 0 e.uncompressed_size;
-        res
+        Bytes.unsafe_to_string res
     | Deflated ->
         let in_avail = ref e.compressed_size in
         let out_pos = ref 0 in
@@ -284,25 +286,25 @@ let read_entry ifile e =
           Zlib.uncompress ~header:false
             (fun buf ->
               let read = input ifile.if_channel buf 0
-                               (min !in_avail (String.length buf)) in
+                               (min !in_avail (Bytes.length buf)) in
               in_avail := !in_avail - read;
               read)
             (fun buf len ->
-              if !out_pos + len > String.length res then
+              if !out_pos + len > Bytes.length res then
                 raise (Error(ifile.if_filename, e.filename,
                              "wrong size for deflated entry (too much data)"));
-              String.blit buf 0 res !out_pos len;
+              Bytes.blit buf 0 res !out_pos len;
               out_pos := !out_pos + len)
         with Zlib.Error(_, _) ->
           raise (Error(ifile.if_filename, e.filename, "decompression error"))
         end;
-        if !out_pos <> String.length res then
+        if !out_pos <> Bytes.length res then
           raise (Error(ifile.if_filename, e.filename,
                        "wrong size for deflated entry (not enough data)"));
-        let crc = Zlib.update_crc Int32.zero res 0 (String.length res) in
+        let crc = Zlib.update_crc Int32.zero res 0 (Bytes.length res) in
         if crc <> e.crc then
           raise (Error(ifile.if_filename, e.filename, "CRC mismatch"));
-        res
+        Bytes.unsafe_to_string res
   with End_of_file ->
     raise (Error(ifile.if_filename, e.filename, "truncated data"))
     
@@ -316,10 +318,10 @@ let copy_entry_to_channel ifile e oc =
         if e.compressed_size <> e.uncompressed_size then
           raise (Error(ifile.if_filename, e.filename,
                        "wrong size for stored entry"));
-        let buf = String.create 4096 in
+        let buf = Bytes.create 4096 in
         let rec copy n =
           if n > 0 then begin
-            let r = input ifile.if_channel buf 0 (min n (String.length buf)) in
+            let r = input ifile.if_channel buf 0 (min n (Bytes.length buf)) in
             output oc buf 0 r;
             copy (n - r)
           end in
@@ -331,7 +333,7 @@ let copy_entry_to_channel ifile e oc =
           Zlib.uncompress ~header:false
             (fun buf ->
               let read = input ifile.if_channel buf 0
-                               (min !in_avail (String.length buf)) in
+                               (min !in_avail (Bytes.length buf)) in
               in_avail := !in_avail - read;
               read)
             (fun buf len ->
@@ -472,11 +474,11 @@ let add_data_descriptor ofile crc compr_size uncompr_size entry =
 let add_entry data ofile ?(extra = "") ?(comment = "") 
                          ?(level = 6) ?(mtime = Unix.time()) name =
   let e = add_entry_header ofile extra comment level mtime name in
-  let crc = Zlib.update_crc Int32.zero data 0 (String.length data) in
+  let crc = Zlib.update_crc_string Int32.zero data 0 (String.length data) in
   let compr_size =
     match level with
       0 ->
-        output ofile.of_channel data 0 (String.length data);
+        output_substring ofile.of_channel data 0 (String.length data);
         String.length data
     | _ ->
         let in_pos = ref 0 in
@@ -485,7 +487,7 @@ let add_entry data ofile ?(extra = "") ?(comment = "")
           Zlib.compress ~level ~header:false
             (fun buf ->
                let n = min (String.length data - !in_pos)
-                           (String.length buf) in
+                           (Bytes.length buf) in
                String.blit data !in_pos buf 0 n;
                in_pos := !in_pos + n;
                n)
@@ -507,9 +509,9 @@ let copy_channel_to_entry ic ofile ?(extra = "") ?(comment = "")
   let (compr_size, uncompr_size) =
     match level with
       0 ->
-        let buf = String.create 4096 in
+        let buf = Bytes.create 4096 in
         let rec copy sz =
-          let r = input ic buf 0 (String.length buf) in
+          let r = input ic buf 0 (Bytes.length buf) in
           if r = 0 then sz else begin
             crc := Zlib.update_crc !crc buf 0 r;
             output ofile.of_channel buf 0 r;
@@ -523,7 +525,7 @@ let copy_channel_to_entry ic ofile ?(extra = "") ?(comment = "")
         try
           Zlib.compress ~level ~header:false
             (fun buf ->
-               let r = input ic buf 0 (String.length buf) in
+               let r = input ic buf 0 (Bytes.length buf) in
                crc := Zlib.update_crc !crc buf 0 r;
                in_pos := !in_pos + r;
                r)
diff --git a/zip.mli b/zip.mli
index 8f7e3ad..7fc25ce 100644
--- a/zip.mli
+++ b/zip.mli
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: zip.mli 32 2016-06-10 09:30:19Z xleroy $ *)
 
 (** Reading and writing ZIP archives
 
@@ -146,7 +146,7 @@ val copy_file_to_entry:
 val add_entry_generator:
   out_file ->
     ?extra: string -> ?comment: string -> ?level: int ->
-    ?mtime: float -> string -> (string -> int -> int -> unit) * (unit -> unit)
+    ?mtime: float -> string -> (bytes -> int -> int -> unit) * (unit -> unit)
           (** [Zip.add_entry_generator zf name] returns a pair of functions
               [(add, finish)].  It adds a new entry to the 
               ZIP file [zf].  The file name stored along with this entry
@@ -154,7 +154,7 @@ val add_entry_generator:
               To store data in this entry, the program must repeatedly call
               the [add] function returned by [Zip.add_entry_generator].
               An invocation [add s ofs len] stores [len] characters of
-              string [s] starting at offset [ofs] in the ZIP entry.
+              byte sequence [s] starting at offset [ofs] in the ZIP entry.
               When all the data forming the entry has been sent, the
               program must call the [finish] function returned by
               [Zip.add_entry_generator].  [finish] must be called exactly once.
diff --git a/zlib.ml b/zlib.ml
index d55a3e4..186ac26 100644
--- a/zlib.ml
+++ b/zlib.ml
@@ -11,7 +11,7 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: zlib.ml 32 2016-06-10 09:30:19Z xleroy $ *)
 
 exception Error of string * string
 
@@ -28,26 +28,28 @@ type flush_command =
 
 external deflate_init: int -> bool -> stream = "camlzip_deflateInit"
 external deflate:
-  stream -> string -> int -> int -> string -> int -> int -> flush_command
+  stream -> bytes -> int -> int -> bytes -> int -> int -> flush_command
          -> bool * int * int
   = "camlzip_deflate_bytecode" "camlzip_deflate"
 external deflate_end: stream -> unit = "camlzip_deflateEnd"
 
 external inflate_init: bool -> stream = "camlzip_inflateInit"
 external inflate:
-  stream -> string -> int -> int -> string -> int -> int -> flush_command
+  stream -> bytes -> int -> int -> bytes -> int -> int -> flush_command
          -> bool * int * int
   = "camlzip_inflate_bytecode" "camlzip_inflate"
 external inflate_end: stream -> unit = "camlzip_inflateEnd"
 
-external update_crc: int32 -> string -> int -> int -> int32
+external update_crc: int32 -> bytes -> int -> int -> int32
+                   = "camlzip_update_crc32"
+external update_crc_string: int32 -> string -> int -> int -> int32
                    = "camlzip_update_crc32"
 
 let buffer_size = 1024
 
 let compress ?(level = 6) ?(header = true) refill flush =
-  let inbuf = String.create buffer_size
-  and outbuf = String.create buffer_size in
+  let inbuf = Bytes.create buffer_size
+  and outbuf = Bytes.create buffer_size in
   let zs = deflate_init level header in
   let rec compr inpos inavail =
     if inavail = 0 then begin
@@ -69,7 +71,7 @@ let compress ?(level = 6) ?(header = true) refill flush =
     deflate_end zs
 
 let compress_direct  ?(level = 6) ?(header = true) flush =
-  let outbuf = String.create buffer_size in
+  let outbuf = Bytes.create buffer_size in
   let zs = deflate_init level header in
   let rec compr inbuf inpos inavail =
     if inavail = 0 then ()
@@ -81,15 +83,16 @@ let compress_direct  ?(level = 6) ?(header = true) flush =
     end
   and compr_finish () =
     let (finished, _, used_out) =
-      deflate zs "" 0 0 outbuf 0 buffer_size Z_FINISH in
+      deflate zs (Bytes.unsafe_of_string "") 0 0
+                 outbuf 0 buffer_size Z_FINISH in
     flush outbuf used_out;
     if not finished then compr_finish()
   in
   compr, compr_finish
 
 let uncompress ?(header = true) refill flush =
-  let inbuf = String.create buffer_size
-  and outbuf = String.create buffer_size in
+  let inbuf = Bytes.create buffer_size
+  and outbuf = Bytes.create buffer_size in
   let zs = inflate_init header in
   let rec uncompr inpos inavail =
     if inavail = 0 then begin
diff --git a/zlib.mli b/zlib.mli
index f4c8dd1..e1c75c6 100644
--- a/zlib.mli
+++ b/zlib.mli
@@ -11,20 +11,20 @@
 (*                                                                     *)
 (***********************************************************************)
 
-(* $Id$ *)
+(* $Id: zlib.mli 32 2016-06-10 09:30:19Z xleroy $ *)
 
 exception Error of string * string
 
 val compress:
   ?level: int -> ?header: bool -> 
-  (string -> int) -> (string -> int -> unit) -> unit
+  (bytes -> int) -> (bytes -> int -> unit) -> unit
 
 val compress_direct:
-  ?level: int -> ?header: bool -> (string -> int -> unit) ->
-  (string -> int -> int -> unit) * (unit -> unit)
+  ?level: int -> ?header: bool -> (bytes -> int -> unit) ->
+  (bytes -> int -> int -> unit) * (unit -> unit)
 
 val uncompress:
-  ?header: bool -> (string -> int) -> (string -> int -> unit) -> unit
+  ?header: bool -> (bytes -> int) -> (bytes -> int -> unit) -> unit
 
 type stream
 
@@ -36,17 +36,19 @@ type flush_command =
 
 external deflate_init: int -> bool -> stream = "camlzip_deflateInit"
 external deflate:
-  stream -> string -> int -> int -> string -> int -> int -> flush_command
+  stream -> bytes -> int -> int -> bytes -> int -> int -> flush_command
          -> bool * int * int
   = "camlzip_deflate_bytecode" "camlzip_deflate"
 external deflate_end: stream -> unit = "camlzip_deflateEnd"
 
 external inflate_init: bool -> stream = "camlzip_inflateInit"
 external inflate:
-  stream -> string -> int -> int -> string -> int -> int -> flush_command
+  stream -> bytes -> int -> int -> bytes -> int -> int -> flush_command
          -> bool * int * int
   = "camlzip_inflate_bytecode" "camlzip_inflate"
 external inflate_end: stream -> unit = "camlzip_inflateEnd"
 
-external update_crc: int32 -> string -> int -> int -> int32
+external update_crc: int32 -> bytes -> int -> int -> int32
+                   = "camlzip_update_crc32"
+external update_crc_string: int32 -> string -> int -> int -> int32
                    = "camlzip_update_crc32"
diff --git a/zlibstubs.c b/zlibstubs.c
index a627df9..661729a 100644
--- a/zlibstubs.c
+++ b/zlibstubs.c
@@ -11,10 +11,11 @@
 /*                                                                     */
 /***********************************************************************/
 
-/* $Id$ */
+/* $Id: zlibstubs.c 33 2016-06-10 12:37:25Z xleroy $ */
 
 /* Stub code to interface with Zlib */
 
+#include <stdint.h>
 #include <zlib.h>
 
 #include <caml/mlvalues.h>
@@ -168,7 +169,7 @@ value camlzip_inflateEnd(value vzs)
 
 value camlzip_update_crc32(value crc, value buf, value pos, value len)
 {
-  return caml_copy_int32(crc32((uint32) Int32_val(crc), 
+  return caml_copy_int32(crc32((uint32_t) Int32_val(crc), 
                           &Byte_u(buf, Long_val(pos)),
                           Long_val(len)));
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ocaml-maint/packages/camlzip.git



More information about the Pkg-ocaml-maint-commits mailing list