Clarify licensing for Debian.
[ocaml-bitstring.git] / cil-tools / bitmatch_import_c.ml
index 8195f98..0bf655f 100644 (file)
@@ -1,19 +1,19 @@
 (* Import a C header file.
  * Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
  *
- * 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 program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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,
+ * This program 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.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  * $Id$
  *)
@@ -26,6 +26,8 @@ open Cil
 
 module P = Bitmatch_persistent
 
+let (//) = Filename.concat
+
 let () =
   (* Parse command line arguments. *)
   let debug = ref false in
@@ -99,8 +101,9 @@ OPTIONS" in
     ) in
 
   let cmd =
-    sprintf "cpp %s -include bitmatch-import-prefix.h %s > %s"
+    sprintf "cpp %s -I %s -include bitmatch-import-prefix.h %s > %s"
       (String.concat " " (List.map Filename.quote cpp_args))
+      (Filename.quote (Bitmatch_config.ocamllibdir // "bitmatch"))
       (Filename.quote input_file) (Filename.quote tmp) in
   if debug then prerr_endline cmd;
   if Sys.command cmd <> 0 then (
@@ -237,14 +240,9 @@ OPTIONS" in
 
        (* int array with constant length *)
        | TArray (basetype, (Some _ as len), _) when isIntegralType basetype ->
-           let len = lenOfArray len in
+           let nr_elems = lenOfArray len in
            let bitsoffset, totalwidth = bitsOffset ttype offset in
-           let bitswidth = totalwidth / len (* of the element *) in
-           (*if debug then (
-             let name = String.concat "." (List.rev names) in
-             Errormsg.log "%s: int array: %d, %d, len %d\n"
-               name bitsoffset bitswidth len
-           );*)
+           let bitswidth = totalwidth / nr_elems (* of the element *) in
            let basetype = unrollType basetype in
            let ikind =
              match basetype with
@@ -252,16 +250,25 @@ OPTIONS" in
              | t ->
                  Errormsg.unimp "%a: unhandled type: %a" d_loc loc d_type t;
                  IInt in
-           let field =
-             pattern_field_of_int "" bitsoffset bitswidth ikind endian in
            let fname = String.concat "_" (List.rev names) in
-           let byteoffset = bitsoffset lsr 3 in
-           let bytetotalwidth = totalwidth lsr 3 in
-(*
-           printf "--> array %s: byteoffset=%d bytetotalwidth=%d len=%d\n"
-             fname byteoffset bytetotalwidth len (* field *);
-*)
-           [] (* XXX *)
+
+           (* If the base type is 8 bits then we always translate this to
+            * a string (whether the C type is signed or unsigned).  There
+            * is no endianness in bytes so ignore that.
+            *)
+           if bitswidth = 8 then
+             [pattern_field_of_string fname bitsoffset nr_elems]
+           else (
+             (* XXX Realistically we don't handle arrays well at
+              * the moment.  Perhaps we should give up and match
+              * this to a bitstring?
+              *)
+             let signed = isSigned ikind in
+             if debug then
+               eprintf "--> array %s: nr_elems=%d signed=%b\n"
+                 fname nr_elems signed;
+             [] (* XXX *)
+           )
 
        (* basic integer type *)
        | TInt (ikind, _) ->
@@ -283,14 +290,13 @@ OPTIONS" in
        | TPtr _ ->
            let bitsoffset, bitswidth = bitsOffset ttype offset in
            let fname = String.concat "_" (List.rev names) in
-(*
-           printf "--> pointer %s: bitsoffset=%d bitswidth=%d\n"
-             fname bitsoffset bitswidth;
-*)
+           if debug then
+             eprintf "--> pointer %s: bitsoffset=%d bitswidth=%d\n"
+               fname bitsoffset bitswidth;
            [] (* XXX *)
 
        | t ->
-           Errormsg.unimp "to_fields: %a: unhandled type: %a"
+           Errormsg.warn "pattern_of_struct: %a: unhandled type: %a"
              d_loc loc d_type t;
            []
 
@@ -314,6 +320,15 @@ OPTIONS" in
 
        field
 
+      and pattern_field_of_string fname bitsoffset nr_elems =
+       let _loc = camlp4_loc_of_cil_loc loc in
+       let field = P.create_pattern_field _loc in
+       let field = P.set_lident_patt field fname in
+       let field = P.set_type_string field in
+       let field = P.set_length_int field (nr_elems*8) in
+       let field = P.set_offset_int field bitsoffset in
+       field
+
       (* Convert a CIL location into a camlp4 location.  Grrr these
        * should be compatible!
        *)