xref: /AOO41X/main/basic/source/sbx/sbxbyte.cxx (revision e1f63238eb022c8a12b30d46a012444ff20e0951)
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_basic.hxx"
26 #include <tools/errcode.hxx>
27 #include <basic/sbx.hxx>
28 #include "sbxconv.hxx"
29 
ImpGetByte(const SbxValues * p)30 sal_uInt8 ImpGetByte( const SbxValues* p )
31 {
32     SbxValues aTmp;
33     sal_uInt8 nRes;
34 start:
35     switch( +p->eType )
36     {
37         case SbxNULL:
38             SbxBase::SetError( SbxERR_CONVERSION );
39         case SbxEMPTY:
40             nRes = 0; break;
41         case SbxCHAR:
42             if( p->nChar > SbxMAXBYTE )
43             {
44                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
45             }
46             else
47                 nRes = (sal_uInt8) p->nChar;
48             break;
49         case SbxBYTE:
50             nRes = (sal_uInt8) p->nByte;    break;
51         case SbxINTEGER:
52         case SbxBOOL:
53             if( p->nInteger > SbxMAXBYTE )
54             {
55                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
56             }
57             else if( p->nInteger < 0 )
58             {
59                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
60             }
61             else
62                 nRes = (sal_uInt8) p->nInteger;
63             break;
64         case SbxERROR:
65         case SbxUSHORT:
66             if( p->nUShort > (sal_uInt16) SbxMAXBYTE )
67             {
68                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
69             }
70             else
71                 nRes = (sal_uInt8) p->nUShort;
72             break;
73         case SbxLONG:
74             if( p->nLong > SbxMAXBYTE )
75             {
76                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
77             }
78             else if( p->nLong < 0 )
79             {
80                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
81             }
82             else
83                 nRes = (sal_uInt8) p->nLong;
84             break;
85         case SbxULONG:
86             if( p->nULong > SbxMAXBYTE )
87             {
88                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
89             }
90             else
91                 nRes = (sal_uInt8) p->nULong;
92             break;
93         case SbxSALINT64:
94             if( p->nInt64 > SbxMAXBYTE )
95             {
96                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
97             }
98             else if( p->nInt64 < 0 )
99             {
100                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
101             }
102             else
103                 nRes = (sal_uInt8) p->nInt64;
104             break;
105         case SbxSALUINT64:
106             if( p->uInt64 > SbxMAXBYTE )
107             {
108                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
109             }
110             else
111                 nRes = (sal_uInt8) p->uInt64;
112             break;
113         case SbxSINGLE:
114             if( p->nSingle > SbxMAXBYTE )
115             {
116                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
117             }
118             else if( p->nSingle < 0 )
119             {
120                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
121             }
122             else
123                 nRes = (sal_uInt8) ImpRound( p->nSingle );
124             break;
125         case SbxDATE:
126         case SbxDOUBLE:
127         case SbxLONG64:
128         case SbxULONG64:
129         case SbxCURRENCY:
130         case SbxDECIMAL:
131         case SbxBYREF | SbxDECIMAL:
132             {
133             double dVal;
134             if( p->eType == SbxCURRENCY )
135                 dVal = ImpCurrencyToDouble( p->nLong64 );
136             else if( p->eType == SbxLONG64 )
137                 dVal = ImpINT64ToDouble( p->nLong64 );
138             else if( p->eType == SbxULONG64 )
139                 dVal = ImpUINT64ToDouble( p->nULong64 );
140             else if( p->eType == SbxDECIMAL )
141             {
142                 dVal = 0.0;
143                 if( p->pDecimal )
144                     p->pDecimal->getDouble( dVal );
145             }
146             else
147                 dVal = p->nDouble;
148 
149             if( dVal > SbxMAXBYTE )
150             {
151                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
152             }
153             else if( dVal < 0 )
154             {
155                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
156             }
157             else
158                 nRes = (sal_uInt8) ImpRound( dVal );
159             break;
160             }
161         case SbxBYREF | SbxSTRING:
162         case SbxSTRING:
163         case SbxLPSTR:
164             if( !p->pOUString )
165                 nRes = 0;
166             else
167             {
168                 double d;
169                 SbxDataType t;
170                 if( ImpScan( *p->pOUString, d, t, NULL ) != SbxERR_OK )
171                     nRes = 0;
172                 else if( d > SbxMAXBYTE )
173                 {
174                     SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
175                 }
176                 else if( d < 0 )
177                 {
178                     SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
179                 }
180                 else
181                     nRes = (sal_uInt8) ( d + 0.5 );
182             }
183             break;
184         case SbxOBJECT:
185         {
186             SbxValue* pVal = PTR_CAST(SbxValue,p->pObj);
187             if( pVal )
188                 nRes = pVal->GetByte();
189             else
190             {
191                 SbxBase::SetError( SbxERR_NO_OBJECT ); nRes = 0;
192             }
193             break;
194         }
195 
196         case SbxBYREF | SbxBYTE:
197             nRes = p->nByte; break;
198 
199         // ab hier wird getestet
200         case SbxBYREF | SbxCHAR:
201             aTmp.nChar = *p->pChar; goto ref;
202         case SbxBYREF | SbxINTEGER:
203         case SbxBYREF | SbxBOOL:
204             aTmp.nInteger = *p->pInteger; goto ref;
205         case SbxBYREF | SbxLONG:
206             aTmp.nLong = *p->pLong; goto ref;
207         case SbxBYREF | SbxULONG:
208             aTmp.nULong = *p->pULong; goto ref;
209         case SbxBYREF | SbxERROR:
210         case SbxBYREF | SbxUSHORT:
211             aTmp.nUShort = *p->pUShort; goto ref;
212         case SbxBYREF | SbxSINGLE:
213             aTmp.nSingle = *p->pSingle; goto ref;
214         case SbxBYREF | SbxDATE:
215         case SbxBYREF | SbxDOUBLE:
216             aTmp.nDouble = *p->pDouble; goto ref;
217         case SbxBYREF | SbxULONG64:
218             aTmp.nULong64 = *p->pULong64; goto ref;
219         case SbxBYREF | SbxLONG64:
220         case SbxBYREF | SbxCURRENCY:
221             aTmp.nLong64 = *p->pLong64; goto ref;
222         case SbxBYREF | SbxSALINT64:
223             aTmp.nInt64 = *p->pnInt64; goto ref;
224         case SbxBYREF | SbxSALUINT64:
225             aTmp.uInt64 = *p->puInt64; goto ref;
226         ref:
227             aTmp.eType = SbxDataType( p->eType & 0x0FFF );
228             p = &aTmp; goto start;
229 
230         default:
231             SbxBase::SetError( SbxERR_CONVERSION ); nRes = 0;
232     }
233     return nRes;
234 }
235 
ImpPutByte(SbxValues * p,sal_uInt8 n)236 void ImpPutByte( SbxValues* p, sal_uInt8 n )
237 {
238     switch( +p->eType )
239     {
240         case SbxBYTE:
241             p->nByte = n; break;
242         case SbxINTEGER:
243         case SbxBOOL:
244             p->nInteger = n; break;
245         case SbxERROR:
246         case SbxUSHORT:
247             p->nUShort = n; break;
248         case SbxLONG:
249             p->nLong = n; break;
250         case SbxULONG:
251             p->nULong = n; break;
252         case SbxSINGLE:
253             p->nSingle = n; break;
254         case SbxDATE:
255         case SbxDOUBLE:
256             p->nDouble = n; break;
257         case SbxSALINT64:
258             p->nInt64 = n; break;
259         case SbxSALUINT64:
260             p->uInt64 = n; break;
261         case SbxULONG64:
262             p->nULong64 = ImpDoubleToUINT64( (double)n ); break;
263         case SbxLONG64:
264             p->nLong64 = ImpDoubleToINT64( (double)n ); break;
265         case SbxCURRENCY:
266             p->nLong64 = ImpDoubleToCurrency( (double)n ); break;
267         case SbxDECIMAL:
268         case SbxBYREF | SbxDECIMAL:
269             ImpCreateDecimal( p )->setByte( n );
270             break;
271 
272         case SbxCHAR:
273             p->nChar = (xub_Unicode) n; break;
274 
275         case SbxBYREF | SbxSTRING:
276         case SbxSTRING:
277         case SbxLPSTR:
278             if( !p->pOUString )
279                 p->pOUString = new ::rtl::OUString;
280             ImpCvtNum( (double) n, 0, *p->pOUString );
281             break;
282         case SbxOBJECT:
283         {
284             SbxValue* pVal = PTR_CAST(SbxValue,p->pObj);
285             if( pVal )
286                 pVal->PutByte( n );
287             else
288                 SbxBase::SetError( SbxERR_NO_OBJECT );
289             break;
290         }
291         case SbxBYREF | SbxCHAR:
292             *p->pChar = (xub_Unicode) n; break;
293         case SbxBYREF | SbxBYTE:
294             *p->pByte = n; break;
295         case SbxBYREF | SbxINTEGER:
296         case SbxBYREF | SbxBOOL:
297             *p->pInteger = n; break;
298         case SbxBYREF | SbxERROR:
299         case SbxBYREF | SbxUSHORT:
300             *p->pUShort = n; break;
301         case SbxBYREF | SbxLONG:
302             *p->pLong = n; break;
303         case SbxBYREF | SbxULONG:
304             *p->pULong = n; break;
305         case SbxBYREF | SbxSINGLE:
306             *p->pSingle = n; break;
307         case SbxBYREF | SbxDATE:
308         case SbxBYREF | SbxDOUBLE:
309             *p->pDouble = n; break;
310         case SbxBYREF | SbxULONG64:
311             *p->pULong64 = ImpDoubleToUINT64( (double)n ); break;
312         case SbxBYREF | SbxLONG64:
313             *p->pLong64 = ImpDoubleToINT64( (double)n ); break;
314         case SbxBYREF | SbxSALINT64:
315             *p->pnInt64 = n; break;
316         case SbxBYREF | SbxSALUINT64:
317             *p->puInt64 = n; break;
318         case SbxBYREF | SbxCURRENCY:
319             *p->pLong64 = ImpDoubleToCurrency( (double)n ); break;
320 
321         default:
322             SbxBase::SetError( SbxERR_CONVERSION );
323     }
324 }
325 
326