1 /*
2  * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_ADLC_FILEBUFF_HPP
26 #define SHARE_ADLC_FILEBUFF_HPP
27 
28 // FILEBUFF.HPP - Definitions for parser file buffering routines
29 
30 // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES
31 
32 class BufferedFile {
33  public:
34   const char *_name;
35   FILE *_fp;
BufferedFile()36   inline BufferedFile() { _name = NULL; _fp = NULL; };
~BufferedFile()37   inline ~BufferedFile() {};
38 };
39 
40 class ArchDesc;
41 
42 //------------------------------FileBuff--------------------------------------
43 // This class defines a nicely behaved buffer of text.  Entire file of text
44 // is read into buffer at creation, with sentinels at start and end.
45 class FileBuff {
46  private:
47   long  _bufferSize;            // Size of text holding buffer.
48   long  _offset;                // Expected filepointer offset.
49   long  _bufoff;                // Start of buffer file offset
50 
51   char *_buf;                   // The buffer itself.
52   char *_bigbuf;                // The buffer plus sentinels; actual heap area
53   char *_bufmax;                // A pointer to the buffer end sentinel
54   char *_bufeol;                // A pointer to the last complete line end
55 
56   int   _err;                   // Error flag for file seek/read operations
57   long  _filepos;               // Current offset from start of file
58   int   _linenum;
59 
60   ArchDesc& _AD;                // Reference to Architecture Description
61 
62   // Error reporting function
63   void file_error(int flag, int linenum, const char *fmt, ...);
64 
65  public:
66   const BufferedFile *_fp;           // File to be buffered
67 
68   FileBuff(BufferedFile *fp, ArchDesc& archDesc); // Constructor
69   ~FileBuff();                  // Destructor
70 
71   // This returns a pointer to the start of the current line in the buffer,
72   // and increments bufeol and filepos to point at the end of that line.
73   char *get_line(void);
linenum() const74   int linenum() const { return _linenum; }
set_linenum(int line)75   void set_linenum(int line) { _linenum = line; }
76 
77   // This converts a pointer into the buffer to a file offset.  It only works
78   // when the pointer is valid (i.e. just obtained from getline()).
getoff(const char * s)79   long getoff(const char* s) { return _bufoff + (long)(s - _buf); }
80 };
81 #endif // SHARE_ADLC_FILEBUFF_HPP
82