universe@10: /* universe@10: * cline.c universe@10: * universe@10: * Created on: 23.05.2011 universe@10: * Author: beckermi universe@10: */ universe@10: universe@3: #include "cline.h" universe@10: #include "scanner.h" universe@10: #include "settings.h" universe@12: #include "arguments.h" universe@0: universe@12: void printHelpText() { universe@0: const char* helpText = universe@1: "\nUsage:" universe@12: "\n cline [-hrm][-s suffix][]" universe@12: "\n cline [-hrm][-S suffix][]" universe@0: "\n\nCounts the line terminator characters (\\n) within all" universe@0: " files in the specified\ndirectory." universe@0: "\n\nOptions:" universe@0: "\n -h, --help - this help text" universe@1: "\n -m - print information about matching files only" universe@1: "\n -s - only count files with these suffixes (separated" universe@0: "\n by commas)" universe@1: "\n -S - count any file except those with these suffixes" universe@0: "\n (separated by commas)" universe@1: "\n -r, -R - includes subdirectories" universe@14: "\n -v, --version - print out version information" universe@0: "\n\n" universe@1: "The default call without any options is:" universe@12: "\n cline ./\n" universe@7: "So each file in the working directory is counted. If you want to count C" universe@7: "\nsource code in your working directory and its subdirectories, type:" universe@12: "\n cline -rs .c\n"; universe@1: universe@12: printf(helpText); universe@1: } universe@1: universe@14: int exit_with_version(settings_t* settings) { universe@14: printf("cline - Version: %s", VERSION); universe@14: destroy_settings_t(settings); universe@14: return 0; universe@14: } universe@14: universe@12: int exit_with_help(settings_t* settings, int code) { universe@12: printHelpText(); universe@8: destroy_settings_t(settings); universe@8: return code; universe@8: } universe@8: universe@1: int main(int argc, char** argv) { universe@0: universe@3: // Settings universe@3: settings_t *settings = new_settings_t(); universe@5: if (settings == NULL) { universe@5: fprintf(stderr, "Memory allocation failed.\n"); universe@5: return 1; universe@5: } universe@3: universe@0: // Get arguments universe@7: char* directory = "./"; universe@7: char* suffix = " "; universe@8: int checked = 0; universe@0: universe@1: for (int t = 1 ; t < argc ; t++) { universe@1: universe@14: int argflags = checkArgument(argv[t], "hsSrRmv"); universe@1: universe@14: // s, S universe@14: if ((argflags & 6) > 0) { universe@8: if (registerArgument(&checked, 6)) { universe@12: return exit_with_help(settings, 1); universe@0: } universe@14: settings->includeSuffixes = (argflags & 2) > 0; universe@1: t++; universe@1: if (t >= argc) { universe@12: return exit_with_help(settings, 1); universe@1: } universe@1: suffix = argv[t]; universe@0: } universe@1: // h universe@1: if ((argflags & 1) > 0 || strcmp(argv[t], "--help") == 0) { universe@14: return exit_with_help(settings, 0); universe@0: } universe@1: // r, R universe@1: if ((argflags & 24) > 0) { universe@8: if (registerArgument(&checked, 24)) { universe@12: return exit_with_help(settings, 1); universe@0: } universe@3: settings->recursive = true; universe@0: } universe@8: // m universe@1: if ((argflags & 32) > 0) { universe@8: if (registerArgument(&checked, 32)) { universe@12: return exit_with_help(settings, 1); universe@0: } universe@3: settings->matchesOnly = true; universe@0: } universe@14: // v universe@14: if ((argflags & 64) > 0 || strcmp(argv[t], "--version") == 0) { universe@14: return exit_with_version(settings); universe@14: } universe@6: // Path universe@1: if (argflags == 0) { universe@8: if (registerArgument(&checked, 1024)) { universe@12: return exit_with_help(settings, 1); universe@0: } universe@0: directory = argv[t]; universe@0: } universe@0: } universe@0: universe@0: // Find tokens universe@6: char* finder = strtok(suffix, ","); universe@1: while (finder != NULL) { universe@6: add_suffix(settings->suffixList, finder); universe@0: finder = strtok(NULL, ","); universe@0: } universe@0: universe@0: // Open directory universe@0: DIR *dir = opendir(directory); universe@1: if (dir == NULL) { universe@0: perror("Operation failed"); universe@4: destroy_settings_t(settings); universe@0: return 1; universe@0: } universe@0: universe@0: // Scan directory universe@3: int lines = scanDirectory(dir, 0, directory, settings); universe@4: closedir(dir); universe@7: destroy_settings_t(settings); universe@0: universe@0: // Print double line and line count universe@1: #ifdef _WIN32 universe@3: const int columns = 79; universe@1: #else universe@3: const int columns = 80; universe@1: #endif /* _WIN32 */ universe@1: universe@1: for (int t = 0 ; t < columns ; t++) { universe@0: printf("="); universe@0: } universe@1: #ifdef _WIN32 universe@3: printf("\n%73d lines\n", lines); universe@1: #else universe@3: printf("\n%74d lines\n", lines); universe@1: #endif /* _WIN32 */ universe@0: universe@0: return 0; universe@0: }