void fillFnam(char *dest, const char * const pattern , const char * const fnam) { #if 0 char *dr, *pa, *fn, *ex; char *pfn, *pex; #else char dr[MAXDRIVE], pa[MAXDIR], fn[MAXFILE], ex[MAXEXT], pfn[MAXFILE], pex[MAXEXT]; #endif char dfn[MAXFILE], dex[MAXEXT]; assert(fnam); assert(pattern); if(strchr(pattern, '?') == 0 && strchr(pattern, '*') == 0) #if 0 return strdup(pattern); #else strcpy(dest, pattern); #endif #if 0 if(!dfnsplit(pattern, &dr, &pa, &fn, &ex)) return 0; if(!dfnsplit(fnam, 0, 0, &pfn, &pex)) { free(fn); free(ex); free(dr); free(pa); return 0; } #else myfnsplit(pattern, dr, pa, fn, ex); myfnsplit(fnam, 0, 0, pfn, pex); #endif fillComp(dfn, fn, pfn, MAXFILE); fillComp(dex, ex, pex, MAXEXT); #if 0 p = dfnmerge(0, dr, pa, dfn, dex); #else myfnmerge(dest, dr, pa, dfn, dex); #endif #if 0 free(pfn); free(pex); free(dr); free(pa); free(fn); free(ex); return p; #endif }
int copyFiles(struct CopySource *h) { char *fnam, *ext, *dst; int differ, rc; if(destIsDir) { if(!dfnsplit(h->fnam, 0, 0, &fnam, &ext)) { error_out_of_memory(); return 0; } dst = dfnmerge(0, 0, destFile, fnam, ext); free(fnam); free(ext); if(!dst) { error_out_of_memory(); return 0; } } else dst = destFile; rc = 0; if((differ = samefile(h->fnam, dst)) < 0) error_out_of_memory(); else if(!differ) rc = copy(dst, h->fnam, h, 'w'); else if(h->app) rc = copy(dst, h->fnam, h->app, 'a'); else error_selfcopy(dst); if(destIsDir) free(dst); return rc; }
char *fillFnam(const char * const pattern , const char * const fnam) { char *dr, *pa, *fn, *ex; char *pfn, *pex; char dfn[MAXFILE], dex[MAXEXT]; char *p; assert(fnam); assert(pattern); if(strchr(pattern, '?') == 0 && strchr(pattern, '*') == 0) return strdup(pattern); if(!dfnsplit(pattern, &dr, &pa, &fn, &ex)) return 0; if(!dfnsplit(fnam, 0, 0, &pfn, &pex)) { free(fn); free(ex); free(dr); free(pa); return 0; } fillComp(dfn, fn, pfn, MAXFILE); fillComp(dex, ex, pex, MAXEXT); p = dfnmerge(0, dr, pa, dfn, dex); free(pfn); free(pex); free(dr); free(pa); free(fn); free(ex); return p; }
char *dfnexpand(const char * const fnam, char * const path) { char *h, *p; /* intermediate pointers */ char *dr, *pa, *na, *ex; /* filename components */ char pathDr, *pathPa; /* drive & path of 'path' */ char *dynPath; #ifdef SUPPORT_UNC_PATH DBG_ENTER("dfnuexpand", Suppl_dfn) #else DBG_ENTER("dfnexpand", Suppl_dfn) #endif assert(fnam); DBG_ARGUMENTS( ("fnam=\"%s\", path=\"%s\"", fnam, path) ) chkHeap if((h = dfnsqueeze(fnam)) == 0) DBG_RETURN_S( 0) #ifdef SUPPORT_UNC_PATH if(isUNCpath(h)) { /* UNC paths are always fully-qualified */ /* check if the trailing '\\' is present to mark the root direc */ DBG_RETURN_BS((*UNCpath(h) != '\\')? StrAppChr(h, '\\') : h) } #endif chkHeap if(!*h || h[1] != ':' || h[2] != '\\') { /* the spec is not fully-qualified or completely empty */ pathDr = 0; dynPath = 0; if((pathPa = path) != 0 && *pathPa) { if(pathPa[1] == ':') { /* path[] has drive spec */ pathDr = *path; if(!*(pathPa += 2)) { pathPa = 0; goto noPath; } } if(dfndelim(*pathPa) && !pathPa[1]) ++pathPa; /* Trans "/" || "\\" --> "" */ noPath:; } chkHeap if(dfnsplit(h, &dr, &pa, &na, &ex)) { StrFree(h); if(dr) { /* drive specified */ if(pathDr && toFUpper(pathDr) != *dr) /* The specified path is for a different drive */ pathPa = 0; } else { /* drive spec missing */ if((dr = StrChar(pathDr? pathDr: 'A' + getdisk())) == 0) goto errRet; } if(!pa || *pa != '\\' && *pa != NUL) { /* no path or a relative one */ if(!pathPa) { /* path has no path spec in it */ if((dynPath = dfnpath(*dr)) == 0) goto errRet; pathPa = dynPath + 2; } if((p = dfnmerge(0, 0, pathPa, pa, 0)) == 0) goto errRet; StrRepl(pa, p); } h = dfnmerge(0, dr, pa, na, ex); } else StrFree(h); errRet: chkHeap free(dr); free(pa); free(na); free(ex); free(dynPath); }