コード例 #1
0
        private static bool IsCompatibleMethod(RegistryAssemblyConfiguration cfg, MethodDefinition method)
        {
            // Methods required by OpenGL.Net
            // Note: code should test actual method existence, since  they may not loaded for specific profiles
            switch (method.Name)
            {
            case "GetString":
                return(true);
            }

            bool compatible         = false;
            int  featureAttribCount = 0;

            foreach (CustomAttribute customAttrib in method.CustomAttributes)
            {
                switch (customAttrib.AttributeType.Name)
                {
                case "RequiredByFeatureAttribute":
                    compatible |= IsCompatible_RequiredAttribute(cfg, customAttrib);
                    featureAttribCount++;
                    break;

                case "RemovedByFeatureAttribute":
                    if (IsCompatible_RemovedAttribute(cfg, customAttrib) == false)
                    {
                        return(false);
                    }
                    featureAttribCount++;
                    break;
                }
            }

            return(compatible || featureAttribCount == 0);
        }
コード例 #2
0
        private static bool IsCompatibleField(RegistryAssemblyConfiguration cfg, FieldDefinition field)
        {
            bool compatible         = false;
            int  featureAttribCount = 0;

            foreach (CustomAttribute customAttrib in field.CustomAttributes)
            {
                switch (customAttrib.AttributeType.Name)
                {
                case "RequiredByFeatureAttribute":
                    compatible |= IsCompatible_RequiredAttribute(cfg, customAttrib);
                    featureAttribCount++;
                    break;

                case "RemovedByFeatureAttribute":
                    if (IsCompatible_RemovedAttribute(cfg, customAttrib) == false)
                    {
                        return(false);
                    }
                    break;
                }
            }

            return(compatible || featureAttribCount == 0);
        }
コード例 #3
0
        private static bool IsCompatible_RequiredAttribute(RegistryAssemblyConfiguration cfg, CustomAttribute customAttrib)
        {
            string         featureName   = customAttrib.ConstructorArguments[0].Value as string;
            KhronosVersion attribVersion = KhronosVersion.ParseFeature(featureName, false);

            // Match at least one feature?
            bool compatible = false;

            foreach (RegistryAssemblyConfiguration.VersionRange cfgFeature in cfg.Features)
            {
                if (cfgFeature.Api != null)
                {
                    CustomAttributeNamedArgument apiArg = customAttrib.Fields.FirstOrDefault(delegate(CustomAttributeNamedArgument item) { return(item.Name == "Api"); });
                    string apiRegex = apiArg.Argument.Value != null ? apiArg.Argument.Value as string : "gl";

                    if (Regex.IsMatch(cfgFeature.Api, "^(" + apiRegex + ")$"))
                    {
                        compatible |= true;
                    }
                }

                if (cfgFeature.Profile != null)
                {
                    CustomAttributeNamedArgument apiArg = customAttrib.Fields.FirstOrDefault(delegate(CustomAttributeNamedArgument item) { return(item.Name == "Profile"); });
                    string apiRegex = apiArg.Argument.Value != null ? apiArg.Argument.Value as string : null;

                    if (apiRegex != null)
                    {
                        compatible &= Regex.IsMatch(cfgFeature.Profile, "^(" + apiRegex + ")$");
                    }
                }

                if (attribVersion != null)
                {
                    KhronosVersion minVersion = /*cfgFeature.MinApiVersion != null ? KhronosVersion.Parse(cfgFeature.MinApiVersion) :*/ null;
                    KhronosVersion maxVersion = /*cfgFeature.MaxApiVersion != null ? KhronosVersion.Parse(cfgFeature.MaxApiVersion) :*/ null;
                    // API version
                    if (minVersion != null && attribVersion < minVersion)
                    {
                        return(false);
                    }
                    if (maxVersion != null && attribVersion > maxVersion)
                    {
                        return(false);
                    }
                }
                else
                {
                    // Extension (Api must match)
                    if (compatible)
                    {
                        compatible &= cfg.Extensions.Contains(featureName);
                    }
                }
            }

            return(compatible);
        }
コード例 #4
0
        private static bool IsCompatible_RemovedAttribute(RegistryAssemblyConfiguration cfg, CustomAttribute customAttrib)
        {
            string         featureName   = customAttrib.ConstructorArguments[0].Value as string;
            KhronosVersion attribVersion = KhronosVersion.ParseFeature(featureName, false);

            if (attribVersion == null)
            {
                return(true);
            }

            return(cfg.Features.All(cfgFeature => cfgFeature.Api == null || cfgFeature.Api != attribVersion.Api));
        }
コード例 #5
0
        private static bool IsCompatible_RemovedAttribute(RegistryAssemblyConfiguration cfg, CustomAttribute customAttrib)
        {
            string         featureName   = customAttrib.ConstructorArguments[0].Value as string;
            KhronosVersion attribVersion = KhronosVersion.ParseFeature(featureName, false);

            if (attribVersion != null)
            {
                foreach (RegistryAssemblyConfiguration.VersionRange cfgFeature in cfg.Features)
                {
                    if (cfgFeature.Api != null && cfgFeature.Api == attribVersion.Api)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #6
0
        private static void CleanTypeDefinition(TypeDefinition type, RegistryAssemblyConfiguration cfg)
        {
            // Remove fields
            List <FieldDefinition> removedFields = new List <FieldDefinition>();

            foreach (FieldDefinition field in type.Fields)
            {
                if (IsCompatibleField(cfg, field) == false)
                {
                    // Console.WriteLine("    - Remove {0}", field.Name);
                    removedFields.Add(field);
                }
            }

            if (removedFields.Count > 0)
            {
                Console.WriteLine("- Removed {0} constants from {1}", removedFields.Count, type.FullName);
                foreach (FieldDefinition field in removedFields)
                {
                    type.Fields.Remove(field);
                }
            }

            // Remove methods
            List <MethodDefinition> removedMethods = new List <MethodDefinition>();

            foreach (MethodDefinition method in type.Methods)
            {
                if (IsCompatibleMethod(cfg, method) == false)
                {
                    // Console.WriteLine("    - Remove {0}", method.ToString());
                    removedMethods.Add(method);
                }
            }

            if (removedMethods.Count > 0)
            {
                Console.WriteLine("- Removing {0} methods from {1}", removedMethods.Count, type.FullName);
                foreach (MethodDefinition method in removedMethods)
                {
                    RemoveMethod(type, method);
                }
            }
        }
コード例 #7
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;
            int index;

            DummyStream = Array.FindIndex(args, delegate(string item) { return(item == "--dummy"); }) >= 0;
            DocDisabled = Array.FindIndex(args, delegate(string item) { return(item == "--nodoc"); }) >= 0;

            #region Assembly processing

            if ((args.Length > 0) && ((index = Array.FindIndex(args, delegate(string item) { return(item == "--assembly"); })) >= 0))
            {
                string assemblyPath      = args[index + 1];
                bool   overwriteAssembly = Array.Exists(args, delegate(string item) { return(item.StartsWith("--assembly-overwrite")); });
                bool   profileOnlyOpts   = Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-")); });

                List <RegistryAssemblyConfiguration> cfgs = new List <RegistryAssemblyConfiguration>();

                if (profileOnlyOpts == false)
                {
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                }
                else
                {
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-core")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-es2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-sc2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                    }
                }

                foreach (RegistryAssemblyConfiguration cfg in cfgs)
                {
                    try {
                        RegistryAssembly.CleanAssembly(assemblyPath, cfg, overwriteAssembly);
                    } catch (Exception exception) {
                        Console.WriteLine("Unable to process assembly: {0}.", exception.Message);
                    }
                }

                // Exclusive option
                return;
            }

            #endregion

            #region Log Maps

            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--only-logmaps"); }) >= 0))
            {
                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
                {
                    Console.WriteLine("Generating GL log map...");
                    ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
                {
                    Console.WriteLine("Generating WGL log map...");
                    ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
                {
                    Console.WriteLine("Generating GLX log map...");
                    ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
                {
                    Console.WriteLine("Generating EGL log map...");
                    ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
                }

                // Exclusive option
                return;
            }

            #endregion

            // (Common) Documentation
            RegistryDocumentation <RegistryDocumentationHandler_GL4> gl4Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
            gl4Documentation.Api = "GL4";
            if (DocDisabled == false)
            {
                gl4Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/gl4"));
            }

            RegistryDocumentation <RegistryDocumentationHandler_GL2> gl2Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
            gl2Documentation.Api = "GL2.1";
            if (DocDisabled == false)
            {
                gl2Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/gl2.1"));
            }

            // XML-based specifications

            // OpenGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
            {
                // Additional ES documentation
                RegistryDocumentation <RegistryDocumentationHandler_GL4> gles3Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
                gles3Documentation.Api = "GLES3.2";
                if (DocDisabled == false)
                {
                    gles3Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/es3"));
                }

                RegistryDocumentation <RegistryDocumentationHandler_GL2> gles1Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
                gles1Documentation.Api = "GLES1.1";
                if (DocDisabled == false)
                {
                    gles1Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/es1.1"));
                }

                Console.WriteLine("Loading GL specification...");
                ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);
                ctx.RefPages.Add(gles3Documentation);
                ctx.RefPages.Add(gles1Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateLimitsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
            }

            // OpenGL for Windows
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
            {
                ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
            }

            // OpenGL for Unix
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
            {
                ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                RegistryDocumentation <RegistryDocumentationHandler_EGL> eglDocumentation = new RegistryDocumentation <RegistryDocumentationHandler_EGL>();
                eglDocumentation.Api = "EGL";
                eglDocumentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/EGL-Registry/sdk/docs/man"));

                ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                ctx.RefPages.Add(eglDocumentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
            }

            // OpenWF

            _OutputBasePath = "OpenWF.Net";
            _Namespace      = "OpenWF";

            // OpenWF(C)
            // Note: you must setup CLI to generate this bindings
            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--wfc"); }) >= 0))
            {
                Header headRegistry = new Header("Wfc");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfc.h"));

                ctx = new RegistryContext("Wfc", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenWF(D)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfd"); }) >= 0))
            {
                Header headRegistry = new Header("Wfd");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfd.h"));

                ctx = new RegistryContext("Wfd", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }
        }
コード例 #8
0
        public static void CleanAssembly(string path, RegistryAssemblyConfiguration cfg, bool overwrite)
        {
            Console.WriteLine("*** Generate assembly {0}", cfg.Name);

            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path);

            #region Enums

            foreach (ModuleDefinition module in assembly.Modules)
            {
                List <TypeDefinition> removedTypes = new List <TypeDefinition>();

                foreach (TypeDefinition type in module.Types)
                {
                    if (type.IsEnum == false)
                    {
                        continue;
                    }

                    // Remove fields
                    List <FieldDefinition> removedFields = new List <FieldDefinition>();

                    foreach (FieldDefinition field in type.Fields)
                    {
                        if (IsCompatibleField(cfg, field) == false)
                        {
                            removedFields.Add(field);
                        }
                    }

                    // Console.WriteLine("- Removing {0} constants", removedFields.Count);
                    foreach (FieldDefinition field in removedFields)
                    {
                        // Console.WriteLine("  - {0}", field.Name);
                        type.Fields.Remove(field);
                    }

                    if (type.Fields.Count == 1)
                    {
                        removedTypes.Add(type);
                    }
                }

                Console.WriteLine("- Removing {0} enum types", removedTypes.Count);
                foreach (TypeDefinition type in removedTypes)
                {
                    // Console.WriteLine("  - {0}", field.Name);
                    module.Types.Remove(type);
                }
            }

            #endregion

            #region KhronosApi (Gl)

            foreach (ModuleDefinition module in assembly.Modules)
            {
                foreach (TypeDefinition type in module.Types)
                {
                    if (type.BaseType == null || type.BaseType.Name != "KhronosApi")
                    {
                        continue;
                    }
                    if (type.Name != "Gl")
                    {
                        continue;
                    }

                    CleanTypeDefinition(type, cfg);

                    TypeDefinition vbNestedType = type.NestedTypes.GetNestedType("VB");
                    if (vbNestedType != null)
                    {
                        CleanTypeDefinition(vbNestedType, cfg);
                    }
                }
            }

            #endregion

            // Export
            string baseDirPath = Path.GetDirectoryName(path);

            if (overwrite == false)
            {
                assembly.Write(Path.Combine(baseDirPath, String.Format("OpenGL.Net-{0}.dll", cfg.Name)));
            }
            else
            {
                assembly.Write(Path.Combine(baseDirPath, "OpenGL.Net.dll"));
            }
        }
コード例 #9
0
        private static void CleanTypeDefinition(TypeDefinition type, RegistryAssemblyConfiguration cfg)
        {
            // Remove fields
            List <FieldDefinition> removedFields = new List <FieldDefinition>();

            foreach (FieldDefinition field in type.Fields)
            {
                if (IsCompatibleField(cfg, field) == false)
                {
                    // Console.WriteLine("    - Remove {0}", field.Name);
                    removedFields.Add(field);
                }
            }

            if (removedFields.Count > 0)
            {
                Console.WriteLine("- Removed {0} constants from {1}", removedFields.Count, type.FullName);
                foreach (FieldDefinition field in removedFields)
                {
                    type.Fields.Remove(field);
                }
            }

            // Remove methods (public static API)
            List <MethodDefinition> removedMethods = new List <MethodDefinition>();

            foreach (MethodDefinition method in type.Methods)
            {
                if (IsCompatibleMethod(cfg, method) == false)
                {
                    // Console.WriteLine("    - Remove {0}", method.ToString());
                    removedMethods.Add(method);
                }
            }
            foreach (MethodDefinition method in removedMethods)
            {
                type.Methods.Remove(method);
            }

            // Remove delegates
            TypeDefinition delegatesNestedType = type.NestedTypes.GetNestedType("Delegates");

            if (delegatesNestedType != null)
            {
                // Delegate fields
                List <FieldDefinition> removedDelegateFields = new List <FieldDefinition>();

                foreach (FieldDefinition field in delegatesNestedType.Fields)
                {
                    if (IsCompatibleField(cfg, field) == false)
                    {
                        removedDelegateFields.Add(field);
                    }
                }
                foreach (FieldDefinition field in removedDelegateFields)
                {
                    delegatesNestedType.Fields.Remove(field);
                }

                // Delegate types
                List <TypeDefinition> removedDelegateTypes = new List <TypeDefinition>();

                foreach (TypeDefinition nestedType in delegatesNestedType.NestedTypes)
                {
                    if (IsCompatibleType(cfg, nestedType) == false)
                    {
                        removedDelegateTypes.Add(nestedType);
                    }
                }
                foreach (TypeDefinition nestedType in removedDelegateTypes)
                {
                    delegatesNestedType.NestedTypes.Remove(nestedType);
                }
            }
        }
コード例 #10
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;
            int index;

            DummyStream = Array.FindIndex(args, delegate(string item) { return(item == "--dummy"); }) >= 0;
            DocDisabled = Array.FindIndex(args, delegate(string item) { return(item == "--nodoc"); }) >= 0;

            #region Assembly processing

            if ((args.Length > 0) && ((index = Array.FindIndex(args, delegate(string item) { return(item == "--assembly"); })) >= 0))
            {
                string assemblyPath      = args[index + 1];
                bool   overwriteAssembly = Array.Exists(args, delegate(string item) { return(item.StartsWith("--assembly-overwrite")); });
                bool   profileOnlyOpts   = Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-")); });

                List <RegistryAssemblyConfiguration> cfgs = new List <RegistryAssemblyConfiguration>();

                if (profileOnlyOpts == false)
                {
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                }
                else
                {
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-core")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-es2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-sc2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                    }
                }

                foreach (RegistryAssemblyConfiguration cfg in cfgs)
                {
                    try {
                        RegistryAssembly.CleanAssembly(assemblyPath, cfg, overwriteAssembly);
                    } catch (Exception exception) {
                        Console.WriteLine("Unable to process assembly: {0}.", exception.ToString());
                    }
                }

                // Exclusive option
                return;
            }

            #endregion

            #region Log Maps

            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--only-logmaps"); }) >= 0))
            {
                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
                {
                    Console.WriteLine("Generating GL log map...");
                    ctx = new RegistryContext("Gl", "Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
                {
                    Console.WriteLine("Generating WGL log map...");
                    ctx = new RegistryContext("Wgl", "Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
                {
                    Console.WriteLine("Generating GLX log map...");
                    ctx = new RegistryContext("Glx", "Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
                {
                    Console.WriteLine("Generating EGL log map...");
                    ctx = new RegistryContext("Egl", "Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
                }

                // Exclusive option
                return;
            }

            #endregion

            bool genGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0);
            bool genWGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0);
            bool genGLX = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0);
            bool genEGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0);

            // (Common) Documentation
            RegistryDocumentation <RegistryDocumentationHandler_GL4> gl4Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
            RegistryDocumentation <RegistryDocumentationHandler_GL2> gl2Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();

            if (genGL || genWGL || genGLX)
            {
                gl4Documentation.Api = "GL4";
                if (DocDisabled == false)
                {
                    gl4Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/gl4"));
                }

                gl2Documentation.Api = "GL2.1";
                if (DocDisabled == false)
                {
                    gl2Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/gl2.1"));
                }
            }

            // XML-based specifications

            // OpenGL
            if (genGL)
            {
                bool genGL_Features = true, genGL_Commands = false, genGL_Extensions = false, genGL_Limits = false;

                foreach (string arg in Array.FindAll(args, delegate(string item) { return(item.StartsWith("--gl-")); }))
                {
                    switch (arg.Substring(5, arg.Length - 5))
                    {
                    case "commands":
                        genGL_Commands = true;
                        break;

                    case "extensions":
                        genGL_Extensions = true;
                        break;

                    case "limits":
                        genGL_Limits = true;
                        break;
                    }
                    genGL_Features = false;
                }

                // Additional ES documentation
                RegistryDocumentation <RegistryDocumentationHandler_GL4> gles3Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
                gles3Documentation.Api = "GLES3.2";
                if (DocDisabled == false)
                {
                    gles3Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/es3"));
                }

                RegistryDocumentation <RegistryDocumentationHandler_GL2> gles1Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
                gles1Documentation.Api = "GLES1.1";
                if (DocDisabled == false)
                {
                    gles1Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/es1.1"));
                }

                Console.WriteLine("Loading GL specification...");
                ctx = new RegistryContext("Gl", "Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);
                ctx.RefPages.Add(gles3Documentation);
                ctx.RefPages.Add(gles1Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                if (genGL_Features || genGL_Commands)
                {
                    glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                }
                if (genGL_Features || genGL_Extensions)
                {
                    glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                }
                if (genGL_Features || genGL_Limits)
                {
                    glRegistryProcessor.GenerateLimitsSupportClass(ctx);
                }
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
            }

            // OpenGL for Windows
            if (genWGL)
            {
                ctx = new RegistryContext("Wgl", "Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
            }

            // OpenGL for Unix
            if (genGLX)
            {
                ctx = new RegistryContext("Glx", "Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                RegistryDocumentation <RegistryDocumentationHandler_EGL> eglDocumentation = new RegistryDocumentation <RegistryDocumentationHandler_EGL>();
                eglDocumentation.Api = "EGL";
                eglDocumentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/EGL-Registry/sdk/docs/man"));

                ctx = new RegistryContext("Egl", "Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                ctx.RefPages.Add(eglDocumentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
            }

            // OpenWF

            OutputBasePath = "OpenWF.Net";

            // OpenWF(C)
            // Note: you must setup CLI to generate this bindings
            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--wfc"); }) >= 0))
            {
                Header headRegistry = new Header("Wfc");
                headRegistry.CommandExportRegex         = "WF(D|C)_APIENTRY ";
                headRegistry.CommandCallConventionRegex = "WF(D|C)_API_CALL ";
                headRegistry.CommandExitRegex           = " WF(D|C)_APIEXIT";
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfc.h"), new KhronosVersion(1, 0, KhronosVersion.ApiWfc));

                ctx = new RegistryContext("Wfc", "Wfc", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
            }

            // OpenWF(D)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfd"); }) >= 0))
            {
                Header headRegistry = new Header("Wfd");
                headRegistry.CommandExportRegex         = "WF(D|C)_APIENTRY ";
                headRegistry.CommandCallConventionRegex = "WF(D|C)_API_CALL ";
                headRegistry.CommandExitRegex           = " WF(D|C)_APIEXIT";
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfd.h"), new KhronosVersion(1, 0, KhronosVersion.ApiWfd));

                ctx = new RegistryContext("Wfd", "Wfd", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
            }

            // OpenVX

            OutputBasePath = "OpenVX.Net";

            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--vx"); }) >= 0))
            {
                Header vxRegistry = new Header("VX");
                vxRegistry.CommandExportRegex         = "VX_API_ENTRY ";
                vxRegistry.CommandCallConventionRegex = "VX_API_CALL ";
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_api.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_types.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_kernels.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_nodes.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_vendors.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_import.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));

                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_icd.h"), "VX_KHR_icd");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_ix.h"), "VX_KHR_ix");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_nn.h"), "VX_KHR_nn");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_tiling.h"), "VX_KHR_tiling");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_xml.h"), "VX_KHR_xml");

                ctx = new RegistryContext("VX", "VX", vxRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenVX");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                //glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                //glRegistryProcessor.GenerateVersionsSupportClass(ctx);

                Header vxuRegistry = new Header("VXU");
                vxuRegistry.CommandExportRegex         = "VX_API_ENTRY ";
                vxuRegistry.CommandCallConventionRegex = "VX_API_CALL ";
                vxuRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vxu.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));

                ctx = new RegistryContext("VXU", "VX", vxuRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenVX");
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
            }
        }