From ec850ec2088f9145cea63e7d608f3c8d5074e4ef Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Wed, 29 May 2019 11:48:40 +0200 Subject: [PATCH] Add Augeas.defvar Simple binding for aug_defvar. --- augeas-c.c | 27 +++++++++++++++++++++++++++ augeas.ml | 2 ++ augeas.mli | 5 +++++ 3 files changed, 34 insertions(+) diff --git a/augeas-c.c b/augeas-c.c index cf8e37f..2baca22 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -39,6 +39,7 @@ 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_defvar (value tv, value namev, value exprv); 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); @@ -242,6 +243,32 @@ ocaml_augeas_close (value tv) CAMLreturn (Val_unit); } +/* val defvar : t -> string -> string option -> int option */ +CAMLprim value +ocaml_augeas_defvar (value tv, value namev, value exprv) +{ + CAMLparam3 (tv, namev, exprv); + CAMLlocal2 (optv, v); + augeas_t t = Augeas_t_val (tv); + const char *name = String_val (namev); + const char *expr = Optstring_val (exprv); + int r; + + r = aug_defvar (t, name, expr); + if (r > 0) { /* Return Some val */ + v = Val_int (r); + optv = caml_alloc (1, 0); + Field (optv, 0) = v; + } else if (r == 0) /* Return None */ + optv = Val_int (0); + else if (r == -1) /* Error or multiple matches */ + raise_error (t, "Augeas.defvar"); + else + caml_failwith ("Augeas.defvar: bad return value"); + + CAMLreturn (optv); +} + /* val get : t -> path -> value option */ CAMLprim value ocaml_augeas_get (value tv, value pathv) diff --git a/augeas.ml b/augeas.ml index 7601200..0101b91 100644 --- a/augeas.ml +++ b/augeas.ml @@ -62,6 +62,8 @@ external create : string -> string option -> flag list -> t = "ocaml_augeas_create" external close : t -> unit = "ocaml_augeas_close" +external defvar : t -> string -> string option -> int option + = "ocaml_augeas_defvar" external get : t -> path -> value option = "ocaml_augeas_get" external exists : t -> path -> bool diff --git a/augeas.mli b/augeas.mli index 3f3186c..80a94f2 100644 --- a/augeas.mli +++ b/augeas.mli @@ -94,6 +94,11 @@ val close : t -> unit Do not use the handle after closing it. *) +val defvar : t -> string -> string option -> int option + (** [defvar t name expr] defines [name] whose value is the result + of evaluating [expr], replacing the old value if existing. + [None] as [expr] removes the variable [name]. *) + val get : t -> path -> value option (** [get t path] returns the value at [path], or [None] if there is no value. *) -- 1.8.3.1