Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #define CSV_USE_CSV_ASSERTIONS
21 : #include <cosv/csv_env.hxx>
22 :
23 : #include <cosv/comfunc.hxx>
24 : #include <cosv/string.hxx>
25 : #include <cosv/streamstr.hxx>
26 : #include <cosv/std_outp.hxx>
27 : #include <cosv/tpl/dyn.hxx>
28 :
29 : // NOT FULLY DECLARED SERVICES
30 : #include <string.h>
31 :
32 :
33 :
34 :
35 : namespace csv
36 : {
37 :
38 :
39 : inline const char *
40 0 : str_from_StringOffset( const String & i_rStr,
41 : str::size i_nOffset )
42 : {
43 0 : return i_nOffset < i_rStr.size()
44 0 : ? i_rStr.c_str() + i_nOffset
45 0 : : "";
46 : }
47 :
48 : inline const char *
49 6071876 : str_from_ptr( const char * i_str )
50 : {
51 :
52 6071876 : return valid_str(i_str);
53 : }
54 :
55 :
56 : //********************* String::S_Data **********************//
57 :
58 : inline String::
59 : S_Data::S_Data()
60 : : nCount(1)
61 : {
62 : }
63 :
64 6071876 : String::
65 : S_Data::S_Data( const char * i_sData,
66 : size_type i_nValidLength )
67 : : aStr( str_from_ptr(i_sData),
68 : (i_nValidLength != str::maxsize
69 : ? i_nValidLength
70 : : strlen(i_sData)) ),
71 6071876 : nCount(1)
72 : {
73 6071876 : }
74 :
75 5851329 : String::
76 5851329 : S_Data::~S_Data()
77 : {
78 5851329 : csv_assert( nCount == 0 );
79 5851329 : }
80 :
81 : const String::S_Data *
82 5409371 : String::
83 : S_Data::Acquire() const
84 : {
85 : #ifdef CSV_NO_MUTABLE
86 : ++ (const_cast< uintt& >(nCount));
87 : #else
88 5409371 : ++nCount;
89 : #endif
90 5409371 : return this;
91 : }
92 :
93 : void
94 11255738 : String::
95 : S_Data::Release() const
96 : {
97 : #ifdef CSV_NO_MUTABLE
98 : -- (const_cast< uintt& >(nCount));
99 : #else
100 11255738 : --nCount;
101 : #endif
102 11255738 : if (nCount == 0)
103 5851329 : delete (const_cast< S_Data* >(this));
104 11255738 : }
105 :
106 :
107 : //************************** String **************************//
108 :
109 :
110 704459 : String::String()
111 704459 : : pd( String::Null_().pd->Acquire() )
112 : {
113 704459 : }
114 :
115 5561685 : String::String( const char * i_str )
116 5561685 : : pd( new S_Data(i_str) )
117 : {
118 5561685 : }
119 :
120 19294 : String::String( const char * i_str,
121 : size_type i_nLength )
122 19294 : : pd( new S_Data(i_str, i_nLength) )
123 : {
124 19294 : }
125 :
126 233816 : String::String( const_iterator i_itBegin,
127 : const_iterator i_itEnd )
128 233816 : : pd( new S_Data(i_itBegin, size_type(i_itEnd - i_itBegin)) )
129 : {
130 233816 : }
131 :
132 3805632 : String::String( const self & i_rStr )
133 3805632 : : pd( i_rStr.pd->Acquire() )
134 : {
135 3805632 : }
136 :
137 10099377 : String::~String()
138 : {
139 10099377 : pd->Release();
140 10099377 : }
141 :
142 :
143 : String &
144 899280 : String::operator=( const self & i_rStr )
145 : {
146 899280 : i_rStr.pd->Acquire();
147 899280 : pd->Release();
148 899280 : pd = i_rStr.pd;
149 :
150 899280 : return *this;
151 : }
152 :
153 : String &
154 224317 : String::operator=( const char * i_str )
155 : {
156 : const S_Data *
157 224317 : pTemp = new S_Data(i_str);
158 224317 : pd->Release();
159 224317 : pd = pTemp;
160 :
161 224317 : return *this;
162 : }
163 :
164 : void
165 32764 : String::assign( const char * i_str,
166 : size_type i_nLength )
167 : {
168 : const S_Data *
169 32764 : pTemp = new S_Data( i_str, i_nLength );
170 32764 : pd->Release();
171 32764 : pd = pTemp;
172 32764 : }
173 :
174 : int
175 2347762 : String::compare( const self & i_rStr ) const
176 : {
177 2347762 : return strcmp( c_str(), i_rStr.c_str() );
178 : }
179 :
180 : int
181 368911 : String::compare( const CharOrder_Table & i_rOrder,
182 : const self & i_rStr ) const
183 : {
184 368911 : return csv::compare( i_rOrder, c_str(), i_rStr.c_str() );
185 : }
186 :
187 : const String &
188 1256557 : String::Null_()
189 : {
190 : // Must not use the default constructor! Because that one calls
191 : // this function, which would create a circular dependency.
192 1256557 : static const String aNull_("");
193 1256557 : return aNull_;
194 : }
195 :
196 : const char &
197 0 : String::Nulch_()
198 : {
199 : static const char cNull_ = '\0';
200 0 : return cNull_;
201 : }
202 :
203 :
204 : int
205 0 : compare( const String & i_s1,
206 : csv::str::position i_nStartPosition1,
207 : const char * i_s2,
208 : csv::str::size i_nLength )
209 : {
210 0 : const char * pS1 = str_from_StringOffset( i_s1, i_nStartPosition1 );
211 :
212 0 : if ( i_nLength != csv::str::maxsize )
213 : return strncmp( pS1,
214 : i_s2,
215 0 : i_nLength );
216 : else
217 : return strcmp( pS1,
218 0 : i_s2 );
219 : }
220 :
221 : int
222 368911 : compare( const CharOrder_Table & i_rOrder,
223 : const char * i_s1,
224 : const char * i_s2 )
225 : {
226 368911 : const char * it1 = i_s1;
227 368911 : const char * it2 = i_s2;
228 368911 : for ( ; i_rOrder(*it1) == i_rOrder(*it2) AND *it1 != '\0'; ++it1, ++it2 )
229 : {}
230 368911 : return int( i_rOrder(*it1) - i_rOrder(*it2) );
231 : }
232 :
233 3 : } // namespace csv
234 :
235 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|