From cbb66ea7940b73c21497a0f228f100689bbc21f7 Mon Sep 17 00:00:00 2001 From: Cas Cremers Date: Tue, 9 Nov 2010 11:09:31 +0100 Subject: [PATCH] Scyther.py: Improving Scyther python interface by giving options and filenames when reporting an error. --- gui/Scyther/Error.py | 15 +++++++++++++-- gui/Scyther/Scyther.py | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/gui/Scyther/Error.py b/gui/Scyther/Error.py index b8ff532..cf27352 100644 --- a/gui/Scyther/Error.py +++ b/gui/Scyther/Error.py @@ -36,11 +36,22 @@ class ScytherError(Error): backend """ - def __init__(self, errorlist): + def __init__(self, errorlist,filenames=None,options=None): self.errorlist = errorlist + self.filenames = filenames + self.options = options def __str__(self): - s = "Scyther backend reported the following errors:\n" + s = "Scyther backend reported errors" + if len(self.filenames) == 0: + s = s + " for unknown files." + if len(self.filenames) == 1: + s = s + " for file %s" % (self.filenames) + if len(self.filenames) > 1: + s = s + " for files %s" % (self.filenames) + s = s + "\n" + s = s + "Options: '%s'\n\n" % (self.options) + S = s + "Error details:\n" s = s + "\n".join(self.errorlist) return s diff --git a/gui/Scyther/Scyther.py b/gui/Scyther/Scyther.py index 2a735ac..80aa116 100755 --- a/gui/Scyther/Scyther.py +++ b/gui/Scyther/Scyther.py @@ -163,6 +163,7 @@ class Scyther(object): self.program = getScytherBackend() self.spdl = None self.inputfile = None + self.filenames = [] self.options = "" self.claims = None self.errors = None @@ -178,9 +179,11 @@ class Scyther(object): def setInput(self,spdl): self.spdl = spdl self.inputfile = None + self.guessFileNames() def setFile(self,filename): self.inputfile = filename + self.filenames = [self.inputfile] self.spdl = "" fp = open(filename,"r") for l in fp.readlines(): @@ -195,6 +198,37 @@ class Scyther(object): for l in fp.readlines(): self.spdl += l fp.close() + self.guessFileNames() + + def guessFileNames(self,spdl=None): + """ + Try to extract filenames (well, actually, protocol names) sloppily from some spdl script. + + There are two modes: + + [init] : If the spdl parameter is empty or None, we reset the filenames and extract from self.spdl + [add] : If the spdl parameter is non-empty, add the extracted filenames to an existing list + + """ + + if (spdl == None) or (len(spdl) == 0): + spdl = self.spdl + self.filenames = [] + + for sl in spdl.splitlines(): + l = sl.strip() + prefix = "protocol " + postfix = "(" + x = l.find(prefix) + if x >= 0: + # The prefix occurs + y = l.find(postfix,x+len(prefix)) + if y >= 0: + gn = l[x+len(prefix):y] + # check for helper protocols + if not gn.startswith("@"): + if gn not in self.filenames: + self.filenames.append(gn) def addArglist(self,arglist): for arg in arglist: @@ -221,6 +255,9 @@ class Scyther(object): # Scyther hickups on completely empty input spdl = "\n" + # Extract filenames for error reporting later + self.guessFileNames(spdl=spdl) + # Generate temporary files for the output. # Requires Python 2.3 though. (fde,fne) = tempfile.mkstemp() # errors @@ -307,7 +344,7 @@ class Scyther(object): self.errorcount = len(self.errors) if self.errorcount > 0: - raise Error.ScytherError(self.errors) + raise Error.ScytherError(self.errors,filenames=self.filenames,options=self.options) # process output self.output = output