1a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar/*===- count.c - The 'count' testing tool ---------------------------------===*\
2a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar *
3a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar *                     The LLVM Compiler Infrastructure
4a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar *
5a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar * This file is distributed under the University of Illinois Open Source
6a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar * License. See LICENSE.TXT for details.
7a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar *
8a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar\*===----------------------------------------------------------------------===*/
9a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
10a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar#include <stdlib.h>
11a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar#include <stdio.h>
12a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
13a8b807194946fe34f364a39721205c00c1906482Daniel Dunbarint main(int argc, char **argv) {
14a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  unsigned Count, NumLines, NumRead;
15a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  char Buffer[4096], *End;
16a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
17a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  if (argc != 2) {
18a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    fprintf(stderr, "usage: %s <expected line count>\n", argv[0]);
19a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    return 2;
20a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  }
21a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
22a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  Count = strtol(argv[1], &End, 10);
23a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  if (*End != '\0' && End != argv[1]) {
24a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    fprintf(stderr, "%s: invalid count argument '%s'\n", argv[0], argv[1]);
25a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    return 2;
26a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  }
27a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
28a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  NumLines = 0;
2957900ec3ca13c107197a1f8ea6abd934a8e25f0fDan Gohman  do {
30a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    unsigned i;
31a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
3257900ec3ca13c107197a1f8ea6abd934a8e25f0fDan Gohman    NumRead = fread(Buffer, 1, sizeof(Buffer), stdin);
3357900ec3ca13c107197a1f8ea6abd934a8e25f0fDan Gohman
34a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    for (i = 0; i != NumRead; ++i)
35a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar      if (Buffer[i] == '\n')
36a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar        ++NumLines;
3757900ec3ca13c107197a1f8ea6abd934a8e25f0fDan Gohman  } while (NumRead == sizeof(Buffer));
38a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
39a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  if (!feof(stdin)) {
40a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    fprintf(stderr, "%s: error reading stdin\n", argv[0]);
41a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    return 3;
42a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  }
43a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
44a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  if (Count != NumLines) {
45a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    fprintf(stderr, "Expected %d lines, got %d.\n", Count, NumLines);
46a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar    return 1;
47a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  }
48a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar
49a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar  return 0;
50a8b807194946fe34f364a39721205c00c1906482Daniel Dunbar}
51