GtkSharp/Source/Tools/GapiCodegen/GenerationInfo.cs
2021-07-22 19:40:38 +06:00

260 lines
6.7 KiB
C#

// GtkSharp.Generation.GenerationInfo.cs - Generation information class.
//
// Author: Mike Kestner <mkestner@ximian.com>
//
// Copyright (c) 2003-2008 Novell Inc.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
namespace GtkSharp.Generation {
using System;
using System.Collections;
using System.IO;
using System.Xml;
public class GenerationInfo {
string dir;
string assembly_name;
string gluelib_name;
bool glue_enabled;
StreamWriter sw;
StreamWriter abiwriter = null;
StreamWriter cabiwriter = null;
StreamWriter glue_sw;
string abicfile = null;
string abicsfile = null;
public GenerationInfo (XmlElement ns)
{
string ns_name = ns.GetAttribute ("name");
char sep = Path.DirectorySeparatorChar;
dir = ".." + sep + ns_name.ToLower () + sep + "generated";
assembly_name = ns_name.ToLower () + "-sharp";
}
public GenerationInfo (string dir, string assembly_name) :
this (dir, assembly_name, "", "", "", "", "", "") {}
public GenerationInfo (string dir, string assembly_name, string glue_filename,
string glue_includes, string gluelib_name, string abi_c_file,
string abi_cs_file, string abi_cs_usings)
{
this.dir = dir;
this.assembly_name = assembly_name;
this.gluelib_name = gluelib_name;
abicfile = abi_c_file;
abicsfile = abi_cs_file;
InitializeWriters (glue_filename, glue_includes, gluelib_name, abi_cs_usings);
}
void InitializeWriters (string glue_filename, string glue_includes, string gluelib_name,
string abi_cs_usings)
{
if (gluelib_name != String.Empty && glue_filename != String.Empty) {
FileStream stream;
try {
stream = new FileStream (glue_filename, FileMode.Create, FileAccess.Write);
} catch (Exception) {
Console.Error.WriteLine ("Unable to create specified glue file. Glue will not be generated.");
return;
}
glue_sw = new StreamWriter (stream);
glue_sw.WriteLine ("// This file was generated by the Gtk# code generator.");
glue_sw.WriteLine ("// Any changes made will be lost if regenerated.");
glue_sw.WriteLine ();
if (glue_includes != "") {
foreach (string header in glue_includes.Split (new char[] {',', ' '})) {
if (header != "")
glue_sw.WriteLine ("#include <{0}>", header);
}
glue_sw.WriteLine ("");
}
glue_enabled = true;
}
if (cabiwriter == null && abicfile != "" && abicsfile != "" && abi_cs_usings != "") {
var stream = new FileStream (abicfile, FileMode.Create, FileAccess.Write);
cabiwriter = new StreamWriter (stream);
cabiwriter.WriteLine ("// This file was generated by the Gtk# code generator.");
cabiwriter.WriteLine ("// Any changes made will be lost if regenerated.");
cabiwriter.WriteLine ();
if (glue_includes != "") {
foreach (string header in glue_includes.Split (new char[] {',', ' '})) {
if (header != "")
cabiwriter.WriteLine ("#include <{0}>", header);
}
cabiwriter.WriteLine ("");
}
cabiwriter.WriteLine ("int main (int argc, char *argv[]) {");
stream = new FileStream (abicsfile, FileMode.Create, FileAccess.Write);
abiwriter = new StreamWriter (stream);
abiwriter.WriteLine ("// This file was generated by the Gtk# code generator.");
abiwriter.WriteLine ("// Any changes made will be lost if regenerated.");
abiwriter.WriteLine ();
var name = "";
foreach (string _using in abi_cs_usings.Split (new char[] {',', ' '})) {
if (_using != "") {
abiwriter.WriteLine ("using {0};", _using);
if (name == "")
name = _using;
}
}
abiwriter.WriteLine ("using System;");
abiwriter.WriteLine ();
abiwriter.WriteLine ("namespace AbiTester {");
abiwriter.WriteLine ("\tclass ___" + name + " {");
abiwriter.WriteLine ("\t\tpublic static void Main (string[] args) {");
}
}
public string AssemblyName {
get {
return assembly_name;
}
}
public StreamWriter AbiWriter {
get {
return abiwriter;
}
}
public StreamWriter CAbiWriter {
get {
return cabiwriter;
}
}
public string Dir {
get {
return dir;
}
}
public string GluelibName {
get {
return gluelib_name;
}
}
public bool GlueEnabled {
get {
return glue_enabled;
}
}
public StreamWriter GlueWriter {
get {
return glue_sw;
}
}
public StreamWriter Writer {
get {
return sw;
}
set {
sw = value;
}
}
public void CloseWriters ()
{
if (glue_sw != null)
glue_sw.Close ();
if (cabiwriter != null) {
cabiwriter.WriteLine ("\treturn 0;");
cabiwriter.WriteLine ("}");
cabiwriter.Close();
abiwriter.WriteLine ("\t\t}");
abiwriter.WriteLine ("\t}");
abiwriter.WriteLine ("}");
abiwriter.Close();
}
}
string member;
public string CurrentMember {
get {
return typename + "." + member;
}
set {
member = value;
}
}
string typename;
public string CurrentType {
get {
return typename;
}
set {
typename = value;
}
}
public StreamWriter OpenStream (string name, string namespce)
{
string gen_dir = Path.Combine (dir, namespce);
Directory.CreateDirectory (gen_dir);
string filename = Path.Combine (gen_dir, name + ".cs");
FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter (stream);
sw.WriteLine ("// This file was generated by the Gtk# code generator.");
sw.WriteLine ("// Any changes made will be lost if regenerated.");
sw.WriteLine ();
return sw;
}
internal static string GetSizeOfExpression(string cstype)
{
// See https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types
bool isBlittable = cstype == "IntPtr"
|| cstype == "UIntPtr"
|| cstype == "ulong"
|| cstype == "long"
|| cstype == "uint"
|| cstype == "int"
|| cstype == "ushort"
|| cstype == "short"
|| cstype == "byte"
|| cstype == "sbyte"
|| cstype == "float"
|| cstype == "double";
if (isBlittable)
return "sizeof( " + cstype + " )";
return "Marshal.SizeOf<" + cstype + ">()";
}
}
}