1 /* Generated By:JavaCC: Do not edit this line. CharStream.cc Version 7.0 */
2 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
3 #include "CharStream.h"
4
5 namespace {
6 template <class T>
ArrayCopy(T * src,int src_offset,T * dest,int dest_offset,int len)7 void ArrayCopy(T* src, int src_offset, T* dest, int dest_offset, int len) {
8 for (int i = 0; i < len; i++) {
9 dest[dest_offset + i] = src[src_offset + i];
10 }
11 }
12
13 class StringReaderStream : public ReaderStream {
14 public:
StringReaderStream(const JJString & str)15 StringReaderStream(const JJString& str) : str_(str), cur_(0), max_(str.size()) {}
read(JJChar * bufptr,int offset,size_t len)16 virtual size_t read(JJChar *bufptr, int offset, size_t len) {
17 size_t count = str_.copy(bufptr + offset, len > max_ ? max_ : len, cur_);
18 cur_ += count;
19 max_ -= count;
20 return count;
21 }
~StringReaderStream()22 virtual ~StringReaderStream() {}
endOfInput()23 virtual bool endOfInput() {
24 return max_ == 0;
25 }
26
27 private:
28 const JJString str_;
29 size_t cur_;
30 size_t max_;
31 };
32 }
33
34 namespace vhdl {
35 namespace parser {
ReInit(const JJString & str,int startline,int startcolumn,int buffersize)36 void CharStream::ReInit(const JJString& str, int startline,
37 int startcolumn, int buffersize) {
38 StringReaderStream *stream = new StringReaderStream(str);
39 ReInit(stream, startline, startcolumn, buffersize);
40 deleteStream = true;
41 }
42
ReInit(ReaderStream * input_stream,int startline,int startcolumn,int buffersize)43 void CharStream::ReInit(ReaderStream *input_stream, int startline,
44 int startcolumn, int buffersize) {
45 if (deleteStream) {
46 delete inputStream;
47 }
48
49 if (buffer) {
50 DeleteBuffers();
51 }
52
53 available = bufsize = buffersize;
54 buffer = new JJChar[buffersize];
55 bufline = new int[buffersize];
56 bufcolumn = new int[buffersize];
57
58 column = startcolumn - 1;
59 inputStream = input_stream;
60 line = startline;
61 prevCharIsLF = prevCharIsCR = false;
62 tokenBegin = inBuf = maxNextCharInd = 0;
63 bufpos = -1;
64 deleteStream = false;
65 }
66
DeleteBuffers()67 void CharStream::DeleteBuffers() {
68 delete[] buffer;
69 delete[] bufline;
70 delete[] bufcolumn;
71 }
72
adjustBeginLineColumn(int newLine,int newCol)73 void CharStream::adjustBeginLineColumn(int newLine, int newCol) {
74 int start = tokenBegin;
75 int len;
76
77 if (bufpos >= tokenBegin) {
78 len = bufpos - tokenBegin + inBuf + 1;
79 } else {
80 len = bufsize - tokenBegin + bufpos + 1 + inBuf;
81 }
82
83 int i = 0, j = 0, k = 0;
84 int nextColDiff = 0, columnDiff = 0;
85
86 while (i < len && bufline[j = start % bufsize] ==
87 bufline[k = (start + 1) % bufsize]) {
88 bufline[j] = newLine;
89 nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
90 bufcolumn[j] = newCol + columnDiff;
91 columnDiff = nextColDiff;
92 i++;
93 start++;
94 }
95
96 if (i < len) {
97 bufline[j] = newLine++;
98 bufcolumn[j] = newCol + columnDiff;
99
100 while (i++ < len) {
101 if (bufline[j = start % bufsize] != bufline[(start + 1) % bufsize])
102 bufline[j] = newLine++;
103 else
104 bufline[j] = newLine;
105 start++;
106 }
107 }
108
109 line = bufline[j];
110 column = bufcolumn[j];
111 }
112
ExpandBuff(bool wrapAround)113 void CharStream::ExpandBuff(bool wrapAround) {
114 JJChar *newbuffer = new JJChar[bufsize + 2048];
115 int *newbufline = new int[bufsize + 2048];
116 int *newbufcolumn = new int[bufsize + 2048];
117
118 if (wrapAround) {
119 ArrayCopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
120 ArrayCopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
121 ArrayCopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
122 ArrayCopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
123 ArrayCopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
124 ArrayCopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
125 bufpos += (bufsize - tokenBegin);
126 } else {
127 ArrayCopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
128 ArrayCopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
129 ArrayCopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
130 bufpos -= tokenBegin;
131 }
132
133 maxNextCharInd = bufpos;
134 DeleteBuffers();
135 buffer = newbuffer;
136 bufline = newbufline;
137 bufcolumn = newbufcolumn;
138 bufsize += 2048;
139 available = bufsize;
140 tokenBegin = 0;
141 }
142
FillBuff()143 void CharStream::FillBuff() {
144 if (maxNextCharInd == available) {
145 if (available == bufsize) {
146 if (tokenBegin > 2048) {
147 bufpos = maxNextCharInd = 0;
148 available = tokenBegin;
149 } else if (tokenBegin < 0) {
150 bufpos = maxNextCharInd = 0;
151 } else {
152 ExpandBuff(false);
153 }
154 } else if (available > tokenBegin) {
155 available = bufsize;
156 } else if ((tokenBegin - available) < 2048) {
157 ExpandBuff(true);
158 } else {
159 available = tokenBegin;
160 }
161 }
162
163 size_t i = inputStream->read(buffer, maxNextCharInd, available - maxNextCharInd);
164 if (i > 0) {
165 maxNextCharInd += i;
166 } else {
167 --bufpos;
168 backup(0);
169 if (tokenBegin == -1) {
170 tokenBegin = bufpos;
171 }
172 }
173 }
174
UpdateLineColumn(JJChar c)175 void CharStream::UpdateLineColumn(JJChar c) {
176 column++;
177 if (prevCharIsLF) {
178 prevCharIsLF = false;
179 column = 1;
180 line++;
181 } else if (prevCharIsCR) {
182 prevCharIsCR = false;
183 if (c == '\n') {
184 prevCharIsLF = true;
185 } else {
186 column = 1;
187 line++;
188 }
189 }
190
191 switch (c) {
192 case '\r' :
193 prevCharIsCR = true;
194 break;
195 case '\n' :
196 prevCharIsLF = true;
197 break;
198 case '\t' :
199 column--;
200 column += (tabSize - (column % tabSize));
201 break;
202 default :
203 break;
204 }
205
206 bufline[bufpos] = line;
207 bufcolumn[bufpos] = column;
208 }
209
210 }
211 }
212 /* JavaCC - OriginalChecksum=0ba78d6c493d812eba61de6fa794fd15 (do not edit this line) */
213