noice

small file browser
git clone git://git.2f30.org/noice
Log | Files | Refs | README | LICENSE

nopen.c (1618B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/types.h>
      3 #include <sys/wait.h>
      4 
      5 #include <regex.h>
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 #include <string.h>
      9 #include <unistd.h>
     10 
     11 #include "arg.h"
     12 #include "util.h"
     13 
     14 struct rule {
     15 	char *regex; /* Regex to match on filename */
     16 	char *file;
     17 	char *argv[NR_ARGS];
     18 	regex_t regcomp;
     19 };
     20 
     21 #include "nopenconf.h"
     22 
     23 char *argv0;
     24 
     25 int
     26 run(struct rule *rule, char *arg)
     27 {
     28 	char *argv[NR_ARGS];
     29 	int i;
     30 
     31 	for (i = 0; rule->argv[i]; i++) {
     32 		if (strcmp(rule->argv[i], "{}") == 0) {
     33 			argv[i] = arg;
     34 			continue;
     35 		}
     36 		argv[i] = rule->argv[i];
     37 	}
     38 	argv[i] = NULL;
     39 	return spawnvp(NULL, rule->file, argv);
     40 }
     41 
     42 struct rule *
     43 matchrule(char *file)
     44 {
     45 	int i;
     46 
     47 	for (i = 0; i < LEN(rules); i++) {
     48 		if (regexec(&rules[i].regcomp, file, 0, NULL, 0) == 0)
     49 			return &rules[i];
     50 	}
     51 	return NULL;
     52 }
     53 
     54 void
     55 parserules(void)
     56 {
     57 	char errbuf[256];
     58 	int i, r;
     59 
     60 	for (i = 0; i < LEN(rules); i++) {
     61 		r = regcomp(&rules[i].regcomp, rules[i].regex,
     62 			    REG_NOSUB | REG_EXTENDED | REG_ICASE);
     63 		if (r != 0) {
     64 			regerror(r, &rules[i].regcomp, errbuf, sizeof(errbuf));
     65 			fprintf(stderr, "invalid regex rules[%d]: %s: %s\n",
     66 			        i, rules[i].regex, errbuf);
     67 			exit(1);
     68 		}
     69 	}
     70 }
     71 
     72 void
     73 usage(void)
     74 {
     75 	fprintf(stderr, "usage: %s file...\n", argv0);
     76 	exit(1);
     77 }
     78 
     79 int
     80 main(int argc, char *argv[])
     81 {
     82 	int r;
     83 
     84 	ARGBEGIN {
     85 	default:
     86 		usage();
     87 	} ARGEND
     88 
     89 	if (argc == 0)
     90 		usage();
     91 
     92 	r = 0;
     93 	parserules();
     94 	for (; argv[0] != NULL; argv++) {
     95 		struct rule *rule;
     96 
     97 		if ((rule = matchrule(argv[0])) == NULL)
     98 			continue;
     99 		if (run(rule, argv[0]) == -1)
    100 			r = 1;
    101 	}
    102 	return r;
    103 }