using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace RglParser
{
class Program
{
private static Dictionary<string, List<string>> _classes = new Dictionary<string, List<string>>();
static void AddMethod(string @class, string method, string retval)
{
if (!_classes.ContainsKey(@class)) _classes[@class] = new List<string>();
method = method.Replace("struct rgl", "rgl") + ";";
method = Regex.Replace(method, "\\@<.*?>", ""); //remove regiters
if (method.StartsWith("~")) _classes[@class].Add(method); //destructor
else if (method.StartsWith(@class + "(")) _classes[@class].Add(method); //constructor
else _classes[@class].Add(retval + " " + method);
}
static string ClassToString(string @class)
{
var sb = new StringBuilder();
sb.AppendLine("class " + @class);
sb.AppendLine("{");
sb.AppendLine("public:");
foreach (var method in _classes[@class])
{
sb.AppendLine(" " + method);
}
sb.AppendLine("};");
return sb.ToString();
}
static void ParseDeclaration(string str)
{
try
{
var lexems = str.Split(new[] { " ", "(" }, StringSplitOptions.None);
if (lexems[0] == "this") lexems = lexems.Skip(1).ToArray();
if (!lexems[2].Contains("::")) return;
var className = lexems[2].Split(new[] { "::" }, StringSplitOptions.None)[0];
var methodName = lexems[2].Split(new[] { "::" }, StringSplitOptions.None)[1];
var a = str.IndexOf('(');
var b = str.IndexOf(')');
a++;
b--;
var parametersStr = str.Substring(a, b - a + 1);
var parameters = parametersStr.Split(new[] { "," }, StringSplitOptions.None).Select(s => s.Trim());
/*if (parameters[0].Contains("this"))*/ parameters = parameters.Skip(1).ToArray();
AddMethod(className, methodName + "(" + String.Join(", ", parameters) + ")", lexems[0]);
}
catch { }
}
static void Main(string[] args)
{
//Rgl.dll.c дать офк не могу.
var lines = File.ReadAllLines("E:\\Rgl.dll.c").Take(19060).Where(x => x.Contains("rgl"))
.Select(x => x.StartsWith("// ") ? x.Remove(0, 3) : x);
foreach (var line in lines) ParseDeclaration(line);
var f = new StreamWriter("rgl.h");
foreach (var c in _classes.Keys) f.WriteLine(ClassToString(c));
f.Close();
}
}
}