BOOL DLLCALL isdir(const char *filename) { char path[MAX_PATH+1]; char* p; struct stat st; SAFECOPY(path,filename); p=lastchar(path); if(p!=path && IS_PATH_DELIM(*p)) { /* chop off trailing slash */ #if !defined(__unix__) if(*(p-1)!=':') /* Don't change C:\ to C: */ #endif *p=0; } #if defined(__BORLANDC__) && !defined(__unix__) /* stat() doesn't work right */ if(stat(path, &st)!=0 || strchr(path,'*')!=NULL || strchr(path,'?')!=NULL) #else if(stat(path, &st)!=0) #endif return(FALSE); return(S_ISDIR(st.st_mode) ? TRUE : FALSE); }
ulong DLLCALL delfiles(const char *inpath, const char *spec) { char *path; char lastch; uint i,files=0; glob_t g; size_t inpath_len=strlen(inpath); if(inpath_len==0) lastch=0; else lastch=inpath[inpath_len-1]; path=(char *)malloc(inpath_len+1/*Delim*/+strlen(spec)+1/*Terminator*/); if(path==NULL) return 0; if(!IS_PATH_DELIM(lastch) && lastch) sprintf(path,"%s%c",inpath,PATH_DELIM); else strcpy(path,inpath); strcat(path,spec); glob(path,0,NULL,&g); free(path); for(i=0;i<g.gl_pathc;i++) { if(isdir(g.gl_pathv[i])) continue; CHMOD(g.gl_pathv[i],S_IWRITE); /* Incase it's been marked RDONLY */ if(remove(g.gl_pathv[i])==0) files++; } globfree(&g); return(files); }
char* backslashcolon(char *str) { int i; i=strlen(str); if(i && !IS_PATH_DELIM(str[i-1]) && str[i-1]!=':') { str[i]=PATH_DELIM; str[i+1]=0; } return str; }
BOOL DLLCALL wildmatch(const char *fname, const char *spec, BOOL path) { char *specp; char *fnamep; char *wildend; specp=(char *)spec; fnamep=(char *)fname; for(;;specp++, fnamep++) { switch(*specp) { case '?': if(!(*fnamep)) return(FALSE); break; case 0: if(!*fnamep) return(TRUE); break; case '*': while(*specp=='*') specp++; if(path) { for(wildend=fnamep; *wildend; wildend++) { if(IS_PATH_DELIM(*wildend)) { wildend--; break; } } } else wildend=strchr(fnamep, 0); for(;wildend >= fnamep;wildend--) { if(wildmatch(wildend, specp, path)) return(TRUE); } return(FALSE); default: if(*specp != *fnamep) return(FALSE); } if(!(*specp && *fnamep)) break; } while(*specp=='*') specp++; if(*specp==*fnamep) return(TRUE); return(FALSE); }
char* DLLCALL backslash(char* path) { char* p; p=lastchar(path); if(*p && !IS_PATH_DELIM(*p)) { #if defined(__unix__) /* Convert trailing backslash to forwardslash on *nix */ if(*p!='\\') #endif p++; *p=PATH_DELIM; *(++p)=0; } return(path); }
BOOL DLLCALL wildmatch(const char *fname, const char *spec, BOOL path) { char *specp; char *fnamep; specp=(char *)spec; fnamep=(char *)fname; for(;;specp++, fnamep++) { switch(*specp) { case '?': if(!(*fnamep)) return(FALSE); break; case 0: if(!*fnamep) return(TRUE); break; case '*': while(*specp=='*') specp++; for(;*fnamep!=*specp && *fnamep;fnamep++) { if(path && IS_PATH_DELIM(*fnamep)) return(FALSE); } default: if(*specp != *fnamep) return(FALSE); } if(!(*specp && *fnamep)) break; } while(*specp=='*') specp++; if(*specp==*fnamep) return(TRUE); return(FALSE); }
ulong DLLCALL delfiles(const char *inpath, const char *spec) { char path[MAX_PATH+1]; char lastch; uint i,files=0; glob_t g; lastch=*lastchar(inpath); if(!IS_PATH_DELIM(lastch) && lastch) sprintf(path,"%s%c",inpath,PATH_DELIM); else strcpy(path,inpath); strcat(path,spec); glob(path,0,NULL,&g); for(i=0;i<g.gl_pathc;i++) { if(isdir(g.gl_pathv[i])) continue; CHMOD(g.gl_pathv[i],S_IWRITE); /* Incase it's been marked RDONLY */ if(remove(g.gl_pathv[i])==0) files++; } globfree(&g); return(files); }