164 lines
5.5 KiB
C
164 lines
5.5 KiB
C
|
|
||
|
#include <pcre.h>
|
||
|
|
||
|
#include "log.h"
|
||
|
#include "regex_table.h"
|
||
|
|
||
|
const char *g_regex_tbl[REGEX_MAX] = {
|
||
|
|
||
|
"^(([1-9]\\d{0,3})|([1-5]\\d{4})|(6[0-4]\\d{3})|(65[0-4]\\d{2})|(655[0-2]"
|
||
|
"\\d)|(6553[0-5]))$",
|
||
|
|
||
|
"^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?"
|
||
|
")(\\/(\\d|[1-2]\\d|3[0-2]))?$|^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d"
|
||
|
"|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1(["
|
||
|
"0-1]\\d|2[0-8]))))?$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]"
|
||
|
"?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]"
|
||
|
"\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|"
|
||
|
"2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]"
|
||
|
"?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:"
|
||
|
"){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?"
|
||
|
"\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}:"
|
||
|
"([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]"
|
||
|
"|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-"
|
||
|
"fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]"
|
||
|
"\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1"
|
||
|
",4}:){7}[\\da-fA-F]{1,4}(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^:((:["
|
||
|
"\\da-fA-F]{1,4}){1,6}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^[\\da-f"
|
||
|
"A-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8])"
|
||
|
")))?$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)(\\/([1-9]?\\d|"
|
||
|
"(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3"
|
||
|
"}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){4}((:["
|
||
|
"\\da-fA-F]{1,4}){1,2}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-"
|
||
|
"fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))"
|
||
|
"?$|^([\\da-fA-F]{1,4}:){6}:(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$",
|
||
|
|
||
|
"^(?:(?!0000)[0-9]{4}\\/(?:(?:0[1-9]|1[0-2])\\/(?:0[1-9]|1[0-9]|2[0-8])|("
|
||
|
"?:0[13-9]|1[0-2])\\/(?:29|30)|(?:0[13578]|1[02])\\/31)|(?:[0-9]{2}(?:0[48"
|
||
|
"]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\/02\\/29"
|
||
|
") (20|21|22|23|[0-1][0-9]):[0-5][0-9]$|^(20|21|22|23|[0-1][0-9]):[0-5][0-"
|
||
|
"9]$",
|
||
|
|
||
|
"^(20|21|22|23|[0-1][0-9]):[0-5][0-9]$",
|
||
|
};
|
||
|
|
||
|
int pcre_match(int regId, const char *pStr)
|
||
|
{
|
||
|
pcre *re;
|
||
|
pcre_extra *pcreExtra;
|
||
|
const char *error;
|
||
|
int ret, erroffset;
|
||
|
|
||
|
if(regId < 0 || regId > REGEX_MAX || !pStr) {
|
||
|
LOG_EX(LOG_Error, "Input params error: %d, %p\n", regId, pStr);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
re = pcre_compile(g_regex_tbl[regId], 0, &error, &erroffset, NULL);
|
||
|
|
||
|
if(!re) {
|
||
|
LOG_EX(LOG_Error, "pcre_compile error at %d: %s, %s\n", erroffset,
|
||
|
g_regex_tbl[regId], error);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
pcreExtra = pcre_study(re, 0, &error);
|
||
|
|
||
|
if(error != NULL) {
|
||
|
LOG_EX(LOG_Error, "pcre_study error: %s, %s\n", g_regex_tbl[regId], error);
|
||
|
pcre_free(re);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
ret = pcre_exec(re,
|
||
|
pcreExtra,
|
||
|
pStr,
|
||
|
strlen(pStr), // length of string
|
||
|
0, // Start looking at this point
|
||
|
0, // OPTIONS
|
||
|
NULL,
|
||
|
0); // Length of subStrVec
|
||
|
|
||
|
if(ret < 0) {
|
||
|
switch(ret) {
|
||
|
case PCRE_ERROR_NOMATCH :
|
||
|
LOG_EX(LOG_Error, "[%s] String did not match the pattern\n", pStr);
|
||
|
break;
|
||
|
|
||
|
case PCRE_ERROR_NULL :
|
||
|
LOG_EX(LOG_Error, "[%s] Something was null\n", pStr);
|
||
|
break;
|
||
|
|
||
|
case PCRE_ERROR_BADOPTION :
|
||
|
LOG_EX(LOG_Error, "[%s] A bad option was passed\n", pStr);
|
||
|
break;
|
||
|
|
||
|
case PCRE_ERROR_BADMAGIC :
|
||
|
LOG_EX(LOG_Error, "Magic number bad (compiled re corrupt?)\n");
|
||
|
break;
|
||
|
|
||
|
case PCRE_ERROR_UNKNOWN_NODE :
|
||
|
LOG_EX(LOG_Error, "[%s] Something kooky in the compiled re\n", pStr);
|
||
|
break;
|
||
|
|
||
|
case PCRE_ERROR_NOMEMORY :
|
||
|
LOG_EX(LOG_Error, "[%s] Ran out of memory\n", pStr);
|
||
|
break;
|
||
|
|
||
|
default :
|
||
|
LOG_EX(LOG_Error, "[%s] Unknown error\n", pStr);
|
||
|
break;
|
||
|
} /* end switch */
|
||
|
} else {
|
||
|
ret = TRUE;
|
||
|
}
|
||
|
|
||
|
pcre_free(re);
|
||
|
|
||
|
if(pcreExtra != NULL) {
|
||
|
#ifdef PCRE_CONFIG_JIT
|
||
|
pcre_free_study(pcreExtra);
|
||
|
#else
|
||
|
pcre_free(pcreExtra);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
int regex_match(const char *regex, const char *pStr)
|
||
|
{
|
||
|
int result = FALSE;
|
||
|
regex_t reg;
|
||
|
int regexInit;
|
||
|
|
||
|
if(!regex || !pStr) {
|
||
|
LOG_EX(LOG_Error, "Input params error: %p, %p\n", regex, pStr);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
regexInit = regcomp(®, regex, REG_EXTENDED);
|
||
|
|
||
|
if(regexInit) {
|
||
|
LOG_EX(LOG_Error, "regcomp error\n");
|
||
|
return FALSE;
|
||
|
} else {
|
||
|
int reti = regexec(®, pStr, 0, NULL, 0);
|
||
|
|
||
|
if(REG_NOERROR != reti) {
|
||
|
char buf[1024];
|
||
|
memset(buf, 0, 1024);
|
||
|
//Error print: match failed!
|
||
|
regerror(reti, regexInit, buf, 1024);
|
||
|
LOG_EX(LOG_Error, "%s match %s failed(%d): %s\n", regex, pStr, reti, buf);
|
||
|
} else {
|
||
|
//LOG_EX(LOG_Debug, "%s match %s OK\n", regex, pStr);
|
||
|
result = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
regfree(®);
|
||
|
return result;
|
||
|
}
|
||
|
#endif
|