vk.xml

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Feb 21 04:52:33 PST 2016


So I was going through the vulcan spec to try to create a better 
D bindings for it. (pointer /len pairs to arrays adhering to D 
naming conventions and prettying up the *Create functions 
functions like vkResult *Create( arg ,&arg, retptr) to a fancy 
throw on misuse struct with constructors and that kind of stuff.)

  the structure of the registry is as follows.


struct KHR_registry
{

     string comment; // Not as xml comment  but a <comment> ... 
</comment>

     struct vendorid
     {
         string @Tag name;
         string @Tag id;
         string @Tag comment;
     }
     vendorid[] vendorids;

     struct tag
     {
         string @Tag name;
         string @Tag author;
         string @Tag contact;
     }
     tag[] tags;

     struct validity_type    // does not appear at this level but 
is common to commands and types
     {
         struct usage_type
         {
             string content;
         }
         usage_type[] usage;
     }
     struct type
     {
         string name;            // inconsistanly in tag and 
content
         string requires;
         string parent;
         string content;
         enum category_tpye
         {
             include,
             define,
             basetype,
             bitmask,
             handle,
             enum_,
             funcpointer,
             struct_,

         }
         category_tpye category;
         bool returnedonly;

         validity_type validity;
         struct member
         {
             string typename;      //name of the members type 
variable tag type
             string name;            //name of the member variable
             string len;                //companion member length 
variable for array pointers
             bool optional;                      //should generate 
as a default value
             bool noautovalidity;

         }
         enums* enum;                            //pointer to 
corresponding type enum definition
         struct params
         {
             type* paramType;                    //for some reason 
any pointer qualifiactions occur after e.g.
                                                 // <type> void 
</type> * see coment below
             string name;
             size_t  inderections;               // number of 
pointer inderections before reaching the type pointed to
                                                 // by paramType
                                                 // functions 
taking no args will have parameters == []
             string content;

         }
         params[] parameters;
     }
     type[] types;

     struct enums
     {
         string name,comment, type, expand;
           // expand is the C enum's Prefix e.g. VK_QUERY_TYPE
         struct enum_
         {
             string value, name, comment;
         }
     }

     struct command
     {
         string successcodes;
         string errorcodes;
         string content;
         struct proto_type
         {
             string content;
             type* returnType;
             string name;


         }
         proto_type proto;
         struct pram
         {
             string content;
             bool optional;
             string externsync;
             string len;
             size_t inderections;
             immutable invalidLen = "null-terminated";
             // if len is this then it is not an array
             // although this is inconsistant. sometimes as a len
             // others in the validity
         }
         validity_type validity;
         string queues, renderpass, cmdbufferlevel;
     }

     command[] commands;
     struct feature
     {
         string api, name, number;

         /*
          <require comment="API version">
          <type name="VK_API_VERSION"/>
          <enum name="VK_VERSION_MAJOR"/>
          <command name="VK_VERSION_MINOR"/>
          <type name="VK_VERSION_PATCH"/>
          </require>*/
         struct require

         {
             string comment;
             string metaType; // type enum command see above 
variable tag type
             string name;
         }
         require[] requires;
     }
     struct extension
     {
         string name, number, supported;
         struct require
         {
             struct elem
             {
                 string name, content;
                 string metaType; //variable tag type
                 string offset, extends;
             }
         }
     }
     extension[] extensions;
}

where "string content" is the string between the tags (does this 
have a name?) and thing with @Tag are always in the tag (although 
it is also inconsistent). I tried looking at the docs for std.xml 
but they were not very helpful.

To further complicate things not all of the fields are present in 
all cases also I need to keep track of the number of '*' (see 
fields named indirections) after a tag has closed  for pointer 
type declarations in function signatures and structs.

Also is there a way to do sane cross referencing without having 
internal pointers everywhere.

I'm sure there should be a very elegant way to do this by 
recursing down through the sub-structs

Many thanks
Nic


More information about the Digitalmars-d-learn mailing list