URI: 
       switched to regexp matching for Rules - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e21d93b7bd5d34f31bc09a576b7d449df5b68c07
   DIR parent f504aea13289c7fd25d499d2582558d4e311bfbf
  HTML Author: arg@10ksloc.org <unknown>
       Date:   Fri,  4 Aug 2006 14:40:32 +0200
       
       switched to regexp matching for Rules
       
       Diffstat:
         M config.arg.h                        |      11 +++++------
         M config.default.h                    |       7 +++----
         M config.mk                           |       8 ++++----
         M dwm.h                               |       1 +
         M main.c                              |       1 +
         M tag.c                               |      68 +++++++++++++++++++++++--------
       
       6 files changed, 65 insertions(+), 31 deletions(-)
       ---
   DIR diff --git a/config.arg.h b/config.arg.h
       @@ -52,11 +52,10 @@ static Key key[] = { \
        };
        
        #define RULES \
       -        const unsigned int two[] = { 2 }; \
        static Rule rule[] = { \
       -        /* class:instance        tags                isfloat */ \
       -        { "Firefox.*",                two,                False }, \
       -        { "Gimp.*",                NULL,                True}, \
       -        { "MPlayer.*",                NULL,                True}, \
       -        { "Acroread.*",                NULL,                True}, \
       +        /* class:instance regex                tags regex        isfloat */ \
       +        { "Firefox.*",                        "net",                False }, \
       +        { "Gimp.*",                        NULL,                True}, \
       +        { "MPlayer.*",                        NULL,                True}, \
       +        { "Acroread.*",                        NULL,                True}, \
        };
   DIR diff --git a/config.default.h b/config.default.h
       @@ -47,9 +47,8 @@ static Key key[] = { \
        };
        
        #define RULES \
       -        const unsigned int two[] = { 2 }; \
        static Rule rule[] = { \
       -        /* class:instance        tags                isfloat */ \
       -        { "Firefox.*",                two,        False }, \
       -        { "Gimp.*",                NULL,                True}, \
       +        /* class:instance regex                tags regex        isfloat */ \
       +        { "Firefox.*",                        "2",                False }, \
       +        { "Gimp.*",                        NULL,                True}, \
        };
   DIR diff --git a/config.mk b/config.mk
       @@ -15,10 +15,10 @@ INCS = -I/usr/lib -I${X11INC}
        LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
        
        # flags
       -CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\"
       -LDFLAGS = ${LIBS}
       -#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
       -#LDFLAGS = -g ${LIBS}
       +#CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\"
       +#LDFLAGS = ${LIBS}
       +CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
       +LDFLAGS = -g ${LIBS}
        
        # compiler
        CC = cc
   DIR diff --git a/dwm.h b/dwm.h
       @@ -121,6 +121,7 @@ extern int xerror(Display *dsply, XErrorEvent *ee);
        extern void appendtag(Arg *arg);
        extern void dofloat(Arg *arg);
        extern void dotile(Arg *arg);
       +extern void initrregs();
        extern Client *getnext(Client *c);
        extern Client *getprev(Client *c);
        extern void replacetag(Arg *arg);
   DIR diff --git a/main.c b/main.c
       @@ -210,6 +210,7 @@ main(int argc, char *argv[])
                cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
        
                grabkeys();
       +        initrregs();
        
                for(ntags = 0; tags[ntags]; ntags++);
        
   DIR diff --git a/tag.c b/tag.c
       @@ -5,21 +5,31 @@
        #include "dwm.h"
        #include <regex.h>
        #include <stdio.h>
       +#include <stdlib.h>
        #include <string.h>
        #include <sys/types.h>
        #include <X11/Xutil.h>
        
       -/* static */
        
        typedef struct {
       -        const char *pattern;
       -        const unsigned int *tags;
       +        const char *clpattern;
       +        const char *tpattern;
                Bool isfloat;
        } Rule;
        
       +typedef struct {
       +        regex_t *clregex;
       +        regex_t *tregex;
       +} RReg;
       +
       +/* static */
       +
        TAGS
        RULES
        
       +static RReg *rreg = NULL;
       +static unsigned int len = 0;
       +
        void (*arrange)(Arg *) = DEFMODE;
        
        /* extern */
       @@ -138,6 +148,35 @@ getprev(Client *c)
        }
        
        void
       +initrregs()
       +{
       +        unsigned int i;
       +        regex_t *reg;
       +
       +        if(rreg)
       +                return;
       +        len = sizeof(rule) / sizeof(rule[0]);
       +        rreg = emallocz(len * sizeof(RReg));
       +
       +        for(i = 0; i < len; i++) {
       +                if(rule[i].clpattern) {
       +                        reg = emallocz(sizeof(regex_t));
       +                        if(regcomp(reg, rule[i].clpattern, 0))
       +                                free(reg);
       +                        else
       +                                rreg[i].clregex = reg;
       +                }
       +                if(rule[i].tpattern) {
       +                        reg = emallocz(sizeof(regex_t));
       +                        if(regcomp(reg, rule[i].tpattern, 0))
       +                                free(reg);
       +                        else
       +                                rreg[i].tregex = reg;
       +                }
       +        }
       +}
       +
       +void
        replacetag(Arg *arg)
        {
                int i;
       @@ -154,9 +193,7 @@ void
        settags(Client *c)
        {
                char classinst[256];
       -        static unsigned int len = sizeof(rule) / sizeof(rule[0]);
       -        unsigned int i, j, n;
       -        regex_t regex;
       +        unsigned int i, j;
                regmatch_t tmp;
                Bool matched = False;
                XClassHint ch;
       @@ -165,19 +202,16 @@ settags(Client *c)
                        snprintf(classinst, sizeof(classinst), "%s:%s",
                                        ch.res_class ? ch.res_class : "",
                                        ch.res_name ? ch.res_name : "");
       -                for(i = 0; !matched && i < len; i++) {
       -                        if(!regcomp(&regex, rule[i].pattern, 0)) {
       -                                if(!regexec(&regex, classinst, 1, &tmp, 0)) {
       -                                        n = rule[i].tags ?
       -                                                sizeof(rule[i].tags) / sizeof(rule[i].tags[0]) : 0;
       -                                        matched = n != 0;
       -                                        for(j = 0; j < n; j++)
       -                                                c->tags[rule[i].tags[j]] = True;
       -                                        c->isfloat = rule[i].isfloat;
       +                for(i = 0; !matched && i < len; i++)
       +                        if(rreg[i].clregex && !regexec(rreg[i].clregex, classinst, 1, &tmp, 0)) {
       +                                c->isfloat = rule[i].isfloat;
       +                                for(j = 0; rreg[i].tregex && j < ntags; j++) {
       +                                        if(!regexec(rreg[i].tregex, tags[j], 1, &tmp, 0)) {
       +                                                matched = True;
       +                                                c->tags[j] = True;
       +                                        }
                                        }
       -                                regfree(&regex);
                                }
       -                }
                        if(ch.res_class)
                                XFree(ch.res_class);
                        if(ch.res_name)