summaryrefslogtreecommitdiffstats
path: root/src/dle.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2003-12-17 22:11:57 +0000
committerLennart Poettering <lennart@poettering.net>2003-12-17 22:11:57 +0000
commitc79399f437e9268203768ab65b32c20f29093b27 (patch)
tree4fdebb22251b0a80faf8011436829a3521e7aad9 /src/dle.c
parentd918d9b2c4fc9eaa58bcd9a266a6a0330c88391c (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.c47
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;
+}