cline.c

Tue, 20 Sep 2011 15:19:28 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 20 Sep 2011 15:19:28 +0200
changeset 16
bc9a0fefd892
parent 14
ee9333c91dda
child 19
8bac9fd0629d
permissions
-rw-r--r--

fixed makefile to run safely on compile errors + added -V option to cline

universe@10 1 /*
universe@10 2 * cline.c
universe@10 3 *
universe@10 4 * Created on: 23.05.2011
universe@10 5 * Author: beckermi
universe@10 6 */
universe@10 7
universe@3 8 #include "cline.h"
universe@10 9 #include "scanner.h"
universe@10 10 #include "settings.h"
universe@12 11 #include "arguments.h"
universe@16 12 #include "stream.h"
universe@0 13
universe@12 14 void printHelpText() {
universe@0 15 const char* helpText =
universe@1 16 "\nUsage:"
universe@12 17 "\n cline [-hrm][-s suffix][<directory>]"
universe@12 18 "\n cline [-hrm][-S suffix][<directory>]"
universe@0 19 "\n\nCounts the line terminator characters (\\n) within all"
universe@0 20 " files in the specified\ndirectory."
universe@0 21 "\n\nOptions:"
universe@0 22 "\n -h, --help - this help text"
universe@1 23 "\n -m - print information about matching files only"
universe@1 24 "\n -s <suffixes> - only count files with these suffixes (separated"
universe@0 25 "\n by commas)"
universe@1 26 "\n -S <suffixes> - count any file except those with these suffixes"
universe@0 27 "\n (separated by commas)"
universe@1 28 "\n -r, -R - includes subdirectories"
universe@14 29 "\n -v, --version - print out version information"
universe@16 30 "\n -V - turn verbose output off, print the result only"
universe@0 31 "\n\n"
universe@1 32 "The default call without any options is:"
universe@12 33 "\n cline ./\n"
universe@7 34 "So each file in the working directory is counted. If you want to count C"
universe@7 35 "\nsource code in your working directory and its subdirectories, type:"
universe@12 36 "\n cline -rs .c\n";
universe@1 37
universe@12 38 printf(helpText);
universe@1 39 }
universe@1 40
universe@14 41 int exit_with_version(settings_t* settings) {
universe@16 42 printf("cline - Revision: %s", VERSION);
universe@14 43 destroy_settings_t(settings);
universe@14 44 return 0;
universe@14 45 }
universe@14 46
universe@12 47 int exit_with_help(settings_t* settings, int code) {
universe@12 48 printHelpText();
universe@8 49 destroy_settings_t(settings);
universe@8 50 return code;
universe@8 51 }
universe@8 52
universe@1 53 int main(int argc, char** argv) {
universe@0 54
universe@3 55 // Settings
universe@3 56 settings_t *settings = new_settings_t();
universe@5 57 if (settings == NULL) {
universe@5 58 fprintf(stderr, "Memory allocation failed.\n");
universe@5 59 return 1;
universe@5 60 }
universe@3 61
universe@0 62 // Get arguments
universe@7 63 char* directory = "./";
universe@7 64 char* suffix = " ";
universe@8 65 int checked = 0;
universe@0 66
universe@1 67 for (int t = 1 ; t < argc ; t++) {
universe@1 68
universe@16 69 int argflags = checkArgument(argv[t], "hsSrRmvV");
universe@1 70
universe@14 71 // s, S
universe@14 72 if ((argflags & 6) > 0) {
universe@8 73 if (registerArgument(&checked, 6)) {
universe@12 74 return exit_with_help(settings, 1);
universe@0 75 }
universe@14 76 settings->includeSuffixes = (argflags & 2) > 0;
universe@1 77 t++;
universe@1 78 if (t >= argc) {
universe@12 79 return exit_with_help(settings, 1);
universe@1 80 }
universe@1 81 suffix = argv[t];
universe@0 82 }
universe@1 83 // h
universe@1 84 if ((argflags & 1) > 0 || strcmp(argv[t], "--help") == 0) {
universe@14 85 return exit_with_help(settings, 0);
universe@0 86 }
universe@1 87 // r, R
universe@1 88 if ((argflags & 24) > 0) {
universe@8 89 if (registerArgument(&checked, 24)) {
universe@12 90 return exit_with_help(settings, 1);
universe@0 91 }
universe@3 92 settings->recursive = true;
universe@0 93 }
universe@8 94 // m
universe@1 95 if ((argflags & 32) > 0) {
universe@8 96 if (registerArgument(&checked, 32)) {
universe@12 97 return exit_with_help(settings, 1);
universe@0 98 }
universe@3 99 settings->matchesOnly = true;
universe@0 100 }
universe@14 101 // v
universe@14 102 if ((argflags & 64) > 0 || strcmp(argv[t], "--version") == 0) {
universe@14 103 return exit_with_version(settings);
universe@14 104 }
universe@16 105 // V
universe@16 106 if ((argflags & 128) > 0) {
universe@16 107 if (registerArgument(&checked, 128)) {
universe@16 108 return exit_with_help(settings, 1);
universe@16 109 }
universe@16 110 settings->verbose = false;
universe@16 111 }
universe@6 112 // Path
universe@1 113 if (argflags == 0) {
universe@8 114 if (registerArgument(&checked, 1024)) {
universe@12 115 return exit_with_help(settings, 1);
universe@0 116 }
universe@0 117 directory = argv[t];
universe@0 118 }
universe@0 119 }
universe@0 120
universe@16 121 // Configure output
universe@16 122 if (!settings->verbose) {
universe@16 123 close_stdout();
universe@16 124 }
universe@16 125
universe@0 126 // Find tokens
universe@6 127 char* finder = strtok(suffix, ",");
universe@1 128 while (finder != NULL) {
universe@6 129 add_suffix(settings->suffixList, finder);
universe@0 130 finder = strtok(NULL, ",");
universe@0 131 }
universe@0 132
universe@0 133 // Open directory
universe@0 134 DIR *dir = opendir(directory);
universe@1 135 if (dir == NULL) {
universe@0 136 perror("Operation failed");
universe@4 137 destroy_settings_t(settings);
universe@0 138 return 1;
universe@0 139 }
universe@0 140
universe@0 141 // Scan directory
universe@3 142 int lines = scanDirectory(dir, 0, directory, settings);
universe@4 143 closedir(dir);
universe@7 144 destroy_settings_t(settings);
universe@0 145
universe@0 146 // Print double line and line count
universe@16 147 #ifdef _WIN32
universe@3 148 const int columns = 79;
universe@16 149 #else
universe@3 150 const int columns = 80;
universe@16 151 #endif /* _WIN32 */
universe@1 152
universe@1 153 for (int t = 0 ; t < columns ; t++) {
universe@0 154 printf("=");
universe@0 155 }
universe@16 156 #ifdef _WIN32
universe@3 157 printf("\n%73d lines\n", lines);
universe@16 158 #else
universe@3 159 printf("\n%74d lines\n", lines);
universe@16 160 #endif /* _WIN32 */
universe@0 161
universe@16 162 if (!settings->verbose) {
universe@16 163 reopen_stdout();
universe@16 164 printf("%d", lines);
universe@16 165 }
universe@16 166
universe@16 167 fflush(stdout);
universe@0 168 return 0;
universe@0 169 }

mercurial