50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
// SPDX-License-Identifier: MIT
|
|
// SPDX-FileCopyrightText: 2007 Jan Engelhardt
|
|
#include <algorithm>
|
|
#include <cerrno>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <fstream>
|
|
#include <memory>
|
|
#include <libHX/string.h>
|
|
|
|
struct del {
|
|
void operator()(FILE *x) const { fclose(x); }
|
|
};
|
|
|
|
static void do_file(const char *filename)
|
|
{
|
|
std::ifstream strm;
|
|
strm.open(filename);
|
|
if (!strm.is_open()) {
|
|
fprintf(stderr, "Cannot read %s: %s\n", filename, strerror(errno));
|
|
return;
|
|
}
|
|
printf(" # () [] {}\n");
|
|
std::string line;
|
|
ssize_t p1 = 0, p2 = 0, p3 = 0;
|
|
size_t lnum = 0;
|
|
do {
|
|
getline(strm, line);
|
|
HX_chomp(line.data());
|
|
if (strm.rdstate() & (std::ios_base::eofbit |
|
|
std::ios_base::failbit | std::ios_base::badbit))
|
|
break;
|
|
p1 += std::count(&line[0], &line[line.size()], '(');
|
|
p1 -= std::count(&line[0], &line[line.size()], ')');
|
|
p2 += std::count(&line[0], &line[line.size()], '[');
|
|
p2 -= std::count(&line[0], &line[line.size()], ']');
|
|
p3 += std::count(&line[0], &line[line.size()], '{');
|
|
p3 -= std::count(&line[0], &line[line.size()], '}');
|
|
printf("%3zu %2zd %2zd %2zd %s\n", ++lnum, p1, p2, p3, line.c_str());
|
|
} while (true);
|
|
printf("\n");
|
|
}
|
|
|
|
int main(int argc, const char **argv)
|
|
{
|
|
while (*++argv != nullptr)
|
|
do_file(*argv);
|
|
return EXIT_SUCCESS;
|
|
}
|