Line data Source code
1 : #include "burp.h"
2 : #include "pathcmp.h"
3 :
4 : // Return a number indicating the number of directories matched.
5 : // 0 if it is not a sub-directory.
6 : // Two paths the same counts as a subdirectory.
7 222 : int is_subdir(const char *dir, const char *sub)
8 : {
9 222 : int count=1;
10 222 : const char *d=NULL;
11 222 : const char *s=NULL;
12 222 : const char *dl=NULL;
13 222 : const char *sl=NULL;
14 222 : if(!sub || !dir) return 0;
15 8746 : for(s=sl=sub, dl=d=dir; *s && *d; s++, d++)
16 : {
17 8556 : if(*s!=*d) break;
18 8527 : sl=s;
19 8527 : dl=d;
20 8527 : if(*s=='/') count++;
21 : }
22 219 : if(!*d && !*s) return count; // Paths were exactly the same.
23 194 : if(!*d && *s=='/')
24 128 : return count; // 'dir' ended without a slash, for example:
25 : // dir=/bin sub=/bin/bash
26 66 : if(*dl=='/' && *sl=='/' && *(sl+1) && !*(dl+1)) return count;
27 63 : return 0;
28 : }
29 :
30 266026 : int pathcmp(const char *a, const char *b)
31 : {
32 266026 : const char *x=NULL;
33 266026 : const char *y=NULL;
34 266026 : if(!a && !b) return 0; // equal
35 188301 : if( a && !b) return 1; // a is longer
36 186214 : if(!a && b) return -1; // b is longer
37 7684947 : for(x=a, y=b; *x && *y ; x++, y++)
38 : {
39 7618135 : if(*x==*y) continue;
40 119401 : if(*x=='/' && *y!='/') return -1;
41 119401 : if(*x!='/' && *y=='/') return 1;
42 119400 : if(*x<*y) return -1;
43 63412 : if(*x>*y) return 1;
44 : }
45 66812 : if(!*x && !*y) return 0; // equal
46 114 : if( *x && !*y) return 1; // x is longer
47 6 : return -1; // y is longer
48 : }
|