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 : #include <stringconversiontools.hxx>
21 : #include <rtl/math.hxx>
22 :
23 : namespace basegfx
24 : {
25 : namespace internal
26 : {
27 64932 : void lcl_skipSpaces(sal_Int32& io_rPos,
28 : const OUString& rStr,
29 : const sal_Int32 nLen)
30 : {
31 196723 : while( io_rPos < nLen &&
32 63898 : ' ' == rStr[io_rPos] )
33 : {
34 2961 : ++io_rPos;
35 : }
36 64932 : }
37 :
38 177951 : void lcl_skipSpacesAndCommas(sal_Int32& io_rPos,
39 : const OUString& rStr,
40 : const sal_Int32 nLen)
41 : {
42 773287 : while(io_rPos < nLen
43 297668 : && (' ' == rStr[io_rPos] || ',' == rStr[io_rPos]))
44 : {
45 119717 : ++io_rPos;
46 : }
47 177951 : }
48 :
49 177499 : bool lcl_getDoubleChar(double& o_fRetval, sal_Int32& io_rPos, const OUString& rStr)
50 : {
51 177499 : sal_Unicode aChar( rStr[io_rPos] );
52 177499 : OUStringBuffer sNumberString;
53 :
54 : // sign
55 177499 : if('+' == aChar || '-' == aChar)
56 : {
57 50196 : sNumberString.append(rStr[io_rPos]);
58 50196 : aChar = rStr[++io_rPos];
59 : }
60 :
61 : // numbers before point
62 656543 : while('0' <= aChar && '9' >= aChar)
63 : {
64 301545 : sNumberString.append(rStr[io_rPos]);
65 301545 : io_rPos++;
66 301545 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
67 : }
68 :
69 : // point
70 177499 : if('.' == aChar)
71 : {
72 120182 : sNumberString.append(rStr[io_rPos]);
73 120182 : io_rPos++;
74 120182 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
75 : }
76 :
77 : // numbers after point
78 701464 : while ('0' <= aChar && '9' >= aChar)
79 : {
80 346466 : sNumberString.append(rStr[io_rPos]);
81 346466 : io_rPos++;
82 346466 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
83 : }
84 :
85 : // 'e'
86 177499 : if('e' == aChar || 'E' == aChar)
87 : {
88 9 : sNumberString.append(rStr[io_rPos]);
89 9 : io_rPos++;
90 9 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
91 :
92 : // sign for 'e'
93 9 : if('+' == aChar || '-' == aChar)
94 : {
95 9 : sNumberString.append(rStr[io_rPos]);
96 9 : io_rPos++;
97 9 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
98 : }
99 :
100 : // number for 'e'
101 27 : while('0' <= aChar && '9' >= aChar)
102 : {
103 9 : sNumberString.append(rStr[io_rPos]);
104 9 : io_rPos++;
105 9 : aChar = io_rPos < rStr.getLength() ? rStr[io_rPos] : 0;
106 : }
107 : }
108 :
109 177499 : if(sNumberString.getLength())
110 : {
111 : rtl_math_ConversionStatus eStatus;
112 : o_fRetval = ::rtl::math::stringToDouble( sNumberString.makeStringAndClear(),
113 : '.',
114 : ',',
115 : &eStatus,
116 177499 : NULL );
117 177499 : return ( eStatus == rtl_math_ConversionStatus_Ok );
118 : }
119 :
120 0 : return false;
121 : }
122 :
123 177499 : bool lcl_importDoubleAndSpaces( double& o_fRetval,
124 : sal_Int32& io_rPos,
125 : const OUString& rStr,
126 : const sal_Int32 nLen )
127 : {
128 177499 : if( !lcl_getDoubleChar(o_fRetval, io_rPos, rStr) )
129 0 : return false;
130 :
131 177499 : lcl_skipSpacesAndCommas(io_rPos, rStr, nLen);
132 :
133 177499 : return true;
134 : }
135 :
136 452 : bool lcl_importFlagAndSpaces(sal_Int32& o_nRetval,
137 : sal_Int32& io_rPos,
138 : const OUString& rStr,
139 : const sal_Int32 nLen)
140 : {
141 452 : sal_Unicode aChar( rStr[io_rPos] );
142 :
143 452 : if('0' == aChar)
144 : {
145 292 : o_nRetval = 0;
146 292 : ++io_rPos;
147 : }
148 160 : else if ('1' == aChar)
149 : {
150 160 : o_nRetval = 1;
151 160 : ++io_rPos;
152 : }
153 : else
154 0 : return false;
155 :
156 452 : lcl_skipSpacesAndCommas(io_rPos, rStr, nLen);
157 :
158 452 : return true;
159 : }
160 :
161 6254 : void lcl_putNumberCharWithSpace( OUStringBuffer& rStr,
162 : double fValue,
163 : double fOldValue,
164 : bool bUseRelativeCoordinates )
165 : {
166 6254 : if( bUseRelativeCoordinates )
167 6128 : fValue -= fOldValue;
168 :
169 6254 : const sal_Int32 aLen( rStr.getLength() );
170 6254 : if(aLen)
171 : {
172 6254 : if( lcl_isOnNumberChar(rStr[aLen - 1], false, true) &&
173 : fValue >= 0.0 )
174 : {
175 2186 : rStr.append( ' ' );
176 : }
177 : }
178 :
179 6254 : lcl_putNumberChar(rStr, fValue);
180 6254 : }
181 :
182 : } // namespace internal
183 : }
184 :
185 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|