#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef vector wektor; wektor str2vector(string s) { wektor result_vector; for(int i=0; i= '0' && ch <= '9') value = (value << 4) + (ch - '0'); else if (ch >= 'A' && ch <= 'F') value = (value << 4) + (ch - 'A' + 10); else if (ch >= 'a' && ch <= 'f') value = (value << 4) + (ch - 'a' + 10); else return value; ch = lb; } return value; } int ishex(char val) { if (val >= '0' && val <= '9') return 1; else if (val >= 'A' && val <= 'F') return 1; else if (val >= 'a' && val <= 'f') return 1; else return 0; } wektor revregex_process_bracket(wektor str,int start_offset,int end_offset) //index: '[' ... ']' { wektor result_vector; //TODO hex support int bslash='\\'; int word='w'; int digit='d'; int range='-'; //flags char nnot=0; char wordf=0; char digitf=0; char rangeword=0; char rangedigit=0; //character pool char characters[255]={0,}; int chari=0; char characterstmp[255]={0,}; long character_class=0; //skip first bracket char int i=start_offset+1; int lend_offset=end_offset; int tmpj; if( str[i]=='^') //not flag { i++;nnot=1; } // DEBUG //fprintf(stdout,"Start off:%d End off:%d\n",i,end_offset); //print_vector(str,i,end_offset); for(i;i result_vector=str; std::vector tmp; repeat_remove: tmp.clear(); isinbracketi=false; isescapedi = false; //cout<<"start1: \n"; //print_vector(result_vector,0,result_vector.size()); for(int i=0;i=0 && result_vector[i-1]!=bslash ) isinbracketi=true; if(result_vector[i]==rbrak && result_vector[i-1]!=bslash ) isinbracketi=false; if(result_vector[i]==bslash) isescapedi = !isescapedi; else isescapedi = false; if( result_vector[i]==lnaw && !isinbracketi && (i==0 || result_vector[i-1]!=bslash ) && !isescapedi ) { isinbracketj=false; isescapedj = isescapedi; for(int j=i;j=0 && result_vector[j-1]!=bslash) isinbracketj=true; if(result_vector[j]==rbrak && result_vector[j-1]!=bslash) isinbracketj=false; if(result_vector[j]==bslash) isescapedj = !isescapedj; else isescapedj = false; if(result_vector[j]==rnaw && !isinbracketi && !isinbracketj && !isescapedj ){ tmp=mergevector(tmp,cutvector(result_vector,0,i-1)); tmp=mergevector(tmp,cutvector(result_vector,i+1,j-1)); tmp=mergevector(tmp,cutvector(result_vector,j+1,result_vector.size()-1)); result_vector=tmp; goto repeat_remove; } j++; /* if(j==result_vector.size()) { if(configuration->getConfigValue(OPT_DEBUG)) revregx_error(result_vector); } */ } } else if(result_vector[i]==rnaw && i>0 && result_vector[i-1]!=bslash && !isinbracketi) { /* if(configuration->getConfigValue(OPT_DEBUG)) revregx_error(result_vector); */ } } repeat_remove2: tmp.clear(); isescapedi = false; //cout<<"start2: \n"; //print_vector(result_vector,0,result_vector.size()); wektor tmpwekt; for(int i=0;i process_signature(std::string str) { std::vector result_vector; try { result_vector=revregexn(str2vector(str)); result_vector=fill_specialchars(result_vector,0,result_vector.size()-1); result_vector=escape_hex(result_vector,0,result_vector.size()-1); } catch(...){ cout<<"Fatal error occured while processing signatures. Plz. open a github ticker for following regex:"<