点击(此处)折叠或打开
- int stringmatchlen(const char *pattern, int patternLen, const char *string, int stringLen, int nocase)
-
{
-
while(patternLen) {
-
switch(pattern[0]) {
-
case '*':
-
while (pattern[1] == '*') {
-
pattern++;
-
patternLen--;
-
}
-
if (patternLen == 1)
-
return 1; /* match */
- while(stringLen) {
-
/*关于正则当中的'*',只管匹配其后的模式即可,只要有一次匹配,即可匹配,所以下面用了递归*/
-
if (stringmatchlen(pattern+1, patternLen-1,
-
string, stringLen, nocase))
-
return 1; /* match */
-
string++;
-
stringLen--;
-
}
-
return 0; /* no match */
-
break;
-
case '?':/* ?表示0次或者1次,直接跳过 */
-
if (stringLen == 0)
-
return 0; /* no match */
-
string++;
-
stringLen--;
-
break;
-
case '[':
-
{
-
int not, match;
-
-
pattern++;
-
patternLen--;
-
not = pattern[0] == '^';
-
if (not) {
-
pattern++;
-
patternLen--;
-
}
-
match = 0;
-
while(1) {/*方括号的话,最好在自己的内部完成是否匹配,所以这边用了死循环*/
-
if (pattern[0] == '\\' && patternLen >= 2) {
-
pattern++;
-
patternLen--;
-
if (pattern[0] == string[0])
-
match = 1;
-
}
-
else if (pattern[0] == ']') {
-
break;
-
}
-
else if (patternLen == 0) {
-
pattern--;
-
patternLen++;
-
break;
-
}
-
else if (pattern[1] == '-' && patternLen >= 3) {
-
int start = pattern[0];
-
int end = pattern[2];
-
int c = string[0];
-
if (start > end) {
-
int t = start;
-
start = end;
-
end = t;
-
}
-
if (nocase) {
-
start = tolower(start);
-
end = tolower(end);
-
c = tolower(c);
-
}
-
pattern += 2;
-
patternLen -= 2;
-
if (c >= start && c <= end)
-
match = 1;
-
}
-
else {
-
if (!nocase) {
-
if (pattern[0] == string[0])
-
match = 1;
-
} else {
-
if (tolower((int)pattern[0]) == tolower((int)string[0]))
-
match = 1;
-
}
-
}
-
pattern++;
-
patternLen--;
-
}
-
if (not)
-
match = !match;
-
if (!match)
-
return 0; /* no match */
-
string++;
-
stringLen--;
-
break;
-
}
-
case '\\':
-
if (patternLen >= 2) {
-
pattern++;
-
patternLen--;
-
}
-
/* fall through */
-
default:/*默认情况直接匹配*/
-
if (!nocase) {
-
if (pattern[0] != string[0])
-
return 0; /* no match */
-
} else {
-
if (tolower((int)pattern[0]) != tolower((int)string[0]))
-
return 0; /* no match */
-
}
-
string++;
-
stringLen--;
-
break;
-
}
-
pattern++;
-
patternLen--;
-
if (stringLen == 0) {
-
while(*pattern == '*') {
-
pattern++;
-
patternLen--;
-
}
-
break;
-
}
-
}
-
if (patternLen == 0 && stringLen == 0)
-
return 1;
-
return 0;
- }
点击(此处)折叠或打开
-
int ll2string(char *dst, size_t dstlen, long long svalue) {
-
static const char digits[201] =
-
"0001020304050607080910111213141516171819"
-
"2021222324252627282930313233343536373839"
-
"4041424344454647484950515253545556575859"
-
"6061626364656667686970717273747576777879"
-
"8081828384858687888990919293949596979899";
-
int negative;
-
unsigned long long value;
-
-
/* The main loop works with 64bit unsigned integers for simplicity, so
-
* we convert the number here and remember if it is negative. */
-
if (svalue < 0) {
-
if (svalue != LLONG_MIN) {
-
value = -svalue;
-
} else {
-
value = ((unsigned long long) LLONG_MAX)+1;
-
}
-
negative = 1;
-
} else {
-
value = svalue;
-
negative = 0;
-
}
-
-
/* Check length. */
-
uint32_t const length = digits10(value)+negative;
-
if (length >= dstlen) return 0;
-
-
/* Null term. */
-
uint32_t next = length;
-
dst[next] = '\0';
-
next--;
-
while (value >= 100) {
-
int const i = (value % 100) * 2;
-
value /= 100;
-
dst[next] = digits[i + 1];
-
dst[next - 1] = digits[i];
-
next -= 2;
-
}
-
-
/* Handle last 1-2 digits. */
-
if (value < 10) {
-
dst[next] = '0' + (uint32_t) value;
-
} else {
-
int i = (uint32_t) value * 2;
-
dst[next] = digits[i + 1];
-
dst[next - 1] = digits[i];
-
}
-
-
/* Add sign. */
-
if (negative) dst[0] = '-';
-
return length;
- }