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