xref: /AOO42X/main/basic/source/comp/io.cxx (revision 1a9ecf28287d28b6b3ee0448b1cc3a0b3483019e)
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 
49a5246554Smseidel // 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();
57a5246554Smseidel     // 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();
88a5246554Smseidel     // 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*1a9ecf28SJohn 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
231a5246554Smseidel         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 );
291a5246554Smseidel     // Der Stack für den OPEN-Befehl sieht wie folgt aus:
292a5246554Smseidel     // 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 
351a5246554Smseidel /* vim: set noet sw=4 ts=4: */
352