| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /* | |||
| 2 | * @file test_can_serial.cpp | |||
| 3 | * | |||
| 4 | * This is more like ISO-TP test really? | |||
| 5 | * | |||
| 6 | * Created on: Nov 26, 2020 | |||
| 7 | * @author andreika <prometheus.pcb@gmail.com> | |||
| 8 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
| 9 | */ | |||
| 10 | ||||
| 11 | #include "pch.h" | |||
| 12 | #include "engine_test_helper.h" | |||
| 13 | #include "serial_can.h" | |||
| 14 | ||||
| 15 | #include <array> | |||
| 16 | #include <list> | |||
| 17 | #include <string> | |||
| 18 | ||||
| 19 | using namespace std::string_literals; | |||
| 20 | ||||
| 21 | class TestCanTransport : public ICanTransport { | |||
| 22 | public: | |||
| 23 | 52 | virtual can_msg_t transmit(const CanTxMessage *ctfp, can_sysinterval_t timeout) override { | ||
| 24 | 52 | const CANTxFrame * frame = ctfp->getFrame(); | ||
| 25 | // invoke copy constructor to clone frame | |||
| 26 | 52 | CANTxFrame localCopy = *frame; | ||
| 27 | 52 | localCopy.DLC = 8; | ||
| 28 |
1/1✓ Branch 1 taken 52 times.
|
52 | ctfList.emplace_back(localCopy); | |
| 29 | 52 | return CAN_MSG_OK; | ||
| 30 | } | |||
| 31 | ||||
| 32 | 44 | virtual can_msg_t receive(CANRxFrame *crfp, can_sysinterval_t timeout) override { | ||
| 33 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 44 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 44 times.
|
44 | if (crfList.empty()) |
| 34 | ✗ | return CAN_MSG_TIMEOUT; | ||
| 35 | 44 | *crfp = *crfList.begin(); | ||
| 36 | 44 | crfList.pop_front(); | ||
| 37 | 44 | return CAN_MSG_OK; | ||
| 38 | } | |||
| 39 | ||||
| 40 | template<typename T> | |||
| 41 | 44 | void checkFrame(const T & frame, const std::string & bytes, int frameIndex) { | ||
| 42 |
2/6✓ Branch 5 taken 44 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 44 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
|
44 | EXPECT_EQ(bytes.size(), frame.DLC); | |
| 43 |
2/2✓ Branch 2 taken 352 times.
✓ Branch 3 taken 44 times.
|
2/2✓ Decision 'true' taken 352 times.
✓ Decision 'false' taken 44 times.
|
396 | for (size_t i = 0; i < bytes.size(); i++) { |
| 44 |
2/10✓ Branch 3 taken 352 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 352 times.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
|
352 | EXPECT_EQ(bytes[i], frame.data8[i]) << "Frame byte #" << i << " differs! Frame " << frameIndex; | |
| 45 | } | |||
| 46 | 44 | } | ||
| 47 | ||||
| 48 | public: | |||
| 49 | std::list<CANTxFrame> ctfList; | |||
| 50 | std::list<CANRxFrame> crfList; | |||
| 51 | }; | |||
| 52 | ||||
| 53 | class TestCanStreamerState : public CanStreamerState { | |||
| 54 | public: | |||
| 55 | 13 | TestCanStreamerState() : CanStreamerState(&streamer, 0, 10) {} | ||
| 56 | ||||
| 57 | 13 | void test(const std::vector<std::string> & dataList, const std::vector<std::string> & frames, int fifoLeftoverSize, const std::vector<size_t> & receiveChunks) { | ||
| 58 |
1/1✓ Branch 2 taken 13 times.
|
13 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 59 | ||||
| 60 | 13 | size_t totalSize = 0; | ||
| 61 | 13 | std::string totalData; | ||
| 62 |
3/3✓ Branch 7 taken 23 times.
✓ Branch 11 taken 23 times.
✓ Branch 12 taken 13 times.
|
0/1? Decision couldn't be analyzed.
|
36 | for (auto data : dataList) { |
| 63 | 23 | size_t np = data.size(); | ||
| 64 | ||||
| 65 | 23 | totalSize += np; | ||
| 66 |
1/1✓ Branch 1 taken 23 times.
|
23 | totalData += data; | |
| 67 | ||||
| 68 |
1/1✓ Branch 2 taken 23 times.
|
23 | streamAddToTxTimeout(&np, (uint8_t *)data.c_str(), 0); | |
| 69 | 23 | } | ||
| 70 | ||||
| 71 | // check the FIFO buf size | |||
| 72 |
3/7✓ Branch 3 taken 13 times.
✓ Branch 6 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
|
13 | EXPECT_EQ(fifoLeftoverSize, txFifoBuf.getCount()); | |
| 73 | ||||
| 74 | // send the rest | |||
| 75 |
1/1✓ Branch 1 taken 13 times.
|
13 | streamFlushTx(0); | |
| 76 | ||||
| 77 | // check if correct the TX frames were sent | |||
| 78 |
2/6✓ Branch 6 taken 13 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 13 times.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
13 | EXPECT_EQ(frames.size(), streamer.ctfList.size()); | |
| 79 | ||||
| 80 | 13 | auto it1 = streamer.ctfList.begin(); | ||
| 81 | 13 | int frameIndex = 0; | ||
| 82 | 13 | auto it2 = frames.begin(); | ||
| 83 |
8/10✓ Branch 5 taken 44 times.
✓ Branch 6 taken 13 times.
✓ Branch 10 taken 44 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 44 times.
✓ Branch 13 taken 13 times.
✓ Branch 15 taken 57 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 44 times.
✓ Branch 19 taken 13 times.
|
0/1? Decision couldn't be analyzed.
|
57 | for (; it1 != streamer.ctfList.end() && it2 != frames.end(); it1++, it2++) { |
| 84 |
1/1✓ Branch 3 taken 44 times.
|
44 | streamer.checkFrame(*it1, *it2, frameIndex++); | |
| 85 | } | |||
| 86 | ||||
| 87 | // copy transmitted data back into the receive buffer | |||
| 88 |
2/2✓ Branch 7 taken 44 times.
✓ Branch 8 taken 13 times.
|
2/2✓ Decision 'true' taken 44 times.
✓ Decision 'false' taken 13 times.
|
57 | for (auto f : streamer.ctfList) { |
| 89 | 44 | CANRxFrame rf; | ||
| 90 | 44 | rf.DLC = f.DLC; | ||
| 91 | 44 | rf.RTR = f.RTR; | ||
| 92 | 44 | rf.IDE = f.IDE; | ||
| 93 | 44 | rf.EID = f.EID; | ||
| 94 | 44 | rf.data64[0] = f.data64[0]; | ||
| 95 |
1/1✓ Branch 1 taken 44 times.
|
44 | streamer.crfList.push_back(rf); | |
| 96 | } | |||
| 97 | ||||
| 98 | 13 | size_t totalReceivedSize = 0; | ||
| 99 | 26 | std::string totalReceivedData; | ||
| 100 |
2/2✓ Branch 8 taken 23 times.
✓ Branch 9 taken 13 times.
|
2/2✓ Decision 'true' taken 23 times.
✓ Decision 'false' taken 13 times.
|
36 | for (size_t chunkSize : receiveChunks) { |
| 101 | 23 | size_t nr = chunkSize; | ||
| 102 | 23 | uint8_t rxbuf[1256]; | ||
| 103 |
1/1✓ Branch 1 taken 23 times.
|
23 | streamReceiveTimeout(&nr, rxbuf, 0); | |
| 104 |
2/6✓ Branch 2 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 23 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
23 | EXPECT_EQ(nr, chunkSize); | |
| 105 | 23 | totalReceivedSize += nr; | ||
| 106 |
2/2✓ Branch 3 taken 23 times.
✓ Branch 6 taken 23 times.
|
69 | totalReceivedData += std::string((const char *)rxbuf, nr); | |
| 107 | } | |||
| 108 | // we should receive the same amount of bytes that we've sent | |||
| 109 |
2/6✓ Branch 2 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
13 | EXPECT_EQ(totalSize, totalReceivedSize); | |
| 110 | // check the data | |||
| 111 |
2/2✓ Branch 1 taken 258 times.
✓ Branch 2 taken 13 times.
|
2/2✓ Decision 'true' taken 258 times.
✓ Decision 'false' taken 13 times.
|
271 | for (size_t i = 0; i < totalSize; i++) { |
| 112 |
2/9✓ Branch 4 taken 258 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 258 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
|
258 | EXPECT_EQ(totalData[i], totalReceivedData[i]) << "Rcv. byte #" << i << " differs!"; | |
| 113 | } | |||
| 114 | // check the FIFO buf size | |||
| 115 |
3/7✓ Branch 3 taken 13 times.
✓ Branch 7 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
13 | EXPECT_EQ(0, rxFifoBuf.getCount()); | |
| 116 | ||||
| 117 | // clear shared buffer | |||
| 118 |
1/1✓ Branch 1 taken 13 times.
|
13 | txCanBuffer.clear(); | |
| 119 |
2/7✓ Branch 3 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
13 | EXPECT_FALSE(txCanBuffer.getCount()); | |
| 120 | 26 | } | ||
| 121 | ||||
| 122 | protected: | |||
| 123 | TestCanTransport streamer; | |||
| 124 | }; | |||
| 125 | ||||
| 126 | 4 | TEST(testCanSerial, test1Frame) { | ||
| 127 | ||||
| 128 | { | |||
| 129 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 130 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
8 | state.test({ "1" }, { "\x01"s "1\0\0\0\0\0\0"s }, 1, { 1 }); // 1 byte -> 1 frame, 1 byte in FIFO | |
| 131 | 1 | } | ||
| 132 | { | |||
| 133 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 134 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
8 | state.test({ "0123456" }, { "\x07"s "0123456"s }, 7, { 7 }); // 7 bytes -> 1 8-byte frame | |
| 135 | 1 | } | ||
| 136 | { | |||
| 137 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 138 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
8 | state.test({ "0123456" }, { "\x07"s "0123456"s }, 7, { 1, 1, 1, 1, 1, 1, 1 }); // 7 bytes -> 1 8-byte frame, split receive test | |
| 139 | 1 | } | ||
| 140 | { | |||
| 141 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 142 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
8 | state.test({ "0123456" }, { "\x07"s "0123456"s }, 7, { 3, 4 }); // 7 bytes -> 1 8-byte frame, split receive test | |
| 143 | 1 | } | ||
| 144 | { | |||
| 145 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 146 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
8 | state.test({ "0", "1", "2", "3", "4", "5", "6" }, { "\x07"s "0123456"s }, 7, { 7 }); // 7 bytes separately -> 1 8-byte frame | |
| 147 | 1 | } | ||
| 148 | 6 | } | ||
| 149 | ||||
| 150 | 4 | TEST(testCanSerial, test2Frames) { | ||
| 151 | { | |||
| 152 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 153 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
9 | state.test({ "01234567" }, { "\x10"s "\x08"s "012345"s, "\x21"s "67\0\0\0\0\0"s }, 8, { 8 }); // 8 bytes -> 2 8-byte frames, 8 bytes in FIFO | |
| 154 | 1 | } | ||
| 155 | { | |||
| 156 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 157 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
9 | state.test({ "0123456789A" }, { "\x10"s "\x0B"s "012345"s, "\x21"s "6789A\0\0"s }, 11, { 2, 5, 4 }); // 11 bytes -> 2 8-byte frames | |
| 158 | 1 | } | ||
| 159 | { | |||
| 160 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 161 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 3 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
10 | state.test({ "0123456ABCDEFG" }, { "\x10"s "\x0E"s "012345"s, "\x21"s "6ABCDEF"s, "\x22"s "G\0\0\0\0\0\0"s }, 14, { 14 }); // 14 bytes -> 3 8-byte frames, empty FIFO | |
| 162 | 1 | } | ||
| 163 | 4 | } | ||
| 164 | ||||
| 165 | 4 | TEST(testCanSerial, testIrregularSplits) { | ||
| 166 | { | |||
| 167 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 168 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 3 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
10 | state.test({ "012", "3456ABCDEFG" }, { "\x10"s "\x0E"s "012345"s, "\x21"s "6ABCDEF"s, "\x22"s "G\0\0\0\0\0\0"s }, 14, { 7, 7 }); // 14 bytes -> 2 8-byte frames, empty FIFO | |
| 169 | 1 | } | ||
| 170 | { | |||
| 171 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 172 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 3 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
10 | state.test({ "0123456ABC", "DEFG" }, { "\x10"s "\x0E"s "012345"s, "\x21"s "6ABCDEF"s, "\x22"s "G\0\0\0\0\0\0"s }, 14, { 14 }); // 14 bytes -> 2 8-byte frames, empty FIFO | |
| 173 | 1 | } | ||
| 174 | 3 | } | ||
| 175 | ||||
| 176 | 4 | TEST(testCanSerial, testLongMessage) { | ||
| 177 | { | |||
| 178 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 179 |
6/8✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 26 taken 4 times.
✓ Branch 27 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
|
11 | state.test({ "abcdefghijklmnopqrstuvwxyz" }, { | |
| 180 | "\x10"s "\x1A"s "abcdef"s, | |||
| 181 | "\x21"s "ghijklm"s, | |||
| 182 | "\x22"s "nopqrst"s, | |||
| 183 | "\x23"s "uvwxyz\0"s }, 26, { 26 }); // 26 bytes -> 4 8-byte frames, 5 bytes left in FIFO | |||
| 184 | 1 | } | ||
| 185 | 2 | } | ||
| 186 | ||||
| 187 | 4 | TEST(testCanSerial, test64_7Message) { | ||
| 188 | 1 | std::array<char, 71> buffer; | ||
| 189 | ||||
| 190 |
1/1✓ Branch 2 taken 1 time.
|
3 | std::fill(std::begin(buffer), std::end(buffer), 0); | |
| 191 | ||||
| 192 | 1 | buffer[0] = 1; | ||
| 193 | ||||
| 194 | 1 | buffer[64 + 7 - 1] = 4; | ||
| 195 |
1/1✓ Branch 3 taken 1 time.
|
4 | std::string str(std::begin(buffer),std::end(buffer)); | |
| 196 | ||||
| 197 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 198 |
8/12✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 21 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 28 taken 11 times.
✓ Branch 29 taken 1 time.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
|
19 | state.test({ str }, { | |
| 199 | /* 0 */ | |||
| 200 | "\x10"s "\x47"s "\x01\0\0\0\0\0"s, | |||
| 201 | "\x21"s "\0\0\0\0\0\0\0"s, | |||
| 202 | "\x22"s "\0\0\0\0\0\0\0"s, | |||
| 203 | "\x23"s "\0\0\0\0\0\0\0"s, | |||
| 204 | "\x24"s "\0\0\0\0\0\0\0"s, | |||
| 205 | "\x25"s "\0\0\0\0\0\0\0"s, | |||
| 206 | "\x26"s "\0\0\0\0\0\0\0"s, | |||
| 207 | "\x27"s "\0\0\0\0\0\0\0"s, | |||
| 208 | "\x28"s "\0\0\0\0\0\0\0"s, | |||
| 209 | "\x29"s "\0\0\0\0\0\0\0"s, | |||
| 210 | ||||
| 211 | /* 10 */ | |||
| 212 | "\x2A"s "\0\4\0\0\0\0\0"s, | |||
| 213 | ||||
| 214 | }, 71, { 64 + 7 }); | |||
| 215 | 4 | } | ||
| 216 | ||||
| 217 | 4 | TEST(testCanSerial, test3_64_4Message) { | ||
| 218 | 1 | std::array<char, 64> buffer64; | ||
| 219 | ||||
| 220 |
1/1✓ Branch 2 taken 1 time.
|
3 | std::fill(std::begin(buffer64), std::end(buffer64), 0); | |
| 221 | ||||
| 222 | 1 | buffer64[0] = 1; | ||
| 223 | ||||
| 224 | 1 | buffer64[64 - 1] = 4; | ||
| 225 |
1/1✓ Branch 3 taken 1 time.
|
4 | std::string str(std::begin(buffer64),std::end(buffer64)); | |
| 226 | ||||
| 227 |
1/1✓ Branch 2 taken 1 time.
|
1 | TestCanStreamerState state; | |
| 228 |
8/12✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 21 taken 3 times.
✓ Branch 22 taken 1 time.
✓ Branch 28 taken 11 times.
✓ Branch 29 taken 1 time.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
|
21 | state.test({ "123"s, str, "abcd"s }, { | |
| 229 | /* 0 */ | |||
| 230 | "\x10"s "\x47"s "123\1\0\0"s, | |||
| 231 | "\x21"s "\0\0\0\0\0\0\0"s, | |||
| 232 | "\x22"s "\0\0\0\0\0\0\0"s, | |||
| 233 | "\x23"s "\0\0\0\0\0\0\0"s, | |||
| 234 | "\x24"s "\0\0\0\0\0\0\0"s, | |||
| 235 | "\x25"s "\0\0\0\0\0\0\0"s, | |||
| 236 | "\x26"s "\0\0\0\0\0\0\0"s, | |||
| 237 | "\x27"s "\0\0\0\0\0\0\0"s, | |||
| 238 | "\x28"s "\0\0\0\0\0\0\0"s, | |||
| 239 | "\x29"s "\0\0\0\0\4ab"s, | |||
| 240 | ||||
| 241 | /* 10 */ | |||
| 242 | "\x2A"s "cd\0\0\0\0\0"s, | |||
| 243 | ||||
| 244 | }, 71, { 64 + 7 }); | |||
| 245 | 4 | } | ||
| 246 | ||||
| 247 |