136c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm#include <libunwind.h>
236c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm
336c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidmunw_word_t
436c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm_ReadSLEB (unsigned char **dpp)
536c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm{
636c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  unsigned shift = 0;
736c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  unw_word_t byte, result = 0;
836c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  unsigned char *bp = *dpp;
936c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm
1036c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  while (1)
1136c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm    {
1236c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm      byte = *bp++;
1336c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm      result |= (byte & 0x7f) << shift;
1415df8b804c7931389fc255e1953a43e32f9698c2hp.com!davidm      shift += 7;
1536c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm      if ((byte & 0x80) == 0)
1636c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm	break;
1736c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm    }
1836c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm
1936c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  if (shift < 8 * sizeof (unw_word_t) && (byte & 0x40) != 0)
2036c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm    /* sign-extend negative value */
2136c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm    result |= ((unw_word_t) -1) << shift;
2236c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm
2336c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  *dpp = bp;
2436c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm  return result;
2536c7442db32c9c9d37fc4bb5999623a2fd443a0bhp.com!davidm}
26