static int readPacket (unsigned char *packet, int size) { int offset = 0; int length = 0; while (1) { unsigned char byte; if (!gioReadByte(gioEndpoint, &byte, (offset > 0))) { if (offset > 0) logPartialPacket(packet, offset); return 0; } if (offset < size) { if (offset == 0) { switch (byte) { case BN_RSP_DISPLAY: length = 1; break; case BN_RSP_CHARACTER: case BN_RSP_SPACE: case BN_RSP_BACKSPACE: case BN_RSP_ENTER: case BN_RSP_THUMB: case BN_RSP_ROUTE: length = 2; break; case BN_RSP_DESCRIBE: length = 3; break; default: logUnknownPacket(byte); offset = 0; length = 0; continue; } } packet[offset] = byte; } else { if (offset == size) logTruncatedPacket(packet, offset); logDiscardedByte(byte); } if (++offset == length) { if (offset > size) { offset = 0; length = 0; continue; } logInputPacket(packet, offset); return length; } } }
static int readSerialPacket (BrailleDisplay *brl, unsigned char *packet, int size) { int started = 0; int escape = 0; int offset = 0; int length = 0; while (1) { unsigned char byte; if (!gioReadByte(brl->gioEndpoint, &byte, (started || escape))) { if (started) logPartialPacket(packet, offset); return 0; } if (byte == ESC) { if ((escape = !escape)) continue; } else if (escape) { escape = 0; if (offset > 0) { logShortPacket(packet, offset); offset = 0; length = 0; } else { started = 1; } } if (!started) { logIgnoredByte(byte); continue; } if (offset < size) { if (offset == 0) { switch (byte) { case 0X43: case 0X47: length = 2; break; case 0X4C: length = 3; break; case 0X46: case 0X48: length = 5; break; case 0X4B: length = 9; break; case 0X53: length = 10; break; default: logUnknownPacket(byte); started = 0; continue; } } packet[offset] = byte; } else { if (offset == size) logTruncatedPacket(packet, offset); logDiscardedByte(byte); } if (++offset == length) { if (offset > size) { offset = 0; length = 0; started = 0; continue; } logInputPacket(packet, offset); return length; } } }