diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2023-02-12 20:22:32 +0100 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2023-02-12 20:22:32 +0100 |
commit | d7f3721ac6fa2acebc5005170591c05f6a569930 (patch) | |
tree | 176b2d98ac6f340bdead4cff1b8e250b272f3fdb /src/bencoding.c | |
parent | insert.php error reporting, correct hashes (diff) | |
download | travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar.gz travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar.bz2 travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar.lz travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar.xz travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.tar.zst travnik-d7f3721ac6fa2acebc5005170591c05f6a569930.zip |
Diffstat (limited to 'src/bencoding.c')
-rw-r--r-- | src/bencoding.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/bencoding.c b/src/bencoding.c index a46380e..9ff9f89 100644 --- a/src/bencoding.c +++ b/src/bencoding.c @@ -1,3 +1,5 @@ +#include <stdbool.h> + /** * enum of all possible bencoding types and some options to use * to check a type, use ORing, not direct comparison, as bdecoded structs inherit opts from bdecode function in their ->types @@ -8,7 +10,8 @@ enum benc { num = 1 << 1, list = 1 << 2, dict = 1 << 3, - replace = 1 << 4 /**< replace existing element with same key when using binsert() instead of prepending the new element before the old. see binsert() docs. */ + replace = 1 << 4, /**< replace existing element with same key when using binsert() instead of prepending the new element before the old. see binsert() docs. */ + nonascii2dot = 1 << 5 /**< see b2json() */ }; /** @@ -197,22 +200,19 @@ int b2json_charsize (unsigned char a) { return 2; if (a < ' ') return 6; - if (a > 127) - return 1; return 1; } /** * write a string representation of a character in a JSON string * - * non-ASCII characters are replaced with a '.' - * * @param dest [out] destination * @param a [in] the character in question + * @param na2d [in] true if you want to convert non-ascii characters to . or false to output them literally (the latter is non-standard) * @return the destination pointer, incremented for the number of bytes written */ -char * b2json_charrepr (char * dest, unsigned char a) { +char * b2json_charrepr (char * dest, unsigned char a, bool na2d) { switch (a) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-truncation" @@ -243,7 +243,7 @@ char * b2json_charrepr (char * dest, unsigned char a) { sprintf(buf, "\\u00%02x", a); strncpy(dest, buf, 6); return dest+6; - } else if (a > 127) { + } else if (a > 127 && na2d) { *dest++ = '.'; return dest; } else { @@ -297,6 +297,8 @@ int b2json_length (struct bencoding * b) { * * writes false when struct has an incorrect type and null when NULL pointer is passed, this is in ordnung with b2json_length. * + * you can set bencoding opt nonascii2dot to convert values above 127 to '.' + * * @param dest [in] destination * @param b [in] bencoding structure of a bdecoded element * @return the destination pointer, incremented for the number of bytes written @@ -316,7 +318,7 @@ char * b2json (char * dest, struct bencoding * b) { if (b->type & string) { *dest++ = '"'; for (size_t i = 0; i < b->valuelen; i++) - dest = b2json_charrepr(dest, b->value[i]); + dest = b2json_charrepr(dest, b->value[i], b->type & nonascii2dot); *dest++ = '"'; return dest; } |