259 |
259 |
260 /* Find tokens */ |
260 /* Find tokens */ |
261 parseCSL(includeSuffix, settings->includeSuffixes); |
261 parseCSL(includeSuffix, settings->includeSuffixes); |
262 parseCSL(excludeSuffix, settings->excludeSuffixes); |
262 parseCSL(excludeSuffix, settings->excludeSuffixes); |
263 |
263 |
|
264 /* Compiler regular expressions, if any specified */ |
|
265 if (!regex_compile_all(settings->regex)) { |
|
266 return 1; |
|
267 } |
|
268 |
264 /* Scan directories */ |
269 /* Scan directories */ |
265 if (regex_compile_all(settings->regex)) { |
270 scanresult_t* result = new_scanresult_t(settings); |
266 scanresult_t* result = new_scanresult_t(settings); |
271 const char* result_type = settings->count_chars ? "chars" : "lines"; |
|
272 bool has_output = false; |
|
273 unsigned total = 0; |
|
274 if (directories->count == 0) { |
|
275 add_string(directories, "./"); |
|
276 } |
|
277 for (unsigned t = 0 ; t < directories->count ; t++) { |
267 /* Don't waste memory when only the total sum is needed */ |
278 /* Don't waste memory when only the total sum is needed */ |
268 string_list_t *output = settings->verbose ? new_string_list_t() : NULL; |
279 string_list_t *output = settings->verbose ? new_string_list_t() : NULL; |
269 char *outbuf; |
280 scanDirectory((scanner_t){directories->items[t], 0}, settings, output, result); |
270 const char* result_type = settings->count_chars ? "chars" : "lines"; |
281 total += result->result; |
271 |
282 if (settings->verbose) { |
272 unsigned total = 0; |
283 has_output |= output->count > 0; |
273 if (directories->count == 0) { |
|
274 add_string(directories, "./"); |
|
275 } |
|
276 for (unsigned t = 0 ; t < directories->count ; t++) { |
|
277 scanDirectory((scanner_t){directories->items[t], 0}, settings, |
|
278 output, result); |
|
279 total += result->result; |
|
280 if (directories->count > 1) { |
|
281 add_string(output, strdup(sepline_single)); |
|
282 outbuf = (char*) malloc(81); |
|
283 snprintf(outbuf, 81, "%-63s%10u %s\n", directories->items[t], |
|
284 result->result, result_type); |
|
285 add_string(output, outbuf); |
|
286 add_string(output, strdup(sepline_single)); |
|
287 } |
|
288 } |
|
289 destroy_string_list_t(directories); |
|
290 |
|
291 /* Print result */ |
|
292 if (output != NULL) { |
|
293 for (int i = 0 ; i < output->count ; i++) { |
284 for (int i = 0 ; i < output->count ; i++) { |
294 printf("%s", output->items[i]); |
285 printf("%s", output->items[i]); |
295 free(output->items[i]); |
286 free(output->items[i]); |
296 } |
287 } |
297 |
288 destroy_string_list_t(output); |
298 if (result->ext) { |
289 if (directories->count > 1) { |
299 if (result->ext->count > 0) { |
290 has_output = true; |
300 fwrite(sepline_double, 1, 80, stdout); |
291 fputs(sepline_single, stdout); |
301 printf("\nIndividual sums:\n"); |
292 printf("%-63s%10u %s\n", directories->items[t], |
302 for (unsigned t = 0 ; t < result->ext->count ; t++) { |
293 result->result, result_type); |
303 printf(" %-62s%10u %s\n", |
294 fputs(sepline_single, stdout); |
304 result->ext->extensions[t], |
295 } |
305 result->ext->result[t], |
296 } |
306 result_type); |
297 } |
307 } |
298 destroy_string_list_t(directories); |
|
299 |
|
300 /* Print result */ |
|
301 if (settings->verbose) { |
|
302 if (result->ext) { |
|
303 if (result->ext->count > 0) { |
|
304 has_output = true; |
|
305 fwrite(sepline_double, 1, 80, stdout); |
|
306 printf("\nIndividual sums:\n"); |
|
307 for (unsigned t = 0 ; t < result->ext->count ; t++) { |
|
308 printf(" %-62s%10u %s\n", |
|
309 result->ext->extensions[t], |
|
310 result->ext->result[t], |
|
311 result_type); |
308 } |
312 } |
309 } |
313 } |
310 |
314 } |
311 if (output->count > 0) { |
315 |
312 fwrite(sepline_double, 1, 80, stdout); |
316 if (has_output) { |
313 printf("%73d %s\n", total, result_type); |
317 fwrite(sepline_double, 1, 80, stdout); |
314 } else { |
318 printf("%73d %s\n", total, result_type); |
315 /* If we only need to output a total, output it differently */ |
|
316 printf("%d %s\n", total, result_type); |
|
317 } |
|
318 |
|
319 if (settings->confusing_lnlen && |
|
320 settings->regex->pattern_list->count > 0) { |
|
321 |
|
322 printf("\nSome files contain too long lines.\n" |
|
323 "The parser currently supports a maximum line length of %u." |
|
324 "\nThe result might be wrong.\n", MAX_LINELENGTH); |
|
325 } |
|
326 } else { |
319 } else { |
327 printf("%u", total); |
320 /* If there was not any output so far, skip formatting */ |
328 } |
321 printf("%d %s\n", total, result_type); |
329 destroy_scanresult_t(result); |
322 } |
330 destroy_string_list_t(output); |
323 |
331 destroy_settings_t(settings); |
324 if (settings->confusing_lnlen && |
332 } |
325 settings->regex->pattern_list->count > 0) { |
333 |
326 |
334 fflush(stdout); |
327 printf("\nSome files contain too long lines.\n" |
335 fflush(stderr); |
328 "The parser currently supports a maximum line length of %u." |
|
329 "\nThe result might be wrong.\n", MAX_LINELENGTH); |
|
330 } |
|
331 } else { |
|
332 printf("%u", total); |
|
333 } |
|
334 destroy_scanresult_t(result); |
|
335 destroy_settings_t(settings); |
|
336 |
336 return 0; |
337 return 0; |
337 } |
338 } |