Advertisement
Guest User

Horspool Search Algorithm

a guest
Apr 11th, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.98 KB | None | 0 0
  1. # Daniel Neri
  2. # 4/1/2012
  3. #   University of Central Florida
  4. #   Computer Services & Telecommunications
  5. #   Enterprise Application Development
  6.  
  7.  
  8.  
  9. import locale
  10. import os
  11. import sys
  12. import urllib2
  13. import fnmatch
  14.  
  15. def boyermoore_horspool(fd, needle):
  16.     #print "main method called"
  17.     needle = needle.strip()
  18.     #print "needle:"+needle+":"
  19.    
  20.    
  21.     fd.seek(0)
  22.    
  23.     nlen = len(needle)
  24.     nlast = nlen - 1
  25.  
  26.     skip = []
  27.     for k in range(256):
  28.         skip.append(nlen)
  29.     for k in range(nlast):
  30.         skip[ord(needle[k])] = nlast - k
  31.     skip = tuple(skip)
  32.  
  33.     pos = 0
  34.     consumed = 0
  35.     haystack = bytes()
  36.     while True:
  37.         more = nlen - (consumed - pos)
  38.         morebytes = fd.read(more)
  39.         haystack = haystack[more:] + morebytes
  40.  
  41.         if len(morebytes) < more:
  42.             return -1
  43.         consumed = consumed + more
  44.  
  45.         i = nlast
  46.         while i >= 0 and haystack[i] == needle[i]:
  47.             i = i - 1
  48.         if i == -1:
  49.             return pos
  50.  
  51.         pos = pos + skip[ord(haystack[nlast])]
  52.  
  53.     return -1
  54.  
  55. if __name__ == "__main__":
  56.  
  57.     print ('Starting...')
  58.    
  59.    
  60.    
  61.     if len(sys.argv) < 4:
  62.         for  item in sys.argv:
  63.             print "item: " + item
  64.         print "Usage: horspool.py  <peoplecode directory> <ucf_sqr dir> <ucf_dms dir> <input file>"
  65.         sys.exit(-1)
  66.  
  67.     #rl = sys.argv[1]
  68.     pplcode_dir = sys.argv[1]
  69.     ucf_sqr_dir = sys.argv[2]
  70.     ucf_dms_dir = sys.argv[3]
  71.    
  72.    
  73.     input_file = sys.argv[4]
  74.    
  75.     directories = [pplcode_dir, ucf_sqr_dir, ucf_dms_dir]
  76.    
  77.     print directories
  78.    
  79.     with open(input_file) as f:
  80.         input_tables = f.readlines()
  81.    
  82.    
  83.    
  84.  
  85.     #print variables
  86.     print "Input file: " + input_file
  87.     #print "Searching directory: " + direc
  88.    
  89.     filter_by = ['*.sqr', '*.sqc', '*.txt', '*.dms']
  90.        
  91.     for item in filter_by:
  92.         print "Filtering by: " + item
  93.    
  94.     sqr_input = []
  95.     keep_tables = []
  96.    
  97.     for index, case in enumerate(input_tables):
  98.    
  99.         print "matching #"+str(index+1)+" of #"+str(len(input_tables))+": " + case
  100.    
  101.         noluck = "false"
  102.         broken = "false"
  103.        
  104.         for direc in directories:
  105.             print "HELLO: ", direc
  106.             for path, dirs, files in os.walk(os.path.abspath(direc)):
  107.                 for extension in filter_by:
  108.                     if broken == "true":
  109.                         break
  110.                        
  111.                     else:
  112.                         for filename in fnmatch.filter(files, extension):
  113.                
  114.                             filepath = os.path.join(path, filename)
  115.                             #print filename
  116.                             #print filepath
  117.                             with open(filepath) as f:
  118.                                 offset = boyermoore_horspool(f, case)
  119.                                 if offset != -1:
  120.                                     #table reference exists, do not drop
  121.                                     print "result found in " + filepath
  122.                                     noluck = "false"
  123.                                     broken = "true"
  124.                                     f.close()
  125.                                     break
  126.                                 else:
  127.                                     #table definition does not exist
  128.                                     #write to file for further processing by SQR
  129.                                     noluck = "true"
  130.                                     broken = "false"
  131.  
  132.                                 formatted_case = case[3:]
  133.                                 #print ' matching formatted: ', formatted_case
  134.                                 offset = boyermoore_horspool(f, formatted_case)
  135.  
  136.                                 if offset != -1:
  137.                                     #table reference exists, do not drop
  138.                                     print "result found in " + filepath
  139.                                     noluck = "false"
  140.                                     broken = "true"
  141.                                     f.close()
  142.                                     break
  143.                                
  144.                                    
  145.                                 f.close()
  146.                
  147.         if noluck == "true":
  148.             sqr_input.append(case)
  149.         else:
  150.             keep_tables.append(case)
  151.                        
  152.                        
  153.     # Open a file
  154.     fo = open("C:\\temp\\horspool_output.txt", "w+")
  155.    
  156.    
  157.     for table_name in sqr_input:
  158.         print "writing " + table_name + " to SQR input file"
  159.        
  160.         fo.write( table_name );
  161.  
  162.     # Close opend file
  163.     fo.close()
  164.    
  165.     # Open a file
  166.     fo = open("C:\\temp\\horspool_output_keep_these_tables.txt", "w+")
  167.    
  168.    
  169.     for table_name in keep_tables:
  170.         print "writing " + table_name + " to keep tables file"
  171.        
  172.         fo.write( table_name );
  173.  
  174.     # Close opend file
  175.     fo.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement