#include #include #include void chist(char * str) { char v[2000],*m,*p; m=str; while (*m!='\0') { if ((*m=='/') && (*(m+1)=='/')) { strcpy(v,m+1); strcpy(m,v); } else m++; } m=str; while (*m!='\0') { if ((*m=='/') && (*(m+1)=='.') && (*(m+2)=='/')) { strcpy(v,m+2); strcpy(m,v); } else m++; } if ((*(m-1)=='.') && (*(m-2)=='/')) { strcpy(v,m); strcpy(m-1,v); } } void ana (char * str, const char * d, const char * t) { char v[2000],*m,*p; if (*str=='.') { strcpy(v,str+1); strcpy(str,t); strcat(str,v); } if (*str=='~') { strcpy(v,str+1); strcpy(str,d); strcat(str,v); } chist(str) ; m=str; while (*m!='\0') { if ((*(m)=='/') && (*(m+1)=='.') && (*(m+2)=='.') && ((*(m+3)=='/') || (*(m+3)=='\0'))) { if (m!=str) { p=m-1; while (*p!='/') p--; p++; } else p=m; strcpy(v,m+3); strcpy(p,v); chist(str); m=str; } else m++; } /* printf("\n%s\n",str); */ m=str; while (*m!='\0') m++; m--; if ((*m=='/') && (m!=str)) *m='\0'; } void vvod (char * s) { char c; do { c=getchar(); if (c!='\n') {*s=c; s++;} } while (c!='\n'); *s='\0'; } int prover (char * s) { char *v=s; if (*s=='/') s++; else return 0; while ((*s!='/') && (*s!='.') && (*s!='\0')) s++; if ((*s=='/') && (s==(v+1))) return 0; if (*s=='/') return prover(s); if (*s=='.') return 0; return(1); } int main (void) { int i=0,j=0; char c,*le,d[200],t[200],s[2000],l[2000],e1[]={"1 or more of strings are void"},e2[]={"Home dir is bad"},e3[]={"Tmp dir is bad"}; le=l; vvod(d); vvod(t); vvod(s); vvod(l); if ((*d=='\0') || (*t=='\0') || (*s=='\0') || (*l=='\0')) { printf("ERROR"); fprintf(stderr, e1); } else if((*d)!='/') { printf("ERROR"); fprintf(stderr, e2); } else if((*t)!='/') { printf("ERROR"); fprintf(stderr, e3); } else { ana(d,d,t); ana(t,d,t); ana(s,d,t); ana(l,d,t); /* printf("%s\n%s\n",s,l); */ if ((strstr(s,l)==s) && (strlen(s)==strlen(l))) printf("YES"); else printf("NO"); } return 0; }