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