Skip to content

Commit a7cff0b

Browse files
committed
hex: update hex functions
1 parent 464e897 commit a7cff0b

File tree

6 files changed

+89
-121
lines changed

6 files changed

+89
-121
lines changed

include/ethc/hex.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ extern "C" {
88
#include <stddef.h>
99
#include <stdint.h>
1010

11-
int eth_is_hexstr(const char* str, size_t len, int strict);
12-
char *eth_hexstr_pad_left(const char* str, size_t str_len, size_t width);
13-
char *eth_hexstr_pad_right(const char* str, size_t str_len, size_t width);
14-
int eth_hexstr_from_bytes(const uint8_t *bytes, size_t len, int prefix, char *hexstr);
11+
int eth_is_hex(const char *str, size_t len, int strict);
12+
int eth_hex_pad_left(char *rstr, const char *str, size_t len, size_t width);
13+
int eth_hex_pad_right(char *rstr, const char *str, size_t len, size_t width);
14+
int eth_hex_from_bytes(char *rstr, const uint8_t *bytes, size_t len);
1515

1616
#ifdef __cplusplus
1717
}

src/address.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <ethc/keccak256.h>
55

66
int eth_is_address(const char *addr) {
7-
if (!addr || !eth_is_hexstr(addr, 42, 1))
7+
if (!addr || !eth_is_hex(addr, 42, 1))
88
return 0;
99

1010
return 1;

src/hex.c

Lines changed: 33 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include <ethc/hex.h>
2-
#include <stdlib.h>
32
#include <strings.h>
43

54
#if defined(_MSC_VER)
@@ -9,8 +8,8 @@
98

109
#define HEXCHARS "0123456789abcdef"
1110

12-
int eth_is_hexstr(const char *str, size_t len, int strict) {
13-
int has_prefix = 0;
11+
int eth_is_hex(const char *str, size_t len, int strict) {
12+
int prefix = 0;
1413
size_t i;
1514

1615
len = len == -1 ? strlen(str) : len;
@@ -19,12 +18,12 @@ int eth_is_hexstr(const char *str, size_t len, int strict) {
1918
return 0;
2019

2120
if (strncasecmp(str, "0x", 2) == 0)
22-
has_prefix = 1;
21+
prefix = 1;
2322

24-
if (strict && !has_prefix)
23+
if (strict && !prefix)
2524
return 0;
2625

27-
if (has_prefix) {
26+
if (prefix) {
2827
str += 2;
2928
len -= 2;
3029
}
@@ -39,93 +38,57 @@ int eth_is_hexstr(const char *str, size_t len, int strict) {
3938
return 1;
4039
}
4140

42-
char *eth_hexstr_pad_left(const char *str, size_t str_len, size_t width) {
43-
char *new_str = NULL;
44-
int has_prefix = 0;
41+
int eth_hex_pad_left(char *rstr, const char *str, size_t len, size_t width) {
4542
size_t fill_len = 0;
4643

47-
str_len = str_len == -1 ? strlen(str) : str_len;
44+
len = len == -1 ? strlen(str) : len;
4845

49-
// should we return `str` or copy of `str` when `str_len` > `width` ?
50-
if (!str || str_len > width || !eth_is_hexstr(str, str_len, 0))
51-
return NULL;
46+
if(!str || !rstr)
47+
return 0;
5248

53-
if (strncasecmp(str, "0x", 2) == 0)
54-
has_prefix = 1;
55-
56-
new_str = malloc(has_prefix ? (width + 2 + 1) : (width + 1));
57-
if (!new_str)
58-
return NULL;
59-
60-
if (has_prefix) {
61-
strncpy(new_str, str, 2);
62-
fill_len = width - (str_len - 2);
63-
memset(new_str + 2, '0', fill_len);
64-
memcpy(new_str + 2 + fill_len, str + 2, str_len - 2);
65-
new_str[width + 2] = '\0';
66-
return new_str;
67-
}
49+
if (len > width || !eth_is_hex(str, len, 0))
50+
return 0;
6851

69-
fill_len = width - str_len;
70-
memset(new_str, '0', fill_len);
71-
memcpy(new_str + fill_len, str, str_len);
72-
new_str[width] = '\0';
73-
return new_str;
52+
fill_len = width - len;
53+
memset(rstr, '0', fill_len);
54+
memcpy(rstr + fill_len, str, len);
55+
rstr[width] = '\0';
56+
57+
return 1;
7458
}
7559

76-
char *eth_hexstr_pad_right(const char *str, size_t str_len, size_t width) {
77-
char *new_str = NULL;
78-
int has_prefix = 0;
60+
int eth_hex_pad_right(char *rstr, const char *str, size_t len, size_t width) {
7961
size_t fill_len = 0;
8062

81-
str_len = str_len == -1 ? strlen(str) : str_len;
82-
83-
if (!str || str_len > width || !eth_is_hexstr(str, str_len, 0))
84-
return NULL;
85-
86-
if (strncasecmp(str, "0x", 2) == 0) {
87-
has_prefix = 1;
88-
}
89-
90-
new_str = malloc(has_prefix ? (width + 2 + 1) : (width + 1));
91-
if (!new_str)
92-
return NULL;
63+
len = len == -1 ? strlen(str) : len;
9364

94-
strncpy(new_str, str, str_len);
65+
if(!rstr || !str)
66+
return 0;
9567

96-
if (has_prefix) {
97-
fill_len = width - (str_len - 2);
98-
memset(new_str + str_len, '0', fill_len);
99-
new_str[width + 2] = '\0';
100-
return new_str;
101-
}
68+
if (!str || len > width || !eth_is_hex(str, len, 0))
69+
return 1;
10270

103-
fill_len = width - str_len;
104-
memset(new_str + str_len, '0', fill_len);
105-
new_str[width] = '\0';
71+
strncpy(rstr, str, len);
72+
fill_len = width - len;
73+
memset(rstr + len, '0', fill_len);
74+
rstr[width] = '\0';
10675

107-
return new_str;
76+
return 1;
10877
}
10978

110-
int eth_hexstr_from_bytes(const uint8_t *bytes, size_t len, int prefix, char *hexstr) {
79+
int eth_hex_from_bytes(char *rstr, const uint8_t *bytes, size_t len) {
11180
size_t i = 0, j = 0;
11281

113-
if(!bytes || !hexstr || len < 1)
82+
if(!rstr || !bytes || len < 1)
11483
return 0;
11584

116-
if(prefix) {
117-
hexstr[0] = '0';
118-
hexstr[1] = 'x';
119-
j += 2;
120-
}
121-
12285
while(i < len) {
123-
hexstr[j++] = HEXCHARS[((bytes[i] & 0xFF) >> 4) & 0xF];
124-
hexstr[j++] = HEXCHARS[(bytes[i] & 0xFF) & 0xF];
86+
rstr[j++] = HEXCHARS[((bytes[i] & 0xFF) >> 4) & 0xF];
87+
rstr[j++] = HEXCHARS[(bytes[i] & 0xFF) & 0xF];
12588
i++;
12689
}
12790

128-
hexstr[j] = '\0';
91+
rstr[j] = '\0';
12992

13093
return 1;
13194
};

test/run-tests.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
int main() {
55
test_eth_keccak256();
66

7-
test_eth_is_hexstr();
8-
test_eth_hexstr_pad_left();
9-
test_eth_hexstr_pad_right();
10-
test_eth_hexstr_from_bytes();
7+
test_eth_is_hex();
8+
test_eth_hex_pad_left();
9+
test_eth_hex_pad_right();
10+
test_eth_hex_from_bytes();
1111

1212
test_eth_is_address();
1313
test_eth_is_checksum_address();

test/test-eth-hex.c

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,62 @@
33
#include <string.h>
44
#include <tap.h>
55

6-
void test_eth_is_hexstr(void) {
7-
const char *in0 = "";
8-
ok(eth_is_hexstr(in0, strlen(in0), 0) == 0);
6+
void test_eth_is_hex(void) {
7+
const char *in1 = "";
8+
ok(eth_is_hex(in1, strlen(in1), 0) == 0);
99

10-
const char *in1 = "0xffff00";
11-
ok(eth_is_hexstr(in1, -1, 1) == 1);
10+
const char *in2 = "0xffff00";
11+
ok(eth_is_hex(in2, -1, 1) == 1);
1212

13-
const char *in2 = "0xFFFF00";
14-
ok(eth_is_hexstr(in2, -1, 1) == 1);
13+
const char *in3 = "0xFFFF00";
14+
ok(eth_is_hex(in3, -1, 1) == 1);
1515

16-
const char *in3 = "0XFFFF00";
17-
ok(eth_is_hexstr(in3, -1, 1) == 1);
16+
const char *in4 = "0XFFFF00";
17+
ok(eth_is_hex(in4, -1, 1) == 1);
1818

19-
const char *in4 = "ffff00";
20-
ok(eth_is_hexstr(in4, -1, 1) == 0);
19+
const char *in5 = "ffff00";
20+
ok(eth_is_hex(in5, -1, 1) == 0);
2121

22-
const char *in5 = "FFFF00";
23-
ok(eth_is_hexstr(in5, -1, 0) == 1);
22+
const char *in6 = "FFFF00";
23+
ok(eth_is_hex(in6, -1, 0) == 1);
2424

25-
const char *in6 = "0xffff00nonhex";
26-
ok(eth_is_hexstr(in6, 8, 1) == 1);
25+
const char *in7 = "0xffff00nonhex";
26+
ok(eth_is_hex(in7, 8, 1) == 1);
2727
}
2828

29-
void test_eth_hexstr_pad_left(void) {
30-
const char *in0 = "0xff";
31-
is(eth_hexstr_pad_left(in0, strlen(in0), 4), "0x00ff");
32-
29+
void test_eth_hex_pad_left(void) {
3330
const char *in1 = "ff";
34-
is(eth_hexstr_pad_left(in1, strlen(in1), 4), "00ff");
31+
char out1[5]; // TODO
32+
const char *exp1 = "00ff";
33+
ok(eth_hex_pad_left(out1, in1, -1, 4) == 1);
34+
is(out1, exp1);
35+
36+
const char *in2 = "ffnonhex";
37+
char out2[5];
38+
const char *exp2 = "00ff";
39+
ok(eth_hex_pad_left(out2, in2, 2, 4) == 1);
40+
is(out2, exp2);
3541
}
3642

37-
void test_eth_hexstr_pad_right(void) {
38-
const char *in0 = "0xff";
39-
is(eth_hexstr_pad_right(in0, strlen(in0), 4), "0xff00");
40-
43+
void test_eth_hex_pad_right(void) {
4144
const char *in1 = "ff";
42-
is(eth_hexstr_pad_right(in1, strlen(in1), 4), "ff00");
45+
char out1[5]; // TODO
46+
const char *exp1 = "ff00";
47+
ok(eth_hex_pad_right(out1, in1, -1, 4) == 1);
48+
is(out1, exp1);
49+
50+
const char *in2 = "ffnonhex";
51+
char out2[5];
52+
const char *exp2 = "ff00";
53+
ok(eth_hex_pad_right(out2, in2, 2, 4) == 1);
54+
is(out2, exp2);
4355
}
4456

45-
void test_eth_hexstr_from_bytes(void) {
46-
const uint8_t bytes[3] = { 0xff, 0xaa, 0x3 };
47-
48-
const char *expected1 = "ffaa03";
49-
char result1[7];
50-
51-
ok(eth_hexstr_from_bytes(bytes, 3, 0, result1));
52-
is(result1, expected1);
53-
54-
const char *expected2 = "0xffaa03";
55-
char result2[9];
57+
void test_eth_hex_from_bytes(void) {
58+
const uint8_t in1[3] = { 0xff, 0xaa, 0x3 };
59+
const char *exp1 = "ffaa03";
60+
char out1[7];
5661

57-
ok(eth_hexstr_from_bytes(bytes, 3, 1, result2));
58-
is(result2, expected2);
62+
ok(eth_hex_from_bytes(out1, in1, 3));
63+
is(out1, exp1);
5964
}

test/test.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
void test_eth_keccak256(void);
22

3-
void test_eth_is_hexstr(void);
4-
void test_eth_hexstr_pad_left(void);
5-
void test_eth_hexstr_pad_right(void);
6-
void test_eth_hexstr_from_bytes(void);
3+
void test_eth_is_hex(void);
4+
void test_eth_hex_pad_left(void);
5+
void test_eth_hex_pad_right(void);
6+
void test_eth_hex_from_bytes(void);
77

88
void test_eth_is_address(void);
99
void test_eth_is_checksum_address(void);

0 commit comments

Comments
 (0)