bool has_branches=false;
unsigned level=0;
bool escape=false;
+ unsigned bracket=0;
string::const_iterator end;
for(end=iter; end!=expr.end(); ++end)
{
if(escape)
escape=false;
+ else if(bracket)
+ {
+ if(bracket==3 && *end==']')
+ bracket=0;
+ else if(bracket==1 && *end=='^')
+ bracket=2;
+ else
+ bracket=3;
+ }
else if(*end=='\\')
escape=true;
else if(*end=='(')
}
--level;
}
- else if(*end=='|')
+ else if(*end=='|' && level==0)
{
if(branch)
break;
- else if(level==0)
+ else
has_branches=true;
}
+ else if(*end=='[')
+ bracket=1;
}
if(level>0)
if(end==str.end())
throw InvalidParameterValue("Unmatched '['");
- uint8_t mask[32]={0};
+ unsigned char mask[32]={0};
unsigned type=0;
bool range=false;
unsigned char first=0, last=0;
}
else if(instr==MATCH_MASK)
{
- uint8_t mask[32];
- for(unsigned k=0; k<32; ++k)
- mask[k]=*j->citer++;
- match_result=mask[c>>3]&(1<<(c&7));
+ if(c>=0 && c<=0xFF)
+ {
+ unsigned char m=*(j->citer+(c>>3));
+ match_result=m&(1<<(c&7));
+ }
input_consumed=true;
+ j->citer+=32;
}
else if(instr==MATCH_ANY)
{