Well, it's not exactly safe, but I bet it'll do for now
This commit is contained in:
parent
be35812bb4
commit
45df26382f
1 changed files with 56 additions and 0 deletions
56
src/kiss.c
Normal file
56
src/kiss.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include <patty/kiss.h>
|
||||||
|
|
||||||
|
enum kiss_flags {
|
||||||
|
KISS_NONE = 0x00,
|
||||||
|
KISS_FRAME = 0x01,
|
||||||
|
KISS_ESCAPE = 0x02
|
||||||
|
};
|
||||||
|
|
||||||
|
int patty_kiss_read(int fd, void *buf, size_t *len, int *channel) {
|
||||||
|
int flags = KISS_NONE;
|
||||||
|
size_t i, b = 0;
|
||||||
|
|
||||||
|
*channel = 0;
|
||||||
|
|
||||||
|
for (i=0; i<PATTY_KISS_BUFLEN; i++) {
|
||||||
|
unsigned char c = ((char *)buf)[i];
|
||||||
|
|
||||||
|
if (flags & KISS_FRAME == 0) {
|
||||||
|
if (c == PATTY_KISS_FEND) {
|
||||||
|
flags |= KISS_FRAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & KISS_ESCAPE) {
|
||||||
|
if (c == PATTY_KISS_TFEND) {
|
||||||
|
((char *)buf)[b++] = PATTY_KISS_FEND;
|
||||||
|
} else if (c == PATTY_KISS_TFESC) {
|
||||||
|
((char *)buf)[b++] = PATTY_KISS_FESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags &= ~KISS_ESCAPE;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & KISS_FRAME) {
|
||||||
|
if (c == PATTY_KISS_FESC) {
|
||||||
|
flags |= KISS_ESCAPE;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
} else if (c == PATTY_KISS_FEND) {
|
||||||
|
flags &= ~KISS_FRAME;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
((char *)buf)[b++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = b + 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue