57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
|
#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;
|
||
|
}
|