Implement uc_hex_encode_delim without snprintf, fix length of

uc_hex_encode_delim when truncated output.
This commit is contained in:
Nils O. Selåsdal
2013-12-06 22:47:16 +01:00
parent 25f83f36ee
commit 59b4c3f57e
2 changed files with 28 additions and 10 deletions
+26 -9
View File
@@ -1,16 +1,18 @@
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include "ucore/string.h"
#include "ucore/utils.h"
static const char hx_chars[] = "0123456789ABCDEF" ;
char*
uc_hex_encode(const uint8_t *in, size_t len, char *out)
{
unsigned int i, t, hn, ln;
unsigned int i, t;
for (i = 0, t = 0; i < len; ++i,t+=2) {
unsigned int hn, ln;
hn = (in[i] & 0xF0) >> 4 ;
ln = in[i] & 0x0F ;
@@ -27,19 +29,34 @@ uc_hex_encode(const uint8_t *in, size_t len, char *out)
char*
uc_hex_encode_delim(const uint8_t *in, size_t inlen, char *out, int outlen, char *delim)
{
unsigned int i;
size_t i;
char *outp = out;
out[0] = 0;
for (i = 0; i < inlen; i++) {
unsigned int hn, ln;
char *delimp = delim;
for (i = 0; i < inlen && outlen > 0; i++) {
int rc = snprintf(outp, outlen, "%02X%s", in[i], delim);
if (rc <= 0)
/** Truncate at a full byte */
if (outlen <= 2) {
break;
outp += rc;
outlen -= rc;
}
hn = (in[i] & 0xF0) >> 4 ;
ln = in[i] & 0x0F ;
outp[0] = hx_chars[hn];
outp[1] = hx_chars[ln];
outlen -= 2;
outp += 2;
while (outlen > 1 && *delimp) {
*outp++ = *delimp++;
outlen--;
}
}
*outp = 0;
return outp;
}