#ifndef CLICK_ERROR_HH
#define CLICK_ERROR_HH

#include <stdio.h>
#include <stdarg.h>
#include <errno.h>

class ErrorHandler {
public: 
    ErrorHandler() : _nerrors(0), _nwarnings(0), _prefix(0) { }
    ~ErrorHandler() { }

    unsigned int nwarnings() const { return _nwarnings; }
    unsigned int nerrors() const { return _nerrors; }
    void reset_counts() { _nerrors = _nwarnings = 0; }

    void snap_errors() { _nerrors_snapshot = _nerrors; }
    bool any_errors() { return _nerrors_snapshot != _nerrors; }

    void set_prefix(const char *pfx) { _prefix = pfx; }

    inline void warning(const char *format, ...);
    inline int error(const char *format, ...);

private:
    unsigned int _nerrors;
    unsigned int _nwarnings;
    unsigned int _nerrors_snapshot;
    const char *_prefix;
};

void ErrorHandler::warning(const char *format, ...)
{
    va_list ap;

    if (_prefix)
	fprintf(stderr, _prefix);
    va_start(ap, format);
    vfprintf(stderr, format, ap);
    fprintf(stderr, "\n");
    va_end(ap);
    _nwarnings++;
}

int ErrorHandler::error(const char *format, ...)
{
    va_list ap;

    if (_prefix)
	fprintf(stderr, _prefix);
    va_start(ap, format);
    vfprintf(stderr, format, ap);
    fprintf(stderr, "\n");
    va_end(ap);
    _nerrors++;
    return -EINVAL;
}
#endif

/* vim: set ts=8 sw=4: */
