summaryrefslogtreecommitdiff
path: root/tools/source/stream
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-01-30 11:31:05 +0000
committerCaolán McNamara <caolanm@redhat.com>2012-01-30 13:18:38 +0000
commitbbc94edb9a91b27910d43610db9994df10dd99e1 (patch)
tree99f81b7bc96dd93ae6c6e6a4f7a57cfda72cdfa4 /tools/source/stream
parent47e1e8494dde85414d28efafa99b33a62b59116d (diff)
refactor ConvertLineEnd
Diffstat (limited to 'tools/source/stream')
-rw-r--r--tools/source/stream/stream.cxx92
1 files changed, 92 insertions, 0 deletions
diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx
index fd5a579a8bde..902f17876d3a 100644
--- a/tools/source/stream/stream.cxx
+++ b/tools/source/stream/stream.cxx
@@ -2388,4 +2388,96 @@ rtl::OUString read_uInt16s_ToOUString(SvStream& rStrm, sal_Size nLen)
return pStr ? rtl::OUString(pStr, SAL_NO_ACQUIRE) : rtl::OUString();
}
+namespace
+{
+ template <typename T, typename O> T tmpl_convertLineEnd(const T &rIn, LineEnd eLineEnd)
+ {
+ // Zeilenumbrueche ermitteln und neue Laenge berechnen
+ bool bConvert = false; // Muss konvertiert werden
+ sal_Int32 nStrLen = rIn.getLength();
+ sal_Int32 nLineEndLen = (eLineEnd == LINEEND_CRLF) ? 2 : 1;
+ sal_Int32 nLen = 0; // Ziel-Laenge
+ sal_Int32 i = 0; // Source-Zaehler
+
+ while (i < nStrLen)
+ {
+ // Bei \r oder \n gibt es neuen Zeilenumbruch
+ if ( (rIn[i] == _CR) || (rIn[i] == _LF) )
+ {
+ nLen = nLen + nLineEndLen;
+
+ // Wenn schon gesetzt, dann brauchen wir keine aufwendige Abfrage
+ if ( !bConvert )
+ {
+ // Muessen wir Konvertieren
+ if ( ((eLineEnd != LINEEND_LF) && (rIn[i] == _LF)) ||
+ ((eLineEnd == LINEEND_CRLF) && (rIn[i+1] != _LF)) ||
+ ((eLineEnd == LINEEND_LF) &&
+ ((rIn[i] == _CR) || (rIn[i+1] == _CR))) ||
+ ((eLineEnd == LINEEND_CR) &&
+ ((rIn[i] == _LF) || (rIn[i+1] == _LF))) )
+ bConvert = true;
+ }
+
+ // \r\n oder \n\r, dann Zeichen ueberspringen
+ if ( ((rIn[i+1] == _CR) || (rIn[i+1] == _LF)) &&
+ (rIn[i] != rIn[i+1]) )
+ ++i;
+ }
+ else
+ ++nLen;
+ ++i;
+ }
+
+ if (!bConvert)
+ return rIn;
+
+ // Zeilenumbrueche konvertieren
+ // Neuen String anlegen
+ O aNewData(nLen);
+ i = 0;
+ while (i < nStrLen)
+ {
+ // Bei \r oder \n gibt es neuen Zeilenumbruch
+ if ( (rIn[i] == _CR) || (rIn[i] == _LF) )
+ {
+ if ( eLineEnd == LINEEND_CRLF )
+ {
+ aNewData.append(_CR);
+ aNewData.append(_LF);
+ }
+ else
+ {
+ if ( eLineEnd == LINEEND_CR )
+ aNewData.append(_CR);
+ else
+ aNewData.append(_LF);
+ }
+
+ if ( ((rIn[i+1] == _CR) || (rIn[i+1] == _LF)) &&
+ (rIn[i] != rIn[i+1]) )
+ ++i;
+ }
+ else
+ {
+ aNewData.append(rIn[i]);
+ }
+
+ ++i;
+ }
+
+ return aNewData.makeStringAndClear();
+ }
+}
+
+rtl::OString convertLineEnd(const rtl::OString &rIn, LineEnd eLineEnd)
+{
+ return tmpl_convertLineEnd<rtl::OString, rtl::OStringBuffer>(rIn, eLineEnd);
+}
+
+rtl::OUString convertLineEnd(const rtl::OUString &rIn, LineEnd eLineEnd)
+{
+ return tmpl_convertLineEnd<rtl::OUString, rtl::OUStringBuffer>(rIn, eLineEnd);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */