patty/src/kiss.c

57 lines
1.1 KiB
C
Raw Normal View History

#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;
}