1e1f63238SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3e1f63238SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4e1f63238SAndrew Rist * or more contributor license agreements. See the NOTICE file
5e1f63238SAndrew Rist * distributed with this work for additional information
6e1f63238SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7e1f63238SAndrew Rist * to you under the Apache License, Version 2.0 (the
8e1f63238SAndrew Rist * "License"); you may not use this file except in compliance
9e1f63238SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11e1f63238SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13e1f63238SAndrew Rist * Unless required by applicable law or agreed to in writing,
14e1f63238SAndrew Rist * software distributed under the License is distributed on an
15e1f63238SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16e1f63238SAndrew Rist * KIND, either express or implied. See the License for the
17e1f63238SAndrew Rist * specific language governing permissions and limitations
18e1f63238SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20e1f63238SAndrew Rist *************************************************************/
21e1f63238SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_basic.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir #include <tools/stream.hxx>
26cdf0e10cSrcweir #include "sbcomp.hxx"
27cdf0e10cSrcweir #include "iosys.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir // Test, ob ein I/O-Channel angegeben wurde
30cdf0e10cSrcweir
Channel(sal_Bool bAlways)31cdf0e10cSrcweir sal_Bool SbiParser::Channel( sal_Bool bAlways )
32cdf0e10cSrcweir {
33cdf0e10cSrcweir sal_Bool bRes = sal_False;
34cdf0e10cSrcweir Peek();
35cdf0e10cSrcweir if( IsHash() )
36cdf0e10cSrcweir {
37cdf0e10cSrcweir SbiExpression aExpr( this );
38cdf0e10cSrcweir while( Peek() == COMMA || Peek() == SEMICOLON )
39cdf0e10cSrcweir Next();
40cdf0e10cSrcweir aExpr.Gen();
41cdf0e10cSrcweir aGen.Gen( _CHANNEL );
42cdf0e10cSrcweir bRes = sal_True;
43cdf0e10cSrcweir }
44cdf0e10cSrcweir else if( bAlways )
45cdf0e10cSrcweir Error( SbERR_EXPECTED, "#" );
46cdf0e10cSrcweir return bRes;
47cdf0e10cSrcweir }
48cdf0e10cSrcweir
498520597dSmseidel // Für PRINT und WRITE wird bei Objektvariablen versucht,
50cdf0e10cSrcweir // die Default-Property anzusprechen.
51cdf0e10cSrcweir
52cdf0e10cSrcweir // PRINT
53cdf0e10cSrcweir
Print()54cdf0e10cSrcweir void SbiParser::Print()
55cdf0e10cSrcweir {
56cdf0e10cSrcweir sal_Bool bChan = Channel();
578520597dSmseidel // Die Ausdrücke zum drucken:
58cdf0e10cSrcweir while( !bAbort )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir if( !IsEoln( Peek() ) )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this );
63cdf0e10cSrcweir pExpr->Gen();
64cdf0e10cSrcweir delete pExpr;
65cdf0e10cSrcweir Peek();
66cdf0e10cSrcweir aGen.Gen( eCurTok == COMMA ? _PRINTF : _BPRINT );
67cdf0e10cSrcweir }
68cdf0e10cSrcweir if( eCurTok == COMMA || eCurTok == SEMICOLON )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir Next();
71cdf0e10cSrcweir if( IsEoln( Peek() ) ) break;
72cdf0e10cSrcweir }
73cdf0e10cSrcweir else
74cdf0e10cSrcweir {
75cdf0e10cSrcweir aGen.Gen( _PRCHAR, '\n' );
76cdf0e10cSrcweir break;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir }
79cdf0e10cSrcweir if( bChan )
80cdf0e10cSrcweir aGen.Gen( _CHAN0 );
81cdf0e10cSrcweir }
82cdf0e10cSrcweir
83cdf0e10cSrcweir // WRITE #chan, expr, ...
84cdf0e10cSrcweir
Write()85cdf0e10cSrcweir void SbiParser::Write()
86cdf0e10cSrcweir {
87cdf0e10cSrcweir sal_Bool bChan = Channel();
888520597dSmseidel // Die Ausdrücke zum drucken:
89cdf0e10cSrcweir while( !bAbort )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this );
92cdf0e10cSrcweir pExpr->Gen();
93cdf0e10cSrcweir delete pExpr;
94cdf0e10cSrcweir aGen.Gen( _BWRITE );
95cdf0e10cSrcweir if( Peek() == COMMA )
96cdf0e10cSrcweir {
97cdf0e10cSrcweir aGen.Gen( _PRCHAR, ',' );
98cdf0e10cSrcweir Next();
99cdf0e10cSrcweir if( IsEoln( Peek() ) ) break;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir else
102cdf0e10cSrcweir {
103cdf0e10cSrcweir aGen.Gen( _PRCHAR, '\n' );
104cdf0e10cSrcweir break;
105cdf0e10cSrcweir }
106cdf0e10cSrcweir }
107cdf0e10cSrcweir if( bChan )
108cdf0e10cSrcweir aGen.Gen( _CHAN0 );
109cdf0e10cSrcweir }
110cdf0e10cSrcweir
111cdf0e10cSrcweir
112cdf0e10cSrcweir // #i92642 Handle LINE keyword outside ::Next()
Line()113cdf0e10cSrcweir void SbiParser::Line()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir // #i92642: Special handling to allow name as symbol
116cdf0e10cSrcweir if( Peek() == INPUT )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir Next();
119cdf0e10cSrcweir LineInput();
120cdf0e10cSrcweir }
121cdf0e10cSrcweir else
122cdf0e10cSrcweir {
123cdf0e10cSrcweir aGen.Statement();
124cdf0e10cSrcweir
125cdf0e10cSrcweir KeywordSymbolInfo aInfo;
126cdf0e10cSrcweir aInfo.m_aKeywordSymbol = String( RTL_CONSTASCII_USTRINGPARAM( "line" ) );
127cdf0e10cSrcweir aInfo.m_eSbxDataType = GetType();
128cdf0e10cSrcweir aInfo.m_eTok = SYMBOL;
129cdf0e10cSrcweir
130cdf0e10cSrcweir Symbol( &aInfo );
131cdf0e10cSrcweir }
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
134cdf0e10cSrcweir
135cdf0e10cSrcweir // LINE INPUT [prompt], var$
136cdf0e10cSrcweir
LineInput()137cdf0e10cSrcweir void SbiParser::LineInput()
138cdf0e10cSrcweir {
139cdf0e10cSrcweir Channel( sal_True );
140cdf0e10cSrcweir // sal_Bool bChan = Channel( sal_True );
141cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this, SbOPERAND );
142cdf0e10cSrcweir /* AB 15.1.96: Keinen allgemeinen Ausdruck mehr zulassen
143cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this );
144cdf0e10cSrcweir if( !pExpr->IsVariable() )
145cdf0e10cSrcweir {
146cdf0e10cSrcweir SbiToken eTok = Peek();
147cdf0e10cSrcweir if( eTok == COMMA || eTok == SEMICOLON ) Next();
148cdf0e10cSrcweir else Error( SbERR_EXPECTED, COMMA );
149cdf0e10cSrcweir // mit Prompt
150cdf0e10cSrcweir if( !bChan )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir pExpr->Gen();
153cdf0e10cSrcweir aGen.Gen( _PROMPT );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir else
156cdf0e10cSrcweir Error( SbERR_VAR_EXPECTED );
157cdf0e10cSrcweir delete pExpr;
158cdf0e10cSrcweir pExpr = new SbiExpression( this, SbOPERAND );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir */
161cdf0e10cSrcweir if( !pExpr->IsVariable() )
162cdf0e10cSrcweir Error( SbERR_VAR_EXPECTED );
163cdf0e10cSrcweir if( pExpr->GetType() != SbxVARIANT && pExpr->GetType() != SbxSTRING )
164cdf0e10cSrcweir Error( SbERR_CONVERSION );
165cdf0e10cSrcweir pExpr->Gen();
166cdf0e10cSrcweir aGen.Gen( _LINPUT );
167cdf0e10cSrcweir delete pExpr;
168cdf0e10cSrcweir aGen.Gen( _CHAN0 ); // ResetChannel() nicht mehr in StepLINPUT()
169cdf0e10cSrcweir }
170cdf0e10cSrcweir
171cdf0e10cSrcweir // INPUT
172cdf0e10cSrcweir
Input()173cdf0e10cSrcweir void SbiParser::Input()
174cdf0e10cSrcweir {
175cdf0e10cSrcweir aGen.Gen( _RESTART );
176cdf0e10cSrcweir Channel( sal_True );
177cdf0e10cSrcweir // sal_Bool bChan = Channel( sal_True );
178cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this, SbOPERAND );
179cdf0e10cSrcweir /* ALT: Jetzt keinen allgemeinen Ausdruck mehr zulassen
180cdf0e10cSrcweir SbiExpression* pExpr = new SbiExpression( this );
181cdf0e10cSrcweir ...
182cdf0e10cSrcweir siehe LineInput
183cdf0e10cSrcweir */
184cdf0e10cSrcweir while( !bAbort )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir if( !pExpr->IsVariable() )
187cdf0e10cSrcweir Error( SbERR_VAR_EXPECTED );
188cdf0e10cSrcweir pExpr->Gen();
189cdf0e10cSrcweir aGen.Gen( _INPUT );
190cdf0e10cSrcweir if( Peek() == COMMA )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir Next();
193cdf0e10cSrcweir delete pExpr;
194cdf0e10cSrcweir pExpr = new SbiExpression( this, SbOPERAND );
195cdf0e10cSrcweir }
196cdf0e10cSrcweir else break;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir delete pExpr;
199cdf0e10cSrcweir aGen.Gen( _CHAN0 ); // ResetChannel() nicht mehr in StepINPUT()
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202*141ed1b0SJohn Bampton // OPEN stringexpr FOR mode ACCESS access mode AS Channel [Len=n]
203cdf0e10cSrcweir
Open()204cdf0e10cSrcweir void SbiParser::Open()
205cdf0e10cSrcweir {
206cdf0e10cSrcweir SbiExpression aFileName( this );
207cdf0e10cSrcweir SbiToken eTok;
208cdf0e10cSrcweir TestToken( FOR );
209cdf0e10cSrcweir short nMode = 0;
210cdf0e10cSrcweir short nFlags = 0;
211cdf0e10cSrcweir switch( Next() )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir case INPUT:
214cdf0e10cSrcweir nMode = STREAM_READ; nFlags |= SBSTRM_INPUT; break;
215cdf0e10cSrcweir case OUTPUT:
216cdf0e10cSrcweir nMode = STREAM_WRITE | STREAM_TRUNC; nFlags |= SBSTRM_OUTPUT; break;
217cdf0e10cSrcweir case APPEND:
218cdf0e10cSrcweir nMode = STREAM_WRITE; nFlags |= SBSTRM_APPEND; break;
219cdf0e10cSrcweir case RANDOM:
220cdf0e10cSrcweir nMode = STREAM_READ | STREAM_WRITE; nFlags |= SBSTRM_RANDOM; break;
221cdf0e10cSrcweir case BINARY:
222cdf0e10cSrcweir nMode = STREAM_READ | STREAM_WRITE; nFlags |= SBSTRM_BINARY; break;
223cdf0e10cSrcweir default:
224cdf0e10cSrcweir Error( SbERR_SYNTAX );
225cdf0e10cSrcweir }
226cdf0e10cSrcweir if( Peek() == ACCESS )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir Next();
229cdf0e10cSrcweir eTok = Next();
230cdf0e10cSrcweir // #27964# Nur STREAM_READ,STREAM_WRITE-Flags in nMode beeinflussen
2318520597dSmseidel nMode &= ~(STREAM_READ | STREAM_WRITE); // löschen
232cdf0e10cSrcweir if( eTok == READ )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir if( Peek() == WRITE )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir Next();
237cdf0e10cSrcweir nMode |= (STREAM_READ | STREAM_WRITE);
238cdf0e10cSrcweir }
239cdf0e10cSrcweir else
240cdf0e10cSrcweir nMode |= STREAM_READ;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir else if( eTok == WRITE )
243cdf0e10cSrcweir nMode |= STREAM_WRITE;
244cdf0e10cSrcweir else
245cdf0e10cSrcweir Error( SbERR_SYNTAX );
246cdf0e10cSrcweir }
247cdf0e10cSrcweir switch( Peek() )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir #ifdef SHARED
250cdf0e10cSrcweir #undef SHARED
251cdf0e10cSrcweir #define tmpSHARED
252cdf0e10cSrcweir #endif
253cdf0e10cSrcweir case SHARED:
254cdf0e10cSrcweir Next(); nMode |= STREAM_SHARE_DENYNONE; break;
255cdf0e10cSrcweir #ifdef tmpSHARED
256cdf0e10cSrcweir #define SHARED
257cdf0e10cSrcweir #undef tmpSHARED
258cdf0e10cSrcweir #endif
259cdf0e10cSrcweir case LOCK:
260cdf0e10cSrcweir Next();
261cdf0e10cSrcweir eTok = Next();
262cdf0e10cSrcweir if( eTok == READ )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir if( Peek() == WRITE ) Next(), nMode |= STREAM_SHARE_DENYALL;
265cdf0e10cSrcweir else nMode |= STREAM_SHARE_DENYREAD;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir else if( eTok == WRITE )
268cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYWRITE;
269cdf0e10cSrcweir else
270cdf0e10cSrcweir Error( SbERR_SYNTAX );
271cdf0e10cSrcweir break;
272cdf0e10cSrcweir default: break;
273cdf0e10cSrcweir }
274cdf0e10cSrcweir TestToken( AS );
275cdf0e10cSrcweir // Die Kanalnummer
276cdf0e10cSrcweir SbiExpression* pChan = new SbiExpression( this );
277cdf0e10cSrcweir if( !pChan )
278cdf0e10cSrcweir Error( SbERR_SYNTAX );
279cdf0e10cSrcweir SbiExpression* pLen = NULL;
280cdf0e10cSrcweir if( Peek() == SYMBOL )
281cdf0e10cSrcweir {
282cdf0e10cSrcweir Next();
283cdf0e10cSrcweir String aLen( aSym );
284cdf0e10cSrcweir if( aLen.EqualsIgnoreCaseAscii( "LEN" ) )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir TestToken( EQ );
287cdf0e10cSrcweir pLen = new SbiExpression( this );
288cdf0e10cSrcweir }
289cdf0e10cSrcweir }
290cdf0e10cSrcweir if( !pLen ) pLen = new SbiExpression( this, 128, SbxINTEGER );
2918520597dSmseidel // Der Stack für den OPEN-Befehl sieht wie folgt aus:
2928520597dSmseidel // Blocklänge
293cdf0e10cSrcweir // Kanalnummer
294cdf0e10cSrcweir // Dateiname
295cdf0e10cSrcweir pLen->Gen();
296cdf0e10cSrcweir if( pChan )
297cdf0e10cSrcweir pChan->Gen();
298cdf0e10cSrcweir aFileName.Gen();
299cdf0e10cSrcweir aGen.Gen( _OPEN, nMode, nFlags );
300cdf0e10cSrcweir delete pLen;
301cdf0e10cSrcweir delete pChan;
302cdf0e10cSrcweir }
303cdf0e10cSrcweir
304cdf0e10cSrcweir // NAME file AS file
305cdf0e10cSrcweir
Name()306cdf0e10cSrcweir void SbiParser::Name()
307cdf0e10cSrcweir {
308cdf0e10cSrcweir // #i92642: Special handling to allow name as symbol
309cdf0e10cSrcweir if( Peek() == EQ )
310cdf0e10cSrcweir {
311cdf0e10cSrcweir aGen.Statement();
312cdf0e10cSrcweir
313cdf0e10cSrcweir KeywordSymbolInfo aInfo;
314cdf0e10cSrcweir aInfo.m_aKeywordSymbol = String( RTL_CONSTASCII_USTRINGPARAM( "name" ) );
315cdf0e10cSrcweir aInfo.m_eSbxDataType = GetType();
316cdf0e10cSrcweir aInfo.m_eTok = SYMBOL;
317cdf0e10cSrcweir
318cdf0e10cSrcweir Symbol( &aInfo );
319cdf0e10cSrcweir return;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir SbiExpression aExpr1( this );
322cdf0e10cSrcweir TestToken( AS );
323cdf0e10cSrcweir SbiExpression aExpr2( this );
324cdf0e10cSrcweir aExpr1.Gen();
325cdf0e10cSrcweir aExpr2.Gen();
326cdf0e10cSrcweir aGen.Gen( _RENAME );
327cdf0e10cSrcweir }
328cdf0e10cSrcweir
329cdf0e10cSrcweir // CLOSE [n,...]
330cdf0e10cSrcweir
Close()331cdf0e10cSrcweir void SbiParser::Close()
332cdf0e10cSrcweir {
333cdf0e10cSrcweir Peek();
334cdf0e10cSrcweir if( IsEoln( eCurTok ) )
335cdf0e10cSrcweir aGen.Gen( _CLOSE, 0 );
336cdf0e10cSrcweir else
337cdf0e10cSrcweir for( ;; )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir SbiExpression aExpr( this );
340cdf0e10cSrcweir while( Peek() == COMMA || Peek() == SEMICOLON )
341cdf0e10cSrcweir Next();
342cdf0e10cSrcweir aExpr.Gen();
343cdf0e10cSrcweir aGen.Gen( _CHANNEL );
344cdf0e10cSrcweir aGen.Gen( _CLOSE, 1 );
345cdf0e10cSrcweir
346cdf0e10cSrcweir if( IsEoln( Peek() ) )
347cdf0e10cSrcweir break;
348cdf0e10cSrcweir }
349cdf0e10cSrcweir }
350cdf0e10cSrcweir
3518520597dSmseidel /* vim: set noet sw=4 ts=4: */
352