[Libguestfs] [PATCH libnbd] generator: Add SizeT type, maps to C size_t.

Richard W.M. Jones rjones at redhat.com
Tue Sep 29 11:46:41 UTC 2020


---
 generator/API.ml    |  1 +
 generator/API.mli   |  1 +
 generator/C.ml      | 14 ++++++++++----
 generator/GoLang.ml |  5 +++++
 generator/OCaml.ml  |  5 +++++
 generator/Python.ml | 11 +++++++++--
 6 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/generator/API.ml b/generator/API.ml
index 0a876c4..b93580d 100644
--- a/generator/API.ml
+++ b/generator/API.ml
@@ -47,6 +47,7 @@ and arg =
 | Int of string
 | Int64 of string
 | Path of string
+| SizeT of string
 | SockAddrAndLen of string * string
 | String of string
 | StringList of string
diff --git a/generator/API.mli b/generator/API.mli
index 9d2fdb7..2e7aa78 100644
--- a/generator/API.mli
+++ b/generator/API.mli
@@ -57,6 +57,7 @@ and arg =
 | Int of string            (** small int *)
 | Int64 of string          (** 64 bit signed int *)
 | Path of string           (** filename or path *)
+| SizeT of string          (** like size_t, for counting array elements *)
 | SockAddrAndLen of string * string (** struct sockaddr * + socklen_t *)
 | String of string         (** string, cannot be NULL *)
 | StringList of string     (** argv-style NULL-terminated array of strings *)
diff --git a/generator/C.ml b/generator/C.ml
index 5f68b14..82d5e3d 100644
--- a/generator/C.ml
+++ b/generator/C.ml
@@ -93,6 +93,7 @@ let rec name_of_arg = function
 | Int n -> [n]
 | Int64 n -> [n]
 | Path n -> [n]
+| SizeT n -> [n]
 | SockAddrAndLen (n, len) -> [n; len]
 | String n -> [n]
 | StringList n -> [n]
@@ -157,6 +158,9 @@ and print_arg_list' ?(handle = false) ?(types = true) ?(closure_style = Direct)
       | Int64 n ->
          if types then pr "int64_t ";
          pr "%s" n
+      | SizeT n ->
+         if types then pr "size_t ";
+         pr "%s" n
       | Path n
       | String n ->
          if types then pr "const char *";
@@ -621,7 +625,8 @@ let generate_lib_api_c () =
          pr "        nbd_internal_printable_string_list (%s);\n" n
       | BytesOut _ | BytesPersistOut _
       | Bool _ | Closure _ | Enum _ | Flags _ | Fd _ | Int _
-      | Int64 _ | SockAddrAndLen _ | UInt _ | UInt32 _ | UInt64 _ -> ()
+      | Int64 _ | SizeT _
+      | SockAddrAndLen _ | UInt _ | UInt32 _ | UInt64 _ -> ()
     ) args;
     pr "    debug (h, \"enter:";
     List.iter (
@@ -637,6 +642,7 @@ let generate_lib_api_c () =
       | Flags (n, _) -> pr " %s=0x%%x" n
       | Fd n | Int n -> pr " %s=%%d" n
       | Int64 n -> pr " %s=%%\" PRIi64 \"" n
+      | SizeT n -> pr " %s=%%zu" n
       | SockAddrAndLen (n, len) -> pr " %s=<sockaddr> %s=%%d" n len
       | Path n
       | String n -> pr " %s=%%s" n
@@ -662,8 +668,7 @@ let generate_lib_api_c () =
       | Closure { cbname } -> ()
       | Enum (n, _) -> pr ", %s" n
       | Flags (n, _) -> pr ", %s" n
-      | Fd n | Int n -> pr ", %s" n
-      | Int64 n -> pr ", %s" n
+      | Fd n | Int n | Int64 n | SizeT n -> pr ", %s" n
       | SockAddrAndLen (_, len) -> pr ", (int) %s" len
       | Path n | String n | StringList n ->
          pr ", %s_printable ? %s_printable : \"\"" n n
@@ -686,7 +691,8 @@ let generate_lib_api_c () =
          pr "    free (%s_printable);\n" n
       | BytesOut _ | BytesPersistOut _
       | Bool _ | Closure _ | Enum _ | Flags _ | Fd _ | Int _
-      | Int64 _ | SockAddrAndLen _ | UInt _ | UInt32 _ | UInt64 _ -> ()
+      | Int64 _ | SizeT _
+      | SockAddrAndLen _ | UInt _ | UInt32 _ | UInt64 _ -> ()
     ) args;
     pr "  }\n"
   (* Print the trace when we leave a call with debugging enabled. *)
diff --git a/generator/GoLang.ml b/generator/GoLang.ml
index 81446a6..e169173 100644
--- a/generator/GoLang.ml
+++ b/generator/GoLang.ml
@@ -54,6 +54,7 @@ let go_name_of_arg = function
   | Int n -> n
   | Int64 n -> n
   | Path n -> n
+  | SizeT n -> n
   | SockAddrAndLen (n, len) -> n
   | String n -> n
   | StringList n -> n
@@ -74,6 +75,7 @@ let go_arg_type = function
   | Int _ -> "int"
   | Int64 _ -> "int64"
   | Path _ -> "string"
+  | SizeT _ -> "int"
   | SockAddrAndLen _ -> "string"
   | String _ -> "string"
   | StringList _ -> "[]string"
@@ -276,6 +278,8 @@ let print_binding (name, { args; optargs; ret; shortdesc }) =
     | Path n ->
        pr "    c_%s := C.CString (%s)\n" n n;
        pr "    defer C.free (unsafe.Pointer (c_%s))\n" n
+    | SizeT n ->
+       pr "    c_%s := C.size_t (%s)\n" n n
     | SockAddrAndLen (n, len) ->
        pr "    panic (\"SockAddrAndLen not supported\")\n";
        pr "    var c_%s *C.struct_sockaddr\n" n;
@@ -336,6 +340,7 @@ let print_binding (name, { args; optargs; ret; shortdesc }) =
     | Int n -> pr ", c_%s" n
     | Int64 n -> pr ", c_%s" n
     | Path n -> pr ", c_%s" n
+    | SizeT n -> pr ", c_%s" n
     | SockAddrAndLen (n, len) -> pr ", c_%s, c_%s" n len
     | String n -> pr ", c_%s" n
     | StringList n -> pr ", &c_%s[0]" n
diff --git a/generator/OCaml.ml b/generator/OCaml.ml
index 28acb50..81e5529 100644
--- a/generator/OCaml.ml
+++ b/generator/OCaml.ml
@@ -50,6 +50,7 @@ and ocaml_arg_to_string = function
   | Int64 _ -> "int64"
   | Path _ -> "string"
   | SockAddrAndLen _ -> "string" (* XXX not impl *)
+  | SizeT _ -> "int" (* OCaml int type is always sufficient for counting *)
   | String _ -> "string"
   | StringList _ -> "string list"
   | UInt _ -> "int"
@@ -103,6 +104,7 @@ let ocaml_name_of_arg = function
   | Int n -> n
   | Int64 n -> n
   | Path n -> n
+  | SizeT n -> n
   | SockAddrAndLen (n, len) -> n
   | String n -> n
   | StringList n -> n
@@ -666,6 +668,8 @@ let print_ocaml_binding (name, { args; optargs; ret }) =
        pr "  int64_t %s = Int64_val (%sv);\n" n n
     | Path n | String n ->
        pr "  const char *%s = String_val (%sv);\n" n n
+    | SizeT n ->
+       pr "  size_t %s = Int_val (%sv);\n" n n
     | SockAddrAndLen (n, len) ->
        pr "  const struct sockaddr *%s;\n" n;
        pr "  socklen_t %s;\n" len;
@@ -738,6 +742,7 @@ let print_ocaml_binding (name, { args; optargs; ret }) =
     | Int _
     | Int64 _
     | Path _
+    | SizeT _
     | String _
     | SockAddrAndLen _
     | UInt _
diff --git a/generator/Python.ml b/generator/Python.ml
index 1705ad9..46b5828 100644
--- a/generator/Python.ml
+++ b/generator/Python.ml
@@ -295,6 +295,8 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Path n ->
        pr "  PyObject *py_%s = NULL;\n" n;
        pr "  char *%s = NULL;\n" n
+    | SizeT n ->
+       pr "  Py_ssize_t %s;\n" n
     | SockAddrAndLen (n, _) ->
        pr "  /* XXX Complicated - Python uses a tuple of different\n";
        pr "   * lengths for the different socket types.\n";
@@ -341,6 +343,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Fd n | Int n -> pr " \"i\""
     | Int64 n -> pr " \"L\""
     | Path n -> pr " \"O&\""
+    | SizeT n -> pr " \"n\""
     | SockAddrAndLen (n, _) -> pr " \"O\""
     | String n -> pr " \"s\""
     | StringList n -> pr " \"O\""
@@ -365,8 +368,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Closure { cbname } -> pr ", &py_%s_fn" cbname
     | Enum (n, _) -> pr ", &%s" n
     | Flags (n, _) -> pr ", &%s" n
-    | Fd n | Int n -> pr ", &%s" n
-    | Int64 n -> pr ", &%s" n
+    | Fd n | Int n | SizeT n | Int64 n -> pr ", &%s" n
     | Path n -> pr ", PyUnicode_FSConverter, &py_%s" n
     | SockAddrAndLen (n, _) -> pr ", &%s" n
     | String n -> pr ", &%s" n
@@ -435,6 +437,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Path n ->
        pr "  %s = PyBytes_AS_STRING (py_%s);\n" n n;
        pr "  assert (%s != NULL);\n" n
+    | SizeT n -> ()
     | SockAddrAndLen _ ->
        pr "  abort (); /* XXX SockAddrAndLen not implemented */\n";
     | String _ -> ()
@@ -462,6 +465,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Fd n | Int n -> pr ", %s" n
     | Int64 n -> pr ", %s_i64" n
     | Path n -> pr ", %s" n
+    | SizeT n -> pr ", (size_t)%s" n
     | SockAddrAndLen (n, _) -> pr ", /* XXX */ (void *) %s, 0" n
     | String n -> pr ", %s" n
     | StringList n -> pr ", %s" n
@@ -510,6 +514,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Int64 _
     | Path _
     | SockAddrAndLen _
+    | SizeT _
     | String _
     | StringList _
     | UInt _
@@ -551,6 +556,7 @@ let print_python_binding name { args; optargs; ret; may_set_error } =
     | Int64 _ -> ()
     | Path n ->
        pr "  Py_XDECREF (py_%s);\n" n
+    | SizeT _ -> ()
     | SockAddrAndLen _ -> ()
     | String n -> ()
     | StringList n -> pr "  nbd_internal_py_free_string_list (%s);\n" n
@@ -791,6 +797,7 @@ class NBD(object):
           | Fd n | Int n -> n, None, None
           | Int64 n -> n, None, None
           | Path n -> n, None, None
+          | SizeT n -> n, None, None
           | SockAddrAndLen (n, _) -> n, None, None
           | String n -> n, None, None
           | StringList n -> n, None, None
-- 
2.28.0.rc2




More information about the Libguestfs mailing list