diff --git a/ChangeLog b/ChangeLog index 92403d7c5..c8f198603 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2002-01-06 Mike Kestner + + * generator/EnumGen.cs : Open stream Create only. + * generator/ObjectGen.cs : New generatable for GObject subclasses. + * generator/Parser.cs : Add the object element hook. + * generator/StructBase.cs : Handle bits element in GenField. + * generator/StructGen.cs : Open stream Create only. + * generator/SymbolTable.cs : Additions to simple_types hash. + * parser/gapi2xml.pl : Parse bitflags into the bits element. + 2002-01-05 Mike Kestner * generator/SymbolTable.cs : First pass at simple_types hash. diff --git a/generator/EnumGen.cs b/generator/EnumGen.cs index e8f0b1bfd..15faf3440 100644 --- a/generator/EnumGen.cs +++ b/generator/EnumGen.cs @@ -58,7 +58,7 @@ namespace GtkSharp.Generation { { String filename = "..\\" + ns.ToLower() + "\\generated\\" + Name + ".cs"; - FileStream stream = new FileStream (filename, FileMode.OpenOrCreate, FileAccess.Write); + FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter (stream); sw.WriteLine ("// Generated File. Do not modify."); diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs new file mode 100644 index 000000000..7c03a8bfc --- /dev/null +++ b/generator/ObjectGen.cs @@ -0,0 +1,120 @@ +// GtkSharp.Generation.ObjectGen.cs - The Object Generatable. +// +// Author: Mike Kestner +// +// (c) 2001 Mike Kestner + +namespace GtkSharp.Generation { + + using System; + using System.IO; + using System.Xml; + + public class ObjectGen : StructBase, IGeneratable { + + public ObjectGen (String ns, XmlElement elem) : base (ns, elem) {} + + public String Name { + get + { + return elem.GetAttribute("name"); + } + } + + public String QualifiedName { + get + { + return ns + "." + elem.GetAttribute("name"); + } + } + + public String CName { + get + { + return elem.GetAttribute("cname"); + } + } + + public String MarshalType { + get + { + return "IntPtr"; + } + } + + public String CallByName (String var_name) + { + return var_name + ".RawObject"; + } + + public void Generate (SymbolTable table) + { + String filename = "..\\" + ns.ToLower() + "\\generated\\" + Name + ".cs"; + + FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write); + StreamWriter sw = new StreamWriter (stream); + + sw.WriteLine ("// Generated File. Do not modify."); + sw.WriteLine ("// 2001 Mike Kestner"); + sw.WriteLine (); + + sw.WriteLine ("namespace " + ns + " {"); + sw.WriteLine (); + + sw.WriteLine ("\tusing System;"); + sw.WriteLine ("\tusing System.Collections;"); + sw.WriteLine ("\tusing System.Runtime.InteropServices;"); + sw.WriteLine (); + + String parent = elem.GetAttribute("parent"); + String cs_parent = table.GetCSType(parent); + sw.Write ("\tpublic class " + Name); + if (cs_parent == "") { + sw.WriteLine (" {"); + Console.WriteLine ("Unknown type " + parent); + } else { + sw.WriteLine (" : " + cs_parent + " {"); + } + sw.WriteLine (); + + foreach (XmlNode node in elem.ChildNodes) { + + XmlElement member = (XmlElement) node; + + switch (node.Name) { + case "field": + // GenField(member, table, sw); + break; + + case "callback": + break; + + case "constructor": + break; + + case "method": + break; + + case "property": + break; + + case "signal": + break; + + default: + Console.WriteLine ("Unexpected node"); + break; + } + + } + + sw.WriteLine ("\t}"); + sw.WriteLine (); + sw.WriteLine ("}"); + + sw.Flush(); + sw.Close(); + } + } +} + diff --git a/generator/Parser.cs b/generator/Parser.cs index c2555bf10..0dc5a809d 100644 --- a/generator/Parser.cs +++ b/generator/Parser.cs @@ -81,6 +81,7 @@ namespace GtkSharp.Generation { break; case "object": + table.AddType (new ObjectGen (ns_name, elem)); break; case "struct": diff --git a/generator/StructBase.cs b/generator/StructBase.cs index 3ec663b29..4f70e9c6a 100644 --- a/generator/StructBase.cs +++ b/generator/StructBase.cs @@ -23,13 +23,27 @@ namespace GtkSharp.Generation { protected void GenField (XmlElement field, SymbolTable table, StreamWriter sw) { - String c_type = field.GetAttribute("type"); - sw.Write ("\t\t" + table.GetCSType(c_type)); - if (field.HasAttribute("array_len")) { - sw.Write ("[]"); - } - - sw.WriteLine (" " + field.GetAttribute("cname") + ";"); + String c_type; + + if (field.HasAttribute("bits") && (field.GetAttribute("bits") == "1")) { + c_type = "gboolean"; + } else { + c_type = field.GetAttribute("type"); + } + char[] ast = {'*'}; + c_type = c_type.TrimEnd(ast); + String cs_type = table.GetCSType(c_type); + + if (cs_type == "") { + Console.WriteLine ("Unknown Type {0}", c_type); + return; + } + + sw.Write ("\t\t" + cs_type); + if (field.HasAttribute("array_len")) { + sw.Write ("[]"); + } + sw.WriteLine (" " + field.GetAttribute("cname") + ";"); } } diff --git a/generator/StructGen.cs b/generator/StructGen.cs index 38a32834e..1cce903db 100644 --- a/generator/StructGen.cs +++ b/generator/StructGen.cs @@ -51,7 +51,7 @@ namespace GtkSharp.Generation { { String filename = "..\\" + ns.ToLower() + "\\generated\\" + Name + ".cs"; - FileStream stream = new FileStream (filename, FileMode.OpenOrCreate, FileAccess.Write); + FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter (stream); sw.WriteLine ("// Generated File. Do not modify."); @@ -76,6 +76,7 @@ namespace GtkSharp.Generation { switch (node.Name) { case "field": + // GenField(member, table, sw); break; case "callback": diff --git a/generator/SymbolTable.cs b/generator/SymbolTable.cs index 5bb7196ec..52e9f5a2a 100644 --- a/generator/SymbolTable.cs +++ b/generator/SymbolTable.cs @@ -21,6 +21,7 @@ namespace GtkSharp.Generation { 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"); @@ -30,7 +31,10 @@ namespace GtkSharp.Generation { 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", "IntPtr"); simple_types.Add ("guchar", "byte"); simple_types.Add ("GValue", "GLib.Value"); simple_types.Add ("GtkType", "int"); @@ -38,12 +42,15 @@ namespace GtkSharp.Generation { simple_types.Add ("gulong", "ulong"); simple_types.Add ("GQuark", "int"); simple_types.Add ("int", "int"); + simple_types.Add ("char", "char"); simple_types.Add ("double", "double"); simple_types.Add ("gunichar", "String"); simple_types.Add ("uint1", "bool"); // FIXME: These ought to be handled properly. + simple_types.Add ("GList", "IntPtr"); simple_types.Add ("GSList", "IntPtr"); + simple_types.Add ("GHashTable", "IntPtr"); simple_types.Add ("va_list", "IntPtr"); simple_types.Add ("GParamSpec", "IntPtr"); } diff --git a/generator/api.xml b/generator/api.xml index 8a677d907..cbf0910a5 100644 --- a/generator/api.xml +++ b/generator/api.xml @@ -1,2 +1,2 @@ - + diff --git a/parser/gapi2xml.pl b/parser/gapi2xml.pl index 5a94a4216..988635108 100755 --- a/parser/gapi2xml.pl +++ b/parser/gapi2xml.pl @@ -302,11 +302,13 @@ sub addFieldElems if ($tok =~ /(\w+)\s*\[(.*)\]/) { $elem = addNameElem($parent, 'field', $1); $elem->setAttribute('array_len', "$2"); - $elem->setAttribute('type', "$type"); + } elsif ($tok =~ /(\w+)\s*\:\s*(\d+)/) { + $elem = addNameElem($parent, 'field', $1); + $elem->setAttribute('bits', "$2"); } else { $elem = addNameElem($parent, 'field', $symb); - $elem->setAttribute('type', "$type"); } + $elem->setAttribute('type', "$type"); } } else { die "$field\n";