cline.c

Thu, 26 May 2011 14:39:52 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 26 May 2011 14:39:52 +0200
changeset 3
510d6b198dde
parent 1
34a5e235d16e
child 4
c3acfb3b4957
permissions
-rw-r--r--

Moved some functions to functions.c
Replaced static variables by settings_t type

universe@3 1 #include "cline.h"
universe@3 2 #include "functions.h"
universe@1 3
universe@3 4 settings_t* new_settings_t() {
universe@3 5 settings_t *settings = malloc(sizeof(settings_t*));
universe@1 6 #ifdef _WIN32
universe@3 7 settings->fileSeparator = '\\';
universe@1 8 #else
universe@3 9 settings->fileSeparator = '/';
universe@1 10 #endif /* _WIN32 */
universe@3 11 settings->suffixc = 1;
universe@3 12 settings->recursive = false;
universe@3 13 settings->includeSuffixes = false;
universe@3 14 settings->matchesOnly = false;
universe@0 15 }
universe@0 16
universe@1 17 void printHelpText(const char* prgName) {
universe@0 18 // Help text
universe@0 19 const char* helpText =
universe@1 20 "\nUsage:"
universe@1 21 "\n %s [-hrm][-s suffix][<directory>]"
universe@1 22 "\n %s [-hrm][-S suffix][<directory>]"
universe@0 23 "\n\nCounts the line terminator characters (\\n) within all"
universe@0 24 " files in the specified\ndirectory."
universe@0 25 "\n\nOptions:"
universe@0 26 "\n -h, --help - this help text"
universe@1 27 "\n -m - print information about matching files only"
universe@1 28 "\n -s <suffixes> - only count files with these suffixes (separated"
universe@0 29 "\n by commas)"
universe@1 30 "\n -S <suffixes> - count any file except those with these suffixes"
universe@0 31 "\n (separated by commas)"
universe@1 32 "\n -r, -R - includes subdirectories"
universe@0 33 "\n\n"
universe@1 34 "The default call without any options is:"
universe@1 35 "\n %s ./\n"
universe@0 36 "That means each file in each subdirectory is counted. If you want to count"
universe@0 37 "\nC source code in your working directory and its subdirectories, type:"
universe@1 38 "\n %s -rs .c\n";
universe@1 39
universe@3 40 printf(helpText, prgName, prgName, prgName, prgName);
universe@1 41 }
universe@1 42
universe@1 43 int main(int argc, char** argv) {
universe@0 44
universe@3 45 // Settings
universe@3 46 settings_t *settings = new_settings_t();
universe@3 47
universe@0 48 // Program name
universe@3 49 char* prgName = strrchr(argv[0], settings->fileSeparator);
universe@1 50
universe@1 51 if (prgName == NULL) {
universe@0 52 prgName = argv[0];
universe@3 53 } else {
universe@0 54 prgName++;
universe@0 55 }
universe@0 56
universe@0 57 // Defaults
universe@1 58 char* _suffix = " ";
universe@1 59 char _directory[3];
universe@1 60 _directory[0] = '.';
universe@3 61 _directory[1] = settings->fileSeparator;
universe@1 62 _directory[2] = 0;
universe@0 63
universe@0 64 // Get arguments
universe@0 65 char* directory;
universe@0 66 char* suffix;
universe@0 67 bool showHelp = false;
universe@0 68 char checked = 0;
universe@0 69
universe@1 70 for (int t = 1 ; t < argc ; t++) {
universe@1 71
universe@1 72 int argflags = checkArgument(argv[t], "hsSrRm");
universe@1 73
universe@1 74 // s
universe@1 75 if ((argflags & 2) > 0) {
universe@1 76 if ((checked & 1) > 0) {
universe@1 77 printHelpText(prgName);
universe@0 78 return -1;
universe@0 79 }
universe@3 80 settings->includeSuffixes = true;
universe@1 81 t++;
universe@1 82 if (t >= argc) {
universe@1 83 printHelpText(prgName);
universe@1 84 return -1;
universe@1 85 }
universe@1 86 suffix = argv[t];
universe@0 87 checked |= 1;
universe@0 88 }
universe@1 89 // S
universe@1 90 if ((argflags & 4) > 0) {
universe@1 91 if ((checked & 1) > 0) {
universe@1 92 printHelpText(prgName);
universe@0 93 return -1;
universe@0 94 }
universe@3 95 settings->includeSuffixes = false;
universe@1 96 t++;
universe@1 97 if (t >= argc) {
universe@1 98 printHelpText(prgName);
universe@1 99 return -1;
universe@1 100 }
universe@1 101 suffix = argv[t];
universe@0 102 checked |= 1;
universe@0 103 }
universe@1 104 // h
universe@1 105 if ((argflags & 1) > 0 || strcmp(argv[t], "--help") == 0) {
universe@1 106 if ((checked & 2) > 0) {
universe@1 107 printHelpText(prgName);
universe@0 108 return -1;
universe@0 109 }
universe@0 110 checked |= 2;
universe@0 111 showHelp = true;
universe@0 112 }
universe@1 113 // r, R
universe@1 114 if ((argflags & 24) > 0) {
universe@1 115 if ((checked & 4) > 0) {
universe@1 116 printHelpText(prgName);
universe@0 117 return -1;
universe@0 118 }
universe@0 119 checked |= 4;
universe@3 120 settings->recursive = true;
universe@0 121 }
universe@1 122 if ((argflags & 32) > 0) {
universe@1 123 if ((checked & 32) > 0) {
universe@1 124 printHelpText(prgName);
universe@0 125 return -1;
universe@0 126 }
universe@1 127 checked |= 32;
universe@3 128 settings->matchesOnly = true;
universe@0 129 }
universe@1 130 // other
universe@1 131 if (argflags == 0) {
universe@1 132 if ((checked & 8) > 0) {
universe@1 133 printHelpText(prgName);
universe@0 134 return -1;
universe@0 135 }
universe@1 136 checked |= 8;
universe@0 137 directory = argv[t];
universe@0 138 }
universe@0 139 }
universe@0 140
universe@0 141 // Show help and quit
universe@1 142 if (showHelp) {
universe@1 143 printHelpText(prgName);
universe@0 144 return 0;
universe@0 145 }
universe@0 146
universe@0 147 // Default values
universe@1 148 if ((checked & 1) == 0) {
universe@0 149 suffix = _suffix;
universe@0 150 }
universe@0 151
universe@1 152 if ((checked & 8) == 0) {
universe@0 153 directory = _directory;
universe@0 154 }
universe@0 155
universe@0 156 // Find tokens
universe@0 157 char* finder;
universe@0 158 finder = strchr(suffix, ',');
universe@1 159 while (finder != NULL) {
universe@3 160 settings->suffixc++;
universe@0 161 finder = strchr(finder+1, ',');
universe@0 162 }
universe@3 163 settings->suffixv = (char**) malloc(sizeof(char**)*settings->suffixc);
universe@3 164 if (settings->suffixv == NULL) {
universe@0 165 fprintf(stderr, "Memory allocation failed.\n");
universe@0 166 return 1;
universe@0 167 }
universe@0 168 finder = strtok(suffix, ",");
universe@0 169 int c = 0;
universe@1 170 while (finder != NULL) {
universe@3 171 settings->suffixv[c] = finder;
universe@0 172 c++;
universe@0 173 finder = strtok(NULL, ",");
universe@0 174 }
universe@0 175
universe@0 176 // Open directory
universe@0 177 DIR *dir = opendir(directory);
universe@1 178 if (dir == NULL) {
universe@0 179 perror("Operation failed");
universe@3 180 free(settings->suffixv);
universe@3 181 free(settings);
universe@0 182 return 1;
universe@0 183 }
universe@0 184
universe@0 185 // Scan directory
universe@3 186 int lines = scanDirectory(dir, 0, directory, settings);
universe@0 187
universe@0 188 // Print double line and line count
universe@1 189 #ifdef _WIN32
universe@3 190 const int columns = 79;
universe@1 191 #else
universe@3 192 const int columns = 80;
universe@1 193 #endif /* _WIN32 */
universe@1 194
universe@1 195 for (int t = 0 ; t < columns ; t++) {
universe@0 196 printf("=");
universe@0 197 }
universe@1 198 #ifdef _WIN32
universe@3 199 printf("\n%73d lines\n", lines);
universe@1 200 #else
universe@3 201 printf("\n%74d lines\n", lines);
universe@1 202 #endif /* _WIN32 */
universe@0 203
universe@0 204 closedir(dir);
universe@3 205 free(settings->suffixv);
universe@3 206 free(settings);
universe@0 207 return 0;
universe@0 208 }

mercurial