X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=augeas-c.c;h=758049725a9ded401cb9282a993e5a6983b7adeb;hb=d34f7efe4e4fa9ee0a2a05ebad5ad73dbb390373;hp=12ca51f37c1b20f303198f21902ce710413ff285;hpb=df5e926b5a1864d586e675845760ca31723458be;p=ocaml-augeas.git diff --git a/augeas-c.c b/augeas-c.c index 12ca51f..7580497 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -39,6 +39,8 @@ 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_defnode (value tv, value namev, value exprv, value valv); +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); @@ -136,6 +138,15 @@ raise_init_error (const char *msg) caml_raise_with_args (*exn, 4, args); } +static const char * +Optstring_val (value strv) +{ + if (strv == Val_int (0)) /* None */ + return NULL; + else /* Some string */ + return String_val (Field (strv, 0)); +} + /* Map OCaml flags to C flags. */ static const int flag_map[] = { /* AugSaveBackup */ AUG_SAVE_BACKUP, @@ -195,16 +206,10 @@ ocaml_augeas_create (value rootv, value loadpathv, value flagsv) { CAMLparam1 (rootv); const char *root = String_val (rootv); - const char *loadpath; + const char *loadpath = Optstring_val (loadpathv); int flags = 0, i; augeas_t t; - /* Optional loadpath. */ - loadpath = - loadpathv == Val_int (0) - ? NULL - : String_val (Field (loadpathv, 0)); - /* Convert list of flags to C. */ for (; flagsv != Val_int (0); flagsv = Field (flagsv, 1)) { i = Int_val (Field (flagsv, 0)); @@ -239,6 +244,56 @@ ocaml_augeas_close (value tv) CAMLreturn (Val_unit); } +/* val defnode : t -> string -> string -> string option -> int * bool */ +CAMLprim value +ocaml_augeas_defnode (value tv, value namev, value exprv, value valv) +{ + CAMLparam4 (tv, namev, exprv, valv); + CAMLlocal2 (optv, v); + augeas_t t = Augeas_t_val (tv); + const char *name = String_val (namev); + const char *expr = String_val (exprv); + const char *val = Optstring_val (valv); + int r, created; + + r = aug_defnode (t, name, expr, val, &created); + if (r == -1) { + raise_error (t, "Augeas.defnode"); + } + + v = caml_alloc (2, 0); + Store_field (v, 0, Val_int (r)); + Store_field (v, 1, Val_bool (created)); + + CAMLreturn (v); +} + +/* 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) @@ -402,12 +457,7 @@ ocaml_augeas_set (value tv, value pathv, value valuev) CAMLparam3 (tv, pathv, valuev); augeas_t t = Augeas_t_val (tv); const char *path = String_val (pathv); - const char *val; - - val = - valuev == Val_int (0) - ? NULL - : String_val (Field (valuev, 0)); + const char *val = Optstring_val (valuev); if (aug_set (t, path, val) == -1) raise_error (t, "Augeas.set");