X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=generator%2Fgenerator_c.ml;h=90b060c86983dba544fa1edbcbc9d14324db88b0;hb=afe56418946bd8be0706435ed6045bb3ba0f9f99;hp=4405d63798afcee9fd937d0f155b6d9c5bc5c2f5;hpb=2cee1bbfd0b738475e423e0bfc93df53de063301;p=libguestfs.git diff --git a/generator/generator_c.ml b/generator/generator_c.ml index 4405d63..90b060c 100644 --- a/generator/generator_c.ml +++ b/generator/generator_c.ml @@ -135,7 +135,8 @@ let rec generate_prototype ?(extern = true) ?(static = false) if newline then pr "\n" (* Generate C call arguments, eg "(handle, foo, bar)" *) -and generate_c_call_args ?handle (ret, args, optargs) = +and generate_c_call_args ?handle ?(implicit_size_ptr = "&size") + (ret, args, optargs) = pr "("; let comma = ref false in let next () = @@ -155,11 +156,11 @@ and generate_c_call_args ?handle (ret, args, optargs) = next (); pr "%s" (name_of_argt arg) ) args; - (* For RBufferOut calls, add implicit &size parameter. *) + (* For RBufferOut calls, add implicit size pointer parameter. *) (match ret with | RBufferOut _ -> next (); - pr "&size" + pr "%s" implicit_size_ptr | _ -> () ); (* For calls with optional arguments, add implicit optargs parameter. *) @@ -426,13 +427,13 @@ typedef void (*guestfs_event_callback) ( #endif #define LIBGUESTFS_HAVE_SET_EVENT_CALLBACK 1 -int guestfs_set_event_callback (guestfs_h *g, - guestfs_event_callback cb, - uint64_t event_bitmask, - int flags, - void *opaque); +extern int guestfs_set_event_callback (guestfs_h *g, + guestfs_event_callback cb, + uint64_t event_bitmask, + int flags, + void *opaque); #define LIBGUESTFS_HAVE_DELETE_EVENT_CALLBACK 1 -void guestfs_delete_event_callback (guestfs_h *g, int event_handle); +extern void guestfs_delete_event_callback (guestfs_h *g, int event_handle); /* Old-style event handling. In new code use guestfs_set_event_callback. */ #ifndef GUESTFS_TYPEDEF_LOG_MESSAGE_CB @@ -921,12 +922,14 @@ trace_send_line (guestfs_h *g) | RBufferOut _ -> pr "%s guestfs___print_BufferOut (trace_fp, %s, *size_r);\n" indent rv | RStringList _ | RHashtable _ -> - pr "%s fputs (\"[\\\"\", trace_fp);\n" indent; + pr "%s fputs (\"[\", trace_fp);\n" indent; pr "%s for (i = 0; %s[i]; ++i) {\n" indent rv; - pr "%s if (i > 0) fputs (\"\\\", \\\"\", trace_fp);\n" indent; + pr "%s if (i > 0) fputs (\", \", trace_fp);\n" indent; + pr "%s fputs (\"\\\"\", trace_fp);\n" indent; pr "%s fputs (%s[i], trace_fp);\n" indent rv; + pr "%s fputs (\"\\\"\", trace_fp);\n" indent; pr "%s }\n" indent; - pr "%s fputs (\"\\\"]\", trace_fp);\n" indent; + pr "%s fputs (\"]\", trace_fp);\n" indent; | RStruct (_, typ) -> (* XXX There is code generated for guestfish for printing * these structures. We need to make it generally available @@ -990,7 +993,7 @@ trace_send_line (guestfs_h *g) reject_unknown_optargs shortname style; trace_call shortname style; pr " r = guestfs__%s " shortname; - generate_c_call_args ~handle:"g" style; + generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style; pr ";\n"; pr "\n"; (match errcode_of_ret ret with @@ -1336,9 +1339,12 @@ trace_send_line (guestfs_h *g) (* Get the name of the last regular argument. *) let last_arg = - match args with - | [] -> "g" - | args -> name_of_argt (List.hd (List.rev args)) in + match ret with + | RBufferOut _ -> "size_r" + | _ -> + match args with + | [] -> "g" + | args -> name_of_argt (List.hd (List.rev args)) in let rtype = match ret with @@ -1359,7 +1365,7 @@ trace_send_line (guestfs_h *g) pr "\n"; pr " va_start (optargs, %s);\n" last_arg; pr " %sr = guestfs_%s_va " rtype shortname; - generate_c_call_args ~handle:"g" style; + generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style; pr ";\n"; pr " va_end (optargs);\n"; pr "\n"; @@ -1416,7 +1422,7 @@ trace_send_line (guestfs_h *g) pr " }\n"; pr "\n"; pr " return guestfs_%s_argv " shortname; - generate_c_call_args ~handle:"g" style; + generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style; pr ";\n"; pr "}\n\n" | _ -> ()