bool wxTextFile::OnWrite(wxTextFileType typeNew, const wxMBConv& conv) { wxFileName fn = m_strBufferName; // We do NOT want wxPATH_NORM_CASE here, or the case will not // be preserved. if ( !fn.IsAbsolute() ) fn.Normalize(wxPATH_NORM_ENV_VARS | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_ABSOLUTE | wxPATH_NORM_LONG); wxTempFile fileTmp(fn.GetFullPath()); if ( !fileTmp.IsOpened() ) { wxLogError(_("can't write buffer '%s' to disk."), m_strBufferName.c_str()); return false; } size_t nCount = GetLineCount(); for ( size_t n = 0; n < nCount; n++ ) { fileTmp.Write(GetLine(n) + GetEOL(typeNew == wxTextFileType_None ? GetLineType(n) : typeNew), conv); } // replace the old file with this one return fileTmp.Commit(); }
wxString wxTextBuffer::Translate(const wxString& text, wxTextFileType type) { // don't do anything if there is nothing to do if ( type == wxTextFileType_None ) return text; // nor if it is empty if ( text.empty() ) return text; wxString eol = GetEOL(type), result; // optimization: we know that the length of the new string will be about // the same as the length of the old one, so prealloc memory to aviod // unnecessary relocations result.Alloc(text.Len()); wxChar chLast = 0; for ( const wxChar *pc = text.c_str(); *pc; pc++ ) { wxChar ch = *pc; switch ( ch ) { case _T('\n'): // Dos/Unix line termination result += eol; chLast = 0; break; case _T('\r'): if ( chLast == _T('\r') ) { // Mac empty line result += eol; } else { // just remember it: we don't know whether it is just "\r" // or "\r\n" yet chLast = _T('\r'); } break; default: if ( chLast == _T('\r') ) { // Mac line termination result += eol; // reset chLast to avoid inserting another eol before the // next character chLast = 0; } // add to the current line result += ch; } } if ( chLast ) { // trailing '\r' result += eol; } return result; }
wxExSTCShell::wxExSTCShell( wxWindow* parent, const wxString& prompt, const wxString& command_end, bool echo, int commands_save_in_config, const wxString& lexer, long menu_flags, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxExSTC( parent, wxEmptyString, STC_WIN_NO_INDICATOR, wxEmptyString, // title menu_flags, id, pos, size, style) , m_Command(wxEmptyString) , m_CommandEnd((command_end == wxEmptyString ? GetEOL(): command_end)) , m_CommandStartPosition(0) , m_Echo(echo) // take a char that is not likely to appear inside commands , m_CommandsInConfigDelimiter(wxUniChar(0x03)) , m_CommandsSaveInConfig(commands_save_in_config) , m_Prompt(prompt) , m_Handler(parent) , m_Enabled(true) { // Override defaults from config. SetEdgeMode(wxSTC_EDGE_NONE); ResetMargins(false); // do not reset divider margin SetName("SHELL"); // Start with a prompt. Prompt(); if (m_CommandsSaveInConfig > 0) { // Get all previous commands. wxStringTokenizer tkz(wxConfigBase::Get()->Read("Shell"), m_CommandsInConfigDelimiter); while (tkz.HasMoreTokens()) { const wxString val = tkz.GetNextToken(); m_Commands.push_front(val); } } // Take care that m_CommandsIterator is valid. m_CommandsIterator = m_Commands.end(); EnableShell(true); SetLexer(lexer); }
bool wxExTextFile::ParseLine(const wxString& line) { bool line_contains_code = false, sequence = false; wxString codeword; for (size_t i = 0; i < line.length(); i++) // no auto { if (m_IsCommentStatement) { if (m_Tool.IsCount()) { m_Stats.m_Elements.Inc(_("Comment Size")); } m_Comments += line[i]; } else if (line[i] == '"') { m_IsString = !m_IsString; } // Comments and codewords only appear outside strings. if (!m_IsString) { if (line.length() == 0) continue; if (i == 0) { if (!isspace(line[0])) { codeword = line[i]; } continue; } const size_t max_check_size = m_FileName.GetLexer().GetCommentBegin().Length(); const size_t check_size = (i > max_check_size ? max_check_size: i + 1); const wxString text = line.substr(i + 1 - check_size, check_size); switch (CheckForComment(text)) { case COMMENT_BEGIN: if (!m_IsCommentStatement) CommentStatementStart(); break; case COMMENT_END: CommentStatementEnd(); break; case COMMENT_BOTH: !m_IsCommentStatement ? CommentStatementStart(): CommentStatementEnd(); break; case COMMENT_NONE: if (!isspace(line[i]) && !m_IsCommentStatement) { line_contains_code = true; if (!IsCodewordSeparator(line[i])) { if (!sequence) { if (m_Tool.IsCount()) { m_Stats.m_Elements.Inc(_("Words Of Code")); } sequence = true; } codeword += line[i]; } } break; case COMMENT_INCOMPLETE: break; default: wxFAIL; break; } if ( sequence && (IsCodewordSeparator(line[i]) || i ==0 || i == line.length() - 1)) { if (m_Tool.GetId() == ID_TOOL_REPORT_KEYWORD) { if (m_FileName.GetLexer().IsKeyword(codeword)) { m_Stats.m_Keywords.Inc(codeword); } } sequence = false; codeword.clear(); } } else { line_contains_code = true; } } if (CheckForComment(wxEmptyString) == COMMENT_END) { CommentStatementEnd(); } if (line_contains_code) { m_Stats.m_Elements.Inc(_("Lines Of Code")); } m_EmptyLine = (line.length() == 0); if (m_EmptyLine) { m_Stats.m_Elements.Inc(_("Empty Lines")); } if (m_IsCommentStatement && GetCurrentLine() < GetLineCount() - 1) { // End of lines are included in comment size as well. if (m_Tool.IsCount()) { m_Stats.m_Elements.Inc(_("Comment Size"), wxString(GetEOL()).length()); } } return ParseComments(); }