Raise Out_of_memory when Augeas fails with AUG_ENOMEM
[ocaml-augeas.git] / augeas-c.c
index 0b535d6..5c330a8 100644 (file)
@@ -33,7 +33,18 @@ typedef augeas *augeas_t;
 
 /* Raise an Augeas.Error exception. */
 static void
-raise_error (const char *msg)
+raise_error (augeas_t t, const char *msg)
+{
+  const int code = aug_error (t);
+
+  if (code == AUG_ENOMEM)
+    caml_raise_out_of_memory ();
+
+  caml_raise_with_string (*caml_named_value ("Augeas.Error"), msg);
+}
+
+static void
+raise_init_error (const char *msg)
 {
   caml_raise_with_string (*caml_named_value ("Augeas.Error"), msg);
 }
@@ -42,7 +53,10 @@ raise_error (const char *msg)
 static int flag_map[] = {
   /* AugSaveBackup */  AUG_SAVE_BACKUP,
   /* AugSaveNewFile */ AUG_SAVE_NEWFILE,
-  /* AugTypeCheck */   AUG_TYPE_CHECK
+  /* AugTypeCheck */   AUG_TYPE_CHECK,
+  /* AugNoStdinc */    AUG_NO_STDINC,
+  /* AugSaveNoop */    AUG_SAVE_NOOP,
+  /* AugNoLoad */      AUG_NO_LOAD,
 };
 
 /* Wrap and unwrap augeas_t handles, with a finalizer. */
@@ -56,7 +70,7 @@ augeas_t_finalize (value tv)
 }
 
 static struct custom_operations custom_operations = {
-  "augeas_t_custom_operations",
+  (char *) "augeas_t_custom_operations",
   augeas_t_finalize,
   custom_compare_default,
   custom_hash_default,
@@ -81,6 +95,8 @@ static value Val_augeas_t (augeas_t t)
   CAMLreturn (rv);
 }
 
+#pragma GCC diagnostic ignored "-Wmissing-prototypes"
+
 /* val create : string -> string option -> flag list -> t */
 CAMLprim value
 ocaml_augeas_create (value rootv, value loadpathv, value flagsv)
@@ -106,7 +122,7 @@ ocaml_augeas_create (value rootv, value loadpathv, value flagsv)
   t = aug_init (root, loadpath, flags);
 
   if (t == NULL)
-    raise_error ("Augeas.create");
+    raise_init_error ("Augeas.create");
 
   CAMLreturn (Val_augeas_t (t));
 }
@@ -145,7 +161,7 @@ ocaml_augeas_get (value tv, value pathv)
   } else if (r == 0)           /* Return None */
     optv = Val_int (0);
   else if (r == -1)            /* Error or multiple matches */
-    raise_error ("Augeas.get");
+    raise_error (t, "Augeas.get");
   else
     failwith ("Augeas.get: bad return value");
 
@@ -168,7 +184,7 @@ ocaml_augeas_exists (value tv, value pathv)
   else if (r == 0)             /* Return false */
     v = Val_int (0);
   else if (r == -1)            /* Error or multiple matches */
-    raise_error ("Augeas.exists");
+    raise_error (t, "Augeas.exists");
   else
     failwith ("Augeas.exists: bad return value");
 
@@ -188,7 +204,7 @@ ocaml_augeas_insert (value tv, value beforev, value pathv, value labelv)
   before = beforev == Val_int (0) ? 0 : Int_val (Field (beforev, 0));
 
   if (aug_insert (t, path, label, before) == -1)
-    raise_error ("Augeas.insert");
+    raise_error (t, "Augeas.insert");
 
   CAMLreturn (Val_unit);
 }
@@ -199,12 +215,12 @@ ocaml_augeas_rm (value tv, value pathv)
 {
   CAMLparam2 (tv, pathv);
   augeas_t t = Augeas_t_val (tv);
-  char *path = String_val (path);
+  char *path = String_val (pathv);
   int r;
 
   r = aug_rm (t, path);
   if (r == -1)
-    raise_error ("Augeas.rm");
+    raise_error (t, "Augeas.rm");
 
   CAMLreturn (Val_int (r));
 }
@@ -222,7 +238,7 @@ ocaml_augeas_match (value tv, value pathv)
 
   r = aug_match (t, path, &matches);
   if (r == -1)
-    raise_error ("Augeas.matches");
+    raise_error (t, "Augeas.matches");
 
   /* Copy the paths to a list. */
   rv = Val_int (0);
@@ -246,12 +262,12 @@ ocaml_augeas_count_matches (value tv, value pathv)
 {
   CAMLparam2 (tv, pathv);
   augeas_t t = Augeas_t_val (tv);
-  char *path = String_val (path);
+  char *path = String_val (pathv);
   int r;
 
   r = aug_match (t, path, NULL);
   if (r == -1)
-    raise_error ("Augeas.count_matches");
+    raise_error (t, "Augeas.count_matches");
 
   CAMLreturn (Val_int (r));
 }
@@ -264,7 +280,20 @@ ocaml_augeas_save (value tv)
   augeas_t t = Augeas_t_val (tv);
 
   if (aug_save (t) == -1)
-    raise_error ("Augeas.save");
+    raise_error (t, "Augeas.save");
+
+  CAMLreturn (Val_unit);
+}
+
+/* val load : t -> unit */
+CAMLprim value
+ocaml_augeas_load (value tv)
+{
+  CAMLparam1 (tv);
+  augeas_t t = Augeas_t_val (tv);
+
+  if (aug_load (t) == -1)
+    raise_error (t, "Augeas.load");
 
   CAMLreturn (Val_unit);
 }