Add apiname parameter to ISpecReader

This allows us to reuse the same ISpecReader implementation to parse
different APIs (GL and GLES).
This commit is contained in:
Stefanos A 2013-10-28 14:12:23 +01:00
parent 2e435f97bb
commit 7f9041417e
3 changed files with 27 additions and 12 deletions

View file

@ -77,10 +77,12 @@ namespace Bind.GL2
string overrides = Path.Combine(Settings.InputPath, Settings.OverridesFile); string overrides = Path.Combine(Settings.InputPath, Settings.OverridesFile);
Type.GLTypes = SpecReader.ReadTypeMap(Path.Combine(Settings.InputPath, glTypemap)); Type.GLTypes = SpecReader.ReadTypeMap(Path.Combine(Settings.InputPath, glTypemap));
Type.CSTypes = SpecReader.ReadCSTypeMap(Path.Combine(Settings.InputPath, csTypemap)); Type.CSTypes = SpecReader.ReadCSTypeMap(Path.Combine(Settings.InputPath, csTypemap));
SpecReader.ReadEnums(Path.Combine(Settings.InputPath, enumSpec), Enums); SpecReader.ReadEnums(Path.Combine(Settings.InputPath, enumSpec), Enums, "gl");
SpecReader.ReadEnums(overrides, Enums); SpecReader.ReadEnums(Path.Combine(Settings.InputPath, enumSpec), Enums, "glcore");
SpecReader.ReadDelegates(Path.Combine(Settings.InputPath, glSpec), Delegates); SpecReader.ReadEnums(overrides, Enums, "");
SpecReader.ReadDelegates(overrides, Delegates); SpecReader.ReadDelegates(Path.Combine(Settings.InputPath, glSpec), Delegates, "gl");
SpecReader.ReadDelegates(Path.Combine(Settings.InputPath, glSpec), Delegates, "glcore");
SpecReader.ReadDelegates(overrides, Delegates, "");
var enum_processor = new EnumProcessor(overrides); var enum_processor = new EnumProcessor(overrides);
var func_processor = new FuncProcessor(overrides); var func_processor = new FuncProcessor(overrides);

View file

@ -12,8 +12,8 @@ namespace Bind
{ {
interface ISpecReader interface ISpecReader
{ {
void ReadDelegates(string file, DelegateCollection delegates); void ReadDelegates(string file, DelegateCollection delegates, string apiname);
void ReadEnums(string file, EnumCollection enums); void ReadEnums(string file, EnumCollection enums, string apiname);
Dictionary<string, string> ReadTypeMap(string file); Dictionary<string, string> ReadTypeMap(string file);
Dictionary<string, string> ReadCSTypeMap(string file); Dictionary<string, string> ReadCSTypeMap(string file);
} }

View file

@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Xml.Linq;
using System.Xml.XPath; using System.Xml.XPath;
using Bind.Structures; using Bind.Structures;
@ -42,15 +43,21 @@ namespace Bind
{ {
#region ISpecReader Members #region ISpecReader Members
public void ReadDelegates(string file, DelegateCollection delegates) public void ReadDelegates(string file, DelegateCollection delegates, string apiname)
{ {
var specs = new XPathDocument(file); var specs = new XPathDocument(file);
foreach (XPathNavigator nav in specs.CreateNavigator().Select("/signatures/delete")) foreach (XPathNavigator nav in specs.CreateNavigator().Select(
!String.IsNullOrEmpty(apiname) ?
String.Format("/signatures/delete|/signatures/add/delete[@name='{0}']", apiname) :
String.Format("/signatures/delete|/signatures/add/delete")))
{ {
foreach (XPathNavigator node in nav.SelectChildren("function", String.Empty)) foreach (XPathNavigator node in nav.SelectChildren("function", String.Empty))
delegates.Remove(node.GetAttribute("name", String.Empty)); delegates.Remove(node.GetAttribute("name", String.Empty));
} }
foreach (XPathNavigator nav in specs.CreateNavigator().Select("/signatures/add")) foreach (XPathNavigator nav in specs.CreateNavigator().Select(
!String.IsNullOrEmpty(apiname) ?
String.Format("/signatures/add|/signatures/add/api[@name='{0}']", apiname) :
String.Format("/signatures/add|/signatures/add/api")))
{ {
Utilities.Merge(delegates, ReadDelegates(nav)); Utilities.Merge(delegates, ReadDelegates(nav));
} }
@ -125,19 +132,25 @@ namespace Bind
return delegates; return delegates;
} }
public void ReadEnums(string file, EnumCollection enums) public void ReadEnums(string file, EnumCollection enums, string apiname)
{ {
// First, read all enum definitions from spec and override file. // First, read all enum definitions from spec and override file.
// Afterwards, read all token/enum overrides from overrides file. // Afterwards, read all token/enum overrides from overrides file.
// Every single enum is merged into // Every single enum is merged into
var specs = new XPathDocument(file); var specs = new XPathDocument(file);
foreach (XPathNavigator nav in specs.CreateNavigator().Select("/signatures/delete")) foreach (XPathNavigator nav in specs.CreateNavigator().Select(
!String.IsNullOrEmpty(apiname) ?
String.Format("/signatures/delete|/signatures/delete/api[@name='{0}']", apiname) :
String.Format("/signatures/delete|/signatures/delete/api")))
{ {
foreach (XPathNavigator node in nav.SelectChildren("enum", String.Empty)) foreach (XPathNavigator node in nav.SelectChildren("enum", String.Empty))
enums.Remove(node.GetAttribute("name", String.Empty)); enums.Remove(node.GetAttribute("name", String.Empty));
} }
foreach (XPathNavigator nav in specs.CreateNavigator().Select("/signatures/add")) foreach (XPathNavigator nav in specs.CreateNavigator().Select(
!String.IsNullOrEmpty(apiname) ?
String.Format("/signatures/add|/signatures/add/api[@name='{0}']", apiname) :
String.Format("/signatures/add|/signatures/add/api")))
{ {
Utilities.Merge(enums, ReadEnums(nav)); Utilities.Merge(enums, ReadEnums(nav));
} }