- for (patp= patv; (pat= *patp); patp++) {
- q= en + pn;
- acceptp= 1;
- if (*pat == '!' && (flags & FILTF_WILDCARD)) {
- acceptp= 0; pat++;
- }
- for (;;) {
- if (!*pat) {
- if (*q != '=') {
- D( if (debugmode)
- printf(";; mismatch `%s' (prefix)\n", *patp); )
- goto next_pat;
- }
- D( if (debugmode) printf(";; matched `%s'\n", *patp); )
- ev = q + 1;
- break;
- } else if (*pat == '*' && (flags & FILTF_WILDCARD)) {
- q = strchr(q, '=');
- if (!q) {
- D( if (debugmode)
- printf(";; mismatch `%s' (discard: no `=')\n", *patp); )
- goto next_ev;
- }
- D( if (debugmode)
- printf(";; wildcard match for `%s'\n", *patp); )
- ev = q + 1;
- break;
- } else
- if (*pat++ != *q++) {
- D( if (debugmode) printf(";; mismatch `%s'\n", *patp); )
- goto next_pat;
- }
- }
- if (acceptp) {
- n= q - en;
- if (n >= sizeof(enbuf))
- error("environment variable name too long");
- memcpy(enbuf, en, n);
- enbuf[n]= 0;
- D( if (debugmode)
- printf(";; full = `%s'; tail = `%s'; value = `%s'\n",
- enbuf, enbuf + pn, ev); )
- foundone(enbuf, enbuf + pn, ev, p);
- } D( else if (debugmode)
- printf(";; matched negated pattern\n"); )
- goto next_ev;
- next_pat:;
+ if (envvar_match(flags, en + pn, patv, &ev) > 0) {
+ n= strcspn(en, "=");
+ if (n >= sizeof(enbuf))
+ error("environment variable name too long");
+ memcpy(enbuf, en, n);
+ enbuf[n]= 0;
+ D( if (debugmode)
+ printf(";; full = `%s'; tail = `%s'; value = `%s'\n",
+ enbuf, enbuf + pn, ev); )
+ foundone(enbuf, enbuf + pn, ev, p);