5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * This file is generated, please don't edit it.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * script: ./../../../util/gen.pl
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * args: bimap errmap.h NAME=mecherrmap LEFT=OM_uint32 RIGHT=struct mecherror LEFTPRINT=print_OM_uint32 RIGHTPRINT=mecherror_print LEFTCMP=cmp_OM_uint32 RIGHTCMP=mecherror_cmp
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * The rest of this file is copied from a template, with
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * substitutions. See the template for copyright info.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* start of t_bimap header template */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * bidirectional mapping table, add-only
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Parameters:
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * NAME
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * LEFT, RIGHT - types
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * LEFTCMP, RIGHTCMP - comparison functions
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Methods:
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * int init() - nonzero is error code, if any possible
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * long size()
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * void foreach(int (*)(LEFT, RIGHT, void*), void*)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * int add(LEFT, RIGHT) - 0 = success, -1 = allocation failure
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * const struct mecherror *findleft(OM_uint32) - null iff not found
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * const OM_uint32 *findright(struct mecherror)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * void destroy() - destroys container, doesn't delete elements
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * initial implementation: flat array of (left,right) pairs
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystruct mecherrmap__pair {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry OM_uint32 l;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherror r;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry};
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* end of t_bimap header template */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* start of t_array template */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * array type, derived from template
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * parameters:
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * NAME: mecherrmap__pairarray
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * TYPE: struct mecherrmap__pair
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * methods:
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * int init() -> nonzero if fail initial allocation
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * unsigned long size() -> nonnegative number of values stored
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * int grow(newsize) -> negative if fail allocation, memset(,0,) new space
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * struct mecherrmap__pair *getaddr(idx) -> aborts if out of range
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * void set(idx, value) -> aborts if out of range
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * struct mecherrmap__pair get(idx) -> value, or aborts if out of range
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <stdlib.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <errno.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <limits.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <string.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef HAVE_STDINT_H
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry# include <stdint.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystruct mecherrmap__pairarray__header {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry size_t allocated;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *elts;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry};
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrytypedef struct mecherrmap__pairarray__header mecherrmap__pairarray;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_init(mecherrmap__pairarray *arr)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry arr->elts = calloc(10, sizeof(struct mecherrmap__pair));
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (arr->elts == NULL)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return ENOMEM;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry arr->allocated = 10;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline long
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_size(mecherrmap__pairarray *arr)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return arr->allocated;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline long
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_max_size(mecherrmap__pairarray *arr)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry size_t upper_bound;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry upper_bound = SIZE_MAX / sizeof(*arr->elts);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (upper_bound > LONG_MAX)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry upper_bound = LONG_MAX;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return (long) upper_bound;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_grow(mecherrmap__pairarray *arr, unsigned long newcount)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry size_t oldsize = sizeof(*arr->elts) * arr->allocated;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry size_t newsize;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry void *ptr;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (newcount > LONG_MAX)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return -1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (newcount < arr->allocated)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (newcount > mecherrmap__pairarray_max_size(arr))
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return -1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry newsize = sizeof(*arr->elts) * newcount;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ptr = realloc(arr->elts, newsize);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (ptr == NULL)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return -1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry memset((char *)ptr + oldsize, 0, newsize - oldsize);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry arr->elts = ptr;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry arr->allocated = newcount;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline struct mecherrmap__pair *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_getaddr (mecherrmap__pairarray *arr, long idx)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (idx < 0 || idx >= arr->allocated)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry abort();
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return arr->elts + idx;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_set (mecherrmap__pairarray *arr, long idx, struct mecherrmap__pair value)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *newvalp;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry newvalp = mecherrmap__pairarray_getaddr(arr, idx);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *newvalp = value;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline struct mecherrmap__pair
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_get (mecherrmap__pairarray *arr, long idx)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return *mecherrmap__pairarray_getaddr(arr, idx);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__pairarray_destroy (mecherrmap__pairarray *arr)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(arr->elts);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry arr->elts = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* end of t_array template */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* start of t_bimap body template */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* for use in cases where text substitutions may not work, like putting
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry "const" before a type that turns out to be "char *" */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrytypedef OM_uint32 mecherrmap__left_t;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrytypedef struct mecherror mecherrmap__right_t;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrytypedef struct {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry mecherrmap__pairarray a;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry long nextidx;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry} mecherrmap;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_init (mecherrmap *m)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry m->nextidx = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return mecherrmap__pairarray_init (&m->a);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline long
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_size (mecherrmap *m)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return mecherrmap__pairarray_size (&m->a);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_foreach (mecherrmap *m, int (*fn)(OM_uint32, struct mecherror, void *), void *p)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry long i, sz;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry sz = m->nextidx;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry for (i = 0; i < sz; i++) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *pair;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry pair = mecherrmap__pairarray_getaddr (&m->a, i);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((*fn)(pair->l, pair->r, p) != 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry break;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_add (mecherrmap *m, OM_uint32 l, struct mecherror r)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry long i, sz;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair newpair;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry int err;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry sz = m->nextidx;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry /* Make sure we're not duplicating. */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry for (i = 0; i < sz; i++) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *pair;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry pair = mecherrmap__pairarray_getaddr (&m->a, i);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry assert ((*cmp_OM_uint32)(l, pair->l) != 0);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((*cmp_OM_uint32)(l, pair->l) == 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry abort();
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry assert ((*mecherror_cmp)(r, pair->r) != 0);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((*mecherror_cmp)(r, pair->r) == 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry abort();
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry newpair.l = l;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry newpair.r = r;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (sz >= LONG_MAX - 1)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return ENOMEM;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry err = mecherrmap__pairarray_grow (&m->a, sz+1);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (err)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return err;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry mecherrmap__pairarray_set (&m->a, sz, newpair);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry m->nextidx++;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline const mecherrmap__right_t *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_findleft (mecherrmap *m, OM_uint32 l)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry long i, sz;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry sz = mecherrmap_size (m);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry for (i = 0; i < sz; i++) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *pair;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry pair = mecherrmap__pairarray_getaddr (&m->a, i);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((*cmp_OM_uint32)(l, pair->l) == 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return &pair->r;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline const mecherrmap__left_t *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_findright (mecherrmap *m, struct mecherror r)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry long i, sz;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry sz = mecherrmap_size (m);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry for (i = 0; i < sz; i++) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__pair *pair;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry pair = mecherrmap__pairarray_getaddr (&m->a, i);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((*mecherror_cmp)(r, pair->r) == 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return &pair->l;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystruct mecherrmap__printstat {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry FILE *f;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry int comma;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry};
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap__printone (OM_uint32 l, struct mecherror r, void *p)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__printstat *ps = p;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(ps->f, ps->comma ? ", (" : "(");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ps->comma = 1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (*print_OM_uint32)(l, ps->f);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(ps->f, ",");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (*mecherror_print)(r, ps->f);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(ps->f, ")");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_printmap (mecherrmap *m, FILE *f)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry struct mecherrmap__printstat ps;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ps.comma = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ps.f = f;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(f, "(");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry mecherrmap_foreach (m, mecherrmap__printone, &ps);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(f, ")");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrymecherrmap_destroy (mecherrmap *m)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry mecherrmap__pairarray_destroy (&m->a);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* end of t_bimap body template */