* leb128.h: #include stdint.h, inttypes.h.
(read_uleb128_to_uint64): Renamed from read_uleb128_to_ull. Change to take a uint64_t * argument instead of unsigned long long. (read_sleb128_to_uint64): Renamed from read_sleb128_to_ll. Change to take an int64_t * argument instead of long long.
This commit is contained in:
parent
9cbf10a06e
commit
a7a7311974
|
@ -1,3 +1,11 @@
|
|||
2012-05-23 Doug Evans <dje@google.com>
|
||||
|
||||
* leb128.h: #include stdint.h, inttypes.h.
|
||||
(read_uleb128_to_uint64): Renamed from read_uleb128_to_ull.
|
||||
Change to take a uint64_t * argument instead of unsigned long long.
|
||||
(read_sleb128_to_uint64): Renamed from read_sleb128_to_ll.
|
||||
Change to take an int64_t * argument instead of long long.
|
||||
|
||||
2012-05-22 Doug Evans <dje@google.com>
|
||||
|
||||
* leb128.h: New file.
|
||||
|
|
|
@ -19,7 +19,12 @@ Boston, MA 02110-1301, USA. */
|
|||
|
||||
/* The functions defined here can be speed critical.
|
||||
Since they are all pretty small we keep things simple and just define
|
||||
them all as "static inline". */
|
||||
them all as "static inline".
|
||||
|
||||
WARNING: This file is used by GDB which is stuck at C90. :-(
|
||||
Though it can use stdint.h, inttypes.h.
|
||||
Therefore if you want to add support for "long long" you need
|
||||
to wrap it in #ifdef CC_HAS_LONG_LONG. */
|
||||
|
||||
#ifndef LEB128_H
|
||||
#define LEB128_H
|
||||
|
@ -30,6 +35,13 @@ Boston, MA 02110-1301, USA. */
|
|||
/* Get a definition for NULL, size_t. */
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
/* Decode the unsigned LEB128 constant at BUF into the variable pointed to
|
||||
by R, and return the number of bytes read.
|
||||
If we read off the end of the buffer, zero is returned,
|
||||
|
@ -39,12 +51,12 @@ Boston, MA 02110-1301, USA. */
|
|||
read to avoid const-vs-non-const problems. */
|
||||
|
||||
static inline size_t
|
||||
read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
|
||||
unsigned long long *r)
|
||||
read_uleb128_to_uint64 (const unsigned char *buf, const unsigned char *buf_end,
|
||||
uint64_t *r)
|
||||
{
|
||||
const unsigned char *p = buf;
|
||||
unsigned int shift = 0;
|
||||
unsigned long long result = 0;
|
||||
uint64_t result = 0;
|
||||
unsigned char byte;
|
||||
|
||||
while (1)
|
||||
|
@ -53,7 +65,7 @@ read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
|
|||
return 0;
|
||||
|
||||
byte = *p++;
|
||||
result |= ((unsigned long long) (byte & 0x7f)) << shift;
|
||||
result |= ((uint64_t) (byte & 0x7f)) << shift;
|
||||
if ((byte & 0x80) == 0)
|
||||
break;
|
||||
shift += 7;
|
||||
|
@ -72,12 +84,12 @@ read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
|
|||
read to avoid const-vs-non-const problems. */
|
||||
|
||||
static inline size_t
|
||||
read_sleb128_to_ll (const unsigned char *buf, const unsigned char *buf_end,
|
||||
long long *r)
|
||||
read_sleb128_to_int64 (const unsigned char *buf, const unsigned char *buf_end,
|
||||
int64_t *r)
|
||||
{
|
||||
const unsigned char *p = buf;
|
||||
unsigned int shift = 0;
|
||||
long long result = 0;
|
||||
int64_t result = 0;
|
||||
unsigned char byte;
|
||||
|
||||
while (1)
|
||||
|
@ -86,13 +98,13 @@ read_sleb128_to_ll (const unsigned char *buf, const unsigned char *buf_end,
|
|||
return 0;
|
||||
|
||||
byte = *p++;
|
||||
result |= ((unsigned long long) (byte & 0x7f)) << shift;
|
||||
result |= ((uint64_t) (byte & 0x7f)) << shift;
|
||||
shift += 7;
|
||||
if ((byte & 0x80) == 0)
|
||||
break;
|
||||
}
|
||||
if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
|
||||
result |= -(((unsigned long long) 1) << shift);
|
||||
result |= -(((uint64_t) 1) << shift);
|
||||
|
||||
*r = result;
|
||||
return p - buf;
|
||||
|
|
Loading…
Reference in New Issue