| 237 | bool matchPath(const char *str, const char *pat) { |
| 238 | assert(str); |
| 239 | assert(pat); |
| 240 | |
| 241 | const char *p = 0; |
| 242 | const char *q = 0; |
| 243 | |
| 244 | for (;;) { |
| 245 | if (*str == '/') { |
| 246 | p = 0; |
| 247 | q = 0; |
| 248 | } |
| 249 | |
| 250 | switch (*pat) { |
| 251 | case '*': |
| 252 | // Record pattern / string possition for backtracking |
| 253 | p = ++pat; |
| 254 | q = str; |
| 255 | // If pattern ended with * -> match |
| 256 | if (!*pat) |
| 257 | return true; |
| 258 | break; |
| 259 | |
| 260 | default: |
| 261 | if (*pat != *str) { |
| 262 | if (p) { |
| 263 | // No match, oops -> try to backtrack |
| 264 | pat = p; |
| 265 | str = ++q; |
| 266 | if (!*str) |
| 267 | return !*pat; |
| 268 | break; |
| 269 | } |
| 270 | else |
| 271 | return false; |
| 272 | } |
| 273 | if (!*str) |
| 274 | return !*pat; |
| 275 | pat++; |
| 276 | str++; |
| 277 | break; |
| 278 | |
| 279 | case '?': |
| 280 | if (!*str || *str == '/') |
| 281 | return !*pat; |
| 282 | pat++; |
| 283 | str++; |
| 284 | } |
| 285 | } |
| 286 | } |
| 287 | |