/*
 * libfdt - Flat Device Tree manipulation
 * Copyright (C) 2006 David Gibson, IBM Corporation.
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *     1. Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *     2. Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include <fdt.h>
#include <libfdt.h>

#include "libfdt_env.h"
#include "libfdt_internal.h"

struct fdt_errtabent {
        const char *str;
};

#define FDT_ERRTABENT(val) \
        [(val)] = { .str = #val, }

static struct fdt_errtabent fdt_errtable[] = {
        FDT_ERRTABENT(FDT_ERR_NOTFOUND),
        FDT_ERRTABENT(FDT_ERR_EXISTS),
        FDT_ERRTABENT(FDT_ERR_NOSPACE),

        FDT_ERRTABENT(FDT_ERR_BADOFFSET),
        FDT_ERRTABENT(FDT_ERR_BADPATH),
        FDT_ERRTABENT(FDT_ERR_BADSTATE),

        FDT_ERRTABENT(FDT_ERR_TRUNCATED),
        FDT_ERRTABENT(FDT_ERR_BADMAGIC),
        FDT_ERRTABENT(FDT_ERR_BADVERSION),
        FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE),
        FDT_ERRTABENT(FDT_ERR_BADLAYOUT),
};
#define FDT_ERRTABSIZE	(sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))

const char *fdt_strerror(int errval)
{
        if (errval > 0)
                return "<valid offset/length>";
        else if (errval == 0)
                return "<no error>";
        else if (errval > -FDT_ERRTABSIZE) {
                const char *s = fdt_errtable[-errval].str;

                if (s)
                        return s;
        }

        return "<unknown error>";
}
