diff options
| author | 2022-10-18 11:21:37 +0200 | |
|---|---|---|
| committer | 2022-10-18 11:21:37 +0200 | |
| commit | 6e28a810e1159410051e8275d051448658abb0d6 (patch) | |
| tree | 83d9426431c1d9fd9832b5bb7f1e853aeb339751 | |
| parent | Backport from xs. (diff) | |
| download | snac2-6e28a810e1159410051e8275d051448658abb0d6.tar.gz snac2-6e28a810e1159410051e8275d051448658abb0d6.tar.xz snac2-6e28a810e1159410051e8275d051448658abb0d6.zip | |
Backport from xs.
| -rw-r--r-- | xs_encdec.h | 37 | ||||
| -rw-r--r-- | xs_version.h | 2 |
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 | ||
| 7 | d_char *xs_hex_enc(const char *data, int size); | 7 | d_char *xs_hex_enc(const char *data, int size); |
| 8 | d_char *xs_hex_dec(const char *hex); | 8 | d_char *xs_hex_dec(const char *hex, int *size); |
| 9 | d_char *xs_base64_enc(const char *data, int sz); | 9 | d_char *xs_base64_enc(const char *data, int sz); |
| 10 | d_char *xs_base64_dec(const char *data, int *size); | 10 | d_char *xs_base64_dec(const char *data, int *size); |
| 11 | d_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 | ||
| 34 | d_char *xs_hex_dec(const char *hex) | 36 | d_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 */ | ||