view examples/code/unwinddemo.cc @ 29253:28913793f678

prefer unwind_action over unwind_protect in more places * Files affected: unwinddemo.cc, __ftp__.cc, graphics.cc, input.cc, interpreter.cc, mex.cc, oct-hist.cc, toplev.cc, urlwrite.cc, cdef-class.cc, ov-fcn-handle.cc, oct-parse.yy, pt-eval.cc, pt-jit.cc, url-transfer.cc, and url-transfer.h.
author John W. Eaton <jwe@octave.org>
date Sun, 03 Jan 2021 14:39:31 -0500
parents f4d7d0eb5b0c
children
line wrap: on
line source

#include <octave/oct.h>
#include <octave/unwind-prot.h>

void
my_err_handler (const char *fmt, ...)
{
  // Do nothing!!
}

void
my_err_with_id_handler (const char *id, const char *fmt, ...)
{
  // Do nothing!!
}

DEFUN_DLD (unwinddemo, args, nargout, "Unwind Demo")
{
  if (args.length () < 2)
    print_usage ();

  NDArray a = args(0).array_value ();
  NDArray b = args(1).array_value ();

  // Create unwind_action objects.  At the end of the enclosing scope,
  // destructors for these objects will call the given functions with
  // the specified arguments.

  octave::unwind_action restore_warning_handler
    (set_liboctave_warning_handler, current_liboctave_warning_handler);

  octave::unwind_action restore_warning_with_id_handler
    (set_liboctave_warning_with_id_handler,
     current_liboctave_warning_with_id_handler);

  set_liboctave_warning_handler (my_err_handler);
  set_liboctave_warning_with_id_handler (my_err_with_id_handler);

  return octave_value (quotient (a, b));
}