/usr/lib/ocaml/apron/lincons0.idl is in libapron-ocaml-dev 0.9.10-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | /* -*- mode: c -*- */
/* This file is part of the APRON Library, released under LGPL license.
Please read the COPYING file packaged in the distribution */
quote(MLI,"(** APRON Linear constraints of level 0 *)")
quote(C, "\n\
#include <limits.h>\n\
#include \"ap_lincons0.h\"\n\
#include \"apron_caml.h\"\n\
\n\
")
import "scalar.idl";
import "interval.idl";
import "coeff.idl";
import "dim.idl";
import "linexpr0.idl";
/* For ap_lincons0_t,
- the conversion from ML to C may use allocation, but it is automatically freed
by Camlidl mechanisms
- the conversion from C to ML free after conversion the scalar field in the C structure.
the C type should NOT be deallocated
*/
quote(C,"\n\
void camlidl_apron_lincons0_ml2c(value v,ap_lincons0_t* cons, camlidl_ctx _ctx)\n\
{\n\
value _v_linexpr0;\n\
value _v_constyp;\n\
value _v_scalar;\n\
\n\
_v_linexpr0 = Field(v,0);\n\
camlidl_apron_linexpr0_ptr_ml2c(_v_linexpr0,&cons->linexpr0);\n\
_v_constyp = Field(v,1);\n\
if (Is_long(_v_constyp)){\n\
switch (Int_val(_v_constyp)){
case 0:\n\
case 1:\n\
case 2:\n\
cons->constyp = Int_val(_v_constyp);\n\
break;\n\
case 3:\n\
cons->constyp = 4;\n\
break;\n\
default:\n\
abort();\n\
}\n\
cons->scalar = NULL;\n\
}\n\
else {\n\
switch (Tag_val(_v_constyp)){\n\
case 0:\n\
cons->constyp = AP_CONS_EQMOD;\n\
_v_scalar = Field(_v_constyp,0);\n\
cons->scalar = (ap_scalar_t *)camlidl_malloc(sizeof(ap_scalar_t),_ctx);\n\
camlidl_apron_scalar_ml2c(_v_scalar,cons->scalar);\n\
break;\n\
default:\n\
abort();\n\
}\n\
}\n\
}\n\
value camlidl_apron_lincons0_c2ml(ap_lincons0_t* cons)\n\
{\n\
value vres;\n\
value _v[3];\n\
_v[0] = _v[1] = _v[2] = 0;\n\
\n\
Begin_roots_block(_v, 3)\n\
_v[0] = camlidl_apron_linexpr0_ptr_c2ml(&cons->linexpr0);\n\
switch(cons->constyp){\n\
case AP_CONS_EQ:\n\
case AP_CONS_SUPEQ:\n\
case AP_CONS_SUP:\n\
_v[1] = Val_int(cons->constyp);\n\
break;\n\
case AP_CONS_DISEQ:\n\
_v[1] = Val_int(3);\n\
break;\n\
case AP_CONS_EQMOD:\n\
assert(cons->scalar!=NULL);\n\
_v[2] = camlidl_apron_scalar_c2ml(cons->scalar);\n\
_v[1] = camlidl_alloc_small(1, 0);\n\
Field(_v[1],0) = _v[2];\n\
ap_scalar_free(cons->scalar); cons->scalar = NULL;\n\
break;\n\
}\n\
vres = camlidl_alloc_small(2, 0);\n\
Field(vres, 0) = _v[0];\n\
Field(vres, 1) = _v[1];\n\
End_roots()\n\
return vres;\n\
}\n\
")
typedef [mltype("{\n mutable linexpr0 : Linexpr0.t;\n mutable typ : typ;\n}"),
abstract,
ml2c(camlidl_apron_lincons0_ml2c),
c2ml(camlidl_apron_lincons0_c2ml)]
struct ap_lincons0_t ap_lincons0_t;
quote(MLMLI,"and typ =\n | EQ\n | SUPEQ\n | SUP\n | DISEQ\n | EQMOD of Scalar.t\n")
struct ap_lincons0_array_t {
[size_is(size)] ap_lincons0_t* p;
int size;
};
quote(MLI,"\n\
(** Make a linear constraint. Modifying later the linear expression\n\
modifies correspondingly the linear constraint and conversely *)\n\
val make : Linexpr0.t -> typ -> t\n\
\n\
(** Copy a linear constraint (deep copy) *)\n\
val copy : t -> t\n\
\n\
(** Convert a constraint type to a string ([=],[>=], or [>]) *)\n\
val string_of_typ : typ -> string\n\
\n\
(** Print a constraint *)\n\
val print : (Dim.t -> string) -> Format.formatter -> t -> unit\n\
")
quote(ML,"\n\
let string_of_typ = function\n\
| EQ | EQMOD _ -> \"=\"\n\
| SUPEQ -> \">=\"\n\
| SUP -> \">\"\n\
| DISEQ -> \"<>\"\n\
\n\
let print assoc fmt cons = \n\
Linexpr0.print assoc fmt cons.linexpr0;\n\
Format.fprintf fmt \"%s0\" (string_of_typ cons.typ);\n\
begin match cons.typ with\n\
| EQMOD x -> Format.fprintf fmt \" mod %a\" Scalar.print x;\n\
| _ -> ()\n\
end;\n\
()\n\
let make expr typ = {\n\
linexpr0 = expr; typ = typ \n\
}\n\
let copy cons = {\n\
linexpr0 = Linexpr0.copy cons.linexpr0; typ = cons.typ\n\
}\n\
")
|