Exemple #1
0
 public FunctionParamData(FunctionParamData functionParamData)
 {
     IsConst        = functionParamData.IsConst;
     PointerCount   = functionParamData.PointerCount;
     TypeOverridden = functionParamData.TypeOverridden;
     TypePrefix     = functionParamData.TypePrefix;
     Type           = functionParamData.Type;
     Name           = functionParamData.Name;
 }
Exemple #2
0
        private static string GetParamType(FunctionParamData param, bool isRefOrOutOverload = false)
        {
            string type = param.Type;

            if (!param.TypeOverridden)
            {
                switch (param.Type)
                {
                case "EGLClientBuffer":
                case "EGLConfig":
                case "EGLContext":
                case "EGLDisplay":
                case "EGLImage":
                case "EGLNativeDisplayType":
                case "EGLNativePixmapType":
                case "EGLNativeWindowType":
                case "EGLSurface":
                case "EGLSync":
                    type = "IntPtr";
                    break;

                case "EGLTime":
                    type = "ulong";
                    break;

                case "EGLAttrib*":
                case "EGLConfig*":
                    type = "IntPtr*";
                    break;

                case "EGLBoolean":
                case "GLboolean":
                    type = "bool";
                    break;

                case "GLboolean*":
                    type = "bool*";
                    break;

                case "GLubyte":
                    type = "byte";
                    break;

                case "GLubyte*":
                    type = "byte*";
                    break;

                case "char*":
                case "GLchar*":
                    if (param.IsConst)
                    {
                        type = "string";
                    }
                    else
                    {
                        type = "StringBuilder";
                    }
                    break;

                case "GLchar**":
                    type = "string[]";
                    break;

                case "GLDEBUGPROC":
                    type = "glDebugProc";
                    break;

                case "GLdouble":
                    type = "double";
                    break;

                case "GLdouble*":
                    type = "double*";
                    break;

                case "GLfloat":
                    type = "float";
                    break;

                case "GLfloat*":
                    type = "float*";
                    break;

                case "EGLint":
                case "GLint":
                case "GLsizei":
                case "GLintptr":
                case "GLsizeiptr":
                    type = "int";
                    break;

                case "EGLint*":
                case "GLint*":
                case "GLsizei*":
                case "GLintptr*":
                case "GLsizeiptr*":
                    type = "int*";
                    break;

                case "GLsync":
                    type = "IntPtr";
                    break;

                case "void":
                    if (param.PointerCount == 2)
                    {
                        type = "IntPtr[]";
                    }
                    else
                    {
                        type = "IntPtr";
                    }
                    break;

                case "GLint64":
                    type = "long";
                    break;

                case "GLint64*":
                    type = "long*";
                    break;

                case "GLbyte":
                    type = "sbyte";
                    break;

                case "GLbyte*":
                    type = "sbyte*";
                    break;

                case "GLshort":
                    type = "short";
                    break;

                case "GLshort*":
                    type = "short*";
                    break;

                case "EGLenum":
                    type = "int";
                    break;

                case "GLbitfield":
                case "GLenum":
                case "GLuint":
                    type = "uint";
                    break;

                case "GLuint*":
                case "GLenum*":
                    type = "uint*";
                    break;

                case "GLuint64":
                    type = "ulong";
                    break;

                case "GLuint64*":
                    type = "ulong*";
                    break;

                case "GLushort":
                    type = "ushort";
                    break;

                case "GLushort*":
                    type = "ushort*";
                    break;
                }
            }

            if (isRefOrOutOverload)
            {
                type = type.TrimEnd('*');
            }

            return(type);
        }
Exemple #3
0
        private static (List <EnumData> Enums, List <FunctionData> Functions) Parse(
            string inputPath,
            string enumPrefix,
            string functionApiCall,
            string functionApiEntry)
        {
            var lines = File.ReadAllLines(Path.Combine(AssemblyDirectory, inputPath));

            var enums     = new List <EnumData>();
            var functions = new List <FunctionData>();

            int versionMajor = 0;
            int versionMinor = 0;

            for (int i = 0; i < lines.Length; i++)
            {
                if (lines[i].StartsWith($"#ifndef {enumPrefix}_VERSION_"))
                {
                    var parts = lines[i].Substring($"#ifndef {enumPrefix}_VERSION_".Length).Split('_');
                    versionMajor = int.Parse(parts[0]);
                    versionMinor = int.Parse(parts[1]);
                }
                else if (lines[i].StartsWith($"#define {enumPrefix}_") &&
                         !lines[i].StartsWith($"#define {enumPrefix}_VERSION_") &&
                         !lines[i].StartsWith($"#define {enumPrefix}_APIENTRYP"))
                {
                    var parts = lines[i].Substring("#define ".Length).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    enums.Add(new EnumData()
                    {
                        VersionMajor = versionMajor,
                        VersionMinor = versionMinor,
                        Name         = parts[0].Trim(),
                        Value        = parts[1].Trim()
                    });
                }
                else if (lines[i].StartsWith($"{functionApiCall} ") && lines[i].Contains(functionApiEntry))
                {
                    var parts = lines[i].Substring($"{functionApiCall} ".Length)
                                .Replace("const GLubyte *GL_APIENTRY", "IntPtr")
                                .Replace("const char *EGLAPIENTRY", "string")
                                .Replace(functionApiEntry, "")
                                .Replace("*const*", "**")
                                .Trim(';')
                                .Split(new char[] { ' ', ',', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);

                    int j = 0;

                    var function = new FunctionData()
                    {
                        VersionMajor = versionMajor,
                        VersionMinor = versionMinor,
                    };

                    function.ReturnType = parts[j];
                    j++;

                    if (parts[j] == "*")
                    {
                        function.ReturnType += "*";
                        j++;
                    }

                    function.Name = parts[j];
                    j++;

                    if (parts[j] != "void")
                    {
                        for (; j < parts.Length; j += 2)
                        {
                            bool isConst = false;

                            if (parts[j] == "const")
                            {
                                isConst = true;
                                j++;
                            }

                            int pointerCount = 0;

                            while (parts[j + 1].StartsWith("*"))
                            {
                                pointerCount++;
                                parts[j]    += "*";
                                parts[j + 1] = parts[j + 1].Substring("*".Length);
                            }

                            var functionParam = new FunctionParamData()
                            {
                                IsConst      = isConst,
                                PointerCount = pointerCount,
                                Type         = parts[j],
                                Name         = parts[j + 1],
                            };

                            function.Params.Add(functionParam);
                        }
                    }

                    functions.Add(function);
                }
            }

            return(enums, functions);
        }