39 HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
41 if (!GetConsoleMode(hStdin, &mode)) {
46 if (GetNumberOfConsoleInputEvents(hStdin, &events) && events > 1) {
56 FD_SET(STDIN_FILENO, &fds);
57 select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);
58 return FD_ISSET(STDIN_FILENO, &fds);
62int main(
int argc,
char *argv[]) {
63 if (argc > 1 && (strcmp(argv[1],
"--help") == 0 || strcmp(argv[1],
"-h") == 0)) {
73 const char *cloc_cmd =
"cloc";
74 size_t cloc_len = strlen(cloc_cmd);
77 fprintf(stderr,
"Error: Command too long\n");
81 memcpy(cmd, cloc_cmd, cloc_len);
84 for (
int i = 1; i < argc; i++) {
85 size_t arg_len = strlen(argv[i]);
86 int needs_quotes = (strchr(argv[i],
' ') != NULL) ? 1 : 0;
87 size_t required = pos + 1 + (needs_quotes ? 2 : 0) + arg_len;
90 fprintf(stderr,
"Error: Command too long\n");
98 memcpy(cmd + pos, argv[i], arg_len);
106 input = popen(cmd,
"r");
108 fprintf(stderr,
"Error: Failed to run cloc command\n");
113 fprintf(stderr,
"Error: No input provided\n\n");
124 while (fgets(line,
sizeof(line), input)) {
125 size_t line_len = strlen(line);
126 if (strstr(line,
"----") || line_len < 5)
continue;
127 if (strstr(line,
"Language") || strstr(line,
"files") || strstr(line,
"SUM"))
continue;
130 int files, blank, comment, code;
132 int matched = sscanf(line,
"%63[^0-9] %d %d %d %d", langName, &files, &blank, &comment, &code);
134 size_t name_len = strlen(langName);
135 for (
size_t i = name_len; i > 0 && (langName[i - 1] ==
' ' || langName[i - 1] ==
'\t'); i--) {
136 langName[i - 1] =
'\0';
141 size_t copy_len = name_len < 63 ? name_len : 63;
142 memcpy(langs[langCount].name, langName, copy_len);
143 langs[langCount].
name[copy_len] =
'\0';
144 langs[langCount].
code = code;
147 if ((
int)name_len > maxNameLen) {
148 maxNameLen = (int)name_len;
160 printf(
"Total code lines: %d\n", totalCode);
161 printf(
"Language percentages:\n");
162 for (
int i = 0; i < langCount; i++) {
163 double percent = (totalCode > 0) ? (langs[i].code * 100.0 / totalCode) : 0.0;
164 printf(
"%-*s : %6.2f%% (%d lines)\n", maxNameLen, langs[i].name, percent, langs[i].code);