common/errors.h
///////////////////////////////////////////////////////////////////////////////
// Filename: errors.h
///////////////////////////////////////////////////////////////////////////////
// Purpose: declaration of class "errors"
///////////////////////////////////////////////////////////////////////////////
// History:
// ========
//
// Date     Time     Name      Description   
// -------- -------- --------  ------------------------------------------------
// 96/01/29 00:43:20 muellerg: created
//
///////////////////////////////////////////////////////////////////////////////
#ifndef __ERRORS_H__
#define __ERRORS_H__
// Feature test switches ///////////////////////////// Feature test switches //
    /* NONE */
// System headers /////////////////////////////////////////// System headers //
#include <stdlib.h>
#include <sys/types.h>
#include <stdarg.h>
// Local headers ///////////////////////////////////////////// Local headers //
    /* NONE */
// Macros /////////////////////////////////////////////////////////// Macros //
// these macros allow to give some information about where a bug was discovered
// from a program
#ifdef __GNUC__
#define BUG(x) error.bug(__PRETTY_FUNCTION__, __FILE__, __LINE__, x)
#else
#define BUG(x) error.bug(NULL, __FILE__, __LINE__, x)
#endif
// File scope objects /////////////////////////////////// File scope objects //
    /* NONE */
// External variables, functions, and classes ///////////// External objects //
class errors;
extern errors error;    // defined in errordekl.c
// Signal catching functions ///////////////////// Signal catching functions //
    /* NONE */
// Structures, unions, and class definitions /////////////////// Definitions //
/* Class errors is a convinient way to handle all the 
 * different types of errors.
 * A debug level can be specified.
 * A program should use the function set_program_name()
 * to register its name. This makes it possible to destinguish
 * the errors from different programs.
 */
class errors
{
public:
    enum errorlevel /* the different error levels */
    {
        harmless,   /* a harmless error, continue */
        warn,       /* a warning, continue */
        error,      /* a real error, continue */
        fatal       /* a fatal error, exit the program */
    };
    enum debuglevel
    {
        high=1,   /* show all debug statements */
        medium=2, /* quite a lot */
        some=3,   /* show some of the debug statements */
        low=4,    /* show only important ones */
        none=5    /* don't show debug statements */
    };
    
    
    /* constructor, destructor */
    errors(char *name, debuglevel level=none)
        : program_name(name),
          error_debuglevel(level)
          
    {
        /* nothing to do */
    };
    ~errors(void){}
    errors(debuglevel level=none)
        : error_debuglevel(level)
          
    {
        program_name = "(program name not set)";
    };
    /* system errors */
    /* take the number in errno */
    void system(char *message = NULL, errorlevel err_level=fatal);
    /* error number specified in error_number */ 
    void system(int errno_number, char *message = NULL, 
                errorlevel err_level=fatal);
    /* panic: terminate programm with message */
    void panic(char *message);
    /* bug */
    /* program bug. Always terminates a program */
    void bug(char *function, char *sourcefile, int lineno, char *message);
    /* warning, uses printf style for arguments */
    void warning(char *fmt,...);
    /* debugging */
    /* debug output */
    void debug(char *message, debuglevel dlevel=high);
    
    /* get/set debug level */
    debuglevel get_debug_level(void);
    debuglevel set_debug_level(debuglevel debugl);
    
    /* set program name */
    char *set_program_name(char *name);
private:
    char *program_name;          /* program name */
    debuglevel error_debuglevel; /* debuglevel */
};