X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=augeas-c.c;h=81f87f92fc0bda3e22072e15b8a824ce49ac9880;hb=6d61606ee8c5c81d5492d062bd1e15fe2165edc7;hp=885b829d69ce0ee7cbe7278dad6289fdbdf60ee2;hpb=05f00ac539c2cd0cf5dcbf90d031023a7e973ae7;p=ocaml-augeas.git diff --git a/augeas-c.c b/augeas-c.c index 885b829..81f87f9 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -1,5 +1,5 @@ /* Augeas OCaml bindings - * Copyright (C) 2008-2012 Red Hat Inc., Richard W.M. Jones + * Copyright (C) 2008-2017 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 @@ -29,6 +29,32 @@ #include #include +#include + +#ifdef __GNUC__ + #define NORETURN __attribute__ ((noreturn)) +#else + #define NORETURN +#endif + +extern CAMLprim value ocaml_augeas_create (value rootv, value loadpathv, value flagsv); +extern CAMLprim value ocaml_augeas_close (value tv); +extern CAMLprim value ocaml_augeas_get (value tv, value pathv); +extern CAMLprim value ocaml_augeas_exists (value tv, value pathv); +extern CAMLprim value ocaml_augeas_insert (value tv, value beforev, value pathv, value labelv); +extern CAMLprim value ocaml_augeas_rm (value tv, value pathv); +extern CAMLprim value ocaml_augeas_match (value tv, value pathv); +extern CAMLprim value ocaml_augeas_count_matches (value tv, value pathv); +extern CAMLprim value ocaml_augeas_save (value tv); +extern CAMLprim value ocaml_augeas_load (value tv); +extern CAMLprim value ocaml_augeas_set (value tv, value pathv, value valuev); +extern CAMLprim value ocaml_augeas_transform (value tv, value lensv, value filev, value modev); +extern CAMLprim value ocaml_augeas_source (value tv, value pathv) +#ifndef HAVE_AUG_SOURCE + NORETURN +#endif +; + typedef augeas *augeas_t; /* Map C aug_errcode_t to OCaml error_code. */ @@ -49,9 +75,11 @@ static const int error_map[] = { }; static const int error_map_len = sizeof error_map / sizeof error_map[0]; -/* Raise an Augeas.Error exception. */ +/* Raise an Augeas.Error exception, and optionally close the + * specified handle. + */ static void -raise_error (augeas_t t, const char *msg) +raise_error_and_maybe_close (augeas_t t, const char *msg, bool close_handle) { value *exn = caml_named_value ("Augeas.Error"); value args[4]; @@ -61,8 +89,11 @@ raise_error (augeas_t t, const char *msg) int ocaml_code = -1; int i; - if (code == AUG_ENOMEM) + if (code == AUG_ENOMEM) { + if (close_handle) + aug_close (t); caml_raise_out_of_memory (); + } aug_err_minor = aug_error_minor_message (t); aug_err_details = aug_error_details (t); @@ -83,8 +114,12 @@ raise_error (augeas_t t, const char *msg) args[2] = caml_copy_string (aug_err_minor ? : ""); args[3] = caml_copy_string (aug_err_details ? : ""); + if (close_handle) + aug_close (t); + caml_raise_with_args (*exn, 4, args); } +#define raise_error(t, msg) raise_error_and_maybe_close(t, msg, false) static void raise_init_error (const char *msg) @@ -109,6 +144,10 @@ static const int flag_map[] = { /* AugNoStdinc */ AUG_NO_STDINC, /* AugSaveNoop */ AUG_SAVE_NOOP, /* AugNoLoad */ AUG_NO_LOAD, + /* AugNoModlAutoload */ AUG_NO_MODL_AUTOLOAD, + /* AugEnableSpan */ AUG_ENABLE_SPAN, + /* AugNoErrClose */ AUG_NO_ERR_CLOSE, + /* AugTraceModuleLoading */ AUG_TRACE_MODULE_LOADING, }; /* Wrap and unwrap augeas_t handles, with a finalizer. */ @@ -127,7 +166,8 @@ static struct custom_operations custom_operations = { custom_compare_default, custom_hash_default, custom_serialize_default, - custom_deserialize_default + custom_deserialize_default, + custom_compare_ext_default, }; static value Val_augeas_t (augeas_t t) @@ -215,7 +255,7 @@ ocaml_augeas_get (value tv, value pathv) else if (r == -1) /* Error or multiple matches */ raise_error (t, "Augeas.get"); else - failwith ("Augeas.get: bad return value"); + caml_failwith ("Augeas.get: bad return value"); CAMLreturn (optv); } @@ -390,6 +430,7 @@ ocaml_augeas_transform (value tv, value lensv, value filev, value modev) CAMLprim value ocaml_augeas_source (value tv, value pathv) { +#ifdef HAVE_AUG_SOURCE CAMLparam2 (tv, pathv); CAMLlocal2 (optv, v); augeas_t t = Augeas_t_val (tv); @@ -411,4 +452,7 @@ ocaml_augeas_source (value tv, value pathv) raise_error (t, "Augeas.source"); CAMLreturn (optv); +#else + caml_failwith ("Augeas.source: function not implemented"); +#endif }