/*
 * libfdt - Flat Device Tree manipulation
 * Copyright (C) 2006 David Gibson, IBM Corporation.
 *
 * libfdt is dual licensed: you can use it either under the terms of
 * the GPL, or the BSD license, at your option.
 *
 *  a) This library is free software; you can redistribute it and/or
 *     modify it under the terms of the GNU General Public License as
 *     published by the Free Software Foundation; either version 2 of the
 *     License, or (at your option) any later version.
 *
 *     This library is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public
 *     License along with this library; if not, write to the Free
 *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 *     MA 02110-1301 USA
 *
 * Alternatively,
 *
 *  b) 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 "libfdt_env.h"

#include <fdt.h>
#include <libfdt.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_BADPHANDLE),
  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),
  FDT_ERRTABENT (FDT_ERR_INTERNAL),
  FDT_ERRTABENT (FDT_ERR_BADNCELLS),
  FDT_ERRTABENT (FDT_ERR_BADVALUE),
  FDT_ERRTABENT (FDT_ERR_BADOVERLAY),
  FDT_ERRTABENT (FDT_ERR_NOPHANDLES),
};
#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>";
}
