// GtkSharp.Generation.SymbolTable.cs - The Symbol Table Class. // // Author: Mike Kestner // // (c) 2001 Mike Kestner namespace GtkSharp.Generation { using System; using System.Collections; public class SymbolTable { private Hashtable complex_types = new Hashtable (); private Hashtable simple_types; private Hashtable dlls; public SymbolTable () { simple_types = new Hashtable (); simple_types.Add ("void", "void"); simple_types.Add ("gboolean", "bool"); simple_types.Add ("gint", "int"); simple_types.Add ("guint", "uint"); simple_types.Add ("glong", "long"); simple_types.Add ("gshort", "short"); simple_types.Add ("guint32", "uint"); simple_types.Add ("const-gchar", "string"); simple_types.Add ("gchar", "string"); simple_types.Add ("GObject", "GLib.Object"); simple_types.Add ("gfloat", "float"); simple_types.Add ("gdouble", "double"); simple_types.Add ("gint8", "byte"); simple_types.Add ("guint8", "byte"); simple_types.Add ("gint16", "short"); simple_types.Add ("gint32", "int"); simple_types.Add ("guint16", "ushort"); simple_types.Add ("guint1", "bool"); simple_types.Add ("gpointer", "System.IntPtr"); simple_types.Add ("guchar", "byte"); simple_types.Add ("GValue", "GLib.Value"); simple_types.Add ("GtkType", "int"); simple_types.Add ("long", "long"); simple_types.Add ("gulong", "ulong"); simple_types.Add ("GQuark", "int"); simple_types.Add ("int", "int"); simple_types.Add ("char", "string"); simple_types.Add ("double", "double"); simple_types.Add ("float", "float"); simple_types.Add ("gunichar", "string"); simple_types.Add ("uint1", "bool"); simple_types.Add ("GPtrArray", "System.IntPtr[]"); simple_types.Add ("GType", "int"); // FIXME: These ought to be handled properly. simple_types.Add ("GList", "System.IntPtr"); simple_types.Add ("GMemChunk", "System.IntPtr"); simple_types.Add ("GTimeVal", "System.IntPtr"); simple_types.Add ("GClosure", "System.IntPtr"); simple_types.Add ("GArray", "System.IntPtr"); simple_types.Add ("GData", "System.IntPtr"); simple_types.Add ("GTypeModule", "GLib.Object"); simple_types.Add ("GSList", "GLib.SList"); simple_types.Add ("GHashTable", "System.IntPtr"); simple_types.Add ("va_list", "System.IntPtr"); simple_types.Add ("GParamSpec", "System.IntPtr"); dlls = new Hashtable(); dlls.Add("Pango", "pango-1.0"); dlls.Add("Atk", "atk-1.0"); dlls.Add("Gdk", "gdk-x11-2.0"); dlls.Add("Gtk", "gtk-x11-2.0"); } public void AddType (IGeneratable gen) { complex_types [gen.CName] = gen; } public int Count { get { return complex_types.Count; } } public IEnumerable Generatables { get { return complex_types.Values; } } private string Trim(string type) { string trim_type = type.TrimEnd('*'); if (trim_type.StartsWith("const-")) return trim_type.Substring(6); return trim_type; } public string FromNative(string c_type, string val) { c_type = Trim(c_type); if (simple_types.ContainsKey(c_type)) { return val; } else if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; return gen.FromNative(val); } else { return ""; } } public string GetCSType(string c_type) { c_type = Trim(c_type); if (simple_types.ContainsKey(c_type)) { return (string) simple_types[c_type]; } else if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; return gen.QualifiedName; } else { return ""; } } public string GetName(string c_type) { c_type = Trim(c_type); if (simple_types.ContainsKey(c_type)) { string stype = (string) simple_types[c_type]; int dotidx = stype.IndexOf("."); if (dotidx == -1) { return stype; } else { return stype.Substring(dotidx+1); } } else if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; return gen.Name; } else { return ""; } } public string GetDllName(string ns) { return (string) dlls[ns]; } public string GetMarshalType(string c_type) { c_type = Trim(c_type); if (simple_types.ContainsKey(c_type)) { return (string) simple_types[c_type]; } else if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; return gen.MarshalType; } else { return ""; } } public string CallByName(string c_type, string var_name) { c_type = Trim(c_type); if (simple_types.ContainsKey(c_type)) { return var_name; } else if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; return gen.CallByName(var_name); } else { return ""; } } public bool IsBoxed(string c_type) { c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is BoxedGen) { return true; } } return false; } public bool IsEnum(string c_type) { c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is EnumGen) { return true; } } return false; } public bool IsInterface(string c_type) { c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is InterfaceGen) { return true; } } return false; } public bool IsObject(string c_type) { c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is ObjectGen) { return true; } } return false; } } }