X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=augeas-c.c;h=ae22dff4bcab0a9b69cb03d21db127870aa45ce3;hb=775f9763a4ff5422fca837c2fb213273adb772c9;hp=d2a19b0cbd964aaf91208c5c70d279428edfd6ec;hpb=afec0d966f7bd8df863672bb16de20bb641746e7;p=ocaml-augeas.git diff --git a/augeas-c.c b/augeas-c.c index d2a19b0..ae22dff 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -44,6 +44,7 @@ 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); +extern CAMLprim value ocaml_augeas_label (value tv, value pathv); extern CAMLprim value ocaml_augeas_mv (value tv, value srcv, value destv); extern CAMLprim value ocaml_augeas_rm (value tv, value pathv); extern CAMLprim value ocaml_augeas_match (value tv, value pathv); @@ -51,6 +52,7 @@ 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_setm (value tv, value basev, value subv, value valv); 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 @@ -362,6 +364,32 @@ ocaml_augeas_insert (value tv, value beforev, value pathv, value labelv) CAMLreturn (Val_unit); } +/* val label : t -> path -> string option */ +CAMLprim value +ocaml_augeas_label (value tv, value pathv) +{ + CAMLparam2 (tv, pathv); + CAMLlocal2 (optv, v); + augeas_t t = Augeas_t_val (tv); + const char *path = String_val (pathv); + const char *val; + int r; + + r = aug_label (t, path, &val); + if (r == 1 && val) { /* Return Some val */ + v = caml_copy_string (val); + optv = caml_alloc (1, 0); + Field (optv, 0) = v; + } else if (r == 0 || !val) /* Return None */ + optv = Val_int (0); + else if (r == -1) /* Error or multiple matches */ + raise_error (t, "Augeas.label"); + else + caml_failwith ("Augeas.label: bad return value"); + + CAMLreturn (optv); +} + /* val mv : t -> path -> path -> unit */ CAMLprim value ocaml_augeas_mv (value tv, value srcv, value destv) @@ -481,6 +509,24 @@ ocaml_augeas_set (value tv, value pathv, value valuev) CAMLreturn (Val_unit); } +/* val setm : t -> path -> string option -> value option -> int */ +CAMLprim value +ocaml_augeas_setm (value tv, value basev, value subv, value valv) +{ + CAMLparam4 (tv, basev, subv, valv); + augeas_t t = Augeas_t_val (tv); + const char *base = String_val (basev); + const char *sub = Optstring_val (subv); + const char *val = Optstring_val (valv); + int r; + + r = aug_setm (t, base, sub, val); + if (r == -1) + raise_error (t, "Augeas.setm"); + + CAMLreturn (Val_int (r)); +} + /* val transform : t -> string -> string -> transform_mode -> unit */ CAMLprim value ocaml_augeas_transform (value tv, value lensv, value filev, value modev)