diff options
author | Lennart Poettering <lennart@poettering.net> | 2003-12-17 22:11:57 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2003-12-17 22:11:57 +0000 |
commit | c79399f437e9268203768ab65b32c20f29093b27 (patch) | |
tree | 4fdebb22251b0a80faf8011436829a3521e7aad9 /src/dle.c | |
parent | d918d9b2c4fc9eaa58bcd9a266a6a0330c88391c (diff) |
much further work
git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@7 dbf6933d-3bce-0310-9bcc-ed052ba35b35
Diffstat (limited to 'src/dle.c')
-rw-r--r-- | src/dle.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/dle.c b/src/dle.c new file mode 100644 index 0000000..51b3c75 --- /dev/null +++ b/src/dle.c @@ -0,0 +1,47 @@ +#include "dle.h" + +/* Those nifty DLE-sequences */ +#define DLE 0x10 +#define ETX 0x03 +#define DC4 0x14 + +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 ns, nd; + assert(s && ls && d && ld && *ld && dle_flag); + + for (ns = nd = 0; ns < ls && nd < *ld; ns++) { + + if (*dle_flag) { + if (s[ns] == DLE) + d[nd++] = DLE; + else { + if (dle_func) + dle_func(s[ns], user); + } + + *dle_flag = 0; + } else { + if (s[ns] == DLE) + *dle_flag = 1; + else + d[nd++] = s[ns]; + } + } + + *ld = nd; + return ns; +} + +size_t dle_encode(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) + d[nd++] = DLE; + + d[nd++] = s[ns]; + } + + *ld = nd; + return ns; +} |