File: read_c.ml

package info (click to toggle)
bin-prot 1.2.23-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 620 kB
  • ctags: 1,699
  • sloc: ml: 5,126; ansic: 1,586; makefile: 121
file content (134 lines) | stat: -rw-r--r-- 5,358 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
(* File: read_c.ml

    Copyright (C) 2007-

      Jane Street Holding, LLC
      Author: Markus Mottl
      email: mmottl\@janestreet.com
      WWW: http://www.janestreet.com/ocaml

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*)

(* Read_c: wrapping unsafe C-style readers to safe ML-style ones. *)

open Bigarray

open Common
open Unsafe_common
open Unsafe_read_c

let handle_error buf sptr_ptr read_err =
  let err_pos = dealloc_sptr_ptr buf sptr_ptr in
  let err_pos =
    match read_err with
    | ReadError.Variant _ -> err_pos - 4
    | _ -> err_pos
  in
  raise_read_error read_err err_pos

let handle_exc buf sptr_ptr exc =
  ignore (dealloc_sptr_ptr buf sptr_ptr);
  raise exc

let at_end buf sptr_ptr pos_ref el =
  let pos = dealloc_sptr_ptr buf sptr_ptr in
  pos_ref := pos;
  el

let make read_c buf ~pos_ref =
  let sptr_ptr, eptr = get_read_init buf ~pos_ref in
  let el =
    try read_c sptr_ptr eptr with
    | Error read_err -> handle_error buf sptr_ptr read_err
    | exc -> handle_exc buf sptr_ptr exc
  in
  at_end buf sptr_ptr pos_ref el

let unmake read_ml buf sptr_ptr _eptr =
  let start_pos = get_sptr_ptr sptr_ptr buf in
  let pos_ref = ref start_pos in
  let el = read_ml buf ~pos_ref in
  set_sptr_ptr sptr_ptr buf ~pos:!pos_ref;
  el

let make1 read_c read_ml_el buf ~pos_ref =
  let sptr_ptr, eptr = get_read_init buf ~pos_ref in
  let read_c_el = unmake read_ml_el buf in
  let el =
    try read_c read_c_el sptr_ptr eptr with
    | Error read_err -> handle_error buf sptr_ptr read_err
    | exc -> handle_exc buf sptr_ptr exc
  in
  at_end buf sptr_ptr pos_ref el

let make2 read_c read_ml_el1 read_ml_el2 buf ~pos_ref =
  let sptr_ptr, eptr = get_read_init buf ~pos_ref in
  let read_c_el1 = unmake read_ml_el1 buf in
  let read_c_el2 = unmake read_ml_el2 buf in
  let el =
    try read_c read_c_el1 read_c_el2 sptr_ptr eptr with
    | Error read_err -> handle_error buf sptr_ptr read_err
    | exc -> handle_exc buf sptr_ptr exc
  in
  at_end buf sptr_ptr pos_ref el

let make3 read_c read_ml_el1 read_ml_el2 read_ml_el3 buf ~pos_ref =
  let sptr_ptr, eptr = get_read_init buf ~pos_ref in
  let read_c_el1 = unmake read_ml_el1 buf in
  let read_c_el2 = unmake read_ml_el2 buf in
  let read_c_el3 = unmake read_ml_el3 buf in
  let el =
    try read_c read_c_el1 read_c_el2 read_c_el3 sptr_ptr eptr with
    | Error read_err -> handle_error buf sptr_ptr read_err
    | exc -> handle_exc buf sptr_ptr exc
  in
  at_end buf sptr_ptr pos_ref el

let bin_read_unit = make Unsafe_read_c.bin_read_unit
let bin_read_bool = make Unsafe_read_c.bin_read_bool
let bin_read_string = make Unsafe_read_c.bin_read_string
let bin_read_char = make Unsafe_read_c.bin_read_char
let bin_read_int = make Unsafe_read_c.bin_read_int
let bin_read_float = make Unsafe_read_c.bin_read_float
let bin_read_int32 = make Unsafe_read_c.bin_read_int32
let bin_read_int64 = make Unsafe_read_c.bin_read_int64
let bin_read_nativeint = make Unsafe_read_c.bin_read_nativeint
let bin_read_nat0 = make Unsafe_read_c.bin_read_nat0
let bin_read_ref mlw = make1 Unsafe_read_c.bin_read_ref mlw
let bin_read_lazy mlw = make1 Unsafe_read_c.bin_read_lazy mlw
let bin_read_option mlw = make1 Unsafe_read_c.bin_read_option mlw
let bin_read_pair mlw = make2 Unsafe_read_c.bin_read_pair mlw
let bin_read_triple mlw = make3 Unsafe_read_c.bin_read_triple mlw
let bin_read_list mlw = make1 Unsafe_read_c.bin_read_list mlw
let bin_read_array mlw = make1 Unsafe_read_c.bin_read_array mlw
let bin_read_hashtbl mlw = make2 Unsafe_read_c.bin_read_hashtbl mlw
let bin_read_float32_vec = make Unsafe_read_c.bin_read_float32_vec
let bin_read_float64_vec = make Unsafe_read_c.bin_read_float64_vec
let bin_read_vec = make Unsafe_read_c.bin_read_vec
let bin_read_float32_mat = make Unsafe_read_c.bin_read_float32_mat
let bin_read_float64_mat = make Unsafe_read_c.bin_read_float64_mat
let bin_read_mat = make Unsafe_read_c.bin_read_mat
let bin_read_bigstring = make Unsafe_read_c.bin_read_bigstring
let bin_read_float_array = make Unsafe_read_c.bin_read_float_array
let bin_read_variant_int el = make Unsafe_read_c.bin_read_variant_int el
let bin_read_variant_tag el = make Unsafe_read_c.bin_read_variant_tag el
let bin_read_int_64bit = make Unsafe_read_c.bin_read_int_64bit
let bin_read_int64_bits = make Unsafe_read_c.bin_read_int64_bits
let bin_read_network16_int = make Unsafe_read_c.bin_read_network16_int
let bin_read_network32_int = make Unsafe_read_c.bin_read_network32_int
let bin_read_network32_int32 = make Unsafe_read_c.bin_read_network32_int32
let bin_read_network64_int = make Unsafe_read_c.bin_read_network64_int
let bin_read_network64_int64 = make Unsafe_read_c.bin_read_network64_int64