|
1 |
| -// |
| 1 | +// |
2 | 2 | // DSCTokenizer.cs
|
3 | 3 | // This file is part of Ghostscript.NET library
|
4 | 4 | //
|
5 | 5 | // Author: Josip Habjan ([email protected], http://www.linkedin.com/in/habjan)
|
6 |
| -// Copyright (c) 2013-2016 by Josip Habjan. All rights reserved. |
| 6 | +// Copyright (c) 2013-2023 by Josip Habjan. All rights reserved. |
7 | 7 | //
|
8 | 8 | // Author ported some parts of this code from GSView.
|
9 | 9 | //
|
@@ -164,20 +164,32 @@ private DSCToken ReadUntil(string prefix, DSCTokenEnding end)
|
164 | 164 |
|
165 | 165 | while ((c = this.ReadChar()) > -1)
|
166 | 166 | {
|
| 167 | + // unix new line |
167 | 168 | if (c == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd)
|
168 | 169 | {
|
169 | 170 | token.Length = _bufferedStream.Position - 1 - token.StartPosition;
|
170 | 171 | token.Text = text.ToString().Trim();
|
171 | 172 | token.Ending = DSCTokenEnding.LineEnd;
|
172 | 173 | return token;
|
173 | 174 | }
|
174 |
| - else if (c == '\r' && this.ReadChar() == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd) |
| 175 | + // windows new line |
| 176 | + else if (c == '\r' && this.PeekChar() == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd) |
175 | 177 | {
|
| 178 | + this.ReadChar(); |
| 179 | + |
176 | 180 | token.Length = _bufferedStream.Position - 2 - token.StartPosition;
|
177 | 181 | token.Text = text.ToString().Trim();
|
178 | 182 | token.Ending = DSCTokenEnding.LineEnd;
|
179 | 183 | return token;
|
180 | 184 | }
|
| 185 | + // mac new line |
| 186 | + else if (c == '\r' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd) |
| 187 | + { |
| 188 | + token.Length = _bufferedStream.Position - 1 - token.StartPosition; |
| 189 | + token.Text = text.ToString().Trim(); |
| 190 | + token.Ending = DSCTokenEnding.LineEnd; |
| 191 | + return token; |
| 192 | + } |
181 | 193 | else if (c == ' ' && text.Length > 0 && lastAppendedChar != ' ' && (end & DSCTokenEnding.Whitespace) == DSCTokenEnding.Whitespace)
|
182 | 194 | {
|
183 | 195 | token.Length = _bufferedStream.Position - 1 - token.StartPosition;
|
@@ -223,7 +235,7 @@ public long FileSize
|
223 | 235 |
|
224 | 236 | #endregion
|
225 | 237 |
|
226 |
| - #region ReadByte |
| 238 | + #region ReadChar |
227 | 239 |
|
228 | 240 | private int ReadChar()
|
229 | 241 | {
|
@@ -254,6 +266,49 @@ private int ReadChar()
|
254 | 266 | }
|
255 | 267 |
|
256 | 268 | #endregion
|
| 269 | + |
| 270 | + #region PeekChar |
| 271 | + |
| 272 | + private int PeekChar() |
| 273 | + { |
| 274 | + if (_bufferedStream.Position == _bufferedStream.Length) |
| 275 | + { |
| 276 | + return -1; |
| 277 | + } |
| 278 | + |
| 279 | + if (_isUnicode) |
| 280 | + { |
| 281 | + byte[] b = new byte[2]; |
| 282 | + |
| 283 | + _bufferedStream.Read(b, 0, 2); |
| 284 | + |
| 285 | + int res = 0; |
| 286 | + |
| 287 | + if (_isLittleEndian) |
| 288 | + { |
| 289 | + res = (int)(b[0] | b[1] << 8); |
| 290 | + } |
| 291 | + else |
| 292 | + { |
| 293 | + res = (int)(b[0] << 8 | b[1]); |
| 294 | + } |
| 295 | + |
| 296 | + _bufferedStream.Position -= 2; |
| 297 | + |
| 298 | + return res; |
| 299 | + } |
| 300 | + else |
| 301 | + { |
| 302 | + int res = _bufferedStream.ReadByte(); |
| 303 | + |
| 304 | + _bufferedStream.Position--; |
| 305 | + |
| 306 | + return res; |
| 307 | + } |
| 308 | + } |
| 309 | + |
| 310 | + #endregion |
| 311 | + |
257 | 312 | }
|
258 | 313 |
|
259 | 314 | }
|
0 commit comments