SC_GlobHandle* sc_Glob(const char* pattern) { SC_GlobHandle* glob = new SC_GlobHandle; #ifdef _WIN32 char patternWin[1024]; strncpy(patternWin, pattern, 1024); patternWin[1023] = 0; win32_ReplaceCharInString(patternWin, 1024, '/', '\\'); win32_ExtractContainingFolder(glob->mFolder, patternWin, PATH_MAX); glob->mHandle = ::FindFirstFile(patternWin, &glob->mEntry); if (glob->mHandle == INVALID_HANDLE_VALUE) { delete glob; return 0; } glob->mAtEnd = false; #else int flags = GLOB_MARK | GLOB_TILDE; #ifdef __APPLE__ flags |= GLOB_QUOTE; #endif int err = ::glob(pattern, flags, NULL, &glob->mHandle); if (err < 0) { delete glob; return 0; } glob->mEntry = 0; #endif return glob; }
int prFileOpen(struct VMGlobals *g, int numArgsPushed) { PyrSlot *a, *b, *c; char filename[PATH_MAX]; char mode[12]; PyrFile *pfile; FILE *file; a = g->sp - 2; b = g->sp - 1; c = g->sp; if (NotObj(c) || !isKindOf(slotRawObject(c), class_string) || NotObj(b) || !isKindOf(slotRawObject(b), class_string)) return errWrongType; if (slotRawObject(b)->size > PATH_MAX - 1) return errFailed; if (slotRawObject(c)->size > 11) return errFailed; pfile = (PyrFile*)slotRawObject(a); memcpy(filename, slotRawString(b)->s, slotRawObject(b)->size); filename[slotRawString(b)->size] = 0; memcpy(mode, slotRawString(c)->s, slotRawObject(c)->size); mode[slotRawString(c)->size] = 0; #ifdef SC_WIN32 win32_ReplaceCharInString(filename,PATH_MAX,'/','\\'); if(strcmp(mode,"w") == 0) strcpy(mode,"wb"); if(strcmp(mode,"r") == 0) strcpy(mode,"rb"); #endif //SC_WIN32 file = fopen(filename, mode); if (file) { SetPtr(&pfile->fileptr, file); SetTrue(a); } else { #ifdef SC_WIN32 // check if directory exisits // create a temporary file (somewhere) for a handle // the file is deleted automatically when closed if (sc_DirectoryExists(filename)) { int err; #ifdef _MSC_VER err = tmpfile_s(&file); if (!err) { SetPtr(&pfile->fileptr, file); SetTrue(a); return errNone; } #elif defined(__MINGW32__) file = tmpfile(); if (file) { SetPtr(&pfile->fileptr, file); SetTrue(a); return errNone; } #else #error compiler unsupported #endif } #endif SetNil(a); SetFalse(a); } return errNone; }