diff options
-rw-r--r-- | generator/c.ml | 8 | ||||
-rw-r--r-- | generator/csharp.ml | 2 | ||||
-rw-r--r-- | generator/erlang.ml | 2 | ||||
-rw-r--r-- | generator/fish.ml | 2 | ||||
-rw-r--r-- | generator/gobject.ml | 2 | ||||
-rw-r--r-- | generator/java.ml | 13 | ||||
-rw-r--r-- | generator/main.ml | 6 | ||||
-rw-r--r-- | generator/ocaml.ml | 4 | ||||
-rw-r--r-- | generator/python.ml | 2 | ||||
-rw-r--r-- | generator/structs.ml | 166 | ||||
-rw-r--r-- | generator/structs.mli | 19 | ||||
-rw-r--r-- | generator/xdr.ml | 3 |
12 files changed, 137 insertions, 92 deletions
diff --git a/generator/c.ml b/generator/c.ml index 798a3a32..54f35b57 100644 --- a/generator/c.ml +++ b/generator/c.ml @@ -311,7 +311,7 @@ and generate_actions_pod_back_compat_entry { name = name; and generate_structs_pod () = (* Structs documentation. *) List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr "=head2 guestfs_%s\n" typ; pr "\n"; pr " struct guestfs_%s {\n" typ; @@ -542,7 +542,7 @@ extern GUESTFS_DLL_PUBLIC void *guestfs_next_private (guestfs_h *g, const char * (* Public structures. *) List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr "struct guestfs_%s {\n" typ; List.iter ( function @@ -710,7 +710,7 @@ and generate_client_free_structs () = pr "\n"; List.iter ( - fun (typ, _) -> + fun { s_name = typ } -> pr "GUESTFS_DLL_PUBLIC void\n"; pr "guestfs_free_%s (struct guestfs_%s *x)\n" typ typ; pr "{\n"; @@ -1661,7 +1661,7 @@ and generate_linker_script () = ) in let structs = List.concat ( - List.map (fun (typ, _) -> + List.map (fun { s_name = typ } -> ["guestfs_free_" ^ typ; "guestfs_free_" ^ typ ^ "_list"]) structs ) in diff --git a/generator/csharp.ml b/generator/csharp.ml index 9f86f48f..803a4a5a 100644 --- a/generator/csharp.ml +++ b/generator/csharp.ml @@ -110,7 +110,7 @@ namespace Guestfs * method names (eg. "class stat" and "stat"). *) List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr " [StructLayout (LayoutKind.Sequential)]\n"; pr " public class _%s {\n" typ; List.iter ( diff --git a/generator/erlang.ml b/generator/erlang.ml index 673394e0..6c7eb70a 100644 --- a/generator/erlang.ml +++ b/generator/erlang.ml @@ -237,7 +237,7 @@ extern void free_strings (char **r); in List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr "static ETERM *\n"; pr "make_%s (const struct guestfs_%s *%s)\n" typ typ typ; pr "{\n"; diff --git a/generator/fish.ml b/generator/fish.ml index 76377a24..59c11146 100644 --- a/generator/fish.ml +++ b/generator/fish.ml @@ -227,7 +227,7 @@ Guestfish will prompt for these separately." (* print_* functions *) List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> let needs_i = List.exists (function (_, (FUUID|FBuffer)) -> true | _ -> false) cols in diff --git a/generator/gobject.ml b/generator/gobject.ml index 2cd18096..6c35e024 100644 --- a/generator/gobject.ml +++ b/generator/gobject.ml @@ -107,7 +107,7 @@ let filenames = "session" :: "tristate" :: (* structs *) - List.map (function typ, cols -> "struct-" ^ typ) structs @ + List.map (fun { s_name = typ } -> "struct-" ^ typ) structs @ (* optargs *) List.map (function { name = name } -> "optargs-" ^ name) ( diff --git a/generator/java.ml b/generator/java.ml index 1e06c62d..a8eea1ae 100644 --- a/generator/java.ml +++ b/generator/java.ml @@ -873,12 +873,17 @@ and generate_java_struct_list_return typ jtyp cols = and generate_java_makefile_inc () = generate_header HashStyle GPLv2plus; + let jtyps = List.map (fun { s_camel_name = jtyp } -> jtyp) structs in + let jtyps = List.sort compare jtyps in + pr "java_built_sources = \\\n"; List.iter ( - fun (typ, jtyp) -> - pr "\tcom/redhat/et/libguestfs/%s.java \\\n" jtyp; - ) camel_structs; + pr "\tcom/redhat/et/libguestfs/%s.java \\\n" + ) jtyps; pr "\tcom/redhat/et/libguestfs/GuestFS.java\n" and generate_java_gitignore () = - List.iter (fun (_, jtyp) -> pr "%s.java\n" jtyp) camel_structs + let jtyps = List.map (fun { s_camel_name = jtyp } -> jtyp) structs in + let jtyps = List.sort compare jtyps in + + List.iter (pr "%s.java\n") jtyps diff --git a/generator/main.ml b/generator/main.ml index 8d608504..98f4b31c 100644 --- a/generator/main.ml +++ b/generator/main.ml @@ -124,11 +124,11 @@ Run it from the top source directory using the command output_to "java/com/redhat/et/libguestfs/GuestFS.java" generate_java_java; List.iter ( - fun (typ, jtyp) -> + fun { s_name = typ; s_camel_name = jtyp } -> let cols = cols_of_struct typ in let filename = sprintf "java/com/redhat/et/libguestfs/%s.java" jtyp in output_to filename (generate_java_struct jtyp cols) - ) camel_structs; + ) structs; delete_except_generated ~skip:["java/com/redhat/et/libguestfs/LibGuestFSException.java"] "java/com/redhat/et/libguestfs/*.java"; @@ -152,7 +152,7 @@ Run it from the top source directory using the command output_to "gobject/docs/guestfs-title.sgml" generate_gobject_doc_title; List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> let short = sprintf "struct-%s" typ in let filename = sprintf "gobject/include/guestfs-gobject/%s.h" short in diff --git a/generator/ocaml.ml b/generator/ocaml.ml index b90aeb82..f9ac5ca5 100644 --- a/generator/ocaml.ml +++ b/generator/ocaml.ml @@ -377,7 +377,7 @@ copy_table (char * const * argv) in List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> let has_optpercent_col = List.exists (function (_, FOptPercent) -> true | _ -> false) cols in @@ -672,7 +672,7 @@ copy_table (char * const * argv) and generate_ocaml_structure_decls () = List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr "type %s = {\n" typ; List.iter ( function diff --git a/generator/python.ml b/generator/python.ml index 39750557..0e754db6 100644 --- a/generator/python.ml +++ b/generator/python.ml @@ -160,7 +160,7 @@ free_strings (char **argv) (* Structures, turned into Python dictionaries. *) List.iter ( - fun (typ, cols) -> + fun { s_name = typ; s_cols = cols } -> pr "static PyObject *\n"; pr "put_%s (struct guestfs_%s *%s)\n" typ typ typ; pr "{\n"; diff --git a/generator/structs.ml b/generator/structs.ml index d62fcc5d..4dcb2c9a 100644 --- a/generator/structs.ml +++ b/generator/structs.ml @@ -22,6 +22,12 @@ open Types open Utils type cols = (string * field) list +type struc = { + s_name : string; + s_cols : cols; + s_camel_name : string; + s_unused : unit; (* Silences warning 23 when using 'defaults with ...' *) +} (* Because we generate extra parsing code for LVM command line tools, * we have to pull out the LVM columns separately here. @@ -88,6 +94,8 @@ let lvm_lv_cols = [ "modules", FString; ] +let defaults = { s_name = ""; s_cols = []; s_camel_name = ""; s_unused = () } + (* Names and fields in all structures (in RStruct and RStructList) * that we support. *) @@ -95,21 +103,29 @@ let structs = [ (* The old RIntBool return type, only ever used for aug_defnode. Do * not use this struct in any new code. *) - "int_bool", [ + { defaults with + s_name = "int_bool"; + s_cols = [ "i", FInt32; (* for historical compatibility *) "b", FInt32; (* for historical compatibility *) - ]; + ]; + s_camel_name = "IntBool" }; (* LVM PVs, VGs, LVs. *) - "lvm_pv", lvm_pv_cols; - "lvm_vg", lvm_vg_cols; - "lvm_lv", lvm_lv_cols; + { defaults with + s_name = "lvm_pv"; s_cols = lvm_pv_cols; s_camel_name = "PV" }; + { defaults with + s_name = "lvm_vg"; s_cols = lvm_vg_cols; s_camel_name = "VG" }; + { defaults with + s_name = "lvm_lv"; s_cols = lvm_lv_cols; s_camel_name = "LV" }; (* Column names and types from stat structures. * NB. Can't use things like 'st_atime' because glibc header files * define some of these as macros. Ugh. *) - "stat", [ + { defaults with + s_name = "stat"; + s_cols = [ "dev", FInt64; "ino", FInt64; "mode", FInt64; @@ -123,8 +139,11 @@ let structs = [ "atime", FInt64; "mtime", FInt64; "ctime", FInt64; - ]; - "statvfs", [ + ]; + s_camel_name = "Stat" }; + { defaults with + s_name = "statvfs"; + s_cols = [ "bsize", FInt64; "frsize", FInt64; "blocks", FInt64; @@ -136,48 +155,66 @@ let structs = [ "fsid", FInt64; "flag", FInt64; "namemax", FInt64; - ]; + ]; + s_camel_name = "StatVFS" }; (* Column names in dirent structure. *) - "dirent", [ + { defaults with + s_name = "dirent"; + s_cols = [ "ino", FInt64; (* 'b' 'c' 'd' 'f' (FIFO) 'l' 'r' (regular file) 's' 'u' '?' *) "ftyp", FChar; "name", FString; - ]; + ]; + s_camel_name = "Dirent" }; (* Version numbers. *) - "version", [ + { defaults with + s_name = "version"; + s_cols = [ "major", FInt64; "minor", FInt64; "release", FInt64; "extra", FString; - ]; + ]; + s_camel_name = "Version" }; (* Extended attribute. *) - "xattr", [ + { defaults with + s_name = "xattr"; + s_cols = [ "attrname", FString; "attrval", FBuffer; - ]; + ]; + s_camel_name = "XAttr" }; (* Inotify events. *) - "inotify_event", [ + { defaults with + s_name = "inotify_event"; + s_cols = [ "in_wd", FInt64; "in_mask", FUInt32; "in_cookie", FUInt32; "in_name", FString; - ]; + ]; + s_camel_name = "INotifyEvent" }; (* Partition table entry. *) - "partition", [ + { defaults with + s_name = "partition"; + s_cols = [ "part_num", FInt32; "part_start", FBytes; "part_end", FBytes; "part_size", FBytes; - ]; + ]; + s_camel_name = "Partition" }; (* Application. *) - "application", [ + { defaults with + s_name = "application"; + s_cols = [ "app_name", FString; "app_display_name", FString; "app_epoch", FInt32; @@ -190,10 +227,13 @@ let structs = [ "app_source_package", FString; "app_summary", FString; "app_description", FString; - ]; + ]; + s_camel_name = "Application" }; (* ISO primary volume descriptor. *) - "isoinfo", [ + { defaults with + s_name = "isoinfo"; + s_cols = [ "iso_system_id", FString; "iso_volume_id", FString; "iso_volume_space_size", FUInt32; @@ -211,24 +251,33 @@ let structs = [ "iso_volume_modification_t", FInt64; "iso_volume_expiration_t", FInt64; "iso_volume_effective_t", FInt64; - ]; + ]; + s_camel_name = "ISOInfo" }; (* /proc/mdstat information. See linux.git/drivers/md/md.c *) - "mdstat", [ + { defaults with + s_name = "mdstat"; + s_cols = [ "mdstat_device", FString; "mdstat_index", FInt32; "mdstat_flags", FString; - ]; + ]; + s_camel_name = "MDStat" }; (* btrfs subvolume list output *) - "btrfssubvolume", [ + { defaults with + s_name = "btrfssubvolume"; + s_cols = [ "btrfssubvolume_id", FUInt64; "btrfssubvolume_top_level_id", FUInt64; "btrfssubvolume_path", FString; - ]; + ]; + s_camel_name = "BTRFSSubvolume" }; (* XFS info descriptor. *) - "xfsinfo", [ + { defaults with + s_name = "xfsinfo"; + s_cols = [ "xfs_mntpoint", FString; "xfs_inodesize", FUInt32; "xfs_agcount", FUInt32; @@ -254,60 +303,45 @@ let structs = [ "xfs_rtextsize", FUInt32; "xfs_rtblocks", FUInt64; "xfs_rtextents", FUInt64; - ]; + ]; + s_camel_name = "XFSInfo" }; (* utsname *) - "utsname", [ + { defaults with + s_name = "utsname"; + s_cols = [ "uts_sysname", FString; "uts_release", FString; "uts_version", FString; "uts_machine", FString; - ]; + ]; + s_camel_name = "UTSName" }; (* Used by hivex_* APIs to return a list of int64 handles (node * handles and value handles). Note that we can't add a putative * 'RInt64List' type to the generator because we need to return * length and size, and RStructList does this already. *) - "hivex_node", [ + { defaults with + s_name = "hivex_node"; + s_cols = [ "hivex_node_h", FInt64; - ]; - "hivex_value", [ + ]; + s_camel_name = "HivexNode" }; + { defaults with + s_name = "hivex_value"; + s_cols = [ "hivex_value_h", FInt64; - ]; + ]; + s_camel_name = "HivexValue" }; ] (* end of structs *) -(* For bindings which want camel case *) -let camel_structs = [ - "int_bool", "IntBool"; - "lvm_pv", "PV"; - "lvm_vg", "VG"; - "lvm_lv", "LV"; - "stat", "Stat"; - "statvfs", "StatVFS"; - "dirent", "Dirent"; - "version", "Version"; - "xattr", "XAttr"; - "inotify_event", "INotifyEvent"; - "partition", "Partition"; - "application", "Application"; - "isoinfo", "ISOInfo"; - "xfsinfo", "XFSInfo"; - "mdstat", "MDStat"; - "btrfssubvolume", "BTRFSSubvolume"; - "utsname", "UTSName"; - "hivex_node", "HivexNode"; - "hivex_value", "HivexValue"; -] -let camel_structs = List.sort (fun (_,a) (_,b) -> compare a b) camel_structs - -let camel_name_of_struct typ = - try List.assoc typ camel_structs +let lookup_struct name = + try List.find (fun { s_name = n } -> n = name) structs with Not_found -> failwithf - "camel_name_of_struct: no camel_structs entry corresponding to %s" typ + "lookup_struct: no structs entry corresponding to %s" name -let cols_of_struct typ = - try List.assoc typ structs - with Not_found -> - failwithf "cols_of_struct: unknown struct %s" typ +let camel_name_of_struct name = (lookup_struct name).s_camel_name + +let cols_of_struct name = (lookup_struct name).s_cols diff --git a/generator/structs.mli b/generator/structs.mli index 56987e0f..f0c2ba65 100644 --- a/generator/structs.mli +++ b/generator/structs.mli @@ -23,12 +23,16 @@ type cols = (string * Types.field) list (** List of structure fields (called "columns"). *) -val structs : (string * cols) list +type struc = { + s_name : string; (** Regular name. *) + s_cols : cols; (** Columns. *) + s_camel_name : string; (** Camel-cased name. *) + s_unused : unit; +} + +val structs : struc list (** List of structures. *) -val camel_structs : (string * string) list -(** For bindings which want camel case struct names *) - val lvm_pv_cols : cols val lvm_vg_cols : cols val lvm_lv_cols : cols @@ -36,8 +40,11 @@ val lvm_lv_cols : cols used to generate code for parsing the output of commands like [lvs]. One day replace this with liblvm API calls. *) +val lookup_struct : string -> struc +(** Lookup a struct by name. *) + val camel_name_of_struct : string -> string -(** Camel case name of struct. *) +(** Lookup struct by name, return the s_camel_name field. *) val cols_of_struct : string -> cols -(** Extract columns of a struct. *) +(** Lookup struct by name, return the s_cols field. *) diff --git a/generator/xdr.ml b/generator/xdr.ml index b45f2c46..46b1c904 100644 --- a/generator/xdr.ml +++ b/generator/xdr.ml @@ -70,8 +70,7 @@ let generate_xdr () = pr "/* Internal structures. */\n"; pr "\n"; List.iter ( - function - | typ, cols -> + fun { s_name = typ; s_cols = cols } -> pr "struct guestfs_int_%s {\n" typ; List.iter (function | name, FChar -> pr " char %s;\n" name |