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