// start pasring fnParseFile file (may include mesh,skeleton,animset,...) BOOL StartParser(CTString fnParseFile) { CTFileName fnFull; fnFull = _fnmApplicationPath + fnParseFile; yyin = NULL; astrText.PopAll(); astrText.Clear(); // initialize pre-parsing variables yyin = fopen(fnFull, "r"); // reset include depth ptr include_stack_ptr = 0; strCurentFileName = fnFull; _yy_iIndex = 0; _yy_jIndex = 0; _yy_iLine = 1; // load data try { if (yyin==NULL) { ThrowF_t("Cannot open file '%s'!", (const char*)fnParseFile ); } yyrestart(yyin); yyparse(); fclose(yyin); } // if an error in parsing occured catch(char *strError) { WarningMessage(strError); // AfxMessageBox(strError); theApp.ErrorMessage(strError); if(yyin!=NULL) fclose(yyin); return FALSE; } return TRUE; }
// load a filelist static BOOL LoadFileList(CDynamicStackArray<CTFileName> &afnm, const CTFileName &fnmList) { afnm.PopAll(); try { CTFileStream strm; strm.Open_t(fnmList); while(!strm.AtEOF()) { CTString strLine; strm.GetLine_t(strLine); strLine.TrimSpacesLeft(); strLine.TrimSpacesRight(); if (strLine!="") { afnm.Push() = strLine; } } return TRUE; } catch(char *strError) { CPrintF("%s\n", strError); return FALSE; } }
// make a list of all files in a directory ENGINE_API void MakeDirList( CDynamicStackArray<CTFileName> &afnmDir, const CTFileName &fnmDir, const CTString &strPattern, ULONG ulFlags) { afnmDir.PopAll(); BOOL bRecursive = ulFlags&DLI_RECURSIVE; BOOL bSearchCD = ulFlags&DLI_SEARCHCD; // make one temporary array CDynamicStackArray<CTFileName> afnm; if (_fnmMod!="") { FillDirList_internal(_fnmApplicationPath, afnm, fnmDir, strPattern, bRecursive, &_afnmBaseBrowseInc, &_afnmBaseBrowseExc); if (bSearchCD) { FillDirList_internal(_fnmCDPath, afnm, fnmDir, strPattern, bRecursive, &_afnmBaseBrowseInc, &_afnmBaseBrowseExc); } FillDirList_internal(_fnmApplicationPath+_fnmMod, afnm, fnmDir, strPattern, bRecursive, NULL, NULL); } else { FillDirList_internal(_fnmApplicationPath, afnm, fnmDir, strPattern, bRecursive, NULL, NULL); if (bSearchCD) { FillDirList_internal(_fnmCDPath, afnm, fnmDir, strPattern, bRecursive, NULL, NULL); } } // for each file in zip archives CTString strDirPattern = fnmDir; INDEX ctFilesInZips = UNZIPGetFileCount(); for(INDEX iFileInZip=0; iFileInZip<ctFilesInZips; iFileInZip++) { const CTFileName &fnm = UNZIPGetFileAtIndex(iFileInZip); // if not in this dir, skip it if (bRecursive) { if (!fnm.HasPrefix(strDirPattern)) { continue; } } else { if (fnm.FileDir()!=fnmDir) { continue; } } // if doesn't match pattern if (strPattern!="" && !fnm.Matches(strPattern)) { // skip it continue; } // if mod is active, and the file is not in mod if (_fnmMod!="" && !UNZIPIsFileAtIndexMod(iFileInZip)) { // if it doesn't match base browse path if ( !FileMatchesList(_afnmBaseBrowseInc, fnm) || FileMatchesList(_afnmBaseBrowseExc, fnm) ) { // skip it continue; } } // add that file afnm.Push() = fnm; } // if no files if (afnm.Count()==0) { // don't check for duplicates return; } // resort the array qsort(afnm.da_Pointers, afnm.Count(), sizeof(void*), qsort_CompareCTFileName); // for each file INDEX ctFiles = afnm.Count(); for (INDEX iFile=0; iFile<ctFiles; iFile++) { // if not same as last one if (iFile==0 || afnm[iFile]!=afnm[iFile-1]) { // copy over to final array afnmDir.Push() = afnm[iFile]; } } }