xref: /trunk/main/connectivity/source/drivers/file/quotedstring.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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