cline.c

Fri, 27 May 2011 12:49:33 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 27 May 2011 12:49:33 +0200
changeset 4
c3acfb3b4957
parent 3
510d6b198dde
child 5
9393eff3d2f9
permissions
-rw-r--r--

Fixed missing return statement in new_settings_t.
Added support for c++ compilers.
Added destroy_settings_t function

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

mercurial