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 :
21 : #include <limits.h>
22 : #include <ctype.h>
23 : #include <bastype.hxx>
24 : #include <lex.hxx>
25 : #include <globals.hxx>
26 : #include <hash.hxx>
27 : #include <database.hxx>
28 :
29 205 : static bool ReadRangeSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm,
30 : sal_uLong nMin, sal_uLong nMax, sal_uLong* pValue )
31 : {
32 205 : sal_uInt32 nTokPos = rInStm.Tell();
33 205 : SvToken * pTok = rInStm.GetToken_Next();
34 205 : if( pTok->Is( pName ) )
35 : {
36 0 : bool bOk = false;
37 0 : if( rInStm.Read( '=' ) )
38 : {
39 0 : pTok = rInStm.GetToken_Next();
40 0 : if( pTok->IsInteger() )
41 : {
42 0 : sal_uLong n = pTok->GetNumber();
43 0 : if ( n >= nMin && n <= nMax )
44 : {
45 0 : *pValue = n;
46 0 : bOk = true;
47 : }
48 : }
49 : }
50 :
51 0 : if( bOk )
52 0 : return true;
53 : }
54 :
55 205 : rInStm.Seek( nTokPos );
56 205 : return false;
57 : }
58 :
59 0 : SvStream& WriteSvBOOL(SvStream & rStm, const SvBOOL & rb )
60 : {
61 0 : sal_uInt8 n = rb.nVal;
62 0 : if( rb.bSet )
63 0 : n |= 0x02;
64 0 : rStm.WriteUChar( n );
65 0 : return rStm;
66 : }
67 0 : SvStream& operator >> (SvStream & rStm, SvBOOL & rb )
68 : {
69 : sal_uInt8 n;
70 0 : rStm.ReadUChar( n );
71 0 : rb.nVal = (n & 0x01) ? sal_True : sal_False;
72 0 : rb.bSet = (n & 0x02) ? sal_True : sal_False;
73 0 : if( n & ~0x03 )
74 : {
75 0 : rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
76 : OSL_FAIL( "format error" );
77 : }
78 0 : return rStm;
79 : }
80 :
81 0 : SvStream& WriteSvVersion(SvStream & rStm, const SvVersion & r )
82 : {
83 0 : if( (r.GetMajorVersion() || r.GetMinorVersion())
84 0 : && r.GetMajorVersion() <= 0x0F && r.GetMinorVersion() <= 0x0F )
85 : { // compress version number in 1 byte
86 : // format first 4 bit for major, then 4 bit for minor
87 : // 0.0 gets not compressed
88 :
89 0 : int n = r.GetMajorVersion() << 4;
90 0 : n |= r.GetMinorVersion();
91 0 : rStm.WriteUChar( n );
92 : }
93 : else
94 : {
95 0 : rStm.WriteUChar( 0 );
96 0 : rStm.WriteUInt16( r.GetMajorVersion() );
97 0 : rStm.WriteUInt16( r.GetMinorVersion() );
98 : }
99 0 : return rStm;
100 : }
101 :
102 0 : SvStream& operator >> (SvStream & rStm, SvVersion & r )
103 : {
104 : sal_uInt8 n;
105 0 : rStm.ReadUChar( n );
106 0 : if( n == 0 )
107 : { // not compressed
108 0 : rStm.ReadUInt16( r.nMajorVersion );
109 0 : rStm.ReadUInt16( r.nMinorVersion );
110 : }
111 : else
112 : { // compressed
113 0 : r.nMajorVersion = (n >> 4) & 0x0F;
114 0 : r.nMinorVersion = n & 0x0F;
115 : }
116 0 : return rStm;
117 : }
118 :
119 :
120 5042050 : bool SvBOOL::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
121 : {
122 5042050 : sal_uInt32 nTokPos = rInStm.Tell();
123 5042050 : SvToken * pTok = rInStm.GetToken_Next();
124 :
125 5042050 : if( pTok->Is( pName ) )
126 : {
127 133245 : bool bOk = true;
128 133245 : bool bBraket = rInStm.Read( '(' );
129 133245 : if( bBraket || rInStm.Read( '=' ) )
130 : {
131 108960 : pTok = rInStm.GetToken();
132 108960 : if( pTok->IsBool() )
133 : {
134 100878 : *this = pTok->GetBool();
135 :
136 100878 : rInStm.GetToken_Next();
137 : }
138 108960 : if( bOk && bBraket )
139 0 : bOk = rInStm.Read( ')' );
140 : }
141 : else
142 24285 : *this = true; //default action set to TRUE
143 133245 : if( bOk )
144 133245 : return true;
145 : }
146 4908805 : rInStm.Seek( nTokPos );
147 4908805 : return false;
148 : }
149 :
150 1139259 : bool SvIdentifier::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
151 : {
152 1139259 : sal_uInt32 nTokPos = rInStm.Tell();
153 1139259 : SvToken * pTok = rInStm.GetToken_Next();
154 :
155 1139259 : if( pTok->Is( pName ) )
156 : {
157 15801 : bool bOk = true;
158 15801 : bool bBraket = rInStm.Read( '(' );
159 15801 : if( bBraket || rInStm.Read( '=' ) )
160 : {
161 15801 : pTok = rInStm.GetToken();
162 15801 : if( pTok->IsIdentifier() )
163 : {
164 15515 : setString(pTok->GetString());
165 15515 : rInStm.GetToken_Next();
166 : }
167 15801 : if( bOk && bBraket )
168 0 : bOk = rInStm.Read( ')' );
169 : }
170 15801 : if( bOk )
171 15801 : return true;
172 : }
173 1123458 : rInStm.Seek( nTokPos );
174 1123458 : return false;
175 : }
176 :
177 325527 : bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
178 : SvStringHashEntry * pName,
179 : SvTokenStream & rInStm )
180 : {
181 325527 : if( SvIdentifier::ReadSvIdl( pName, rInStm ) )
182 : {
183 : sal_uLong n;
184 0 : if( rBase.FindId( getString(), &n ) )
185 : {
186 0 : nValue = n;
187 0 : return true;
188 : }
189 : else
190 : {
191 0 : OStringBuffer aStr("no value for identifier <");
192 0 : aStr.append(getString()).append("> ");
193 0 : rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
194 0 : rBase.WriteError( rInStm );
195 : }
196 : }
197 325527 : return false;
198 : }
199 :
200 12945 : bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
201 : SvTokenStream & rInStm )
202 : {
203 12945 : sal_uInt32 nTokPos = rInStm.Tell();
204 12945 : SvToken * pTok = rInStm.GetToken_Next();
205 :
206 12945 : if( pTok->IsIdentifier() )
207 : {
208 : sal_uLong n;
209 12914 : if( rBase.FindId( pTok->GetString(), &n ) )
210 : {
211 12914 : setString(pTok->GetString());
212 12914 : nValue = n;
213 12914 : return true;
214 : }
215 : else
216 : {
217 0 : OStringBuffer aStr("no value for identifier <");
218 0 : aStr.append(getString()).append("> ");
219 0 : rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
220 0 : rBase.WriteError( rInStm );
221 : }
222 : }
223 31 : rInStm.Seek( nTokPos );
224 31 : return false;
225 : }
226 :
227 976820 : bool SvString::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
228 : {
229 976820 : sal_uInt32 nTokPos = rInStm.Tell();
230 976820 : SvToken * pTok = rInStm.GetToken_Next();
231 :
232 976820 : if( pTok->Is( pName ) )
233 : {
234 665 : bool bOk = true;
235 665 : bool bBraket = rInStm.Read( '(' );
236 665 : if( bBraket || rInStm.Read( '=' ) )
237 : {
238 665 : pTok = rInStm.GetToken();
239 665 : if( pTok->IsString() )
240 : {
241 665 : setString(pTok->GetString());
242 665 : rInStm.GetToken_Next();
243 : }
244 665 : if( bOk && bBraket )
245 23 : bOk = rInStm.Read( ')' );
246 : }
247 665 : if( bOk )
248 665 : return true;
249 : }
250 976155 : rInStm.Seek( nTokPos );
251 976155 : return false;
252 : }
253 :
254 0 : SvStream& WriteSvString(SvStream & rStm, const SvString & r )
255 : {
256 0 : write_uInt16_lenPrefixed_uInt8s_FromOString(rStm, r.getString());
257 0 : return rStm;
258 : }
259 :
260 0 : SvStream& operator >> (SvStream & rStm, SvString & r )
261 : {
262 0 : r.setString(read_uInt16_lenPrefixed_uInt8s_ToOString(rStm));
263 0 : return rStm;
264 : }
265 :
266 :
267 162866 : bool SvHelpText::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
268 : {
269 162866 : return SvString::ReadSvIdl( SvHash_HelpText(), rInStm );
270 : }
271 :
272 205 : bool SvUUId::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
273 : {
274 205 : sal_uInt32 nTokPos = rInStm.Tell();
275 205 : SvToken * pTok = rInStm.GetToken_Next();
276 :
277 205 : if( pTok->Is( SvHash_uuid() ) )
278 : {
279 68 : bool bOk = true;
280 68 : bool bBraket = rInStm.Read( '(' );
281 68 : if( bBraket || rInStm.Read( '=' ) )
282 : {
283 68 : pTok = rInStm.GetToken();
284 68 : if( pTok->IsString() )
285 : {
286 68 : pTok = rInStm.GetToken_Next();
287 68 : bOk = MakeId(OStringToOUString(pTok->GetString(), RTL_TEXTENCODING_ASCII_US));
288 : }
289 68 : if( bOk && bBraket )
290 26 : bOk = rInStm.Read( ')' );
291 : }
292 68 : if( bOk )
293 68 : return true;
294 : }
295 137 : rInStm.Seek( nTokPos );
296 137 : return false;
297 : }
298 :
299 205 : bool SvVersion::ReadSvIdl( SvTokenStream & rInStm )
300 : {
301 205 : sal_uLong n = 0;
302 :
303 205 : sal_uInt32 nTokPos = rInStm.Tell();
304 205 : if( ReadRangeSvIdl( SvHash_Version(), rInStm, 0 , 0xFFFF, &n ) )
305 : {
306 0 : nMajorVersion = (sal_uInt16)n;
307 0 : if( rInStm.Read( '.' ) )
308 : {
309 0 : SvToken * pTok = rInStm.GetToken_Next();
310 0 : if( pTok->IsInteger() && pTok->GetNumber() <= 0xFFFF )
311 : {
312 0 : nMinorVersion = (sal_uInt16)pTok->GetNumber();
313 0 : return true;
314 : }
315 : }
316 : else
317 0 : return true;
318 : }
319 205 : rInStm.Seek( nTokPos );
320 205 : return false;
321 : }
322 :
323 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|