[PD-cvs] externals/clr/PureData AssemblyInfo.cs, NONE, 1.1 Atom.cs, NONE, 1.1 PureData.cs, NONE, 1.1 PureData.csproj, NONE, 1.1 README.txt, NONE, 1.1
Thomas Grill
xovo at users.sourceforge.net
Tue Mar 7 14:18:34 CET 2006
- Previous message: [PD-cvs] externals/clr/pd AssemblyInfo.cs, 1.3, NONE Atom.cs, 1.6, NONE PureData.cs, 1.4, NONE README.txt, 1.1, NONE pd.csproj, 1.3, NONE pd.sln, 1.1, NONE
- Next message: [PD-cvs] externals/clr/PureData PureData.cs,1.1,1.2
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/pure-data/externals/clr/PureData
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29926/clr/PureData
Added Files:
AssemblyInfo.cs Atom.cs PureData.cs PureData.csproj README.txt
Log Message:
restructured project (MSVC can't cope well with folder/classname mismatch)
search for CLR DLLs in PD path
first steps to efficient method handling
--- NEW FILE: PureData.csproj ---
<VisualStudioProject>
<CSHARP
ProjectType = "Local"
ProductVersion = "7.10.3077"
SchemaVersion = "2.0"
ProjectGuid = "{0015D5E7-B0FB-4F06-B334-225447D1F992}"
>
<Build>
<Settings
ApplicationIcon = ""
AssemblyKeyContainerName = ""
AssemblyName = "PureData"
AssemblyOriginatorKeyFile = ""
DefaultClientScript = "JScript"
DefaultHTMLPageLayout = "Grid"
DefaultTargetSchema = "IE50"
DelaySign = "false"
OutputType = "Library"
PreBuildEvent = ""
PostBuildEvent = ""
RootNamespace = "PureData"
RunPostBuildEvent = "OnBuildSuccess"
StartupObject = ""
>
<Config
Name = "Debug"
AllowUnsafeBlocks = "true"
BaseAddress = "285212672"
CheckForOverflowUnderflow = "false"
ConfigurationOverrideFile = ""
DefineConstants = "DEBUG;TRACE"
DocumentationFile = ""
DebugSymbols = "true"
FileAlignment = "4096"
IncrementalBuild = "false"
NoStdLib = "false"
NoWarn = ""
Optimize = "false"
OutputPath = "bin\Debug\"
RegisterForComInterop = "false"
RemoveIntegerChecks = "false"
TreatWarningsAsErrors = "false"
WarningLevel = "4"
/>
<Config
Name = "Release"
AllowUnsafeBlocks = "true"
BaseAddress = "285212672"
CheckForOverflowUnderflow = "false"
ConfigurationOverrideFile = ""
DefineConstants = "TRACE"
DocumentationFile = ""
DebugSymbols = "false"
FileAlignment = "4096"
IncrementalBuild = "false"
NoStdLib = "false"
NoWarn = ""
Optimize = "true"
OutputPath = "bin\Release\"
RegisterForComInterop = "false"
RemoveIntegerChecks = "false"
TreatWarningsAsErrors = "false"
WarningLevel = "4"
/>
</Settings>
<References>
<Reference
Name = "System"
AssemblyName = "System"
HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
/>
<Reference
Name = "System.Data"
AssemblyName = "System.Data"
HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
/>
<Reference
Name = "System.XML"
AssemblyName = "System.XML"
HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
/>
</References>
</Build>
<Files>
<Include>
<File
RelPath = "AssemblyInfo.cs"
SubType = "Code"
BuildAction = "Compile"
/>
<File
RelPath = "Atom.cs"
SubType = "Code"
BuildAction = "Compile"
/>
<File
RelPath = "PureData.cs"
SubType = "Code"
BuildAction = "Compile"
/>
</Include>
</Files>
</CSHARP>
</VisualStudioProject>
--- NEW FILE: PureData.cs ---
using System;
using System.Runtime.CompilerServices; // for extern import
using System.Runtime.InteropServices; // for structures
namespace PureData
{
// PD core functions
public unsafe class Internal
{
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static void *SymGen(string sym);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static string SymEval(void *sym);
}
// This is the base class for a PD/CLR external
public unsafe class External
{
// PD object pointer
private readonly void *ptr;
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Post(string message);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void PostError(string message);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void PostBug(string message);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void PostVerbose(string message);
// --------------------------------------------------------------------------
protected delegate void MethodBang();
protected delegate void MethodFloat(float f);
protected delegate void MethodSymbol(Symbol s);
protected delegate void MethodPointer(Pointer p);
protected delegate void MethodList(AtomList lst);
protected delegate void MethodAnything(Symbol tag,AtomList lst);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodBang m);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodFloat m);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodSymbol m);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodPointer m);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodList m);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Add(MethodAnything m);
}
}
--- NEW FILE: Atom.cs ---
using System;
using System.Runtime.InteropServices; // for structures
using System.Collections;
#if NET_2_0
using System.Collections.Generic;
#endif
namespace PureData
{
[StructLayout (LayoutKind.Sequential)]
public unsafe struct Symbol
{
// this should NOT be public (or at least read only)
private readonly void *sym;
public Symbol(string s)
{
sym = Internal.SymGen(s);
}
public override string ToString()
{
return Internal.SymEval(sym);
}
}
[StructLayout (LayoutKind.Sequential)]
public unsafe struct Pointer
{
private readonly void *ptr;
public override string ToString()
{
if(sizeof(void *) == 4)
return ((int)ptr).ToString();
else
return ((long)ptr).ToString();
}
}
[StructLayout (LayoutKind.Sequential)]
public unsafe struct Atom
{
private enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3};
[StructLayout (LayoutKind.Explicit)]
private struct Word
{
[FieldOffset(0)] public float w_float;
[FieldOffset(0)] public Symbol w_sym;
[FieldOffset(0)] public Pointer w_ptr;
}
private AtomType type;
private Word word;
public Atom(float f)
{
type = AtomType.Float;
word = new Word();
word.w_float = f;
}
public Atom(int i)
{
type = AtomType.Float;
word = new Word();
word.w_float = (float)i;
}
public Atom(Symbol s)
{
type = AtomType.Symbol;
word = new Word();
word.w_sym = s;
}
public Atom(string s)
{
type = AtomType.Symbol;
word = new Word();
word.w_sym = new Symbol(s);
}
public Atom(Pointer p)
{
type = AtomType.Pointer;
word = new Word();
word.w_ptr = p;
}
public bool IsFloat { get { return type == AtomType.Float; } }
public bool IsSymbol { get { return type == AtomType.Symbol; } }
public bool IsPointer { get { return type == AtomType.Pointer; } }
public float ToFloat()
{
if(IsFloat)
return word.w_float;
else
throw new System.InvalidCastException("Can't be cast to float.");
}
public Symbol ToSymbol()
{
if(IsSymbol)
return word.w_sym;
else
throw new System.InvalidCastException("Can't be cast to Symbol.");
}
public Pointer ToPointer()
{
if(IsPointer)
return word.w_ptr;
else
throw new System.InvalidCastException("Can't be cast to Pointer.");
}
override public string ToString()
{
if(IsFloat)
return word.w_float.ToString();
else if(IsSymbol)
return word.w_sym.ToString();
else if(IsPointer)
return word.w_ptr.ToString();
else
// should never happen
throw new System.InvalidProgramException("Internal error.");
}
public static explicit operator float(Atom a)
{
return a.ToFloat();
}
public static explicit operator Symbol(Atom a)
{
return a.ToSymbol();
}
public static explicit operator Pointer(Atom a)
{
return a.ToPointer();
}
}
public class AtomListEnum
: IEnumerator
{
public AtomList list;
// Enumerators are positioned before the first element
// until the first MoveNext() call.
int position = -1;
public AtomListEnum(AtomList l)
{
list = l;
}
public bool MoveNext()
{
return ++position < list.Count;
}
public void Reset()
{
position = -1;
}
public object Current
{
get
{
try
{
return list[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}
// attention: this is dangerous, because we could do the following
// AtomList l2 = l;
// with l also being an AtomList... the two private memebers will get copied, although atoms is only a temporary reference
[StructLayout (LayoutKind.Sequential)]
unsafe public struct AtomList
#if NET_2_0
: ICollection<Atom>
#else
: ICollection
#endif
{
private readonly int len;
private readonly Atom *atoms;
public int Count { get { return len; } }
#if NET_2_0
public bool IsReadOnly { get { return false; } } // member of generic.ICollection<Atom> (C# 2.0)
#endif
public bool IsSynchronized { get { return false; } }
public Object SyncRoot { get { return null; } }
// protect this from being used
private AtomList(AtomList a) { len = 0; atoms = null; }
#if NET_2_0
public void CopyTo(Atom[] array,int start)
#else
public void CopyTo(Array array,int start)
#endif
{
if(len > array.GetUpperBound(0)+1-start)
throw new System.ArgumentException("Destination array is not long enough.");
int i;
for(i = 0; i < len-start; ++i)
array.SetValue(atoms[start+i],i);
}
public IEnumerator GetEnumerator()
{
return new AtomListEnum(this);
}
public Atom this[int i]
{
get
{
if(i < 0 || i >= len)
throw new System.IndexOutOfRangeException("Index outside array bounds.");
return atoms[i];
}
set
{
if(i < 0 || i >= len)
throw new System.IndexOutOfRangeException("Index outside array bounds.");
atoms[i] = value;
}
}
#if !NET_2_0
public static explicit operator Atom[](AtomList l)
{
Atom[] ret = new Atom[l.Count];
int i;
for(i = 0; i < l.Count; ++i) ret[i] = l.atoms[i];
return ret;
}
#endif
override public string ToString()
{
string n = "{";
if(len > 0) {
int i;
for(i = 0; i < len-1; ++i) n += atoms[i].ToString()+",";
n += atoms[i].ToString();
}
return n+"}";
}
}
}
--- NEW FILE: README.txt ---
to compile PureData.dll execute this command:
mcs Atom.cs pd.cs -out:PureData.dll -target:library
--- NEW FILE: AssemblyInfo.cs ---
using System.Reflection;
using System.Runtime.CompilerServices;
//
// Le informazioni generali relative a un assembly sono controllate dal seguente
// insieme di attributi. Per modificare le informazioni associate a un assembly
// occorre quindi modificare i valori di questi attributi.
//
[assembly: AssemblyTitle("PureData")]
[assembly: AssemblyDescription("bridge between C sharp externals and pd")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("Davide Morelli, Thomas Grill")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//
// Le informazioni sulla versione di un assembly sono costituite dai seguenti quattro valori:
//
// Numero di versione principale
// Numero di versione secondario
// Numero revisione
// Numero build
//
// È possibile specificare tutti i valori o impostare come predefiniti i valori Numero revisione e Numero build
// utilizzando l'asterisco (*) come illustrato di seguito:
[assembly: AssemblyVersion("1.0.*")]
//
// Per firmare l'assembly è necessario specificare una chiave da utilizzare.
// Fare riferimento alla documentazione di Microsoft .NET Framework per ulteriori informazioni sulla firma degli assembly.
//
// Utilizzare gli attributi elencati di seguito per verificare la chiave utilizzata per la firma.
//
// Note:
// (*) Se non è specificata alcuna chiave, non sarà possibile firmare l'assembly.
// (*) KeyName fa riferimento a una chiave installata nel provider di servizi di
// crittografia (CSP) sul computer in uso. KeyFile fa riferimento a un file che contiene
// una chiave.
// (*) Se entrambi i valori KeyFile e KeyName sono specificati, si
// verificherà il seguente processo:
// (1) Se KeyName è presente in CSP, verrà utilizzata tale chiave.
// (2) Se KeyName non esiste e KeyFile esiste, la chiave
// di KeyFile verrà installata nel CSP e utilizzata.
// (*) Per creare un KeyFile, è possibile utilizzare l'utilità sn.exe (Strong Name).
// Quando si specifica il KeyFile, il percorso dovrà essere
// relativo alla directory di output del progetto, ovvero
// %Project Directory%\obj\<configuration>. Se ad esempio il KeyFile si
// trova nella directory del progetto, occorre specificare l'attributo AssemblyKeyFile
// come [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// (*) La firma ritardata è un'opzione avanzata. Vedere la documentazione di Microsoft
// .NET Framework per ulteriori informazioni.
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]
- Previous message: [PD-cvs] externals/clr/pd AssemblyInfo.cs, 1.3, NONE Atom.cs, 1.6, NONE PureData.cs, 1.4, NONE README.txt, 1.1, NONE pd.csproj, 1.3, NONE pd.sln, 1.1, NONE
- Next message: [PD-cvs] externals/clr/PureData PureData.cs,1.1,1.2
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Pd-cvs
mailing list