X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=generator%2Fgenerator_c.ml;h=4480200a1fd6923c9183296eea1acedb1c770dfe;hb=633ae13c80d40b0f30db73e520c08cf365d2f8a3;hp=c1b2e63292ef5d74f2d68c91a44662290765f24b;hpb=2066805a5d93b62beaf6653324715f0b62b06a05;p=libguestfs.git diff --git a/generator/generator_c.ml b/generator/generator_c.ml index c1b2e63..4480200 100644 --- a/generator/generator_c.ml +++ b/generator/generator_c.ml @@ -24,6 +24,7 @@ open Generator_types open Generator_utils open Generator_pr open Generator_docstrings +open Generator_api_versions open Generator_optgroups open Generator_actions open Generator_structs @@ -35,27 +36,41 @@ type optarg_proto = Dots | VA | Argv (* Generate a C function prototype. *) let rec generate_prototype ?(extern = true) ?(static = false) ?(semicolon = true) - ?(single_line = false) ?(newline = false) ?(in_daemon = false) + ?(single_line = false) ?(indent = "") ?(newline = false) + ?(in_daemon = false) ?(prefix = "") ?(suffix = "") ?handle ?(optarg_proto = Dots) name (ret, args, optargs) = + pr "%s" indent; if extern then pr "extern "; if static then pr "static "; (match ret with - | RErr -> pr "int " - | RInt _ -> pr "int " - | RInt64 _ -> pr "int64_t " - | RBool _ -> pr "int " - | RConstString _ | RConstOptString _ -> pr "const char *" - | RString _ | RBufferOut _ -> pr "char *" - | RStringList _ | RHashtable _ -> pr "char **" + | RErr + | RInt _ + | RBool _ -> + pr "int"; + if single_line then pr " " else pr "\n%s" indent + | RInt64 _ -> + pr "int64_t"; + if single_line then pr " " else pr "\n%s" indent + | RConstString _ | RConstOptString _ -> + pr "const char *"; + if not single_line then pr "\n%s" indent + | RString _ | RBufferOut _ -> + pr "char *"; + if not single_line then pr "\n%s" indent + | RStringList _ | RHashtable _ -> + pr "char **"; + if not single_line then pr "\n%s" indent | RStruct (_, typ) -> if not in_daemon then pr "struct guestfs_%s *" typ - else pr "guestfs_int_%s *" typ + else pr "guestfs_int_%s *" typ; + if not single_line then pr "\n%s" indent | RStructList (_, typ) -> if not in_daemon then pr "struct guestfs_%s_list *" typ - else pr "guestfs_int_%s_list *" typ + else pr "guestfs_int_%s_list *" typ; + if not single_line then pr "\n%s" indent ); let is_RBufferOut = match ret with RBufferOut _ -> true | _ -> false in pr "%s%s%s (" prefix name suffix; @@ -69,7 +84,12 @@ let rec generate_prototype ?(extern = true) ?(static = false) ); let next () = if !comma then ( - if single_line then pr ", " else pr ",\n\t\t" + if single_line then pr ", " + else ( + let namelen = String.length prefix + String.length name + + String.length suffix + 2 in + pr ",\n%s%s" indent (spaces namelen) + ) ); comma := true in @@ -152,8 +172,7 @@ and generate_actions_pod () = if not (List.mem NotInDocs flags) then ( let name = "guestfs_" ^ shortname in pr "=head2 %s\n\n" name; - pr " "; - generate_prototype ~extern:false ~handle:"g" name style; + generate_prototype ~extern:false ~indent:" " ~handle:"g" name style; pr "\n\n"; let uc_shortname = String.uppercase shortname in @@ -236,20 +255,22 @@ L for more information.\n\n"; | None -> () | Some txt -> pr "%s\n\n" txt ); + (match lookup_api_version name with + | Some version -> pr "(Added in %s)\n\n" version + | None -> () + ); (* Handling of optional argument variants. *) if optargs <> [] then ( pr "=head2 %s_va\n\n" name; - pr " "; - generate_prototype ~extern:false ~handle:"g" + generate_prototype ~extern:false ~indent:" " ~handle:"g" ~prefix:"guestfs_" ~suffix:"_va" ~optarg_proto:VA shortname style; pr "\n\n"; pr "This is the \"va_list variant\" of L.\n\n" name; pr "See L.\n\n"; pr "=head2 %s_argv\n\n" name; - pr " "; - generate_prototype ~extern:false ~handle:"g" + generate_prototype ~extern:false ~indent:" " ~handle:"g" ~prefix:"guestfs_" ~suffix:"_argv" ~optarg_proto:Argv shortname style; pr "\n\n"; @@ -591,10 +612,12 @@ check_state (guestfs_h *g, const char *caller) | Pathname n | Dev_or_Path n | FileIn n - | FileOut n - | Key n -> + | FileOut n -> (* guestfish doesn't support string escaping, so neither do we *) pr " fprintf (stderr, \" \\\"%%s\\\"\", %s);\n" n + | Key n -> + (* don't print keys *) + pr " fprintf (stderr, \" \\\"***\\\"\");\n" | OptString n -> (* string option *) pr " if (%s) fprintf (stderr, \" \\\"%%s\\\"\", %s);\n" n n; pr " else fprintf (stderr, \" null\");\n"