/* Plan9 style error popping.  For details, read Documentation/plan9.txt */

#pragma once

#include <setjmp.h>
#include <kthread.h>
#include <error.h>

#define ERRSTACK(x) struct errbuf *prev_errbuf; struct errbuf errstack[(x)];   \
                    int curindex = 0;
#define waserror() setjmp(&(errpush(errstack, ARRAY_SIZE(errstack), &curindex, \
				    &prev_errbuf)->jmpbuf))

/* In syscall.h, but want to avoid circular include issues. */
extern void set_error(int error, const char *fmt, ...);
extern struct errbuf *get_cur_errbuf(void);

#define error_jmp() longjmp(&get_cur_errbuf()->jmpbuf, 1)

#define error(e, x, ...)						\
	do {								\
		set_error(e, x, ##__VA_ARGS__);				\
		error_jmp();						\
	} while(0)
#define nexterror() longjmp(&(errpop(errstack, ARRAY_SIZE(errstack), &curindex,\
				     prev_errbuf)->jmpbuf), 1)
#define poperror() errpop(errstack, ARRAY_SIZE(errstack), &curindex,	\
			  prev_errbuf)
/* Give Akaros people a hint that we need a real error message. */
#define ERROR_FIXME "This space in %s@%d needs filling in.", __FILE__, __LINE__

struct errbuf *errpush(struct errbuf *errstack, int stacksize, int *curindex,
		       struct errbuf **prev_errbuf);
struct errbuf *errpop(struct errbuf *errstack, int stacksize, int *curindex,
		      struct errbuf *prev_errbuf);
