# 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