Home | History | Annotate | Download | only in libdw
      1 /* Get specific attribute of abbreviation.
      2    Copyright (C) 2003, 2004 Red Hat, Inc.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 2003.
      4 
      5    This program is Open Source software; you can redistribute it and/or
      6    modify it under the terms of the Open Software License version 1.0 as
      7    published by the Open Source Initiative.
      8 
      9    You should have received a copy of the Open Software License along
     10    with this program; if not, you may obtain a copy of the Open Software
     11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
     12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
     13    3001 King Ranch Road, Ukiah, CA 95482.   */
     14 
     15 #ifdef HAVE_CONFIG_H
     16 # include <config.h>
     17 #endif
     18 
     19 #include <assert.h>
     20 #include <dwarf.h>
     21 #include "libdwP.h"
     22 
     23 
     24 int
     25 dwarf_getabbrevattr (abbrev, idx, namep, formp, offsetp)
     26      Dwarf_Abbrev *abbrev;
     27      size_t idx;
     28      unsigned int *namep;
     29      unsigned int *formp;
     30      Dwarf_Off *offsetp;
     31 {
     32   if (abbrev == NULL)
     33     return -1;
     34 
     35   size_t cnt = 0;
     36   unsigned char *attrp = abbrev->attrp;
     37   unsigned char *start_attrp;
     38   unsigned int name;
     39   unsigned int form;
     40 
     41   do
     42     {
     43       start_attrp = attrp;
     44 
     45       /* Attribute code and form are encoded as ULEB128 values.  */
     46       get_uleb128 (name, attrp);
     47       get_uleb128 (form, attrp);
     48 
     49       /* If both values are zero the index is out of range.  */
     50       if (name == 0 && form == 0)
     51 	return -1;
     52     }
     53   while (cnt++ < idx);
     54 
     55   /* Store the result if requested.  */
     56   if (namep != NULL)
     57     *namep = name;
     58   if (formp != NULL)
     59     *formp = form;
     60   if (offsetp != NULL)
     61     *offsetp = (start_attrp - abbrev->attrp) + abbrev->offset;
     62 
     63   return 0;
     64 }
     65