/* Get number of attributes of abbreviation.
   Copyright (C) 2003, 2004, 2017 Red Hat, Inc.
   This file is part of elfutils.
   Written by Ulrich Drepper <drepper@redhat.com>, 2003.

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * 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

   or both in parallel, as here.

   elfutils 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 copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include "libdwP.h"


int
dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp)
{
  if (abbrev == NULL)
    return -1;

  const unsigned char *abbrevp = abbrev->attrp;

  /* Skip over all the attributes and count them while doing so.  */
  int attrcnt = 0;
  unsigned int attrname;
  unsigned int attrform;
  do
    {
      /* We can use unchecked since they were checked when the Dwrf_Abbrev
	 was created.  */
      get_uleb128_unchecked (attrname, abbrevp);
      get_uleb128_unchecked (attrform, abbrevp);
    }
  while (attrname != 0 && attrform != 0 && ++attrcnt);

  *attrcntp = attrcnt;

  return 0;
}
