2 #include "../diff/diff.h"
12 while (_current_state
!= END_STATE
){
13 switch (_current_state
){
44 if (_current_token
== Tokens::FILE_TOK
){
45 _changeState(FILE_STATE
);
55 if (_current_token
== Tokens::FILE_TOK
){
58 }else if (_current_token
== Tokens::HUNK_TOK
){
59 _changeState(HUNK_STATE
);
67 switch (_current_token
){
68 case Tokens::HUNK_TOK
:
72 case Tokens::ADDED_TOK
:
73 _changeState(ADDED_STATE
);
75 case Tokens::DELETED_TOK
:
76 _changeState(DELETED_STATE
);
78 case Tokens::CONTEXT_TOK
:
79 _changeState(CONTEXT_STATE
);
86 void Parser::_context()
88 if (_current_token
== Tokens::CONTEXT_TOK
){
89 _addCurrentLineToContext();
94 switch (_current_token
){
95 case Tokens::FILE_TOK
:
97 _changeState(FILE_STATE
);
99 case Tokens::HUNK_TOK
:
101 _changeState(HUNK_STATE
);
103 case Tokens::ADDED_TOK
:
104 _changeState(ADDED_STATE
);
106 case Tokens::DELETED_TOK
:
107 _changeState(DELETED_STATE
);
110 _changeState(END_STATE
);
115 void Parser::_added()
117 if (_current_token
== Tokens::ADDED_TOK
){
118 _addCurrentLineToAdded();
120 }else if (_current_token
== Tokens::DELETED_TOK
){
121 _changeState(CHANGED_STATE
);
125 switch (_current_token
){
126 case Tokens::FILE_TOK
:
128 _changeState(FILE_STATE
);
130 case Tokens::HUNK_TOK
:
132 _changeState(HUNK_STATE
);
134 case Tokens::CONTEXT_TOK
:
135 _changeState(CONTEXT_STATE
);
138 _changeState(END_STATE
);
143 void Parser::_deleted()
145 if (_current_token
== Tokens::DELETED_TOK
){
146 _addCurrentLineToDeleted();
148 }else if (_current_token
== Tokens::ADDED_TOK
){
149 _changeState(CHANGED_STATE
);
153 switch (_current_token
){
154 case Tokens::FILE_TOK
:
156 _changeState(FILE_STATE
);
158 case Tokens::HUNK_TOK
:
160 _changeState(HUNK_STATE
);
162 case Tokens::CONTEXT_TOK
:
163 _changeState(CONTEXT_STATE
);
166 _changeState(END_STATE
);
171 void Parser::_changed()
173 if (_current_token
== Tokens::DELETED_TOK
){
174 _addCurrentLineToDeleted();
176 }else if (_current_token
== Tokens::ADDED_TOK
){
177 _addCurrentLineToAdded();
182 switch (_current_token
){
183 case Tokens::FILE_TOK
:
185 _changeState(FILE_STATE
);
187 case Tokens::HUNK_TOK
:
189 _changeState(HUNK_STATE
);
191 case Tokens::CONTEXT_TOK
:
192 _changeState(CONTEXT_STATE
);
195 _changeState(END_STATE
);
209 _changeState(END_STATE
);
214 void Parser::_readNextLine()
216 _current_line
= _in
->readLine();
217 if (_current_line
.isNull()){
218 _changeState(END_STATE
);
222 _current_token
= _tokens
->match(_current_line
);
223 DBG("Read line \"" << _current_line
.toStdString() << "\"");
226 void Parser::_changeState(Parser::states new_state
)
228 _current_state
= new_state
;
231 switch (_current_state
){
233 state
= "START_STATE";
236 state
= "FILE_STATE";
239 state
= "HUNK_STATE";
242 state
= "CONTEXT_STATE";
245 state
= "ADDED_STATE";
248 state
= "DELETED_STATE";
251 state
= "CHANGED_STATE";
257 DBG("State changed to " << state
);
262 QString
Parser::_capCurrentLine(int cap
)
264 switch (_current_token
){
265 case Tokens::FILE_TOK
:
266 return _tokens
->file_tok
.cap(cap
);
267 case Tokens::HUNK_TOK
:
268 return _tokens
->hunk_tok
.cap(cap
);
269 case Tokens::CONTEXT_TOK
:
270 return _tokens
->context_tok
.cap(cap
);
271 case Tokens::ADDED_TOK
:
272 return _tokens
->added_tok
.cap(cap
);
273 case Tokens::DELETED_TOK
:
274 return _tokens
->deleted_tok
.cap(cap
);
275 case Tokens::NONE_TOK
:
281 void Parser::_createNewFile()
283 if (_cur_file
!= NULL
){
284 DBG("Can't create new file - _cur_file = " << (long)_cur_file
);
288 Diff::instance()->addFile(_cur_file
= new File(_capCurrentLine(1)));
290 void Parser::_finishFile()
295 void Parser::_createNewHunk()
297 if (_cur_file
== NULL
|| _cur_hunk
!= NULL
){
298 DBG("Can't create new hunk - _cur_hunk = " << (long)_cur_hunk
299 << ", _cur_file = " << (long)_cur_file
);
304 from1
= _capCurrentLine(1).toInt();
305 from2
= _capCurrentLine(2).toInt();
307 _cur_file
->addHunk(_cur_hunk
= new Hunk(from1
, from2
));
309 void Parser::_finishHunk()
314 void Parser::_addCurrentLineToContext()
316 //if (_cur_context == NULL)
317 // _cur_context = new Text();
318 _cur_context
.addLine(new QString(_current_line
.remove(0,1)));
320 void Parser::_finishContext()
322 if (_cur_context
.isEmpty() || _cur_hunk
== NULL
)
324 _cur_hunk
->addSnippet(new Context(_cur_context
));
325 _cur_context
.clear();
328 void Parser::_addCurrentLineToAdded()
330 //if (_cur_added == NULL)
331 // _cur_added = new Text();
332 _cur_added
.addLine(new QString(_current_line
.remove(0,1)));
334 void Parser::_finishAdded()
336 if (_cur_added
.isEmpty() || _cur_hunk
== NULL
){
339 _cur_hunk
->addSnippet(new Added(_cur_added
));
343 void Parser::_addCurrentLineToDeleted()
345 //if (_cur_deleted == NULL)
346 // _cur_deleted = new Text();
347 _cur_deleted
.addLine(new QString(_current_line
.remove(0,1)));
349 void Parser::_finishDeleted()
351 if (_cur_deleted
.isEmpty() || _cur_hunk
== NULL
){
354 _cur_hunk
->addSnippet(new Deleted(_cur_deleted
));
355 _cur_deleted
.clear();
358 void Parser::_finishChanged()
360 if (_cur_deleted
.isEmpty() || _cur_added
.isEmpty() || _cur_hunk
== NULL
){
364 DBG("Finish changed:");
365 DBG("added: " << _cur_added
.getLine(0).toStdString());
366 DBG("deleted: " << _cur_deleted
.getLine(0).toStdString());
367 _cur_hunk
->addSnippet(new Changed(_cur_deleted
, _cur_added
));
368 _cur_deleted
.clear();