Scyther.py: Improving Scyther python interface by giving options and filenames when reporting an error.
This commit is contained in:
		
							parent
							
								
									fac14fc950
								
							
						
					
					
						commit
						cbb66ea794
					
				| @ -36,11 +36,22 @@ class ScytherError(Error): | |||||||
|         backend |         backend | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def __init__(self, errorlist): |     def __init__(self, errorlist,filenames=None,options=None): | ||||||
|         self.errorlist = errorlist |         self.errorlist = errorlist | ||||||
|  |         self.filenames = filenames | ||||||
|  |         self.options = options | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     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) |         s = s + "\n".join(self.errorlist) | ||||||
|         return s |         return s | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -163,6 +163,7 @@ class Scyther(object): | |||||||
|         self.program = getScytherBackend() |         self.program = getScytherBackend() | ||||||
|         self.spdl = None |         self.spdl = None | ||||||
|         self.inputfile = None |         self.inputfile = None | ||||||
|  |         self.filenames = [] | ||||||
|         self.options = "" |         self.options = "" | ||||||
|         self.claims = None |         self.claims = None | ||||||
|         self.errors = None |         self.errors = None | ||||||
| @ -178,9 +179,11 @@ class Scyther(object): | |||||||
|     def setInput(self,spdl): |     def setInput(self,spdl): | ||||||
|         self.spdl = spdl |         self.spdl = spdl | ||||||
|         self.inputfile = None |         self.inputfile = None | ||||||
|  |         self.guessFileNames() | ||||||
| 
 | 
 | ||||||
|     def setFile(self,filename): |     def setFile(self,filename): | ||||||
|         self.inputfile = filename |         self.inputfile = filename | ||||||
|  |         self.filenames = [self.inputfile] | ||||||
|         self.spdl = "" |         self.spdl = "" | ||||||
|         fp = open(filename,"r") |         fp = open(filename,"r") | ||||||
|         for l in fp.readlines(): |         for l in fp.readlines(): | ||||||
| @ -195,6 +198,37 @@ class Scyther(object): | |||||||
|         for l in fp.readlines(): |         for l in fp.readlines(): | ||||||
|             self.spdl += l |             self.spdl += l | ||||||
|         fp.close() |         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): |     def addArglist(self,arglist): | ||||||
|         for arg in arglist: |         for arg in arglist: | ||||||
| @ -221,6 +255,9 @@ class Scyther(object): | |||||||
|             # Scyther hickups on completely empty input |             # Scyther hickups on completely empty input | ||||||
|             spdl = "\n" |             spdl = "\n" | ||||||
| 
 | 
 | ||||||
|  |         # Extract filenames for error reporting later | ||||||
|  |         self.guessFileNames(spdl=spdl) | ||||||
|  | 
 | ||||||
|         # Generate temporary files for the output. |         # Generate temporary files for the output. | ||||||
|         # Requires Python 2.3 though. |         # Requires Python 2.3 though. | ||||||
|         (fde,fne) = tempfile.mkstemp()  # errors |         (fde,fne) = tempfile.mkstemp()  # errors | ||||||
| @ -307,7 +344,7 @@ class Scyther(object): | |||||||
| 
 | 
 | ||||||
|         self.errorcount = len(self.errors) |         self.errorcount = len(self.errors) | ||||||
|         if self.errorcount > 0: |         if self.errorcount > 0: | ||||||
|             raise Error.ScytherError(self.errors) |             raise Error.ScytherError(self.errors,filenames=self.filenames,options=self.options) | ||||||
| 
 | 
 | ||||||
|         # process output |         # process output | ||||||
|         self.output = output |         self.output = output | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user