+ value *exn = caml_named_value ("Augeas.Error");
+ value args[4];
+ const int code = aug_error (t);
+ const char *aug_err_minor;
+ const char *aug_err_details;
+ int ocaml_code = -1;
+ int i;
+
+ if (code == AUG_ENOMEM)
+ caml_raise_out_of_memory ();
+
+ aug_err_minor = aug_error_minor_message (t);
+ aug_err_details = aug_error_details (t);
+
+ for (i = 0; i < error_map_len; ++i)
+ if (error_map[i] == code) {
+ ocaml_code = i;
+ break;
+ }
+
+ if (ocaml_code != -1)
+ args[0] = Val_int (ocaml_code);
+ else {
+ args[0] = caml_alloc (1, 0);
+ Store_field (args[0], 0, Val_int (code));
+ }
+ args[1] = caml_copy_string (msg);
+ args[2] = caml_copy_string (aug_err_minor ? : "");
+ args[3] = caml_copy_string (aug_err_details ? : "");
+
+ caml_raise_with_args (*exn, 4, args);
+}
+
+static void
+raise_init_error (const char *msg)
+{
+ value *exn = caml_named_value ("Augeas.Error");
+ value args[4];
+
+ args[0] = caml_alloc (1, 0);
+ Store_field (args[0], 0, Val_int (-1));
+ args[1] = caml_copy_string (msg);
+ args[2] = caml_copy_string ("augeas initialization failed");
+ args[3] = caml_copy_string ("");
+
+ caml_raise_with_args (*exn, 4, args);