Index: trunk/main/pbx.c =================================================================== --- trunk/main/pbx.c (revision 249060) +++ trunk/main/pbx.c (working copy) @@ -1748,6 +1748,20 @@ NEW_MATCHER_CHK_MATCH; NEW_MATCHER_RECURSE; } + } else if (p->x[0] == 'P') { + if (p->x[1] == 0 && ( + (*str >= '0' && *str <= '9' ) || + (*str >= 'A' && *str <= 'Z') || + (*str >= 'a' && *str <= 'z') + )) { + NEW_MATCHER_CHK_MATCH; + NEW_MATCHER_RECURSE; + } + } else if (p->x[0] == '?') { + if (p->x[1] == 0 && *str ) { + NEW_MATCHER_CHK_MATCH; + NEW_MATCHER_RECURSE; + } } else if (p->x[0] == '.' && p->x[1] == 0) { /* how many chars will the . match against? */ int i = 0; @@ -1904,15 +1918,19 @@ pattern matcher. */ m->is_pattern = is_pattern; if (specificity == 1 && is_pattern && pattern[0] == 'N') - m->specificity = 0x0802; + m->specificity = 0x0832; else if (specificity == 1 && is_pattern && pattern[0] == 'Z') - m->specificity = 0x0901; + m->specificity = 0x0931; else if (specificity == 1 && is_pattern && pattern[0] == 'X') - m->specificity = 0x0a00; + m->specificity = 0x0a30; + else if (specificity == 1 && is_pattern && pattern[0] == 'P') /* 0-9 a-z A-Z */ + m->specificity = 0x3e30; + else if (specificity == 1 && is_pattern && pattern[0] == '?') /* any one ascii char */ + m->specificity = 0x8000; else if (specificity == 1 && is_pattern && pattern[0] == '.') - m->specificity = 0x10000; + m->specificity = 0x18000; else if (specificity == 1 && is_pattern && pattern[0] == '!') - m->specificity = 0x20000; + m->specificity = 0x28000; else m->specificity = specificity; @@ -2014,6 +2032,8 @@ *s1 = 'X'; } else if (*s1 == 'z') { *s1 = 'Z'; + } else if (*s1 == 'p') { + *s1 = 'P'; } } buf[0] = *s1; @@ -2188,11 +2208,43 @@ bitwise[7] = 0x03; return 0x0900 | '1'; + case 'P': /* 0..9 A..Z a..z */ + bitwise[6] = 0xff; + bitwise[7] = 0x03; + bitwise[8] = 0xfe; + bitwise[9] = 0xff; + bitwise[10] = 0xff; + bitwise[11] = 0x07; + bitwise[12] = 0xfe; + bitwise[13] = 0xff; + bitwise[14] = 0xff; + bitwise[15] = 0x07; + return 0x3E00 | '0'; + + case '?': /* one ascii char */ + bitwise[0] = 0xff; + bitwise[1] = 0xff; + bitwise[2] = 0xff; + bitwise[3] = 0xff; + bitwise[4] = 0xff; + bitwise[5] = 0xff; + bitwise[6] = 0xff; + bitwise[7] = 0xff; + bitwise[8] = 0xff; + bitwise[9] = 0xff; + bitwise[10] = 0xff; + bitwise[11] = 0xff; + bitwise[12] = 0xff; + bitwise[13] = 0xff; + bitwise[14] = 0xff; + bitwise[15] = 0xff; + return 0x8000; + case '.': /* wildcard */ - return 0x10000; + return 0x18000; case '!': /* earlymatch */ - return 0x20000; /* less specific than NULL */ + return 0x28000; /* less specific than NULL */ case '\0': /* empty string */ *p = NULL; @@ -2394,6 +2446,17 @@ return 0; } break; + case 'P': + char alphanum[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + if (!strpbrk(*data,alphanum)) { +#ifdef NEED_DEBUG_HERE + ast_log(LOG_NOTICE,"return (0) P is matched\n"); +#endif + return 0; + } + break; + case '?': + break; case '.': /* Must match, even with more digits */ #ifdef NEED_DEBUG_HERE ast_log(LOG_NOTICE, "return (1) when '.' is matched\n");