xref: /core/basic/source/inc/scanner.hxx (revision 67c15910)
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 #pragma once
21 
22 #include <basic/sbxdef.hxx>
23 #include <vcl/errcode.hxx>
24 
25 // The scanner is stand-alone, i. e. it can be used from everywhere.
26 // A BASIC-instance is necessary for error messages. Without BASIC
27 // the errors are only counted. Also the BASIC is necessary when an
28 // advanced SBX-variable shall be used for data type recognition etc.
29 
30 class StarBASIC;
31 
32 class SbiScanner
33 {
34     OUString   aBuf;             // input buffer
35     OUString   aLine;
36     sal_Int32 nLineIdx;
37     sal_Int32 nSaveLineIdx;
38     StarBASIC* pBasic;                  // instance for error callbacks
39 
40     void scanAlphanumeric();
41     void scanGoto();
42     bool readLine();
43 protected:
44     OUString aSym;
45     OUString aError;
46     SbxDataType eScanType;
47     double nVal;                        // numeric value
48     sal_Int32 nSavedCol1;
49     sal_Int32 nCol;
50     sal_Int32 nErrors;
51     sal_Int32 nColLock;                    // lock counter for Col1
52     sal_Int32 nBufPos;
53     sal_Int32 nLine;
54     sal_Int32 nCol1, nCol2;
55     bool   bSymbol;                     // true: symbol scanned
56     bool   bNumber;                     // true: number scanned
57     bool   bSpaces;                     // true: whitespace before token
58     bool   bAbort;
59     bool   bHash;                       // true: # has been read in
60     bool   bError;                      // true: generate error
61     bool   bCompatible;                 // true: OPTION compatible
62     bool   bVBASupportOn;               // true: OPTION VBASupport 1 otherwise default False
63     bool   bPrevLineExtentsComment;     // true: Previous line is comment and ends on "... _"
64     bool   bClosingUnderscore;          // true: Closing underscore followed by end of line
65 
66     bool   bInStatement;
67     void   GenError( ErrCode );
68 public:
69     SbiScanner( const OUString&, StarBASIC* = nullptr );
70 
71     void  EnableErrors()            { bError = false; }
72     bool  IsHash() const            { return bHash;   }
73     bool  IsCompatible() const      { return bCompatible; }
74     void  SetCompatible( bool b )   { bCompatible = b; }        // #118206
75     bool  IsVBASupportOn() const    { return bVBASupportOn; }
76     bool  WhiteSpace() const        { return bSpaces; }
77     sal_Int32 GetErrors() const     { return nErrors; }
78     sal_Int32 GetLine() const       { return nLine;   }
79     sal_Int32 GetCol1() const       { return nCol1;   }
80     void  SetCol1( sal_Int32 n )    { nCol1 = n;      }
81     StarBASIC* GetBasic()           { return pBasic;  }
82     void  SaveLine()                { nSaveLineIdx = nLineIdx; }
83     void  RestoreLine()             { nLineIdx = nSaveLineIdx; }
84     void  LockColumn();
85     void  UnlockColumn();
86     bool  DoesColonFollow();
87 
88     bool NextSym();
89     const OUString& GetSym() const  { return aSym;  }
90     SbxDataType GetType() const     { return eScanType; }
91     double    GetDbl() const        { return nVal;  }
92 };
93 
94 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
95