diff options
| -rw-r--r-- | gtk/ScintillaGTK.cxx | 36 | ||||
| -rw-r--r-- | src/Document.cxx | 31 | ||||
| -rw-r--r-- | src/Document.h | 1 | 
3 files changed, 35 insertions, 33 deletions
| diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 18f57e1e6..b09ba8825 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -1383,36 +1383,6 @@ void ScintillaGTK::ClaimSelection() {  	}  } -// Convert line endings for a piece of text to a particular mode. -// Stop at len or when a NUL is found. -char *ConvertLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { -	char *dest = new char[2 * len + 1]; -	const char *sptr = s; -	char *dptr = dest; -	for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { -		if (*sptr == '\n' || *sptr == '\r') { -			if (eolMode == SC_EOL_CR) { -				*dptr++ = '\r'; -			} else if (eolMode == SC_EOL_LF) { -				*dptr++ = '\n'; -			} else { // eolMode == SC_EOL_CRLF -				*dptr++ = '\r'; -				*dptr++ = '\n'; -			} -			if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { -				i++; -				sptr++; -			} -			sptr++; -		} else { -			*dptr++ = *sptr++; -		} -	} -	*dptr++ = '\0'; -	*pLenOut = (dptr - dest) - 1; -	return dest; -} -  // Detect rectangular text, convert line ends to current mode, convert from or to UTF-8  void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText) {  	char *data = reinterpret_cast<char *>(selectionData->data); @@ -1437,7 +1407,7 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio  	char *dest;  	if (selectionType == GDK_TARGET_STRING) { -		dest = ConvertLineEnds(&len, data, len, pdoc->eolMode); +		dest = Document::TransformLineEnds(&len, data, len, pdoc->eolMode);  		if (IsUnicodeMode()) {  			// Unknown encoding so assume in Latin1  			char *destPrevious = dest; @@ -1450,7 +1420,7 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio  				vs.styles[STYLE_DEFAULT].characterSet, isRectangular);  		}  	} else {	// UTF-8 -		dest = ConvertLineEnds(&len, data, len, pdoc->eolMode); +		dest = Document::TransformLineEnds(&len, data, len, pdoc->eolMode);  		selText.Set(dest, len, SC_CP_UTF8, 0, isRectangular);  #ifdef USE_CONVERTER  		const char *charSetBuffer = CharacterSetID(); @@ -1560,7 +1530,7 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se  	 // so make a copy of the clip text now with newlines converted  	int new_len; -	char *tmpstr = ConvertLineEnds(&new_len, selBuffer, text->len, SC_EOL_LF); +	char *tmpstr = Document::TransformLineEnds(&new_len, selBuffer, text->len, SC_EOL_LF);  	selBuffer = tmpstr;  #endif  	char *tmputf = 0; diff --git a/src/Document.cxx b/src/Document.cxx index e8d88cc87..a8cca8a00 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -682,6 +682,37 @@ void Document::Indent(bool forwards, int lineBottom, int lineTop) {  	}  } +// Convert line endings for a piece of text to a particular mode. +// Stop at len or when a NUL is found. +// Caller must delete the returned pointer. +char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { +	char *dest = new char[2 * len + 1]; +	const char *sptr = s; +	char *dptr = dest; +	for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { +		if (*sptr == '\n' || *sptr == '\r') { +			if (eolMode == SC_EOL_CR) { +				*dptr++ = '\r'; +			} else if (eolMode == SC_EOL_LF) { +				*dptr++ = '\n'; +			} else { // eolMode == SC_EOL_CRLF +				*dptr++ = '\r'; +				*dptr++ = '\n'; +			} +			if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { +				i++; +				sptr++; +			} +			sptr++; +		} else { +			*dptr++ = *sptr++; +		} +	} +	*dptr++ = '\0'; +	*pLenOut = (dptr - dest) - 1; +	return dest; +} +  void Document::ConvertLineEnds(int eolModeSet) {  	BeginUndoAction(); diff --git a/src/Document.h b/src/Document.h index 54ecadb00..ce27ffc47 100644 --- a/src/Document.h +++ b/src/Document.h @@ -156,6 +156,7 @@ public:  	int GetColumn(int position);  	int FindColumn(int line, int column);  	void Indent(bool forwards, int lineBottom, int lineTop); +	static char *TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode);  	void ConvertLineEnds(int eolModeSet);  	void SetReadOnly(bool set) { cb.SetReadOnly(set); }  	bool IsReadOnly() { return cb.IsReadOnly(); } | 
