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