996
|
1 /*
|
|
2 * BDSM2
|
|
3 * Author: Adam Sawicki
|
|
4 * http://www.regedit.risp.pl
|
|
5 * mailto:regedit@risp.pl
|
|
6 */
|
|
7 #include "pch.hpp"
|
|
8 #include <sstream>
|
|
9 #include "Source.hpp"
|
|
10
|
|
11 string Source::Iterator::ToString() const
|
|
12 {
|
|
13 std::ostringstream ss;
|
|
14 ss << "index: " << (unsigned)Index << ", row: " << Row << ", col: " << Col;
|
|
15 return ss.str();
|
|
16 }
|
|
17
|
|
18 void Source::Forward()
|
|
19 {
|
|
20 if (Peek() == '\r')
|
|
21 {
|
|
22 }
|
|
23 else if (Peek() == '\n')
|
|
24 {
|
|
25 m_Index.Row++;
|
|
26 m_Index.Col = 1;
|
|
27 }
|
|
28 else
|
|
29 m_Index.Col++;
|
|
30
|
|
31 m_Index.Index++;
|
|
32 }
|
|
33
|
|
34 char Source::Get()
|
|
35 {
|
|
36 char ch = Peek();
|
|
37 Forward();
|
|
38 return ch;
|
|
39 }
|
|
40
|
|
41 Source::Source(const string *Src) : m_Src(Src), m_ErrIndexSaved(false)
|
|
42 {
|
|
43 m_Index.Index = 0;
|
|
44 m_Index.Row = 1;
|
|
45 m_Index.Col = 1;
|
|
46 }
|
|
47
|
|
48 char Source::GetS()
|
|
49 {
|
|
50 if (End())
|
|
51 SrcError("Unexpected end of file", ERR_PARSE);
|
|
52 return Get();
|
|
53 }
|
|
54
|
|
55 void Source::Skip()
|
|
56 {
|
|
57 char ch;
|
|
58 while (!End())
|
|
59 {
|
|
60 ch = Peek();
|
|
61 // Whitespace
|
|
62 if (ch == ' ' || ch == '\t' || ch == '\v' || ch == '\r' || ch == '\n')
|
|
63 Forward();
|
|
64 // Comment
|
|
65 else if (ch == '{')
|
|
66 {
|
|
67 Forward();
|
|
68 for (;;)
|
|
69 {
|
|
70 if (End())
|
|
71 SrcError("Unexpected end of comment", ERR_PARSE);
|
|
72 ch = Peek();
|
|
73 Forward();
|
|
74 if (ch == '}')
|
|
75 break;
|
|
76 }
|
|
77 }
|
|
78 else
|
|
79 break;
|
|
80 }
|
|
81 }
|
|
82
|
|
83 void Source::SrcError(const string &msg, ERR_PLACE place)
|
|
84 {
|
|
85 Error(msg + " (" + GetIterator().ToString() + ')', place);
|
|
86 }
|