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