mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
find-banned: support reading multiple files from stdin
This commit is contained in:
parent
684731200f
commit
e06a8cfc7a
1 changed files with 95 additions and 17 deletions
|
|
@ -60,7 +60,52 @@ enum {
|
||||||
static char *current_buffer_position;
|
static char *current_buffer_position;
|
||||||
static struct token *tokens;
|
static struct token *tokens;
|
||||||
static int nr_tokens, alloc_tokens;
|
static int nr_tokens, alloc_tokens;
|
||||||
static int current_line = 1;
|
static int current_line;
|
||||||
|
static char **argv_tokens;
|
||||||
|
static int found_token;
|
||||||
|
|
||||||
|
static const char find_banned_usage[] =
|
||||||
|
"Usage: find-banned [OPTIONS...] FILE\n"
|
||||||
|
"When FILE is -, read stdin\n"
|
||||||
|
"OPTIONS:\n"
|
||||||
|
" --tokens=<tokens> Comma-separated string of idents to grep for\n";
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
printf("%s", find_banned_usage);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char **
|
||||||
|
split(char *str, char delim)
|
||||||
|
{
|
||||||
|
if (!str) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
int argc = 1;
|
||||||
|
char *p = str;
|
||||||
|
while (*p) {
|
||||||
|
if (*p == delim) {
|
||||||
|
argc++;
|
||||||
|
}
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **argv = calloc(argc + 1, sizeof(*argv));
|
||||||
|
char **argvp = argv;
|
||||||
|
p = str;
|
||||||
|
while (*str) {
|
||||||
|
if (*str == delim) {
|
||||||
|
*argvp++ = strndup(p, str-p);
|
||||||
|
p = str + 1;
|
||||||
|
}
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
*argvp++ = strndup(p, str-p);
|
||||||
|
*argvp = NULL;
|
||||||
|
return argv;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
buf_init(struct buf *s)
|
buf_init(struct buf *s)
|
||||||
|
|
@ -369,33 +414,66 @@ grep(struct token *tokens, const char *filename, const char *pattern)
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static void
|
||||||
main(int argc, char **argv)
|
process_one_file(const char *filename)
|
||||||
{
|
{
|
||||||
struct token *tokens;
|
struct token *tokens;
|
||||||
int found = false;
|
char *buffer = read_file(filename);
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
fprintf(stderr, "usage: %s <file> [<patterns>...]\n", argv[0]);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *buffer = read_file(argv[1]);
|
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
return EXIT_FAILURE;
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
current_line = 1;
|
||||||
tokens = lex(buffer);
|
tokens = lex(buffer);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
if (argc == 2) {
|
if (!argv_tokens) {
|
||||||
/* Dump all idents */
|
/* Dump all idents */
|
||||||
grep(tokens, argv[1], NULL);
|
grep(tokens, filename, NULL);
|
||||||
} else {
|
} else {
|
||||||
for (int i = 2; i < argc; ++i) {
|
for (char **p = argv_tokens; *p; p++) {
|
||||||
found |= grep(tokens, argv[1], argv[i]);
|
found_token |= grep(tokens, filename, *p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return failure (1) if we have found a banned identifier */
|
int
|
||||||
return found;
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 2) {
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
for (int i = 1; i < argc; ++i) {
|
||||||
|
char *arg = argv[i];
|
||||||
|
|
||||||
|
if (!strncmp(arg, "--tokens=", 9)) {
|
||||||
|
argv_tokens = split(arg + 9, ',');
|
||||||
|
}
|
||||||
|
if (!strcmp(arg, "-")) {
|
||||||
|
char *line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
while ((getline(&line, &len, stdin) != -1)) {
|
||||||
|
char *p = strrchr(line, '\n');
|
||||||
|
if (p) {
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
process_one_file(line);
|
||||||
|
}
|
||||||
|
free(line);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (arg[0] != '-') {
|
||||||
|
process_one_file(arg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv_tokens) {
|
||||||
|
for (char **p = argv_tokens; *p; p++) {
|
||||||
|
free(*p);
|
||||||
|
}
|
||||||
|
free(argv_tokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return failure (1) if we have found a banned identifier */
|
||||||
|
return found_token;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue