Skip to content

Commit 3439c70

Browse files
Use longer example buffer to avoid complicated buffer management in reads-stdin.c.
Co-authored-by: Robert Schumacher <[email protected]>
1 parent 7c40ea3 commit 3439c70

File tree

1 file changed

+8
-38
lines changed

1 file changed

+8
-38
lines changed

src/reads-stdin.c

Lines changed: 8 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,65 +4,35 @@
44
// This program reads stdin and asserts that it is the expected value repeated
55
// until stdin ends
66

7-
// Intentionally a prime length to make hitting buffering edge cases more likely
8-
const char expected_repeat[] = {'e', 'x', 'a', 'm', 'p', 'l', 'e'};
9-
107
int main(int argc, char** argv)
118
{
12-
size_t consumed_prefix = 0;
139
char buffer[20];
10+
// The repeated string 'example' is intentionally a prime length to make hitting buffering edge
11+
// cases more likely
12+
const char expected[] = "exampleexampleexampleexamp";
13+
size_t offset = 0; // always between 0 and 6
1414
for (;;)
1515
{
1616
size_t read_amount = fread(buffer, 1, sizeof(buffer), stdin);
1717
if (argc > 1)
1818
{
1919
puts(argv[1]);
20+
fflush(stdout);
2021
}
21-
2222
if (read_amount == 0)
2323
{
2424
if (feof(stdin))
2525
{
2626
puts("success");
2727
return 0;
2828
}
29-
3029
return 1;
3130
}
3231

33-
size_t prefix_check = read_amount;
34-
if (prefix_check <= (sizeof(expected_repeat) - consumed_prefix))
35-
{
36-
// check a partial suffix (this read didn't include a complete suffix)
37-
if (memcmp(buffer, expected_repeat + consumed_prefix, prefix_check) != 0)
38-
{
39-
return 2;
40-
}
41-
42-
consumed_prefix += prefix_check;
43-
continue;
44-
}
45-
46-
// check a whole suffix to realign to expected_repeat blocks
47-
prefix_check = sizeof(expected_repeat) - consumed_prefix;
48-
if (memcmp(buffer, expected_repeat + consumed_prefix, prefix_check) != 0)
49-
{
50-
return 3;
51-
}
52-
53-
size_t checked = prefix_check;
54-
for (; read_amount - checked >= sizeof(expected_repeat); checked += sizeof(expected_repeat))
55-
{
56-
if (memcmp(buffer + checked, expected_repeat, sizeof(expected_repeat)) != 0)
57-
{
58-
return 4;
59-
}
60-
}
61-
62-
consumed_prefix = read_amount - checked;
63-
if (memcmp(buffer + checked, expected_repeat, consumed_prefix) != 0)
32+
if (memcmp(buffer, expected + offset, read_amount) != 0)
6433
{
65-
return 5;
34+
return 2;
6635
}
36+
offset = (offset + read_amount) % 7;
6737
}
6838
}

0 commit comments

Comments
 (0)