char *sc_StandardizePath(const char *path, char *newpath2) { char newpath1[MAXPATHLEN]; newpath1[0] = '\0'; newpath2[0] = '\0'; size_t pathLen = strlen(path); if ((pathLen >= 2) && (path[0] == '~') && ((path[1] == '/') || (path[1] == '\\'))) { char home[PATH_MAX]; sc_GetUserHomeDirectory(home, PATH_MAX); if (home != 0) { if ((pathLen - 1 + strlen(home)) >= MAXPATHLEN) { return 0; } strcpy(newpath1, home); strcat(newpath1, path + 1); } else { if (pathLen >= MAXPATHLEN) { return 0; } strcpy(newpath1, path); newpath1[0] = '.'; } } else { if (pathLen >= MAXPATHLEN) { return 0; } strcpy(newpath1, path); } bool isAlias = false; if(sc_ResolveIfAlias(newpath1, newpath2, isAlias, PATH_MAX)!=0) { strcpy(newpath2, newpath1); } return newpath2; }
int prFileRealPath(struct VMGlobals* g, int numArgsPushed ) { PyrSlot *a = g->sp - 1, *b = g->sp; char ipath[PATH_MAX]; char opath[PATH_MAX]; int err; err = slotStrVal(b, ipath, PATH_MAX); if (err) return err; bool isAlias = false; if(sc_ResolveIfAlias(ipath, opath, isAlias, PATH_MAX)!=0) { return errFailed; } boost::system::error_code error_code; boost::filesystem::path p = boost::filesystem::canonical(opath,error_code); if(error_code) { SetNil(a); return errNone; } strcpy(opath,p.string().c_str()); #if SC_DARWIN CFStringRef cfstring = CFStringCreateWithCString(NULL, opath, kCFStringEncodingUTF8); err = !CFStringGetFileSystemRepresentation(cfstring, opath, PATH_MAX); CFRelease(cfstring); if (err) return errFailed; #endif // SC_DARWIN PyrString* pyrString = newPyrString(g->gc, opath, 0, true); SetObject(a, pyrString); return errNone; }
// sekhar's replacement bool passOne_ProcessOneFile(const char * filenamearg, int level) { bool success = true; bool isAlias = false; char filename[MAXPATHLEN]; int status = sc_ResolveIfAlias(filenamearg, filename, isAlias, MAXPATHLEN); if (status<0) { printf("WARNING: skipping invalid symbolic link: %s\n", filenamearg); return success; } if (gLanguageConfig && gLanguageConfig->pathIsExcluded(filename)) { post("\texcluding file: '%s'\n", filename); return success; } if (isValidSourceFileName(filename)) { gNumCompiledFiles++; PyrSymbol * fileSym = getsym(filename); fileSym->u.source = NULL; if (startLexer(fileSym, -1, -1, -1)) { while (parseOneClass(fileSym)) { }; finiLexer(); } else { error("file '%s' open failed\n", filename); success = false; } } else { if (sc_DirectoryExists(filename)) success = passOne_ProcessDir(filename, level); } return success; }
bool sc_ReadDir(SC_DirHandle* dir, const char* dirname, char* path, bool& skipEntry) { #ifdef _WIN32 bool success = true; if (dir->mAtEnd) return false; const char* entry = dir->mEntry.cFileName; if (sc_IsSpecialDirectory(entry) || (skipEntry && sc_SkipDirectory(entry))) { skipEntry = true; success = true; } else { skipEntry = false; success = true; } char entrypathname[PATH_MAX]; strncpy(entrypathname, dirname, PATH_MAX); sc_AppendToPath(entrypathname, PATH_MAX, dir->mEntry.cFileName); bool isAlias = false; sc_ResolveIfAlias(entrypathname, path, isAlias, PATH_MAX); if (!::FindNextFile(dir->mHandle, &dir->mEntry)) { dir->mAtEnd = true; } return true; #else if (!dir->mHandle) return false; dir->mEntry = readdir(dir->mHandle); if (!dir->mEntry) return false; const char* entry = dir->mEntry->d_name; if (sc_IsSpecialDirectory(entry) || (skipEntry && sc_SkipDirectory(entry))) { skipEntry = true; return true; } else { skipEntry = false; } // construct path from dir entry char entrypathname[PATH_MAX]; strncpy(entrypathname, dirname, PATH_MAX); sc_AppendToPath(entrypathname, PATH_MAX, dir->mEntry->d_name); // resolve path bool isAlias = false; if (sc_ResolveIfAlias(entrypathname, path, isAlias, strlen(entrypathname))<0) { skipEntry = true; } return true; #endif }