Commit ff813e38 authored by Ralf Treinen's avatar Ralf Treinen

New upstream version 1.06

parent 490b790c
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)
......
version="1.05"
version="1.06"
requires="unix"
archive(byte)="zip.cma"
archive(native)="zip.cmxa"
......@@ -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)
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......@@ -11,7 +11,7 @@
(* *)
(***********************************************************************)
(* $Id$ *)
(* $Id: minizip.ml 14 2006-04-04 08:29:07Z xleroy $ *)
open Printf
......
......@@ -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)
......
......@@ -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.
......
......@@ -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
......
......@@ -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"
......@@ -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)));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment