X-Git-Url: http://git.annexia.org/?p=ocaml-augeas.git;a=blobdiff_plain;f=augeas-c.c;h=4db3f6ccfc24498b44e84226f1d57e6e8cfd1eba;hp=7ca72442056323058ed0d2dc59e31f22dd107e42;hb=f7638380d5d7b67773ae149c4d3206a716dc9a13;hpb=8d4400eec2d49b540e79f787e1b4b7f90bfa5591 diff --git a/augeas-c.c b/augeas-c.c index 7ca7244..4db3f6c 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -31,17 +31,74 @@ typedef augeas *augeas_t; +/* Map C aug_errcode_t to OCaml error_code. */ +static const int error_map[] = { + /* AugErrInternal */ AUG_EINTERNAL, + /* AugErrPathX */ AUG_EPATHX, + /* AugErrNoMatch */ AUG_ENOMATCH, + /* AugErrMMatch */ AUG_EMMATCH, + /* AugErrSyntax */ AUG_ESYNTAX, + /* AugErrNoLens */ AUG_ENOLENS, + /* AugErrMXfm */ AUG_EMXFM, + /* AugErrNoSpan */ AUG_ENOSPAN, + /* AugErrMvDesc */ AUG_EMVDESC, + /* AugErrCmdRun */ AUG_ECMDRUN, + /* AugErrBadArg */ AUG_EBADARG, + /* AugErrLabel */ AUG_ELABEL, + /* AugErrCpDesc */ AUG_ECPDESC, +}; +static const int error_map_len = sizeof error_map / sizeof error_map[0]; + /* Raise an Augeas.Error exception. */ static void raise_error (augeas_t t, const char *msg) { - caml_raise_with_string (*caml_named_value ("Augeas.Error"), msg); + 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) { - caml_raise_with_string (*caml_named_value ("Augeas.Error"), 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); } /* Map OCaml flags to C flags. */