19b5730f6SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39b5730f6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49b5730f6SAndrew Rist * or more contributor license agreements. See the NOTICE file 59b5730f6SAndrew Rist * distributed with this work for additional information 69b5730f6SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79b5730f6SAndrew Rist * to you under the Apache License, Version 2.0 (the 89b5730f6SAndrew Rist * "License"); you may not use this file except in compliance 99b5730f6SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119b5730f6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139b5730f6SAndrew Rist * Unless required by applicable law or agreed to in writing, 149b5730f6SAndrew Rist * software distributed under the License is distributed on an 159b5730f6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169b5730f6SAndrew Rist * KIND, either express or implied. See the License for the 179b5730f6SAndrew Rist * specific language governing permissions and limitations 189b5730f6SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209b5730f6SAndrew Rist *************************************************************/ 219b5730f6SAndrew Rist 229b5730f6SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 26cdf0e10cSrcweir #include "file/quotedstring.hxx" 27cdf0e10cSrcweir #include <rtl/logfile.hxx> 28*7b2bc0e6SDamjan Jovanovic #include <rtl/ustrbuf.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir namespace connectivity 31cdf0e10cSrcweir { 32cdf0e10cSrcweir //================================================================== 33cdf0e10cSrcweir //= QuotedTokenizedString 34cdf0e10cSrcweir //================================================================== 35cdf0e10cSrcweir //------------------------------------------------------------------ GetTokenCount(sal_Unicode cTok,sal_Unicode cStrDel) const36*7b2bc0e6SDamjan Jovanovic sal_Int32 QuotedTokenizedString::GetTokenCount( sal_Unicode cTok, sal_Unicode cStrDel ) const 37cdf0e10cSrcweir { 38cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "QuotedTokenizedString::GetTokenCount" ); 39*7b2bc0e6SDamjan Jovanovic const sal_Int32 nLen = m_sString.getLength(); 40cdf0e10cSrcweir if ( !nLen ) 41cdf0e10cSrcweir return 0; 42cdf0e10cSrcweir 43*7b2bc0e6SDamjan Jovanovic sal_Int32 nTokCount = 1; 44cdf0e10cSrcweir sal_Bool bStart = sal_True; // Stehen wir auf dem ersten Zeichen im Token? 45cdf0e10cSrcweir sal_Bool bInString = sal_False; // Befinden wir uns INNERHALB eines (cStrDel delimited) String? 46cdf0e10cSrcweir 47cdf0e10cSrcweir // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen 48*7b2bc0e6SDamjan Jovanovic for( sal_Int32 i = 0; i < nLen; ++i ) 49cdf0e10cSrcweir { 50*7b2bc0e6SDamjan Jovanovic const sal_Unicode cChar = m_sString[ i ]; 51cdf0e10cSrcweir if (bStart) 52cdf0e10cSrcweir { 53cdf0e10cSrcweir bStart = sal_False; 54cdf0e10cSrcweir // Erstes Zeichen ein String-Delimiter? 55cdf0e10cSrcweir if ( cChar == cStrDel ) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir bInString = sal_True; // dann sind wir jetzt INNERHALB des Strings! 58cdf0e10cSrcweir continue; // dieses Zeichen ueberlesen! 59cdf0e10cSrcweir } 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir if (bInString) 63cdf0e10cSrcweir { 64cdf0e10cSrcweir // Wenn jetzt das String-Delimiter-Zeichen auftritt ... 65cdf0e10cSrcweir if ( cChar == cStrDel ) 66cdf0e10cSrcweir { 67*7b2bc0e6SDamjan Jovanovic if ((i+1 < nLen) && (m_sString[ i+1 ] == cStrDel)) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir // Verdoppeltes String-Delimiter-Zeichen: 70cdf0e10cSrcweir ++i; // kein String-Ende, naechstes Zeichen ueberlesen. 71cdf0e10cSrcweir } 72cdf0e10cSrcweir else 73cdf0e10cSrcweir { 74cdf0e10cSrcweir // String-Ende 75cdf0e10cSrcweir bInString = sal_False; 76cdf0e10cSrcweir } 77cdf0e10cSrcweir } 78cdf0e10cSrcweir } // if (bInString) 79cdf0e10cSrcweir else 80cdf0e10cSrcweir { 81cdf0e10cSrcweir // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount 82cdf0e10cSrcweir if ( cChar == cTok ) 83cdf0e10cSrcweir { 84cdf0e10cSrcweir ++nTokCount; 85cdf0e10cSrcweir bStart = sal_True; 86cdf0e10cSrcweir } 87cdf0e10cSrcweir } 88cdf0e10cSrcweir } 89cdf0e10cSrcweir //OSL_TRACE("QuotedTokenizedString::nTokCount = %d\n", ((OUtoCStr(::rtl::OUString(nTokCount))) ? (OUtoCStr(::rtl::OUString(nTokCount))):("NULL")) ); 90cdf0e10cSrcweir 91cdf0e10cSrcweir return nTokCount; 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir //------------------------------------------------------------------ GetTokenSpecial(::rtl::OUString * _rStr,sal_Int32 & nStartPos,sal_Unicode cTok,sal_Unicode cStrDel) const95*7b2bc0e6SDamjan Jovanovic void QuotedTokenizedString::GetTokenSpecial( ::rtl::OUString* _rStr,sal_Int32& nStartPos, sal_Unicode cTok, sal_Unicode cStrDel ) const 96cdf0e10cSrcweir { 97cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "QuotedTokenizedString::GetTokenCount" ); 98*7b2bc0e6SDamjan Jovanovic *_rStr = ::rtl::OUString(); 99*7b2bc0e6SDamjan Jovanovic const sal_Int32 nLen = m_sString.getLength(); 100cdf0e10cSrcweir if ( nLen ) 101cdf0e10cSrcweir { 102*7b2bc0e6SDamjan Jovanovic sal_Bool bInString = (nStartPos < nLen) && (m_sString[ nStartPos ] == cStrDel); // Are we inside a (cStrDel delimited) String? 103cdf0e10cSrcweir 104*7b2bc0e6SDamjan Jovanovic // Is the first character a string delimiter? 105cdf0e10cSrcweir if (bInString ) 106*7b2bc0e6SDamjan Jovanovic ++nStartPos; // ignore this character! 107cdf0e10cSrcweir if ( nStartPos >= nLen ) 108cdf0e10cSrcweir return; 109cdf0e10cSrcweir 110*7b2bc0e6SDamjan Jovanovic ::rtl::OUStringBuffer buffer( nLen - nStartPos); 111*7b2bc0e6SDamjan Jovanovic // Search until the end of string for the first non-matching character 112*7b2bc0e6SDamjan Jovanovic for( sal_Int32 i = nStartPos; i < nLen; ++i ) 113cdf0e10cSrcweir { 114*7b2bc0e6SDamjan Jovanovic const sal_Unicode cChar = m_sString[ i ]; 115cdf0e10cSrcweir if (bInString) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir // Wenn jetzt das String-Delimiter-Zeichen auftritt ... 118cdf0e10cSrcweir if ( cChar == cStrDel ) 119cdf0e10cSrcweir { 120*7b2bc0e6SDamjan Jovanovic if ((i+1 < nLen) && (m_sString[ i+1 ] == cStrDel)) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir // Verdoppeltes String-Delimiter-Zeichen: 123cdf0e10cSrcweir // kein String-Ende, naechstes Zeichen ueberlesen. 124cdf0e10cSrcweir ++i; 125*7b2bc0e6SDamjan Jovanovic buffer.append( m_sString[ i ] ); // Zeichen gehoert zum Resultat-String 126cdf0e10cSrcweir } 127cdf0e10cSrcweir else 128cdf0e10cSrcweir { 129cdf0e10cSrcweir // String-Ende 130cdf0e10cSrcweir bInString = sal_False; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir } 133cdf0e10cSrcweir else 134cdf0e10cSrcweir { 135*7b2bc0e6SDamjan Jovanovic buffer.append( cChar ); // Zeichen gehoert zum Resultat-String 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir } 139cdf0e10cSrcweir else 140cdf0e10cSrcweir { 141cdf0e10cSrcweir // Stimmt das Tokenzeichen ueberein, dann erhoehe nTok 142cdf0e10cSrcweir if ( cChar == cTok ) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir // Vorzeitiger Abbruch der Schleife moeglich, denn 145cdf0e10cSrcweir // wir haben, was wir wollten. 146cdf0e10cSrcweir nStartPos = i+1; 147cdf0e10cSrcweir break; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir else 150cdf0e10cSrcweir { 151*7b2bc0e6SDamjan Jovanovic buffer.append( cChar ); // Zeichen gehoert zum Resultat-String 152cdf0e10cSrcweir } 153cdf0e10cSrcweir } 154*7b2bc0e6SDamjan Jovanovic } // for( sal_Int32 i = nStartPos; i < nLen; ++i ) 155*7b2bc0e6SDamjan Jovanovic *_rStr = buffer.makeStringAndClear(); 156cdf0e10cSrcweir } 157cdf0e10cSrcweir } 158cdf0e10cSrcweir } 159