2009 07 19 15 29 [c] wildcard support

最近有需要用到wildcard,

所以就來看一下wildcard的suport。

但是往往是support unix版的wildcard,

或者應該說M$所 support 的wildcard 比較奇怪。

因為當你用 "*.*" 比對時,

它會不管你有沒有".",

直接當成 "*" 在比對,

例如:

"t*.*" -> 要找 prefix 是 "t"

在unix下,通常會比對到的是prefix 是 t ,

而且中間一定要有一個 "." 。

在windows則只需要prefix是 "t" 就會比對到了。

 

在codeproject上,

wildcard 比對的原始碼

我改了一點點,

讓這個 wildcard support 可以符合 M$ 的 wildcard 。

原始碼如下:


#include <stdio.h>
#include <stdlib.h>


int wildcmp(const char *wild, const char *string) {
// Written by Jack Handy - jakkhandy@hotmail.com

const char *cp = NULL, *mp = NULL;

while ((*string) && (*wild != '*')) {
if ((*wild != *string) && (*wild != '?')) {
return 0;
}
wild++;
string++;
}

while (*string) {
if (*wild == '*') {
if (!*++wild) {
return 1;
}
mp = wild;
cp = string+1;
} else if ((*wild == *string) || (*wild == '?')) {
wild++;
string++;
} else {
wild = mp;
string = cp++;
}
}
// modified by porpoise
if (mp == wild && *wild == '.' && *(wild+1) == '*') {
do {
wild+=2;
} while (*wild == '.' && *(wild+1) == '*');
}

while (*wild == '*') {
wild++;
}
return !*wild;
}


int main()
{
char *wild = "w*.*.*.*.*";
char *string ="wtest";
int rc;
rc = wildcmp(wild, string);
printf("wildcmp(%s,%s)=%d\n",wild, string,rc);
return 0;
}