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 10cdf0e10cSrcweir * 11*e1f63238SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 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 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 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() 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 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 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 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 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 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