mirror of
https://github.com/opensim/opensim.git
synced 2026-08-12 12:25:42 +08:00
* Applied patch from Melanie, mantis issue #1581 - "Refactor LSL language, api and compiler out of XEngine"
"First stage in a major Script Engine refactor, that will result in the LSL implementaions ebing reconverged. Not there yet, but one major part is done." Thank you, Melanie!
This commit is contained in:
421
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
Normal file
421
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
Normal file
@@ -0,0 +1,421 @@
|
||||
/*
|
||||
* 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 OpenSim 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 vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
|
||||
using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public partial class ScriptBaseClass : MarshalByRefObject
|
||||
{
|
||||
// LSL CONSTANTS
|
||||
public const int TRUE = 1;
|
||||
public const int FALSE = 0;
|
||||
|
||||
public const int STATUS_PHYSICS = 1;
|
||||
public const int STATUS_ROTATE_X = 2;
|
||||
public const int STATUS_ROTATE_Y = 4;
|
||||
public const int STATUS_ROTATE_Z = 8;
|
||||
public const int STATUS_PHANTOM = 16;
|
||||
public const int STATUS_SANDBOX = 32;
|
||||
public const int STATUS_BLOCK_GRAB = 64;
|
||||
public const int STATUS_DIE_AT_EDGE = 128;
|
||||
public const int STATUS_RETURN_AT_EDGE = 256;
|
||||
public const int STATUS_CAST_SHADOWS = 512;
|
||||
|
||||
public const int AGENT = 1;
|
||||
public const int ACTIVE = 2;
|
||||
public const int PASSIVE = 4;
|
||||
public const int SCRIPTED = 8;
|
||||
|
||||
public const int CONTROL_FWD = 1;
|
||||
public const int CONTROL_BACK = 2;
|
||||
public const int CONTROL_LEFT = 4;
|
||||
public const int CONTROL_RIGHT = 8;
|
||||
public const int CONTROL_UP = 16;
|
||||
public const int CONTROL_DOWN = 32;
|
||||
public const int CONTROL_ROT_LEFT = 256;
|
||||
public const int CONTROL_ROT_RIGHT = 512;
|
||||
public const int CONTROL_LBUTTON = 268435456;
|
||||
public const int CONTROL_ML_LBUTTON = 1073741824;
|
||||
|
||||
//Permissions
|
||||
public const int PERMISSION_DEBIT = 2;
|
||||
public const int PERMISSION_TAKE_CONTROLS = 4;
|
||||
public const int PERMISSION_REMAP_CONTROLS = 8;
|
||||
public const int PERMISSION_TRIGGER_ANIMATION = 16;
|
||||
public const int PERMISSION_ATTACH = 32;
|
||||
public const int PERMISSION_RELEASE_OWNERSHIP = 64;
|
||||
public const int PERMISSION_CHANGE_LINKS = 128;
|
||||
public const int PERMISSION_CHANGE_JOINTS = 256;
|
||||
public const int PERMISSION_CHANGE_PERMISSIONS = 512;
|
||||
public const int PERMISSION_TRACK_CAMERA = 1024;
|
||||
|
||||
public const int AGENT_FLYING = 1;
|
||||
public const int AGENT_ATTACHMENTS = 2;
|
||||
public const int AGENT_SCRIPTED = 4;
|
||||
public const int AGENT_MOUSELOOK = 8;
|
||||
public const int AGENT_SITTING = 16;
|
||||
public const int AGENT_ON_OBJECT = 32;
|
||||
public const int AGENT_AWAY = 64;
|
||||
public const int AGENT_WALKING = 128;
|
||||
public const int AGENT_IN_AIR = 256;
|
||||
public const int AGENT_TYPING = 512;
|
||||
public const int AGENT_CROUCHING = 1024;
|
||||
public const int AGENT_BUSY = 2048;
|
||||
public const int AGENT_ALWAYS_RUN = 4096;
|
||||
|
||||
//Particle Systems
|
||||
public const int PSYS_PART_INTERP_COLOR_MASK = 1;
|
||||
public const int PSYS_PART_INTERP_SCALE_MASK = 2;
|
||||
public const int PSYS_PART_BOUNCE_MASK = 4;
|
||||
public const int PSYS_PART_WIND_MASK = 8;
|
||||
public const int PSYS_PART_FOLLOW_SRC_MASK = 16;
|
||||
public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32;
|
||||
public const int PSYS_PART_TARGET_POS_MASK = 64;
|
||||
public const int PSYS_PART_TARGET_LINEAR_MASK = 128;
|
||||
public const int PSYS_PART_EMISSIVE_MASK = 256;
|
||||
public const int PSYS_PART_FLAGS = 0;
|
||||
public const int PSYS_PART_START_COLOR = 1;
|
||||
public const int PSYS_PART_START_ALPHA = 2;
|
||||
public const int PSYS_PART_END_COLOR = 3;
|
||||
public const int PSYS_PART_END_ALPHA = 4;
|
||||
public const int PSYS_PART_START_SCALE = 5;
|
||||
public const int PSYS_PART_END_SCALE = 6;
|
||||
public const int PSYS_PART_MAX_AGE = 7;
|
||||
public const int PSYS_SRC_ACCEL = 8;
|
||||
public const int PSYS_SRC_PATTERN = 9;
|
||||
public const int PSYS_SRC_INNERANGLE = 10;
|
||||
public const int PSYS_SRC_OUTERANGLE = 11;
|
||||
public const int PSYS_SRC_TEXTURE = 12;
|
||||
public const int PSYS_SRC_BURST_RATE = 13;
|
||||
public const int PSYS_SRC_BURST_PART_COUNT = 15;
|
||||
public const int PSYS_SRC_BURST_RADIUS = 16;
|
||||
public const int PSYS_SRC_BURST_SPEED_MIN = 17;
|
||||
public const int PSYS_SRC_BURST_SPEED_MAX = 18;
|
||||
public const int PSYS_SRC_MAX_AGE = 19;
|
||||
public const int PSYS_SRC_TARGET_KEY = 20;
|
||||
public const int PSYS_SRC_OMEGA = 21;
|
||||
public const int PSYS_SRC_ANGLE_BEGIN = 22;
|
||||
public const int PSYS_SRC_ANGLE_END = 23;
|
||||
public const int PSYS_SRC_PATTERN_DROP = 1;
|
||||
public const int PSYS_SRC_PATTERN_EXPLODE = 2;
|
||||
public const int PSYS_SRC_PATTERN_ANGLE = 4;
|
||||
public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8;
|
||||
public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16;
|
||||
|
||||
public const int VEHICLE_TYPE_NONE = 0;
|
||||
public const int VEHICLE_TYPE_SLED = 1;
|
||||
public const int VEHICLE_TYPE_CAR = 2;
|
||||
public const int VEHICLE_TYPE_BOAT = 3;
|
||||
public const int VEHICLE_TYPE_AIRPLANE = 4;
|
||||
public const int VEHICLE_TYPE_BALLOON = 5;
|
||||
public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16;
|
||||
public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17;
|
||||
public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18;
|
||||
public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20;
|
||||
public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19;
|
||||
public const int VEHICLE_HOVER_HEIGHT = 24;
|
||||
public const int VEHICLE_HOVER_EFFICIENCY = 25;
|
||||
public const int VEHICLE_HOVER_TIMESCALE = 26;
|
||||
public const int VEHICLE_BUOYANCY = 27;
|
||||
public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28;
|
||||
public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29;
|
||||
public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30;
|
||||
public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31;
|
||||
public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32;
|
||||
public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33;
|
||||
public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34;
|
||||
public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35;
|
||||
public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36;
|
||||
public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37;
|
||||
public const int VEHICLE_BANKING_EFFICIENCY = 38;
|
||||
public const int VEHICLE_BANKING_MIX = 39;
|
||||
public const int VEHICLE_BANKING_TIMESCALE = 40;
|
||||
public const int VEHICLE_REFERENCE_FRAME = 44;
|
||||
public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1;
|
||||
public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2;
|
||||
public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4;
|
||||
public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8;
|
||||
public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16;
|
||||
public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32;
|
||||
public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64;
|
||||
public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128;
|
||||
public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256;
|
||||
public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512;
|
||||
|
||||
public const int INVENTORY_ALL = -1;
|
||||
public const int INVENTORY_NONE = -1;
|
||||
public const int INVENTORY_TEXTURE = 0;
|
||||
public const int INVENTORY_SOUND = 1;
|
||||
public const int INVENTORY_LANDMARK = 3;
|
||||
public const int INVENTORY_CLOTHING = 5;
|
||||
public const int INVENTORY_OBJECT = 6;
|
||||
public const int INVENTORY_NOTECARD = 7;
|
||||
public const int INVENTORY_SCRIPT = 10;
|
||||
public const int INVENTORY_BODYPART = 13;
|
||||
public const int INVENTORY_ANIMATION = 20;
|
||||
public const int INVENTORY_GESTURE = 21;
|
||||
|
||||
public const int ATTACH_CHEST = 1;
|
||||
public const int ATTACH_HEAD = 2;
|
||||
public const int ATTACH_LSHOULDER = 3;
|
||||
public const int ATTACH_RSHOULDER = 4;
|
||||
public const int ATTACH_LHAND = 5;
|
||||
public const int ATTACH_RHAND = 6;
|
||||
public const int ATTACH_LFOOT = 7;
|
||||
public const int ATTACH_RFOOT = 8;
|
||||
public const int ATTACH_BACK = 9;
|
||||
public const int ATTACH_PELVIS = 10;
|
||||
public const int ATTACH_MOUTH = 11;
|
||||
public const int ATTACH_CHIN = 12;
|
||||
public const int ATTACH_LEAR = 13;
|
||||
public const int ATTACH_REAR = 14;
|
||||
public const int ATTACH_LEYE = 15;
|
||||
public const int ATTACH_REYE = 16;
|
||||
public const int ATTACH_NOSE = 17;
|
||||
public const int ATTACH_RUARM = 18;
|
||||
public const int ATTACH_RLARM = 19;
|
||||
public const int ATTACH_LUARM = 20;
|
||||
public const int ATTACH_LLARM = 21;
|
||||
public const int ATTACH_RHIP = 22;
|
||||
public const int ATTACH_RULEG = 23;
|
||||
public const int ATTACH_RLLEG = 24;
|
||||
public const int ATTACH_LHIP = 25;
|
||||
public const int ATTACH_LULEG = 26;
|
||||
public const int ATTACH_LLLEG = 27;
|
||||
public const int ATTACH_BELLY = 28;
|
||||
public const int ATTACH_RPEC = 29;
|
||||
public const int ATTACH_LPEC = 30;
|
||||
|
||||
public const int LAND_LEVEL = 0;
|
||||
public const int LAND_RAISE = 1;
|
||||
public const int LAND_LOWER = 2;
|
||||
public const int LAND_SMOOTH = 3;
|
||||
public const int LAND_NOISE = 4;
|
||||
public const int LAND_REVERT = 5;
|
||||
public const int LAND_SMALL_BRUSH = 1;
|
||||
public const int LAND_MEDIUM_BRUSH = 2;
|
||||
public const int LAND_LARGE_BRUSH = 3;
|
||||
|
||||
//Agent Dataserver
|
||||
public const int DATA_ONLINE = 1;
|
||||
public const int DATA_NAME = 2;
|
||||
public const int DATA_BORN = 3;
|
||||
public const int DATA_RATING = 4;
|
||||
public const int DATA_SIM_POS = 5;
|
||||
public const int DATA_SIM_STATUS = 6;
|
||||
public const int DATA_SIM_RATING = 7;
|
||||
public const int DATA_PAYINFO = 8;
|
||||
|
||||
public const int ANIM_ON = 1;
|
||||
public const int LOOP = 2;
|
||||
public const int REVERSE = 4;
|
||||
public const int PING_PONG = 8;
|
||||
public const int SMOOTH = 16;
|
||||
public const int ROTATE = 32;
|
||||
public const int SCALE = 64;
|
||||
public const int ALL_SIDES = -1;
|
||||
public const int LINK_SET = -1;
|
||||
public const int LINK_ROOT = 1;
|
||||
public const int LINK_ALL_OTHERS = -2;
|
||||
public const int LINK_ALL_CHILDREN = -3;
|
||||
public const int LINK_THIS = -4;
|
||||
public const int CHANGED_INVENTORY = 1;
|
||||
public const int CHANGED_COLOR = 2;
|
||||
public const int CHANGED_SHAPE = 4;
|
||||
public const int CHANGED_SCALE = 8;
|
||||
public const int CHANGED_TEXTURE = 16;
|
||||
public const int CHANGED_LINK = 32;
|
||||
public const int CHANGED_ALLOWED_DROP = 64;
|
||||
public const int CHANGED_OWNER = 128;
|
||||
public const int CHANGED_REGION_RESTART = 256;
|
||||
public const int TYPE_INVALID = 0;
|
||||
public const int TYPE_INTEGER = 1;
|
||||
public const int TYPE_double = 2;
|
||||
public const int TYPE_STRING = 3;
|
||||
public const int TYPE_KEY = 4;
|
||||
public const int TYPE_VECTOR = 5;
|
||||
public const int TYPE_ROTATION = 6;
|
||||
|
||||
//XML RPC Remote Data Channel
|
||||
public const int REMOTE_DATA_CHANNEL = 1;
|
||||
public const int REMOTE_DATA_REQUEST = 2;
|
||||
public const int REMOTE_DATA_REPLY = 3;
|
||||
|
||||
//llHTTPRequest
|
||||
public const int HTTP_METHOD = 0;
|
||||
public const int HTTP_MIMETYPE = 1;
|
||||
public const int HTTP_BODY_MAXLENGTH = 2;
|
||||
public const int HTTP_VERIFY_CERT = 3;
|
||||
|
||||
public const int PRIM_MATERIAL = 2;
|
||||
public const int PRIM_PHYSICS = 3;
|
||||
public const int PRIM_TEMP_ON_REZ = 4;
|
||||
public const int PRIM_PHANTOM = 5;
|
||||
public const int PRIM_POSITION = 6;
|
||||
public const int PRIM_SIZE = 7;
|
||||
public const int PRIM_ROTATION = 8;
|
||||
public const int PRIM_TYPE = 9;
|
||||
public const int PRIM_TEXTURE = 17;
|
||||
public const int PRIM_COLOR = 18;
|
||||
public const int PRIM_BUMP_SHINY = 19;
|
||||
public const int PRIM_FULLBRIGHT = 20;
|
||||
public const int PRIM_FLEXIBLE = 21;
|
||||
public const int PRIM_TEXGEN = 22;
|
||||
public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake
|
||||
public const int PRIM_POINT_LIGHT = 23; // Huh?
|
||||
public const int PRIM_TEXGEN_DEFAULT = 0;
|
||||
public const int PRIM_TEXGEN_PLANAR = 1;
|
||||
|
||||
public const int PRIM_TYPE_BOX = 0;
|
||||
public const int PRIM_TYPE_CYLINDER = 1;
|
||||
public const int PRIM_TYPE_PRISM = 2;
|
||||
public const int PRIM_TYPE_SPHERE = 3;
|
||||
public const int PRIM_TYPE_TORUS = 4;
|
||||
public const int PRIM_TYPE_TUBE = 5;
|
||||
public const int PRIM_TYPE_RING = 6;
|
||||
public const int PRIM_TYPE_SCULPT = 7;
|
||||
|
||||
public const int PRIM_HOLE_DEFAULT = 0;
|
||||
public const int PRIM_HOLE_CIRCLE = 16;
|
||||
public const int PRIM_HOLE_SQUARE = 32;
|
||||
public const int PRIM_HOLE_TRIANGLE = 48;
|
||||
|
||||
public const int PRIM_MATERIAL_STONE = 0;
|
||||
public const int PRIM_MATERIAL_METAL = 1;
|
||||
public const int PRIM_MATERIAL_GLASS = 2;
|
||||
public const int PRIM_MATERIAL_WOOD = 3;
|
||||
public const int PRIM_MATERIAL_FLESH = 4;
|
||||
public const int PRIM_MATERIAL_PLASTIC = 5;
|
||||
public const int PRIM_MATERIAL_RUBBER = 6;
|
||||
public const int PRIM_MATERIAL_LIGHT = 7;
|
||||
|
||||
public const int PRIM_SHINY_NONE = 0;
|
||||
public const int PRIM_SHINY_LOW = 1;
|
||||
public const int PRIM_SHINY_MEDIUM = 2;
|
||||
public const int PRIM_SHINY_HIGH = 3;
|
||||
public const int PRIM_BUMP_NONE = 0;
|
||||
public const int PRIM_BUMP_BRIGHT = 1;
|
||||
public const int PRIM_BUMP_DARK = 2;
|
||||
public const int PRIM_BUMP_WOOD = 3;
|
||||
public const int PRIM_BUMP_BARK = 4;
|
||||
public const int PRIM_BUMP_BRICKS = 5;
|
||||
public const int PRIM_BUMP_CHECKER = 6;
|
||||
public const int PRIM_BUMP_CONCRETE = 7;
|
||||
public const int PRIM_BUMP_TILE = 8;
|
||||
public const int PRIM_BUMP_STONE = 9;
|
||||
public const int PRIM_BUMP_DISKS = 10;
|
||||
public const int PRIM_BUMP_GRAVEL = 11;
|
||||
public const int PRIM_BUMP_BLOBS = 12;
|
||||
public const int PRIM_BUMP_SIDING = 13;
|
||||
public const int PRIM_BUMP_LARGETILE = 14;
|
||||
public const int PRIM_BUMP_STUCCO = 15;
|
||||
public const int PRIM_BUMP_SUCTION = 16;
|
||||
public const int PRIM_BUMP_WEAVE = 17;
|
||||
|
||||
public const int PRIM_SCULPT_TYPE_SPHERE = 1;
|
||||
public const int PRIM_SCULPT_TYPE_TORUS = 2;
|
||||
public const int PRIM_SCULPT_TYPE_PLANE = 3;
|
||||
public const int PRIM_SCULPT_TYPE_CYLINDER = 4;
|
||||
|
||||
public const int MASK_BASE = 0;
|
||||
public const int MASK_OWNER = 1;
|
||||
public const int MASK_GROUP = 2;
|
||||
public const int MASK_EVERYONE = 3;
|
||||
public const int MASK_NEXT = 4;
|
||||
|
||||
public const int PERM_TRANSFER = 8192;
|
||||
public const int PERM_MODIFY = 16384;
|
||||
public const int PERM_COPY = 32768;
|
||||
public const int PERM_MOVE = 524288;
|
||||
public const int PERM_ALL = 2147483647;
|
||||
|
||||
public const int PARCEL_MEDIA_COMMAND_STOP = 0;
|
||||
public const int PARCEL_MEDIA_COMMAND_PAUSE = 1;
|
||||
public const int PARCEL_MEDIA_COMMAND_PLAY = 2;
|
||||
public const int PARCEL_MEDIA_COMMAND_LOOP = 3;
|
||||
public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4;
|
||||
public const int PARCEL_MEDIA_COMMAND_URL = 5;
|
||||
public const int PARCEL_MEDIA_COMMAND_TIME = 6;
|
||||
public const int PARCEL_MEDIA_COMMAND_AGENT = 7;
|
||||
public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8;
|
||||
public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
|
||||
|
||||
public const int PAY_HIDE = -1;
|
||||
public const int PAY_DEFAULT = -2;
|
||||
|
||||
public const string NULL_KEY = "00000000-0000-0000-0000-000000000000";
|
||||
public const string EOF = "\n\n\n";
|
||||
public const double PI = 3.14159274f;
|
||||
public const double TWO_PI = 6.28318548f;
|
||||
public const double PI_BY_TWO = 1.57079637f;
|
||||
public const double DEG_TO_RAD = 0.01745329238f;
|
||||
public const double RAD_TO_DEG = 57.29578f;
|
||||
public const double SQRT2 = 1.414213538f;
|
||||
public const int STRING_TRIM_HEAD = 1;
|
||||
public const int STRING_TRIM_TAIL = 2;
|
||||
public const int STRING_TRIM = 3;
|
||||
public const int LIST_STAT_RANGE = 0;
|
||||
public const int LIST_STAT_MIN = 1;
|
||||
public const int LIST_STAT_MAX = 2;
|
||||
public const int LIST_STAT_MEAN = 3;
|
||||
public const int LIST_STAT_MEDIAN = 4;
|
||||
public const int LIST_STAT_STD_DEV = 5;
|
||||
public const int LIST_STAT_SUM = 6;
|
||||
public const int LIST_STAT_SUM_SQUARES = 7;
|
||||
public const int LIST_STAT_NUM_COUNT = 8;
|
||||
public const int LIST_STAT_GEOMETRIC_MEAN = 9;
|
||||
public const int LIST_STAT_HARMONIC_MEAN = 100;
|
||||
|
||||
//ParcelPrim Categories
|
||||
public const int PARCEL_COUNT_TOTAL = 0;
|
||||
public const int PARCEL_COUNT_OWNER = 1;
|
||||
public const int PARCEL_COUNT_GROUP = 2;
|
||||
public const int PARCEL_COUNT_OTHER = 3;
|
||||
public const int PARCEL_COUNT_SELECTED = 4;
|
||||
public const int PARCEL_COUNT_TEMP = 5;
|
||||
|
||||
public const int DEBUG_CHANNEL = 0x7FFFFFFF;
|
||||
public const int PUBLIC_CHANNEL = 0x00000000;
|
||||
|
||||
public const int OBJECT_NAME = 1;
|
||||
public const int OBJECT_DESC = 2;
|
||||
public const int OBJECT_POS = 3;
|
||||
public const int OBJECT_ROT = 4;
|
||||
public const int OBJECT_VELOCITY = 5;
|
||||
public const int OBJECT_OWNER = 6;
|
||||
public const int OBJECT_GROUP = 7;
|
||||
public const int OBJECT_CREATOR = 8;
|
||||
|
||||
// Can not be public const?
|
||||
public vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0);
|
||||
public rotation ZERO_ROTATION = new rotation(0.0, 0, 0.0, 1.0);
|
||||
|
||||
}
|
||||
}
|
||||
1732
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
Normal file
1732
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
Normal file
File diff suppressed because it is too large
Load Diff
199
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
Normal file
199
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
Normal file
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
* 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 OpenSim 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.Runtime.Remoting.Lifetime;
|
||||
using System.Threading;
|
||||
using System.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using OpenSim.Region.Environment.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
|
||||
using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
|
||||
using key = System.String;
|
||||
using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
|
||||
using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public partial class ScriptBaseClass : MarshalByRefObject
|
||||
{
|
||||
public IOSSL_Api m_OSSL_Functions;
|
||||
|
||||
public void ApiTypeOSSL(IScriptApi api)
|
||||
{
|
||||
if(!(api is IOSSL_Api))
|
||||
return;
|
||||
|
||||
m_OSSL_Functions = (IOSSL_Api)api;
|
||||
}
|
||||
|
||||
public void osSetRegionWaterHeight(double height)
|
||||
{
|
||||
m_OSSL_Functions.osSetRegionWaterHeight(height);
|
||||
}
|
||||
|
||||
public double osList2Double(LSL_Types.list src, int index)
|
||||
{
|
||||
return m_OSSL_Functions.osList2Double(src, index);
|
||||
}
|
||||
|
||||
public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams,
|
||||
int timer)
|
||||
{
|
||||
return m_OSSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer);
|
||||
}
|
||||
|
||||
public string osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams,
|
||||
int timer)
|
||||
{
|
||||
return m_OSSL_Functions.osSetDynamicTextureData(dynamicID, contentType, data, extraParams, timer);
|
||||
}
|
||||
|
||||
public string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams,
|
||||
int timer, int alpha)
|
||||
{
|
||||
return m_OSSL_Functions.osSetDynamicTextureURLBlend(dynamicID, contentType, url, extraParams, timer, alpha);
|
||||
}
|
||||
|
||||
public string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams,
|
||||
int timer, int alpha)
|
||||
{
|
||||
return m_OSSL_Functions.osSetDynamicTextureDataBlend(dynamicID, contentType, data, extraParams, timer, alpha);
|
||||
}
|
||||
|
||||
public double osTerrainGetHeight(int x, int y)
|
||||
{
|
||||
return m_OSSL_Functions.osTerrainGetHeight(x, y);
|
||||
}
|
||||
|
||||
public int osTerrainSetHeight(int x, int y, double val)
|
||||
{
|
||||
return m_OSSL_Functions.osTerrainSetHeight(x, y, val);
|
||||
}
|
||||
|
||||
public int osRegionRestart(double seconds)
|
||||
{
|
||||
return m_OSSL_Functions.osRegionRestart(seconds);
|
||||
}
|
||||
|
||||
public void osRegionNotice(string msg)
|
||||
{
|
||||
m_OSSL_Functions.osRegionNotice(msg);
|
||||
}
|
||||
|
||||
public bool osConsoleCommand(string Command)
|
||||
{
|
||||
return m_OSSL_Functions.osConsoleCommand(Command);
|
||||
}
|
||||
|
||||
public void osSetParcelMediaURL(string url)
|
||||
{
|
||||
m_OSSL_Functions.osSetParcelMediaURL(url);
|
||||
}
|
||||
|
||||
public void osSetPrimFloatOnWater(int floatYN)
|
||||
{
|
||||
m_OSSL_Functions.osSetPrimFloatOnWater(floatYN);
|
||||
}
|
||||
|
||||
// Animation Functions
|
||||
|
||||
public void osAvatarPlayAnimation(string avatar, string animation)
|
||||
{
|
||||
m_OSSL_Functions.osAvatarPlayAnimation(avatar, animation);
|
||||
}
|
||||
|
||||
public void osAvatarStopAnimation(string avatar, string animation)
|
||||
{
|
||||
m_OSSL_Functions.osAvatarStopAnimation(avatar, animation);
|
||||
}
|
||||
|
||||
|
||||
//Texture Draw functions
|
||||
|
||||
public string osMovePen(string drawList, int x, int y)
|
||||
{
|
||||
return m_OSSL_Functions.osMovePen(drawList, x, y);
|
||||
}
|
||||
|
||||
public string osDrawLine(string drawList, int startX, int startY, int endX, int endY)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawLine(drawList, startX, startY, endX, endY);
|
||||
}
|
||||
|
||||
public string osDrawLine(string drawList, int endX, int endY)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawLine(drawList, endX, endY);
|
||||
}
|
||||
|
||||
public string osDrawText(string drawList, string text)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawText(drawList, text);
|
||||
}
|
||||
|
||||
public string osDrawEllipse(string drawList, int width, int height)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawEllipse(drawList, width, height);
|
||||
}
|
||||
|
||||
public string osDrawRectangle(string drawList, int width, int height)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawRectangle(drawList, width, height);
|
||||
}
|
||||
|
||||
public string osDrawFilledRectangle(string drawList, int width, int height)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawFilledRectangle(drawList, width, height);
|
||||
}
|
||||
|
||||
public string osSetFontSize(string drawList, int fontSize)
|
||||
{
|
||||
return m_OSSL_Functions.osSetFontSize(drawList, fontSize);
|
||||
}
|
||||
|
||||
public string osSetPenSize(string drawList, int penSize)
|
||||
{
|
||||
return m_OSSL_Functions.osSetPenSize(drawList, penSize);
|
||||
}
|
||||
|
||||
public string osSetPenColour(string drawList, string colour)
|
||||
{
|
||||
return m_OSSL_Functions.osSetPenColour(drawList, colour);
|
||||
}
|
||||
|
||||
public string osDrawImage(string drawList, int width, int height, string imageUrl)
|
||||
{
|
||||
return m_OSSL_Functions.osDrawImage(drawList, width, height, imageUrl);
|
||||
}
|
||||
public void osSetStateEvents(int events)
|
||||
{
|
||||
m_OSSL_Functions.osSetStateEvents(events);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||
<PropertyGroup>
|
||||
<ProjectType>Local</ProjectType>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{21BC44EA-0000-0000-0000-000000000000}</ProjectGuid>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ApplicationIcon></ApplicationIcon>
|
||||
<AssemblyKeyContainerName>
|
||||
</AssemblyKeyContainerName>
|
||||
<AssemblyName>OpenSim.Region.ScriptEngine.Shared.Api.Runtime</AssemblyName>
|
||||
<DefaultClientScript>JScript</DefaultClientScript>
|
||||
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
|
||||
<DefaultTargetSchema>IE50</DefaultTargetSchema>
|
||||
<DelaySign>false</DelaySign>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder></AppDesignerFolder>
|
||||
<RootNamespace>OpenSim.Region.ScriptEngine.Shared.Api.Runtime</RootNamespace>
|
||||
<StartupObject></StartupObject>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||
<DocumentationFile></DocumentationFile>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<Optimize>False</Optimize>
|
||||
<OutputPath>..\..\..\..\..\..\bin\</OutputPath>
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>False</RemoveIntegerChecks>
|
||||
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn></NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DocumentationFile></DocumentationFile>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<Optimize>True</Optimize>
|
||||
<OutputPath>..\..\..\..\..\..\bin\</OutputPath>
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>False</RemoveIntegerChecks>
|
||||
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoWarn></NoWarn>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Axiom.MathLib.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="libsecondlife.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\libsecondlife.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="log4net.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\log4net.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Nini.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\Nini.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Nini.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\Nini.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="RAIL.dll" >
|
||||
<HintPath>..\..\..\..\..\..\bin\RAIL.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" >
|
||||
<HintPath>System.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Data" >
|
||||
<HintPath>System.Data.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Web" >
|
||||
<HintPath>System.Web.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml" >
|
||||
<HintPath>System.Xml.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\..\Application\OpenSim.csproj">
|
||||
<Name>OpenSim</Name>
|
||||
<Project>{438A9556-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\..\..\Framework\OpenSim.Framework.csproj">
|
||||
<Name>OpenSim.Framework</Name>
|
||||
<Project>{8ACA2445-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\..\..\Framework\Communications\OpenSim.Framework.Communications.csproj">
|
||||
<Name>OpenSim.Framework.Communications</Name>
|
||||
<Project>{CB52B7E7-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\..\..\Framework\Console\OpenSim.Framework.Console.csproj">
|
||||
<Name>OpenSim.Framework.Console</Name>
|
||||
<Project>{A7CD0630-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\..\Environment\OpenSim.Region.Environment.csproj">
|
||||
<Name>OpenSim.Region.Environment</Name>
|
||||
<Project>{DCBA491C-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\OpenSim.Region.ScriptEngine.Shared.csproj">
|
||||
<Name>OpenSim.Region.ScriptEngine.Shared</Name>
|
||||
<Project>{D9F1B557-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="LSL_Constants.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="LSL_Stub.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="OSSL_Stub.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ScriptBase.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,12 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ReferencePath>C:\Data\OpenSim\bin\</ReferencePath>
|
||||
<LastOpenVersion>9.0.21022</LastOpenVersion>
|
||||
<ProjectView>ProjectFiles</ProjectView>
|
||||
<ProjectTrust>0</ProjectTrust>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " />
|
||||
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
|
||||
</Project>
|
||||
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" ?>
|
||||
<project name="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" default="build">
|
||||
<target name="build">
|
||||
<echo message="Build Directory is ${project::get-base-directory()}/${build.dir}" />
|
||||
<mkdir dir="${project::get-base-directory()}/${build.dir}" />
|
||||
<copy todir="${project::get-base-directory()}/${build.dir}" flatten="true">
|
||||
<fileset basedir="${project::get-base-directory()}">
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${project::get-base-directory()}/${build.dir}">
|
||||
<fileset basedir=".">
|
||||
</fileset>
|
||||
</copy>
|
||||
<csc target="library" debug="${build.debug}" unsafe="False" warnaserror="False" define="TRACE;DEBUG" main="" output="${project::get-base-directory()}/${build.dir}/${project::get-name()}.dll">
|
||||
<resources prefix="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" dynamicprefix="true" >
|
||||
</resources>
|
||||
<sources failonempty="true">
|
||||
<include name="LSL_Constants.cs" />
|
||||
<include name="LSL_Stub.cs" />
|
||||
<include name="OSSL_Stub.cs" />
|
||||
<include name="ScriptBase.cs" />
|
||||
</sources>
|
||||
<references basedir="${project::get-base-directory()}">
|
||||
<lib>
|
||||
<include name="${project::get-base-directory()}" />
|
||||
<include name="${project::get-base-directory()}/${build.dir}" />
|
||||
</lib>
|
||||
<include name="../../../../../../bin/Axiom.MathLib.dll" />
|
||||
<include name="../../../../../../bin/libsecondlife.dll" />
|
||||
<include name="../../../../../../bin/log4net.dll" />
|
||||
<include name="../../../../../../bin/Nini.dll" />
|
||||
<include name="../../../../../../bin/Nini.dll" />
|
||||
<include name="../../../../../../bin/OpenSim.exe" />
|
||||
<include name="../../../../../../bin/OpenSim.Framework.dll" />
|
||||
<include name="../../../../../../bin/OpenSim.Framework.Communications.dll" />
|
||||
<include name="../../../../../../bin/OpenSim.Framework.Console.dll" />
|
||||
<include name="../../../../../../bin/OpenSim.Region.Environment.dll" />
|
||||
<include name="../../../../../../bin/OpenSim.Region.ScriptEngine.Shared.dll" />
|
||||
<include name="../../../../../../bin/RAIL.dll" />
|
||||
<include name="System.dll" />
|
||||
<include name="System.Data.dll" />
|
||||
<include name="System.Web.dll" />
|
||||
<include name="System.Xml.dll" />
|
||||
</references>
|
||||
</csc>
|
||||
<echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../../../../../../bin/" />
|
||||
<mkdir dir="${project::get-base-directory()}/../../../../../../bin/"/>
|
||||
<copy todir="${project::get-base-directory()}/../../../../../../bin/">
|
||||
<fileset basedir="${project::get-base-directory()}/${build.dir}/" >
|
||||
<include name="*.dll"/>
|
||||
<include name="*.exe"/>
|
||||
<include name="*.mdb"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="clean">
|
||||
<delete dir="${obj.dir}" failonerror="false" />
|
||||
<delete dir="${bin.dir}" failonerror="false" />
|
||||
</target>
|
||||
<target name="doc" description="Creates documentation.">
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,43 @@
|
||||
<Project name="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" description="" standardNamespace="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" newfilesearch="None" enableviewstate="True" fileversion="2.0" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
|
||||
<Configurations active="Debug">
|
||||
<Configuration name="Debug" ctype="DotNetProjectConfiguration">
|
||||
<Output directory="./../../../../../../bin/" assembly="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" executeScript="" executeBeforeBuild="" executeAfterBuild="" executeBeforeBuildArguments="" executeAfterBuildArguments="" />
|
||||
<Build debugmode="True" target="Library" />
|
||||
<Execution runwithwarnings="True" consolepause="True" runtime="MsNet" clr-version="Net_2_0" />
|
||||
<CodeGeneration compiler="Csc" warninglevel="4" nowarn="" includedebuginformation="True" optimize="False" unsafecodeallowed="False" generateoverflowchecks="False" mainclass="" target="Library" definesymbols="TRACE;DEBUG" generatexmldocumentation="False" win32Icon="" ctype="CSharpCompilerParameters" />
|
||||
</Configuration>
|
||||
<Configuration name="Release" ctype="DotNetProjectConfiguration">
|
||||
<Output directory="./../../../../../../bin/" assembly="OpenSim.Region.ScriptEngine.Shared.Api.Runtime" executeScript="" executeBeforeBuild="" executeAfterBuild="" executeBeforeBuildArguments="" executeAfterBuildArguments="" />
|
||||
<Build debugmode="True" target="Library" />
|
||||
<Execution runwithwarnings="True" consolepause="True" runtime="MsNet" clr-version="Net_2_0" />
|
||||
<CodeGeneration compiler="Csc" warninglevel="4" nowarn="" includedebuginformation="False" optimize="True" unsafecodeallowed="False" generateoverflowchecks="False" mainclass="" target="Library" definesymbols="TRACE" generatexmldocumentation="False" win32Icon="" ctype="CSharpCompilerParameters" />
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<DeploymentInformation target="" script="" strategy="File">
|
||||
<excludeFiles />
|
||||
</DeploymentInformation>
|
||||
<Contents>
|
||||
<File name="./LSL_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
|
||||
<File name="./LSL_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
|
||||
<File name="./OSSL_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
|
||||
<File name="./ScriptBase.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
|
||||
</Contents>
|
||||
<References>
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/Axiom.MathLib.dll" localcopy="False" />
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/libsecondlife.dll" localcopy="False" />
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/log4net.dll" localcopy="False" />
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/Nini.dll" localcopy="False" />
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/Nini.dll" localcopy="False" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim.Framework" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim.Framework.Communications" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim.Framework.Console" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim.Region.Environment" />
|
||||
<ProjectReference type="Project" localcopy="False" refto="OpenSim.Region.ScriptEngine.Shared" />
|
||||
<ProjectReference type="Assembly" refto="../../../../../../bin/RAIL.dll" localcopy="False" />
|
||||
<ProjectReference type="Gac" localcopy="False" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<ProjectReference type="Gac" localcopy="False" refto="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<ProjectReference type="Gac" localcopy="False" refto="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<ProjectReference type="Gac" localcopy="False" refto="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</References>
|
||||
</Project>
|
||||
124
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
Normal file
124
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* 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 OpenSim 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.Runtime.Remoting.Lifetime;
|
||||
using System.Threading;
|
||||
using System.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Shared;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public partial class ScriptBaseClass : MarshalByRefObject, IScript
|
||||
{
|
||||
private Dictionary<string,MethodInfo> inits = new Dictionary<string,MethodInfo>();
|
||||
|
||||
public ScriptBaseClass()
|
||||
{
|
||||
MethodInfo[] myArrayMethodInfo = GetType().GetMethods(BindingFlags.Public|BindingFlags.Instance);
|
||||
|
||||
foreach(MethodInfo mi in myArrayMethodInfo)
|
||||
{
|
||||
if(mi.Name.Length > 7 && mi.Name.Substring(0, 7) == "ApiType")
|
||||
{
|
||||
string type=mi.Name.Substring(7);
|
||||
inits[type]=mi;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string[] GetApis()
|
||||
{
|
||||
string[] apis = new string[inits.Count];
|
||||
inits.Keys.CopyTo(apis, 0);
|
||||
return apis;
|
||||
}
|
||||
|
||||
public void InitApi(string api, IScriptApi data)
|
||||
{
|
||||
if(!inits.ContainsKey(api))
|
||||
return;
|
||||
|
||||
MethodInfo mi = inits[api];
|
||||
|
||||
Object[] args = new Object[1];
|
||||
args[0] = data;
|
||||
|
||||
mi.Invoke(this, args);
|
||||
}
|
||||
|
||||
private Dictionary<string, object> m_InitialValues =
|
||||
new Dictionary<string, object>();
|
||||
private Dictionary<string, FieldInfo> m_Fields =
|
||||
new Dictionary<string, FieldInfo>();
|
||||
|
||||
public Dictionary<string, object> GetVars()
|
||||
{
|
||||
Dictionary<string, object> vars = new Dictionary<string, object>();
|
||||
|
||||
if (m_Fields == null)
|
||||
return vars;
|
||||
|
||||
m_Fields.Clear();
|
||||
|
||||
Type t = GetType();
|
||||
|
||||
FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
|
||||
BindingFlags.Public |
|
||||
BindingFlags.Instance |
|
||||
BindingFlags.DeclaredOnly);
|
||||
|
||||
foreach (FieldInfo field in fields)
|
||||
{
|
||||
m_Fields[field.Name]=field;
|
||||
|
||||
vars[field.Name]=field.GetValue(this);
|
||||
}
|
||||
|
||||
return vars;
|
||||
}
|
||||
|
||||
public void SetVars(Dictionary<string, object> vars)
|
||||
{
|
||||
foreach (KeyValuePair<string, object> var in vars)
|
||||
{
|
||||
if (m_Fields.ContainsKey(var.Key))
|
||||
{
|
||||
m_Fields[var.Key].SetValue(this, var.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetVars()
|
||||
{
|
||||
SetVars(m_InitialValues);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* 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()));
|
||||
}
|
||||
}
|
||||
|
||||
/// <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);
|
||||
}
|
||||
|
||||
/// <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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
/// <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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,288 @@
|
||||
/*
|
||||
* 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
|
||||
{
|
||||
// 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()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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)
|
||||
{
|
||||
// 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");
|
||||
_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)
|
||||
{
|
||||
// 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];
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (gotMatch)
|
||||
yield return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Manually finalize all the iterators.
|
||||
for (int i = 0; i < nIterators; ++i)
|
||||
iterators[i].Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* 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.
|
||||
/// 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>();
|
||||
for (object element = list;
|
||||
element is Functor2 && ((Functor2)element)._name == Atom.DOT;
|
||||
element = YP.getValue(((Functor2)element)._arg2))
|
||||
result.Add(((Functor2)element)._arg1);
|
||||
|
||||
if (result.Count <= 0)
|
||||
return null;
|
||||
return result.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
4457
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs
Normal file
4457
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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>
|
||||
/// </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 term of the exception</param>
|
||||
/// <param name="Messsage">the message, converted to a string, to use as the printable exception message
|
||||
/// </param>
|
||||
public PrologException(object ErrorTerm, object Message)
|
||||
: base(YP.getValue(Message).ToString())
|
||||
{
|
||||
_term = YP.makeCopy(new Functor2(Atom.a("error"), ErrorTerm, Message), new Variable.CopyStore());
|
||||
}
|
||||
|
||||
public object Term
|
||||
{
|
||||
get { return _term; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* 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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
foreach (bool l1 in YP.unify(this, arg))
|
||||
yield return false;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1644
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs
Normal file
1644
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user