summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2022-10-18 11:21:37 +0200
committerGravatar default2022-10-18 11:21:37 +0200
commit6e28a810e1159410051e8275d051448658abb0d6 (patch)
tree83d9426431c1d9fd9832b5bb7f1e853aeb339751
parentBackport from xs. (diff)
downloadsnac2-6e28a810e1159410051e8275d051448658abb0d6.tar.gz
snac2-6e28a810e1159410051e8275d051448658abb0d6.tar.xz
snac2-6e28a810e1159410051e8275d051448658abb0d6.zip
Backport from xs.
-rw-r--r--xs_encdec.h37
-rw-r--r--xs_version.h2
2 files changed, 25 insertions, 14 deletions
diff --git a/xs_encdec.h b/xs_encdec.h
index f6042e8..b093eca 100644
--- a/xs_encdec.h
+++ b/xs_encdec.h
@@ -4,11 +4,11 @@
4 4
5#define _XS_ENCDEC_H 5#define _XS_ENCDEC_H
6 6
7d_char *xs_hex_enc(const char *data, int size); 7 d_char *xs_hex_enc(const char *data, int size);
8d_char *xs_hex_dec(const char *hex); 8 d_char *xs_hex_dec(const char *hex, int *size);
9d_char *xs_base64_enc(const char *data, int sz); 9 d_char *xs_base64_enc(const char *data, int sz);
10d_char *xs_base64_dec(const char *data, int *size); 10 d_char *xs_base64_dec(const char *data, int *size);
11d_char *xs_utf8_enc(d_char *str, unsigned int cpoint); 11 d_char *xs_utf8_enc(d_char *str, unsigned int cpoint);
12 12
13 13
14#ifdef XS_IMPLEMENTATION 14#ifdef XS_IMPLEMENTATION
@@ -20,18 +20,20 @@ d_char *xs_hex_enc(const char *data, int size)
20 char *p; 20 char *p;
21 int n; 21 int n;
22 22
23 p = s = calloc(size * 2 + 1, 1); 23 p = s = xs_realloc(NULL, _xs_blk_size(size * 2 + 1));
24 24
25 for (n = 0; n < size; n++) { 25 for (n = 0; n < size; n++) {
26 sprintf(p, "%02x", (unsigned char)data[n]); 26 sprintf(p, "%02x", (unsigned char)data[n]);
27 p += 2; 27 p += 2;
28 } 28 }
29 29
30 *p = '\0';
31
30 return s; 32 return s;
31} 33}
32 34
33 35
34d_char *xs_hex_dec(const char *hex) 36d_char *xs_hex_dec(const char *hex, int *size)
35/* decodes an hexdump into data */ 37/* decodes an hexdump into data */
36{ 38{
37 int sz = strlen(hex); 39 int sz = strlen(hex);
@@ -40,16 +42,16 @@ d_char *xs_hex_dec(const char *hex)
40 int n; 42 int n;
41 43
42 if (sz % 2) 44 if (sz % 2)
43 return s; 45 return NULL;
44 46
45 p = s = calloc(sz / 2, 1); 47 p = s = xs_realloc(NULL, _xs_blk_size(sz / 2 + 1));
46 48
47 for (n = 0; n < sz; n += 2) { 49 for (n = 0; n < sz; n += 2) {
48 int i; 50 int i;
49 if (sscanf(&hex[n], "%02x", &i) == 0) { 51 if (sscanf(&hex[n], "%02x", &i) == 0) {
50 /* decoding error */ 52 /* decoding error */
51 free(s); 53 free(s);
52 s = NULL; 54 return NULL;
53 } 55 }
54 else 56 else
55 *p = i; 57 *p = i;
@@ -57,6 +59,9 @@ d_char *xs_hex_dec(const char *hex)
57 p++; 59 p++;
58 } 60 }
59 61
62 *p = '\0';
63 *size = sz / 2;
64
60 return s; 65 return s;
61} 66}
62 67
@@ -73,7 +78,7 @@ d_char *xs_base64_enc(const char *data, int sz)
73 "0123456789+/"; 78 "0123456789+/";
74 79
75 bsz = ((sz + 3 - 1) / 3) * 4; 80 bsz = ((sz + 3 - 1) / 3) * 4;
76 i = s = calloc(bsz + 1, 1); 81 i = s = xs_realloc(NULL, _xs_blk_size(bsz + 1));
77 p = (unsigned char *)data; 82 p = (unsigned char *)data;
78 83
79 for (n = 0; n < sz; n += 3) { 84 for (n = 0; n < sz; n += 3) {
@@ -100,6 +105,8 @@ d_char *xs_base64_enc(const char *data, int sz)
100 } 105 }
101 } 106 }
102 107
108 *i = '\0';
109
103 return s; 110 return s;
104} 111}
105 112
@@ -118,7 +125,7 @@ d_char *xs_base64_dec(const char *data, int *size)
118 125
119 /* size of data must be a multiple of 4 */ 126 /* size of data must be a multiple of 4 */
120 if (strlen(p) % 4) 127 if (strlen(p) % 4)
121 return s; 128 return NULL;
122 129
123 for (p = (char *)data; *p; p += 4) { 130 for (p = (char *)data; *p; p += 4) {
124 int cs[4]; 131 int cs[4];
@@ -151,11 +158,15 @@ d_char *xs_base64_dec(const char *data, int *size)
151 tmp[n++] = cs[2] << 6 | (cs[3] & 0x3f); 158 tmp[n++] = cs[2] << 6 | (cs[3] & 0x3f);
152 159
153 /* must be done manually because data can be pure binary */ 160 /* must be done manually because data can be pure binary */
154 s = realloc(s, sz + n); 161 s = xs_realloc(s, _xs_blk_size(sz + n));
155 memcpy(s + sz, tmp, n); 162 memcpy(s + sz, tmp, n);
156 sz += n; 163 sz += n;
157 } 164 }
158 165
166 /* asciiz it to use it as a string */
167 s = xs_realloc(s, _xs_blk_size(sz + 1));
168 s[sz] = '\0';
169
159 *size = sz; 170 *size = sz;
160 171
161 return s; 172 return s;
diff --git a/xs_version.h b/xs_version.h
index 1266a4f..0146965 100644
--- a/xs_version.h
+++ b/xs_version.h
@@ -1 +1 @@
/* 2d6bb8fdf48f1c9ccfce76600eb1d729edce7bef */ /* 5b0cf1cb8fbe10458349a8a3904b26f76cd0a415 */