Browse Source
Move varint handling from tx.c and generalize it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>ppa-0.6.1
Rusty Russell
9 years ago
6 changed files with 94 additions and 56 deletions
@ -0,0 +1,62 @@ |
|||||
|
#include "varint.h" |
||||
|
|
||||
|
size_t varint_put(u8 buf[VARINT_MAX_LEN], varint_t v) |
||||
|
{ |
||||
|
u8 *p = buf; |
||||
|
|
||||
|
if (v < 0xfd) { |
||||
|
*(p++) = v; |
||||
|
} else if (v <= 0xffff) { |
||||
|
(*p++) = 0xfd; |
||||
|
(*p++) = v; |
||||
|
(*p++) = v >> 8; |
||||
|
} else if (v <= 0xffffffff) { |
||||
|
(*p++) = 0xfe; |
||||
|
(*p++) = v; |
||||
|
(*p++) = v >> 8; |
||||
|
(*p++) = v >> 16; |
||||
|
(*p++) = v >> 24; |
||||
|
} else { |
||||
|
(*p++) = 0xff; |
||||
|
(*p++) = v; |
||||
|
(*p++) = v >> 8; |
||||
|
(*p++) = v >> 16; |
||||
|
(*p++) = v >> 24; |
||||
|
(*p++) = v >> 32; |
||||
|
(*p++) = v >> 40; |
||||
|
(*p++) = v >> 48; |
||||
|
(*p++) = v >> 56; |
||||
|
} |
||||
|
return p - buf; |
||||
|
} |
||||
|
|
||||
|
size_t varint_get(const u8 *p, size_t max, varint_t *val) |
||||
|
{ |
||||
|
if (max < 1) |
||||
|
return 0; |
||||
|
|
||||
|
switch (*p) { |
||||
|
case 0xfd: |
||||
|
if (max < 3) |
||||
|
return 0; |
||||
|
*val = ((u64)p[1] << 8) + p[0]; |
||||
|
return 3; |
||||
|
case 0xfe: |
||||
|
if (max < 5) |
||||
|
return 0; |
||||
|
*val = ((u64)p[3] << 24) + ((u64)p[2] << 16) |
||||
|
+ ((u64)p[1] << 8) + p[0]; |
||||
|
return 5; |
||||
|
case 0xff: |
||||
|
if (max < 9) |
||||
|
return 0; |
||||
|
*val = ((u64)p[7] << 56) + ((u64)p[6] << 48) |
||||
|
+ ((u64)p[5] << 40) + ((u64)p[4] << 32) |
||||
|
+ ((u64)p[3] << 24) + ((u64)p[2] << 16) |
||||
|
+ ((u64)p[1] << 8) + p[0]; |
||||
|
return 9; |
||||
|
default: |
||||
|
*val = *p; |
||||
|
return 1; |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
#ifndef LIGHTNING_BITCOIN_VARINT_H |
||||
|
#define LIGHTNING_BITCOIN_VARINT_H |
||||
|
#include "config.h" |
||||
|
#include <ccan/short_types/short_types.h> |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
/* We unpack varints for our in-memory representation */ |
||||
|
#define varint_t u64 |
||||
|
|
||||
|
#define VARINT_MAX_LEN 9 |
||||
|
|
||||
|
/* Returns bytes used (up to 9) */ |
||||
|
size_t varint_put(u8 buf[VARINT_MAX_LEN], varint_t v); |
||||
|
|
||||
|
/* Returns bytes used: 0 if max_len too small. */ |
||||
|
size_t varint_get(const u8 *p, size_t max_len, varint_t *val); |
||||
|
#endif /* LIGHTNING_BITCOIN_VARINT_H */ |
Loading…
Reference in new issue