public FunctionParamData(FunctionParamData functionParamData) { IsConst = functionParamData.IsConst; PointerCount = functionParamData.PointerCount; TypeOverridden = functionParamData.TypeOverridden; TypePrefix = functionParamData.TypePrefix; Type = functionParamData.Type; Name = functionParamData.Name; }
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); }
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); }