xref: /AOO41X/main/basic/source/sbx/sbxbool.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 #include "sbxres.hxx"
30 
31 // AB 29.10.99 Unicode
32 #ifndef _USE_NO_NAMESPACE
33 using namespace rtl;
34 #endif
35 
ImpGetBool(const SbxValues * p)36 enum SbxBOOL ImpGetBool( const SbxValues* p )
37 {
38     enum SbxBOOL nRes;
39     switch( +p->eType )
40     {
41         case SbxNULL:
42             SbxBase::SetError( SbxERR_CONVERSION );
43         case SbxEMPTY:
44             nRes = SbxFALSE; break;
45         case SbxCHAR:
46             nRes = p->nChar ? SbxTRUE : SbxFALSE; break;
47         case SbxBYTE:
48             nRes = p->nByte ? SbxTRUE : SbxFALSE; break;
49         case SbxINTEGER:
50         case SbxBOOL:
51             nRes = p->nInteger ? SbxTRUE : SbxFALSE; break;
52         case SbxERROR:
53         case SbxUSHORT:
54             nRes = p->nUShort ? SbxTRUE : SbxFALSE; break;
55         case SbxLONG:
56             nRes = p->nLong ? SbxTRUE : SbxFALSE; break;
57         case SbxULONG:
58             nRes = p->nULong ? SbxTRUE : SbxFALSE; break;
59         case SbxSINGLE:
60             nRes = p->nSingle ? SbxTRUE : SbxFALSE; break;
61         case SbxDATE:
62         case SbxDOUBLE:
63             nRes = p->nDouble ? SbxTRUE : SbxFALSE; break;
64         case SbxDECIMAL:
65         case SbxBYREF | SbxDECIMAL:
66             {
67             double dVal = 0.0;
68             if( p->pDecimal )
69                 p->pDecimal->getDouble( dVal );
70             nRes = dVal ? SbxTRUE : SbxFALSE;
71             }
72             break;
73         case SbxSALINT64:
74             nRes = p->nInt64 ? SbxTRUE : SbxFALSE; break;
75         case SbxSALUINT64:
76             nRes = p->uInt64 ? SbxTRUE : SbxFALSE; break;
77         case SbxULONG64:
78             nRes = !!p->nULong64 ? SbxTRUE : SbxFALSE; break;
79         case SbxLONG64:
80         case SbxCURRENCY:
81             nRes = !!p->nLong64 ? SbxTRUE : SbxFALSE; break;
82         case SbxBYREF | SbxSTRING:
83         case SbxSTRING:
84         case SbxLPSTR:
85             nRes = SbxFALSE;
86             if ( p->pOUString )
87             {
88                 if( p->pOUString->equalsIgnoreAsciiCase( SbxRes( STRING_TRUE ) ) )
89                     nRes = SbxTRUE;
90                 else if( !p->pOUString->equalsIgnoreAsciiCase( SbxRes( STRING_FALSE ) ) )
91                 {
92                     // Jetzt kann es noch in eine Zahl konvertierbar sein
93                     sal_Bool bError = sal_True;
94                     double n;
95                     SbxDataType t;
96                     sal_uInt16 nLen = 0;
97                     if( ImpScan( *p->pOUString, n, t, &nLen ) == SbxERR_OK )
98                     {
99                         if( nLen == p->pOUString->getLength() )
100                         {
101                             bError = sal_False;
102                             if( n != 0.0 )
103                                 nRes = SbxTRUE;
104                         }
105                     }
106                     if( bError )
107                         SbxBase::SetError( SbxERR_CONVERSION );
108                 }
109             }
110             break;
111         case SbxOBJECT:
112         {
113             SbxValue* pVal = PTR_CAST(SbxValue,p->pObj);
114             if( pVal )
115                 nRes = pVal->GetBool() ? SbxTRUE : SbxFALSE;
116             else
117             {
118                 SbxBase::SetError( SbxERR_NO_OBJECT ); nRes = SbxFALSE;
119             }
120             break;
121         }
122 
123         case SbxBYREF | SbxCHAR:
124             nRes = *p->pChar ? SbxTRUE : SbxFALSE; break;
125         case SbxBYREF | SbxBYTE:
126             nRes = *p->pByte ? SbxTRUE : SbxFALSE; break;
127         case SbxBYREF | SbxINTEGER:
128         case SbxBYREF | SbxBOOL:
129             nRes = *p->pInteger ? SbxTRUE : SbxFALSE; break;
130         case SbxBYREF | SbxLONG:
131             nRes = *p->pLong ? SbxTRUE : SbxFALSE; break;
132         case SbxBYREF | SbxULONG:
133             nRes = *p->pULong ? SbxTRUE : SbxFALSE; break;
134         case SbxBYREF | SbxERROR:
135         case SbxBYREF | SbxUSHORT:
136             nRes = *p->pUShort ? SbxTRUE : SbxFALSE; break;
137         case SbxBYREF | SbxSINGLE:
138             nRes = ( *p->pSingle != 0 ) ? SbxTRUE : SbxFALSE; break;
139         case SbxBYREF | SbxDATE:
140         case SbxBYREF | SbxDOUBLE:
141             nRes = ( *p->pDouble != 0 ) ? SbxTRUE : SbxFALSE; break;
142         case SbxBYREF | SbxSALINT64:
143             nRes = ( *p->pnInt64 ) ? SbxTRUE : SbxFALSE; break;
144         case SbxBYREF | SbxSALUINT64:
145             nRes = ( *p->puInt64 ) ? SbxTRUE : SbxFALSE; break;
146         case SbxBYREF | SbxULONG64:
147             nRes = !!*p->pULong64 ? SbxTRUE : SbxFALSE; break;
148         case SbxBYREF | SbxLONG64:
149         case SbxBYREF | SbxCURRENCY:
150             nRes = !!*p->pLong64 ? SbxTRUE : SbxFALSE; break;
151 
152         default:
153             SbxBase::SetError( SbxERR_CONVERSION ); nRes = SbxFALSE;
154     }
155     return nRes;
156 }
157 
ImpPutBool(SbxValues * p,sal_Int16 n)158 void ImpPutBool( SbxValues* p, sal_Int16 n )
159 {
160     if( n )
161         n = SbxTRUE;
162     switch( +p->eType )
163     {
164         case SbxCHAR:
165             p->nChar = (xub_Unicode) n; break;
166         case SbxUINT:
167             p->nByte = (sal_uInt8) n; break;
168         case SbxINTEGER:
169         case SbxBOOL:
170             p->nInteger = n; break;
171         case SbxLONG:
172             p->nLong = n; break;
173         case SbxULONG:
174             p->nULong = (sal_uInt32) n; break;
175         case SbxERROR:
176         case SbxUSHORT:
177             p->nUShort = (sal_uInt16) n; break;
178         case SbxSINGLE:
179             p->nSingle = n; break;
180         case SbxDATE:
181         case SbxDOUBLE:
182             p->nDouble = n; break;
183         case SbxSALINT64:
184             p->nInt64 = n; break;
185         case SbxSALUINT64:
186             p->uInt64 = n; break;
187         case SbxULONG64:
188             p->nULong64.Set( (sal_uInt32)n ); break;
189         case SbxLONG64:
190         case SbxCURRENCY:
191             p->nLong64.Set( (sal_Int32)n ); break;
192         case SbxDECIMAL:
193         case SbxBYREF | SbxDECIMAL:
194             ImpCreateDecimal( p )->setInt( (sal_Int16)n );
195             break;
196 
197         case SbxBYREF | SbxSTRING:
198         case SbxSTRING:
199         case SbxLPSTR:
200             if ( !p->pOUString )
201                 p->pOUString = new ::rtl::OUString( SbxRes( n ? STRING_TRUE : STRING_FALSE ) );
202             else
203                 *p->pOUString = SbxRes( n ? STRING_TRUE : STRING_FALSE );
204             break;
205 
206         case SbxOBJECT:
207         {
208             SbxValue* pVal = PTR_CAST(SbxValue,p->pObj);
209             if( pVal )
210                 pVal->PutBool( sal_Bool( n != 0 ) );
211             else
212                 SbxBase::SetError( SbxERR_NO_OBJECT );
213             break;
214         }
215         case SbxBYREF | SbxCHAR:
216             *p->pChar = (xub_Unicode) n; break;
217         case SbxBYREF | SbxBYTE:
218             *p->pByte = (sal_uInt8) n; break;
219         case SbxBYREF | SbxINTEGER:
220         case SbxBYREF | SbxBOOL:
221             *p->pInteger = (sal_Int16) n; break;
222         case SbxBYREF | SbxERROR:
223         case SbxBYREF | SbxUSHORT:
224             *p->pUShort = (sal_uInt16) n; break;
225         case SbxBYREF | SbxLONG:
226             *p->pLong = n; break;
227         case SbxBYREF | SbxULONG:
228             *p->pULong = (sal_uInt32) n; break;
229         case SbxBYREF | SbxSINGLE:
230             *p->pSingle = n; break;
231         case SbxBYREF | SbxDATE:
232         case SbxBYREF | SbxDOUBLE:
233             *p->pDouble = n; break;
234         case SbxBYREF | SbxSALINT64:
235             *p->pnInt64 = n; break;
236         case SbxBYREF | SbxSALUINT64:
237             *p->puInt64 = n; break;
238         case SbxBYREF | SbxULONG64:
239             p->pULong64->Set( (sal_uInt32)n ); break;
240         case SbxBYREF | SbxLONG64:
241         case SbxBYREF | SbxCURRENCY:
242             p->pLong64->Set( (sal_Int32)n ); break;
243 
244         default:
245             SbxBase::SetError( SbxERR_CONVERSION );
246     }
247 }
248 
249