diff options
Diffstat (limited to 'src/dle.c')
-rw-r--r-- | src/dle.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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]; } |