summaryrefslogtreecommitdiffstats
path: root/src/dle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dle.c')
-rw-r--r--src/dle.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/dle.c b/src/dle.c
index 680c82f..1cf9fa7 100644
--- a/src/dle.c
+++ b/src/dle.c
@@ -2,7 +2,7 @@
#include "dle.h"
-size_t dle_decode(uint8_t* s, size_t ls, uint8_t* d, size_t *ld, void (*dle_func) (uint8_t c, void *user), void *user, int *dle_flag) {
+size_t dle_decode(const uint8_t* s, size_t ls, uint8_t* d, size_t *ld, int (*dle_func) (uint8_t c, void *user), void *user, int *dle_flag) {
size_t ns, nd;
assert(s && ls && d && ld && *ld && dle_flag);
@@ -12,8 +12,11 @@ size_t dle_decode(uint8_t* s, size_t ls, uint8_t* d, size_t *ld, void (*dle_func
if (s[ns] == DLE)
d[nd++] = DLE;
else {
- if (dle_func)
- dle_func(s[ns], user);
+ if (dle_func)
+ if (dle_func(s[ns], user) < 0) {
+ ns++;
+ break;
+ }
}
*dle_flag = 0;
@@ -29,12 +32,15 @@ size_t dle_decode(uint8_t* s, size_t ls, uint8_t* d, size_t *ld, void (*dle_func
return ns;
}
-size_t dle_encode(uint8_t* s, size_t ls, uint8_t* d, size_t *ld) {
+size_t dle_encode(const uint8_t* s, size_t ls, uint8_t* d, size_t *ld) {
size_t ns, nd;
for (ns = nd = 0; ns < ls && nd < *ld; ns++) {
- if (s[ns] == DLE)
+ if (s[ns] == DLE) {
+ if (nd+1 >= *ld)
+ break;
d[nd++] = DLE;
+ }
d[nd++] = s[ns];
}