sandi-0.1: csrc/yenc.c
// Copyright: (c) Magnus Therning, 2012
// License: BSD3, found in the LICENSE file
#include <assert.h>
#include "yenc.h"
void y_enc(uint8_t const *src, size_t srclen,
uint8_t *dst, size_t *dstlen,
uint8_t const **rem, size_t *remlen)
{
assert(src || 0 == srclen);
assert(dst);
assert(dstlen);
assert(rem);
assert(remlen);
size_t od = *dstlen, i;
for(i = 0, *dstlen = 0; i < srclen && *dstlen < od; i++, (*dstlen)++) {
switch(src[i]) {
case 19:
case 214:
case 224:
case 227:
if(*dstlen >= od - 1) goto exit; // is there room for 2 chars in dst?
dst[(*dstlen)++] = 61;
dst[*dstlen] = src[i] + 106;
break;
default:
dst[*dstlen] = src[i] + 42;
break;
}
}
exit:
*rem = src + i;
*remlen = srclen - i;
}
int y_dec(uint8_t const *src, size_t srclen,
uint8_t *dst, size_t *dstlen,
uint8_t const **rem, size_t *remlen)
{
assert(src || 0 == srclen);
assert(dst);
assert(dstlen);
assert(rem);
assert(remlen);
size_t od = *dstlen, i;
for(i = 0, *dstlen = 0; i < srclen && *dstlen < od; i++, (*dstlen)++) {
if(61 == src[i]) {
if(srclen <= i + 1) goto exit;
dst[*dstlen] = src[++i] - 106;
} else
dst[*dstlen] = src[i] - 42;
}
exit:
*rem = src + i;
*remlen = srclen - i;
return(0);
}