Add Augeas.defvar
authorPino Toscano <ptoscano@redhat.com>
Wed, 29 May 2019 09:48:40 +0000 (11:48 +0200)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 29 May 2019 09:55:36 +0000 (10:55 +0100)
Simple binding for aug_defvar.

augeas-c.c
augeas.ml
augeas.mli

index cf8e37f..2baca22 100644 (file)
@@ -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)
index 7601200..0101b91 100644 (file)
--- 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
index 3f3186c..80a94f2 100644 (file)
@@ -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. *)