Reorganized the entrypoint into xosgen to make it easier to access it
programmatically

Change-Id: I280715c8f0c6d26dfd46b01f241b7cc2d7ef0be3
diff --git a/xos/genx/tool/generator.py b/xos/genx/tool/generator.py
new file mode 100755
index 0000000..293dc87
--- /dev/null
+++ b/xos/genx/tool/generator.py
@@ -0,0 +1,131 @@
+import plyproto.model as m
+import pdb
+import plyproto.parser as plyproto
+import traceback
+import sys
+import jinja2
+import os
+from xos2jinja import XOS2Jinja
+from proto2xproto import Proto2XProto
+
+import lib
+
+
+
+loader = jinja2.PackageLoader(__name__, 'templates')
+env = jinja2.Environment(loader=loader)
+
+class XOSGenerator:
+    def __init__(self, args):
+        self.args = args
+
+    def file_exists(self):
+        def file_exists2(name):
+            return (os.path.exists(self.args.attic+'/'+name))
+        return file_exists2
+
+    def include_file(self):
+        def include_file2(name):
+            return open(self.args.attic+'/'+name).read()
+        return include_file2
+        # FIXME: Support templates in the future
+        #return jinja2.Markup(loader.get_source(env, name)[0])
+
+    def generate(self):
+        try:
+            parser = plyproto.ProtobufAnalyzer()
+            input = open(self.args.input).read()
+            ast = parser.parse_string(input,debug=0)
+
+            if (self.args.rev):
+                v = Proto2XProto()
+                ast.accept(v)
+            
+            v = XOS2Jinja()
+            ast.accept(v)
+            
+            try:
+                template_name = self.args.template_dir + '/' + self.args.target
+            except AttributeError:
+                template_name = os.path.abspath(self.args.target)
+
+            os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
+            os_template_env = jinja2.Environment(loader=os_template_loader)
+            os_template_env.globals['include_file'] = self.include_file() # Generates a function
+            os_template_env.globals['file_exists'] = self.file_exists() # Generates a function
+
+            for f in dir(lib):
+                if f.startswith('xproto'):
+                    os_template_env.globals[f] = getattr(lib, f)
+
+            template = os_template_env.get_template(os.path.split(template_name)[1])
+            context = {}
+
+            try:
+                for s in self.args.kv.split(','):
+                    k,val=s.split(':')
+                    context[k]=val
+            except:
+                pass
+
+            rendered = template.render({"proto": {'messages':v.messages, 'message_names':[m['name'] for m in v.messages]},"context":context,"options":v.options})
+
+            lines = rendered.splitlines()
+            current_buffer = []
+            for l in lines:
+                if (l.startswith('+++')):
+                    prefix = ''
+                    prefixes = self.args.output.rsplit('/',1)
+                    if (len(prefixes)>1):
+                        path = prefix+'/'+l[4:]
+                        direc = prefix
+                        if (direc):
+                            os.system('mkdir -p %s'%direc)
+                    else:
+                        path = l[4:]
+                    
+                    fil = open(path,'w')
+                    buf = '\n'.join(current_buffer)
+
+                    obuf = buf
+
+                    """
+                    for d in options.dict:
+                        df = open(d).read()
+                        d = json.loads(df)
+
+                        pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
+                        obuf = pattern.sub(lambda x: d[x.group()], buf)
+                    """
+
+                    fil.write(obuf)
+                    fil.close()
+
+                    try:
+                        quiet = self.args.quiet
+                    except:
+                        quiet = False
+                    if (not quiet):
+                        print 'Written to file %s'%path
+
+                    current_buffer = []
+                else:
+                    current_buffer.append(l)
+
+            if (current_buffer):
+                print '\n'.join(current_buffer)
+
+
+        except Exception as e:
+            print "    Error occurred! file[%s]" % (self.args.input), e
+            print '-'*60
+            traceback.print_exc(file=sys.stdout)
+            print '-'*60
+            exit(1)
+    
+def main():
+    generator = XOSGenerator(args)
+    generator.generate()
+
+if __name__=='__main__':
+    main()
diff --git a/xos/genx/tool/xosgen b/xos/genx/tool/xosgen
index ca6f070..6528b09 100755
--- a/xos/genx/tool/xosgen
+++ b/xos/genx/tool/xosgen
@@ -1,17 +1,11 @@
 #!/usr/bin/python
 
-import plyproto.model as m
 import pdb
 import argparse
-import plyproto.parser as plyproto
 import traceback
 import sys
-import jinja2
 import os
-from xos2jinja import XOS2Jinja
-from proto2xproto import Proto2XProto
-
-import lib
+from generator import *
 
 parse = argparse.ArgumentParser(description='XOS code generator')
 parse.add_argument('--rev', dest='rev', action='store_true',default=False, help='Convert proto to xproto')
@@ -23,98 +17,9 @@
 
 args = parse.parse_args()
 
-def file_exists(name):
-    return (os.path.exists(args.attic+'/'+name))
-
-def include_file(name):
-    return open(args.attic+'/'+name).read()
-    # FIXME: Support templates in the future
-    #return jinja2.Markup(loader.get_source(env, name)[0])
-
-loader = jinja2.PackageLoader(__name__, 'templates')
-env = jinja2.Environment(loader=loader)
-
 def main():
-    try:
-
-        parser = plyproto.ProtobufAnalyzer()
-        input = open(args.input).read()
-        ast = parser.parse_string(input,debug=0)
-
-        if (args.rev):
-            v = Proto2XProto()
-            ast.accept(v)
-        
-        v = XOS2Jinja()
-        ast.accept(v)
-        
-        template_name = os.path.abspath(args.target)
-
-	os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
-        os_template_env = jinja2.Environment(loader=os_template_loader)
-        os_template_env.globals['include_file'] = include_file
-        os_template_env.globals['file_exists'] = file_exists
-
-        for f in dir(lib):
-            if f.startswith('xproto'):
-                os_template_env.globals[f] = getattr(lib, f)
-
-        template = os_template_env.get_template(os.path.split(template_name)[1])
-        context = {}
-
-        try:
-            for s in args.kv.split(','):
-                k,val=s.split(':')
-                context[k]=val
-        except:
-            pass
-
-        rendered = template.render({"proto": {'messages':v.messages, 'message_names':[m['name'] for m in v.messages]},"context":context,"options":v.options})
-
-        lines = rendered.splitlines()
-        current_buffer = []
-        for l in lines:
-            if (l.startswith('+++')):
-                prefixes = args.output.rsplit('/',1)
-                if (len(prefixes)>1):
-                    path = prefix+'/'+l[4:]
-                    direc = prefix
-                    os.system('mkdir -p %s'%direc)
-                else:
-                    path = l[4:]
-                
-                fil = open(path,'w')
-                buf = '\n'.join(current_buffer)
-
-                obuf = buf
-
-                """
-                for d in options.dict:
-                    df = open(d).read()
-                    d = json.loads(df)
-
-                    pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
-                    obuf = pattern.sub(lambda x: d[x.group()], buf)
-                """
-
-                fil.write(obuf)
-                fil.close()
-
-                print 'Written to file %s'%path
-                current_buffer = []
-            else:
-                current_buffer.append(l)
-
-        if (current_buffer):
-            print '\n'.join(current_buffer)
-
-
-    except Exception as e:
-        print "    Error occurred! file[%s]" % (args.input), e
-        print '-'*60
-        traceback.print_exc(file=sys.stdout)
-        print '-'*60
-        exit(1)
+    generator = XOSGenerator(args)
+    generator.generate()
 
 if __name__=='__main__':
     main()