1
2 #include "textcutter.h"
3
TextCutter(const wxString & allText,FortranSourceForm fsForm)4 TextCutter::TextCutter(const wxString& allText, FortranSourceForm fsForm)
5 {
6 m_Text = allText;
7 m_TextLen = m_Text.length();
8 m_CurSourceForm = fsForm;
9 m_CurIdx = 0;
10 m_CurColumn = 1;
11 }
12
~TextCutter()13 TextCutter::~TextCutter()
14 {
15 };
16
GetChunk(wxString & chunk,bool & isWord)17 void TextCutter::GetChunk(wxString& chunk, bool& isWord)
18 {
19 isWord = false;
20 chunk = wxEmptyString;
21 if (IsEOF())
22 return;
23
24 unsigned int start = m_CurIdx;
25 if (isalpha(CurrentChar()) || CurrentChar() == '_')
26 {
27 while (!IsEOF() &&
28 (isalnum(CurrentChar()) || CurrentChar() == '_'))
29 MoveToNextChar();
30 chunk = m_Text.Mid(start, m_CurIdx - start);
31 isWord = true;
32 }
33 else
34 {
35 SkipWhiteSpace();
36 SkipUnwanted();
37 if (start != m_CurIdx)
38 {
39 chunk = m_Text.Mid(start, m_CurIdx - start);
40 return;
41 }
42
43 if (isdigit(CurrentChar()))
44 {
45 // numbers
46 while (!IsEOF() && CharInString(CurrentChar(), "0123456789.abcdefABCDEFXxLl"))
47 MoveToNextChar();
48
49 }
50 else if (CurrentChar() == '"' ||
51 CurrentChar() == '\'')
52 {
53 // string, char, etc.
54 wxChar match = CurrentChar();
55 MoveToNextChar(); // skip starting ' or "
56 SkipToChar(match);
57 MoveToNextChar(); // skip ending ' or "
58 }
59 else
60 {
61 MoveToNextChar();
62 }
63 chunk = m_Text.Mid(start, m_CurIdx - start);
64 }
65 return;
66 }
67
SkipWhiteSpace()68 bool TextCutter::SkipWhiteSpace()
69 {
70 if (IsEOF())
71 return false;
72 while (!IsEOF() && isspace(CurrentChar()))
73 MoveToNextChar();
74 return true;
75 }
76
MoveToNextChar()77 bool TextCutter::MoveToNextChar()
78 {
79 if (IsEOF())
80 {
81 return false;
82 }
83 ++m_CurIdx;
84 ++m_CurColumn;
85 AdjustColumn();
86 return true;
87 }
88
AdjustColumn()89 void TextCutter::AdjustColumn()
90 {
91 if (CurrentChar() == '\n')
92 m_CurColumn = 0;
93 }
94
CurrentChar()95 wxChar TextCutter::CurrentChar()
96 {
97 return m_Text.GetChar(m_CurIdx);
98 }
99
NextChar()100 wxChar TextCutter::NextChar()
101 {
102 if (m_CurIdx+1 >= m_TextLen)
103 return '\0';
104 return m_Text.GetChar(m_CurIdx+1);
105 }
106
SkipUnwanted()107 void TextCutter::SkipUnwanted()
108 {
109 if (IsEOF())
110 {
111 return;
112 }
113 while (CurrentChar() == '#' ||
114 CurrentChar() == '!' ||
115 ((CurrentChar() == 'c' || CurrentChar() == 'C' || CurrentChar() == '*') && m_CurColumn == 1 && m_CurSourceForm == fsfFixed))
116 {
117 SkipToEOL();
118 SkipWhiteSpace();
119 if (IsEOF())
120 return;
121 }
122 }
123
SkipToChar(const wxChar & ch)124 void TextCutter::SkipToChar(const wxChar& ch)
125 {
126 // skip everything until we find ch
127 while (1)
128 {
129 while (!IsEOF() && CurrentChar() != ch && CurrentChar() != '\n')
130 MoveToNextChar();
131 break;
132 }
133 }
134
CharInString(const char ch,const char * chars)135 bool TextCutter::CharInString(const char ch, const char* chars)
136 {
137 int len = strlen(chars);
138 for (int i = 0; i < len; ++i)
139 {
140 if (ch == chars[i])
141 return true;
142 }
143 return false;
144 }
145
SkipToEOL()146 void TextCutter::SkipToEOL()
147 {
148 while (!IsEOF() && CurrentChar() != '\n')
149 MoveToNextChar();
150 }
151