mhl implement simple globbing
authorPhilipp Takacs <philipp@bureaucracy.de>
Mon, 10 Jul 2017 14:34:45 +0000 (16:34 +0200)
committerPhilipp Takacs <philipp@bureaucracy.de>
Sun, 25 Nov 2018 21:40:45 +0000 (22:40 +0100)
ignores now supports simple globbing

man/mhl.man1
uip/mhl.c

index 9785fe2..b6af953 100644 (file)
@@ -168,6 +168,11 @@ ignores=component,...
 .RE
 .PP
 specifies a list of components which are never output.
+This option supports some simple globbing,
+so a '*' at the end of a component will match
+for all components which start wich the string.
+When you want to match a component which ends with
+a '*', you can escape the '*' with a '\\'.
 .PP
 The component `MessageName' (case\-insensitive) will output the
 message file name as a one-line header, similar to
index b8213b0..76d2335 100644 (file)
--- a/uip/mhl.c
+++ b/uip/mhl.c
@@ -598,6 +598,34 @@ process(char *fname, int ofilen, int ofilec)
                c1->c_flags &= ~HDROUTPUT;
 }
 
+static boolean
+simplematch(char *pattern, char *b)
+{
+       char *match = strrchr(pattern, '*');
+       char repl;
+       boolean ret;
+
+       /* check if pattern ends with a * and is not escaped witch a \ */
+       if (!match || match[1] || (match > pattern && match[-1] == '\\')) {
+               if (!match || match[1]) {
+                       return mh_strcasecmp(pattern, b) == 0;
+               }
+               match[0] = '\0';
+               match[-1] = '*';
+               ret = mh_strcasecmp(pattern, b)==0;
+               match[-1] = '\\';
+               match[0] = '*';
+               return ret;
+       }
+
+       repl = b[match-pattern];
+       b[match-pattern] = '\0';
+       *match = '\0';
+       ret = (mh_strcasecmp(pattern, b) == 0);
+       b[match-pattern] = repl;
+       *match = '*';
+       return ret;
+}
 
 static void
 mhlfile(FILE *fp, char *mname, int ofilen, int ofilec)
@@ -626,7 +654,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec)
                switch (state = m_getfld2(state, &f, fp)) {
                case FLD2:
                        for (ip = ignores; *ip; ip++)
-                               if (mh_strcasecmp(f.name, *ip)==0) {
+                               if (simplematch(*ip, f.name)) {
                                        break;
                                }
                        if (*ip) {