Merge branch 'master' into m_test
commit
a15282f023
|
@ -119,6 +119,7 @@ what it is today.
|
||||||
* Kurt Taylor (IBM)
|
* Kurt Taylor (IBM)
|
||||||
* Lani Global
|
* Lani Global
|
||||||
* lkalif
|
* lkalif
|
||||||
|
* LuciusSirnah
|
||||||
* lulurun
|
* lulurun
|
||||||
* M.Igarashi
|
* M.Igarashi
|
||||||
* maimedleech
|
* maimedleech
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) Contributors, http://opensimulator.org/
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
*
|
*
|
||||||
|
@ -560,7 +560,7 @@ namespace OpenSim.Groups
|
||||||
|
|
||||||
// so we have the list of urls to send the notice to
|
// so we have the list of urls to send the notice to
|
||||||
// this may take a long time...
|
// this may take a long time...
|
||||||
Util.FireAndForget(delegate
|
Util.RunThreadNoTimeout(delegate
|
||||||
{
|
{
|
||||||
foreach (string u in urls)
|
foreach (string u in urls)
|
||||||
{
|
{
|
||||||
|
@ -571,7 +571,7 @@ namespace OpenSim.Groups
|
||||||
hasAttachment, attType, attName, attItemID, AgentUUIForOutside(attOwnerID));
|
hasAttachment, attType, attName, attItemID, AgentUUIForOutside(attOwnerID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}, "AddGroupNotice", null);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -278,7 +278,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
|
// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
|
||||||
// Util.PrintCallStack();
|
// Util.PrintCallStack();
|
||||||
|
|
||||||
string sql = "update inventoryfolders set version=version+1 where folderID = ?folderID";
|
string sql = "update inventoryfolders set version=version+1 where folderID = @folderID";
|
||||||
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||||
{
|
{
|
||||||
|
|
|
@ -331,4 +331,12 @@ ALTER TABLE dbo.estate_map ADD CONSTRAINT
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 10
|
||||||
|
|
||||||
|
BEGIN transaction
|
||||||
|
|
||||||
|
ALTER TABLE estate_settings ADD AllowLandmark tinyint NOT NULL default 1;
|
||||||
|
ALTER TABLE estate_settings ADD AllowParcelChanges tinyint NOT NULL default 1;
|
||||||
|
ALTER TABLE estate_settings ADD AllowSetHome tinyint NOT NULL default 1;
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -1161,11 +1161,11 @@ COMMIT
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
ALTER TABLE prims ADD `PhysicsShapeType` tinyint(4) NOT NULL default '0';
|
ALTER TABLE prims ADD PhysicsShapeType tinyint NOT NULL default 0;
|
||||||
ALTER TABLE prims ADD `Density` double NOT NULL default '1000';
|
ALTER TABLE prims ADD Density float NOT NULL default 1000;
|
||||||
ALTER TABLE prims ADD `GravityModifier` double NOT NULL default '1';
|
ALTER TABLE prims ADD GravityModifier float NOT NULL default 1;
|
||||||
ALTER TABLE prims ADD `Friction` double NOT NULL default '0.6';
|
ALTER TABLE prims ADD Friction float NOT NULL default 0.6;
|
||||||
ALTER TABLE prims ADD `Restitution` double NOT NULL default '0.5';
|
ALTER TABLE prims ADD Restitution float NOT NULL default 0.5;
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace OpenSim.Data.Null
|
||||||
|
|
||||||
// private string m_connectionString;
|
// private string m_connectionString;
|
||||||
|
|
||||||
private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
|
// private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
|
||||||
private EstateSettings m_estate = null;
|
private EstateSettings m_estate = null;
|
||||||
|
|
||||||
private EstateSettings GetEstate()
|
private EstateSettings GetEstate()
|
||||||
|
|
|
@ -143,7 +143,6 @@ namespace OpenSim.Framework
|
||||||
public string RemotingAddress;
|
public string RemotingAddress;
|
||||||
public UUID ScopeID = UUID.Zero;
|
public UUID ScopeID = UUID.Zero;
|
||||||
private UUID m_maptileStaticUUID = UUID.Zero;
|
private UUID m_maptileStaticUUID = UUID.Zero;
|
||||||
public string m_maptileStaticFile;
|
|
||||||
|
|
||||||
public uint WorldLocX = 0;
|
public uint WorldLocX = 0;
|
||||||
public uint WorldLocY = 0;
|
public uint WorldLocY = 0;
|
||||||
|
@ -351,10 +350,7 @@ namespace OpenSim.Framework
|
||||||
get { return m_maptileStaticUUID; }
|
get { return m_maptileStaticUUID; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string MaptileStaticFile
|
public string MaptileStaticFile { get; private set; }
|
||||||
{
|
|
||||||
get { return m_maptileStaticFile; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The port by which http communication occurs with the region (most noticeably, CAPS communication)
|
/// The port by which http communication occurs with the region (most noticeably, CAPS communication)
|
||||||
|
@ -723,7 +719,7 @@ namespace OpenSim.Framework
|
||||||
config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString());
|
config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_maptileStaticFile = config.GetString("MaptileStaticFile", String.Empty);
|
MaptileStaticFile = config.GetString("MaptileStaticFile", String.Empty);
|
||||||
allKeys.Remove("MaptileStaticFile");
|
allKeys.Remove("MaptileStaticFile");
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -853,8 +849,8 @@ namespace OpenSim.Framework
|
||||||
if (m_maptileStaticUUID != UUID.Zero)
|
if (m_maptileStaticUUID != UUID.Zero)
|
||||||
config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString());
|
config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString());
|
||||||
|
|
||||||
if (m_maptileStaticFile != String.Empty)
|
if (MaptileStaticFile != String.Empty)
|
||||||
config.Set("MaptileStaticFile", m_maptileStaticFile);
|
config.Set("MaptileStaticFile", MaptileStaticFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ignoreIncomingConfiguration(string configuration_key, object configuration_result)
|
public bool ignoreIncomingConfiguration(string configuration_key, object configuration_result)
|
||||||
|
@ -966,7 +962,7 @@ namespace OpenSim.Framework
|
||||||
"UUID of a texture to use as the map for this region", m_maptileStaticUUID.ToString(), true);
|
"UUID of a texture to use as the map for this region", m_maptileStaticUUID.ToString(), true);
|
||||||
|
|
||||||
configMember.addConfigurationOption("region_static_mapfile", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
|
configMember.addConfigurationOption("region_static_mapfile", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
|
||||||
"Filename of a texture to use as the map for this region", m_maptileStaticFile, true);
|
"Filename of a texture to use as the map for this region", MaptileStaticFile, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadConfigurationOptions()
|
public void loadConfigurationOptions()
|
||||||
|
@ -1116,7 +1112,7 @@ namespace OpenSim.Framework
|
||||||
m_maptileStaticUUID = (UUID)configuration_result;
|
m_maptileStaticUUID = (UUID)configuration_result;
|
||||||
break;
|
break;
|
||||||
case "region_static_mapfile":
|
case "region_static_mapfile":
|
||||||
m_maptileStaticFile = (string)configuration_result;
|
MaptileStaticFile = (string)configuration_result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -833,7 +833,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||||
|
|
||||||
Stream inputStream = Util.Copy(request.InputStream);
|
Stream inputStream = Util.Copy(request.InputStream);
|
||||||
|
|
||||||
if (request.ContentType == "application/x-gzip")
|
if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
|
||||||
inputStream = new GZipStream(inputStream, System.IO.Compression.CompressionMode.Decompress);
|
inputStream = new GZipStream(inputStream, System.IO.Compression.CompressionMode.Decompress);
|
||||||
|
|
||||||
using (StreamReader reader = new StreamReader(inputStream, Encoding.UTF8))
|
using (StreamReader reader = new StreamReader(inputStream, Encoding.UTF8))
|
||||||
|
@ -978,6 +978,9 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||||
{
|
{
|
||||||
Stream requestStream = request.InputStream;
|
Stream requestStream = request.InputStream;
|
||||||
|
|
||||||
|
if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
|
||||||
|
requestStream = new GZipStream(requestStream, System.IO.Compression.CompressionMode.Decompress);
|
||||||
|
|
||||||
Encoding encoding = Encoding.UTF8;
|
Encoding encoding = Encoding.UTF8;
|
||||||
StreamReader reader = new StreamReader(requestStream, encoding);
|
StreamReader reader = new StreamReader(requestStream, encoding);
|
||||||
|
|
||||||
|
|
|
@ -182,11 +182,22 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||||
_context = context;
|
_context = context;
|
||||||
|
|
||||||
if (null != req.Headers["content-encoding"])
|
if (null != req.Headers["content-encoding"])
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
_contentEncoding = Encoding.GetEncoding(_request.Headers["content-encoding"]);
|
_contentEncoding = Encoding.GetEncoding(_request.Headers["content-encoding"]);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (null != req.Headers["content-type"])
|
if (null != req.Headers["content-type"])
|
||||||
_contentType = _request.Headers["content-type"];
|
_contentType = _request.Headers["content-type"];
|
||||||
if (null != req.Headers["user-agent"])
|
if (null != req.Headers["user-agent"])
|
||||||
_userAgent = req.Headers["user-agent"];
|
_userAgent = req.Headers["user-agent"];
|
||||||
|
|
||||||
if (null != req.Headers["remote_addr"])
|
if (null != req.Headers["remote_addr"])
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -2031,7 +2031,7 @@ namespace OpenSim.Framework
|
||||||
// Maps (ThreadFunc number -> Thread)
|
// Maps (ThreadFunc number -> Thread)
|
||||||
private static ConcurrentDictionary<long, ThreadInfo> activeThreads = new ConcurrentDictionary<long, ThreadInfo>();
|
private static ConcurrentDictionary<long, ThreadInfo> activeThreads = new ConcurrentDictionary<long, ThreadInfo>();
|
||||||
|
|
||||||
private static readonly int THREAD_TIMEOUT = 60 * 1000;
|
private static readonly int THREAD_TIMEOUT = 10 * 60 * 1000; // 10 minutes
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds threads in the main thread pool that have timed-out, and aborts them.
|
/// Finds threads in the main thread pool that have timed-out, and aborts them.
|
||||||
|
|
|
@ -250,9 +250,12 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
|
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
|
||||||
|
|
||||||
|
request.ContentType = "application/json";
|
||||||
|
|
||||||
if (compressed)
|
if (compressed)
|
||||||
{
|
{
|
||||||
request.ContentType = "application/x-gzip";
|
request.Headers["X-Content-Encoding"] = "gzip"; // can't set "Content-Encoding" because old OpenSims fail if they get an unrecognized Content-Encoding
|
||||||
|
|
||||||
using (MemoryStream ms = new MemoryStream())
|
using (MemoryStream ms = new MemoryStream())
|
||||||
{
|
{
|
||||||
using (GZipStream comp = new GZipStream(ms, CompressionMode.Compress))
|
using (GZipStream comp = new GZipStream(ms, CompressionMode.Compress))
|
||||||
|
@ -270,7 +273,6 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
request.ContentType = "application/json";
|
|
||||||
request.ContentLength = buffer.Length; //Count bytes to send
|
request.ContentLength = buffer.Length; //Count bytes to send
|
||||||
using (Stream requestStream = request.GetRequestStream())
|
using (Stream requestStream = request.GetRequestStream())
|
||||||
requestStream.Write(buffer, 0, buffer.Length); //Send it
|
requestStream.Write(buffer, 0, buffer.Length); //Send it
|
||||||
|
@ -1024,7 +1026,7 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[FORMS]: Error sending request to {0}: {1}. Request: {2}", requestUrl, e.Message,
|
m_log.InfoFormat("[FORMS]: Error sending request to {0}: {1}. Request: {2}", requestUrl, e.Message,
|
||||||
obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
|
obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
@ -1052,7 +1054,7 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[FORMS]: Error receiving response from {0}: {1}. Request: {2}", requestUrl, e.Message,
|
m_log.InfoFormat("[FORMS]: Error receiving response from {0}: {1}. Request: {2}", requestUrl, e.Message,
|
||||||
obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
|
obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
|
@ -963,10 +963,10 @@ namespace OpenSim.Region.CoreModules.Asset
|
||||||
case "assets":
|
case "assets":
|
||||||
con.Output("Ensuring assets are cached for all scenes.");
|
con.Output("Ensuring assets are cached for all scenes.");
|
||||||
|
|
||||||
Util.FireAndForget(delegate {
|
Util.RunThreadNoTimeout(delegate {
|
||||||
int assetReferenceTotal = TouchAllSceneAssets(true);
|
int assetReferenceTotal = TouchAllSceneAssets(true);
|
||||||
con.OutputFormat("Completed check with {0} assets.", assetReferenceTotal);
|
con.OutputFormat("Completed check with {0} assets.", assetReferenceTotal);
|
||||||
});
|
}, "TouchAllSceneAssets", null);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
|
||||||
|
|
||||||
if (generateMaptiles)
|
if (generateMaptiles)
|
||||||
{
|
{
|
||||||
if (String.IsNullOrEmpty(m_scene.RegionInfo.m_maptileStaticFile))
|
if (String.IsNullOrEmpty(m_scene.RegionInfo.MaptileStaticFile))
|
||||||
{
|
{
|
||||||
if (textureTerrain)
|
if (textureTerrain)
|
||||||
{
|
{
|
||||||
|
@ -122,15 +122,21 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mapbmp = new Bitmap(m_scene.RegionInfo.m_maptileStaticFile);
|
mapbmp = new Bitmap(m_scene.RegionInfo.MaptileStaticFile);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[MAPTILE]: Failed to load Static map image texture file: {0} for {1}", m_scene.RegionInfo.m_maptileStaticFile, m_scene.Name);
|
m_log.ErrorFormat(
|
||||||
|
"[MAPTILE]: Failed to load Static map image texture file: {0} for {1}",
|
||||||
|
m_scene.RegionInfo.MaptileStaticFile, m_scene.Name);
|
||||||
//mapbmp = new Bitmap((int)m_scene.Heightmap.Width, (int)m_scene.Heightmap.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
//mapbmp = new Bitmap((int)m_scene.Heightmap.Width, (int)m_scene.Heightmap.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
||||||
mapbmp = null;
|
mapbmp = null;
|
||||||
}
|
}
|
||||||
if (mapbmp != null) m_log.DebugFormat("[MAPTILE]: Static map image texture file {0} found for {1}", m_scene.RegionInfo.m_maptileStaticFile, m_scene.Name);
|
|
||||||
|
if (mapbmp != null)
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[MAPTILE]: Static map image texture file {0} found for {1}",
|
||||||
|
m_scene.RegionInfo.MaptileStaticFile, m_scene.Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1703,8 +1703,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Backup the scene. This acts as the main method of the backup thread.
|
/// Backup the scene.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This acts as the main method of the backup thread. In a regression test whether the backup thread is not
|
||||||
|
/// running independently this can be invoked directly.
|
||||||
|
/// </remarks>
|
||||||
/// <param name="forced">
|
/// <param name="forced">
|
||||||
/// If true, then any changes that have not yet been persisted are persisted. If false,
|
/// If true, then any changes that have not yet been persisted are persisted. If false,
|
||||||
/// then the persistence decision is left to the backup code (in some situations, such as object persistence,
|
/// then the persistence decision is left to the backup code (in some situations, such as object persistence,
|
||||||
|
|
|
@ -1,218 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class Atom : IUnifiable
|
|
||||||
{
|
|
||||||
private static Dictionary<string, Atom> _atomStore = new Dictionary<string, Atom>();
|
|
||||||
public readonly string _name;
|
|
||||||
public readonly Atom _module;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// You should not call this constructor, but use Atom.a instead.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="module"></param>
|
|
||||||
private Atom(string name, Atom module)
|
|
||||||
{
|
|
||||||
_name = name;
|
|
||||||
_module = module;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return the unique Atom object for name where module is null. You should use this to create
|
|
||||||
/// an Atom instead of calling the Atom constructor.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static Atom a(string name)
|
|
||||||
{
|
|
||||||
Atom atom;
|
|
||||||
if (!_atomStore.TryGetValue(name, out atom))
|
|
||||||
{
|
|
||||||
atom = new Atom(name, null);
|
|
||||||
_atomStore[name] = atom;
|
|
||||||
}
|
|
||||||
return atom;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return an Atom object with the name and module. If module is null or Atom.NIL,
|
|
||||||
/// this behaves like Atom.a(name) and returns the unique object where the module is null.
|
|
||||||
/// If module is not null or Atom.NIL, this may or may not be the same object as another Atom
|
|
||||||
/// with the same name and module.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="module"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static Atom a(string name, Atom module)
|
|
||||||
{
|
|
||||||
if (module == null || module == Atom.NIL)
|
|
||||||
return a(name);
|
|
||||||
return new Atom(name, module);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If Obj is an Atom unify its _module with Module. If the Atom's _module is null, use Atom.NIL.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Atom"></param>
|
|
||||||
/// <param name="Module"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static IEnumerable<bool> module(object Obj, object Module)
|
|
||||||
{
|
|
||||||
Obj = YP.getValue(Obj);
|
|
||||||
if (Obj is Atom)
|
|
||||||
{
|
|
||||||
if (((Atom)Obj)._module == null)
|
|
||||||
return YP.unify(Module, Atom.NIL);
|
|
||||||
else
|
|
||||||
return YP.unify(Module, ((Atom)Obj)._module);
|
|
||||||
}
|
|
||||||
return YP.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static readonly Atom NIL = Atom.a("[]");
|
|
||||||
public static readonly Atom DOT = Atom.a(".");
|
|
||||||
public static readonly Atom F = Atom.a("f");
|
|
||||||
public static readonly Atom SLASH = Atom.a("/");
|
|
||||||
public static readonly Atom HAT = Atom.a("^");
|
|
||||||
public static readonly Atom RULE = Atom.a(":-");
|
|
||||||
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
arg = YP.getValue(arg);
|
|
||||||
if (arg is Atom)
|
|
||||||
return Equals(arg) ? YP.succeed() : YP.fail();
|
|
||||||
else if (arg is Variable)
|
|
||||||
return ((Variable)arg).unify(this);
|
|
||||||
else
|
|
||||||
return YP.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
// Atom does not contain variables.
|
|
||||||
}
|
|
||||||
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
// Atom does not contain variables that need to be copied.
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
return Equals(YP.getValue(term));
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
// Atom is always ground.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Equals(object obj)
|
|
||||||
{
|
|
||||||
if (obj is Atom)
|
|
||||||
{
|
|
||||||
if (_module == null && ((Atom)obj)._module == null)
|
|
||||||
// When _declaringClass is null, we always use an identical object from _atomStore.
|
|
||||||
return this == obj;
|
|
||||||
// Otherwise, ignore _declaringClass and do a normal string compare on the _name.
|
|
||||||
return _name == ((Atom)obj)._name;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return _name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int GetHashCode()
|
|
||||||
{
|
|
||||||
// Debug: need to check _declaringClass.
|
|
||||||
return _name.GetHashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string toQuotedString()
|
|
||||||
{
|
|
||||||
if (_name.Length == 0)
|
|
||||||
return "''";
|
|
||||||
else if (this == Atom.NIL)
|
|
||||||
return "[]";
|
|
||||||
|
|
||||||
StringBuilder result = new StringBuilder(_name.Length);
|
|
||||||
bool useQuotes = false;
|
|
||||||
foreach (char c in _name)
|
|
||||||
{
|
|
||||||
int cInt = (int)c;
|
|
||||||
if (c == '\'')
|
|
||||||
{
|
|
||||||
result.Append("''");
|
|
||||||
useQuotes = true;
|
|
||||||
}
|
|
||||||
else if (c == '_' || cInt >= (int)'a' && cInt <= (int)'z' ||
|
|
||||||
cInt >= (int)'A' && cInt <= (int)'Z' || cInt >= (int)'0' && cInt <= (int)'9')
|
|
||||||
result.Append(c);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Debug: Need to handle non-printable chars.
|
|
||||||
result.Append(c);
|
|
||||||
useQuotes = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!useQuotes && (int)_name[0] >= (int)'a' && (int)_name[0] <= (int)'z')
|
|
||||||
return result.ToString();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Surround in single quotes.
|
|
||||||
result.Append('\'');
|
|
||||||
return "'" + result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return true if _name is lexicographically less than atom._name.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="atom"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public bool lessThan(Atom atom)
|
|
||||||
{
|
|
||||||
return _name.CompareTo(atom._name) < 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,239 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A BagofAnswers holds answers for bagof and setof.
|
|
||||||
/// </summary>
|
|
||||||
public class BagofAnswers
|
|
||||||
{
|
|
||||||
private object _template;
|
|
||||||
private Variable[] _freeVariables;
|
|
||||||
private Dictionary<object[], List<object>> _bagForFreeVariables;
|
|
||||||
private List<object> _findallBagArray;
|
|
||||||
private static TermArrayEqualityComparer _termArrayEqualityComparer =
|
|
||||||
new TermArrayEqualityComparer();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// To get the free variables, split off any existential qualifiers from Goal such as the X in
|
|
||||||
/// "X ^ f(Y)", get the set of unbound variables in Goal that are not qualifiers, then remove
|
|
||||||
/// the unbound variables that are qualifiers as well as the unbound variables in Template.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Template"></param>
|
|
||||||
/// <param name="Goal"></param>
|
|
||||||
public BagofAnswers(object Template, object Goal)
|
|
||||||
{
|
|
||||||
_template = Template;
|
|
||||||
|
|
||||||
// First get the set of variables that are not free variables.
|
|
||||||
List<Variable> variableSet = new List<Variable>();
|
|
||||||
YP.addUniqueVariables(Template, variableSet);
|
|
||||||
object UnqualifiedGoal = YP.getValue(Goal);
|
|
||||||
while (UnqualifiedGoal is Functor2 && ((Functor2)UnqualifiedGoal)._name == Atom.HAT)
|
|
||||||
{
|
|
||||||
YP.addUniqueVariables(((Functor2)UnqualifiedGoal)._arg1, variableSet);
|
|
||||||
UnqualifiedGoal = YP.getValue(((Functor2)UnqualifiedGoal)._arg2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remember how many non-free variables there are so we can find the unique free variables
|
|
||||||
// that are added.
|
|
||||||
int nNonFreeVariables = variableSet.Count;
|
|
||||||
YP.addUniqueVariables(UnqualifiedGoal, variableSet);
|
|
||||||
int nFreeVariables = variableSet.Count - nNonFreeVariables;
|
|
||||||
if (nFreeVariables == 0)
|
|
||||||
{
|
|
||||||
// There were no free variables added, so we won't waste time with _bagForFreeVariables.
|
|
||||||
_freeVariables = null;
|
|
||||||
_findallBagArray = new List<object>();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Copy the free variables.
|
|
||||||
_freeVariables = new Variable[nFreeVariables];
|
|
||||||
for (int i = 0; i < nFreeVariables; ++i)
|
|
||||||
_freeVariables[i] = variableSet[i + nNonFreeVariables];
|
|
||||||
|
|
||||||
_bagForFreeVariables = new Dictionary<object[], List<object>>(_termArrayEqualityComparer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add()
|
|
||||||
{
|
|
||||||
if (_freeVariables == null)
|
|
||||||
// The goal has bound the values in _template but we don't bother with _freeVariables.
|
|
||||||
_findallBagArray.Add(YP.makeCopy(_template, new Variable.CopyStore()));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The goal has bound the values in _template and _freeVariables.
|
|
||||||
// Find the entry for this set of _freeVariables values.
|
|
||||||
object[] freeVariableValues = new object[_freeVariables.Length];
|
|
||||||
for (int i = 0; i < _freeVariables.Length; ++i)
|
|
||||||
freeVariableValues[i] = YP.getValue(_freeVariables[i]);
|
|
||||||
List<object> bagArray;
|
|
||||||
if (!_bagForFreeVariables.TryGetValue(freeVariableValues, out bagArray))
|
|
||||||
{
|
|
||||||
bagArray = new List<object>();
|
|
||||||
_bagForFreeVariables[freeVariableValues] = bagArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now copy the template and add to the bag for the freeVariables values.
|
|
||||||
bagArray.Add(YP.makeCopy(_template, new Variable.CopyStore()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// For each result, unify the _freeVariables and unify bagArrayVariable with the associated bag.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="bagArrayVariable">this is unified with the List<object> of matches for template that
|
|
||||||
/// corresponds to the bindings for freeVariables. Be very careful: this does not unify with a Prolog
|
|
||||||
/// list.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> resultArray(Variable bagArrayVariable)
|
|
||||||
{
|
|
||||||
if (_freeVariables == null)
|
|
||||||
{
|
|
||||||
// No unbound free variables, so we only filled one bag. If empty, bagof fails.
|
|
||||||
if (_findallBagArray.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (bool l1 in bagArrayVariable.unify(_findallBagArray))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (KeyValuePair<object[], List<object>> valuesAndBag in _bagForFreeVariables)
|
|
||||||
{
|
|
||||||
foreach (bool l1 in YP.unifyArrays(_freeVariables, valuesAndBag.Key))
|
|
||||||
{
|
|
||||||
foreach (bool l2 in bagArrayVariable.unify(valuesAndBag.Value))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
// Debug: Should we free memory of the answers already returned?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// For each result, unify the _freeVariables and unify Bag with the associated bag.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Bag"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> result(object Bag)
|
|
||||||
{
|
|
||||||
Variable bagArrayVariable = new Variable();
|
|
||||||
foreach (bool l1 in resultArray(bagArrayVariable))
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YP.unify(Bag, ListPair.make((List<object>)bagArrayVariable.getValue())))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// For each result, unify the _freeVariables and unify Bag with the associated bag which is sorted
|
|
||||||
/// with duplicates removed, as in setof.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Bag"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> resultSet(object Bag)
|
|
||||||
{
|
|
||||||
Variable bagArrayVariable = new Variable();
|
|
||||||
foreach (bool l1 in resultArray(bagArrayVariable))
|
|
||||||
{
|
|
||||||
List<object> bagArray = (List<object>)bagArrayVariable.getValue();
|
|
||||||
YP.sortArray(bagArray);
|
|
||||||
foreach (bool l2 in YP.unify(Bag, ListPair.makeWithoutRepeatedTerms(bagArray)))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<bool> bagofArray
|
|
||||||
(object Template, object Goal, IEnumerable<bool> goalIterator, Variable bagArrayVariable)
|
|
||||||
{
|
|
||||||
BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal);
|
|
||||||
foreach (bool l1 in goalIterator)
|
|
||||||
bagOfAnswers.add();
|
|
||||||
return bagOfAnswers.resultArray(bagArrayVariable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<bool> bagof
|
|
||||||
(object Template, object Goal, IEnumerable<bool> goalIterator, object Bag)
|
|
||||||
{
|
|
||||||
BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal);
|
|
||||||
foreach (bool l1 in goalIterator)
|
|
||||||
bagOfAnswers.add();
|
|
||||||
return bagOfAnswers.result(Bag);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<bool> setof
|
|
||||||
(object Template, object Goal, IEnumerable<bool> goalIterator, object Bag)
|
|
||||||
{
|
|
||||||
BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal);
|
|
||||||
foreach (bool l1 in goalIterator)
|
|
||||||
bagOfAnswers.add();
|
|
||||||
return bagOfAnswers.resultSet(Bag);
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A TermArrayEqualityComparer implements IEqualityComparer to compare two object arrays using YP.termEqual.
|
|
||||||
/// </summary>
|
|
||||||
private class TermArrayEqualityComparer : IEqualityComparer<object[]>
|
|
||||||
{
|
|
||||||
public bool Equals(object[] array1, object[] array2)
|
|
||||||
{
|
|
||||||
if (array1.Length != array2.Length)
|
|
||||||
return false;
|
|
||||||
for (int i = 0; i < array1.Length; ++i)
|
|
||||||
{
|
|
||||||
if (!YP.termEqual(array1[i], array2[i]))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetHashCode(object[] array)
|
|
||||||
{
|
|
||||||
int hashCode = 0;
|
|
||||||
for (int i = 0; i < array.Length; ++i)
|
|
||||||
hashCode ^= array[i].GetHashCode();
|
|
||||||
return hashCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A FindallAnswers holds answers for findall.
|
|
||||||
/// </summary>
|
|
||||||
public class FindallAnswers
|
|
||||||
{
|
|
||||||
private object _template;
|
|
||||||
private List<object> _bagArray;
|
|
||||||
|
|
||||||
public FindallAnswers(object Template)
|
|
||||||
{
|
|
||||||
_template = Template;
|
|
||||||
_bagArray = new List<object>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add()
|
|
||||||
{
|
|
||||||
_bagArray.Add(YP.makeCopy(_template, new Variable.CopyStore()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<object> resultArray()
|
|
||||||
{
|
|
||||||
return _bagArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Unify Bag with the result. This frees the internal answers, so you can only call this once.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Bag"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> result(object Bag)
|
|
||||||
{
|
|
||||||
object result = ListPair.make(_bagArray);
|
|
||||||
// Try to free the memory.
|
|
||||||
_bagArray = null;
|
|
||||||
return YP.unify(Bag, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This is a simplified findall when the goal is a single call.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Template"></param>
|
|
||||||
/// <param name="goal"></param>
|
|
||||||
/// <param name="Bag"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static IEnumerable<bool> findall(object Template, IEnumerable<bool> goal, object Bag)
|
|
||||||
{
|
|
||||||
FindallAnswers findallAnswers = new FindallAnswers(Template);
|
|
||||||
foreach (bool l1 in goal)
|
|
||||||
findallAnswers.add();
|
|
||||||
return findallAnswers.result(Bag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Like findall, except return an array of the results.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="template"></param>
|
|
||||||
/// <param name="goal"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static List<object> findallArray(object Template, IEnumerable<bool> goal)
|
|
||||||
{
|
|
||||||
FindallAnswers findallAnswers = new FindallAnswers(Template);
|
|
||||||
foreach (bool l1 in goal)
|
|
||||||
findallAnswers.add();
|
|
||||||
return findallAnswers.resultArray();
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,196 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class Functor : IUnifiable
|
|
||||||
{
|
|
||||||
public readonly Atom _name;
|
|
||||||
public readonly object[] _args;
|
|
||||||
|
|
||||||
public Functor(Atom name, object[] args)
|
|
||||||
{
|
|
||||||
if (args.Length <= 3)
|
|
||||||
{
|
|
||||||
if (args.Length == 0)
|
|
||||||
throw new Exception("For arity 0 functor, just use name as an Atom");
|
|
||||||
else if (args.Length == 1)
|
|
||||||
throw new Exception("For arity 1 functor, use Functor1");
|
|
||||||
else if (args.Length == 2)
|
|
||||||
throw new Exception("For arity 2 functor, use Functor2");
|
|
||||||
else if (args.Length == 3)
|
|
||||||
throw new Exception("For arity 3 functor, use Functor3");
|
|
||||||
else
|
|
||||||
// (This shouldn't happen, but include it for completeness.
|
|
||||||
throw new Exception("Cannot create a Functor of arity " + args.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
_name = name;
|
|
||||||
_args = args;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Functor(string name, object[] args)
|
|
||||||
: this(Atom.a(name), args)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return an Atom, Functor1, Functor2, Functor3 or Functor depending on the
|
|
||||||
/// length of args.
|
|
||||||
/// Note that this is different than the Functor constructor which requires
|
|
||||||
/// the length of args to be greater than 3.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object make(Atom name, object[] args)
|
|
||||||
{
|
|
||||||
if (args.Length <= 0)
|
|
||||||
return name;
|
|
||||||
else if (args.Length == 1)
|
|
||||||
return new Functor1(name, args[0]);
|
|
||||||
else if (args.Length == 2)
|
|
||||||
return new Functor2(name, args[0], args[1]);
|
|
||||||
else if (args.Length == 3)
|
|
||||||
return new Functor3(name, args[0], args[1], args[2]);
|
|
||||||
else
|
|
||||||
return new Functor(name, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Call the main make, first converting name to an Atom.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object make(string name, object[] args)
|
|
||||||
{
|
|
||||||
return make(Atom.a(name), args);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If arg is another Functor, then succeed (yield once) if this and arg have the
|
|
||||||
/// same name and all functor args unify, otherwise fail (don't yield).
|
|
||||||
/// If arg is a Variable, then call its unify to unify with this.
|
|
||||||
/// Otherwise fail (don't yield).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="arg"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
arg = YP.getValue(arg);
|
|
||||||
if (arg is Functor)
|
|
||||||
{
|
|
||||||
Functor argFunctor = (Functor)arg;
|
|
||||||
if (_name.Equals(argFunctor._name))
|
|
||||||
return YP.unifyArrays(_args, argFunctor._args);
|
|
||||||
else
|
|
||||||
return YP.fail();
|
|
||||||
}
|
|
||||||
else if (arg is Variable)
|
|
||||||
return ((Variable)arg).unify(this);
|
|
||||||
else
|
|
||||||
return YP.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
string result = _name + "(" + YP.getValue(_args[0]);
|
|
||||||
for (int i = 1; i < _args.Length; ++i)
|
|
||||||
result += ", " + YP.getValue(_args[i]);
|
|
||||||
result += ")";
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
term = YP.getValue(term);
|
|
||||||
if (term is Functor)
|
|
||||||
{
|
|
||||||
Functor termFunctor = (Functor)term;
|
|
||||||
if (_name.Equals(termFunctor._name) && _args.Length == termFunctor._args.Length)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < _args.Length; ++i)
|
|
||||||
{
|
|
||||||
if (!YP.termEqual(_args[i], termFunctor._args[i]))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool lessThan(Functor functor)
|
|
||||||
{
|
|
||||||
// Do the equal check first since it is faster.
|
|
||||||
if (!_name.Equals(functor._name))
|
|
||||||
return _name.lessThan(functor._name);
|
|
||||||
|
|
||||||
if (_args.Length != functor._args.Length)
|
|
||||||
return _args.Length < functor._args.Length;
|
|
||||||
|
|
||||||
for (int i = 0; i < _args.Length; ++i)
|
|
||||||
{
|
|
||||||
if (!YP.termEqual(_args[i], functor._args[i]))
|
|
||||||
return YP.termLessThan(_args[i], functor._args[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < _args.Length; ++i)
|
|
||||||
{
|
|
||||||
if (!YP.ground(_args[i]))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < _args.Length; ++i)
|
|
||||||
YP.addUniqueVariables(_args[i], variableSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
object[] argsCopy = new object[_args.Length];
|
|
||||||
for (int i = 0; i < _args.Length; ++i)
|
|
||||||
argsCopy[i] = YP.makeCopy(_args[i], copyStore);
|
|
||||||
return new Functor(_name, argsCopy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class Functor1 : IUnifiable
|
|
||||||
{
|
|
||||||
public readonly Atom _name;
|
|
||||||
public readonly object _arg1;
|
|
||||||
|
|
||||||
public Functor1(Atom name, object arg1)
|
|
||||||
{
|
|
||||||
_name = name;
|
|
||||||
_arg1 = arg1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Functor1(string name, object arg1)
|
|
||||||
: this(Atom.a(name), arg1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
/// <summary>
|
|
||||||
/// If arg is another Functor1, then succeed (yield once) if this and arg have the
|
|
||||||
/// same name and the functor args unify, otherwise fail (don't yield).
|
|
||||||
/// If arg is a Variable, then call its unify to unify with this.
|
|
||||||
/// Otherwise fail (don't yield).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="arg"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
arg = YP.getValue(arg);
|
|
||||||
if (arg is Functor1)
|
|
||||||
{
|
|
||||||
Functor1 argFunctor = (Functor1)arg;
|
|
||||||
if (_name.Equals(argFunctor._name))
|
|
||||||
{
|
|
||||||
foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (arg is Variable)
|
|
||||||
{
|
|
||||||
foreach (bool l1 in ((Variable)arg).unify(this))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return _name + "(" + YP.getValue(_arg1) + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
term = YP.getValue(term);
|
|
||||||
if (term is Functor1)
|
|
||||||
{
|
|
||||||
Functor1 termFunctor = (Functor1)term;
|
|
||||||
return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool lessThan(Functor1 functor)
|
|
||||||
{
|
|
||||||
// Do the equal check first since it is faster.
|
|
||||||
if (!_name.Equals(functor._name))
|
|
||||||
return _name.lessThan(functor._name);
|
|
||||||
|
|
||||||
return YP.termLessThan(_arg1, functor._arg1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
return YP.ground(_arg1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
YP.addUniqueVariables(_arg1, variableSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
return new Functor1(_name, YP.makeCopy(_arg1, copyStore));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,163 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class Functor2 : IUnifiable
|
|
||||||
{
|
|
||||||
public readonly Atom _name;
|
|
||||||
public readonly object _arg1;
|
|
||||||
public readonly object _arg2;
|
|
||||||
|
|
||||||
public Functor2(Atom name, object arg1, object arg2)
|
|
||||||
{
|
|
||||||
_name = name;
|
|
||||||
_arg1 = arg1;
|
|
||||||
_arg2 = arg2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Functor2(string name, object arg1, object arg2)
|
|
||||||
: this(Atom.a(name), arg1, arg2)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
/// If arg is another Functor2, then succeed (yield once) if this and arg have the
|
|
||||||
/// same name and all functor args unify, otherwise fail (don't yield).
|
|
||||||
/// If arg is a Variable, then call its unify to unify with this.
|
|
||||||
/// Otherwise fail (don't yield).
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
arg = YP.getValue(arg);
|
|
||||||
if (arg is Functor2)
|
|
||||||
{
|
|
||||||
Functor2 argFunctor = (Functor2)arg;
|
|
||||||
if (_name.Equals(argFunctor._name))
|
|
||||||
{
|
|
||||||
foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1))
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YP.unify(_arg2, argFunctor._arg2))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (arg is Variable)
|
|
||||||
{
|
|
||||||
foreach (bool l1 in ((Variable)arg).unify(this))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
if (_name == Atom.DOT)
|
|
||||||
return listPairToString(this);
|
|
||||||
else
|
|
||||||
return _name + "(" + YP.getValue(_arg1) + ", " + YP.getValue(_arg2) + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
term = YP.getValue(term);
|
|
||||||
if (term is Functor2)
|
|
||||||
{
|
|
||||||
Functor2 termFunctor = (Functor2)term;
|
|
||||||
return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1)
|
|
||||||
&& YP.termEqual(_arg2, termFunctor._arg2);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool lessThan(Functor2 functor)
|
|
||||||
{
|
|
||||||
// Do the equal check first since it is faster.
|
|
||||||
if (!_name.Equals(functor._name))
|
|
||||||
return _name.lessThan(functor._name);
|
|
||||||
|
|
||||||
if (!YP.termEqual(_arg1, functor._arg1))
|
|
||||||
return YP.termLessThan(_arg1, functor._arg1);
|
|
||||||
|
|
||||||
return YP.termLessThan(_arg2, functor._arg2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
return YP.ground(_arg1) && YP.ground(_arg2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
YP.addUniqueVariables(_arg1, variableSet);
|
|
||||||
YP.addUniqueVariables(_arg2, variableSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
return new Functor2(_name, YP.makeCopy(_arg1, copyStore),
|
|
||||||
YP.makeCopy(_arg2, copyStore));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string listPairToString(Functor2 listPair)
|
|
||||||
{
|
|
||||||
string result = "[";
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
object head = YP.getValue(listPair._arg1);
|
|
||||||
object tail = YP.getValue(listPair._arg2);
|
|
||||||
if (tail == (object)Atom.NIL)
|
|
||||||
{
|
|
||||||
result += head;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (tail is Functor2 && ((Functor2)tail)._name == Atom.DOT)
|
|
||||||
{
|
|
||||||
result += head + ", ";
|
|
||||||
listPair = (Functor2)tail;
|
|
||||||
// Loop again.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The list is not terminated with NIL.
|
|
||||||
result += head + "|" + tail;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result += "]";
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,141 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class Functor3 : IUnifiable
|
|
||||||
{
|
|
||||||
public readonly Atom _name;
|
|
||||||
public readonly object _arg1;
|
|
||||||
public readonly object _arg2;
|
|
||||||
public readonly object _arg3;
|
|
||||||
|
|
||||||
public Functor3(Atom name, object arg1, object arg2, object arg3)
|
|
||||||
{
|
|
||||||
_name = name;
|
|
||||||
_arg1 = arg1;
|
|
||||||
_arg2 = arg2;
|
|
||||||
_arg3 = arg3;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Functor3(string name, object arg1, object arg2, object arg3)
|
|
||||||
: this(Atom.a(name), arg1, arg2, arg3)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
/// If arg is another Functor3, then succeed (yield once) if this and arg have the
|
|
||||||
/// same name and all functor args unify, otherwise fail (don't yield).
|
|
||||||
/// If arg is a Variable, then call its unify to unify with this.
|
|
||||||
/// Otherwise fail (don't yield).
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
arg = YP.getValue(arg);
|
|
||||||
if (arg is Functor3)
|
|
||||||
{
|
|
||||||
Functor3 argFunctor = (Functor3)arg;
|
|
||||||
if (_name.Equals(argFunctor._name))
|
|
||||||
{
|
|
||||||
foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1))
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YP.unify(_arg2, argFunctor._arg2))
|
|
||||||
{
|
|
||||||
foreach (bool l3 in YP.unify(_arg3, argFunctor._arg3))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (arg is Variable)
|
|
||||||
{
|
|
||||||
foreach (bool l1 in ((Variable)arg).unify(this))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return _name + "(" + YP.getValue(_arg1) + ", " + YP.getValue(_arg2) + ", " +
|
|
||||||
YP.getValue(_arg3) + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
term = YP.getValue(term);
|
|
||||||
if (term is Functor3)
|
|
||||||
{
|
|
||||||
Functor3 termFunctor = (Functor3)term;
|
|
||||||
return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1)
|
|
||||||
&& YP.termEqual(_arg2, termFunctor._arg2)
|
|
||||||
&& YP.termEqual(_arg3, termFunctor._arg3);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool lessThan(Functor3 functor)
|
|
||||||
{
|
|
||||||
// Do the equal check first since it is faster.
|
|
||||||
if (!_name.Equals(functor._name))
|
|
||||||
return _name.lessThan(functor._name);
|
|
||||||
|
|
||||||
if (!YP.termEqual(_arg1, functor._arg1))
|
|
||||||
return YP.termLessThan(_arg1, functor._arg1);
|
|
||||||
|
|
||||||
if (!YP.termEqual(_arg2, functor._arg2))
|
|
||||||
return YP.termLessThan(_arg2, functor._arg2);
|
|
||||||
|
|
||||||
return YP.termLessThan(_arg3, functor._arg3);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
return YP.ground(_arg1) && YP.ground(_arg2) && YP.ground(_arg3);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
YP.addUniqueVariables(_arg1, variableSet);
|
|
||||||
YP.addUniqueVariables(_arg2, variableSet);
|
|
||||||
YP.addUniqueVariables(_arg3, variableSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
return new Functor3(_name, YP.makeCopy(_arg1, copyStore),
|
|
||||||
YP.makeCopy(_arg2, copyStore), YP.makeCopy(_arg3, copyStore));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,385 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// An IndexedAnswers holds answers to a query based on the values of index arguments.
|
|
||||||
/// </summary>
|
|
||||||
public class IndexedAnswers : YP.IClause
|
|
||||||
{
|
|
||||||
private int _arity;
|
|
||||||
// addAnswer adds the answer here and indexes it later.
|
|
||||||
private List<object[]> _allAnswers = new List<object[]>();
|
|
||||||
// The key has the arity of answers with non-null values for each indexed arg. The value
|
|
||||||
// is a list of the matching answers. The signature is implicit in the pattern on non-null index args.
|
|
||||||
private Dictionary<HashedList, List<object[]>> _indexedAnswers =
|
|
||||||
new Dictionary<HashedList, List<object[]>>();
|
|
||||||
// Keeps track of whether we have started adding entries to _indexedAnswers for the signature.
|
|
||||||
private Dictionary<int, object> _gotAnswersForSignature = new Dictionary<int, object>();
|
|
||||||
private const int MAX_INDEX_ARGS = 31;
|
|
||||||
|
|
||||||
public IndexedAnswers(int arity)
|
|
||||||
{
|
|
||||||
_arity = arity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Append the answer to the list and update the indexes, if any.
|
|
||||||
/// Elements of answer must be ground, since arguments with unbound variables make this
|
|
||||||
/// into a dynamic rule which we don't index.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="answer"></param>
|
|
||||||
public void addAnswer(object[] answer)
|
|
||||||
{
|
|
||||||
addOrPrependAnswer(answer, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prepend the answer to the list and clear the indexes so that they must be re-computed
|
|
||||||
/// on the next call to match. (Only addAnswer will maintain the indexes while adding answers.)
|
|
||||||
/// Elements of answer must be ground, since arguments with unbound variables make this
|
|
||||||
/// into a dynamic rule which we don't index.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="answer"></param>
|
|
||||||
public void prependAnswer(object[] answer)
|
|
||||||
{
|
|
||||||
addOrPrependAnswer(answer, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Do the work of addAnswer or prependAnswer.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="answer"></param>
|
|
||||||
private void addOrPrependAnswer(object[] answer, bool prepend)
|
|
||||||
{
|
|
||||||
if (answer.Length != _arity)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Store a copy of the answer array.
|
|
||||||
object[] answerCopy = new object[answer.Length];
|
|
||||||
Variable.CopyStore copyStore = new Variable.CopyStore();
|
|
||||||
for (int i = 0; i < answer.Length; ++i)
|
|
||||||
answerCopy[i] = YP.makeCopy(answer[i], copyStore);
|
|
||||||
if (copyStore.getNUniqueVariables() > 0)
|
|
||||||
throw new InvalidOperationException
|
|
||||||
("Elements of answer must be ground, but found " + copyStore.getNUniqueVariables() +
|
|
||||||
" unbound variables");
|
|
||||||
|
|
||||||
if (prepend)
|
|
||||||
{
|
|
||||||
_allAnswers.Insert(0, answerCopy);
|
|
||||||
clearIndexes();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_allAnswers.Add(answerCopy);
|
|
||||||
// If match has already indexed answers for a signature, we need to add
|
|
||||||
// this to the existing indexed answers.
|
|
||||||
foreach (int signature in _gotAnswersForSignature.Keys)
|
|
||||||
indexAnswerForSignature(answerCopy, signature);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void indexAnswerForSignature(object[] answer, int signature)
|
|
||||||
{
|
|
||||||
// First find out which of the answer values can be used as an index.
|
|
||||||
object[] indexValues = new object[answer.Length];
|
|
||||||
for (int i = 0; i < answer.Length; ++i)
|
|
||||||
{
|
|
||||||
// We limit the number of indexed args in a 32-bit signature.
|
|
||||||
if (i >= MAX_INDEX_ARGS)
|
|
||||||
indexValues[i] = null;
|
|
||||||
else
|
|
||||||
indexValues[i] = getIndexValue(YP.getValue(answer[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need an entry in indexArgs from indexValues for each 1 bit in signature.
|
|
||||||
HashedList indexArgs = new HashedList(indexValues.Length);
|
|
||||||
for (int i = 0; i < indexValues.Length; ++i)
|
|
||||||
{
|
|
||||||
if ((signature & (1 << i)) == 0)
|
|
||||||
indexArgs.Add(null);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (indexValues[i] == null)
|
|
||||||
// The signature wants an index value here, but we don't have one so
|
|
||||||
// we can't add it as an answer for this signature.
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
indexArgs.Add(indexValues[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the answer to the answers list for indexArgs, creating the entry if needed.
|
|
||||||
List<object[]> answers;
|
|
||||||
if (!_indexedAnswers.TryGetValue(indexArgs, out answers))
|
|
||||||
{
|
|
||||||
answers = new List<object[]>();
|
|
||||||
_indexedAnswers[indexArgs] = answers;
|
|
||||||
}
|
|
||||||
answers.Add(answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<bool> match(object[] arguments)
|
|
||||||
{
|
|
||||||
if (arguments.Length != _arity)
|
|
||||||
yield break;
|
|
||||||
|
|
||||||
// Set up indexArgs, up to arg position MAX_INDEX_ARGS. The signature has a 1 bit for
|
|
||||||
// each non-null index arg.
|
|
||||||
HashedList indexArgs = new HashedList(arguments.Length);
|
|
||||||
bool gotAllIndexArgs = true;
|
|
||||||
int signature = 0;
|
|
||||||
for (int i = 0; i < arguments.Length; ++i)
|
|
||||||
{
|
|
||||||
object indexValue = null;
|
|
||||||
if (i < MAX_INDEX_ARGS)
|
|
||||||
{
|
|
||||||
// We limit the number of args in a 32-bit signature.
|
|
||||||
indexValue = getIndexValue(YP.getValue(arguments[i]));
|
|
||||||
if (indexValue != null)
|
|
||||||
signature += (1 << i);
|
|
||||||
}
|
|
||||||
if (indexValue == null)
|
|
||||||
gotAllIndexArgs = false;
|
|
||||||
indexArgs.Add(indexValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<object[]> answers;
|
|
||||||
if (signature == 0)
|
|
||||||
// No index args, so we have to match from _allAnswers.
|
|
||||||
answers = _allAnswers;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!_gotAnswersForSignature.ContainsKey(signature))
|
|
||||||
{
|
|
||||||
// We need to create the entry in _indexedAnswers.
|
|
||||||
foreach (object[] answer in _allAnswers)
|
|
||||||
indexAnswerForSignature(answer, signature);
|
|
||||||
// Mark that we did this signature.
|
|
||||||
_gotAnswersForSignature[signature] = null;
|
|
||||||
}
|
|
||||||
if (!_indexedAnswers.TryGetValue(indexArgs, out answers))
|
|
||||||
yield break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gotAllIndexArgs)
|
|
||||||
{
|
|
||||||
// All the arguments were already bound, so we don't need to do bindings.
|
|
||||||
yield return false;
|
|
||||||
yield break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find matches in answers.
|
|
||||||
IEnumerator<bool>[] iterators = new IEnumerator<bool>[arguments.Length];
|
|
||||||
// Debug: If the caller asserts another answer into this same predicate during yield, the iterator
|
|
||||||
// over clauses will be corrupted. Should we take the time to copy answers?
|
|
||||||
foreach (object[] answer in answers)
|
|
||||||
{
|
|
||||||
bool gotMatch = true;
|
|
||||||
int nIterators = 0;
|
|
||||||
// Try to bind all the arguments.
|
|
||||||
for (int i = 0; i < arguments.Length; ++i)
|
|
||||||
{
|
|
||||||
if (indexArgs[i] != null)
|
|
||||||
// We already matched this argument by looking up _indexedAnswers.
|
|
||||||
continue;
|
|
||||||
|
|
||||||
IEnumerator<bool> iterator = YP.unify(arguments[i], answer[i]).GetEnumerator();
|
|
||||||
iterators[nIterators++] = iterator;
|
|
||||||
// MoveNext() is true if YP.unify succeeds.
|
|
||||||
if (!iterator.MoveNext())
|
|
||||||
{
|
|
||||||
gotMatch = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int z = 0;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (gotMatch)
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Manually finalize all the iterators.
|
|
||||||
for (z = 0; z < nIterators; ++z)
|
|
||||||
iterators[z].Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<bool> clause(object Head, object Body)
|
|
||||||
{
|
|
||||||
Head = YP.getValue(Head);
|
|
||||||
if (Head is Variable)
|
|
||||||
throw new PrologException("instantiation_error", "Head is an unbound variable");
|
|
||||||
object[] arguments = YP.getFunctorArgs(Head);
|
|
||||||
|
|
||||||
// We always match Head from _allAnswers, and the Body is Atom.a("true").
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
foreach (bool l1 in YP.unify(Body, Atom.a("true")))
|
|
||||||
{
|
|
||||||
// The caller can assert another answer into this same predicate during yield, so we have to
|
|
||||||
// make a copy of the answers.
|
|
||||||
foreach (object[] answer in _allAnswers.ToArray())
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YP.unifyArrays(arguments, answer))
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<bool> retract(object Head, object Body)
|
|
||||||
{
|
|
||||||
Head = YP.getValue(Head);
|
|
||||||
if (Head is Variable)
|
|
||||||
throw new PrologException("instantiation_error", "Head is an unbound variable");
|
|
||||||
object[] arguments = YP.getFunctorArgs(Head);
|
|
||||||
|
|
||||||
// We always match Head from _allAnswers, and the Body is Atom.a("true").
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
foreach (bool l1 in YP.unify(Body, Atom.a("true")))
|
|
||||||
{
|
|
||||||
// The caller can assert another answer into this same predicate during yield, so we have to
|
|
||||||
// make a copy of the answers.
|
|
||||||
foreach (object[] answer in _allAnswers.ToArray())
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YP.unifyArrays(arguments, answer))
|
|
||||||
{
|
|
||||||
_allAnswers.Remove(answer);
|
|
||||||
clearIndexes();
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// After retracting or prepending an answer in _allAnswers, the indexes are invalid, so clear them.
|
|
||||||
/// </summary>
|
|
||||||
private void clearIndexes()
|
|
||||||
{
|
|
||||||
_indexedAnswers.Clear();
|
|
||||||
_gotAnswersForSignature.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A HashedList extends an ArrayList with methods to get a hash and to check equality
|
|
||||||
/// based on the elements of the list.
|
|
||||||
/// </summary>
|
|
||||||
public class HashedList : ArrayList
|
|
||||||
{
|
|
||||||
private bool _gotHashCode = false;
|
|
||||||
private int _hashCode;
|
|
||||||
|
|
||||||
public HashedList()
|
|
||||||
: base()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashedList(int capacity)
|
|
||||||
: base(capacity)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashedList(ICollection c)
|
|
||||||
: base(c)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug: Should override all the other methods that change this.
|
|
||||||
public override int Add(object value)
|
|
||||||
{
|
|
||||||
_gotHashCode = false;
|
|
||||||
return base.Add(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int GetHashCode()
|
|
||||||
{
|
|
||||||
if (!_gotHashCode)
|
|
||||||
{
|
|
||||||
int hashCode = 1;
|
|
||||||
foreach (object obj in this)
|
|
||||||
hashCode = 31 * hashCode + (obj == null ? 0 : obj.GetHashCode());
|
|
||||||
_hashCode = hashCode;
|
|
||||||
_gotHashCode = true;
|
|
||||||
}
|
|
||||||
return _hashCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Equals(object obj)
|
|
||||||
{
|
|
||||||
if (!(obj is ArrayList))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ArrayList objList = (ArrayList)obj;
|
|
||||||
if (objList.Count != Count)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < Count; ++i)
|
|
||||||
{
|
|
||||||
object value = objList[i];
|
|
||||||
if (value == null)
|
|
||||||
{
|
|
||||||
if (this[i] != null)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!value.Equals(this[i]))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If we keep an index on value, return the value, or null if we don't index it.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">the term to examine. Assume you already called YP.getValue(value)</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object getIndexValue(object value)
|
|
||||||
{
|
|
||||||
if (value is Atom || value is string || value is Int32 || value is DateTime)
|
|
||||||
return value;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,166 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public class ListPair : Functor2
|
|
||||||
{
|
|
||||||
public ListPair(object head, object tail) : base(Atom.DOT, head, tail)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object make(List<object> list)
|
|
||||||
{
|
|
||||||
if (list.Count <= 0)
|
|
||||||
return Atom.NIL;
|
|
||||||
|
|
||||||
object result = Atom.NIL;
|
|
||||||
// Start from the end.
|
|
||||||
for (int i = list.Count - 1; i >= 0; --i)
|
|
||||||
result = new ListPair(list[i], result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object make(object[] array)
|
|
||||||
{
|
|
||||||
if (array.Length <= 0)
|
|
||||||
return Atom.NIL;
|
|
||||||
|
|
||||||
object result = Atom.NIL;
|
|
||||||
// Start from the end.
|
|
||||||
for (int i = array.Length - 1; i >= 0; --i)
|
|
||||||
result = new ListPair(array[i], result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return a ListPair version of array, where repeated elements
|
|
||||||
/// (according to YP.termEqual) are removed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="array"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object makeWithoutRepeatedTerms(object[] array)
|
|
||||||
{
|
|
||||||
if (array.Length <= 0)
|
|
||||||
return Atom.NIL;
|
|
||||||
|
|
||||||
// Start from the end.
|
|
||||||
object previousTerm = array[array.Length - 1];
|
|
||||||
object result = new ListPair(previousTerm, Atom.NIL);
|
|
||||||
for (int i = array.Length - 2; i >= 0; --i)
|
|
||||||
{
|
|
||||||
object term = array[i];
|
|
||||||
if (YP.termEqual(term, previousTerm))
|
|
||||||
continue;
|
|
||||||
result = new ListPair(term, result);
|
|
||||||
previousTerm = term;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return a ListPair version of array, where repeated elements
|
|
||||||
/// (according to YP.termEqual) are removed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="array"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object makeWithoutRepeatedTerms(List<object> array)
|
|
||||||
{
|
|
||||||
if (array.Count <= 0)
|
|
||||||
return Atom.NIL;
|
|
||||||
|
|
||||||
// Start from the end.
|
|
||||||
object previousTerm = array[array.Count - 1];
|
|
||||||
object result = new ListPair(previousTerm, Atom.NIL);
|
|
||||||
for (int i = array.Count - 2; i >= 0; --i)
|
|
||||||
{
|
|
||||||
object term = array[i];
|
|
||||||
if (YP.termEqual(term, previousTerm))
|
|
||||||
continue;
|
|
||||||
result = new ListPair(term, result);
|
|
||||||
previousTerm = term;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object make(object element1)
|
|
||||||
{
|
|
||||||
return new ListPair(element1, Atom.NIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object make(object element1, object element2)
|
|
||||||
{
|
|
||||||
return new ListPair(element1, new ListPair(element2, Atom.NIL));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object make(object element1, object element2, object element3)
|
|
||||||
{
|
|
||||||
return new ListPair(element1,
|
|
||||||
new ListPair(element2, new ListPair(element3, Atom.NIL)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return an array of the elements in list or null if it is not
|
|
||||||
/// a proper list. If list is Atom.NIL, return an array of zero elements.
|
|
||||||
/// If the list or one of the tails of the list is Variable, raise an instantiation_error.
|
|
||||||
/// This does not call YP.getValue on each element.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="list"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static object[] toArray(object list)
|
|
||||||
{
|
|
||||||
list = YP.getValue(list);
|
|
||||||
if (list.Equals(Atom.NIL))
|
|
||||||
return new object[0];
|
|
||||||
|
|
||||||
List<object> result = new List<object>();
|
|
||||||
object element = list;
|
|
||||||
while (true) {
|
|
||||||
if (element == Atom.NIL)
|
|
||||||
break;
|
|
||||||
if (element is Variable)
|
|
||||||
throw new PrologException(Atom.a("instantiation_error"),
|
|
||||||
"List tail is an unbound variable");
|
|
||||||
if (!(element is Functor2 && ((Functor2)element)._name == Atom.DOT))
|
|
||||||
// Not a proper list.
|
|
||||||
return null;
|
|
||||||
result.Add(((Functor2)element)._arg1);
|
|
||||||
element = YP.getValue(((Functor2)element)._arg2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.Count <= 0)
|
|
||||||
return null;
|
|
||||||
return result.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,159 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A PrologException is used as the exception thrown by YP.throw(Term).
|
|
||||||
/// </summary>
|
|
||||||
public class PrologException : Exception
|
|
||||||
{
|
|
||||||
public readonly object _term;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a PrologException with the given Term. The printable exception message is the full Term.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Term">the term of the exception</param>
|
|
||||||
public PrologException(object Term)
|
|
||||||
: base(YP.getValue(Term).ToString())
|
|
||||||
{
|
|
||||||
_term = YP.makeCopy(Term, new Variable.CopyStore());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a PrologException where the Term is error(ErrorTerm, Message).
|
|
||||||
/// This uses YP.makeCopy to copy the ErrorTerm and Message so that they are valid after unbinding.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ErrorTerm">the error term of the error</param>
|
|
||||||
/// <param name="Messsage">the message term of the error. If this is a string, it is converted to an
|
|
||||||
/// Atom so it can be used by Prolog code.
|
|
||||||
/// Message, converted to a string, is use as the printable exception message.
|
|
||||||
/// </param>
|
|
||||||
public PrologException(object ErrorTerm, object Message)
|
|
||||||
: base(YP.getValue(Message).ToString())
|
|
||||||
{
|
|
||||||
if (Message is string)
|
|
||||||
Message = Atom.a((string)Message);
|
|
||||||
_term = YP.makeCopy(new Functor2(Atom.a("error"), ErrorTerm, Message), new Variable.CopyStore());
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TypeErrorInfo
|
|
||||||
{
|
|
||||||
public readonly Atom _Type;
|
|
||||||
public readonly object _Culprit;
|
|
||||||
public readonly object _Message;
|
|
||||||
|
|
||||||
public TypeErrorInfo(Atom Type, object Culprit, object Message)
|
|
||||||
{
|
|
||||||
_Type = Type;
|
|
||||||
_Culprit = Culprit;
|
|
||||||
_Message = Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Return the TypeErrorInfo for this exception, or null if _term does not match
|
|
||||||
/// error(type_error(Type, Culprit), Message).
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public TypeErrorInfo getTypeErrorInfo()
|
|
||||||
{
|
|
||||||
if (!(_term is Functor2 && ((Functor2)_term)._name._name == "error"))
|
|
||||||
return null;
|
|
||||||
object errorTerm = ((Functor2)_term)._arg1;
|
|
||||||
if (!(errorTerm is Functor2 && ((Functor2)errorTerm)._name._name == "type_error"))
|
|
||||||
return null;
|
|
||||||
if (!(((Functor2)errorTerm)._arg1 is Atom))
|
|
||||||
return null;
|
|
||||||
return new TypeErrorInfo
|
|
||||||
((Atom)((Functor2)errorTerm)._arg1, ((Functor2)errorTerm)._arg2, ((Functor2)_term)._arg2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ExistenceErrorInfo
|
|
||||||
{
|
|
||||||
public readonly Atom _Type;
|
|
||||||
public readonly object _Culprit;
|
|
||||||
public readonly object _Message;
|
|
||||||
|
|
||||||
public ExistenceErrorInfo(Atom Type, object Culprit, object Message)
|
|
||||||
{
|
|
||||||
_Type = Type;
|
|
||||||
_Culprit = Culprit;
|
|
||||||
_Message = Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If _Type is procedure and _Culprit is name/artity, return the name. Otherwise return null.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public object getProcedureName()
|
|
||||||
{
|
|
||||||
if (!(_Type._name == "procedure" &&
|
|
||||||
_Culprit is Functor2 && ((Functor2)_Culprit)._name == Atom.SLASH))
|
|
||||||
return null;
|
|
||||||
return ((Functor2)_Culprit)._arg1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If _Type is procedure and _Culprit is name/arity and arity is an integer, return the arity.
|
|
||||||
/// Otherwise return -1.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public int getProcedureArity()
|
|
||||||
{
|
|
||||||
if (!(_Type._name == "procedure" &&
|
|
||||||
_Culprit is Functor2 && ((Functor2)_Culprit)._name == Atom.SLASH))
|
|
||||||
return -1;
|
|
||||||
if (!(((Functor2)_Culprit)._arg2 is int))
|
|
||||||
return -1;
|
|
||||||
return (int)((Functor2)_Culprit)._arg2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Return the ExistenceErrorInfo for this exception, or null if _term does not match
|
|
||||||
/// error(existence_error(Type, Culprit), Message). If the returned ExistenceErrorInfo _Culprit is
|
|
||||||
/// procedure, you can use its getProcedureName and getProcedureArity.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public ExistenceErrorInfo getExistenceErrorInfo()
|
|
||||||
{
|
|
||||||
if (!(_term is Functor2 && ((Functor2)_term)._name._name == "error"))
|
|
||||||
return null;
|
|
||||||
object errorTerm = ((Functor2)_term)._arg1;
|
|
||||||
if (!(errorTerm is Functor2 && ((Functor2)errorTerm)._name._name == "existence_error"))
|
|
||||||
return null;
|
|
||||||
if (!(((Functor2)errorTerm)._arg1 is Atom))
|
|
||||||
return null;
|
|
||||||
return new ExistenceErrorInfo
|
|
||||||
((Atom)((Functor2)errorTerm)._arg1, ((Functor2)errorTerm)._arg2, ((Functor2)_term)._arg2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.Shared.YieldProlog")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("http://opensimulator.org")]
|
|
||||||
[assembly: AssemblyProduct("OpenSim")]
|
|
||||||
[assembly: AssemblyCopyright("OpenSimulator developers")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
[assembly: Guid("8df98e6b-0425-44d6-8d91-2b3b4c56acdf")]
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
[assembly: AssemblyVersion("0.7.6.*")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// An UndefinedPredicateException extends PrologException to create an existence_error exception.
|
|
||||||
/// </summary>
|
|
||||||
public class UndefinedPredicateException : PrologException
|
|
||||||
{
|
|
||||||
private Atom _predicateName;
|
|
||||||
private int _arity;
|
|
||||||
|
|
||||||
public UndefinedPredicateException(object message, Atom predicateName, int arity)
|
|
||||||
: base(new Functor2
|
|
||||||
(Atom.a("existence_error"), Atom.a("procedure"), new Functor2(Atom.a("/"), predicateName, arity)),
|
|
||||||
message)
|
|
||||||
{
|
|
||||||
_predicateName = predicateName;
|
|
||||||
_arity = arity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Atom PredicateName
|
|
||||||
{
|
|
||||||
get { return _predicateName; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Arity
|
|
||||||
{
|
|
||||||
get { return _arity; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,222 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2008, Jeff Thompson
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog
|
|
||||||
{
|
|
||||||
public interface IUnifiable
|
|
||||||
{
|
|
||||||
IEnumerable<bool> unify(object arg);
|
|
||||||
void addUniqueVariables(List<Variable> variableSet);
|
|
||||||
object makeCopy(Variable.CopyStore copyStore);
|
|
||||||
bool termEqual(object term);
|
|
||||||
bool ground();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A Variable is passed to a function so that it can be unified with
|
|
||||||
/// value or another Variable. See getValue and unify for details.
|
|
||||||
/// </summary>
|
|
||||||
public class Variable : IUnifiable
|
|
||||||
{
|
|
||||||
// Use _isBound separate from _value so that it can be bound to any value,
|
|
||||||
// including null.
|
|
||||||
private bool _isBound = false;
|
|
||||||
private object _value;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If this Variable is unbound, then just return this Variable.
|
|
||||||
/// Otherwise, if this has been bound to a value with unify, return the value.
|
|
||||||
/// If the bound value is another Variable, this follows the "variable chain"
|
|
||||||
/// to the end and returns the final value, or the final Variable if it is unbound.
|
|
||||||
/// For more details, see http://yieldprolog.sourceforge.net/tutorial1.html
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public object getValue()
|
|
||||||
{
|
|
||||||
if (!_isBound)
|
|
||||||
return this;
|
|
||||||
|
|
||||||
object result = _value;
|
|
||||||
while (result is Variable)
|
|
||||||
{
|
|
||||||
if (!((Variable)result)._isBound)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
// Keep following the Variable chain.
|
|
||||||
result = ((Variable)result)._value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If this Variable is bound, then just call YP.unify to unify this with arg.
|
|
||||||
/// (Note that if arg is an unbound Variable, then YP.unify will bind it to
|
|
||||||
/// this Variable's value.)
|
|
||||||
/// Otherwise, bind this Variable to YP.getValue(arg) and yield once. After the
|
|
||||||
/// yield, return this Variable to the unbound state.
|
|
||||||
/// For more details, see http://yieldprolog.sourceforge.net/tutorial1.html
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="arg"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public IEnumerable<bool> unify(object arg)
|
|
||||||
{
|
|
||||||
if (!_isBound)
|
|
||||||
{
|
|
||||||
_value = YP.getValue(arg);
|
|
||||||
if (_value == this)
|
|
||||||
// We are unifying this unbound variable with itself, so leave it unbound.
|
|
||||||
yield return false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_isBound = true;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
yield return false;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Remove the binding.
|
|
||||||
_isBound = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// disable warning on l1, don't see how we can
|
|
||||||
// code this differently
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
foreach (bool l1 in YP.unify(this, arg))
|
|
||||||
yield return false;
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
object value = getValue();
|
|
||||||
if (value == this)
|
|
||||||
return "_Variable";
|
|
||||||
else
|
|
||||||
return getValue().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If bound, call YP.addUniqueVariables on the value. Otherwise, if this unbound
|
|
||||||
/// variable is not already in variableSet, add it.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="variableSet"></param>
|
|
||||||
public void addUniqueVariables(List<Variable> variableSet)
|
|
||||||
{
|
|
||||||
if (_isBound)
|
|
||||||
YP.addUniqueVariables(getValue(), variableSet);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (variableSet.IndexOf(this) < 0)
|
|
||||||
variableSet.Add(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If bound, return YP.makeCopy for the value, else return copyStore.getCopy(this).
|
|
||||||
/// However, if copyStore is null, just return this.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="copyStore"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public object makeCopy(Variable.CopyStore copyStore)
|
|
||||||
{
|
|
||||||
if (_isBound)
|
|
||||||
return YP.makeCopy(getValue(), copyStore);
|
|
||||||
else
|
|
||||||
return copyStore == null ? this : copyStore.getCopy(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool termEqual(object term)
|
|
||||||
{
|
|
||||||
if (_isBound)
|
|
||||||
return YP.termEqual(getValue(), term);
|
|
||||||
else
|
|
||||||
return this == YP.getValue(term);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ground()
|
|
||||||
{
|
|
||||||
if (_isBound)
|
|
||||||
// This is usually called by YP.ground which already did getValue, so this
|
|
||||||
// should never be reached, but check anyway.
|
|
||||||
return YP.ground(getValue());
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A CopyStore is used by makeCopy to track which Variable objects have
|
|
||||||
/// been copied.
|
|
||||||
/// </summary>
|
|
||||||
public class CopyStore
|
|
||||||
{
|
|
||||||
private List<Variable> _inVariableSet = new List<Variable>();
|
|
||||||
private List<Variable> _outVariableSet = new List<Variable>();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If inVariable has already been copied, return its copy. Otherwise,
|
|
||||||
/// return a fresh Variable associated with inVariable.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="inVariable"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public Variable getCopy(Variable inVariable)
|
|
||||||
{
|
|
||||||
int index = _inVariableSet.IndexOf(inVariable);
|
|
||||||
if (index >= 0)
|
|
||||||
return _outVariableSet[index];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Variable outVariable = new Variable();
|
|
||||||
_inVariableSet.Add(inVariable);
|
|
||||||
_outVariableSet.Add(outVariable);
|
|
||||||
return outVariable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return the number of unique variables that have been copied.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public int getNUniqueVariables()
|
|
||||||
{
|
|
||||||
return _inVariableSet.Count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -85,9 +85,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
private static CSharpCodeProvider CScodeProvider = new CSharpCodeProvider();
|
private static CSharpCodeProvider CScodeProvider = new CSharpCodeProvider();
|
||||||
private static VBCodeProvider VBcodeProvider = new VBCodeProvider();
|
private static VBCodeProvider VBcodeProvider = new VBCodeProvider();
|
||||||
// private static JScriptCodeProvider JScodeProvider = new JScriptCodeProvider();
|
|
||||||
private static CSharpCodeProvider YPcodeProvider = new CSharpCodeProvider(); // YP is translated into CSharp
|
|
||||||
private static YP2CSConverter YP_Converter = new YP2CSConverter();
|
|
||||||
|
|
||||||
// private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files
|
// private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files
|
||||||
private static UInt64 scriptCompileCounter = 0; // And a counter
|
private static UInt64 scriptCompileCounter = 0; // And a counter
|
||||||
|
@ -404,12 +401,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
WriteMapFile(assembly + ".map", linemap);
|
WriteMapFile(assembly + ".map", linemap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (language == enumCompileType.yp)
|
|
||||||
{
|
|
||||||
// Its YP, convert it to C#
|
|
||||||
compileScript = YP_Converter.Convert(Script);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (language)
|
switch (language)
|
||||||
{
|
{
|
||||||
case enumCompileType.cs:
|
case enumCompileType.cs:
|
||||||
|
@ -424,13 +415,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
compileScript = CreateVBCompilerScript(
|
compileScript = CreateVBCompilerScript(
|
||||||
compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName);
|
compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName);
|
||||||
break;
|
break;
|
||||||
// case enumCompileType.js:
|
|
||||||
// compileScript = CreateJSCompilerScript(compileScript, m_scriptEngine.ScriptBaseClassName);
|
|
||||||
// break;
|
|
||||||
case enumCompileType.yp:
|
|
||||||
compileScript = CreateYPCompilerScript(
|
|
||||||
compileScript, m_scriptEngine.ScriptClassName,m_scriptEngine.ScriptBaseClassName);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assembly = CompileFromDotNetText(compileScript, language, asset, assembly);
|
assembly = CompileFromDotNetText(compileScript, language, asset, assembly);
|
||||||
|
@ -488,22 +472,6 @@ namespace SecondLife
|
||||||
return compileScript;
|
return compileScript;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string CreateYPCompilerScript(string compileScript, string className, string baseClassName)
|
|
||||||
{
|
|
||||||
compileScript = String.Empty +
|
|
||||||
"using OpenSim.Region.ScriptEngine.Shared.YieldProlog; " +
|
|
||||||
"using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" +
|
|
||||||
String.Empty + "namespace SecondLife { " +
|
|
||||||
String.Empty + "public class " + className + " : " + baseClassName + " { \r\n" +
|
|
||||||
//@"public Script() { } " +
|
|
||||||
@"static OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP YP=null; " +
|
|
||||||
@"public " + className + "() { YP= new OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP(); } " +
|
|
||||||
compileScript +
|
|
||||||
"} }\r\n";
|
|
||||||
|
|
||||||
return compileScript;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string CreateVBCompilerScript(string compileScript, string className, string baseClassName)
|
private static string CreateVBCompilerScript(string compileScript, string className, string baseClassName)
|
||||||
{
|
{
|
||||||
compileScript = String.Empty +
|
compileScript = String.Empty +
|
||||||
|
@ -635,14 +603,6 @@ namespace SecondLife
|
||||||
}
|
}
|
||||||
} while (!complete);
|
} while (!complete);
|
||||||
break;
|
break;
|
||||||
// case enumCompileType.js:
|
|
||||||
// results = JScodeProvider.CompileAssemblyFromSource(
|
|
||||||
// parameters, Script);
|
|
||||||
// break;
|
|
||||||
case enumCompileType.yp:
|
|
||||||
results = YPcodeProvider.CompileAssemblyFromSource(
|
|
||||||
parameters, Script);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
throw new Exception("Compiler is not able to recongnize " +
|
throw new Exception("Compiler is not able to recongnize " +
|
||||||
"language type \"" + lang.ToString() + "\"");
|
"language type \"" + lang.ToString() + "\"");
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Contributors, http://opensimulator.org/
|
|
||||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the OpenSimulator Project nor the
|
|
||||||
* names of its contributors may be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using OpenSim.Region.ScriptEngine.Shared.YieldProlog;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
|
||||||
{
|
|
||||||
public class YP2CSConverter
|
|
||||||
{
|
|
||||||
public YP2CSConverter()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Convert(string Script)
|
|
||||||
{
|
|
||||||
string CS_code = GenCode(Script);
|
|
||||||
return CS_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static string GenCode(string myCode)
|
|
||||||
{
|
|
||||||
Variable TermList = new Variable();
|
|
||||||
Variable FunctionCode = new Variable();
|
|
||||||
|
|
||||||
string CS_code = "";
|
|
||||||
|
|
||||||
int cs_pointer = myCode.IndexOf("\n//cs");
|
|
||||||
if (cs_pointer > 0)
|
|
||||||
{
|
|
||||||
CS_code = myCode.Substring(cs_pointer); // CS code comes after
|
|
||||||
myCode = myCode.Substring(0, cs_pointer);
|
|
||||||
}
|
|
||||||
myCode.Replace("//yp", "%YPCode");
|
|
||||||
|
|
||||||
StringWriter myCS_SW = new StringWriter();
|
|
||||||
StringReader myCode_SR = new StringReader(" yp_nop_header_nop. \n "+myCode + "\n");
|
|
||||||
|
|
||||||
YP.see(myCode_SR);
|
|
||||||
YP.tell(myCS_SW);
|
|
||||||
|
|
||||||
//m_log.Debug("Mycode\n ===================================\n" + myCode+"\n");
|
|
||||||
|
|
||||||
// disable warning: don't see how we can code this differently short
|
|
||||||
// of rewriting the whole thing
|
|
||||||
#pragma warning disable 0168, 0219
|
|
||||||
foreach (bool l1 in Parser.parseInput(TermList))
|
|
||||||
{
|
|
||||||
foreach (bool l2 in YPCompiler.makeFunctionPseudoCode(TermList, FunctionCode))
|
|
||||||
{
|
|
||||||
// ListPair VFC = new ListPair(FunctionCode, new Variable());
|
|
||||||
//m_log.Debug("-------------------------")
|
|
||||||
//m_log.Debug(FunctionCode.ToString())
|
|
||||||
//m_log.Debug("-------------------------")
|
|
||||||
YPCompiler.convertFunctionCSharp(FunctionCode);
|
|
||||||
//YPCompiler.convertStringCodesCSharp(VFC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning restore 0168, 0219
|
|
||||||
YP.seen();
|
|
||||||
myCS_SW.Close();
|
|
||||||
YP.told();
|
|
||||||
StringBuilder bu = myCS_SW.GetStringBuilder();
|
|
||||||
string finalcode = "//YPEncoded\n" + bu.ToString();
|
|
||||||
// FIX script events (we're in the same script)
|
|
||||||
// 'YP.script_event(Atom.a(@"sayit"),' ==> 'sayit('
|
|
||||||
finalcode = Regex.Replace(finalcode,
|
|
||||||
@"YP.script_event\(Atom.a\(\@\""(.*?)""\)\,",
|
|
||||||
@"this.$1(",
|
|
||||||
RegexOptions.Compiled | RegexOptions.Singleline);
|
|
||||||
finalcode = Regex.Replace(finalcode,
|
|
||||||
@"YP.script_event\(Atom.a\(\""(.*?)""\)\,",
|
|
||||||
@"this.$1(",
|
|
||||||
RegexOptions.Compiled | RegexOptions.Singleline);
|
|
||||||
finalcode = Regex.Replace(finalcode,
|
|
||||||
@" static ",
|
|
||||||
@" ",
|
|
||||||
RegexOptions.Compiled | RegexOptions.Singleline);
|
|
||||||
|
|
||||||
finalcode = CS_code+"\n\r"+ finalcode;
|
|
||||||
finalcode = Regex.Replace(finalcode,
|
|
||||||
@"PrologCallback",
|
|
||||||
@"public IEnumerable<bool> ",
|
|
||||||
RegexOptions.Compiled | RegexOptions.Singleline);
|
|
||||||
return finalcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -232,17 +232,16 @@ namespace OpenSim.Server.Handlers.Simulation
|
||||||
httpResponse.KeepAlive = false;
|
httpResponse.KeepAlive = false;
|
||||||
Encoding encoding = Encoding.UTF8;
|
Encoding encoding = Encoding.UTF8;
|
||||||
|
|
||||||
Stream inputStream = null;
|
if (httpRequest.ContentType != "application/json")
|
||||||
if (httpRequest.ContentType == "application/x-gzip")
|
|
||||||
inputStream = new GZipStream(request, CompressionMode.Decompress);
|
|
||||||
else if (httpRequest.ContentType == "application/json")
|
|
||||||
inputStream = request;
|
|
||||||
else // no go
|
|
||||||
{
|
{
|
||||||
httpResponse.StatusCode = 406;
|
httpResponse.StatusCode = 406;
|
||||||
return encoding.GetBytes("false");
|
return encoding.GetBytes("false");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stream inputStream = request;
|
||||||
|
if ((httpRequest.Headers["Content-Encoding"] == "gzip") || (httpRequest.Headers["X-Content-Encoding"] == "gzip"))
|
||||||
|
inputStream = new GZipStream(inputStream, CompressionMode.Decompress);
|
||||||
|
|
||||||
StreamReader reader = new StreamReader(inputStream, encoding);
|
StreamReader reader = new StreamReader(inputStream, encoding);
|
||||||
|
|
||||||
string requestBody = reader.ReadToEnd();
|
string requestBody = reader.ReadToEnd();
|
||||||
|
@ -433,11 +432,9 @@ namespace OpenSim.Server.Handlers.Simulation
|
||||||
keysvals.Add("headers", headervals);
|
keysvals.Add("headers", headervals);
|
||||||
keysvals.Add("querystringkeys", querystringkeys);
|
keysvals.Add("querystringkeys", querystringkeys);
|
||||||
|
|
||||||
Stream inputStream;
|
Stream inputStream = request;
|
||||||
if (httpRequest.ContentType == "application/x-gzip")
|
if ((httpRequest.Headers["Content-Encoding"] == "gzip") || (httpRequest.Headers["X-Content-Encoding"] == "gzip"))
|
||||||
inputStream = new GZipStream(request, CompressionMode.Decompress);
|
inputStream = new GZipStream(inputStream, CompressionMode.Decompress);
|
||||||
else
|
|
||||||
inputStream = request;
|
|
||||||
|
|
||||||
Encoding encoding = Encoding.UTF8;
|
Encoding encoding = Encoding.UTF8;
|
||||||
StreamReader reader = new StreamReader(inputStream, encoding);
|
StreamReader reader = new StreamReader(inputStream, encoding);
|
||||||
|
|
|
@ -257,6 +257,18 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
||||||
region.RegionLocY = n;
|
region.RegionLocY = n;
|
||||||
//m_log.Debug(">> HERE, y: " + region.RegionLocY);
|
//m_log.Debug(">> HERE, y: " + region.RegionLocY);
|
||||||
}
|
}
|
||||||
|
if (hash["size_x"] != null)
|
||||||
|
{
|
||||||
|
Int32.TryParse((string)hash["size_x"], out n);
|
||||||
|
region.RegionSizeX = n;
|
||||||
|
//m_log.Debug(">> HERE, x: " + region.RegionLocX);
|
||||||
|
}
|
||||||
|
if (hash["size_y"] != null)
|
||||||
|
{
|
||||||
|
Int32.TryParse((string)hash["size_y"], out n);
|
||||||
|
region.RegionSizeY = n;
|
||||||
|
//m_log.Debug(">> HERE, y: " + region.RegionLocY);
|
||||||
|
}
|
||||||
if (hash["region_name"] != null)
|
if (hash["region_name"] != null)
|
||||||
{
|
{
|
||||||
region.RegionName = (string)hash["region_name"];
|
region.RegionName = (string)hash["region_name"];
|
||||||
|
|
|
@ -23,11 +23,17 @@
|
||||||
</layout>
|
</layout>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
|
||||||
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
||||||
<file value="OpenSim.32BitLaunch.log" />
|
<file value="log/OpenSim.32BitLaunch.log" />
|
||||||
<appendToFile value="true" />
|
|
||||||
<rollingStyle value="Date" />
|
<rollingStyle value="Date" />
|
||||||
<datePattern value="'.'yyyy-MM-dd"/>
|
<datePattern value="'.'yyyy-MM-dd"/>
|
||||||
|
...
|
||||||
|
-->
|
||||||
|
|
||||||
|
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
|
||||||
|
<file value="OpenSim.32BitLaunch.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
<filter type="log4net.Filter.LoggerMatchFilter">
|
<filter type="log4net.Filter.LoggerMatchFilter">
|
||||||
<loggerToMatch value="special"/>
|
<loggerToMatch value="special"/>
|
||||||
<acceptOnMatch value="false"/>
|
<acceptOnMatch value="false"/>
|
||||||
|
|
|
@ -23,11 +23,17 @@
|
||||||
</layout>
|
</layout>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
|
||||||
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
||||||
<file value="OpenSim.log" />
|
<file value="log/OpenSim.log" />
|
||||||
<appendToFile value="true" />
|
|
||||||
<rollingStyle value="Date" />
|
<rollingStyle value="Date" />
|
||||||
<datePattern value="'.'yyyy-MM-dd"/>
|
<datePattern value="'.'yyyy-MM-dd"/>
|
||||||
|
...
|
||||||
|
-->
|
||||||
|
|
||||||
|
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
|
||||||
|
<file value="OpenSim.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
<filter type="log4net.Filter.LoggerMatchFilter">
|
<filter type="log4net.Filter.LoggerMatchFilter">
|
||||||
<loggerToMatch value="special"/>
|
<loggerToMatch value="special"/>
|
||||||
<acceptOnMatch value="false"/>
|
<acceptOnMatch value="false"/>
|
||||||
|
|
|
@ -103,36 +103,36 @@
|
||||||
|
|
||||||
;# {NonPhysicalPrimMin} {} {Minimum size of nonphysical prims?} {} 0.001
|
;# {NonPhysicalPrimMin} {} {Minimum size of nonphysical prims?} {} 0.001
|
||||||
;; Minimum size for non-physical prims. Affects resizing of existing
|
;; Minimum size for non-physical prims. Affects resizing of existing
|
||||||
;; prims. This can be overriden in the region config file (as
|
;; prims. This can be overridden in the region config file (as
|
||||||
;; NonPhysicalPrimMin!).
|
;; NonPhysicalPrimMin!).
|
||||||
; NonPhysicalPrimMin = 0.001
|
; NonPhysicalPrimMin = 0.001
|
||||||
|
|
||||||
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
||||||
;; Maximum size for non-physical prims. Affects resizing of existing
|
;; Maximum size for non-physical prims. Affects resizing of existing
|
||||||
;; prims. This can be overriden in the region config file (as
|
;; prims. This can be overridden in the region config file (as
|
||||||
;; NonPhysicalPrimMax!).
|
;; NonPhysicalPrimMax!).
|
||||||
; NonPhysicalPrimMax = 256
|
; NonPhysicalPrimMax = 256
|
||||||
|
|
||||||
;# {PhysicalPrimMin} {} {Minimum size of physical prims?} {} 0.01
|
;# {PhysicalPrimMin} {} {Minimum size of physical prims?} {} 0.01
|
||||||
;; Maximum size where a prim can be physical. Affects resizing of
|
;; Minimum size where a prim can be physical. Affects resizing of
|
||||||
;; existing prims. This can be overriden in the region config file.
|
;; existing prims. This can be overridden in the region config file.
|
||||||
; PhysicalPrimMin = 0.01
|
; PhysicalPrimMin = 0.01
|
||||||
|
|
||||||
;# {PhysicalPrimMax} {} {Maximum size of physical prims?} {} 64
|
;# {PhysicalPrimMax} {} {Maximum size of physical prims?} {} 64
|
||||||
;; Maximum size where a prim can be physical. Affects resizing of
|
;; Maximum size where a prim can be physical. Affects resizing of
|
||||||
;; existing prims. This can be overriden in the region config file.
|
;; existing prims. This can be overridden in the region config file.
|
||||||
; PhysicalPrimMax = 64
|
; PhysicalPrimMax = 64
|
||||||
|
|
||||||
;# {ClampPrimSize} {} {Clamp viewer rezzed prims to max sizes?} {true false} false
|
;# {ClampPrimSize} {} {Clamp viewer rezzed prims to max sizes?} {true false} false
|
||||||
;; If a viewer attempts to rez a prim larger than the non-physical or
|
;; If a viewer attempts to rez a prim larger than the non-physical or
|
||||||
;; physical prim max, clamp the dimensions to the appropriate maximum
|
;; physical prim max, clamp the dimensions to the appropriate maximum
|
||||||
;; This can be overriden in the region config file.
|
;; This can be overridden in the region config file.
|
||||||
; ClampPrimSize = false
|
; ClampPrimSize = false
|
||||||
|
|
||||||
;# {LinksetPrims} {} {Max prims an object will hold?} {} 0
|
;# {LinksetPrims} {} {Max prims an object will hold?} {} 0
|
||||||
;; Maximum number of prims allowable in a linkset. Affects creating new
|
;; Maximum number of prims allowable in a linkset. Affects creating new
|
||||||
;; linksets. Ignored if less than or equal to zero.
|
;; linksets. Ignored if less than or equal to zero.
|
||||||
;; This can be overriden in the region config file.
|
;; This can be overridden in the region config file.
|
||||||
; LinksetPrims = 0
|
; LinksetPrims = 0
|
||||||
|
|
||||||
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} true
|
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} true
|
||||||
|
@ -278,7 +278,7 @@
|
||||||
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
|
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
|
||||||
;; Map tile options.
|
;; Map tile options.
|
||||||
;; If true, then maptiles are generated using the MapImageModule below.
|
;; If true, then maptiles are generated using the MapImageModule below.
|
||||||
;; If false then the texture referenced by MaptileStaticUUID is used instead, which can also be overriden
|
;; If false then the texture referenced by MaptileStaticUUID is used instead, which can also be overridden
|
||||||
;; in individual region config file(s). If you do not want to upload map tiles at all, then you will need
|
;; in individual region config file(s). If you do not want to upload map tiles at all, then you will need
|
||||||
;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
|
;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
|
||||||
; GenerateMaptiles = true
|
; GenerateMaptiles = true
|
||||||
|
@ -827,7 +827,7 @@
|
||||||
|
|
||||||
;# {AllowedCompilers} {Enabled:true} {Languages to allow (comma separated)?} {} lsl
|
;# {AllowedCompilers} {Enabled:true} {Languages to allow (comma separated)?} {} lsl
|
||||||
;; List of allowed languages (lsl,vb,cs)
|
;; List of allowed languages (lsl,vb,cs)
|
||||||
;; AllowedCompilers=lsl,cs,js,vb.
|
;; AllowedCompilers=lsl,cs,vb
|
||||||
;; *warning*, non lsl languages have access to static methods such as
|
;; *warning*, non lsl languages have access to static methods such as
|
||||||
;; System.IO.File. Enable at your own risk.
|
;; System.IO.File. Enable at your own risk.
|
||||||
; AllowedCompilers = "lsl"
|
; AllowedCompilers = "lsl"
|
||||||
|
|
|
@ -99,18 +99,18 @@
|
||||||
; Increasing this number will increase memory usage.
|
; Increasing this number will increase memory usage.
|
||||||
MaxPrimUndos = 20
|
MaxPrimUndos = 20
|
||||||
|
|
||||||
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonPhysicalPrimMax!).
|
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overridden in the region config file (as NonPhysicalPrimMax!).
|
||||||
NonPhysicalPrimMax = 256
|
NonPhysicalPrimMax = 256
|
||||||
|
|
||||||
; Maximum size of physical prims. Affects resizing of existing prims. This can be overriden in the region config file.
|
; Maximum size of physical prims. Affects resizing of existing prims. This can be overridden in the region config file.
|
||||||
PhysicalPrimMax = 64
|
PhysicalPrimMax = 64
|
||||||
|
|
||||||
; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
||||||
; This can be overriden in the region config file.
|
; This can be overridden in the region config file.
|
||||||
ClampPrimSize = false
|
ClampPrimSize = false
|
||||||
|
|
||||||
; Maximum number of prims allowable in a linkset. Affects creating new linksets. Ignored if less than or equal to zero.
|
; Maximum number of prims allowable in a linkset. Affects creating new linksets. Ignored if less than or equal to zero.
|
||||||
; This can be overriden in the region config file.
|
; This can be overridden in the region config file.
|
||||||
LinksetPrims = 0
|
LinksetPrims = 0
|
||||||
|
|
||||||
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. State is reloaded on the destination region.
|
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. State is reloaded on the destination region.
|
||||||
|
@ -522,7 +522,7 @@
|
||||||
enable_adaptive_throttles = true
|
enable_adaptive_throttles = true
|
||||||
|
|
||||||
; Per-client bytes per second rates for the various throttle categories.
|
; Per-client bytes per second rates for the various throttle categories.
|
||||||
; These are default values that will be overriden by clients. These
|
; These are default values that will be overridden by clients. These
|
||||||
; defaults are approximately equivalent to the throttles set by the Imprudence
|
; defaults are approximately equivalent to the throttles set by the Imprudence
|
||||||
; viewer when maximum bandwidth is set to 350kbps
|
; viewer when maximum bandwidth is set to 350kbps
|
||||||
|
|
||||||
|
@ -1420,8 +1420,8 @@
|
||||||
; Default language for scripts
|
; Default language for scripts
|
||||||
DefaultCompileLanguage = lsl
|
DefaultCompileLanguage = lsl
|
||||||
|
|
||||||
; List of allowed languages (lsl,vb,js,cs)
|
; List of allowed languages (lsl,vb,cs)
|
||||||
; AllowedCompilers=lsl,cs,js,vb.
|
; AllowedCompilers=lsl,cs,vb
|
||||||
; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk.
|
; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk.
|
||||||
AllowedCompilers=lsl
|
AllowedCompilers=lsl
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,17 @@
|
||||||
</layout>
|
</layout>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
|
||||||
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
||||||
<file value="Robust.32BitLaunch.log" />
|
<file value="log/Robust.32BitLaunch.log" />
|
||||||
<appendToFile value="true" />
|
|
||||||
<rollingStyle value="Date" />
|
<rollingStyle value="Date" />
|
||||||
<datePattern value="'.'yyyy-MM-dd"/>
|
<datePattern value="'.'yyyy-MM-dd"/>
|
||||||
|
...
|
||||||
|
-->
|
||||||
|
|
||||||
|
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
|
||||||
|
<file value="Robust.32BitLaunch.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
<filter type="log4net.Filter.LoggerMatchFilter">
|
<filter type="log4net.Filter.LoggerMatchFilter">
|
||||||
<loggerToMatch value="special"/>
|
<loggerToMatch value="special"/>
|
||||||
<acceptOnMatch value="false"/>
|
<acceptOnMatch value="false"/>
|
||||||
|
|
|
@ -21,11 +21,17 @@
|
||||||
</layout>
|
</layout>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
|
||||||
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
|
||||||
<file value="Robust.log" />
|
<file value="log/Robust.log" />
|
||||||
<appendToFile value="true" />
|
|
||||||
<rollingStyle value="Date" />
|
<rollingStyle value="Date" />
|
||||||
<datePattern value="'.'yyyy-MM-dd"/>
|
<datePattern value="'.'yyyy-MM-dd"/>
|
||||||
|
...
|
||||||
|
-->
|
||||||
|
|
||||||
|
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
|
||||||
|
<file value="Robust.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
<filter type="log4net.Filter.LoggerMatchFilter">
|
<filter type="log4net.Filter.LoggerMatchFilter">
|
||||||
<loggerToMatch value="special"/>
|
<loggerToMatch value="special"/>
|
||||||
<acceptOnMatch value="false"/>
|
<acceptOnMatch value="false"/>
|
||||||
|
|
32
prebuild.xml
32
prebuild.xml
|
@ -2221,38 +2221,6 @@
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
<Project frameworkVersion="v4_0" name="OpenSim.Region.ScriptEngine.Shared.YieldProlog" path="OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/" type="Library">
|
|
||||||
<Configuration name="Debug">
|
|
||||||
<Options>
|
|
||||||
<OutputPath>../../../../../../../bin/</OutputPath>
|
|
||||||
</Options>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration name="Release">
|
|
||||||
<Options>
|
|
||||||
<OutputPath>../../../../../../../bin/</OutputPath>
|
|
||||||
</Options>
|
|
||||||
</Configuration>
|
|
||||||
|
|
||||||
<ReferencePath>../../../../../../../bin/</ReferencePath>
|
|
||||||
<Reference name="System"/>
|
|
||||||
<Reference name="System.Data"/>
|
|
||||||
<Reference name="System.Web"/>
|
|
||||||
<Reference name="System.Xml"/>
|
|
||||||
<Reference name="OpenMetaverseTypes" path="../../../../../../../bin/"/>
|
|
||||||
<Reference name="OpenSim"/>
|
|
||||||
<Reference name="OpenSim.Framework"/>
|
|
||||||
<Reference name="OpenSim.Framework.Communications"/>
|
|
||||||
<Reference name="OpenSim.Region.CoreModules"/>
|
|
||||||
<Reference name="OpenSim.Framework.Console"/>
|
|
||||||
<Reference name="OpenSim.Region.ScriptEngine.Shared"/>
|
|
||||||
<Reference name="Nini" path="../../../../../../../bin/"/>
|
|
||||||
<Reference name="log4net" path="../../../../../../../bin/"/>
|
|
||||||
|
|
||||||
<Files>
|
|
||||||
<Match pattern="*.cs" recurse="false"/>
|
|
||||||
</Files>
|
|
||||||
</Project>
|
|
||||||
|
|
||||||
<Project frameworkVersion="v4_0" name="OpenSim.Region.ScriptEngine.Shared.Api" path="OpenSim/Region/ScriptEngine/Shared/Api/Implementation" type="Library">
|
<Project frameworkVersion="v4_0" name="OpenSim.Region.ScriptEngine.Shared.Api" path="OpenSim/Region/ScriptEngine/Shared/Api/Implementation" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
|
Loading…
Reference in New Issue