Separate parallel_classify_warnings out of parse_input_file.

* Allow other callers of this module to:
  * pass any input stream to parse_input_file,
  * pass any warning_lines to parallel_classify_warnings,
  * call dump_csv or dump_html to get output.
* No output change.
* Capture and ignore signal.SIGTERM at the end,
  to avoid bad warning/error messages from the exit clean-up process.

Test: run warn.py build.log.
Change-Id: I1414797a536c0ee622e2a34c226578621be1ddab
diff --git a/tools/warn.py b/tools/warn.py
index 355d120..5c49cd3 100755
--- a/tools/warn.py
+++ b/tools/warn.py
@@ -84,6 +84,8 @@
 import multiprocessing
 import os
 import re
+import signal
+import sys
 
 parser = argparse.ArgumentParser(description='Convert a build log into HTML')
 parser.add_argument('--gencsv',
@@ -2090,11 +2092,16 @@
   results = []
   for line in lines:
     classify_one_warning(line, results)
+  # After the main work, ignore all other signals to a child process,
+  # to avoid bad warning/error messages from the exit clean-up process.
+  if args.processes > 1:
+    signal.signal(signal.SIGTERM, lambda *args: sys.exit(-signal.SIGTERM))
   return results
 
 
 def parallel_classify_warnings(warning_lines):
   """Classify all warning lines with num_cpu parallel processes."""
+  compile_patterns()
   num_cpu = args.processes
   if num_cpu > 1:
     groups = [[] for x in range(num_cpu)]
@@ -2177,17 +2184,15 @@
     return line
 
 
-def parse_input_file():
+def parse_input_file(infile):
   """Parse input file, match warning lines."""
   global platform_version
   global target_product
   global target_variant
-  infile = open(args.buildlog, 'r')
   line_counter = 0
 
   # handle only warning messages with a file path
   warning_pattern = re.compile('^[^ ]*/[^ ]*: warning: .*')
-  compile_patterns()
 
   # Collect all warnings into the warning_lines set.
   warning_lines = set()
@@ -2207,7 +2212,7 @@
       m = re.search('(?<=^TARGET_BUILD_VARIANT=).*', line)
       if m is not None:
         target_variant = m.group(0)
-  parallel_classify_warnings(warning_lines)
+  return warning_lines
 
 
 # Return s with escaped backslash and quotation characters.
@@ -2503,7 +2508,8 @@
 
 
 def main():
-  parse_input_file()
+  warning_lines = parse_input_file(open(args.buildlog, 'r'))
+  parallel_classify_warnings(warning_lines)
   if args.gencsv:
     dump_csv()
   else: