# HG changeset patch # User lbessard # Date 1244535034 -7200 # Node ID e9698d0ee5f3edeffff0dd9e969c5907017639f6 # Parent e257fe074a9095ed7595ff8a2cbda7b41075504d Adding support for printing lines where matiec failed in Log console (thanks to Brendan) Bug that prevent to see errors in editor with double click fixed. diff -r e257fe074a90 -r e9698d0ee5f3 Beremiz.py --- a/Beremiz.py Sat May 30 17:09:07 2009 +0200 +++ b/Beremiz.py Tue Jun 09 10:10:34 2009 +0200 @@ -75,7 +75,7 @@ import wx.lib.buttons, wx.lib.statbmp import TextCtrlAutoComplete, cPickle import types, time, re, platform, time, traceback, commands -from plugger import PluginsRoot +from plugger import PluginsRoot, MATIEC_ERROR_MODEL from wxPopen import ProcessLogger base_folder = os.path.split(sys.path[0])[0] @@ -103,8 +103,6 @@ 'size' : 18, } -MATIEC_ERROR_MODEL = re.compile(".*\.st:([0-9]*)-([0-9]*)..([0-9]*)-([0-9]*): error : (.*)$") - # Some helpers to tweak GenBitmapTextButtons # TODO: declare customized classes instead. gen_mini_GetBackgroundBrush = lambda obj:lambda dc: wx.Brush(obj.GetParent().GetBackgroundColour(), wx.SOLID) diff -r e257fe074a90 -r e9698d0ee5f3 plugger.py --- a/plugger.py Sat May 30 17:09:07 2009 +0200 +++ b/plugger.py Tue Jun 09 10:10:34 2009 +0200 @@ -657,6 +657,8 @@ from discovery import DiscoveryDialog from weakref import WeakKeyDictionary +MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): error : (.*)$") + class PluginsRoot(PlugTemplate, PLCControler): """ This class define Root object of the plugin tree. @@ -949,6 +951,13 @@ if os.path.isfile(self._getIECrawcodepath()): plc_file.write(open(self._getIECrawcodepath(), "r").read()) plc_file.write("\n") + plc_file.close() + plc_file = open(self._getIECcodepath(), "r") + self.ProgramOffset = 0 + for line in plc_file.xreadlines(): + self.ProgramOffset += 1 + plc_file.close() + plc_file = open(self._getIECcodepath(), "a") plc_file.write(open(self._getIECgeneratedcodepath(), "r").read()) plc_file.close() self.logger.write("Compiling IEC Program in to C code...\n") @@ -961,11 +970,38 @@ ieclib_path, buildpath, self._getIECcodepath()), - no_stdout=True).spin() + no_stdout=True, no_stderr=True).spin() if status: # Failed ! + + # parse iec2c's error message. if it contains a line number, + # then print those lines from the generated IEC file. + for err_line in err_result.split('\n'): + self.logger.write_warning(err_line + "\n") + + m_result = MATIEC_ERROR_MODEL.match(err_line) + if m_result is not None: + first_line, first_column, last_line, last_column, error = m_result.groups() + first_line, last_line = int(first_line), int(last_line) + + last_section = None + f = open(self._getIECcodepath()) + + for i, line in enumerate(f.readlines()): + if line[0] not in '\t \r\n': + last_section = line + + if first_line <= i <= last_line: + if last_section is not None: + self.logger.write_warning("In section: " + last_section) + last_section = None # only write section once + self.logger.write_warning("%04d: %s" % (i, line)) + + f.close() + self.logger.write_error("Error : IEC to C compiler returned %d\n"%status) return False + # Now extract C files of stdout C_files = [ fname for fname in result.splitlines() if fname[-2:]==".c" or fname[-2:]==".C" ] # remove those that are not to be compiled because included by others