X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=augeas-c.c;h=2baca22ab4cbc5c3aafe772015307eade105ae39;hb=ec850ec2088f9145cea63e7d608f3c8d5074e4ef;hp=cf8e37f6fa4cafcbfd9db0bd4c0b78e3c241f219;hpb=6d2acb543a0fd92e5626cff8ab2975c5f8f4caf0;p=ocaml-augeas.git 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)