| 535 | } |
| 536 | |
| 537 | void fxReadSerialBuffer(txSerialTool self, char* buffer, int size) |
| 538 | { |
| 539 | char* src = buffer; |
| 540 | char* srcLimit = src + size; |
| 541 | int offset = self->index; |
| 542 | char* dst = self->buffer + offset; |
| 543 | char* dstLimit = self->buffer + mxBufferSize; |
| 544 | |
| 545 | if (self->trace) |
| 546 | fprintf(stderr, "%.*s", size, buffer); |
| 547 | |
| 548 | while (src < srcLimit) { |
| 549 | if (dst == dstLimit) { |
| 550 | txSerialMachine machine = self->currentMachine; |
| 551 | if (machine && !machine->suppress) |
| 552 | fxWriteNetwork(machine, self->buffer, mxBufferSize - mxTagSize); |
| 553 | memmove(self->buffer, dstLimit - mxTagSize, mxTagSize); |
| 554 | dst = self->buffer + mxTagSize; |
| 555 | offset = mxTagSize; |
| 556 | } |
| 557 | *dst++ = *src++; |
| 558 | offset++; |
| 559 | if (gBinaryState) { |
| 560 | if (1 == gBinaryState) { |
| 561 | gBinaryLength = dst[-1] << 8; |
| 562 | gBinaryState = 2; |
| 563 | } |
| 564 | else if (2 == gBinaryState) { |
| 565 | gBinaryLength |= dst[-1]; |
| 566 | gBinaryState = 3; |
| 567 | } |
| 568 | if ((3 == gBinaryState) && ((2 + gBinaryLength) == (dst - self->buffer))) { |
| 569 | fxCommandReceived(self, self->buffer + 2, gBinaryLength); |
| 570 | |
| 571 | dst = self->buffer; |
| 572 | offset = 0; |
| 573 | gBinaryState = 0; |
| 574 | } |
| 575 | } |
| 576 | else |
| 577 | if ((offset >= 2) && (dst[-2] == 13) && (dst[-1] == 10)) { |
| 578 | uint8_t flag; |
| 579 | uint32_t value; |
| 580 | if ((offset >= mxTagSize) && fxMatchProcessingInstruction(dst - mxTagSize, &flag, &value)) { |
| 581 | if (flag) { |
| 582 | self->currentMachine = fxOpenNetwork(self, value); |
| 583 | gBinaryState = 2 == flag; |
| 584 | |
| 585 | if (gRestarting) |
| 586 | fxRestart(self); |
| 587 | } |
| 588 | else { |
| 589 | fxCloseNetwork(self, value); |
| 590 | gRestarting = 0; |
| 591 | } |
| 592 | } |
| 593 | else if ((offset >= 10) && (dst[-10] == '<') && (dst[-9] == '/') && (dst[-8] == 'x') && (dst[-7] == 's') && (dst[-6] == 'b') && (dst[-5] == 'u') && (dst[-4] == 'g') && (dst[-3] == '>')) { |
| 594 | txSerialMachine machine = self->currentMachine; |
no test coverage detected