manifest: minor bugfixes and improvements

- More robust string handling by using Unicode
- Unix line ending in generated files
- Don't call keyword_substitute if
  - no keychains in line
  - printing to output is disabled due to unmet condition
- Fix handling of list of leaf datatypes in db

Change-Id: Ic9c9bdba12b2f536ffa707342728b1277363e99f
Signed-off-by: Miklos Balint <miklos.balint@arm.com>
diff --git a/tools/generate_from_template.py b/tools/generate_from_template.py
index 5f2153a..a1ab137 100644
--- a/tools/generate_from_template.py
+++ b/tools/generate_from_template.py
@@ -5,8 +5,9 @@
 #
 #-------------------------------------------------------------------------------
 
-import os
-from keyword_substitution import keyword_substitute, Verbosity, log_print
+from __future__ import unicode_literals
+import os, re, io
+from keyword_substitution import keyword_substitute, Verbosity, log_print, REkeychain
 
 VERBOSITY = Verbosity.warning
 log_print(Verbosity.debug, "Setting verbosity to", VERBOSITY, verbosity=VERBOSITY)
@@ -27,10 +28,17 @@
 # All operations assume tf-m repo root as active working directory
 
 # Functions
+def substitute(manifest, line, MISSING_KEYS_ACTION):
+    outlist = keyword_substitute(manifest, line, MISSING_KEYS_ACTION)
+    outstring = ""
+    for outline in outlist:
+        outstring += ''.join(outline)
+    log_print(Verbosity.info, outstring)
+    return outstring
+
 def generate(db, outfile_name):
-    outfile = \
-        open(outfile_name, "w")
-    with open(outfile_name + '.template', "r") as template_file:
+    outfile = io.open(outfile_name, "w", newline='\n')
+    with io.open(outfile_name + '.template', "r") as template_file:
         template = template_file.readlines()
 
     output = []
@@ -49,24 +57,24 @@
             iteration_counter = 0
             log_print(Verbosity.info, "Blocklines:", str(blocklines))
             for manifest in db:
-                print_blocked = False
+                ignore_line = False
                 for line in blocklines:
-                    outlist = keyword_substitute(manifest, line, MISSING_KEYS_ACTION)
-                    outstring = ""
-                    for outline in outlist:
-                        outstring += ''.join(outline)
-                    log_print(Verbosity.info, outstring)
-                    if controlconditionstart in outstring:
+                    if controlconditionstart in line:
+                        outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
                         if 'False' in outstring:
                             log_print(Verbosity.info, "PRINT BLOCKED")
-                            print_blocked = True
-                    elif controlconditionend in outstring:
+                            ignore_line = True
+                    elif controlconditionend in line:
                         log_print(Verbosity.info, "PRINT ENABLED")
-                        print_blocked = False
-                    elif controlconditionelse in outstring:
-                        log_print(Verbosity.info, "PRINT " + str(print_blocked))
-                        print_blocked = not print_blocked
-                    else:
+                        ignore_line = False
+                    elif controlconditionelse in line:
+                        log_print(Verbosity.info, "PRINT " + str(ignore_line))
+                        ignore_line = not ignore_line
+                    elif not ignore_line:
+                        if re.search(REkeychain, line):
+                            outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
+                        else:
+                            outstring = line
                         if control_print_iteration_counter in outstring:
                             outstring = outstring.replace(
                                             control_print_iteration_counter,
@@ -75,8 +83,7 @@
                             print "Invalid control symbol:", outstring
                             print "exiting"
                             exit(1)
-                        if not print_blocked:
-                            outfile.write(outstring)
+                        outfile.write(outstring)
                 iteration_counter += 1
                 # end for manifest in db
             blocks.append(blocklines)
@@ -104,4 +111,5 @@
 def generate_from_template_file(db, file_list):
     for file in file_list:
         outfile = file["output"]
+        print "Generating", outfile
         generate(db, outfile)