chiark / gitweb /
www-cgi: Introduce `?DEFAULTS' pattern to match the default set.
[userv-utils.git] / www-cgi / ucgicommon.c
index 4bba1867d46a794117c94787493da90b19b5dc6b..73565b5f07e4d51d5e15bdec0e75d1a5e1bc6fe5 100644 (file)
@@ -18,6 +18,7 @@
  * $Id$
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -126,16 +127,28 @@ opened:
 
 static int envvar_match(unsigned flags, const char *en,
                        const char *const *patv,
+                       const char *const *defaults,
                        const char **ev)
 {
   const char *const *patp;
   const char *q, *pat;
   int acceptp;
+  int rc;
 
+  if (!patv) { patv= defaults; defaults= 0; }
   for (patp= patv; (pat= *patp); patp++) {
     q= en;
     acceptp= 1;
     if (*pat == '!' && (flags & FILTF_WILDCARD)) { acceptp= 0; pat++; }
+    else if (*pat == '?') {
+      if (strcmp(pat + 1, "DEFAULTS") == 0) {
+       assert(defaults);
+       rc= envvar_match(flags, en, defaults, 0, ev);
+       if (rc) return rc;
+      } else
+       error("unknown pattern directive");
+      continue;
+    }
 
     for (;;) {
       if (!*pat) {
@@ -174,6 +187,7 @@ match:
 
 void filter_environment(unsigned flags, const char *prefix_in,
                        const char *const *patv,
+                       const char *const *defaults,
                        void (*foundone)(const char *fulln,
                                         const char *en, const char *ev,
                                         void *p),
@@ -191,7 +205,7 @@ void filter_environment(unsigned flags, const char *prefix_in,
       D( if (debugmode) printf(";;     doesn't match prefix\n"); )
       continue;
     }
-    if (envvar_match(flags, en + pn, patv, &ev) > 0) {
+    if (envvar_match(flags, en + pn, patv, defaults, &ev) > 0) {
       n= strcspn(en, "=");
       if (n >= sizeof(enbuf))
        error("environment variable name too long");