cline.c

Mon, 23 May 2011 16:42:44 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 23 May 2011 16:42:44 +0200
changeset 0
518bfd1cc1e8
child 1
34a5e235d16e
permissions
-rw-r--r--

cline project init

universe@0 1 #include <stdio.h>
universe@0 2 #include <string.h>
universe@0 3 #include <stdbool.h>
universe@0 4 #include <stdlib.h>
universe@0 5 #include <dirent.h>
universe@0 6
universe@0 7 static int suffixc;
universe@0 8 static char** suffixv;
universe@0 9 static bool recursive;
universe@0 10 static bool includeSuffixes;
universe@0 11
universe@0 12 bool testSuffix(char* filename)
universe@0 13 {
universe@0 14 bool ret = false;
universe@0 15 int tokenlen, fnamelen = strlen(filename);
universe@0 16 for (int t = 0 ; t < suffixc ; t++)
universe@0 17 {
universe@0 18 tokenlen = strlen(suffixv[t]);
universe@0 19 if (fnamelen >= tokenlen)
universe@0 20 {
universe@0 21 if (strncmp(filename+fnamelen-tokenlen, suffixv[t], tokenlen) == 0)
universe@0 22 {
universe@0 23 ret = true;
universe@0 24 break;
universe@0 25 }
universe@0 26 }
universe@0 27 }
universe@0 28 return ret ^ !includeSuffixes;
universe@0 29 }
universe@0 30
universe@0 31 int scanDirectory(DIR *dir, const int spaces, char* currdir)
universe@0 32 {
universe@0 33 DIR *subdir;
universe@0 34 char* subdirname;
universe@0 35 struct dirent *entry;
universe@0 36 int lines, digits, a;
universe@0 37 int lineSum = 0;
universe@0 38
universe@0 39 while ((entry = readdir(dir)) != NULL)
universe@0 40 {
universe@0 41 if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
universe@0 42 {
universe@0 43 // Print occurence
universe@0 44 char entryname[strlen(entry->d_name)+spaces];
universe@0 45 for (int t = 0 ; t < spaces ; t++)
universe@0 46 {
universe@0 47 entryname[t]=' ';
universe@0 48 }
universe@0 49 entryname[spaces] = 0;
universe@0 50 strcat(entryname, entry->d_name);
universe@0 51 printf("%-60s", entryname);
universe@0 52
universe@0 53 // Check for subdirectory
universe@0 54 char subdirname[(1+strlen(currdir)+strlen(entry->d_name))];
universe@0 55 strcpy(subdirname, currdir);
universe@0 56 strcat(subdirname, "/");
universe@0 57 strcat(subdirname, entry->d_name);
universe@0 58 if ((subdir = opendir(subdirname)) != NULL)
universe@0 59 {
universe@0 60 printf("\n");
universe@0 61 if (recursive)
universe@0 62 {
universe@0 63 lineSum += scanDirectory(subdir, spaces+1, subdirname);
universe@0 64 }
universe@0 65 closedir(subdir);
universe@0 66 continue;
universe@0 67 }
universe@0 68
universe@0 69 // Count lines
universe@0 70 lines = 0;
universe@0 71 char filename[(1+strlen(currdir)+strlen(entry->d_name))];
universe@0 72 strcpy(filename, currdir);
universe@0 73 strcat(filename, "/");
universe@0 74 strcat(filename, entry->d_name);
universe@0 75 if (testSuffix(filename))
universe@0 76 {
universe@0 77 FILE *file = fopen(filename, "r");
universe@0 78 if (file == NULL)
universe@0 79 {
universe@0 80 perror(" File acces failed");
universe@0 81 continue;
universe@0 82 }
universe@0 83
universe@0 84 do
universe@0 85 {
universe@0 86 a = fgetc(file);
universe@0 87
universe@0 88 if (a == 10)
universe@0 89 {
universe@0 90 lines++;
universe@0 91 }
universe@0 92 } while (a != EOF);
universe@0 93 fclose(file);
universe@0 94
universe@0 95 // Print line count
universe@0 96 printf("%14d lines\n", lines);
universe@0 97
universe@0 98 lineSum += lines;
universe@0 99 }
universe@0 100 else
universe@0 101 {
universe@0 102 // Print hint
universe@0 103 printf("%20s\n", "no match");
universe@0 104 }
universe@0 105 }
universe@0 106 }
universe@0 107 return lineSum;
universe@0 108 }
universe@0 109
universe@0 110 int main(int argc, char** argv)
universe@0 111 {
universe@0 112 // Help text
universe@0 113 const char* helpText =
universe@0 114 "\nUsage:\n%s [-h|--help|(-s=<suffix>|-S=<suffix>)|(-r|-R)|<directory>]"
universe@0 115 "\n\nCounts the line terminator characters (\\n) within all"
universe@0 116 " files in the specified\ndirectory."
universe@0 117 "\n\nOptions:"
universe@0 118 "\n -h, --help - this help text"
universe@0 119 "\n -s=<suffixes> - only count files with these suffixes (separated"
universe@0 120 "\n by commas)"
universe@0 121 "\n -S=<suffixes> - count any file except those with these suffixes"
universe@0 122 "\n (separated by commas)"
universe@0 123 "\n -R - excludes subdirectories"
universe@0 124 "\n -r - includes subdirecotires"
universe@0 125 "\n\n"
universe@0 126 "The default call without any options is:"
universe@0 127 "\n %s -r ./ -S=\n"
universe@0 128 "That means each file in each subdirectory is counted. If you want to count"
universe@0 129 "\nC source code in your working directory and its subdirectories, type:"
universe@0 130 "\n %s -s=.c\n";
universe@0 131
universe@0 132 // Program name
universe@0 133 char* prgName = strrchr(argv[0], '/');
universe@0 134 if (prgName == NULL)
universe@0 135 {
universe@0 136 prgName = argv[0];
universe@0 137 }
universe@0 138 else
universe@0 139 {
universe@0 140 prgName++;
universe@0 141 }
universe@0 142
universe@0 143 // Defaults
universe@0 144 char* _suffix = "";
universe@0 145 char* _directory = "./";
universe@0 146
universe@0 147 // Get arguments
universe@0 148 char* directory;
universe@0 149 char* suffix;
universe@0 150 bool showHelp = false;
universe@0 151 recursive = true;
universe@0 152 includeSuffixes = false;
universe@0 153 char checked = 0;
universe@0 154
universe@0 155 for (int t = 1 ; t < argc ; t++)
universe@0 156 {
universe@0 157 if (strncmp(argv[t], "-s=", 3) == 0)
universe@0 158 {
universe@0 159 if ((checked & 1) > 0)
universe@0 160 {
universe@0 161 printf(helpText, prgName, prgName, prgName);
universe@0 162 return -1;
universe@0 163 }
universe@0 164 includeSuffixes = true;
universe@0 165 suffix = argv[t]+3;
universe@0 166 checked |= 1;
universe@0 167 }
universe@0 168 else if (strncmp(argv[t], "-S=", 3) == 0)
universe@0 169 {
universe@0 170 if ((checked & 1) > 0)
universe@0 171 {
universe@0 172 printf(helpText, prgName, prgName, prgName);
universe@0 173 return -1;
universe@0 174 }
universe@0 175 includeSuffixes = false;
universe@0 176 suffix = argv[t]+3;
universe@0 177 checked |= 1;
universe@0 178 }
universe@0 179 else if (strcmp(argv[t], "-h") == 0 || strcmp(argv[t], "--help") == 0)
universe@0 180 {
universe@0 181 if ((checked & 2) > 0)
universe@0 182 {
universe@0 183 printf(helpText, prgName, prgName, prgName);
universe@0 184 return -1;
universe@0 185 }
universe@0 186 checked |= 2;
universe@0 187 showHelp = true;
universe@0 188 }
universe@0 189 else if (strcmp(argv[t], "-r") == 0)
universe@0 190 {
universe@0 191 if ((checked & 4) > 0)
universe@0 192 {
universe@0 193 printf(helpText, prgName, prgName, prgName);
universe@0 194 return -1;
universe@0 195 }
universe@0 196 checked |= 4;
universe@0 197 recursive = true;
universe@0 198 }
universe@0 199 else if (strcmp(argv[t], "-R") == 0)
universe@0 200 {
universe@0 201 if ((checked & 4) > 0)
universe@0 202 {
universe@0 203 printf(helpText, prgName, prgName, prgName);
universe@0 204 return -1;
universe@0 205 }
universe@0 206 checked |= 4;
universe@0 207 recursive = false;
universe@0 208 }
universe@0 209 else
universe@0 210 {
universe@0 211 if ((checked & 8) > 0)
universe@0 212 {
universe@0 213 printf(helpText, prgName, prgName, prgName);
universe@0 214 return -1;
universe@0 215 }
universe@0 216 checked |= 8;
universe@0 217 directory = argv[t];
universe@0 218 }
universe@0 219 }
universe@0 220
universe@0 221 // Show help and quit
universe@0 222 if (showHelp)
universe@0 223 {
universe@0 224 printf(helpText, prgName, prgName, prgName);
universe@0 225 return 0;
universe@0 226 }
universe@0 227
universe@0 228 // Default values
universe@0 229 if ((checked & 1) == 0)
universe@0 230 {
universe@0 231 suffix = _suffix;
universe@0 232 }
universe@0 233
universe@0 234 if ((checked & 8) == 0)
universe@0 235 {
universe@0 236 directory = _directory;
universe@0 237 }
universe@0 238
universe@0 239 // Find tokens
universe@0 240 char* finder;
universe@0 241 suffixc = 1;
universe@0 242 finder = strchr(suffix, ',');
universe@0 243 while (finder != NULL)
universe@0 244 {
universe@0 245 suffixc++;
universe@0 246 finder = strchr(finder+1, ',');
universe@0 247 }
universe@0 248 suffixv = (char**) malloc(sizeof(suffixv)*suffixc);
universe@0 249 if (suffixv == NULL)
universe@0 250 {
universe@0 251 fprintf(stderr, "Memory allocation failed.\n");
universe@0 252 return 1;
universe@0 253 }
universe@0 254 finder = strtok(suffix, ",");
universe@0 255 int c = 0;
universe@0 256 while (finder != NULL)
universe@0 257 {
universe@0 258 suffixv[c] = finder;
universe@0 259 c++;
universe@0 260 finder = strtok(NULL, ",");
universe@0 261 }
universe@0 262
universe@0 263 // Open directory
universe@0 264 DIR *dir = opendir(directory);
universe@0 265 if (dir == NULL)
universe@0 266 {
universe@0 267 perror("Operation failed");
universe@0 268 free(suffixv);
universe@0 269 return 1;
universe@0 270 }
universe@0 271
universe@0 272 // Scan directory
universe@0 273 int lines = scanDirectory(dir, 0, directory);
universe@0 274
universe@0 275 // Print double line and line count
universe@0 276 for (int t = 0 ; t < 80 ; t++)
universe@0 277 {
universe@0 278 printf("=");
universe@0 279 }
universe@0 280 printf("\n%74d lines\n", lines);
universe@0 281
universe@0 282 closedir(dir);
universe@0 283 free(suffixv);
universe@0 284 return 0;
universe@0 285 }

mercurial