src/lib/error.c
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 00:35:02 +0300
branchnew-lib-errors
changeset 218 5229a5d098b2
parent 217 7728d6ec3abf
permissions -rw-r--r--
some of spbot and lib compiles
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "error.h"
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "log.h"
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
     3
#include "str.h"
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
     5
#include <string.h>
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
     6
#include <stdlib.h>
217
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
     7
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
const struct error_type* error_lookup_code (const struct error_list *list, err_t code)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    const struct error_type *type;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    // find matching code
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    for (type = list->list; type->code; type++) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        if (type->code == code)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
            // found
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
            return type;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    }
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    // not found
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    return NULL;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
const struct error_type* error_lookup (const error_t *err)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
{
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    25
    const struct error_list *list = NULL;
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    26
    const struct error_item *item;
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    27
    const struct error_type *type;
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    // traverse stack
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    for (item = err->cur; item && item >= err->stack; item--) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        if (!list)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
            // initial type
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
            list = item->list;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        // verify list/type
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        if (!list)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            log_warn("Uknown type");
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        else if (!(type = error_lookup_code(list, item->code)))
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
            log_warn("Uknown code %#04x for list %s", item->code, list->name);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        else
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
            // expected list for next item
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            list = type->sublist;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    }
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // return what we found
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    return type;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    51
const char* error_name (const struct error_list *list, err_t code)
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
{
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    53
    const struct error_type *type;
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    // just do a lookup
217
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
    56
    if ((type = error_lookup_code(list, code)))
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        return "[unknown]";
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    else
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        return type->name;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
const char* error_msg (const error_t *err)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    // XXX: bad to have a single buffer
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    static char buf[ERROR_MSG_MAX];
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    char *buf_ptr = buf; 
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    size_t buf_size = sizeof(buf);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    71
    const struct error_list *list = NULL;
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    72
    const struct error_item *item;
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    73
    const struct error_type *type;
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    // traverse stack
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    for (item = err->cur; item && item >= err->stack; item--) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        if (!list)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
            // initial lookup table
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            list = item->list;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        // verify list/type
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        if (!list) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
            // no type info at all
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
            buf_ptr += str_advance(&buf_size, NULL, str_append_fmt(buf_ptr, buf_size, "[%#04x]", item->code));
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        } else if (!(type = error_lookup_code(list, item->code))) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
            // couldn't find code in list
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
            buf_ptr += str_advance(&buf_size, NULL, str_append_fmt(buf_ptr, buf_size, "[%s:%#02x]", list->name, item->code));
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        } else {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
            // found code's type
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            // delimit using colons, except at the end
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
    93
            buf_ptr += str_advance(&buf_size, NULL, str_append_fmt(buf_ptr, buf_size, "[%s] %s%s", 
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
                list->name, type->name, item == err->stack ? "" : ": "
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            ));
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
            // expected list for next item
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            list = type->sublist;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        }
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    }
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    // add info for extra
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    if (err->extra_type != type->extra_type) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        // type mismatch
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        buf_ptr += str_advance(&buf_size, NULL, str_append_fmt(buf_ptr, buf_size, ": [error_extra type mismatch: %s <=> %s",
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
            err->extra_type ? err->extra_type->name : NULL,
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   107
            type->extra_type ? type->extra_type->name : NULL
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        ));
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    } else if (err->extra_type) {
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        // add extra info
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        buf_ptr += str_advance(&buf_size, NULL, str_append_fmt(buf_ptr, buf_size, ": %s", 
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   113
            err->extra_type->msg_func(err->extra_type, &err->extra_value)
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        ));
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    }
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    // ok, return message
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    return buf;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
bool error_cmp_eq (const error_t *a, const error_t *b)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    // XXX: implement
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    return true;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
217
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
   128
void error_reset (error_t *err)
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
   129
{
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
   130
    memset(err, 0, sizeof(*err));
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
   131
}
7728d6ec3abf nexus.c compiles
Tero Marttila <terom@fixme.fi>
parents: 216
diff changeset
   132
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
/**
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
 * Advance error stack to next position, and return pointer.
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
 *
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
 * Returns NULL if the stack runs out of space.
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
 */
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
struct error_item* error_next (error_t *err)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    if (!err->cur)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        // initial position
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        return (err->cur = err->stack);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   144
    else if (err->cur < err->stack + ERROR_DEPTH_MAX)
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        return (err->cur++);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    else
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        return NULL;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
void error_set (error_t *err, const struct error_list *list, err_t code)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    struct error_item *item;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    // empty
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    error_reset(err);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    // next
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    if (!(item = error_next(err)))
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        return;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    // store
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    item->code = code;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    item->list = list;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
void error_set_extra (error_t *err, const struct error_list *list, err_t code, const struct error_extra_type *type, union error_extra extra)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    struct error_item *item;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    // empty
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    error_reset(err);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    // next
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    if (!(item = error_next(err)))
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        return;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    // store
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    item->code = code;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    item->list = list;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    err->extra_type = type;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    err->extra_value = extra;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
void error_push (error_t *err, const struct error_list *list, err_t code)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    struct error_item *item;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    // next
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    if (!(item = error_next(err)))
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        return;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    // store
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    item->code = code;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    item->list = list;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
void error_copy (error_t *dst, const error_t *src)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
{
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   200
    const struct error_item *item;
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    // reset
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
    error_reset(dst);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
    // copy each item
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
    for (item = src->stack; src->cur && item <= src->cur; item++)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        // push it on separately
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        error_push(dst, item->list, item->code);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    // store extra
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    dst->extra_type = src->extra_type;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    dst->extra_value = src->extra_value;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
/*
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
 * Weird trickery to call log_msg_va2 with the fmt's in the right order (prefix).
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
 *
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
 * XXX: log should provide similar functionality
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
 */
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
void _error_abort_ (const char *fmt2, va_list fmtargs2, const char *fmt1, ...)
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    va_list vargs;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
    va_start(vargs, fmt1);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    _log_msg_va2(LOG_FATAL, "error_abort", fmt1, vargs, fmt2, fmtargs2);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    va_end(vargs);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   229
void _error_abort (const char *file, int line, const char *func, const char *fmt, ...)
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
{
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    va_list vargs;
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
    va_start(vargs, fmt);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    _error_abort_(fmt, vargs, "%s:%d[%s]", file, line, func);
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    va_end(vargs);
218
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   236
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   237
    // then remember to die
5229a5d098b2 some of spbot and lib compiles
Tero Marttila <terom@fixme.fi>
parents: 217
diff changeset
   238
    abort();
216
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
}
a10ba529ae39 initial error code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240