mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
705c0731b6
Summary: This is not yet complete, but seems to be able to parse a data file. Test Plan: `/Users/tonytung/Library/Caches/CLion2016.2/cmake/generated/cdatapack-64b7828e/64b7828e/Debug/cdatapack_dump d864669a5651d04505ec6e5e9dba1319cde71f7b > /tmp/2` compare it with the output of `hg debugdatapack --long d864669a5651d04505ec6e5e9dba1319cde71f7b > /tmp/1` and it exactly matches. Reviewers: durham Reviewed By: durham Subscribers: mitrandir Differential Revision: https://phabricator.intern.facebook.com/D3627122 Signature: t1:3627122:1470085301:c9b9e8b2fa57bb7a09dd56d3c811ff8eadbb85ba
76 lines
2.3 KiB
C
76 lines
2.3 KiB
C
// Copyright 2016-present Facebook. All Rights Reserved.
|
|
//
|
|
// convert.h: hex-string conversions
|
|
//
|
|
// no-check-code
|
|
|
|
#ifndef __FASTMANIFEST_CONVERT_H__
|
|
#define __FASTMANIFEST_CONVERT_H__
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
static int8_t hextable[256] = {
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0-9 */
|
|
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
|
|
};
|
|
|
|
static char chartable[16] = {
|
|
'0', '1', '2', '3', '4', '5', '6', '7',
|
|
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
|
|
};
|
|
|
|
/*
|
|
* Turn a hex-encoded string into binary. Returns false on failure.
|
|
*/
|
|
static inline bool unhexlify(const char *input, int len, uint8_t *dst) {
|
|
if (len % 2 != 0) {
|
|
// wtf.
|
|
return false;
|
|
}
|
|
|
|
for (size_t ix = 0; ix < len; ix += 2, dst++) {
|
|
int hi = hextable[(unsigned char) input[ix]];
|
|
int lo = hextable[(unsigned char) input[ix + 1]];
|
|
|
|
if (hi < 0 || lo < 0) {
|
|
return false;
|
|
}
|
|
*dst = (hi << 4) | lo;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Turn binary data into a hex-encoded string.
|
|
*/
|
|
static inline void hexlify(const uint8_t *input, int len, char *dst) {
|
|
for (size_t ix = 0; ix < len; ix++, dst += 2) {
|
|
unsigned char ch = (unsigned char) input[ix];
|
|
char hi = chartable[ch >> 4];
|
|
char lo = chartable[ch & 0xf];
|
|
|
|
*dst = hi;
|
|
*(dst + 1) = lo;
|
|
}
|
|
}
|
|
|
|
|
|
#endif /* #ifndef __FASTMANIFEST_CONVERT_H__ */
|