/*
 * libdpkg - Debian packaging suite library routines
 * ehandle.h - error handling
 *
 * Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
 * Copyright © 2000,2001 Wichert Akkerman <wichert@debian.org>
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef LIBDPKG_EHANDLE_H
#define LIBDPKG_EHANDLE_H

#include <setjmp.h>
#include <stddef.h>
#include <stdarg.h>

#include <dpkg/macros.h>

DPKG_BEGIN_DECLS

extern volatile int onerr_abort;

enum {
	ehflag_normaltidy = 01,
	ehflag_bombout = 02,
	ehflag_recursiveerror = 04
};

typedef void error_handler(void);
typedef void error_printer(const char *emsg, const char *contextstring);

void print_fatal_error(const char *emsg, const char *contextstring);
void catch_fatal_error(void);

void push_error_context_jump(jmp_buf *jbufp, error_printer *printerror,
                             const char *contextstring);
void push_error_context_func(error_handler *func, error_printer *printerror,
                             const char *contextstring);
void push_error_context(void);
void pop_error_context(int flagset);

void push_cleanup(void (*f1)(int argc, void **argv), int flagmask1,
                  void (*f2)(int argc, void **argv), int flagmask2,
                  unsigned int nargs, ...);
void push_checkpoint(int mask, int value);
void pop_cleanup(int flagset);

int warning_get_count(void);
void warningv(const char *fmt, va_list args) DPKG_ATTR_VPRINTF(1);
void warning(const char *fmt, ...) DPKG_ATTR_PRINTF(1);

void ohshitv(const char *fmt, va_list args)
	DPKG_ATTR_NORET DPKG_ATTR_VPRINTF(1);
void ohshit(const char *fmt, ...) DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1);
void ohshite(const char *fmt, ...) DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1);

void do_internerr(const char *file, int line, const char *fmt, ...)
	DPKG_ATTR_NORET DPKG_ATTR_PRINTF(3);
#define internerr(...) do_internerr(__FILE__, __LINE__, __VA_ARGS__)

DPKG_END_DECLS

#endif /* LIBDPKG_EHANDLE_H */
