wxString wxsCoder::GetFullCode(const wxString& FileName,wxFontEncoding& Encoding,bool &UseBOM) { wxMutexLocker Lock(DataMutex); wxString FixedFileName = NormalizeFileName(FileName); FlushFile(FixedFileName); // Checking if editor is opened EditorManager* EM = Manager::Get()->GetEditorManager(); assert ( EM != 0 ); cbEditor* Editor = EM->GetBuiltinEditor(FixedFileName); if ( Editor ) { Encoding = Editor->GetEncoding(); UseBOM = Editor->GetUseBom(); cbStyledTextCtrl* Ctrl = Editor->GetControl(); return Ctrl->GetText(); } else { EncodingDetector Detector(FixedFileName); Encoding = Detector.GetFontEncoding(); UseBOM = Detector.GetBOMSizeInBytes() > 0; return Detector.IsOK() ? Detector.GetWxStr() : _T(""); } }
static void test_filename ( int argc, char ** argv ) { int i; char buf[PATH_MAX]; for ( i = 1; i < argc; i++ ) { NormalizeFileName(buf,buf+sizeof(buf),argv[i],true); printf("%s -> %s\n",argv[i],buf); } }
void wxsCoder::AddCode(const wxString& FileName,const wxString& Header,const wxString& End,const wxString& Code,bool Immediately,bool CodeHasHeader,bool CodeHasEnd) { wxMutexLocker Lock(DataMutex); wxString FixedFileName = NormalizeFileName(FileName); if ( FixedFileName.IsEmpty() ) { return; } // Find changing file int Index = CodeChangesFiles.Index(FileName); if ( Index==wxNOT_FOUND ) { Index = CodeChangesFiles.Count(); CodeChangesFiles.Add(FileName); CodeChanges.Add(0); } // Add entry to list of waiting changes CodeChange* Change = new CodeChange; Change->Header = Header; Change->End = End; Change->Code = Code; Change->CodeHasHeader = CodeHasHeader; Change->CodeHasEnd = CodeHasEnd; Change->Next = CodeChanges[Index]; CodeChanges[Index] = Change; // If the change has already been put onto queue, delete it for ( CodeChange *Prev=Change, *This=Prev->Next; This; Prev=This, This=This->Next ) { if ( This->Header==Header && This->End==End ) { Prev->Next = This->Next; delete This; This = Prev; } } if ( Immediately ) { FlushFile(FixedFileName); } }
void wxsCoder::PutFullCode(const wxString& FileName,const wxString& Code,wxFontEncoding Encoding,bool UseBOM) { wxMutexLocker Lock(DataMutex); wxString FixedFileName = NormalizeFileName(FileName); int Index = CodeChangesFiles.Index(FixedFileName); if ( Index != wxNOT_FOUND ) { for ( CodeChange* Change=CodeChanges[Index]; Change; ) { CodeChange* Next = Change->Next; delete Change; Change = Next; } CodeChanges[Index] = 0; } // Searching for file in opened file list EditorManager* EM = Manager::Get()->GetEditorManager(); assert ( EM != 0 ); cbEditor* Editor = EM->GetBuiltinEditor(FixedFileName); if ( Editor ) { Editor->GetControl()->SetText(Code); } else { if ( !cbSaveToFile(FixedFileName,Code,Encoding,UseBOM) ) { #if wxCHECK_VERSION(2, 9, 0) Manager::Get()->GetLogManager()->Log(F(_("wxSmith: Couldn't write file '%s'"),FixedFileName.wx_str())); #else Manager::Get()->GetLogManager()->Log(F(_("wxSmith: Couldn't write file '%s'"),FixedFileName.c_str())); #endif } } }
void wxFileHistoryBase::AddFileToHistory(const wxString& file) { // Check if we don't already have this file. Notice that we avoid // wxFileName::operator==(wxString) here as it converts the string to // wxFileName and then normalizes it using all normalizations which is too // slow (see the comment above), so we use our own quick normalization // functions and a string comparison. const wxFileName fnNew(file); const wxString newFile = NormalizeFileName(fnNew); size_t i, numFiles = m_fileHistory.size(); #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( i = 0; i < numFiles; i++ ) { if ( newFile == NormalizeFileName(m_fileHistory[i]) ) { // we do have it, move it to the top of the history RemoveFileFromHistory(i); numFiles--; break; } } // if we already have a full history, delete the one at the end if ( numFiles == m_fileMaxFiles ) { RemoveFileFromHistory(--numFiles); } // add a new menu item to all file menus (they will be updated below) #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( wxList::compatibility_iterator node = m_fileMenus.GetFirst(); node; node = node->GetNext() ) { wxMenu * const menu = (wxMenu *)node->GetData(); if ( !numFiles && menu->GetMenuItemCount() ) menu->AppendSeparator(); // label doesn't matter, it will be set below anyhow, but it can't // be empty (this is supposed to indicate a stock item) menu->Append(m_idBase + numFiles, " "); } // insert the new file in the beginning of the file history m_fileHistory.insert(m_fileHistory.begin(), file); numFiles++; // update the labels in all menus #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( i = 0; i < numFiles; i++ ) { // if in same directory just show the filename; otherwise the full path const wxFileName fnOld(m_fileHistory[i]); wxString pathInMenu; if ( (fnOld.GetPath() == fnNew.GetPath()) && fnOld.HasName() ) { pathInMenu = fnOld.GetFullName(); } else // file in different directory or it's not a file but a directory { // absolute path; could also set relative path pathInMenu = m_fileHistory[i]; } #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( wxList::compatibility_iterator node = m_fileMenus.GetFirst(); node; node = node->GetNext() ) { wxMenu * const menu = (wxMenu *)node->GetData(); menu->SetLabel(m_idBase + i, GetMRUEntryLabel(i, pathInMenu)); } } }
/* * Normalize a path for the conventions on the output filesystem. This * adds optional file type preservation. * * The path from the archive is in "pPathProposal". Thew new pathname * will be placed in the "new pathname" section of "pPathProposal". * * The new pathname may be shorter (because characters were removed) or * longer (if we add a "#XXYYYYZ" extension or replace chars with '%' codes). * * This returns the new pathname, which is held in NulibState's temporary * pathname buffer. */ const char* NormalizePath(NulibState* pState, NuPathnameProposal* pPathProposal) { NuError err = kNuErrNone; char* pathBuf; const char* startp; const char* endp; char* dstp; char localFssep; int newBufLen; Assert(pState != NULL); Assert(pPathProposal != NULL); Assert(pPathProposal->pathnameUNI != NULL); localFssep = NState_GetSystemPathSeparator(pState); /* * Set up temporary buffer space. The maximum possible expansion * requires converting all chars to '%' codes and adding the longest * possible preservation string. */ newBufLen = strlen(pPathProposal->pathnameUNI)*3 + kMaxPathGrowth +1; NState_SetTempPathnameLen(pState, newBufLen); pathBuf = NState_GetTempPathnameBuf(pState); Assert(pathBuf != NULL); if (pathBuf == NULL) return NULL; startp = pPathProposal->pathnameUNI; dstp = pathBuf; while (*startp == pPathProposal->filenameSeparator) { /* ignore leading path sep; always extract to current dir */ startp++; } /* normalize all directory components and the filename component */ while (startp != NULL) { endp = strchr(startp, pPathProposal->filenameSeparator); if (endp != NULL) { /* normalize directory component */ err = NormalizeDirectoryName(pState, startp, endp - startp, pPathProposal->filenameSeparator, &dstp, NState_GetTempPathnameLen(pState)); if (err != kNuErrNone) goto bail; *dstp++ = localFssep; startp = endp +1; } else { /* normalize filename */ err = NormalizeFileName(pState, startp, strlen(startp), pPathProposal->filenameSeparator, &dstp, NState_GetTempPathnameLen(pState)); if (err != kNuErrNone) goto bail; /* add/replace extension if necessary */ *dstp++ = '\0'; if (NState_GetModPreserveType(pState)) { AddPreservationString(pState, pPathProposal, pathBuf); } else if (NuGetThreadID(pPathProposal->pThread) == kNuThreadIDRsrcFork) { #ifndef HAS_RESOURCE_FORKS /* add this in lieu of the preservation extension */ strcat(pathBuf, kResourceStr); #endif } startp = NULL; /* we're done */ } } pPathProposal->newPathnameUNI = pathBuf; pPathProposal->newFilenameSeparator = localFssep; /* check for overflow */ Assert(dstp - pathBuf <= newBufLen); /* * If "junk paths" is set, drop everything but the last component. */ if (NState_GetModJunkPaths(pState)) { char* lastFssep; lastFssep = strrchr(pathBuf, localFssep); if (lastFssep != NULL) { Assert(*(lastFssep+1) != '\0'); /* should already have been caught*/ memmove(pathBuf, lastFssep+1, strlen(lastFssep+1)+1); } } bail: if (err != kNuErrNone) return NULL; return pathBuf; }
wxString wxsCoder::GetCode(const wxString& FileName,const wxString& Header,const wxString& End,bool IncludeHeader,bool IncludeEnd) { wxMutexLocker Lock(DataMutex); wxString FixedFileName = NormalizeFileName(FileName); FlushFile(FixedFileName); int TabSize = Manager::Get()->GetConfigManager(_T("editor"))->ReadInt(_T("/tab_size"), 4); // Checking if editor is opened EditorManager* EM = Manager::Get()->GetEditorManager(); assert ( EM != 0 ); cbEditor* Editor = EM->GetBuiltinEditor(FixedFileName); if ( Editor ) { cbStyledTextCtrl* Ctrl = Editor->GetControl(); Ctrl->SetSearchFlags(wxSCI_FIND_MATCHCASE); Ctrl->SetTargetStart(0); Ctrl->SetTargetEnd(Ctrl->GetLength()); int Position = Ctrl->SearchInTarget(Header); if ( Position == -1 ) return _T(""); // Counting number of indentation spaces which will be removed at // the beginning of each line int SpacesCut = 0; int SpacesPos = Position; while ( --SpacesPos >= 0 ) { wxChar ch = Ctrl->GetCharAt(SpacesPos); if ( ch == _T('\t') ) SpacesCut += TabSize; else if ( (ch==_T('\n')) || (ch==_T('\r')) ) break; else SpacesCut++; } Ctrl->SetTargetStart(Position); Ctrl->SetTargetEnd(Ctrl->GetLength()); int EndPosition = Ctrl->SearchInTarget(End); if ( EndPosition == -1 ) return _T(""); // Fixing up positions to include / exclude header and/or ending sequence if ( !IncludeHeader ) Position += Header.Length(); if ( IncludeEnd ) EndPosition += End.Length(); return CutSpaces(Ctrl->GetTextRange(Position,EndPosition),SpacesCut); } else { EncodingDetector Detector(FixedFileName); if ( !Detector.IsOK() ) return _T(""); wxString Content = Detector.GetWxStr(); int Position = Content.First(Header); if ( Position == -1 ) return _T(""); int SpacesCut = 0; int SpacesPos = Position; while ( --SpacesPos >= 0 ) { wxChar ch = Content.GetChar(SpacesPos); if ( ch == _T('\t') ) SpacesCut += TabSize; else if ( (ch==_T('\n')) || (ch==_T('\r')) ) break; else SpacesCut++; } if ( !IncludeHeader ) Position += Header.Length(); Content.Remove(0,Position); int EndPosition = Content.First(End); if ( EndPosition == -1 ) return _T(""); if ( IncludeEnd ) EndPosition += End.Length(); Content.Remove(EndPosition); return CutSpaces(Content,SpacesCut); } }